Thomas Flucke пре 5 година
родитељ
комит
2ce94613e0

+ 40 - 2
build.sbt

@@ -1,9 +1,47 @@
-lazy val root = (project in file("."))
+lazy val root = project.in(file("."))
+  //.settings(settings)
+  .aggregate(
+    plugin,
+    library
+  )
+
+/****** The Actual Plugin ******/
+
+lazy val plugin = (project in file("plugin"))
   .enablePlugins(SbtPlugin)
   .settings(
-    name := "web-routes",
+    name := "sbt-web-routes",
+    organization := "name.tflucke",
+    //maintainer := "Thomas Flucke <admin@tflucke.name>",
+    version := "0.1.0",
     scalacOptions ++= Seq(
       "-deprecation",
       "-unchecked",
+    ),
+  )
+
+/****** The Plugin Library ******/
+
+lazy val library = (project in file("library"))
+  .enablePlugins(ScalaJSPlugin)
+  .settings(
+    name := "web-routes",
+    organization := "name.tflucke",
+    //maintainer := "Thomas Flucke <admin@tflucke.name>",
+    version := "0.1.0",
+    scalacOptions ++= Seq(
+      "-deprecation",
+      "-unchecked"
+    ),
+    libraryDependencies ++= Seq(
+      // Wrapper library for JS dom to scala
+      // Docs: https://scala-js.github.io/scala-js-dom/
+      // Scaladocs: https://www.javadoc.io/doc/org.scala-js/scalajs-dom_sjs1.0.0-M7_2.12/0.9.6/org/scalajs/dom/index.html
+      (if (scalaJSVersion.startsWith("0.6.")) "org.scala-js" %%% "scalajs-dom" % "0.9.8"
+      else                                    "org.scala-js" %%% "scalajs-dom" % "1.0.0"),
+      // Json Parsing
+      // Wiki:
+      (if (scalaJSVersion.startsWith("0.6.")) "com.typesafe.play" %%% "play-json" % "2.8.1"
+      else                                    "com.typesafe.play" %%% "play-json" % "2.9.0"),
     )
   )

+ 0 - 0
src/main/scala/name/tflucke/webroutes/APIRoute.scala → library/src/main/scala/name/tflucke/webroutes/APIRoute.scala


+ 0 - 0
src/main/scala/name/tflucke/webroutes/RouteDef.scala → plugin/src/main/scala/name/tflucke/webroutes/RouteDef.scala


+ 16 - 27
src/main/scala/name/tflucke/webroutes/WebRoutes.scala → plugin/src/main/scala/name/tflucke/webroutes/RouteGenerator.scala

@@ -1,39 +1,25 @@
 package name.tflucke.webroutes
 
-import sbt._
-import Keys._
+import sbt.{File,IO}
 
-object WebRoutes extends AutoPlugin {
-  val routePattern = ("\\s*#\\s*Shared\\s+Route\\s*\n" +
+object RouteGenerator {
+  val routeStartPattern = raw"\s*#\s*Shared\s+Route\s*"
+  val propPattern = raw"\s*#\s*\w+\s*:\s*[^\s]+\s*"
+  val routePattern = raw"\s*(GET|PUT|POST|DELETE)\s+(/[^\s]*)+\s+@?([\.\w]+.controllers).([\w]+).([\w]+)\s*(\((\w+\s*:\s*\w+\s*)?(,\s*\w+\s*:\s*\w+)?\))?"
+  // TODO: Fix this pattern since it's easier to interpret than the current one
+  //val sharedRoutePattern = s"${routeStartPattern}\n((${propPattern}\n)*)\n${routePattern}\n".r
+
+  val sharedRoutePattern = ("\\s*#\\s*Shared\\s+Route\\s*\n" +
     "((\\s*#\\s*\\w+\\s*:\\s*[^\\s]+\\s*\n)*)" +
     "\\s*(GET|PUT|POST|DELETE)\\s+(/[^\\s]*)+\\s+@?([\\.\\w]+.controllers).([\\w]+).([\\w]+)\\s*(\\((\\w+\\s*:\\s*\\w+\\s*)?(,\\s*\\w+\\s*:\\s*\\w+)?\\))?").r
 
-  override def requires: Plugins = ScalaJSPlugin && JSDependenciesPlugin
-  override def trigger = noTrigger
-
-  object autoImport {
-    val generateJsRoutes = taskKey[Seq[File]]("Generate scala client routes objects")
-
-    lazy val baseWebRouteSettings: Seq[Def.Setting[_]] = Seq(
-      generateJsRoutes := {
-        println("Generating Scala Web route objects...")
-        generateRoutes(generateJsRoutes.inputFileChanges.modified, (Compile / resourceManaged).value)
-      }
-    )
-  }
-  import autoImport._
+  def apply(routeFiles: Seq[java.nio.file.Path], outpath: File) = generateRoutes(routeFiles, outpath)
 
-  override lazy val globalSettings = baseWebRouteSettings
-
-  override lazy val projectSettings =
-    inConfig(Compile)(baseWebRouteSettings) ++
-    inConfig(Test)(baseWebRouteSettings)
-
-  def generateRoutes(routeFiles: Seq[java.nio.file.Path], outpath: File): Seq[File] {
+  def generateRoutes(routeFiles: Seq[java.nio.file.Path], outpath: File): Seq[File] = {
     routeFiles.flatMap((routesFile: java.nio.file.Path) => {
       import scala.io.Source
 
-      val routeGroups = (for (route <- routePattern.findAllMatchIn(Source.fromFile(routesFile.toFile).mkString)) yield {
+      val routeGroups = (for (route <- sharedRoutePattern.findAllMatchIn(Source.fromFile(routesFile.toFile).mkString)) yield {
         val propPattern = "\\s*#\\s*(\\w+)\\s*:\\s*([^\\s]+)\\s*\n".r
         val props = propPattern.findAllMatchIn(route.group(1)).map(m => (m.group(1), m.group(2)))
         def getProp(name: String): Option[String] = props.find(_._1.equalsIgnoreCase(name)).map(_._2)
@@ -50,11 +36,14 @@ object WebRoutes extends AutoPlugin {
       val outFiles = routeGroups.map(tuple => {
         val ((pack, controller), routes) = tuple
         val content = s"""package ${pack}
+
+import name.tflucke.webroutes.APIRoute
+
 object ${controller} {
 ${routes.mkString("\n")}
 }
 """
-        val outFile = makeControllerFile(pack, controller, outpath.value)
+        val outFile = makeControllerFile(pack, controller, outpath)
         IO.write(outFile, content)
         outFile
       }).toSeq

+ 29 - 0
plugin/src/main/scala/name/tflucke/webroutes/WebRoutes.scala

@@ -0,0 +1,29 @@
+package name.tflucke.webroutes
+
+import sbt._
+import Keys._
+
+object WebRoutes extends AutoPlugin {
+  object autoImport {
+    val generateJsRoutes = taskKey[Seq[File]]("Generate scala client routes objects")
+
+    lazy val baseWebRouteSettings: Seq[Def.Setting[_]] = Seq(
+      sourceGenerators += generateJsRoutes,
+      // TODO: Automatically add dependancy
+      //libraryDependencies += "name.tflucke" %%% "web-routes" % "0.1.0",
+      generateJsRoutes := {
+        println("Generating Scala Web route objects...")
+        // TODO: Figure out what the minimum changes necessary are.
+        println(generateJsRoutes.inputFiles)
+        println(generateJsRoutes.inputFileChanges.created)
+        println(generateJsRoutes.inputFileChanges.modified)
+        RouteGenerator(generateJsRoutes.inputFiles, (Compile / resourceManaged).value)
+      }
+    )
+  }
+  import autoImport._
+
+  override lazy val projectSettings =
+    inConfig(Compile)(baseWebRouteSettings) ++
+    inConfig(Test)(baseWebRouteSettings)
+}

+ 3 - 0
project/plugins.sbt

@@ -0,0 +1,3 @@
+val ScalaJSVersion = Option(System.getenv("SCALAJS_VERSION")).getOrElse("1.0.0")
+
+addSbtPlugin("org.scala-js"       % "sbt-scalajs"               % ScalaJSVersion)