From 9d149ed4508d4d424d6a94c96a2f1b20cc31f092 Mon Sep 17 00:00:00 2001 From: Richie Caputo Date: Fri, 4 Sep 2026 11:13:35 -0400 Subject: [PATCH 1/2] build: validate Scala 3.9.0 LTS + Scala.js 1.22.0 on Mill 1.1.8; cut 0.3.1 (TJC-2274) 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. 0.3.0's explicit-scalaJSVersion path is the supported route, but the suite only proved it against Scala 3.8.2 on Mill 1.1.5. Now: - Every Scala.js fixture, example-scalajs, examples, and the README snippets build with Scala 3.9.0 LTS on Scala.js 1.22.0. No plugin code change needed. - Mill 1.1.8 for the plugin build (.mill-version, launcher defaults, fixture and example headers) plus a separate millTestkitVersion = "1.1.8": the fixtures run Mill in-process via mill-testkit, so that pin is what decides which Mill they exercise (0 version-mismatch warnings, previously 49). The compile target stays at millVersion = "1.1.5"; the floor is unchanged. - The plugin's own scalaVersion stays 3.8.2 on purpose (documented): Mill 1.1.5 and 1.1.8 both compile build files with Scala 3.8.2, and a plugin built with newer Scala emits TASTy consumers' Mill cannot read. - Version sweep 0.3.0 -> 0.3.1 and a 0.3.1 CHANGELOG entry. Verified locally: millbun.compile/test, full millbun.integration (in-process Mill 1.1.8), example-scalajs + example-typescript run/test, examples compile, scalafmt check. Consumer check: fast-mcp-scala on Scala 3.9.0 with this plugin at 0.3.1 (publishLocal) compiles JVM/JS/Native and passes its Bun conformance suite. Co-Authored-By: Claude Fable 5.1 --- .mill-version | 2 +- CHANGELOG.md | 18 ++++++++++++++++++ README.md | 18 +++++++++--------- build.mill | 13 ++++++++++++- example-scalajs/build.mill | 6 +++--- example-scalajs/mill | 2 +- example-scalajs/mill.bat | 2 +- example-typescript/build.mill | 4 ++-- example-typescript/mill | 2 +- example-typescript/mill.bat | 2 +- examples/build.mill | 14 +++++++------- mill | 2 +- mill.bat | 2 +- .../resources/invalid-bun-literal/build.mill | 4 ++-- .../resources/invalid-bun-specifier/build.mill | 4 ++-- .../resources/managed-bun/build.mill | 2 +- .../resources/mixed-workspace/build.mill | 4 ++-- .../resources/scalajs-bundle/build.mill | 4 ++-- .../resources/scalajs-bunfig/build.mill | 4 ++-- .../scalajs-dependency-manifests/build.mill | 4 ++-- .../resources/scalajs-simple/build.mill | 4 ++-- .../resources/scalajs-test/build.mill | 4 ++-- .../resources/scalajs-transitive/build.mill | 4 ++-- .../resources/scalajs-web/build.mill | 4 ++-- .../resources/typescript-browser/build.mill | 2 +- .../resources/typescript-bundle/build.mill | 2 +- .../resources/typescript-bunfig/build.mill | 2 +- .../resources/typescript-compile/build.mill | 2 +- .../resources/typescript-env/build.mill | 2 +- .../resources/typescript-lock/build.mill | 2 +- .../resources/typescript-overrides/build.mill | 2 +- .../resources/typescript-simple/build.mill | 2 +- .../resources/typescript-stale-lock/build.mill | 2 +- .../resources/typescript-test-deps/build.mill | 2 +- .../resources/typescript-tests/build.mill | 2 +- .../resources/typescript-tsx/build.mill | 2 +- .../resources/typescript-unmanaged/build.mill | 2 +- .../resources/typescript-web/build.mill | 2 +- .../resources/typescript-workers/build.mill | 2 +- 39 files changed, 94 insertions(+), 65 deletions(-) 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..6eb6e67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,24 @@ 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. + ## [0.3.0] - Managed toolchain, strict lockfiles, canonical vocabulary (2026-08-27) ### Added diff --git a/README.md b/README.md index aaa881f..5dd7554 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ 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. @@ -14,10 +14,10 @@ Bun does not need to be installed. The plugin downloads and checksum-verifies Bu ## 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 } } @@ -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 From cbb71ec6dcb22cf69edd75a493dd4f12d439e447 Mon Sep 17 00:00:00 2001 From: Richie Caputo Date: Fri, 4 Sep 2026 11:27:49 -0400 Subject: [PATCH 2/2] toolchain: managed Bun 1.4.0 -> 1.4.1; decouple the default @types/bun version (TJC-2274) Bun 1.4.1 shipped 2026-09-04. The managed default moves to it with checksums for all twelve release assets taken from the release's SHASUMS256.txt (the darwin-aarch64 archive was downloaded and re-hashed to confirm the table matches). 1.4.1 writes lockfileVersion 2, so committed locks stay valid; 1.4.0 stays in the table for explicit bunVersion pins. CI's system-Bun jobs follow, since the version check requires PATH Bun == bunVersion. @types/bun has not reached 1.4.1 on npm, so the shipped default now pairs with DefaultBunTypesVersion = "1.4.0" instead of tracking Bun blindly, which would have 404'd every TypeScript frozen install on release day. Modules that override bunVersion keep the lockstep behaviour. The "ambient types are pinned" integration test asserts the new pairing. Verified locally: millbun.test, full millbun.integration on managed 1.4.1, example-scalajs + example-typescript run/test, examples compile, scalafmt. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/ci.yml | 2 +- .github/workflows/release.yml | 2 +- CHANGELOG.md | 5 +++ README.md | 4 +-- .../BunManagedToolchainIntegrationTests.scala | 4 +-- .../bun/BunTypeScriptIntegrationTests.scala | 5 +-- millbun/src/mill/bun/BunToolchainModule.scala | 36 ++++++++++++++++--- .../bun/BunTypeScriptModule.scala | 9 +++-- .../test/src/mill/bun/BunToolchainTests.scala | 2 +- 9 files changed, 53 insertions(+), 16 deletions(-) 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/CHANGELOG.md b/CHANGELOG.md index 6eb6e67..9417454 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - 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) diff --git a/README.md b/README.md index 5dd7554..b104b7e 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ It keeps Mill's task graph, caching, module relationships, Scala.js linker, and - 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 @@ -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. 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))