Skip to content

Commit 0141889

Browse files
committed
Add a customInitFiles() hook in ExternalJSEnv.
This will simplify the user-space workaround for scala-js/scala-js#1555. It can also be generally useful.
1 parent a82b8c3 commit 0141889

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

js-envs/src/main/scala/org/scalajs/jsenv/ExternalJSEnv.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,20 @@ abstract class ExternalJSEnv(
2222
/** Command to execute (on shell) for this VM */
2323
protected def executable: String
2424

25+
/** Custom initialization scripts. */
26+
protected def customInitFiles(): Seq[VirtualJSFile] = Nil
27+
2528
protected class AbstractExtRunner(protected val classpath: CompleteClasspath,
2629
protected val code: VirtualJSFile, protected val logger: Logger,
2730
protected val console: JSConsole) {
2831

2932
/** JS files used to setup VM */
3033
protected def initFiles(): Seq[VirtualJSFile] = Nil
3134

35+
/** Custom initialization scripts, defined by the environment. */
36+
final protected def customInitFiles(): Seq[VirtualJSFile] =
37+
ExternalJSEnv.this.customInitFiles()
38+
3239
/** Sends required data to VM Stdin (can throw) */
3340
protected def sendVMStdin(out: OutputStream): Unit = {}
3441

@@ -46,7 +53,7 @@ abstract class ExternalJSEnv(
4653

4754
/** Get files that are a library (i.e. that do not run anything) */
4855
protected def getLibJSFiles(): Seq[VirtualJSFile] =
49-
initFiles() ++ classpath.allCode
56+
initFiles() ++ customInitFiles() ++ classpath.allCode
5057

5158
/** Get all files that are passed to VM (libraries and code) */
5259
protected def getJSFiles(): Seq[VirtualJSFile] =

js-envs/src/main/scala/org/scalajs/jsenv/nodejs/NodeJSEnv.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ class NodeJSEnv private (
317317
/** Libraries are loaded via require in Node.js */
318318
override protected def getLibJSFiles(): Seq[VirtualJSFile] = {
319319
initFiles() ++
320+
customInitFiles() ++
320321
classpath.jsLibs.map(requireLibrary) :+
321322
classpath.scalaJSCode
322323
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.scalajs.jsenv.test
2+
3+
import org.scalajs.jsenv._
4+
import org.scalajs.jsenv.nodejs.NodeJSEnv
5+
import org.scalajs.jsenv.phantomjs.PhantomJSEnv
6+
7+
import org.scalajs.core.tools.io._
8+
9+
import org.junit.Test
10+
11+
abstract class CustomInitFilesTest extends JSEnvTest {
12+
def makeCustomInitFiles(): Seq[VirtualJSFile] = {
13+
Seq(new MemVirtualJSFile("custominit.js").withContent("""
14+
function customPrint(s) {
15+
console.log("custom: " + s);
16+
}
17+
"""))
18+
}
19+
20+
@Test
21+
def customInitFilesTest = {
22+
"""
23+
customPrint("hello");
24+
""" hasOutput
25+
"""|custom: hello
26+
|""".stripMargin
27+
}
28+
}
29+
30+
class NodeJSWithCustomInitFilesTest extends CustomInitFilesTest {
31+
protected def newJSEnv = new NodeJSEnv {
32+
override def customInitFiles() = makeCustomInitFiles()
33+
}
34+
}
35+
36+
class PhantomJSWithCustomInitFilesTest extends CustomInitFilesTest {
37+
protected def newJSEnv = new PhantomJSEnv {
38+
override def customInitFiles() = makeCustomInitFiles()
39+
}
40+
}

0 commit comments

Comments
 (0)