summaryrefslogtreecommitdiff
path: root/scalajslib
diff options
context:
space:
mode:
authorRobby <robby@santoslab.org>2018-03-05 04:06:01 -0600
committerNikolay Tatarinov <5min4eq.unity@gmail.com>2018-03-05 13:06:01 +0300
commit122122729d8567e389f434cfb1c074d3119b0088 (patch)
treeda1f5a10a04e396b1833893a4efd66bdc140d4a0 /scalajslib
parent63368609f008bc46626210fb0aad284196e2b43f (diff)
downloadmill-122122729d8567e389f434cfb1c074d3119b0088.tar.gz
mill-122122729d8567e389f434cfb1c074d3119b0088.tar.bz2
mill-122122729d8567e389f434cfb1c074d3119b0088.zip
Allows users to customize Node.js (Scala.js' NodeJSEnv) in ScalaJSModule (#195)
* Adds Node.js configuration in ScalaJSModule. * Adds Node.js configuration in ScalaJSModule test framework. * Refactored ScalaJSBridge Node.js env creation. * Readjusted ScalaJSBridge 0.6 formatting. * Added Node.js config tests. * Removed NodeJSConfig ScalaTest tests and improved log test conditions.
Diffstat (limited to 'scalajslib')
-rw-r--r--scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala22
-rw-r--r--scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala22
-rw-r--r--scalajslib/src/mill/scalajslib/NodeJSConfig.scala11
-rw-r--r--scalajslib/src/mill/scalajslib/ScalaJSBridge.scala12
-rw-r--r--scalajslib/src/mill/scalajslib/ScalaJSModule.scala4
-rw-r--r--scalajslib/test/src/mill/scalajslib/NodeJSConfigTests.scala104
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)
+ }
+
+}