diff options
6 files changed, 158 insertions, 17 deletions
diff --git a/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala b/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala index 86abbd14..2f123650 100644 --- a/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala +++ b/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala @@ -26,21 +26,22 @@ class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { linker.link(sourceSJSIRs ++ jarSJSIRs, initializer.toSeq, destFile, logger) } - def run(linkedFile: File): Unit = { - new NodeJSEnv() + def run(config: NodeJSConfig, linkedFile: File): Unit = { + nodeJSEnv(config) .jsRunner(FileVirtualJSFile(linkedFile)) .run(new ScalaConsoleLogger, ConsoleJSConsole) } - def getFramework(frameworkName: String, + def getFramework(config: NodeJSConfig, + frameworkName: String, linkedFile: File): sbt.testing.Framework = { - val env = new NodeJSEnv().loadLibs( + val env = nodeJSEnv(config).loadLibs( Seq(ResolvedJSDependency.minimal(new FileVirtualJSFile(linkedFile))) ) - val config = TestAdapter.Config().withLogger(new ScalaConsoleLogger) + val tconfig = TestAdapter.Config().withLogger(new ScalaConsoleLogger) val adapter = - new TestAdapter(env, config) + new TestAdapter(env, tconfig) adapter .loadFrameworks(List(List(frameworkName))) @@ -48,4 +49,13 @@ class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { .headOption .getOrElse(throw new RuntimeException("Failed to get framework")) } + + def nodeJSEnv(config: NodeJSConfig): NodeJSEnv = { + new NodeJSEnv( + NodeJSEnv.Config() + .withExecutable(config.executable) + .withArgs(config.args) + .withEnv(config.env) + .withSourceMap(config.sourceMap)) + } } diff --git a/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala b/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala index 03a4e9df..43dbf45a 100644 --- a/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala +++ b/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala @@ -25,19 +25,20 @@ class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { linker.link(sourceIRs ++ libraryIRs, initializer.toSeq, destFile, logger) } - def run(linkedFile: File): Unit = { - new NodeJSEnv() + def run(config: NodeJSConfig, linkedFile: File): Unit = { + nodeJSEnv(config) .jsRunner(Seq(FileVirtualJSFile(linkedFile))) .run(new ScalaConsoleLogger, ConsoleJSConsole) } - def getFramework(frameworkName: String, + def getFramework(config: NodeJSConfig, + frameworkName: String, linkedFile: File): sbt.testing.Framework = { - val env = new NodeJSEnv() - val config = TestAdapter.Config().withLogger(new ScalaConsoleLogger) + val env = nodeJSEnv(config) + val tconfig = TestAdapter.Config().withLogger(new ScalaConsoleLogger) val adapter = - new TestAdapter(env, Seq(FileVirtualJSFile(linkedFile)), config) + new TestAdapter(env, Seq(FileVirtualJSFile(linkedFile)), tconfig) adapter .loadFrameworks(List(List(frameworkName))) @@ -45,4 +46,13 @@ class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { .headOption .getOrElse(throw new RuntimeException("Failed to get framework")) } + + def nodeJSEnv(config: NodeJSConfig): NodeJSEnv = { + new NodeJSEnv( + NodeJSEnv.Config() + .withExecutable(config.executable) + .withArgs(config.args) + .withEnv(config.env) + .withSourceMap(config.sourceMap)) + } } diff --git a/scalajslib/src/mill/scalajslib/NodeJSConfig.scala b/scalajslib/src/mill/scalajslib/NodeJSConfig.scala new file mode 100644 index 00000000..de39308c --- /dev/null +++ b/scalajslib/src/mill/scalajslib/NodeJSConfig.scala @@ -0,0 +1,11 @@ +package mill.scalajslib + +object NodeJSConfig { + import upickle.default.{ReadWriter => RW, macroRW} + implicit def rw: RW[NodeJSConfig] = macroRW +} + +final case class NodeJSConfig(executable: String = "node", + args: List[String] = Nil, + env: Map[String, String] = Map.empty, + sourceMap: Boolean = true) diff --git a/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala b/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala index 96b48704..e5952291 100644 --- a/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala +++ b/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala @@ -50,14 +50,15 @@ class ScalaJSWorker { ) } - def run(toolsClasspath: Agg[Path], linkedFile: File): Unit = { - bridge(toolsClasspath).run(linkedFile) + def run(toolsClasspath: Agg[Path], config: NodeJSConfig, linkedFile: File): Unit = { + bridge(toolsClasspath).run(config, linkedFile) } def getFramework(toolsClasspath: Agg[Path], + config: NodeJSConfig, frameworkName: String, linkedFile: File): sbt.testing.Framework = { - bridge(toolsClasspath).getFramework(frameworkName, linkedFile) + bridge(toolsClasspath).getFramework(config, frameworkName, linkedFile) } } @@ -69,9 +70,10 @@ trait ScalaJSBridge { main: String, fullOpt: Boolean): Unit - def run(linkedFile: File): Unit + def run(config: NodeJSConfig, linkedFile: File): Unit - def getFramework(frameworkName: String, + def getFramework(config: NodeJSConfig, + frameworkName: String, linkedFile: File): sbt.testing.Framework } diff --git a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala index 5a3b6526..4f932e1e 100644 --- a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala +++ b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala @@ -94,6 +94,7 @@ trait ScalaJSModule extends scalalib.ScalaModule { outer => case Right(_) => ScalaJSBridge.scalaJSBridge().run( toolsClasspath().map(_.path), + nodeJSConfig(), fastOpt().path.toIO ) Result.Success(()) @@ -156,6 +157,8 @@ trait ScalaJSModule extends scalalib.ScalaModule { outer => } override def platformSuffix = s"_sjs${artifactScalaJSVersion()}" + + def nodeJSConfig = T { NodeJSConfig() } } trait TestScalaJSModule extends ScalaJSModule with TestModule { @@ -183,6 +186,7 @@ trait TestScalaJSModule extends ScalaJSModule with TestModule { override def test(args: String*) = T.command { val framework = mill.scalajslib.ScalaJSBridge.scalaJSBridge().getFramework( toolsClasspath().map(_.path), + nodeJSConfig(), testFrameworks().head, fastOptTest().path.toIO ) diff --git a/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala b/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala new file mode 100644 index 00000000..5aef8dad --- /dev/null +++ b/scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala @@ -0,0 +1,104 @@ +package mill.scalajslib + +import ammonite.ops._ +import mill._ +import mill.define.Discover +import mill.eval.Evaluator +import mill.scalalib.{CrossScalaModule, DepSyntax} +import mill.util.{TestEvaluator, TestUtil} +import utest._ + + +object NodeJSConfigTests extends TestSuite { + val workspacePath = TestUtil.getOutPathStatic() / "hello-js-world" + val scalaVersion = "2.12.4" + val scalaJSVersion = "0.6.22" + val utestVersion = "0.6.3" + val nodeArgsEmpty = List() + val nodeArgs2G = List("--max-old-space-size=2048") + val nodeArgs4G = List("--max-old-space-size=4096") + + trait HelloJSWorldModule extends CrossScalaModule with ScalaJSModule { + override def millSourcePath = workspacePath + def publishVersion = "0.0.1-SNAPSHOT" + override def mainClass = Some("Main") + } + + object HelloJSWorld extends TestUtil.BaseModule { + val matrix = for { + scala <- Seq(scalaVersion) + nodeArgs <- Seq(nodeArgsEmpty, nodeArgs2G) + } yield (scala, nodeArgs) + + object helloJsWorld extends Cross[BuildModule](matrix:_*) + class BuildModule(val crossScalaVersion: String, nodeArgs: List[String]) extends HelloJSWorldModule { + override def artifactName = "hello-js-world" + def scalaJSVersion = NodeJSConfigTests.scalaJSVersion + override def nodeJSConfig = T { NodeJSConfig(args = nodeArgs) } + } + + object buildUTest extends Cross[BuildModuleUtest](matrix:_*) + class BuildModuleUtest(crossScalaVersion: String, nodeArgs: List[String]) + extends BuildModule(crossScalaVersion, nodeArgs) { + object test extends super.Tests { + override def sources = T.sources{ millSourcePath / 'src / 'utest } + def testFrameworks = Seq("utest.runner.Framework") + override def ivyDeps = Agg( + ivy"com.lihaoyi::utest::$utestVersion" + ) + override def nodeJSConfig = T { NodeJSConfig(args = nodeArgs) } + } + } + + override lazy val millDiscover = Discover[this.type] + } + + val millSourcePath = pwd / 'scalajslib / 'test / 'resources / "hello-js-world" + + val helloWorldEvaluator = TestEvaluator.static(HelloJSWorld) + + val mainObject = helloWorldEvaluator.outPath / 'src / "Main.scala" + + def tests: Tests = Tests { + prepareWorkspace() + + def checkLog(command: define.Command[_], nodeArgs: List[String], notNodeArgs: List[String]) = { + helloWorldEvaluator(command) + val paths = Evaluator.resolveDestPaths( + helloWorldEvaluator.outPath, + command.ctx.segments + ) + val log = read(paths.log) + assert( + nodeArgs.forall(log.contains), + notNodeArgs.forall(!log.contains(_)) + ) + } + + 'test - { + + def checkUtest(nodeArgs: List[String], notNodeArgs: List[String]) = { + checkLog(HelloJSWorld.buildUTest(scalaVersion, nodeArgs).test.test(), nodeArgs, notNodeArgs) + } + + 'test - checkUtest(nodeArgsEmpty, nodeArgs2G) + 'test2G - checkUtest(nodeArgs2G, nodeArgs4G) + } + + def checkRun(nodeArgs: List[String], notNodeArgs: List[String]): Unit = { + checkLog(HelloJSWorld.helloJsWorld(scalaVersion, nodeArgs).run(), nodeArgs, notNodeArgs) + } + + 'run - { + 'run - checkRun(nodeArgsEmpty, nodeArgs2G) + 'run2G - checkRun(nodeArgs2G, nodeArgs4G) + } + } + + def prepareWorkspace(): Unit = { + rm(workspacePath) + mkdir(workspacePath / up) + cp(millSourcePath, workspacePath) + } + +} |