diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a5149ce..0da2e5c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,7 @@ jobs: - uses: oven-sh/setup-bun@v2 with: - bun-version: 1.4.0 + bun-version: 1.4.1 - name: Check formatting run: $MILL --no-server mill.scalalib.scalafmt.ScalafmtModule/checkFormatAll __.sources diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f84f2aa..23df177 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,7 +31,7 @@ jobs: - name: Set up Bun uses: oven-sh/setup-bun@v2 with: - bun-version: 1.4.0 + bun-version: 1.4.1 - name: Cache Coursier uses: actions/cache@v4 diff --git a/.mill-version b/.mill-version index e25d8d9..18efdb9 100644 --- a/.mill-version +++ b/.mill-version @@ -1 +1 @@ -1.1.5 +1.1.8 diff --git a/CHANGELOG.md b/CHANGELOG.md index 40c801f..9417454 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,29 @@ All notable changes to `mill-bun-plugin` will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.1] - Scala 3.9.0 LTS validation, Mill 1.1.8 (2026-09-04) + +### Changed + +- Every Scala.js integration fixture, `example-scalajs`, `examples`, and the README snippets now + build with **Scala 3.9.0 LTS** on Scala.js 1.22.0. Scala 3.9.0 emits Scala.js 1.22 IR, which the + linker bundled by Mill 1.1.x's `ScalaJSConfigModule` (IR ≤ 1.20) rejects; the explicit + `scalaJSVersion` route introduced in 0.3.0 is the supported way to build Scala 3.9 code, and the + suite now proves that exact combination. +- The plugin builds and runs its unit, integration, and example suites on **Mill 1.1.8**: + `.mill-version`, the launcher defaults, every fixture/example `//| mill-version` header, and — + the part that actually decides which Mill the fixtures run in-process — `mill-testkit` is now + pinned separately (`millTestkitVersion = "1.1.8"`). The compile target stays at Mill 1.1.5, so + the supported floor is unchanged and the jar under test is the real consumer shape. +- The plugin's own `scalaVersion` stays at 3.8.2 on purpose and now says why in `build.mill`: it + must match the Scala that Mill 1.1.x compiles build files with, or consumers hit a TASTy version + error at build-script compile time. +- Managed Bun default **1.4.0 → 1.4.1** (released 2026-09-04), with checksums for all twelve + release assets; 1.4.1 writes `lockfileVersion` 2, so committed locks stay valid. 1.4.0 stays in + the table for explicit `bunVersion` pins. `@types/bun` has not reached 1.4.1 on npm yet, so the + shipped default pairs with `DefaultBunTypesVersion = "1.4.0"` rather than tracking Bun blindly + (a 404 on every TypeScript frozen install); modules that override `bunVersion` keep lockstep. + ## [0.3.0] - Managed toolchain, strict lockfiles, canonical vocabulary (2026-08-27) ### Added diff --git a/README.md b/README.md index aaa881f..b104b7e 100644 --- a/README.md +++ b/README.md @@ -6,18 +6,18 @@ It keeps Mill's task graph, caching, module relationships, Scala.js linker, and ## Requirements -- Mill 1.1.5+ +- Mill 1.1.5+ (compiled against 1.1.5; the test suite and examples run on 1.1.8) - JDK 17+ -Bun does not need to be installed. The plugin downloads and checksum-verifies Bun 1.4.0 by default on macOS, Linux, and Windows x64/arm64. musl-based Linux (Alpine) is detected automatically; on x64 CPUs without AVX2, set `bunUseBaseline`. Set `MILL_BUN_USE_SYSTEM=true` to opt into the Bun on `PATH` instead. +Bun does not need to be installed. The plugin downloads and checksum-verifies Bun 1.4.1 by default on macOS, Linux, and Windows x64/arm64. musl-based Linux (Alpine) is detected automatically; on x64 CPUs without AVX2, set `bunUseBaseline`. Set `MILL_BUN_USE_SYSTEM=true` to opt into the Bun on `PATH` instead. ## Scala.js quick start ```scala -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.3.0 +//| - com.tjclp::mill-bun_mill1:0.3.1 package build @@ -29,7 +29,7 @@ import mill.scalajslib.bun.* object app extends BunScalaJSModule { override def moduleDir = build.moduleDir - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.ESModule } @@ -57,10 +57,10 @@ Scala.js versions are explicit: choose the version your application tests agains ## TypeScript quick start ```scala -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.3.0 +//| - com.tjclp::mill-bun_mill1:0.3.1 package build @@ -89,7 +89,7 @@ Use the paired web traits when HTML and static assets are part of the applicatio ```scala object frontend extends BunScalaJSWebModule { - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.ESModule } } @@ -133,7 +133,7 @@ Resolution order is: 1. `bunExecutableOverride` 2. system `PATH` when `bunUseSystem` or `MILL_BUN_USE_SYSTEM=true` -3. checksum-verified managed Bun 1.4.0 +3. checksum-verified managed Bun 1.4.1 Use `./mill app.bunDoctor` to print and validate the resolved executable, version, revision, mode, selected release asset, and linker. @@ -156,7 +156,7 @@ import mill.javascriptlib.bun.* import mill.scalajslib.bun.* object scalaApp extends BunScalaJSModule { - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def bunWorkspaceInstall = Task { Some(workspace.bunInstall()) } } @@ -178,7 +178,7 @@ Mix `BunPublishModule` into a published Scala.js library to emit `META-INF/bun/b ```scala object ui extends BunScalaJSModule with BunPublishModule { - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def npmPeerDeps = Task { Seq("react@^19.0.0") } } diff --git a/build.mill b/build.mill index 39c8df5..9d4a979 100644 --- a/build.mill +++ b/build.mill @@ -4,7 +4,18 @@ import mill.*, scalalib.*, publish.* import mill.api.BuildCtx object millbun extends ScalaModule, PublishModule { + // Compile target = the minimum Mill the plugin supports; Mill 1.x keeps plugin binary + // compatibility forwards, so the floor stays where it is while the suite below runs on + // the latest stable release. def millVersion = "1.1.5" + // The integration fixtures run Mill in-process via mill-testkit, so THIS is the Mill the + // plugin is tested against (fixture `//| mill-version` headers are only read for the + // mismatch warning). Kept at the latest stable Mill; the plugin jar under test is still + // the one compiled against millVersion above, i.e. the real consumer shape. + def millTestkitVersion = "1.1.8" + // Must match the Scala that Mill 1.1.x compiles build files with (3.8.2): a plugin built + // with a newer Scala emits TASTy that consumers' Mill cannot read. Fixtures and examples + // are free to use newer Scala (they are on 3.9.0 LTS); this pin is not. def scalaVersion = "3.8.2" def jvmVersion = "25" def platformSuffix = "_mill1" @@ -24,7 +35,7 @@ object millbun extends ScalaModule, PublishModule { object integration extends ScalaTests, TestModule.Utest { def mvnDeps = Seq( - mvn"com.lihaoyi::mill-testkit:$millVersion", + mvn"com.lihaoyi::mill-testkit:$millTestkitVersion", mvn"com.lihaoyi::utest:0.8.5" ) override def resources = Task.Sources() diff --git a/example-scalajs/build.mill b/example-scalajs/build.mill index bffdc70..c0fa88c 100644 --- a/example-scalajs/build.mill +++ b/example-scalajs/build.mill @@ -1,7 +1,7 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.3.0 +//| - com.tjclp::mill-bun_mill1:0.3.1 package build @@ -14,7 +14,7 @@ import mill.bun.bun object app extends BunScalaJSModule { override def moduleDir = build.moduleDir - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.ESModule } diff --git a/example-scalajs/mill b/example-scalajs/mill index 155baa7..29f7b4f 100755 --- a/example-scalajs/mill +++ b/example-scalajs/mill @@ -2,7 +2,7 @@ set -e -if [ -z "${DEFAULT_MILL_VERSION}" ] ; then DEFAULT_MILL_VERSION="1.1.5"; fi +if [ -z "${DEFAULT_MILL_VERSION}" ] ; then DEFAULT_MILL_VERSION="1.1.8"; fi if [ -z "${GITHUB_RELEASE_CDN}" ] ; then GITHUB_RELEASE_CDN=""; fi diff --git a/example-scalajs/mill.bat b/example-scalajs/mill.bat index 948392f..1bce54c 100644 --- a/example-scalajs/mill.bat +++ b/example-scalajs/mill.bat @@ -2,7 +2,7 @@ setlocal enabledelayedexpansion -if [!DEFAULT_MILL_VERSION!]==[] ( set "DEFAULT_MILL_VERSION=1.1.5" ) +if [!DEFAULT_MILL_VERSION!]==[] ( set "DEFAULT_MILL_VERSION=1.1.8" ) if [!MILL_GITHUB_RELEASE_CDN!]==[] ( set "MILL_GITHUB_RELEASE_CDN=" ) diff --git a/example-typescript/build.mill b/example-typescript/build.mill index 72904ae..58de38e 100644 --- a/example-typescript/build.mill +++ b/example-typescript/build.mill @@ -1,7 +1,7 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.3.0 +//| - com.tjclp::mill-bun_mill1:0.3.1 package build diff --git a/example-typescript/mill b/example-typescript/mill index 155baa7..29f7b4f 100755 --- a/example-typescript/mill +++ b/example-typescript/mill @@ -2,7 +2,7 @@ set -e -if [ -z "${DEFAULT_MILL_VERSION}" ] ; then DEFAULT_MILL_VERSION="1.1.5"; fi +if [ -z "${DEFAULT_MILL_VERSION}" ] ; then DEFAULT_MILL_VERSION="1.1.8"; fi if [ -z "${GITHUB_RELEASE_CDN}" ] ; then GITHUB_RELEASE_CDN=""; fi diff --git a/example-typescript/mill.bat b/example-typescript/mill.bat index 948392f..1bce54c 100644 --- a/example-typescript/mill.bat +++ b/example-typescript/mill.bat @@ -2,7 +2,7 @@ setlocal enabledelayedexpansion -if [!DEFAULT_MILL_VERSION!]==[] ( set "DEFAULT_MILL_VERSION=1.1.5" ) +if [!DEFAULT_MILL_VERSION!]==[] ( set "DEFAULT_MILL_VERSION=1.1.8" ) if [!MILL_GITHUB_RELEASE_CDN!]==[] ( set "MILL_GITHUB_RELEASE_CDN=" ) diff --git a/examples/build.mill b/examples/build.mill index 12e20a9..654bbc8 100644 --- a/examples/build.mill +++ b/examples/build.mill @@ -1,7 +1,7 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: -//| - com.tjclp::mill-bun_mill1:0.3.0 +//| - com.tjclp::mill-bun_mill1:0.3.1 package build @@ -22,7 +22,7 @@ import mill.javascriptlib.bun.* // ./mill webServer.compileExecutable object webServer extends BunScalaJSModule { override def sources = Task.Sources(build.moduleDir / "web-server" / "src") - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.ESModule } override def bunBundleTarget = Task { "bun" } @@ -32,7 +32,7 @@ object webServer extends BunScalaJSModule { // ./mill todoApp.bundle object todoApp extends BunScalaJSModule { override def sources = Task.Sources(build.moduleDir / "frontend" / "src") - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" def mvnDeps = Seq(mvn"org.scala-js::scalajs-dom::2.8.1") override def moduleKind = Task { ModuleKind.ESModule } @@ -46,7 +46,7 @@ object todoApp extends BunScalaJSModule { object fullstack extends Module { object shared extends BunScalaJSModule { override def sources = Task.Sources(build.moduleDir / "fullstack" / "shared") - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.ESModule } } @@ -107,7 +107,7 @@ object client extends BunTypeScriptModule { // --- Scala.js browser frontend (alternative client) --- object scalaClient extends BunScalaJSModule { - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" def mvnDeps = Seq(mvn"org.scala-js::scalajs-dom::2.8.1") override def moduleKind = Task { ModuleKind.ESModule } @@ -116,7 +116,7 @@ object scalaClient extends BunScalaJSModule { // --- JVM backend (Scala/Cask HTTP server, serves TS client bundle) --- object backend extends ScalaModule { - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def mvnDeps = Seq( mvn"com.lihaoyi::cask:0.10.2", mvn"com.lihaoyi::upickle:4.3.0" diff --git a/mill b/mill index 155baa7..29f7b4f 100755 --- a/mill +++ b/mill @@ -2,7 +2,7 @@ set -e -if [ -z "${DEFAULT_MILL_VERSION}" ] ; then DEFAULT_MILL_VERSION="1.1.5"; fi +if [ -z "${DEFAULT_MILL_VERSION}" ] ; then DEFAULT_MILL_VERSION="1.1.8"; fi if [ -z "${GITHUB_RELEASE_CDN}" ] ; then GITHUB_RELEASE_CDN=""; fi diff --git a/mill.bat b/mill.bat index 948392f..1bce54c 100644 --- a/mill.bat +++ b/mill.bat @@ -2,7 +2,7 @@ setlocal enabledelayedexpansion -if [!DEFAULT_MILL_VERSION!]==[] ( set "DEFAULT_MILL_VERSION=1.1.5" ) +if [!DEFAULT_MILL_VERSION!]==[] ( set "DEFAULT_MILL_VERSION=1.1.8" ) if [!MILL_GITHUB_RELEASE_CDN!]==[] ( set "MILL_GITHUB_RELEASE_CDN=" ) diff --git a/millbun/integration/resources/invalid-bun-literal/build.mill b/millbun/integration/resources/invalid-bun-literal/build.mill index 548ca07..0918017 100644 --- a/millbun/integration/resources/invalid-bun-literal/build.mill +++ b/millbun/integration/resources/invalid-bun-literal/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY @@ -13,7 +13,7 @@ import mill.scalajslib.bun.* object app extends BunScalaJSModule { override def moduleDir = build.moduleDir - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.CommonJSModule } diff --git a/millbun/integration/resources/invalid-bun-specifier/build.mill b/millbun/integration/resources/invalid-bun-specifier/build.mill index 3699c20..c2894d9 100644 --- a/millbun/integration/resources/invalid-bun-specifier/build.mill +++ b/millbun/integration/resources/invalid-bun-specifier/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY @@ -13,7 +13,7 @@ import mill.scalajslib.bun.* object app extends BunScalaJSModule { override def moduleDir = build.moduleDir - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.CommonJSModule } diff --git a/millbun/integration/resources/managed-bun/build.mill b/millbun/integration/resources/managed-bun/build.mill index 3fa5678..6aeaf11 100644 --- a/millbun/integration/resources/managed-bun/build.mill +++ b/millbun/integration/resources/managed-bun/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/mixed-workspace/build.mill b/millbun/integration/resources/mixed-workspace/build.mill index d85e2e4..5001075 100644 --- a/millbun/integration/resources/mixed-workspace/build.mill +++ b/millbun/integration/resources/mixed-workspace/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY @@ -15,7 +15,7 @@ object scalaApp extends BunScalaJSModule { // Renamed deliberately: the layout's directory naming, duplicate guard, AND the generated // member manifest must all follow this name, or bun sees a different identity than Mill. override def bunWorkspacePackageName = Task { "scala-app-renamed" } - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.ESModule } override def npmDeps = Task { Seq("is-even@1.0.0") } diff --git a/millbun/integration/resources/scalajs-bundle/build.mill b/millbun/integration/resources/scalajs-bundle/build.mill index 7112db3..7cd9882 100644 --- a/millbun/integration/resources/scalajs-bundle/build.mill +++ b/millbun/integration/resources/scalajs-bundle/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY @@ -12,7 +12,7 @@ import mill.scalajslib.bun.* object app extends BunScalaJSModule { override def moduleDir = build.moduleDir - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def mainClass = Some("Main") diff --git a/millbun/integration/resources/scalajs-bunfig/build.mill b/millbun/integration/resources/scalajs-bunfig/build.mill index bbe37e9..8b55dc4 100644 --- a/millbun/integration/resources/scalajs-bunfig/build.mill +++ b/millbun/integration/resources/scalajs-bunfig/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY @@ -13,7 +13,7 @@ import mill.scalajslib.bun.* object app extends BunScalaJSModule { override def moduleDir = build.moduleDir - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def mainClass = Some("Main") diff --git a/millbun/integration/resources/scalajs-dependency-manifests/build.mill b/millbun/integration/resources/scalajs-dependency-manifests/build.mill index 1646f15..5be83d3 100644 --- a/millbun/integration/resources/scalajs-dependency-manifests/build.mill +++ b/millbun/integration/resources/scalajs-dependency-manifests/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY @@ -13,7 +13,7 @@ import mill.scalajslib.bun.* trait StubBunModule extends BunScalaJSModule { override def moduleDir = build.moduleDir - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.CommonJSModule } override def bunExecutable = Task { "stub-bun" } diff --git a/millbun/integration/resources/scalajs-simple/build.mill b/millbun/integration/resources/scalajs-simple/build.mill index f1d2d36..175ba89 100644 --- a/millbun/integration/resources/scalajs-simple/build.mill +++ b/millbun/integration/resources/scalajs-simple/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY @@ -12,7 +12,7 @@ import mill.scalajslib.bun.* object app extends BunScalaJSModule { override def moduleDir = build.moduleDir - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.ESModule } diff --git a/millbun/integration/resources/scalajs-test/build.mill b/millbun/integration/resources/scalajs-test/build.mill index 0e9b278..07a88b4 100644 --- a/millbun/integration/resources/scalajs-test/build.mill +++ b/millbun/integration/resources/scalajs-test/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY @@ -13,7 +13,7 @@ import mill.scalajslib.bun.* object app extends BunScalaJSModule { override def moduleDir = build.moduleDir - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.ESModule } diff --git a/millbun/integration/resources/scalajs-transitive/build.mill b/millbun/integration/resources/scalajs-transitive/build.mill index 1cbbf76..f537c40 100644 --- a/millbun/integration/resources/scalajs-transitive/build.mill +++ b/millbun/integration/resources/scalajs-transitive/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY @@ -13,7 +13,7 @@ import mill.scalajslib.bun.* // lib keeps its own moduleDir (lib/): sharing the root with app would make both modules // resolve the same bun.lock, and only one dependency set can be recorded there. object lib extends BunScalaJSModule { - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" override def moduleKind = Task { ModuleKind.ESModule } diff --git a/millbun/integration/resources/scalajs-web/build.mill b/millbun/integration/resources/scalajs-web/build.mill index 853e71b..cdc8af8 100644 --- a/millbun/integration/resources/scalajs-web/build.mill +++ b/millbun/integration/resources/scalajs-web/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY @@ -13,7 +13,7 @@ import mill.scalajslib.bun.* object app extends BunScalaJSWebModule { override def moduleDir = build.moduleDir - def scalaVersion = "3.8.2" + def scalaVersion = "3.9.0" def scalaJSVersion = "1.22.0" def mvnDeps = Seq(mvn"org.scala-js::scalajs-dom::2.8.1") override def npmDeps = Task { Seq("lodash@4.17.21") } diff --git a/millbun/integration/resources/typescript-browser/build.mill b/millbun/integration/resources/typescript-browser/build.mill index b14146b..dd77c57 100644 --- a/millbun/integration/resources/typescript-browser/build.mill +++ b/millbun/integration/resources/typescript-browser/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-bundle/build.mill b/millbun/integration/resources/typescript-bundle/build.mill index 3b296da..dc10d49 100644 --- a/millbun/integration/resources/typescript-bundle/build.mill +++ b/millbun/integration/resources/typescript-bundle/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-bunfig/build.mill b/millbun/integration/resources/typescript-bunfig/build.mill index 3edc3c7..d9e63be 100644 --- a/millbun/integration/resources/typescript-bunfig/build.mill +++ b/millbun/integration/resources/typescript-bunfig/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-compile/build.mill b/millbun/integration/resources/typescript-compile/build.mill index 2dbf47d..848ddc7 100644 --- a/millbun/integration/resources/typescript-compile/build.mill +++ b/millbun/integration/resources/typescript-compile/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-env/build.mill b/millbun/integration/resources/typescript-env/build.mill index 686ac00..32151ab 100644 --- a/millbun/integration/resources/typescript-env/build.mill +++ b/millbun/integration/resources/typescript-env/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-lock/build.mill b/millbun/integration/resources/typescript-lock/build.mill index c39c529..d138600 100644 --- a/millbun/integration/resources/typescript-lock/build.mill +++ b/millbun/integration/resources/typescript-lock/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-overrides/build.mill b/millbun/integration/resources/typescript-overrides/build.mill index f6c07ee..6bd1d75 100644 --- a/millbun/integration/resources/typescript-overrides/build.mill +++ b/millbun/integration/resources/typescript-overrides/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-simple/build.mill b/millbun/integration/resources/typescript-simple/build.mill index e714a76..44f1e4c 100644 --- a/millbun/integration/resources/typescript-simple/build.mill +++ b/millbun/integration/resources/typescript-simple/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-stale-lock/build.mill b/millbun/integration/resources/typescript-stale-lock/build.mill index b60587c..244f207 100644 --- a/millbun/integration/resources/typescript-stale-lock/build.mill +++ b/millbun/integration/resources/typescript-stale-lock/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-test-deps/build.mill b/millbun/integration/resources/typescript-test-deps/build.mill index a315dd8..a11471a 100644 --- a/millbun/integration/resources/typescript-test-deps/build.mill +++ b/millbun/integration/resources/typescript-test-deps/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-tests/build.mill b/millbun/integration/resources/typescript-tests/build.mill index 3e3731f..448779f 100644 --- a/millbun/integration/resources/typescript-tests/build.mill +++ b/millbun/integration/resources/typescript-tests/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-tsx/build.mill b/millbun/integration/resources/typescript-tsx/build.mill index c9710be..08e9b8d 100644 --- a/millbun/integration/resources/typescript-tsx/build.mill +++ b/millbun/integration/resources/typescript-tsx/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-unmanaged/build.mill b/millbun/integration/resources/typescript-unmanaged/build.mill index 1333f47..1a7fca5 100644 --- a/millbun/integration/resources/typescript-unmanaged/build.mill +++ b/millbun/integration/resources/typescript-unmanaged/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-web/build.mill b/millbun/integration/resources/typescript-web/build.mill index ac9bebd..0def87c 100644 --- a/millbun/integration/resources/typescript-web/build.mill +++ b/millbun/integration/resources/typescript-web/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/resources/typescript-workers/build.mill b/millbun/integration/resources/typescript-workers/build.mill index 50724d0..33c8fbb 100644 --- a/millbun/integration/resources/typescript-workers/build.mill +++ b/millbun/integration/resources/typescript-workers/build.mill @@ -1,4 +1,4 @@ -//| mill-version: 1.1.5 +//| mill-version: 1.1.8 //| mill-jvm-version: system //| mvnDeps: //| - com.tjclp::mill-bun_mill1:0.0.0-NIGHTLY diff --git a/millbun/integration/src/mill/bun/BunManagedToolchainIntegrationTests.scala b/millbun/integration/src/mill/bun/BunManagedToolchainIntegrationTests.scala index 4d5a4a2..4ddc0d1 100644 --- a/millbun/integration/src/mill/bun/BunManagedToolchainIntegrationTests.scala +++ b/millbun/integration/src/mill/bun/BunManagedToolchainIntegrationTests.scala @@ -12,7 +12,7 @@ object BunManagedToolchainIntegrationTests extends BunIntegrationSuite: assert(result.isSuccess) val executable = tester.out("app.bunExecutable").value[String] val version = os.proc(executable, "--version").call(stdout = os.Pipe).out.text().trim - assert(version == "1.4.0") + assert(version == BunToolchainModule.DefaultBunVersion) // First-ever coverage for the diagnostics command: it must at least evaluate. assert(tester.eval("app.bunDoctor").isSuccess) @@ -40,4 +40,4 @@ object BunManagedToolchainIntegrationTests extends BunIntegrationSuite: val executable = tester.out("app.bunExecutable").value[String] assert(os.isFile(os.Path(executable))) val version = os.proc(executable, "--version").call(stdout = os.Pipe).out.text().trim - assert(version == "1.4.0") + assert(version == BunToolchainModule.DefaultBunVersion) diff --git a/millbun/integration/src/mill/bun/BunTypeScriptIntegrationTests.scala b/millbun/integration/src/mill/bun/BunTypeScriptIntegrationTests.scala index 7407015..350583f 100644 --- a/millbun/integration/src/mill/bun/BunTypeScriptIntegrationTests.scala +++ b/millbun/integration/src/mill/bun/BunTypeScriptIntegrationTests.scala @@ -135,8 +135,9 @@ object BunTypeScriptIntegrationTests extends BunIntegrationSuite { val packageJson = ujson.read(os.read(tester.workspacePath / "out" / "app" / "bunInstall.dest" / "package.json")) val devDeps = packageJson("devDependencies").obj - // Pinned, and pinned to the Bun we ship: @types/bun is published in lockstep with Bun. - assert(devDeps("@types/bun").str == BunToolchainModule.DefaultBunVersion) + // Pinned, and pinned to the types that pair with the Bun we ship. That is normally the same + // number, but npm can lag a Bun release, so the default carries its own types version. + assert(devDeps("@types/bun").str == BunToolchainModule.DefaultBunTypesVersion) assert(devDeps("@types/bun").str != "latest") assert(!devDeps.contains("@types/node")) } diff --git a/millbun/src/mill/bun/BunToolchainModule.scala b/millbun/src/mill/bun/BunToolchainModule.scala index b9f68e0..692b146 100644 --- a/millbun/src/mill/bun/BunToolchainModule.scala +++ b/millbun/src/mill/bun/BunToolchainModule.scala @@ -13,10 +13,21 @@ object BunToolchainModule { /** * The Bun release this plugin is tested against and downloads by default. * - * Referenced by `bunVersion`, by `bunTypesVersion` (`@types/bun` is published in lockstep), and - * by the tests, so a bump is a one-line change here rather than a hunt for literals. + * Referenced by `bunVersion` and by the tests, so a bump is a one-line change here (plus the + * checksum row below) rather than a hunt for literals. */ - val DefaultBunVersion = "1.4.0" + val DefaultBunVersion = "1.4.1" + + /** + * `@types/bun` version paired with [[DefaultBunVersion]] by default. + * + * `@types/bun` normally ships in lockstep with Bun, but npm can lag a release by a day or two + * (1.4.1 shipped 2026-09-04 with no `@types/bun@1.4.1` yet). Tracking Bun blindly would make + * every TypeScript module's frozen install 404 on release day, so the shipped default pins the + * newest published types instead. Bump together with [[DefaultBunVersion]] once npm has caught + * up; modules that override `bunVersion` keep the lockstep behaviour. + */ + val DefaultBunTypesVersion = "1.4.0" private val ModeledPackageJsonFields = Set( "dependencies", @@ -69,16 +80,31 @@ object BunToolchainModule { "bun-windows-aarch64.zip" -> "f473bfe2df73ee770548c93dd5d380aea7120c218ec2aa1afdd0bbba7bf18c47", "bun-windows-x64.zip" -> "e6f093d39da486b20262ca8cdd5ed6a9e8bc9c2f275b78e6d3a0c5b28cc95901", "bun-windows-x64-baseline.zip" -> "b929c54a9badb104a16dedd23aab6152c86793ae653d4e6b13983ffd0c882a66" + ), + "1.4.1" -> Map( + "bun-darwin-aarch64.zip" -> "d8973ce835fa7867e5cc79afee6fc6f1ae0117aa4bd5fc2546fd00c512f71386", + "bun-darwin-x64.zip" -> "8f34239f276a3f0d27bfcd1ffecfe5d2127e74fb0aa4c0971a0cdec7b225c965", + "bun-darwin-x64-baseline.zip" -> "498e76d61bbe87d2306f65fed60ae86b6b0c8ee2da709f83202808db1a09e407", + "bun-linux-aarch64.zip" -> "580ce77533108dc6b10bec1721397e4f5aa44e909726da2451d483dfc5e581d6", + "bun-linux-aarch64-musl.zip" -> "53895807a00508f70e76715947097aa533ec520aac066501c00fb77d2b1a7a6c", + "bun-linux-x64.zip" -> "74c1c3bee7cd998500c8f969cd8972355ac6a07207e94a39eece1999b56ffabf", + "bun-linux-x64-baseline.zip" -> "a8c9c6738202e2fced555dd860a953c56c0cd059f75041e7010ae81a32802646", + "bun-linux-x64-musl.zip" -> "ea116fe09f2f764c87b9bf735225b781d1f7674ca58d66040470f38a7943c8ab", + "bun-linux-x64-musl-baseline.zip" -> "74d04038a21e6ae816f9e74525b754b85294be99632b336cb4c57019c9313829", + "bun-windows-aarch64.zip" -> "41ea66155baf0ac1f8545f8d54544bcaf4908104193c5db9aad85d6f53ae1bd7", + "bun-windows-x64.zip" -> "52b1f3028b01f43d37fefdf669d034a1ee2e0d96c56bb13c393bdaf169b1af84", + "bun-windows-x64-baseline.zip" -> "2d1871e72b28165a8574a9c91de867cbe499f55b8c75facf4fb9e42888eddba6" ) ) /** Versions with a complete bundled checksum table, for diagnostics. */ private[bun] def bundledVersions: Seq[String] = BundledChecksums.keys.toSeq.sorted - /** Highest `lockfileVersion` each bundled Bun can read. 1.4.0 writes v2; 1.3.14 fails on v2. */ + /** Highest `lockfileVersion` each bundled Bun can read. 1.4.x writes v2; 1.3.14 fails on v2. */ private val SupportedLockfileVersions: Map[String, Int] = Map( "1.3.14" -> 1, - "1.4.0" -> 2 + "1.4.0" -> 2, + "1.4.1" -> 2 ) private[bun] def supportedLockfileVersion(bunVersion: String): Option[Int] = diff --git a/millbun/src/mill/javascriptlib/bun/BunTypeScriptModule.scala b/millbun/src/mill/javascriptlib/bun/BunTypeScriptModule.scala index fbafe14..f1e699d 100644 --- a/millbun/src/mill/javascriptlib/bun/BunTypeScriptModule.scala +++ b/millbun/src/mill/javascriptlib/bun/BunTypeScriptModule.scala @@ -66,9 +66,14 @@ trait BunTypeScriptModule extends TypeScriptModule with BunToolchainModule with /** Bun ambient types used for bun-targeted Bun builds. * * `@types/bun` is published in lockstep with Bun itself, so this tracks [[bunVersion]] by - * default and the two cannot drift. + * default. The one exception is the plugin's own default Bun, which pairs with + * [[BunToolchainModule.DefaultBunTypesVersion]] — npm can lag a Bun release by a day or two, + * and the shipped default must never 404 on release day. */ - def bunTypesVersion: T[String] = Task { bunVersion() } + def bunTypesVersion: T[String] = Task { + if (bunVersion() == BunToolchainModule.DefaultBunVersion) BunToolchainModule.DefaultBunTypesVersion + else bunVersion() + } /** Ambient runtime types aligned to the configured Bun target. */ protected def ambientTypeDeps: T[Seq[String]] = Task { diff --git a/millbun/test/src/mill/bun/BunToolchainTests.scala b/millbun/test/src/mill/bun/BunToolchainTests.scala index 3393669..fa7c539 100644 --- a/millbun/test/src/mill/bun/BunToolchainTests.scala +++ b/millbun/test/src/mill/bun/BunToolchainTests.scala @@ -84,7 +84,7 @@ object BunToolchainTests extends TestSuite: assert(checksum.exists(_.matches("[0-9a-f]{64}"))) test("pins the versions the docs and CI claim"): - assert(BunToolchainModule.bundledVersions == Seq("1.3.14", "1.4.0")) + assert(BunToolchainModule.bundledVersions == Seq("1.3.14", "1.4.0", "1.4.1")) // The default must be one we ship checksums for, or the managed path cannot work offline. assert(BunToolchainModule.bundledVersions.contains(BunToolchainModule.DefaultBunVersion))