diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b7d73cd..f0658b2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: branches: - - master + - main tags: - "v*" pull_request: @@ -21,7 +21,7 @@ jobs: with: jvm: "temurin:17" - name: Test CLI - run: ./mill -i 'tests[_].test' + run: ./mill -i 'tests.test' publish: needs: test @@ -51,7 +51,6 @@ jobs: fail-fast: false matrix: os: [ubuntu-20.04, windows-latest, macos-latest] - scalaJsVersion: ["1.9.0", "1.10.0", "1.10.1", "1.11.0", "1.12.0", "1.13.1"] steps: - uses: actions/checkout@v3 with: @@ -62,22 +61,18 @@ jobs: with: jvm: temurin:17 - run: | - ./mill -i "native[$scalaJsVersion].writeNativeImageScript" generate.sh "" && \ + ./mill -i "native.writeNativeImageScript" generate.sh "" && \ ./generate.sh && \ - ./mill -i "tests[$scalaJsVersion].test.native" && \ - ./mill -i "native[$scalaJsVersion].copyToArtifacts" artifacts/ + ./mill -i "tests.test.native" && \ + ./mill -i "native.copyToArtifacts" artifacts/ if: runner.os != 'Windows' - env: - scalaJsVersion: ${{ matrix.scalaJsVersion }} - run: | - @call ./mill.bat -i "native[%scalaJsVersion%].writeNativeImageScript" generate.bat "" + @call ./mill.bat -i "native.writeNativeImageScript" generate.bat "" @call generate.bat - @call ./mill.bat -i "tests[%scalaJsVersion%].test.native" - @call ./mill.bat -i "native[%scalaJsVersion%].copyToArtifacts" artifacts/ + @call ./mill.bat -i "tests.test.native" + @call ./mill.bat -i "native.copyToArtifacts" artifacts/ shell: cmd if: runner.os == 'Windows' - env: - scalaJsVersion: ${{ matrix.scalaJsVersion }} - uses: actions/upload-artifact@v3.1.2 with: name: launcher-${{ matrix.os }} @@ -94,8 +89,6 @@ jobs: runs-on: ubuntu-20.04 strategy: fail-fast: false - matrix: - scalaJsVersion: ["1.9.0", "1.10.0", "1.10.1", "1.11.0", "1.12.0", "1.13.1"] steps: - uses: actions/checkout@v3 with: @@ -106,12 +99,10 @@ jobs: with: jvm: temurin:17 - run: | - ./mill -i "native-static[$scalaJsVersion].writeNativeImageScript" generate.sh "" && \ + ./mill -i "native-static.writeNativeImageScript" generate.sh "" && \ ./generate.sh && \ - ./mill -i "tests[$scalaJsVersion].test.nativeStatic" && \ - ./mill -i "native-static[$scalaJsVersion].copyToArtifacts" artifacts/ - env: - scalaJsVersion: ${{ matrix.scalaJsVersion }} + ./mill -i "tests.test.nativeStatic" && \ + ./mill -i "native-static.copyToArtifacts" artifacts/ - uses: actions/upload-artifact@v3.1.2 with: name: launcher-${{ matrix.os }}-static @@ -128,8 +119,6 @@ jobs: runs-on: ubuntu-20.04 strategy: fail-fast: false - matrix: - scalaJsVersion: ["1.9.0", "1.10.0", "1.10.1", "1.11.0", "1.12.0", "1.13.1"] steps: - uses: actions/checkout@v3 with: @@ -140,12 +129,10 @@ jobs: with: jvm: temurin:17 - run: | - ./mill -i "native-mostly-static[$scalaJsVersion].writeNativeImageScript" generate.sh "" && \ + ./mill -i "native-mostly-static.writeNativeImageScript" generate.sh "" && \ ./generate.sh && \ - ./mill -i "tests[$scalaJsVersion].test.nativeStatic" && \ - ./mill -i "native-mostly-static[$scalaJsVersion].copyToArtifacts" artifacts/ - env: - scalaJsVersion: ${{ matrix.scalaJsVersion }} + ./mill -i "tests.test.nativeStatic" && \ + ./mill -i "native-mostly-static.copyToArtifacts" artifacts/ - uses: actions/upload-artifact@v3.1.2 with: name: launcher-${{ matrix.os }}-mostly-static diff --git a/.mill-version b/.mill-version index 5111446..027934e 100644 --- a/.mill-version +++ b/.mill-version @@ -1 +1 @@ -0.10.12 \ No newline at end of file +0.11.1 \ No newline at end of file diff --git a/build.sc b/build.sc index 4bfe6ae..b1ca213 100644 --- a/build.sc +++ b/build.sc @@ -1,5 +1,5 @@ -import $ivy.`de.tototec::de.tobiasroeser.mill.vcs.version::0.3.0` -import $ivy.`io.github.alexarchambault.mill::mill-native-image::0.1.23` +import $ivy.`de.tototec::de.tobiasroeser.mill.vcs.version::0.4.0` +import $ivy.`io.github.alexarchambault.mill::mill-native-image::0.1.25` import $ivy.`io.github.alexarchambault.mill::mill-native-image-upload:0.1.19` import $ivy.`io.get-coursier::coursier-launcher:2.1.0-M2` @@ -17,30 +17,18 @@ import scala.util.Properties.isWin def scalaJsCliVersion = "1.1.1-sc5" -def scala213 = "2.13.10" -def latestScalaJsVersion = "1.13.1" -def scalaJsVersions = Seq("1.9.0", "1.10.0", "1.10.1", "1.11.0", "1.12.0", latestScalaJsVersion) - -object cli extends Cross[Cli](scalaJsVersions: _*) - -class Cli(val scalaJsVersion0: String) extends ScalaModule with ScalaJsCliPublishModule { +def scala213 = "2.13.12" +def scalaJsVersion = "1.13.2" +object cli extends Cli +trait Cli extends ScalaModule with ScalaJsCliPublishModule { def scalaVersion = scala213 def artifactName = "scalajs" + super.artifactName() def ivyDeps = super.ivyDeps() ++ Seq( - ivy"org.scala-js::scalajs-linker:$scalaJsVersion0", + ivy"org.scala-js::scalajs-linker:$scalaJsVersion", ivy"com.github.scopt::scopt:4.1.0" ) - def millSourcePath = super.millSourcePath / os.up - def mainClass = Some("org.scalajs.cli.Scalajsld") - def sources = T.sources { - val extra = - if (Version(scalaJsVersion0) == Version("1.9.0")) millSourcePath / "scala-js-1.9" - else millSourcePath / "scala-js-1.10+" - super.sources() ++ Seq(PathRef(extra)) - } - def transitiveJars: T[Agg[PathRef]] = { def allModuleDeps(todo: List[JavaModule]): List[JavaModule] = { @@ -73,7 +61,6 @@ class Cli(val scalaJsVersion0: String) extends ScalaModule with ScalaJsCliPublis else None import coursier.launcher.{ - AssemblyGenerator, BootstrapGenerator, ClassPathEntry, Parameters, @@ -107,9 +94,8 @@ class Cli(val scalaJsVersion0: String) extends ScalaModule with ScalaJsCliPublis } } -class ScalaJsCliNativeImage(val scalaJsVersion0: String) extends ScalaModule with NativeImage { +trait ScalaJsCliNativeImage extends ScalaModule with NativeImage { def scalaVersion = scala213 - def scalaJsVersion = scalaJsVersion0 def nativeImageClassPath = T{ runClasspath() @@ -123,11 +109,11 @@ class ScalaJsCliNativeImage(val scalaJsVersion0: String) extends ScalaModule wit ) } def nativeImagePersist = System.getenv("CI") != null - def graalVmVersion = "22.3.1" + def graalVmVersion = "22.3.3" def nativeImageGraalVmJvmId = s"graalvm-java17:$graalVmVersion" def nativeImageName = "scala-js-ld" def moduleDeps() = Seq( - cli(scalaJsVersion0) + cli ) def compileIvyDeps = super.compileIvyDeps() ++ Seq( ivy"org.graalvm.nativeimage:svm:$graalVmVersion" @@ -139,20 +125,20 @@ class ScalaJsCliNativeImage(val scalaJsVersion0: String) extends ScalaModule wit val _ = Upload.copyLauncher( nativeImage().path, directory, - s"scala-js-ld-$scalaJsVersion", + s"scala-js-ld", compress = true, suffix = nameSuffix ) } } -object native extends Cross[ScalaJsCliNativeImage](scalaJsVersions: _*) +object native extends ScalaJsCliNativeImage def native0 = native def csDockerVersion = "2.1.0-M5-18-gfebf9838c" -class ScalaJsCliStaticNativeImage(scalaJsVersion0: String) extends ScalaJsCliNativeImage(scalaJsVersion0) { +trait ScalaJsCliStaticNativeImage extends ScalaJsCliNativeImage { def nameSuffix = "-static" def buildHelperImage = T { os.proc("docker", "build", "-t", "scala-cli-base-musl:latest", ".") @@ -173,9 +159,9 @@ class ScalaJsCliStaticNativeImage(scalaJsVersion0: String) extends ScalaJsCliNat super.writeNativeImageScript(scriptDest, imageDest)() } } -object `native-static` extends Cross[ScalaJsCliStaticNativeImage](scalaJsVersions: _*) +object `native-static` extends ScalaJsCliStaticNativeImage -class ScalaJsCliMostlyStaticNativeImage(scalaJsVersion0: String) extends ScalaJsCliNativeImage(scalaJsVersion0) { +trait ScalaJsCliMostlyStaticNativeImage extends ScalaJsCliNativeImage { def nameSuffix = "-mostly-static" def nativeImageDockerParams = Some( NativeImage.linuxMostlyStaticParams( @@ -184,16 +170,15 @@ class ScalaJsCliMostlyStaticNativeImage(scalaJsVersion0: String) extends ScalaJs ) ) } -object `native-mostly-static` extends Cross[ScalaJsCliMostlyStaticNativeImage](scalaJsVersions: _*) +object `native-mostly-static` extends ScalaJsCliMostlyStaticNativeImage -object tests extends Cross[Tests](scalaJsVersions: _*) -class Tests(val scalaJsVersion0: String) extends ScalaModule { +object tests extends ScalaModule { def scalaVersion = scala213 - object test extends Tests { + object test extends ScalaTests { def ivyDeps = super.ivyDeps() ++ Seq( ivy"org.scalameta::munit:0.7.29", - ivy"com.lihaoyi::os-lib:0.9.0", + ivy"com.lihaoyi::os-lib:0.9.1", ivy"com.lihaoyi::pprint:0.8.1" ) def testFramework = "munit.Framework" @@ -206,7 +191,7 @@ class Tests(val scalaJsVersion0: String) extends ScalaModule { val launcher = launcherTask().path val extraArgs = Seq( s"-Dtest.scala-js-cli.path=$launcher", - s"-Dtest.scala-js-cli.scala-js-version=$scalaJsVersion0" + s"-Dtest.scala-js-cli.scala-js-version=$scalaJsVersion" ) args ++ extraArgs } @@ -219,41 +204,23 @@ class Tests(val scalaJsVersion0: String) extends ScalaModule { def test(args: String*) = jvm(args: _*) def jvm(args: String*) = - new TestHelper(cli(scalaJsVersion0).standaloneLauncher).test(args: _*) + new TestHelper(cli.standaloneLauncher).test(args: _*) def native(args: String*) = - new TestHelper(native0(scalaJsVersion0).nativeImage).test(args: _*) + new TestHelper(native0.nativeImage).test(args: _*) def nativeStatic(args: String*) = - new TestHelper(`native-static`(scalaJsVersion0).nativeImage).test(args: _*) + new TestHelper(`native-static`.nativeImage).test(args: _*) def nativeMostlyStatic(args: String*) = - new TestHelper(`native-mostly-static`(scalaJsVersion0).nativeImage).test(args: _*) - - private def updateRef(ref: PathRef): PathRef = { - val rawPath = ref.path.toString.replace( - File.separator + scalaJsVersion0 + File.separator, - File.separator - ) - PathRef(os.Path(rawPath)) - } - def sources = T.sources { - super.sources().flatMap { ref => - Seq(updateRef(ref), ref) - } - } - def resources = T.sources { - super.resources().flatMap { ref => - Seq(updateRef(ref), ref) - } - } + new TestHelper(`native-mostly-static`.nativeImage).test(args: _*) } } -def ghOrg = "scala-cli" +def ghOrg = "virtuslab" def ghName = "scala-js-cli" trait ScalaJsCliPublishModule extends PublishModule { import mill.scalalib.publish._ def pomSettings = PomSettings( description = artifactName(), - organization = "io.github.alexarchambault.tmp", + organization = "org.virtuslab.scala-cli", url = s"https://github.com/$ghOrg/$ghName", licenses = Seq(License.`BSD-3-Clause`), versionControl = VersionControl.github(ghOrg, ghName), @@ -357,8 +324,8 @@ object ci extends Module { set.head } val publisher = new scalalib.publish.SonatypePublisher( - uri = "https://s01.oss.sonatype.org/service/local", - snapshotUri = "https://s01.oss.sonatype.org/content/repositories/snapshots", + uri = "https://oss.sonatype.org/service/local", + snapshotUri = "https://oss.sonatype.org/content/repositories/snapshots", credentials = credentials, signed = true, // format: off @@ -395,7 +362,9 @@ object ci extends Module { if (version.endsWith("-SNAPSHOT")) ("launchers", true) else ("v" + version, false) - Upload.upload("scala-cli", "scala-js-cli", ghToken, tag, dryRun = false, overwrite = overwriteAssets)(launchers: _*) + Upload.upload(ghOrg, ghName, ghToken, tag, dryRun = false, overwrite = overwriteAssets)(launchers: _*) + if(version != scalaJsVersion && !version.endsWith("-SNAPSHOT")) // when we release `0.13.0.1` we should also update native launchers in tag `0.13.0` + Upload.upload(ghOrg, ghName, ghToken, s"v$scalaJsVersion", dryRun = false, overwrite = true)(launchers: _*) } } diff --git a/cli/scala-js-1.9/org/scalajs/cli/internal/ModuleSplitStyleParser.scala b/cli/scala-js-1.9/org/scalajs/cli/internal/ModuleSplitStyleParser.scala deleted file mode 100644 index bf09689..0000000 --- a/cli/scala-js-1.9/org/scalajs/cli/internal/ModuleSplitStyleParser.scala +++ /dev/null @@ -1,21 +0,0 @@ -package org.scalajs.cli.internal - -import org.scalajs.linker.interface.{ModuleSplitStyle => ActualModuleSplitStyle} - -// class rather than object, as that's easier to substitute from native-image -class ModuleSplitStyleParser { - def tryParse(splitStyle: String): Option[ModuleSplitStyle] = - if (splitStyle == ActualModuleSplitStyle.FewestModules.toString) - Some(ModuleSplitStyle(ActualModuleSplitStyle.FewestModules)) - else if (splitStyle == ActualModuleSplitStyle.SmallestModules.toString) - Some(ModuleSplitStyle(ActualModuleSplitStyle.SmallestModules)) - else - None - def parse(splitStyle: String, modulePackages: Array[String]): ModuleSplitStyle = - tryParse(splitStyle).getOrElse { - if (splitStyle == "SmallModulesFor") - throw new IllegalArgumentException(s"SmallModuleFor style not supported for Scala.js < 1.10") - else - throw new IllegalArgumentException(s"$splitStyle is not a valid module split style") - } -} \ No newline at end of file diff --git a/cli/src/org/scalajs/cli/Scalajsld.scala b/cli/src/org/scalajs/cli/Scalajsld.scala index f2aa954..a78ebc6 100644 --- a/cli/src/org/scalajs/cli/Scalajsld.scala +++ b/cli/src/org/scalajs/cli/Scalajsld.scala @@ -26,7 +26,7 @@ import java.io.File import java.net.URI import java.nio.file.Path import java.lang.NoClassDefFoundError -import org.scalajs.cli.internal.ModuleSplitStyleParser +import org.scalajs.cli.internal.{EsVersionParser, ModuleSplitStyleParser} object Scalajsld { @@ -153,6 +153,9 @@ object Scalajsld { opt[Unit]("es2015") .action { (_, c) => c.copy(esFeatures = c.esFeatures.withESVersion(ESVersion.ES2015)) } .text("Use ECMAScript 2015") + opt[String]("esVersion") + .action { (esV, c) => c.copy(esFeatures = c.esFeatures.withESVersion(EsVersionParser.parse(esV))) } + .text("EsVersion " + EsVersionParser.All.mkString("(", ", ", ")")) opt[ModuleKind]('k', "moduleKind") .action { (kind, c) => c.copy(moduleKind = kind) } .text("Module kind " + ModuleKind.All.mkString("(", ", ", ")")) diff --git a/cli/src/org/scalajs/cli/internal/EsVersionParser.scala b/cli/src/org/scalajs/cli/internal/EsVersionParser.scala new file mode 100644 index 0000000..016afaf --- /dev/null +++ b/cli/src/org/scalajs/cli/internal/EsVersionParser.scala @@ -0,0 +1,23 @@ +package org.scalajs.cli.internal + +import org.scalajs.linker.interface.ESVersion + +import java.util.Locale + +object EsVersionParser { + def parse(esVersion: String): ESVersion = + esVersion.trim.toLowerCase(Locale.ROOT) match { + case "es5_1" => ESVersion.ES5_1 + case "es2015" => ESVersion.ES2015 + case "es2016" => ESVersion.ES2016 + case "es2017" => ESVersion.ES2017 + case "es2018" => ESVersion.ES2018 + case "es2019" => ESVersion.ES2019 + case "es2020" => ESVersion.ES2020 + case "es2021" => ESVersion.ES2021 + case unknown => throw new IllegalArgumentException(s"Warning: unrecognized argument: $unknown for --esVersion parameter") + } + + val All: List[ESVersion] = + List(ESVersion.ES5_1, ESVersion.ES2015, ESVersion.ES2016, ESVersion.ES2017, ESVersion.ES2018, ESVersion.ES2019, ESVersion.ES2020, ESVersion.ES2021) +} diff --git a/cli/scala-js-1.10+/org/scalajs/cli/internal/ModuleSplitStyleParser.scala b/cli/src/org/scalajs/cli/internal/ModuleSplitStyleParser.scala similarity index 100% rename from cli/scala-js-1.10+/org/scalajs/cli/internal/ModuleSplitStyleParser.scala rename to cli/src/org/scalajs/cli/internal/ModuleSplitStyleParser.scala