summaryrefslogtreecommitdiff
path: root/examples/scala-js/tools/js/src
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/tools/js/src')
-rw-r--r--examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/classpath/builder/NodeFileSystem.scala67
-rw-r--r--examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/io/NodeVirtualFiles.scala62
-rw-r--r--examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/json/Impl.scala36
-rw-r--r--examples/scala-js/tools/js/src/test/scala/scala/scalajs/tools/js/test/JasmineReporter.scala71
-rw-r--r--examples/scala-js/tools/js/src/test/scala/scala/scalajs/tools/js/test/QuickLinker.scala37
5 files changed, 273 insertions, 0 deletions
diff --git a/examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/classpath/builder/NodeFileSystem.scala b/examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/classpath/builder/NodeFileSystem.scala
new file mode 100644
index 0000000..d1eee10
--- /dev/null
+++ b/examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/classpath/builder/NodeFileSystem.scala
@@ -0,0 +1,67 @@
+package scala.scalajs.tools.classpath.builder
+
+import scala.scalajs.tools.io._
+
+import scala.scalajs.js
+
+import scala.collection.immutable.Traversable
+
+import java.io._
+
+/** FileSystem implementation using Node.js */
+trait NodeFileSystem extends FileSystem {
+
+ import NodeFileSystem.fs
+
+ type File = String
+
+ private def stats(f: String) = fs.statSync(f)
+
+ val DummyVersion: String = "DUMMY_FILE"
+
+ def isDirectory(f: String): Boolean =
+ stats(f).isDirectory().asInstanceOf[Boolean]
+
+ def isFile(f: String): Boolean =
+ stats(f).isFile().asInstanceOf[Boolean]
+
+ def isJSFile(f: String): Boolean =
+ isFile(f) && f.endsWith(".js")
+
+ def isIRFile(f: String): Boolean =
+ isFile(f) && f.endsWith(".sjsir")
+
+ def isJARFile(f: String): Boolean =
+ isFile(f) && f.endsWith(".jar")
+
+ def exists(f: String): Boolean =
+ fs.existsSync(f).asInstanceOf[Boolean]
+
+ def getName(f: String): String =
+ VirtualFile.nameFromPath(f)
+
+ def getAbsolutePath(f: String): String =
+ fs.realpathSync(f).asInstanceOf[String]
+
+ def getVersion(f: String): String =
+ stats(f).mtime.asInstanceOf[js.Date].getTime.toString
+
+ def listFiles(d: String): Traversable[String] = {
+ require(isDirectory(d))
+ val prefix = if (d.endsWith("/")) d else d + "/"
+
+ fs.readdirSync(d).asInstanceOf[js.Array[String]].toList.map(prefix + _)
+ }
+
+ def toJSFile(f: String): VirtualJSFile = new NodeVirtualJSFile(f)
+ def toIRFile(f: String): VirtualScalaJSIRFile = new NodeVirtualScalaJSIRFile(f)
+ def toReader(f: String): Reader =
+ new NodeVirtualTextFile(f).reader
+ def toInputStream(f: String): InputStream =
+ new NodeVirtualBinaryFile(f).inputStream
+
+}
+
+private object NodeFileSystem {
+ private val fs = js.Dynamic.global.require("fs")
+}
diff --git a/examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/io/NodeVirtualFiles.scala b/examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/io/NodeVirtualFiles.scala
new file mode 100644
index 0000000..6a0c3ee
--- /dev/null
+++ b/examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/io/NodeVirtualFiles.scala
@@ -0,0 +1,62 @@
+package scala.scalajs.tools.io
+
+import scala.scalajs.js
+import scala.scalajs.js.typedarray._
+
+import java.io._
+import java.net.URI
+
+class NodeVirtualFile(override val path: String) extends VirtualFile {
+ import NodeFS.fs
+
+ override def version: Option[String] = {
+ val stat = fs.statSync(path)
+ if (js.isUndefined(stat.mtime))
+ None
+ else
+ Some(stat.mtime.asInstanceOf[js.Date].getTime.toString)
+ }
+
+ override def exists: Boolean =
+ fs.existsSync(path).asInstanceOf[Boolean]
+
+ override def toURI: URI = {
+ val abspath = fs.realpathSync(path).asInstanceOf[String]
+ new URI("file", abspath, null)
+ }
+}
+
+class NodeVirtualTextFile(p: String) extends NodeVirtualFile(p)
+ with VirtualTextFile {
+ import NodeFS.fs
+
+ override def content: String = {
+ val options = js.Dynamic.literal(encoding = "UTF-8")
+ fs.readFileSync(path, options).asInstanceOf[String]
+ }
+}
+
+class NodeVirtualBinaryFile(p: String) extends NodeVirtualFile(p)
+ with VirtualBinaryFile {
+ import NodeFS.fs
+
+ private def buf: ArrayBuffer =
+ new Uint8Array(fs.readFileSync(path).asInstanceOf[js.Array[Int]]).buffer
+
+ override def content: Array[Byte] = new Int8Array(buf).toArray
+ override def inputStream: InputStream = new ArrayBufferInputStream(buf)
+}
+
+class NodeVirtualJSFile(p: String) extends NodeVirtualTextFile(p)
+ with VirtualJSFile {
+
+ /** Always returns None. We can't read them on JS anyway */
+ override def sourceMap: Option[String] = None
+}
+
+class NodeVirtualScalaJSIRFile(p: String)
+ extends NodeVirtualBinaryFile(p) with VirtualSerializedScalaJSIRFile
+
+private[io] object NodeFS {
+ val fs = js.Dynamic.global.require("fs")
+}
diff --git a/examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/json/Impl.scala b/examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/json/Impl.scala
new file mode 100644
index 0000000..89c7255
--- /dev/null
+++ b/examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/json/Impl.scala
@@ -0,0 +1,36 @@
+package scala.scalajs.tools.json
+
+import scala.scalajs.tools.io.IO
+
+import scala.scalajs.js
+
+import java.io.{Writer, Reader}
+
+private[json] object Impl extends AbstractJSONImpl {
+
+ type Repr = js.Any
+
+ def fromString(x: String): Repr = x
+ def fromNumber(x: Number): Repr = x.doubleValue()
+ def fromBoolean(x: Boolean): Repr = x
+ def fromList(x: List[Repr]): Repr = js.Array(x: _*)
+ def fromMap(x: Map[String, Repr]): Repr = js.Dictionary(x.toSeq: _*)
+
+ def toString(x: Repr): String = x.asInstanceOf[String]
+ def toNumber(x: Repr): Number = x.asInstanceOf[Double]
+ def toBoolean(x: Repr): Boolean = x.asInstanceOf[Boolean]
+ def toList(x: Repr): List[Repr] = x.asInstanceOf[js.Array[Repr]].toList
+ def toMap(x: Repr): Map[String, Repr] =
+ x.asInstanceOf[js.Dictionary[Repr]].toMap
+
+ def serialize(x: Repr): String = js.JSON.stringify(x)
+
+ def serialize(x: Repr, writer: Writer): Unit =
+ writer.write(serialize(x))
+
+ def deserialize(str: String): Repr = js.JSON.parse(str)
+
+ def deserialize(reader: Reader): Repr =
+ deserialize(IO.readReaderToString(reader))
+
+}
diff --git a/examples/scala-js/tools/js/src/test/scala/scala/scalajs/tools/js/test/JasmineReporter.scala b/examples/scala-js/tools/js/src/test/scala/scala/scalajs/tools/js/test/JasmineReporter.scala
new file mode 100644
index 0000000..7b63871
--- /dev/null
+++ b/examples/scala-js/tools/js/src/test/scala/scala/scalajs/tools/js/test/JasmineReporter.scala
@@ -0,0 +1,71 @@
+package scala.scalajs.tools.js.test
+
+import org.scalajs.jasmine.Suite
+
+import org.scalajs.jasminetest._
+
+import scala.scalajs.js.annotation.JSExport
+
+import scala.scalajs.testbridge._
+
+object JSConsoleTestOutput extends TestOutput {
+
+ type Color = Null
+
+ val errorColor: Color = null
+ val successColor: Color = null
+ val infoColor: Color = null
+
+ def color(message: String, color: Color): String = message
+
+ def error(message: String, stack: Array[StackTraceElement]): Unit =
+ withStack(message, stack)
+
+ def error(message: String): Unit = println(message)
+
+ def failure(message: String, stack: Array[StackTraceElement]): Unit =
+ withStack(message, stack)
+
+ def failure(message: String): Unit = println(message)
+ def succeeded(message: String): Unit = println(message)
+ def skipped(message: String): Unit = println(message)
+ def pending(message: String): Unit = println(message)
+ def ignored(message: String): Unit = println(message)
+ def canceled(message: String): Unit = println(message)
+
+ object log extends TestOutputLog {
+ def info(message: String): Unit = println(message)
+ def warn(message: String): Unit = println(message)
+ def error(message: String): Unit = println(message)
+ }
+
+ private def withStack(message: String, stack: Array[StackTraceElement]) =
+ println(message + stack.mkString("\n", "\n", ""))
+
+}
+
+@JSExport("scalajs.JasmineConsoleReporter")
+class JasmineConsoleReporter(throwOnFail: Boolean = false)
+ extends JasmineTestReporter(JSConsoleTestOutput) {
+
+ private var suiteFails: Int = 0
+ private var suiteCount: Int = 0
+
+ override def reportSuiteResults(suite: Suite): Unit = {
+ super.reportSuiteResults(suite)
+ if (suite.results().failedCount > 0)
+ suiteFails += 1
+ suiteCount += 1
+ }
+
+ override def reportRunnerResults(): Unit = {
+ super.reportRunnerResults()
+ val failed = suiteFails > 0
+ val resStr = if (failed) "Failed" else "Passed"
+ println(s"$resStr: Total $suiteCount, Failed $suiteFails")
+
+ if (failed && throwOnFail)
+ sys.error("Jasmine test suite failed.")
+ }
+
+}
diff --git a/examples/scala-js/tools/js/src/test/scala/scala/scalajs/tools/js/test/QuickLinker.scala b/examples/scala-js/tools/js/src/test/scala/scala/scalajs/tools/js/test/QuickLinker.scala
new file mode 100644
index 0000000..580c4c5
--- /dev/null
+++ b/examples/scala-js/tools/js/src/test/scala/scala/scalajs/tools/js/test/QuickLinker.scala
@@ -0,0 +1,37 @@
+package scala.scalajs.tools.js.test
+
+import scala.scalajs.tools.sem.Semantics
+import scala.scalajs.tools.io._
+import scala.scalajs.tools.logging._
+import scala.scalajs.tools.classpath._
+import scala.scalajs.tools.classpath.builder._
+import scala.scalajs.tools.optimizer._
+
+import scala.scalajs.js.annotation.JSExport
+
+@JSExport("scalajs.QuickLinker")
+object QuickLinker {
+
+ /** Link a Scala.js application on Node.js */
+ @JSExport
+ def linkNode(cpEntries: String*): String = {
+ val builder = new AbstractPartialClasspathBuilder with NodeFileSystem
+ val cp = builder.build(cpEntries.toList)
+
+ val complete = cp.resolve()
+
+ val optimizer = new ScalaJSOptimizer(Semantics.Defaults.optimized)
+
+ val out = WritableMemVirtualJSFile("out.js")
+
+ import ScalaJSOptimizer._
+ val optimized = optimizer.optimizeCP(
+ Inputs(complete),
+ OutputConfig(out),
+ new ScalaConsoleLogger
+ )
+
+ out.content
+ }
+
+}