summaryrefslogtreecommitdiff
path: root/examples/scala-js/sbt-plugin/src/main/scala/scala/scalajs/sbtplugin/AbstractJSDeps.scala
blob: 9eb7f6960de6735a173f2f0fc6f44365f3c7e19e (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package scala.scalajs.sbtplugin

import sbt._

import StringUtilities.nonEmpty

import scala.scalajs.tools.jsdep.JSDependency

/** Something JavaScript related a project may depend on. Either a JavaScript
 *  module/library, or the DOM at runtime. */
sealed trait AbstractJSDep {
  def configurations: Option[String]

  protected def withConfigs(configs: Option[String]): AbstractJSDep

  def %(configurations: Configuration): AbstractJSDep = %(configurations.name)
  def %(configurations: String): AbstractJSDep = {
    require(this.configurations.isEmpty,
        "Configurations already specified for jsModule " + this)
    nonEmpty(configurations, "Configurations")
    withConfigs(Some(configurations))
  }

}

/** A JavaScript module/library a Scala.js project may depend on */
sealed trait JSModuleID extends AbstractJSDep {
  def jsDep: JSDependency

  protected def withJSDep(jsDep: JSDependency): JSModuleID

  def commonJSName(name: String): JSModuleID =
    withJSDep(jsDep = jsDep.commonJSName(name))

  def dependsOn(names: String*): JSModuleID =
    withJSDep(jsDep = jsDep.dependsOn(names: _*))
}

/** A JavaScript module that resides inside a jar (probably webjar) */
final case class JarJSModuleID(
    module: ModuleID,
    jsDep: JSDependency) extends JSModuleID {

  def configurations: Option[String] = module.configurations

  protected def withConfigs(configs: Option[String]): JSModuleID =
    copy(module = module.copy(configurations = configs))
  protected def withJSDep(jsDep: JSDependency): JSModuleID =
    copy(jsDep = jsDep)
}

object JarJSModuleID {
  def apply(module: ModuleID, name: String): JarJSModuleID =
    JarJSModuleID(module, new JSDependency(name, Nil))
}

/** A JavaScript module that we depend on, but is provided externally or
 *  by the project itself */
final case class ProvidedJSModuleID(
    jsDep: JSDependency,
    configurations: Option[String]) extends JSModuleID {

  protected def withConfigs(configs: Option[String]): JSModuleID =
    copy(configurations = configs)
  protected def withJSDep(jsDep: JSDependency): JSModuleID =
    copy(jsDep = jsDep)
}

object ProvidedJSModuleID {
  def apply(name: String, configurations: Option[String]): ProvidedJSModuleID =
    ProvidedJSModuleID(new JSDependency(name, Nil), configurations)
}

sealed case class RuntimeDOM(
    configurations: Option[String]) extends AbstractJSDep {

  protected def withConfigs(configs: Option[String]): RuntimeDOM =
    copy(configurations = configs)
}

object RuntimeDOM extends RuntimeDOM(None)