summaryrefslogtreecommitdiff
path: root/tools/js/src/main/scala/scala/scalajs/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools/js/src/main/scala/scala/scalajs/tools')
-rw-r--r--tools/js/src/main/scala/scala/scalajs/tools/classpath/builder/NodeFileSystem.scala67
-rw-r--r--tools/js/src/main/scala/scala/scalajs/tools/io/NodeVirtualFiles.scala62
-rw-r--r--tools/js/src/main/scala/scala/scalajs/tools/json/Impl.scala36
3 files changed, 165 insertions, 0 deletions
diff --git a/tools/js/src/main/scala/scala/scalajs/tools/classpath/builder/NodeFileSystem.scala b/tools/js/src/main/scala/scala/scalajs/tools/classpath/builder/NodeFileSystem.scala
new file mode 100644
index 0000000..d1eee10
--- /dev/null
+++ b/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/tools/js/src/main/scala/scala/scalajs/tools/io/NodeVirtualFiles.scala b/tools/js/src/main/scala/scala/scalajs/tools/io/NodeVirtualFiles.scala
new file mode 100644
index 0000000..6a0c3ee
--- /dev/null
+++ b/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/tools/js/src/main/scala/scala/scalajs/tools/json/Impl.scala b/tools/js/src/main/scala/scala/scalajs/tools/json/Impl.scala
new file mode 100644
index 0000000..89c7255
--- /dev/null
+++ b/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))
+
+}