summaryrefslogtreecommitdiff
path: root/examples/scala-js/tools/js/src/main/scala/scala/scalajs/tools/io/NodeVirtualFiles.scala
blob: 6a0c3ee9a75d5a2a187fd8b81e7d7c922df96e5c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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")
}