diff options
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.scala | 66 |
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")) + } + } +} |