diff --git a/.gitignore b/.gitignore index 2f7896d..297fdef 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ target/ +node_modules/ diff --git a/build.sbt b/build.sbt index 35fd313..de6e9dc 100644 --- a/build.sbt +++ b/build.sbt @@ -84,5 +84,8 @@ lazy val `test-project`: Project = project. enablePlugins(ScalaJSJUnitPlugin). settings( scalaJSUseMainModuleInitializer := true, - jsEnv := new org.scalajs.jsenv.jsdomnodejs.JSDOMNodeJSEnv() + jsEnv := new org.scalajs.jsenv.jsdomnodejs.JSDOMNodeJSEnv( + org.scalajs.jsenv.jsdomnodejs.JSDOMNodeJSEnv.Config() + .withExposeGlobalVars(Set("global")) + ) ) diff --git a/jsdom-nodejs-env/src/main/scala/org/scalajs/jsenv/jsdomnodejs/JSDOMNodeJSEnv.scala b/jsdom-nodejs-env/src/main/scala/org/scalajs/jsenv/jsdomnodejs/JSDOMNodeJSEnv.scala index 458cd00..7bf3540 100644 --- a/jsdom-nodejs-env/src/main/scala/org/scalajs/jsenv/jsdomnodejs/JSDOMNodeJSEnv.scala +++ b/jsdom-nodejs-env/src/main/scala/org/scalajs/jsenv/jsdomnodejs/JSDOMNodeJSEnv.scala @@ -72,6 +72,11 @@ class JSDOMNodeJSEnv(config: JSDOMNodeJSEnv.Config) extends JSEnv { val scriptsURIs = scriptFiles(input).map(JSDOMNodeJSEnv.materialize(_)) val scriptsURIsAsJSStrings = scriptsURIs.map(uri => '"' + escapeJS(uri.toASCIIString) + '"') + + val globalVarsDefs = config.exposeGlobalVars.map { v => + s"""if ($v) { window["$v"] = $v; }""" + } + val jsDOMCode = { s""" |(function () { @@ -104,6 +109,8 @@ class JSDOMNodeJSEnv(config: JSDOMNodeJSEnv.Config) extends JSEnv { | if (error == null) { | window["__ScalaJSEnv"] = __ScalaJSEnv; | window["scalajsCom"] = global.scalajsCom; + | + | ${globalVarsDefs.mkString("\n ")} | } else { | throw error; | } @@ -195,13 +202,15 @@ object JSDOMNodeJSEnv { final class Config private ( val executable: String, val args: List[String], - val env: Map[String, String] + val env: Map[String, String], + val exposeGlobalVars: Set[String] ) { private def this() = { this( executable = "node", args = Nil, - env = Map.empty + env = Map.empty, + exposeGlobalVars = Set.empty[String] ) } @@ -214,12 +223,16 @@ object JSDOMNodeJSEnv { def withEnv(env: Map[String, String]): Config = copy(env = env) + def withExposeGlobalVars(exposeGlobalVars: Set[String]): Config = + copy(exposeGlobalVars = exposeGlobalVars) + private def copy( executable: String = executable, args: List[String] = args, - env: Map[String, String] = env + env: Map[String, String] = env, + exposeGlobalVars: Set[String] = exposeGlobalVars ): Config = { - new Config(executable, args, env) + new Config(executable, args, env, exposeGlobalVars) } } @@ -231,6 +244,7 @@ object JSDOMNodeJSEnv { * - `executable`: `"node"` * - `args`: `Nil` * - `env`: `Map.empty` + * - `exposeGlobalVars`: `Set.empty` */ def apply(): Config = new Config() } diff --git a/test-project/src/test/scala/testproject/LibTest.scala b/test-project/src/test/scala/testproject/LibTest.scala index 1bbe022..0d695b8 100644 --- a/test-project/src/test/scala/testproject/LibTest.scala +++ b/test-project/src/test/scala/testproject/LibTest.scala @@ -1,6 +1,7 @@ package testproject import scala.scalajs.js +import scala.scalajs.js.Dynamic.{global => g} import org.junit.Test import org.junit.Assert._ @@ -13,4 +14,11 @@ class LibTest { Lib.appendDocument("foo") assertEquals(1, count - oldCount) } + + @Test def expose_nodejs_global(): Unit = { + assertTrue(js.typeOf(g.global) == "object") + assertTrue(js.typeOf(g.global.require) == "function") + + assertTrue(g.global.require("fs") != null) + } }