diff --git a/app/current/src/main/scala/io/scalajs/nodejs/Module.scala b/app/current/src/main/scala/io/scalajs/nodejs/Module.scala index c7f82fbba..c65972cd7 100644 --- a/app/current/src/main/scala/io/scalajs/nodejs/Module.scala +++ b/app/current/src/main/scala/io/scalajs/nodejs/Module.scala @@ -1,9 +1,6 @@ package io.scalajs.nodejs -import com.thoughtworks.enableIf - import scala.scalajs.js -import scala.scalajs.js.annotation.JSImport /** * In each module, the module free variable is a reference to the object representing the current module. @@ -27,7 +24,7 @@ trait Module extends js.Object { * the local exports variable, which is probably not what you want to do. * @example module.exports */ - var exports: js.Dictionary[js.Any] = js.native + var exports: js.Object = js.native /** * The fully resolved filename to the module. @@ -62,19 +59,5 @@ trait Module extends js.Object { * explicitly exported in order to be used. */ def require[T <: js.Any](id: String): T = js.native -} - -/** - * Module Companion - */ -@js.native -@JSImport("module", JSImport.Namespace) -object Module extends Module { - var builtinModules: js.Array[String] = js.native - - @enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) - def createRequire(filename: String): Require = js.native - @enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) - def createRequire(filename: io.scalajs.nodejs.url.URL): Require = js.native } diff --git a/app/current/src/main/scala/io/scalajs/nodejs/module/Module.scala b/app/current/src/main/scala/io/scalajs/nodejs/module/Module.scala new file mode 100644 index 000000000..a76235247 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/module/Module.scala @@ -0,0 +1,31 @@ +package io.scalajs.nodejs.module + +import com.thoughtworks.enableIf +import io.scalajs.nodejs.Require + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSImport + +@js.native +@JSImport("module", JSImport.Namespace) +object Module extends js.Object { + var builtinModules: js.Array[String] = js.native + + @enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) + def createRequire(filename: String): Require = js.native + + @enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) + def createRequire(filename: io.scalajs.nodejs.url.URL): Require = js.native + + @enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs12) + def syncBuiltinESMExports(): Unit = js.native + + @deprecated("Use createRequire", "Node.js v12.2.0") + def createRequireFromPath(filename: String): Require = js.native + + @enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs14) + def findSourceMap(path: String): SourceMap = js.native + + @enableIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs14) + def findSourceMap(path: String, error: io.scalajs.nodejs.Error): SourceMap = js.native +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/module/SourceMap.scala b/app/current/src/main/scala/io/scalajs/nodejs/module/SourceMap.scala new file mode 100644 index 000000000..a81dba339 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/module/SourceMap.scala @@ -0,0 +1,35 @@ +package io.scalajs.nodejs.module + +import com.thoughtworks.enableMembersIf +import net.exoego.scalajs.types.util.Factory + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSImport + +@js.native +@enableMembersIf(io.scalajs.nodejs.internal.CompilerSwitches.gteNodeJs14) +@JSImport("module", "SourceMap") +class SourceMap(payload: SourceMapPayload) extends js.Object { + def payload: SourceMapPayload = js.native + def findEntry(lineNumber: Int, columnNumber: Int): SourceMapEntry = js.native +} + +@Factory +trait SourceMapPayload extends js.Object { + var file: String + var version: Double + var sources: js.Array[String] + var sourcesContent: js.Array[String] + var names: js.Array[String] + var mappings: String + var sourceRoot: String +} + +@Factory +trait SourceMapEntry extends js.Object { + var generatedLine: Int + var generatedColumn: Int + var originalSource: String + var originalLine: Int + var originalColumn: Int +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/package.scala b/app/current/src/main/scala/io/scalajs/nodejs/package.scala index 8247381d6..4b9c6abe9 100644 --- a/app/current/src/main/scala/io/scalajs/nodejs/package.scala +++ b/app/current/src/main/scala/io/scalajs/nodejs/package.scala @@ -102,4 +102,11 @@ package object nodejs { @inline def toException(): Exception = js.JavaScriptException(error.message) } + + @js.native + @JSGlobal("module") + object moduleObject extends io.scalajs.nodejs.Module + + @deprecated("Use io.scalajs.nodejs.module.Module", "v0.13.0") + val Module = io.scalajs.nodejs.module.Module } diff --git a/app/current/src/test/scala/io/scalajs/nodejs/module/ModuleTest.scala b/app/current/src/test/scala/io/scalajs/nodejs/module/ModuleTest.scala new file mode 100644 index 000000000..dec2d79eb --- /dev/null +++ b/app/current/src/test/scala/io/scalajs/nodejs/module/ModuleTest.scala @@ -0,0 +1,24 @@ +package io.scalajs.nodejs.module + +import org.scalatest.funspec.AnyFunSpec + +import scala.scalajs.js + +class ModuleTest extends AnyFunSpec { + describe("Module Object (module module)") { + it("builtinModules") { + assert(io.scalajs.nodejs.module.Module.builtinModules.length >= 30) + } + } + + describe("module Object") { + it("children") { + // contents vary on runtime + assert(io.scalajs.nodejs.moduleObject.children.isInstanceOf[js.Array[_]]) + } + it("filename") { + // contents vary on runtime + assert(io.scalajs.nodejs.moduleObject.filename.nonEmpty) + } + } +}