summaryrefslogtreecommitdiff
path: root/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/jsdep/JSDependency.scala
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/jsdep/JSDependency.scala')
-rw-r--r--examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/jsdep/JSDependency.scala66
1 files changed, 66 insertions, 0 deletions
diff --git a/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/jsdep/JSDependency.scala b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/jsdep/JSDependency.scala
new file mode 100644
index 0000000..2e6f8d1
--- /dev/null
+++ b/examples/scala-js/tools/shared/src/main/scala/scala/scalajs/tools/jsdep/JSDependency.scala
@@ -0,0 +1,66 @@
+package scala.scalajs.tools.jsdep
+
+import scala.scalajs.tools.json._
+
+import scala.scalajs.ir.Trees.isValidIdentifier
+
+/** Expresses a dependency on a raw JS library and the JS libraries this library
+ * itself depends on.
+ *
+ * Both the [[resourceName]] and each element of [[dependencies]] is the
+ * unqualified filename of the library (e.g. "jquery.js").
+ *
+ * @param resourceName Filename of the JavaScript file to include
+ * (e.g. "jquery.js")
+ * @param dependencies Filenames of JavaScript files that must be included
+ * before this JavaScript file.
+ * @param commonJSName A JavaScript variable name this dependency should be
+ * required in a commonJS environment (n.b. Node.js). Should only be set if
+ * the JavaScript library will register its exports.
+ */
+final class JSDependency(
+ val resourceName: String,
+ val dependencies: List[String] = Nil,
+ val commonJSName: Option[String] = None) {
+
+ require(commonJSName.forall(isValidIdentifier),
+ "commonJSName must be a valid JavaScript identifier")
+
+ def dependsOn(names: String*): JSDependency =
+ copy(dependencies = dependencies ++ names)
+ def commonJSName(name: String): JSDependency =
+ copy(commonJSName = Some(name))
+ def withOrigin(origin: Origin): FlatJSDependency =
+ new FlatJSDependency(origin, resourceName, dependencies, commonJSName)
+
+ private def copy(
+ resourceName: String = this.resourceName,
+ dependencies: List[String] = this.dependencies,
+ commonJSName: Option[String] = this.commonJSName) = {
+ new JSDependency(resourceName, dependencies, commonJSName)
+ }
+}
+
+object JSDependency {
+
+ implicit object JSDepJSONSerializer extends JSONSerializer[JSDependency] {
+ def serialize(x: JSDependency): JSON = {
+ new JSONObjBuilder()
+ .fld("resourceName", x.resourceName)
+ .opt("dependencies",
+ if (x.dependencies.nonEmpty) Some(x.dependencies) else None)
+ .opt("commonJSName", x.commonJSName)
+ .toJSON
+ }
+ }
+
+ implicit object JSDepJSONDeserializer extends JSONDeserializer[JSDependency] {
+ def deserialize(x: JSON): JSDependency = {
+ val obj = new JSONObjExtractor(x)
+ new JSDependency(
+ obj.fld[String] ("resourceName"),
+ obj.opt[List[String]]("dependencies").getOrElse(Nil),
+ obj.opt[String] ("commonJSName"))
+ }
+ }
+}