diff --git a/.gitignore b/.gitignore index aeea8ed..80d6a65 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ target/ .settings/ .idea .idea_modules +.vscode \ No newline at end of file diff --git a/build.sbt b/build.sbt index 18afff1..0403177 100644 --- a/build.sbt +++ b/build.sbt @@ -2,18 +2,21 @@ import sbt.Keys._ val defaultSettings = Seq( scalacOptions ++= Seq("-feature", "-deprecation"), - unmanagedSourceDirectories in Compile += baseDirectory.value / "shared" / "main" / "scala", + unmanagedSourceDirectories in Compile += baseDirectory.value / "shared" / "main" / "scala", unmanagedSourceDirectories in Test += baseDirectory.value / "shared" / "test" / "scala" ) -lazy val root = project.in(file(".")).settings(defaultSettings:_*).settings( +lazy val root = project.in(file(".")).settings(defaultSettings: _*).settings( name := "workbench", - version := "0.4.1", - organization := "com.lihaoyi", - scalaVersion := "2.12.4", + version := "0.4.4", + organization := "com.sa", + scalaVersion := "2.12.12", sbtPlugin := true, publishArtifact in Test := false, - publishTo := Some("releases" at "https://oss.sonatype.org/service/local/staging/deploy/maven2"), + publishTo := Some("releases" at "https://nexus.s-art.co.nz/repository/maven-releases"), + // publishTo := Some("Nexus" at "http://nexus.financialplatforms.co.nz:8081/nexus/content/repositories/releases"), + credentials += Credentials(Path.userHome / ".ivy2" / ".credentials.sa"), + credentials += Credentials(Path.userHome / ".ivy2" / ".credentials.fp"), pomExtra := https://github.com/lihaoyi/workbench @@ -35,13 +38,14 @@ lazy val root = project.in(file(".")).settings(defaultSettings:_*).settings( , (resources in Compile) += { - (fullOptJS in (client, Compile)).value - (artifactPath in (client, Compile, fullOptJS)).value + (fullOptJS in(client, Compile)).value + (artifactPath in(client, Compile, fullOptJS)).value }, - addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.21"), + addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.1.1"), libraryDependencies ++= Seq( Dependencies.akkaHttp, Dependencies.akka, + Dependencies.akkaStream, Dependencies.autowire.value, Dependencies.upickle.value ) @@ -57,5 +61,5 @@ lazy val client = project.in(file("client")) Dependencies.dom.value, Dependencies.upickle.value ), - emitSourceMaps := false + scalaJSLinkerConfig ~= { _.withSourceMap(false) } ) diff --git a/client/src/main/scala/workbench/WorkbenchClient.scala b/client/src/main/scala/com/lihaoyi/workbench/WorkbenchClient.scala similarity index 75% rename from client/src/main/scala/workbench/WorkbenchClient.scala rename to client/src/main/scala/com/lihaoyi/workbench/WorkbenchClient.scala index 4336854..35da69a 100644 --- a/client/src/main/scala/workbench/WorkbenchClient.scala +++ b/client/src/main/scala/com/lihaoyi/workbench/WorkbenchClient.scala @@ -1,37 +1,38 @@ package com.lihaoyi.workbench -import upickle.Js -import upickle.default -import upickle.default.{Reader, Writer} -import upickle.json import org.scalajs.dom import org.scalajs.dom.ext._ +import org.scalajs.dom.raw._ +import ujson.Value.Value +import upickle.default +import upickle.default.{Reader, Writer} +import scala.collection.mutable.ArrayBuffer +import scala.scalajs.concurrent.JSExecutionContext.Implicits.queue import scala.scalajs.js import scala.scalajs.js.annotation.{JSExport, JSExportTopLevel} -import scalajs.concurrent.JSExecutionContext.Implicits.queue -import org.scalajs.dom.raw._ /** * The connection from workbench server to the client */ -object Wire extends autowire.Server[Js.Value, Reader, Writer] with ReadWrite { - def wire(parsed: Js.Arr): Unit = { - val Js.Arr(path, args: Js.Obj) = parsed - val req = new Request(default.readJs[Seq[String]](path), args.value.toMap) - Wire.route[Api](WorkbenchClient).apply(req) +object Wire extends autowire.Server[ujson.Value, Reader, Writer] with ReadWrite { + def wire(parsed: ArrayBuffer[Value]): Unit = { + val jsObj = parsed.drop(1).head.obj.toMap + val req = new Request(default.read[Seq[String]](parsed.head), jsObj) + Wire.route[WorkbenchApi](WorkbenchClient).apply(req) } } @JSExportTopLevel("WorkbenchClient") -object WorkbenchClient extends Api { +object WorkbenchClient extends WorkbenchApi { @JSExport - lazy val shadowBody = dom.document.body.cloneNode(deep = true) + lazy val shadowBody: Node = dom.document.body.cloneNode(deep = true) @JSExport var interval = 1000 @JSExport var success = false + @JSExport def main(host: String, port: Int): Unit = { def rec(): Unit = { @@ -40,10 +41,10 @@ object WorkbenchClient extends Api { if (!success) println("Workbench connected") success = true interval = 1000 - json.read(data.responseText) - .asInstanceOf[Js.Arr] - .value - .foreach(v => Wire.wire(v.asInstanceOf[Js.Arr])) + ujson + .read(data.responseText) + .arr + .foreach(v => Wire.wire(v.arr)) rec() case util.Failure(e) => if (success) println("Workbench disconnected " + e) diff --git a/example/build.sbt b/example/build.sbt index 04678aa..e51cda4 100644 --- a/example/build.sbt +++ b/example/build.sbt @@ -8,7 +8,7 @@ enablePlugins(WorkbenchPlugin) name := "Example" -scalaVersion := "2.12.3" +scalaVersion := "2.12.6" version := "0.1-SNAPSHOT" diff --git a/example/project/build.sbt b/example/project/build.sbt index f354c57..2b52827 100644 --- a/example/project/build.sbt +++ b/example/project/build.sbt @@ -1,4 +1,4 @@ -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.19") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.24") lazy val workbench = RootProject(file("../..")) lazy val root = project.in(file(".")).dependsOn(workbench) diff --git a/example/src/main/resources/index-dev.html b/example/src/main/resources/index-dev.html index 6f27812..27cc779 100644 --- a/example/src/main/resources/index-dev.html +++ b/example/src/main/resources/index-dev.html @@ -14,7 +14,7 @@ diff --git a/example/src/main/scala/example/ScalaJSExample.scala b/example/src/main/scala/example/ScalaJSExample.scala index 3298e4f..75e5581 100644 --- a/example/src/main/scala/example/ScalaJSExample.scala +++ b/example/src/main/scala/example/ScalaJSExample.scala @@ -1,33 +1,35 @@ package example -import scala.scalajs.js.annotation.JSExport -import org.scalajs.dom -import org.scalajs.dom.html +import scala.scalajs.js.annotation.{JSExportTopLevel, JSExport} +import org.scalajs.dom.{html, document, window, CanvasRenderingContext2D} import scala.util.Random -case class Point(x: Int, y: Int){ +case class Point(x: Int = Random.nextInt(255), + y: Int = Random.nextInt(255), + dx: Int = Random.nextInt(3) - 1, + dy: Int = Random.nextInt(3) - 1){ def +(p: Point) = Point(x + p.x, y + p.y) def /(d: Int) = Point(x / d, y / d) } -@JSExport +@JSExportTopLevel("example.ScalaJSExample") object ScalaJSExample { val ctx = - dom.document + document .getElementById("canvas") .asInstanceOf[html.Canvas] .getContext("2d") - .asInstanceOf[dom.CanvasRenderingContext2D] + .asInstanceOf[CanvasRenderingContext2D] var p = Point(128, 128) var color = "black" - var enemiess = List.fill(10)(Point(util.Random.nextInt(255), util.Random.nextInt(255))) + var enemiess = List.fill(10)(Point()) def clear() = { ctx.fillStyle = color ctx.fillRect(0, 0, 255, 255) } - def run = { + def run(time: Double): Unit = { clear() ctx.fillStyle = "yellow" p = Point(p.x, (p.y + 2) % 255) @@ -35,11 +37,13 @@ object ScalaJSExample { enemiess = for (enemy <- enemiess) yield { ctx.fillStyle = "red" ctx.fillRect(enemy.x, enemy.y, 10, 10) - Point((enemy.x + 1) % 255, (enemy.y + 1) % 255) + enemy.copy(x = (enemy.x + enemy.dx + 255) % 255, y = (enemy.y + enemy.dy + 255) % 255) } + window.requestAnimationFrame(this.run) } + @JSExport def main(): Unit = { - dom.window.setInterval(() => run, 10) + run(0) } } diff --git a/project/Dependencies.scala b/project/Dependencies.scala index d670a01..905f9a4 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -1,15 +1,15 @@ import sbt._ -import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._ +import org.portablescala.sbtplatformdeps.PlatformDepsPlugin.autoImport._ object Dependencies { // jvm dependencies - val akkaHttp = "com.typesafe.akka" %% "akka-http" % "10.0.10" - val akka = "com.typesafe.akka" %% "akka-actor" % "2.4.19" + val akkaHttp = "com.typesafe.akka" %% "akka-http" % "10.1.12" + val akka = "com.typesafe.akka" %% "akka-actor" % "2.6.5" + val akkaStream = "com.typesafe.akka" %% "akka-stream" % "2.6.5" // js and shared dependencies - val autowire = Def.setting("com.lihaoyi" %%% "autowire" % "0.2.6") - val dom = Def.setting("org.scala-js" %%% "scalajs-dom" % "0.9.3") - val upickle = Def.setting("com.lihaoyi" %%% "upickle" % "0.4.4") - + val autowire = Def.setting("com.lihaoyi" %%% "autowire" % "0.3.2") + val dom = Def.setting("org.scala-js" %%% "scalajs-dom" % "1.0.0") + val upickle = Def.setting("com.lihaoyi" %%% "upickle" % "1.2.0") } diff --git a/project/build.properties b/project/build.properties index 9abea12..a919a9b 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.0.3 +sbt.version=1.3.8 diff --git a/project/build.sbt b/project/build.sbt index 061d088..db284d0 100644 --- a/project/build.sbt +++ b/project/build.sbt @@ -1 +1 @@ -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.21") \ No newline at end of file +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.1.1") diff --git a/shared/main/scala/com/lihaoyi/package.scala b/shared/main/scala/com/lihaoyi/package.scala new file mode 100644 index 0000000..ef50672 --- /dev/null +++ b/shared/main/scala/com/lihaoyi/package.scala @@ -0,0 +1,42 @@ +package com.lihaoyi + +package object workbench { + + import upickle.default.{Reader, Writer} + + /** + * A standard way to read and write `Js.Value`s with autowire/upickle + */ + trait ReadWrite { + def write[Result: Writer](r: Result) = upickle.default.writeJs(r) + def read[Result: Reader](p: ujson.Value) = upickle.default.read[Result](p) + } + + /** + * Shared API between the workbench server and the workbench client, + * comprising methods the server can call on the client to make it do + * things + */ + trait WorkbenchApi { + /** + * Reset the HTML page to its initial state + */ + def clear(): Unit + + /** + * Reload the entire webpage + */ + def reload(): Unit + + /** + * Print a `msg` with the given logging `level` + */ + def print(level: String, msg: String): Unit + + /** + * Execute the javascript file available at the given `path`. + */ + def run(path: String): Unit + } + +} diff --git a/shared/main/scala/workbench/Shared.scala b/shared/main/scala/workbench/Shared.scala deleted file mode 100644 index 9521a86..0000000 --- a/shared/main/scala/workbench/Shared.scala +++ /dev/null @@ -1,39 +0,0 @@ -package com.lihaoyi.workbench - -import upickle.default.{Reader, Writer} -import upickle.Js - - -/** - * A standard way to read and write `Js.Value`s with autowire/upickle - */ -trait ReadWrite { - def write[Result: Writer](r: Result) = upickle.default.writeJs(r) - def read[Result: Reader](p: Js.Value) = upickle.default.readJs[Result](p) -} - -/** - * Shared API between the workbench server and the workbench client, - * comprising methods the server can call on the client to make it do - * things - */ -trait Api { - /** - * Reset the HTML page to its initial state - */ - def clear(): Unit - /** - * Reload the entire webpage - */ - def reload(): Unit - - /** - * Print a `msg` with the given logging `level` - */ - def print(level: String, msg: String): Unit - - /** - * Execute the javascript file available at the given `path`. - */ - def run(path: String): Unit -} diff --git a/src/main/scala/workbench/CustomDirectives.scala b/src/main/scala/com/lihaoyi/workbench/CustomDirectives.scala similarity index 99% rename from src/main/scala/workbench/CustomDirectives.scala rename to src/main/scala/com/lihaoyi/workbench/CustomDirectives.scala index 128775c..6f4dd7d 100644 --- a/src/main/scala/workbench/CustomDirectives.scala +++ b/src/main/scala/com/lihaoyi/workbench/CustomDirectives.scala @@ -1,6 +1,5 @@ package com.lihaoyi.workbench - import java.io.File import akka.event.LoggingAdapter diff --git a/src/main/scala/workbench/Server.scala b/src/main/scala/com/lihaoyi/workbench/Server.scala similarity index 80% rename from src/main/scala/workbench/Server.scala rename to src/main/scala/com/lihaoyi/workbench/Server.scala index 4f70e91..6a4f359 100644 --- a/src/main/scala/workbench/Server.scala +++ b/src/main/scala/com/lihaoyi/workbench/Server.scala @@ -2,7 +2,7 @@ package com.lihaoyi.workbench import java.util.concurrent.atomic.AtomicReference -import akka.actor.{Actor, ActorSystem, Props} +import akka.actor.{Actor, ActorSystem, Props, Terminated} import akka.http.scaladsl.Http import akka.http.scaladsl.coding.{Encoder, Gzip, NoCoding} import akka.http.scaladsl.model.HttpMethods._ @@ -11,21 +11,21 @@ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server._ import akka.http.scaladsl.settings.ServerSettings -import akka.stream.ActorMaterializer +import akka.stream.{Materializer, SystemMaterializer} import com.typesafe.config.ConfigFactory import sbt.IO -import upickle.Js import upickle.default.{Reader, Writer} -import scala.concurrent.{Future, _} +import scala.collection.mutable import scala.concurrent.duration._ +import scala.concurrent.{Future, _} import scala.util.{Failure, Success} -case class PromiseMessage(p: Promise[Js.Arr]) +case class PromiseMessage(p: Promise[ujson.Arr]) class WorkbenchActor extends Actor { private var waitingActors = List.empty[PromiseMessage] - private var queuedMessages = List.empty[Js.Value] + private var queuedMessages = List.empty[ujson.Value] private var numActorsLastRespond = 0 /** @@ -37,10 +37,10 @@ class WorkbenchActor extends Actor { private val system = context.system import system.dispatcher - system.scheduler.schedule(0.seconds, 10.seconds, self, Clear) + system.scheduler.scheduleWithFixedDelay(0.seconds, 10.seconds, self, Clear) private def respond(): Unit = { - val messages = Js.Arr(queuedMessages: _*) + val messages = ujson.Arr(queuedMessages: _*) waitingActors.foreach { a => a.p.success(messages) } @@ -49,7 +49,7 @@ class WorkbenchActor extends Actor { queuedMessages = Nil } - override def receive = { + override def receive: Receive = { case a: PromiseMessage => // Even if there's someone already waiting, // a new actor waiting replaces the old one @@ -58,7 +58,7 @@ class WorkbenchActor extends Actor { if (queuedMessages.nonEmpty && numActorsLastRespond > 0 && waitingActors.size >= numActorsLastRespond) respond() - case msg: Js.Arr => + case msg: ujson.Arr => queuedMessages = msg :: queuedMessages if (waitingActors.nonEmpty) respond() @@ -81,10 +81,10 @@ class Server( `Access-Control-Allow-Headers`("Origin, X-Requested-With, Content-Type, Accept, Accept-Encoding, Accept-Language, Host, Referer, User-Agent"), `Access-Control-Max-Age`(1728000) ) - val cl = getClass.getClassLoader + val cl: ClassLoader = getClass.getClassLoader - implicit val system = ActorSystem( + implicit val system: ActorSystem = ActorSystem( "Workbench-System", config = ConfigFactory.load(cl), classLoader = cl @@ -93,10 +93,10 @@ class Server( /** * The connection from workbench server to the client */ - object Wire extends autowire.Client[Js.Value, Reader, Writer] with ReadWrite { - def doCall(req: Request): Future[Js.Value] = { - longPoll ! Js.Arr(upickle.default.writeJs(req.path), Js.Obj(req.args.toSeq: _*)) - Future.successful(Js.Null) + object Wire extends autowire.Client[ujson.Value, Reader, Writer] with ReadWrite { + def doCall(req: Request): Future[ujson.Value] = { + longPoll ! ujson.Arr(upickle.default.writeJs(req.path), ujson.Obj.from(req.args)) + Future.successful(ujson.Null) } } @@ -115,9 +115,9 @@ class Server( */ - implicit val materializer = ActorMaterializer() + implicit val materializer: Materializer = SystemMaterializer(system).materializer // needed for the future map/flatmap in the end - implicit val executionContext = system.dispatcher + implicit val executionContext: ExecutionContext = system.dispatcher private val serverBinding = new AtomicReference[Http.ServerBinding]() private val encoder: Encoder = if (useCompression) Gzip else NoCoding @@ -167,16 +167,16 @@ class Server( CustomDirectives.getFromBrowseableDirectories(rootDirectory.getOrElse(".")) ~ post { path("notifications") { - val p = Promise[Js.Arr] + val p = Promise[ujson.Arr] longPoll ! PromiseMessage(p) onSuccess(p.future) { v => - complete(HttpResponse(entity = HttpEntity(ContentType(MediaTypes.`application/json`), upickle.json.write(v))).withHeaders(corsHeaders: _*)) + complete(HttpResponse(entity = HttpEntity(ContentType(MediaTypes.`application/json`), ujson.write(v))).withHeaders(corsHeaders: _*)) } } } } - def kill() = { + def kill(): Future[Terminated] = { system.terminate() } } diff --git a/src/main/scala/workbench/WorkbenchBasePlugin.scala b/src/main/scala/com/lihaoyi/workbench/WorkbenchBasePlugin.scala similarity index 75% rename from src/main/scala/workbench/WorkbenchBasePlugin.scala rename to src/main/scala/com/lihaoyi/workbench/WorkbenchBasePlugin.scala index 2ec0d68..72410aa 100644 --- a/src/main/scala/workbench/WorkbenchBasePlugin.scala +++ b/src/main/scala/com/lihaoyi/workbench/WorkbenchBasePlugin.scala @@ -1,21 +1,20 @@ package com.lihaoyi.workbench -import sbt._ -import sbt.Keys._ import autowire._ -import org.scalajs.sbtplugin.ScalaJSPlugin - -import org.apache.logging.log4j.message._ - -import org.apache.logging.log4j.core.{LogEvent => Log4JLogEvent, _} import org.apache.logging.log4j.core.appender.AbstractAppender +import org.apache.logging.log4j.core.config.Property import org.apache.logging.log4j.core.layout.PatternLayout - -import scala.concurrent.ExecutionContext.Implicits.global +import org.apache.logging.log4j.core.{LogEvent => Log4JLogEvent} +import org.apache.logging.log4j.message._ +import org.scalajs.sbtplugin.ScalaJSPlugin +import sbt.Keys._ +import sbt._ object WorkbenchBasePlugin extends AutoPlugin { - override def requires = ScalaJSPlugin + import scala.concurrent.ExecutionContext.Implicits.global + + override def requires: AutoPlugin = ScalaJSPlugin object autoImport { @@ -38,6 +37,7 @@ object WorkbenchBasePlugin extends AutoPlugin { "should the web server start on sbt load, on compile, or only by manually running `startWorkbenchServer`") val startWorkbenchServer = taskKey[Unit]("start local web server manually") } + import autoImport._ import WorkbenchStartModes._ @@ -51,27 +51,28 @@ object WorkbenchBasePlugin extends AutoPlugin { val clientLogger = new AbstractAppender( "FakeAppender", null, - PatternLayout.createDefaultLayout()) { + PatternLayout.createDefaultLayout(), + true, + Property.EMPTY_ARRAY) { override def append(event: Log4JLogEvent): Unit = { val level = sbt.internal.util.ConsoleAppender.toLevel(event.getLevel) val message = event.getMessage message match { - case o: ObjectMessage => { + case o: ObjectMessage => o.getParameter match { - case e: sbt.internal.util.StringEvent => server.value.Wire[Api].print(level.toString, e.message).call() - case e: sbt.internal.util.ObjectEvent[_] => server.value.Wire[Api].print(level.toString, e.message.toString).call() - case _ => server.value.Wire[Api].print(level.toString, message.getFormattedMessage).call() + case e: sbt.internal.util.StringEvent => server.value.Wire[WorkbenchApi].print(level.toString, e.message).call() + case e: sbt.internal.util.ObjectEvent[_] => server.value.Wire[WorkbenchApi].print(level.toString, e.message.toString).call() + case _ => server.value.Wire[WorkbenchApi].print(level.toString, message.getFormattedMessage).call() } - } - case _ => server.value.Wire[Api].print(level.toString, message.getFormattedMessage).call() + case _ => server.value.Wire[WorkbenchApi].print(level.toString, message.getFormattedMessage).call() } } } clientLogger.start() val currentFunction = extraLoggers.value - (key: ScopedKey[_]) => clientLogger +: currentFunction(key) + key: ScopedKey[_] => clientLogger +: currentFunction(key) }, server := { val server = new Server(localUrl.value._1, localUrl.value._2, @@ -95,8 +96,7 @@ object WorkbenchBasePlugin extends AutoPlugin { } ) - private def getScopeId(scope: ScopeAxis[sbt.Reference]): String = { - "" + scope.hashCode() - } - override def projectSettings = workbenchSettings + private def getScopeId(scope: ScopeAxis[sbt.Reference]): String = s"${scope.hashCode()}" + + override def projectSettings: Seq[Setting[_]] = workbenchSettings } diff --git a/src/main/scala/workbench/WorkbenchPlugin.scala b/src/main/scala/com/lihaoyi/workbench/WorkbenchPlugin.scala similarity index 89% rename from src/main/scala/workbench/WorkbenchPlugin.scala rename to src/main/scala/com/lihaoyi/workbench/WorkbenchPlugin.scala index b411b67..700fae3 100644 --- a/src/main/scala/workbench/WorkbenchPlugin.scala +++ b/src/main/scala/com/lihaoyi/workbench/WorkbenchPlugin.scala @@ -1,4 +1,5 @@ package com.lihaoyi.workbench + import sbt._ import sbt.Keys._ import autowire._ @@ -15,12 +16,12 @@ object WorkbenchPlugin extends AutoPlugin { } import autoImport._ import WorkbenchBasePlugin.server - import ScalaJSPlugin.AutoImport._ + import ScalaJSPlugin.autoImport._ val workbenchSettings = Seq( refreshBrowsers := { streams.value.log.info("workbench: Reloading Pages...") - server.value.Wire[Api].reload().call() + server.value.Wire[WorkbenchApi].reload().call() }, refreshBrowsers := refreshBrowsers.triggeredBy(fastOptJS in Compile).value diff --git a/src/main/scala/workbench/WorkbenchSplicePlugin.scala b/src/main/scala/com/lihaoyi/workbench/WorkbenchSplicePlugin.scala similarity index 96% rename from src/main/scala/workbench/WorkbenchSplicePlugin.scala rename to src/main/scala/com/lihaoyi/workbench/WorkbenchSplicePlugin.scala index caf6e77..49b69ad 100644 --- a/src/main/scala/workbench/WorkbenchSplicePlugin.scala +++ b/src/main/scala/com/lihaoyi/workbench/WorkbenchSplicePlugin.scala @@ -18,7 +18,7 @@ object WorkbenchSplicePlugin extends AutoPlugin { import autoImport._ import WorkbenchBasePlugin.autoImport._ import WorkbenchBasePlugin.server - import ScalaJSPlugin.AutoImport._ + import ScalaJSPlugin.autoImport._ val spliceSettings = Seq( updatedJS := { @@ -60,7 +60,7 @@ object WorkbenchSplicePlugin extends AutoPlugin { val s = munge(sbt.IO.read(new sbt.File(path.drop(prefix.length)))) sbt.IO.write(new sbt.File(path.drop(prefix.length) + ".js"), s.getBytes) - server.value.Wire[Api].run(path + ".js").call() + server.value.Wire[WorkbenchApi].run(path + ".js").call() } } },