@@ -31,6 +31,9 @@ sealed abstract class Package(
3131 def relativePath : Path = Paths .get(path)
3232}
3333object Package {
34+ def npm (name : String , version : String ): NpmPackage = {
35+ NpmPackage (name, version)
36+ }
3437 def jdk (version : String ): JdkPackage = {
3538 JdkPackage (version)
3639 }
@@ -49,6 +52,8 @@ object Package {
4952 case s " maven: $library" =>
5053 val Right (dep) = Dependencies .parseDependencyEither(library)
5154 MavenPackage (dep)
55+ case s " npm: $name: $version" =>
56+ NpmPackage (name, version)
5257 }
5358 }
5459 def fromPath (path : List [String ]): Option [(Package , List [String ])] =
@@ -57,19 +62,37 @@ object Package {
5762 Some (Package .maven(org, name, version) -> requestPath)
5863 case " jdk" :: version :: requestPath =>
5964 Some (Package .jdk(version) -> requestPath)
65+ case " npm" :: GitRequestPrefix (parts, requestPath) =>
66+ val name = parts.init.mkString(" /" )
67+ val version = parts.last
68+ val actualName =
69+ if (name.startsWith(" -" ))
70+ " @" + name.stripPrefix(" -" )
71+ else
72+ name
73+ Some (Package .npm(actualName, version) -> requestPath)
6074 case _ =>
6175 None
6276 }
77+
78+ object GitRequestPrefix {
79+ private val suffixes = List (
80+ " .git" :: " info" :: " refs" :: Nil ,
81+ " info" :: " refs" :: Nil ,
82+ " .git" :: " git-upload-pack" :: Nil ,
83+ " git-upload-pack" :: Nil
84+ )
85+ def unapply (path : List [String ]): Option [(List [String ], List [String ])] = {
86+ suffixes.find(path.endsWith) match {
87+ case Some (suffix) =>
88+ Some (path.dropRight(suffix.length) -> suffix)
89+ case None =>
90+ None
91+ }
92+ }
93+ }
6394 def fromString (value : String , coursier : String ): Either [String , Package ] = {
6495 value match {
65- case s " jdk: $version" =>
66- val exit = os
67- .proc(coursier, " java-home" , " --jvm" , version)
68- .call(check = false )
69- if (exit.exitCode == 0 )
70- Right (JdkPackage (version))
71- else
72- Left (exit.out.trim())
7396 case s " maven: $library" =>
7497 try {
7598 val deps = Dependencies
@@ -85,6 +108,29 @@ object Package {
85108 case NonFatal (e) =>
86109 Left (e.getMessage())
87110 }
111+ case s " jdk: $version" =>
112+ val exit = os
113+ .proc(coursier, " java-home" , " --jvm" , version)
114+ .call(check = false )
115+ if (exit.exitCode == 0 )
116+ Right (JdkPackage (version))
117+ else
118+ Left (exit.out.trim())
119+ case s " npm: $name: $version" =>
120+ try {
121+ val out = os
122+ .proc(" npm" , " info" , s " $name@ $version" )
123+ .call(check = false )
124+ .out
125+ .trim()
126+ if (out.nonEmpty)
127+ Right (NpmPackage (name, version))
128+ else
129+ Left (s " no such npm package: $name@ $version" )
130+ } catch {
131+ case NonFatal (e) =>
132+ Left (e.getMessage)
133+ }
88134 case other =>
89135 Left (
90136 s " unsupported package ' $other'. To fix this problem, use a valid syntax " +
@@ -120,3 +166,13 @@ case class JdkPackage(override val version: String)
120166 extends Package (s " jdk: ${version}" , s " jdk/ ${version}" , version) {
121167 def repr = id.stripPrefix(" jdk:" )
122168}
169+
170+ case class NpmPackage (packageName : String , override val version : String )
171+ extends Package (
172+ s " npm: $packageName: $version" ,
173+ s " npm/ $packageName/ $version" .replace(" @" , " -" ),
174+ version
175+ ) {
176+ def npmName = s " $packageName@ $version"
177+ def tarballFilename = s " $packageName- $version.tgz " .replace('/' , '-' )
178+ }
0 commit comments