Update all non-major dependencies #84

Open
andras wants to merge 1 commit from renovate/all into main
Owner

This PR contains the following updates:

Package Type Update Change
insta (source) dev-dependencies minor 1.46.3 → 1.49.0
jest (source) devDependencies minor 30.3.0 → 30.5.2
prettier (source) devDependencies minor 3.8.1 → 3.9.10
pyo3 (source) dependencies minor 0.28.2 → 0.30.0
rust (source, changelog) toolchain minor 1.94.0 → 1.99.1
sass devDependencies minor 1.98.0 → 1.107.1
serde (source) dev-dependencies patch 1.0.228 → 1.0.229
serde (source) dependencies patch 1.0.228 → 1.0.229
terser-webpack-plugin devDependencies minor 5.4.0 → 5.6.1
test-case dev-dependencies minor 3.3.1 → 3.4.1
thiserror dependencies patch 2.0.18 → 2.0.21
ts-jest (source) devDependencies patch 29.4.6 → 29.4.15
ts-loader devDependencies minor 9.5.4 → 9.6.2
tslib (source) devDependencies minor 2.8.1 → 2.9.1
wasm-bindgen (source) dependencies patch 0.2.114 → 0.2.130
wasm-bindgen-test dev-dependencies patch 0.3.64 → 0.3.80
webpack devDependencies minor 5.105.4 → 5.112.2

Release Notes

mitsuhiko/insta (insta)

v1.49.0

Compare Source

  • Allow Option<&OsStr> snapshot names, such as Path::file_name(),
    without explicit string conversion. #​929 (@​dislogical)
  • Add prebuilt cargo-insta binaries for ARM64 Linux
    (aarch64-unknown-linux-gnu). #​942 (@​aljohri)
  • Fix JSON serialization of maps keyed by unit enum variants. Keys use the
    serialized variant name, including serde renames. #​934 (@​teddytennant)
  • Remove trailing semicolons from serialization macro bodies to avoid
    compiler warnings when used in expression position. #​940 (@​Tiwalun)
  • Mention INSTA_UPDATE=always in snapshot mismatch hints for file
    snapshots. #​927 (@​hiro-nikaitou)
  • Update the lockfile's tempfile and rustix dependencies to fix builds
    with newer Rust toolchains. #​939
  • Fix cargo insta test --all-targets --test-runner nextest failing with
    "Can't mix --doc with other target selecting options". Like cargo test --all-targets, it no longer runs doctests. #​460

v1.48.0

Compare Source

  • Add strip_ansi_escape_codes setting which removes ANSI escape sequences
    (color codes, cursor movement, etc.) from snapshot content before comparison.
    Requires the filters feature. #​899 (@​pierluigilenoci)
  • Add opt-in support for YAML literal blocks for multiline strings in snapshot
    metadata fields such as description and expression. Set
    INSTA_YAML_BLOCK_STYLE=1 to enable. #​851 (@​ivov)
  • Setting CI=true normally makes cargo insta test behave as though --check
    was passed. Explicit snapshot handling options such as --accept now take
    precedence over this environment variable, allowing users to override this
    behavior if they want to. #​924
  • Fix cargo insta test --profile being forwarded to nextest as the nextest
    profile instead of the cargo build profile; it now translates to
    --cargo-profile for the nextest runner. Add --nextest-profile to select
    the nextest profile. #​910
  • Fix cargo insta pending-snapshots printing unusable \\?\-prefixed paths
    on Windows. The --snapshot filter now also accepts partial paths: any
    trailing path suffix of the snapshot file matches, so a bare
    --snapshot my_test.snap works. #​904
  • Accepting a binary snapshot no longer fails with os error 2 when its data
    file is missing (e.g. gitignored and not committed). #​914

v1.47.2

Compare Source

  • Restore Send + Sync on Settings, Redactions, and Redaction by
    reverting the Arc to Rc change from 1.47.0, which was semver-breaking.
    #​873 #​874
  • Add Send + Sync bounds to Comparator trait for consistency with
    Arc-based storage. #​872
  • Add compile-time assertion to prevent future auto-trait regressions.

v1.47.1

Compare Source

  • Revert sorting of sequences in sort_maps. The change in 1.47.0 sorted all
    Seq values (including Vec), not just non-deterministic collections like
    HashSet, which was a breaking change. #​876

v1.47.0

Compare Source

  • Add Comparator trait for customizing how snapshot values are compared. #​872 (@​dstu)
  • Sort sequences in sort_maps to fix non-deterministic HashSet snapshots. #​876
  • Improve TOML serialization error message for unsupported types, suggesting assert_json_snapshot! or assert_yaml_snapshot! as alternatives. #​880
  • Remove unnecessary Send + Sync bounds from Redaction, allowing non-Send closures in dynamic redactions. #​874
  • Don't use Arc in Settings unnecessarily. #​873 (@​dstu)
  • Upgrade console to 0.16 and MSRV to 1.66. #​885
  • Upgrade toml-edit to 0.25. #​882 (@​alexanderkjall)
jestjs/jest (jest)

v30.5.2

Compare Source

Features
  • [@jest/transform] Strip TypeScript types with Node when no transformer claims a .ts, .mts or .cts file (#​16421)
Fixes
  • [jest-core, jest-haste-map, jest-transform] Keep require('../package.json') external when bundling, so jest --version and the transform and haste-map cache keys report the released version instead of the previous one (#​16422)
  • [jest-each] Escape a table row's keys before building the $variable interpolation RegExp, so a column name such as count(*) no longer fails the whole table with Invalid regular expression, and a . or | in a column name is matched literally (#​16345)
  • [@jest/source-map] Resolve absolute Windows paths in a source map's sources and sourceRoot again, instead of appending them to the transformed file's directory (#​16439)

v30.5.1

Compare Source

Fixes
  • [jest-config] Don't warn about global-only options in the config that supplies the global config - the root config a project resolves to, or the first entry of --projects when no root config is passed (#​16411)
  • [jest-config, jest-types] Stop accepting reporters, coverageReporters, workerIdleMemoryLimit, cwd and runnerOptions in a project config - they were silently ignored, and now warn like the other global-only options (#​16411)
  • [jest-config, jest-validate] Warn about maxWorkers and coverageThreshold in a project config instead of dropping them without a word (#​16411)
  • [jest-resolve] Match moduleNameMapper patterns against the specifier as written again (reverting #​16390) (#​16417)
  • [jest-runtime] Resolve package imports specifiers like #dep under ESM again (#​16413)
Chore & Maintenance
  • [jest-util] Name the testEnvironmentOptions.globalsCleanup option and link the docs from the JEST-01 deprecation warning, and document the option's modes (#​16404)

v30.5.0

Compare Source

Features
  • [@jest/expect-utils, jest-mock] Add mockFn.whenCalledWith(...args) for configuring return values per argument list, with first-class asymmetric-matcher support (#​16053)
  • [@jest/expect-utils] Export AsymmetricMatcher and FunctionParameters types (previously private to expect) (#​16053)
  • [jest-circus, jest-core, jest-jasmine2, jest-test-result, jest-types] --collectTests now expands test.each/describe.each cases and reports per-status counts (skipped/todo via the new wouldRun flag for selected tests) plus a summary line that match a real run, including under --testNamePattern and .only/fdescribe focus on both the circus and jasmine2 runners (#​16259)
  • [jest-circus, jest-environment, jest-runtime, jest-types] Add describe-level retries via jest.retryTimes(..., {entireDescribe: true}) (#​16322)
  • [jest-circus, jest-message-util, jest-reporters, jest-types] Add retryMessages to AssertionResult and export formatErrorStack, so the retry log renders nested cause and AggregateError sections with code frames instead of serialized [cause]:/[errors]: markers (#​16316)
  • [jest-circus, jest-types] Add unhandledErrorsDetailed to Circus.RunResult, so an unhandled rejection reports its cause chain and AggregateError entries with code frames instead of a pre-serialized stack (#​16316)
  • [jest-haste-map] Replace NodeWatcher and FSEventsWatcher with @parcel/watcher for the non-watchman watch path (#​16188)
  • [jest-resolve] Bump unrs-resolver to 1.12.1, remove jest-pnp-resolver and unnecessary checks (#​15721)
  • [jest-resolve] Honor Node's --preserve-symlinks / NODE_PRESERVE_SYMLINKS in the default resolver by passing symlinks: false to unrs-resolver (#​16260)
  • [jest-runtime] Apply automocking and manual __mocks__ files to synchronously evaluable ESM graphs on Node 24.9+ - static imports, dynamic import() and require() of an ESM file now generate an automock from the real module's namespace instead of failing with "Attempting to import a mock without a factory". Graphs that need async evaluation (top-level await) or an async-only resolver or transformer still throw (#​16391)
  • [jest-runtime] Route process.getBuiltinModule through the sandbox, so it returns the sandbox process and the hooked node:module instead of the host's (#​16391)
  • [jest-runtime] Throw an actionable error from module.register() and module.registerHooks() inside a test - the hooks attached to the loader running Jest itself, never saw the sandboxed requires they were meant for, and stayed registered for every later test file in the worker (#​16391)
  • [jest-runtime] Surface resolution and import-attribute errors in an ESM graph before executing any of its CJS dependencies on Node 24.9+, matching Node's run-nothing-on-a-broken-graph behavior; the legacy loader on older versions keeps its linking-time execution order (#​16391)
  • [jest-runtime] Throw ERR_SOURCE_PHASE_NOT_DEFINED with an actionable message for import source and import.source(), instead of failing at instantiation with V8's bare "Source phase import object is not defined" (#​16391)
  • [jest-runtime] Emit the JSON-without-import-attribute deprecation warning once per test file instead of once per worker, so it is no longer silently swallowed for every file after the first (#​16391)
  • [jest-runtime] Set import.meta.main to true in the test file and false in every module it loads, matching Node 24+ (#​16367)
  • [jest-runtime] Resolve the module-sync export condition, so a package that exposes its ESM entry point for require() loads the same file Node would (#​16336)
  • [jest-snapshot] Add external snapshot paths to custom reporter failure details (#​16374)
Fixes
  • [jest-console, jest-reporters] CustomConsole now buffers console output so TestResult.console is populated for reporters when verbose is enabled, while GitHubActionsReporter avoids replaying buffered output in verbose mode (#​16155)
  • [expect, jest-message-util, jest-pattern, jest-regex-util, jest-util] Revert node: protocol imports to restore webpack/browser-bundle compatibility (#​16167)
  • [expect] Widen toMatchObject and objectContaining parameter type from Record<string, unknown> to object so class instances are accepted (#​16196)
  • [jest-circus] Call a generator test body with the shared test context, so this matches what a regular test function receives (#​16347)
  • [jest-circus] Capture the error listeners of the parent process instead of the in-sandbox process, so listeners registered before the test file survive teardown and sandbox listeners no longer leak onto the parent (#​16347)
  • [jest-circus] Clear currentlyRunningTest after skipped and todo tests (#​16342)
  • [jest-circus] Prevent late done() callbacks from affecting later test or hook invocations (#​16343)
  • [jest-circus, jest-jasmine2] Honor --expand when formatting node:assert failures, instead of always collapsing the diff (#​16347)
  • [jest-circus, jest-jasmine2, jest-message-util] Serialize the inner errors of an AggregateError into failureMessages, retryReasons and unhandledErrors, so --json output and reporter annotations include them (#​16316)
  • [jest-circus, jest-snapshot] Keep snapshot state and counts correct when a test retries (#​16344)
  • [@jest/create-cache-key-function] Include the caller support flags in the generated key, so a transformer that emits ESM or CJS based on them no longer shares one cache entry between the two (#​16331)
  • [@jest/create-cache-key-function] Include the stringified project config in the generated key, so editing a transformer's own settings invalidates what it cached (#​16331)
  • [@jest/transform] Include the caller support flags in a transform's cache key, so a file transformed both as ESM and as CJS no longer serves one shape's output for the other (#​16331)
  • [jest-config] Add missing findRelatedTests, outputFile, and replname entries to ValidConfig so they no longer trigger spurious "Unknown option" warnings (#​16224)
  • [jest-config] Use --config for the global config when multiple --projects are specified (#​16273)
  • [jest-core] Serialize bigint values in --json and --outputFile output as their literal form (4n), instead of failing the run with TypeError: Do not know how to serialize a BigInt (#​16338)
  • [jest-core] Do not report a CustomGC async resource (used by N-API addons such as napi-rs for per-isolate GC bookkeeping) as an open handle, since it is napi_unref'd by the addon and can never keep the event loop alive (#​16379)
  • [jest-each] Keep a $&, $`, $' or $$ inside a %p param value out of the replacement, so the title shows the value instead of the text around it (#​16338)
  • [jest-each] Interpolate a bigint into a %j title as its literal form ("4n") at any depth, instead of throwing TypeError: Do not know how to serialize a BigInt while collecting the tests (#​16338)
  • [jest-environment, jest-runtime] Bind sandboxInjectedGlobals to the right values when injectGlobals is false, instead of shifting every one of them by a position (#​16377)
  • [jest-environment-node, jest-util] Only warn about a conflicting globalsCleanup mode when one was explicitly configured, and follow the mode that is actually in effect (#​16323)
  • [jest-environment-node, jest-util] Stop resolving lazy globals when setting up an environment, so Node 26's builtin module globals are no longer loaded (and no longer emit their deprecation warnings) for every test file (#​16324)
  • [jest-haste-map] Keep watch mode alive when an outside process briefly makes a file unreadable on Windows, instead of tearing the watcher down on EPERM (#​16295)
  • [jest-haste-map] Keep indexing when an outside process holds a file open on Windows, instead of failing the whole crawl on EPERM (#​16358)
  • [jest-haste-map] Keep a duplicated manual mock resolving when the file it pointed at is deleted in watch mode (#​16360)
  • [jest-haste-map] Shut the worker farm down when a duplicate manual mock aborts the build under throwOnModuleCollision (#​16354)
  • [jest-haste-map] Attach the watchman client's error listener before the first command, so a watchman failure falls back to the node crawler instead of crashing on an unhandled error event, and always end the client (#​16355)
  • [jest-haste-map] Stop delivering watch events after WatchmanWatcher is closed, and route its warnings through the configured console (#​16355)
  • [jest-haste-map] Restore the nested duplicates index correctly in ModuleMap.fromJSON, so a haste collision reported inside a test worker raises DuplicateHasteCandidatesError instead of a TypeError (#​16353)
  • [jest-haste-map] Match watched files on a full extension, so moduleFileExtensions: ['js'] no longer accepts foo.mjs (#​16352)
  • [jest-haste-map] Delimit the fields that make up the haste map cache key, so two different option sets cannot hash to the same cache file (#​16352)
  • [jest-message-util] Print the inner errors of an AggregateError thrown inside a test (#​16316)
  • [jest-message-util] Indent nested cause and AggregateError sections of a test failure by one level per depth, so the nesting is legible instead of rendering flat (#​16316)
  • [jest-message-util] Color stack traces line by line so blank lines stay blank (#​16316)
  • [jest-message-util] Detect Jest's own frames without assuming the checkout directory's name, and cover @jest/* packages, so stack traces and code frames point at user code (#​16326)
  • [jest-mock] mockResolvedValue / mockRejectedValue now see all overload return types, so a Promise-returning overload survives even when a later overload returns a non-Promise (e.g. pg.Client['end']) (#​16237)
  • [@jest-environment/jsdom-abstract] Make @types/jsdom a peer dependency (#​16166)
  • [jest-mock] Remove the leftover own accessor descriptor when restoring a spyOn of an inherited getter or setter, so the instance keeps reflecting the prototype (#​16226)
  • [jest-resolve] Include extensionsToTreatAsEsm in the shouldLoadAsEsm cache key, so projects with different extension lists don't read each other's answers (#​16369)
  • [jest-resolve] Make getModuleIDAsync build and cache data: URI module IDs the same way as getModuleID (#​16370)
  • [jest-resolve] Keep the node: prefix when resolving a core module asynchronously, so a builtin that only exists prefixed (node:sea, node:sqlite, node:test, node:test/reporters) resolves instead of failing as a missing bare package (#​16388)
  • [jest-resolve] Look up manual mocks for node: protocol specifiers under the unprefixed name they are stored as (#​16388)
  • [jest-resolve] Apply moduleNameMapper consistently to both spellings of core module specifiers (fs vs node:fs) (#​16390)
  • [jest-resolve] Keep virtual and ordinary mock module IDs isolated across test files (#​16296)
  • [jest-resolve] Guard missing require.resolve.paths (#​16052)
  • [jest-resolve, jest-config, jest-runner] Support a user resolver written as an ES module (#​16332)
  • [jest-resolve, jest-runtime] Throw the CJS parse error for ESM syntax in a "type": "commonjs" package or a .cjs file instead of loading it as ESM, matching Node (#​16368)
  • [@jest/source-map] Keep source map sources that name a scheme, such as webpack:///, instead of resolving them into a path that does not exist (#​16327)
  • [@jest/source-map] Look up --testLocationInResults positions at the right column, and keep a mapping to the first column instead of discarding it (#​16327)
  • [@jest/source-map] Warn when a source map cannot be parsed, instead of silently leaving its frames untranslated (#​16327)
  • [jest-runner, @jest/source-map] Keep a source-mapped stack for an error thrown after the test environment was torn down (#​16327)
  • [jest-runtime, @jest/source-map] Keep source maps past teardown and past the next test file's install, so a stack from a file no earlier stack mentioned still points at the original source (#​16330)
  • [jest-runtime] Report that no coverage was collected when getAllV8CoverageInfoCopy is called after teardown, instead of returning an empty result (#​16385)
  • [jest-runtime] Cache a CJS module's parsed exports before walking its re-exports, so two modules that re-export each other no longer overflow the stack when imported from ESM (#​16363)
  • [jest-runtime] Keep a re-exported ES module's parse failure from marking the re-exporting CommonJS file as ESM, so module.exports = require('./dep.mjs') loads instead of failing with module is not defined (#​16363)
  • [jest-runtime] Scope module mocks instantiated inside jest.isolateModules/isolateModulesAsync to that block, so a mock first imported there no longer outlives it - matching how CommonJS mocks already behave (#​16365)
  • [jest-runtime] Suspend module isolation while generating an automock, so loading the real module to read its shape no longer populates the isolated registry (#​16365)
  • [jest-runtime] Check a cached ES module's status before require() returns it, so a module whose evaluation threw rethrows that error and one left linked by a failed sibling is evaluated instead of returning uninitialized bindings (#​16364)
  • [jest-runtime] Report the original ERR_REQUIRE_ASYNC_MODULE when a require() of a top-level-await graph is retried, instead of a spurious "concurrent import()" error (#​16364)
  • [jest-runtime] Throw the evaluation error when another caller's import() of the same module failed while we awaited it, instead of resolving with the errored module (#​16364)
  • [jest-runtime] Mark the result of require()ing an ES module that has a default export with __esModule: true through a live-binding facade, and serve the same object from require.cache, matching Node (#​16367)
  • [jest-runtime] Provide a CommonJS module's exports under the 'module.exports' named export when imported from ESM, matching Node 23+ (#​16367)
  • [jest-runtime] Give the test file itself a non-null require.main (#​16367)
  • [jest-runtime] Populate module.children with the modules a file loads, matching Node (#​16368)
  • [jest-runtime] Provide import.meta.resolve and import.meta.jest in data: URI modules, accept any-case mediatype parameters, and use Node's error codes for invalid data: URIs (#​16368)
  • [jest-runtime] Key ES modules by full URL, so query and fragment suffixes create the same module instances as Node and show up in import.meta.url (#​16375)
  • [jest-runtime] Share modules between overlapping graphs when a CommonJS module require()s an ES module mid-load, instead of evaluating shared dependencies twice (#​16375)
  • [jest-runtime] Throw ERR_REQUIRE_CYCLE_MODULE like Node when a CommonJS module require()s an ES module that is still being loaded, instead of evaluating the module a second time (#​16366)
  • [jest-runtime] Key builtin modules in the ESM registry by one canonical specifier (#​16341)
  • [jest-runtime] import.meta.resolve() for a builtin uses its node: specifier (#​16341)
  • [jest-runtime] Fall back to native ESM when a .js file contains ESM syntax but has no "type":"module" marker (#​16152)
  • [jest-runtime] Allow require() of ESM-marked files on Node < 24.9 via transform fallback (#​16244)
  • [jest-runtime, @jest/transform] Surface actionable ERR_REQUIRE_ESM error for files with untransformed ESM syntax instead of the generic "unexpected token" message (#​16244)
  • [jest-runtime] Support older test environments whose moduleMocker does not implement clearMocksOnScope (#​16169)
  • [jest-runtime] Apply jest.unstable_mockModule when the mocked file itself is require()d, not only when it is imported as a dependency (#​16389)
  • [jest-runtime] Apply jest.unstable_mockModule to statically imported data: URIs on Node 24.9+, matching dynamic import() (#​16389)
  • [jest-runtime] Run an async jest.unstable_mockModule factory once per module instead of twice, and fail the import instead of crashing the worker when the factory rejects (#​16389)
  • [jest-runtime] Hide a require(esm) module that failed to evaluate from require.cache, as Node does, instead of exposing a namespace with uninitialized bindings (#​16389)
  • [jest-runtime] Strip the byte-order mark when importing a JSON module, matching require() and Node (#​16389)
  • [jest-runtime] Throw ERR_REQUIRE_ASYNC_MODULE when require(esm) runs under an async-only custom resolver, instead of silently resolving with the default resolver (#​16389)
  • [jest-runtime] Parse imported JSON modules with the test realm's JSON, so their objects pass instanceof Object inside the test like require()d JSON does (#​16389)
  • [jest-runtime] Accept every file: URL string in the sandboxed module.createRequire, including one with a localhost authority, as Node does (#​16389)
  • [jest-runtime] Point at {virtual: true} when jest.mock or jest.unstable_mockModule is given a module that cannot be resolved (#​16389)
  • [jest-reporters] Fix coverage report table formatting in CI/GitHub Actions environments where process.stdout.columns is undefined by falling back to the COLUMNS env var or 80 columns in CI, preserving existing behaviour in other non-TTY environments (#​16227)
  • [jest-runtime] Support CJS-in-ESM exports via "module.exports" named exports (#​16277)
  • [jest-snapshot] Keep a skipped or failed test's hinted snapshots, instead of reporting them obsolete (#​16348)
  • [jest-util] Stop globsToMatcher reusing a cached matcher compiled with different picomatch options, and keep its dot: true default when dot is passed as undefined (#​16381)
  • [pretty-format] Move the react-is aliases into the @jest scope, so they cannot be shadowed by unrelated packages published under the alias names (#​16333)
Chore & Maintenance
  • [docs] Document the intentional divergences from Node's module system in the ECMAScript Modules page (#​16368)
  • [docs] Note deprecation of react-test-renderer in React Native tutorial and pretty-format README (#​16294)
  • [docs] Use @testing-library/react-native in the React Native tutorial instead of the deprecated react-test-renderer (#​16318)
  • [babel-jest, @jest/transform] Update babel-plugin-istanbul to v8 (#​16049)
  • [jest-config, @jest/reporters, jest-runtime] Update glob to v13 (#​16397)
  • [jest-haste-map] Refactor massive class into multiple files (#​16180)
  • [jest-haste-map] Drop walker dependency; replace hand-rolled directory recursion in the JS crawler and watcher startup with fdir (#​16187)
  • [jest-haste-map] Reuse cached metadata for files whose haste name is a known duplicate, instead of re-reading and re-parsing them on every startup (#​16351)
  • [jest-haste-map] Cache the watchman socket path and replace the watchman --version probe with get-sockname, so warm runs spawn no watchman processes (#​16386)
  • [jest-resolve] Store the per-directory package-type lookup in the cache it reads, so it actually memoizes (#​16369)
  • [jest-resolve, jest-runtime] Cut repeated work on the resolution hot path: hoist the platform-extension list to construction, memoize isCoreModule and the options cache-key serialization, skip mapper preparation when no moduleNameMapper is configured, run each mapper regex once, and stop re-parsing NODE_OPTIONS on every default-resolver call (#​16371)
  • [jest-resolve] Cut warm resolution cost to about a third: reuse one unrs-resolver factory per options shape instead of cloning per resolution, compose the factory cache key from per-array cached strings instead of serializing options, and stop constructing an Error for misses that findNodeModule swallows; add a __benchmarks__ suite for the default resolver (#​16373)
  • [jest-runner, @jest/source-map] Replace source-map-support with an implementation in @jest/source-map (#​16327)
  • [jest-snapshot] Load babel, semver and synckit lazily, so requiring the package (which every test process does through @jest/expect) no longer loads ~200 modules that only writing inline snapshots needs (#​16387)
  • [jest-runtime] Reduce per-require overhead: skip module ID resolution when no mock can apply, answer core modules before probing for a manual mock, share one require.cache proxy across modules, and cache empty files (#​16376)
  • [@jest/source-map] Deprecate getCallsite in favour of SourceMapSupport#getCallsite (#​16327)
  • [jest-runtime] Avoid magical null value in ESM loader (#​16160)

v30.4.2

Compare Source

Fixes
  • [jest-runtime] Fix named imports from CJS modules whose module.exports is a function with own-property exports (#​16150)

v30.4.1

Compare Source

Features
  • [jest-config, jest-core, jest-runner, jest-schemas, jest-types] Allow custom runner configuration options via tuple format ['runner-path', {options}] (#​16141)
Fixes
  • [jest-runtime] Align CJS-from-ESM default export with Node: module.exports is always the ESM default, __esModule unwrapping is no longer applied (#​16143)

v30.4.0

Compare Source

Features
  • [babel-jest] Support collecting coverage from .mts, .cts (and other) files (#​15994)
  • [jest-circus, jest-cli, jest-config, jest-core, jest-jasmine2, jest-types] Add --collect-tests flag to discover and list tests without executing them (#​16006)
  • [jest-config, jest-runner, jest-worker] Add workerGracefulExitTimeout config option to control how long workers are given to exit before being force-killed (#​15984)
  • [jest-config] Add support for jest.config.mts as a valid configuration file (#​16005)
  • [jest-config, jest-core, jest-reporters, jest-runner] verbose and silent can now be set per-project; the project-level value overrides the global value for that project's tests (#​16133)
  • [@jest/fake-timers] Accept Temporal.Duration in jest.advanceTimersByTime() and jest.advanceTimersByTimeAsync() (#​16128)
  • [@jest/fake-timers] Accept Temporal.Instant and Temporal.ZonedDateTime in jest.setSystemTime() and useFakeTimers({now}) (#​16128)
  • [@jest/fake-timers] Support faking Temporal.Now.* (#​16131)
  • [jest-mock] Add clearMocksOnScope(scope) on ModuleMocker for clearing every mock function exposed on a scope object (#​16088)
  • [jest-resolve] Add canResolveSync() on Resolver so callers can detect when a user-configured resolver only exports an async hook (#​16064)
  • [jest-runtime] Use synchronous evaluate() for ES modules without top-level await on Node versions that support it (v24.9+), and prefer the synchronous transform path when a sync transformer is configured (#​16062)
  • [jest-runtime] Support require() of ES modules on Node v24.9+ (#​16074)
  • [jest-runtime] Validate TC39 import attributes (with { type: 'json' }) on ESM imports (#​16127)
  • [@jest/transform] Add canTransformSync(filename) on ScriptTransformer so callers can pick the sync vs async transform path (#​16062)
  • [jest-util] Add isError helper (#​16076)
  • [pretty-format] Support React 19 (#​16123)
Fixes
  • [expect-utils] Fix toStrictEqual failing on structuredClone results due to cross-realm constructor mismatch (#​15959)
  • [@jest/expect-utils] Prevent toMatchObject/subset matching from throwing when encountering exotic iterables (#​15952)
  • [fake-timers] Convert Date to milliseconds before passing to @sinonjs/fake-timers (#​16029)
  • [jest] Export GlobalConfig and ProjectConfig TypeScript types (#​16132)
  • [jest-circus] Prevent crash when asyncError is undefined for non-Error throws (#​16003)
  • [jest-circus, jest-jasmine2] Include Error.cause in JSON failureMessages output (#​15967)
  • [jest-config] Fix preset path resolution on Windows when the preset uses subpath exports (#​15961)
  • [jest-config] Allow collectCoverage and coverageProvider in project config without a validation warning (#​16132)
  • [jest-config] Project config validator now emits "is not supported in an individual project configuration" instead of "probably a typing mistake" for known global-only options (#​16132)
  • [jest-environment-node] Fix --localstorage-file warning on Node 25+ (#​16086)
  • [jest-reporters] Apply global coverage threshold to unmatched pattern files in addition to glob/path thresholds (#​16137)
  • [jest-reporters, jest-runner, jest-runtime, jest-transform] Fix coverage report not showing correct code coverage when using projects config option (#​16140)
  • [jest-runtime] Resolve expect and @jest/expect from the internal module registry so test-file imports share the same JestAssertionError as the global expect (#​16130)
  • [jest-runtime] Improve CJS-from-ESM interop: __esModule/Babel default unwrap, broader named-export coverage, and shared CJS singleton across importers (#​16050)
  • [jest-runtime] Load .js files with ESM syntax but no "type":"module" marker as native ESM (#​16050)
  • [jest-runtime] Extend the .js-with-ESM-syntax fallback to require() on Node v24.9+ - falls back to require(esm) when the CJS parser rejects ESM syntax (#​16078)
  • [jest-runtime] Fix deadlocks and double-evaluation in concurrent ESM and wasm imports (#​16050)
  • [jest-runtime] Fix error when require() is called after the Jest environment has been torn down (#​15951)
  • [jest-runtime] Fix missing error when import() is called after the Jest environment has been torn down (#​16080)
  • [jest-runtime] Fix virtual unstable_mockModule registrations not respected in ESM (#​16081)
  • [jest-runtime] Apply moduleNameMapper when resolving modules with require.resolve() and the paths option (#​16135)
Chore & Maintenance
  • [@jest/fake-timers] Upgrade @sinonjs/fake-timers (#​16139)
  • [jest-runtime] Use synchronous linkRequests / instantiate for ESM linking on Node v24.9+ (#​16063)
prettier/prettier (prettier)

v3.9.10

Compare Source

diff

Markdown: Update micromark-extension-gfm-table to fix the table parse issue on performance (#​20266 by @​fisker)

See micromark/micromark-extension-gfm-table@4f43ead for details.

v3.9.9

Compare Source

diff

Markdown: Fix text with $ been incorrectly parsed as math syntax (#​20140 by @​fisker)
<!-- Input -->
**Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR` from `c.sh`, before anything else runs here.

<!-- Prettier 3.9.8 -->
**Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR`from`c.sh`, before anything else runs here.

<!-- Prettier 3.9.9 -->
**Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR` from `c.sh`, before anything else runs here.

v3.9.8

Compare Source

diff

Markdown: Don't let Liquid objects interrupt paragraphs (#​20087 by @​seiyab)
<!-- Input -->
If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a
{{jsxref("TypeError")}} is thrown.

<!-- Prettier 3.9.7 -->
If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a

{{jsxref("TypeError")}} is thrown.

<!-- Prettier 3.9.8 -->
If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a
{{jsxref("TypeError")}} is thrown.

v3.9.7

Compare Source

diff

Markdown: Prevent indentation drift in list-item code blocks (#​19647, #​19990 by @​Austin1serb, @​giaBaoJS)
<!-- Input -->
- [x] short first line.

      second paragraph at six spaces that wraps
      onto another line here.

<!-- Prettier 3.9.6 -->
- [x] short first line.

      second paragraph at six spaces that wraps
          onto another line here.

<!-- Prettier 3.9.7 -->
- [x] short first line.

      second paragraph at six spaces that wraps
      onto another line here.
JavaScript: Fix embedded template literal idempotency (#​19725 by @​fisker)
// Input
const foo = html`
            <div>${getText({
            value,
            })}</div>
`;

// Prettier 3.9.6 (first format)
const foo = html`
  <div>
    ${getText({
              value,
            })}
  </div>
`;

// Prettier 3.9.6 (second format)
const foo = html`
  <div>
    ${getText({
      value,
    })}
  </div>
`;

// Prettier 3.9.7
const foo = html`
  <div>
    ${getText({
      value,
    })}
  </div>
`;
Markdown: Preserve Liquid blocks after Markdown tables (#​19730 by @​wanxiankai, @​seiyab)
<!-- Input -->
| Argument | Type |
| -------- | ---- |
{% set default_params = {
    "model": ["str"],
} %}

<!-- Prettier 3.9.6 -->
| Argument                  | Type |
| ------------------------- | ---- |
| {% set default_params = { |

    "model": ["str"],

} %}

<!-- Prettier 3.9.7 -->
| Argument | Type |
| -------- | ---- |
{% set default_params = {
    "model": ["str"],
} %}
Markdown: Preserve single tildes in Markdown (#​19739 by @​lazerg)

Since 3.9.0, single-tilde spans like H~2~O were rewritten to double tildes, turning subscript syntax into strike-through. Only double tildes are treated that way now, matching GitHub.

<!-- Input -->
H~2~O

<!-- Prettier 3.9.6 -->
H~~2~~O

<!-- Prettier 3.9.7 -->
H~2~O
Markdown: Fix Markdown blockquote containing > characters (#​19802 by @​seiyab)
<!-- Input -->
> **test**\>

<!-- Prettier 3.9.6 -->
> **test**>\>

<!-- Prettier 3.9.7 -->
> **test**\>
Markdown: Strip blockquote markers from a setext heading's continuation lines (#​19878 by @​Kjubikstronk)

A setext heading spanning multiple lines inside a blockquote kept the > marker of its continuation lines as literal text.

<!-- Input -->
> Multi
> Line
> ===

<!-- Prettier 3.9.6 -->
> Multi > Line
> ===

<!-- Prettier 3.9.7 -->
> Multi
> Line
> ===
Markdown: Fix HTML block indentation drift in markdown list items (#​19987 by @​lazerg)
<!-- Input -->
1. Enable images:

    <p align="center">
      <img alt="example">
    </p>

<!-- Prettier 3.9.6 (--tab-width=4) -->
1. Enable images:

     <p align="center">
       <img alt="example">
     </p>

<!-- Prettier 3.9.7 (--tab-width=4) -->
1. Enable images:

    <p align="center">
      <img alt="example">
    </p>
Angular: Support @boundary error boundaries (#​20014 by @​Yahiro025)
<!-- Input -->
@boundary {
<complex-chart [data]="data"/>
}
@error (let err) {
<p>{{err.message}}</p>
}

<!-- Prettier 3.9.6 -->
SyntaxError: Unexpected character "EOF" (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.) (6:1)

<!-- Prettier 3.9.7 -->
@boundary {
  <complex-chart [data]="data" />
} @error (let err) {
  <p>{{ err.message }}</p>
}

v3.9.6

Compare Source

diff

TypeScript: Preserve quotes for methods named new (#​19621 by @​kovsu)
// Input
interface Container {
  "new"(id: string): number;
}

// Prettier 3.9.5
interface Container {
  new(id: string): number;
}

// Prettier 3.9.6
interface Container {
  "new"(id: string): number;
}
TypeScript: Support import defer (#​19624, #​19675 by @​fisker)
// Input
import defer * as foo from "foo";

// Prettier 3.9.5
import * as foo from "foo";

// Prettier 3.9.6
import defer * as foo from "foo";
JavaScript: Added a new official plugin @prettier/plugin-yuku (#​19628, #​19629 by @​fisker)

@prettier/plugin-yuku is powered by Yuku (A high-performance JavaScript/TypeScript compiler toolchain written in Zig).

This plugin includes two new parsers: yuku (JavaScript syntax) and yuku-ts (TypeScript syntax).

To use this plugin:

  1. Install the plugin:

    yarn add --dev prettier @prettier/plugin-yuku
    
  2. Add it to your .prettierrc:

    plugins:
      - "@prettier/plugin-yuku"
    

Due to package size limitations, this plugin is not bundled with the main prettier package and must be installed separately.

For more information, check the package homepage.

Big thanks to @​arshad-yaseen for his excellent work.

v3.9.5

Compare Source

diff

Markdown: Cap ordered list mark at 999,999,999 (#​19351 by @​tats-u)

CommonMark parsers only support ordered list item numbers up to 999,999,999.

With this change, Prettier now caps the ordered list item number at 999,999,999 to ensure that the output is correctly parsed as an ordered list by CommonMark parsers. Numbers larger than 999,999,999 are not parsed as list item numbers and are left unchanged in the output:

<!-- Input -->
999999998. text
999999998. text
999999998. text
999999998. text

1234567890123456789012) text

<!-- Prettier 3.9.4 -->
999999998. text
999999999. text
1000000000. text
1000000001. text

1234567890123456789012) text

<!-- Prettier 3.9.5 -->
999999998. text
999999999. text
999999999. text
999999999. text

1234567890123456789012) text

Do not remove <> from an inline link or image with an empty URL and a title, as this removal would change its interpretation.

<!-- Input -->
[link](<> "title")

<!-- Prettier 3.9.4 -->
[link]( "title")

<!-- Prettier 3.9.5 -->
[link](<> "title")
Less: Remove extra spaces after [ in map lookups (#​19503 by @​kovsu)
// Input
.foo {
  color: #theme[ primary];
  color: #theme[@name];
  color: #theme[@@name];
}

// Prettier 3.9.4
.foo {
  color: #theme[ primary];
  color: #theme[ @name];
  color: #theme[ @@name];
}

// Prettier 3.9.5
.foo {
  color: #theme[primary];
  color: #theme[@name];
  color: #theme[@@name];
}
CSS: Prevent addition space in type() with + (#​19516 by @​bigandy)

This fixes the addition space before + in CSS type() declaration. For example type(<number>+) was being converted into type(<number> +) which is invalid CSS and does not work.

/* Input */
div {
  border-radius: attr(br type(<length>+));
}

/* Prettier 3.9.4 */
div {
  border-radius: attr(br type(<length> +));
}

/* Prettier 3.9.5 */
div {
  border-radius: attr(br type(<length>+));
}
Less: Remove spaces between merge markers and colons (#​19517 by @​kovsu)
// Input
a {
  box-shadow  +  : 0 0 1px #&#8203;000;
}

// Prettier 3.9.4
a {
  box-shadow+  : 0 0 1px #&#8203;000;
}

// Prettier 3.9.5
a {
  box-shadow+: 0 0 1px #&#8203;000;
}
<!-- Input -->
[[Foo:Bar]]

<!-- Prettier 3.9.4 -->
[[Foo]]

<!-- Prettier 3.9.5 -->
[[Foo:Bar]]
TypeScript: Fix comments being dropped on shorthand type import/export specifiers (#​19565 by @​kirkwaiblinger)
// Input
export { type /* comment */ T } from "foo";
import { type /* comment */ T } from "foo";

// Prettier 3.9.4
Error: Comment "comment" was not printed. Please report this error!

// Prettier 3.9.5
export { type /* comment */ T } from "foo";
import { type /* comment */ T } from "foo";
Miscellaneous: Preserving comments' placement property (#​19567 by @​Janther)

Prettier@​3.9.0 deleted an undocumented property on comments, which was already used by plugins, comment.placement is now available again after comment attach.

Flow: Stop enforcing empty module declaration to break (#​19568 by @​fisker)
// Input
declare module "foo" {}

// Prettier 3.9.4
declare module "foo" {
}

// Prettier 3.9.5
declare module "foo" {}
Angular: Support expression for exhaustive typechecking (#​19571 by @​fisker)
<!-- Input -->
@switch (state.mode) {
  @default never(state);
}

<!-- Prettier 3.9.4 -->
@switch (state.mode) {
  @default never;
}

<!-- Prettier 3.9.5 -->
@switch (state.mode) {
  @default never(state);
}
TypeScript: Ignore comments inside mapped type when checking type parameter comments (#​19572 by @​fisker)
// Input
foo<{
  // comment
  [key in keyof Foo]: number
}>();

// Prettier 3.9.4
foo<
  {
    // comment
    [key in keyof Foo]: number;
  }
>();

// Prettier 3.9.5
foo<{
  // comment
  [key in keyof Foo]: number;
}>();
Less: Fix adjacent block comments being corrupted (#​19574 by @​kovsu)
// Input
/* a *//* b */
/* a */* {
  color: red;
}

// Prettier 3.9.4
/* a */
/* b */
/* a * {
  color: red;
}

// Prettier 3.9.5
/* a */ /* b */
/* a */
* {
  color: red;
}
JavaScript: Handle dangling comments in SwitchStatement (#​19581 by @​fisker)
// Input
switch (foo) {
 // comment
}

// Prettier 3.9.4
switch (
  foo
  // comment
) {
}

// Prettier 3.9.5
switch (foo) {
  // comment
}
TypeScript: Remove space in comment-only object type (#​19583 by @​fisker)
// Input
var foo = {
  /* comment */
};
type Foo = {
  /* comment */
};

// Prettier 3.9.4
var foo = {/* comment */};
type Foo = { /* comment */ };

// Prettier 3.9.5
var foo = {/* comment */};
type Foo = {/* comment */};

v3.9.4

Compare Source

diff

Angular: Format @content(name) -> @content (name) to align with other block syntax (#​19499 by @​fisker)
<!-- Input -->
<FancyButton [label]="title">
  @content (icon) {
    <span>Icon!</span>
  }
  @content (description) {
    <span>Description text</span>
  }
  <span>Other children</span>
</FancyButton>

<!-- Prettier 3.9.3 -->
<FancyButton [label]="title">
  @content(icon) {
    <span>Icon!</span>
  }
  @content(description) {
    <span>Description text</span>
  }
  <span>Other children</span>
</FancyButton>

<!-- Prettier 3.9.4 -->
<FancyButton [label]="title">
  @content (icon) {
    <span>Icon!</span>
  }
  @content (description) {
    <span>Description text</span>
  }
  <span>Other children</span>
</FancyButton>

v3.9.3

Compare Source

diff

Markdown: Fix unexpected removal of characters in liquid syntax (#​19489 by @​seiyab)
// Input
<!-- Input -->
{{ page.title
}} text

<!-- Prettier 3.9.1 -->
{{ page.title
 text

<!-- Prettier 3.9.3 -->
{{ page.title
}} text
TypeScript: Allow decorators to be used with declare on class fields (#​19492 by @​evoactivity)

Extensively used within the Ember ecosystem, decorators with declare on class fields will ignore the babel parser error and allow Prettier to format the code without breaking it.

// Input
export default class ProjectStatusComponent extends Component<ProjectStatusSig> {
  @service declare server: ServerService;
}

// Prettier 3.9.1
// SyntaxError: Decorators can't be used with a declare field. (2:3)
//  1 | export default class ProjectStatusComponent extends Component<ProjectStatusSig> {
//> 2 |   @service declare server: ServerService;
//    |   ^
//  3 | }

// Prettier 3.9.3
export default class ProjectStatusComponent extends Component<ProjectStatusSig> {
  @service declare server: ServerService;
}

v3.9.2

Compare Source

v3.9.1

Compare Source

diff

Markdown: Update micromark-extension-gfm-table to fix the table parse issue on performance (#​20266 by @​fisker)

See micromark/micromark-extension-gfm-table@4f43ead for details.

v3.9.0

Compare Source

diff

🔗 Release Notes

v3.8.5

Compare Source

diff

Flow: Support readonly as a variance annotation (#​19022 by @​marcoww6)

Flow now accepts readonly as a property variance annotation, equivalent to + (covariant/read-only).

// Input
type T = {
  readonly foo: string,
};

// Prettier 3.8.4
SyntaxError

// Prettier 3.8.5
type T = {
  readonly foo: string,
};

v3.8.4

Compare Source

diff

Markdown: Fix blank lines between list items and nested sub-lists being removed in Markdown/MDX (#​17746 by @​byplayer)

Prettier was removing blank lines between list items and their nested sub-lists, converting loose lists into tight lists and changing their semantic meaning.

<!-- Input -->
- a

  - b

- c

  - d

<!-- Prettier 3.8.3 -->
- a
  - b
- c
  - d

<!-- Prettier 3.8.4 -->
- a

  - b

- c

  - d

v3.8.3

Compare Source

diff

SCSS: Prevent trailing comma in if() function (#​18471 by @​kovsu)
// Input
$value: if(sass(false): 1; else: -1);

// Prettier 3.8.2
$value: if(
  sass(false): 1; else: -1,
);

// Prettier 3.8.3
$value: if(sass(false): 1; else: -1);

v3.8.2

Compare Source

diff

Angular: Support Angular v21.2 (#​18722, #​19034 by @​fisker)

Exhaustive typechecking with @default never;

<!-- Input -->
@switch (foo) {
  @case (1) {}
  @default never;
}

<!-- Prettier 3.8.1 -->
SyntaxError: Incomplete block "default never". If you meant to write the @ character, you should use the "&#&#8203;64;" HTML entity instead. (3:3)

<!-- Prettier 3.8.2 -->
@switch (foo) {
  @case (1) {}
  @default never;
}

arrow function and instanceof expressions.

<!-- Input -->
@let fn = (a) =>        a?    1:2;

{{ fn ( a         instanceof b)}}

<!-- Prettier 3.8.1 -->
@let fn = (a) =>        a?    1:2;

{{ fn ( a         instanceof b)}}

<!-- Prettier 3.8.2 -->
@let fn = (a) => (a ? 1 : 2);

{{ fn(a instanceof b) }}
pyo3/pyo3 (pyo3)

v0.30.1: PyO3 0.30.1

Compare Source

PyO3 0.30.1 is a re-release of PyO3 0.30.0 after investments in CI security unfortunately led to a failed crates.io publish. Rather than delete the failed tag, this new tag comes after the CI issues have (hopefully) been corrected.

Thanks to @​davidhewitt @​Tpt and @​viicos for the investigation and fixes.

v0.29.3

Compare Source

Packaging
Added
  • Add FFI definitions PyModule_GetState_DuringGC, PyModule_GetToken_DuringGC, PyObject_GetTypeData_DuringGC, PyType_GetModuleState_DuringGC, PyType_GetBaseByToken_DuringGC, PyType_GetModule_DuringGC, and PyType_GetModuleByToken_DuringGC for Python 3.15 and up. #​6419
Changed
  • Optimize u128/i128 conversions on Python 3.15+. #​6160
  • Preallocate output sets when extracting Python set and frozenset values into Rust hash sets. #​6225
  • Optimize PyBytes::as_bytes() when not using abi3 or abi3t. #​6377
Removed
  • Remove FFI definitions PyExc_RecursionErrorInst and Py_UseClassExceptionsFlag (not present in supported Python versions). #​6421
Fixed
  • Revert removal of FFI definition _PyFrameEvalFunction, _PyInterpreterState_GetEvalFrameFunc and _PyInterpreterState_SetEvalFrameFunc, which are not currently treated as CPython private API despite their name. #​6195
  • Fix FFI definition PyUnstable_Eval_RequestCodeExtraIndex FFI binding to link to the private CPython symbol on Python versions before 3.12. #​6195
  • Fix FFI definitions PyByteArray_GET_SIZE, PyList_GET_SIZE, and PySet_GET_SIZE to use an atomic load for free-threaded Python. #​6230
  • experimental-inspect: deduplicate repeated members of a type union in the generated stubs, and put a space on both sides of the | rather than only before it. #​6273
  • experimental-inspect: __next__ and __anext__ returning Option<T> (or PyResult<Option<T>>) are now introspected as returning T, since None stops the iteration instead of being yielded. #​6274
  • Fix clippy::clone_on_copy warnings triggered on nightly Rust by #[pyclass(from_py_object)] on classes which implement Copy. #​6309
  • experimental-inspect: __pow__, __rpow__ and __get__ now introspect their trailing argument as defaulting to None, matching the CPython slot wrappers which substitute None when it is omitted. #​6363
  • experimental-inspect: fix the stubs of a package nested inside another package being written into a directory named after its parent instead of its own name. #​6365
  • Fix many unresolved symbols when linking for PyPy due to incorrect link names in pyo3-ffi. #​6389
  • Fix empty tuple type hints being rendered as invalid tuple[] instead of tuple[()] in generated stubs and PyStaticExpr display. #​6393
  • experimental-inspect: escape stub docstrings to prevent invalid Python syntax. #​6394
  • experimental-inspect: fix the generated type annotation for PyBuffer on python <3.12 by using typing_extensions.Buffer instead of collections.abc.Buffer. #​6395
  • Fix string constants containing control characters rendering as invalid Python in Display for PyStaticExpr. #​6397
  • Fix crash when a detached thread is terminated while trying to reattach during interpreter finalization. #​6404
  • Fix link failures on 32-bit Windows when raw-dylib linking is disabled. #​6410
  • Fix DLL load failures on Windows with PyPy when raw-dylib linking is disabled. #​6410
  • Fix FFI definition PyVectorcall_Call failing to link on Python 3.11 and older. #​6410
  • Fix many unresolved data symbols when linking for PyPy due to incorrect link names in pyo3-ffi. #​6421
  • Fix linker errors on PyPy for outdated FFI definitions where PyPy moved from a function to a macro. #​6422
  • Fix crash when GC traverses a #[pyclass] type object during class attribute initialization. #​6453

v0.29.2

Compare Source

Packaging
  • Add PYO3_USE_RAW_DYLIB=0 opt-out of raw-dylib linking for Windows. #​6185
Fixed
  • Fix PyO3 0.29 regression with failure to link under Cygwin / MSYS2. #​6185
  • Fix stubs generation for field getters (#[pyo3(get)]) when IntoPyObject is only implemented on references of the field type. #​6276
  • Fix #[classmethod] magic methods receiving the instance instead of its type when invoked through a type slot. #​6283
  • Fix pyo3_build_config::add_libpython_rpath_link_args emitting Unix-style rpath linker arguments on Windows and Cygwin. #​6284
  • Fix PyO3 0.29.1 regression on PyPy causing crashes when deallocating #[pyclass] instances. #​6294
  • Fix missing trailing nul in Python 3.9 #[pyclass] docstrings. #​6296
  • Fix reference count leak of #[classattr] values created from fn items. #​6297

v0.29.1

Compare Source

Packaging
  • Add PYO3_USE_RAW_DYLIB=0 opt-out of raw-dylib linking for Windows. #​6185
Fixed
  • Fix PyO3 0.29 regression with failure to link under Cygwin / MSYS2. #​6185
  • Fix stubs generation for field getters (#[pyo3(get)]) when IntoPyObject is only implemented on references of the field type. #​6276
  • Fix #[classmethod] magic methods receiving the instance instead of its type when invoked through a type slot. #​6283
  • Fix pyo3_build_config::add_libpython_rpath_link_args emitting Unix-style rpath linker arguments on Windows and Cygwin. #​6284
  • Fix PyO3 0.29.1 regression on PyPy causing crashes when deallocating #[pyclass] instances. #​6294
  • Fix missing trailing nul in Python 3.9 #[pyclass] docstrings. #​6296
  • Fix reference count leak of #[classattr] values created from fn items. #​6297

v0.29.0

Compare Source

Packaging
  • Support the new PEP 803 abi3t ABI with new abi3t and abi3t-py315 features. #​5807
  • pyo3-macros-backend no longer depends on pyo3-build-config. #​5809
  • Drop support for Python 3.13t (3.14t and above continue to be supported; CPython declared free-threading supported starting with Python 3.14). #​5865
  • Drop support for Python 3.7. #​5912
  • Extend range of supported versions of hashbrown optional dependency to include version 0.17. #​5973
  • Support Python 3.15.0b1. #​6014
  • pyo3-ffi is now no_std. #​6022
Added
  • Add PyErr::set_traceback to set the traceback of an exception object. #​5349
  • Add PyUnicodeDecodeError::new_err_from_utf8 to create a PyErr from a str::Utf8Error. #​5668
  • experimental-inspect: implement INPUT_TYPE and OUTPUT_TYPE on optional third-party crate conversions. #​5770
  • experimental-inspect: include doc comments in generated stubs. #​5782
  • Add pyo3_build_config::PythonAbi, pyo3_build_config::PythonAbiKind, pyo3_build_config::PythonAbiBuilder, pyo3_build_config::InterpreterConfig::target_abi, and pyo3_build_config::InterpreterConfigBuilder::target_abi. #​5807
  • Add Borrowed::get as an equivalent to Bound::get and Py::get. #​5849
  • Add PyFrame::new, PyTraceBack::new, and PyFrameMethods::line_number. #​5857
  • Add PyUntypedBuffer::obj to retrieve the Python object owning the buffer. #​5870
  • Add PyCapsule::new_with_value and PyCapsule::new_with_value_and_destructor. #​5881
  • Add PyErr::set_context and PyErr::context. #​5887
  • Add a small CLI to pyo3-introspection to generate stubs. #​5904
  • Add Python::version_str. #​5921
  • Add TryFrom<&Bound<T>> for PyRef<T>, PyRefMut<T>, PyClassGuard<T> and PyClassGuardMut<T>. #​5922
  • Add From<&Bound<T>> for Bound<T> and Py<T> #​5922
  • Add PyDictMethods::set_default and PyDictMethods::set_default_ref to allow atomically setting default values in a PyDict. #​5955
  • add PyFrameMethods::outer|code|var|builtins|globals|locals. #​5967
  • Add From conversions for PyErr from std::time::TryFromFloatSecsError, std::time::SystemTimeError, std::path::StripPrefixError, std::env::JoinPathsError, std::char::ParseCharError, and std::char::CharTryFromError. #​6001
  • Add pyo3_build_config::InterpreterConfigBuilder. #​6034
  • Add PyCapsule::import_pointer #​6066
  • Add PyClassGuardMapMut. #​6073
  • Expose PyListMethods::get_item_unchecked, PyTupleMethods::get_item_unchecked, and PyTupleMethods::get_borrowed_item_unchecked on abi3. #​6075
  • Add PyClassGuardMapSuper. #​6104
  • Add PyClassGuard and PyClassGuardMut to pyo3::prelude. #​6112
  • Add Debug impls for PyClassGuard and PyClassGuardMut. #​6112
  • Enable extending PyDateTime, PyDate, PyTime, PyDelta and PyTzInfo on abi3 with python 3.12+. #​6115
  • Expose PyFunction available on abi3. #​6117
  • FFI definitions:
    • Added FFI definitions PyUnstable_Object_IsUniquelyReferenced, PyUnstable_Object_IsUniquelyReferencedTemporary, PyUnstable_EnableTryIncref, and PyUnstable_TryIncref. #​5828
    • Add FFI definitions ffi::PyErr_GetHandledException and ffi::PyErr_SetHandledException. #​5887
    • Add FFI definition Py_HASH_SIPHASH13. #​5891
    • Add FFI definition PyStructSequence_UnnamedField constant on Python 3.9 and up (or 3.11 with abi3 features). #​5892
    • Add FFI definitions PyUnstable_InterpreterFrame_GetCode, PyUnstable_InterpreterFrame_GetLasti, PyUnstable_InterpreterFrame_GetLine, and PyUnstable_ExecutableKinds. #​5932
    • Add FFI definitions PyMarshal_WriteLongToFile, PyMarshal_WriteObjectToFile, PyMarshal_ReadLongFromFile, PyMarshal_ReadShortFromFile, PyMarshal_ReadObjectFromFile, and PyMarshal_ReadLastObjectFromFile. #​5934
    • Add FFI definitions PyObject_GetAIter, PyAIter_Check, PyMapping_HasKeyWithError, PyMapping_HasKeyStringWithError, PyMapping_GetOptionalItem, PyMapping_GetOptionalItemString, PySequence_ITEM, PySequence_Fast_GET_SIZE, PySequence_Fast_GET_ITEM, and PySequence_Fast_ITEMS. #​5942
    • Add FFI definition compat::PyObject_HasAttrWithError. #​5944
    • Add FFI definitions PyDict_SetDefault, PyDict_SetDefaultRef, PyDict_ContainsString, PyDict_Pop, PyDict_PopString, PyDict_ClearWatcher, PyDict_Watch, PyDict_Unwatch, and PyFrozenDict_New. #​5947
    • Add FFI definitions PyDate_FromDate, PyDateTime_FromDateAndTime, PyDateTime_FromDateAndTimeAndFold, PyTime_FromTime, PyTime_FromTimeAndFold, and PyDelta_FromDSU. #​5949
    • Add FFI definitions PyDict_SetDefaultRef and compat::PyDict_SetDefaultRef. #​5955
      versions.
    • Add FFI definitions for non-limited API header cpython/bytearrayobject.h. #​5966
    • Add FFI definitions for non-limited API version of PyCellObject and associated functions. #​5978
    • Add FFI definition PyErr_WarnExplicitObject. #​5979
    • Add FFI definition PyTracebackObject. #​5980
    • Add FFI definition PyTuple_FromArray on 3.15+. #​5990
    • Add FFI definitions for the PEP 820 PySlot C API. #​6014
    • Add FFI definitions for the critical section API in the limited API on Python 3.15
      and newer. #​6014
    • Add FFI definitions for PEP 757 PyLong import / export API on Python 3.14+. #​6016
    • Add FFI definitions PyEval_SetProfileAllThreads and PyEval_SetTraceAllThreads. #​6038
    • Add FFI definition Py_UNICODE_TODECIMAL. #​6041
Changed
  • Change exception enrichment on #[pyfunction] argument extraction error to use PyErr::add_note instead of replacing TypeError instances. #​5349
  • Deprecate super-class initialization via tuples. #​5741
  • Change module initialization uses the PyModExport and PyABIInfo APIs on Python 3.15+. #​5753
  • Deprecate Py<T>::get_refcnt and PyAnyMethods::get_refcnt in favor of pyo3::ffi::Py_REFCNT(obj.as_ptr()). #​5797
  • Change PyEnvironmentError, PyIOError, and PyWindowsError to be type aliases of PyOSError (as is the case in Python since 3.3). #​5803
  • Change pyo3_build_config::InterpreterConfig::from_interpreter to require an additional stable_abi_version argument. The old behavior is the same as passing None. #​5807
  • Change PyList::new to no longer have ExactSizeIterator bound. #​5830
  • experimental-inspect: emit #[classattribute] as plain Python class attributes and not functions annotated with @classattribute and @property. #​5839
  • experimental-inspect: use object as the input annotation type of magic methods that return NonImplemented if the input value is not of the correct type. #​5841
  • Deprecate pyo3-build-config/resolve-config feature. #​5862
  • Change pyo3-ffi to use raw-dylib for Windows linking. #​5866
  • Deprecate generate-import-lib feature. #​5866
  • Allow zero-sized types in PyCapsule::new. #​5889
  • PyDate::from_timestamp argument is now a f64 (the Python API expects a float and not an integer) #​5896
  • experimental-inspect: Change PathBuf::extract input type hint from str | os.PathLike to str | os.PathLike[str] #​5897
  • Remove lifetime from PythonVersionInfo. #​5921
  • Remove redundant type checks for methods where CPython guarantees the type of self. #​5930
  • Elide temporary reference count cycles inside PyAnyMethods::call, PyAnyMethods::call1 and PyAnyMethods::call_method1 for arguments passed as Rust tuples containing borrowed references to Python objects. #​5941
  • Allow type annotations to be used in #[pyo3(signature = ...)] when experimental-inspect feature is not enabled (they will be ignored). #​5999
  • pyo3-ffi will now rebuild when the Python virtual environment changes in-place. #​6008
  • Change module initialization on 3.15+ to use PEP 820 PySlot API internally. #​6014
  • Deprecate direct access to all pyo3_build_config::InterpreterConfig fields; getter methods have been added as replacements. #​6034
  • FFI definitions _PyCode_GetExtra, _PyCode_SetExtra, and _PyEval_RequestCodeExtraIndex have been updated to PyUnstable_Code_GetExtra, PyUnstable_Code_SetExtra, and PyUnstable_Eval_RequestCodeExtraIndex. #​6038
  • Change PyCapsule::import to return an error if the pointer is not properly aligned. #​6066
  • Change PyClassGuardMap to be only for PyClassGuard::map and return PyClassGuardMapMut from PyClassGuardMut::map. #​6073
  • Change with_critical_section_mutex2 closure to take Option<EnteredCriticalSection> instead of EnteredCriticalSection as the second argument. #​6098
  • PyClassGuardMut::as_super now returns PyClassGuardMutSuper. #​6104
  • experimental-inspect: Generate relative imports instead of absolute ones (useful if the stubs are not describing a root package) #​6097
Removed
  • Removed the broken (and unfixable) implementations of From<str::Utf8Error>, From<string::FromUtf16Error>, and From<char::DecodeUtf16Error> for PyErr. #​5668
  • Remove Py_TRACE_REFS support (unsupported from Python 3.13). #​5824
  • experimental-inspect: Remove the TypeInfo enum and the FromPyObject::type_input and IntoPyObject::type_output functions. They are replaced by the PyStaticExpr enum and the FromPyObject::INPUT_TYPE and the IntoPyObject::OUTPUT_TYPE associated constants. #​5893
  • Remove all functionality deprecated in PyO3 0.27. #​6068
  • FFI definitions:
    • Remove private FFI definitions _PyStack_AsDict, _PyObject_CallNoArg, _PyObject_FastCall, _PyObject_FastCallTstate. _PyObject_VectorcallTstate, _PyObject_MakeTpCall, _Py_CheckFunctionResult, _PyObject_CallFunction_SizeT, _PyObject_CallMethod_SizeT, and _PySequence_IterSearch. #​5942
    • Remove FFI definitions PY_ITERSEARCH_COUNT, PY_ITERSEARCH_INDEX, and PY_ITERSEARCH_CONTAINS. #​5942
    • Removed private FFI definitions _PySet_NextEntry, and _PyLong_NumBits. #​5946
    • Remove private FFI definitions _PyFloat_CAST, _PyRun_SimpleFileObject, _PyRun_AnyFileObject, _PyRun_InteractiveLoopObject, _PyUnicode_CheckConsistency, _PyUnicode_COMPACT_DATA, _PyUnicode_NONCOMPACT_DATA, _PyUnicode_Ready, and _Py_HashBytes. #​6036
    • Remove private FFI definition _PyEval_EvalFrameDefault. #​6038
    • Remove private FFI definition _PyBytes_Resize. #​6042
    • Remove private FFI definitions _PyErr_BadInternalCall, _Py_GetAllocatedBlocks, _PyObject_GC_Malloc, _PyObject_GC_Calloc, and _PyLong_NumBits. #​6053
    • Remove Default for FFI definitions PyHeapTypeObject, PyObjectArenaAllocator, PyHash_FuncDef, and PyType_Spec. #​6093
Fixed
  • Fix add_libpython_rpath_link_args emitting rpath link args on wasm targets which don't support rpath. #​5447
  • Fix From<string::FromUtf8Error> and From<ffi::IntoStringError> for PyErr producing TypeError due to broken internals. #​5668
  • Fix PyMappingProxy::is_type_of and PyWeakrefReference::is_type_of not accepting subclasses. #​5883
  • Fix getattr_opt not treating AttributeError subclasses as missing attributes on Python < 3.13. #​5985
  • Fix compilation error for #[new] return types that contain named lifetimes. #​5998
  • Fix missing 'static bound on PyCapsule destructors. #​6049
  • Fix case where PyFrame::builtins could return a non-dict object. #​6052
  • Fix type confusion when returning a #[pyclass] from a different pyclass' #[new] method. #​6062
  • Fix soundness issue caused by variance in PyClassGuardMap by splitting off the mutable variant. #​6073
  • Fix nondeterministic JSON metadata emitted by the experimental-inspect proc macros (to enable reproducible builds). #​6076
  • Fix UB in PyEval_RestoreThread when the interpreter is shutting down on Python 3.13 and older (hang the thread instead of allowing pthread_exit to jump across Rust frames). #​6085
  • Fix possible out of bounds read in BoundListIterator and BoundTupleIterator's nth and nth_back implementations. #​6086
  • Fix BoundListIterator and BoundTupleIterator not being exhausted when nth or nth_back is called with N larger than the remaining count of items. #​6086
  • Fix missing Sync bound on closure type in PyCFunction::new_closure. #​6096
  • Fix soundness issue caused by exposing a mutable reference from PyClassGuardMut::as_super by moving into PyClassGuardMutSuper. #​6104
  • FFI definitions:
    • Fix missing FFI definition for PyTypeObject.tp_versions_used on Python 3.13 and newer. #​5917
    • Mark FFI definitions no longer available on 3.11 and up: PyUnicode_Encode, PyUnicode_EncodeASCII, PyUnicode_EncodeCharmap, PyUnicode_EncodeDecimal, PyUnicode_EncodeLatin1, PyUnicode_EncodeRawUnicodeEscape, PyUnicode_EncodeUTF7, PyUnicode_EncodeUTF8, PyUnicode_EncodeUTF16, PyUnicode_EncodeUTF32, PyUnicode_EncodeUnicodeEscape, PyUnicode_TransformDecimalToASCII, and PyUnicode_TranslateCharmap. #​6041
    • Mark FFI definition PyUnicode_ClearFreeList no longer available on 3.9 and up. #​6041
    • Fix FFI definition PyErr_SetInterruptEx missing c_int return type. #​6043
    • Fix return type of FFI definition PyBuffer_SizeFromFormat on Python 3.8 (was changed from c_int to Py_ssize_t on Python 3.9). #​6090
    • Fix return type of FFI definition PyUnicode_Tailmatch on PyPy (is c_int, unlike CPython). #​6090

v0.28.3

Compare Source

Fixed
  • Fix compile error with #[pyclass(get_all)] on a type named Probe. #​5837
  • Fix compile error in debug builds related to _Py_NegativeRefcount with Python < 3.12. #​5847
  • Fix a race condition where Python::attach or try_attach could return before site.py had finished running. #​5903
  • Fix unsoundness in PyBytesWriter::write_vectored with Python 3.15 prerelease versions. #​5907
  • Fix deadlock in .into_pyobject() implementation for C-like #[pyclass] enums. #​5928
rust-lang/rust (rust)

v1.99.1

Compare Source

===========================

v1.99.0

Compare Source

==========================

Language

Compiler

Platform Support

Refer to Rust's platform support page
for more information on Rust's tiered platform support.

Libraries

Stabilized APIs

Cargo

  • Add a new built-in profile debug. This is a preparation for transitioning the dev profile away from debugging to give a saner default for faster development iterations. Currently there is no difference between dev and debug profiles. docs #​17214
  • Workspace members on edition 2024 or later can now override an inherited workspace dependency's default-features field. For example, serde = { workspace = true, default-features = false } now turns off default features even when the workspace definition enables them. On earlier editions, default-features = false is ignored with a warning. (RFC 3945) #​17126

See also the full Cargo changelog

Rustdoc

Compatibility Notes

Internal Changes

These changes do not affect any public interfaces of Rust, but they represent
significant improvements to the performance or internals of rustc and related
tools.

v1.98.1

Compare Source

===========================

v1.98.0

Compare Source

==========================

Language

Platform Support

Refer to Rust's platform support page
for more information on Rust's tiered platform support.

Libraries

Stabilized APIs

Compatibility Notes

v1.97.1

Compare Source

==========================

  • rustc: Fix miscompilation in LLVM optimization
    This backports an LLVM submodule bump to include the LLVM-side fix and a
    revert of the rustc change that is one known trigger for the bug. The rustc
    side revert should not be strictly necessary but is done out of abundance of caution.

v1.97.0

Compare Source

==========================

Language

Platform Support

Refer to Rust's platform support page
for more information on Rust's tiered platform support.

Stabilized APIs

These previously stable APIs are now stable in const contexts:

Cargo

Rustdoc

Compatibility Notes

v1.96.1

Compare Source

===========================

v1.96.0

Compare Source

==========================

Language

Compiler

Libraries

Stabilized APIs

Cargo

Rustdoc

Compatibility Notes

Internal Changes

These changes do not affect any public interfaces of Rust, but they represent
significant improvements to the performance or internals of rustc and related
tools.

v1.95.0

Compare Source

===========================

Language

Compiler

Platform Support

Refer to Rust's platform support page
for more information on Rust's tiered platform support.

Libraries

Stabilized APIs

These previously stable APIs are now stable in const contexts:

Rustdoc

Compatibility Notes

Internal Changes

These changes do not affect any public interfaces of Rust, but they represent
significant improvements to the performance or internals of rustc and related
tools.

v1.94.1

Compare Source

===========================

sass/dart-sass (sass)

v1.107.1

Compare Source

  • Properly report the embedded protocol version as 3.4.0.

v1.107.0

Compare Source

Command-Line Interface
  • The --fatal-deprecation flag can now exclude deprecations that would
    otherwise be included by passing a version number. To exclude a deprecation,
    add - before its name. For example, --fatal-deprecation=1.107.0,-import
    includes all deprecations that were present in Dart Sass 1.107.0 except for
    the @import deprecation.

  • The --fatal-deprecation flag now takes the special value dart-sass-2,
    which treats as fatal all deprecations that will become fatal in Dart Sass
    2.0.0.

JavaScript API
  • Options.fatalDeprecations can now take a DeprecationSelectorDifference
    object of the form {include: ..., except: ...}, where the include field
    lists deprecations to mark fatal (which can be version numbers) and the
    except field lists deprecations not to mark fatal. The except field
    takes precedence over include.

  • Add a (non-enumerable) sass.deprecations.dartSass2 property which can be
    passed to Options.fatalDeprecations to mark as fatal exactly the
    deprecations that will become fatal in Dart Sass 2.0.0. This can be combined
    with other deprecations or used in a DeprecationSelectorDifference to modify
    exactly which deprecations it covers.

  • Passing a version number beyond the current Dart Sass version to
    Options.fatalDeprecations is now deprecated. See the Sass
    website
    for details.

Dart API
  • Add a Deprecation.dartSass2 property which returns exactly the set of
    deprecations that will become fatal in Dart Sass 2.0.0.

  • Passing a version number beyond the current Dart Sass version to
    Deprecation.forVersion is now deprecated.

Embedded Protocol
  • Add a CompileRequest.fatal_deprecation_except field which excludes
    deprecations from being considered fatal if they would have been enabled by
    CompileRequest.fatal_deprecation.

v1.106.1

Compare Source

  • Fix a bug where an attribute selector with an empty value (such as
    [class=""]) would crash when serializing.

  • Don't crash when serializing a number with an empty unit. This is only
    possible through the JavaScript and Dart APIs or the embedded protocol.

Embedded Dart Sass
  • More robustly convert invalid value errors into PARAMS errors.

v1.106.0

Compare Source

  • Don't normalize CSS escapes in statement contexts that can contain
    interpolation. For example, @f\6Fo is now emitted as written rather than
    normalized to @foo.

  • Fix a bug where quotes would be removed from attribute selector values that
    contained backslashes.

  • Fix invalid source spans that could cause crashes when encountering a syntax
    error in selectors or media queries that also contain escape sequences.

  • Fix a bug where the indented syntax parser would crash when parsing a file
    where the first statement was indented and appeared after the first line.

  • Fix a bug that could cause crashes when encountering errors or warnings in
    interpolations that contain patterns like // */.

  • Potentially breaking compatibility fix: CSS escape codes whose values are
    0, for Unicode surrogates, or greater than the maximum allowed code point are
    now consistently normalized to U+FFFD REPLACEMENT CHARACTER in expression
    contexts. Previously, in some cases these were instead normalized to the
    normalized form of the original escape sequence, which violates the principle
    that all escape sequences for identical values should be normalized the same
    way. In other cases, these would simply throw errors.

    As a special case, \0 on its own will continue to be normalized to \0 to
    support historical CSS hacks.

  • Potentially breaking bug fix: Throw an error for mixins and functions that
    have rest parameters which are the same as normal parameters. Previously, the
    positional parameters wouldn't be accessible and calling such a mixin or
    function with a named argument would crash the compiler.

  • Potentially breaking bug fix: Fix various cases where using a CSS escape
    code at the beginning of an identifier would change parsing behavior versus
    using the character directly.

  • Potentially breaking bug fix: When a number's unit is ambiguous with a
    numeric exponent, the unit is now serialized as an escape code rather than a
    literal e to avoid being interpreted as an exponent by CSS.

  • Potentially breaking bug fix: Don't parse a CSS escape code for U+45 LATIN
    CAPITAL LETTER E or U+65 LATIN LOWERCASE LETTER E as an exponent in
    @keyframes percentage selectors.

  • Potentially breaking bug fix: Properly normalize underscores written as
    CSS escape codes in variable, mixin, and function names.

v1.105.2

Compare Source

Node.js Embedded Host
  • Fix a deadlock when the async compiler fails to start.

v1.105.1

Compare Source

  • Improve error messages for @extends across different media queries.

v1.105.0

Compare Source

  • Add support for first-class modules. These can be accessed using the new
    meta.load() and meta.get-module() functions, and may be passed as the
    $module argument to numerous eisting sass:meta functions.

  • Add the meta.css() mixin, which includes CSS from a first-class module.

JS API
  • Add a SassModule class and a corresponding Value.assertModule() method.
Dart API
  • Add a SassModule class and a corresponding Value.assertModule() method.

v1.104.1

Compare Source

  • Fix a bug where loud comments before @use rules could be emitted multiple
    times under certain circumstances.

  • Fix a bug in which an invalid selector at the end of an indented syntax
    stylesheet would cause the parser to crash instead of emitting a useful error
    message.

Command Line Interface
  • Many-to-many compilations no longer compile any files that appear in the
    output directory if the output directory is also within the source directory.
    This fixes a bug where --watch mode could enter an infinite loop recompiling
    the same CSS file over and over.

  • Sass now sets the modification time of output files to the time compilation
    started rather than the time it ended. This ensures that, if a source file
    is modified during compilation, --watch and --update mode will recompile
    the outputs to include the new source file contents.

v1.104.0

Compare Source

  • Potentially breaking compatibility fix: Colors now convert the special
    values NaN and negative zero, as well as infinity and negative infinity for
    polar-hue channels, to 0 as per the CSS spec.

  • The special value negative zero is now serialized as -0 instead of 0 for
    greater compatibility when using it in CSS calculations.

v1.103.1

Compare Source

  • No user-visible changes.

v1.103.0

Compare Source

  • Potentially breaking compatibility fix: Colors now preserve "analogous
    sets" of missing channels during conversions, per the CSS spec. For example,
    color.to-space(lch(50% none none), lab) now returns lab(50% none none)
    instead of lab(50% 0 0).

v1.102.0

Compare Source

  • Use the 2.4 gamma transfer function for rec2020, as specified by the latest
    draft of CSS Color 4.

v1.101.7

Compare Source

  • No user-visible changes.

v1.101.6

Compare Source

  • No user-visible changes.

v1.101.5

Compare Source

  • No user-visible changes.

v1.101.4

Compare Source

  • Avoid emitting rgb() or rgba() functions with non-percent decimal
    channels. Older browsers only support integer values or (potentially decimal)
    percentages for these functions, so in order to preserve
    backwards-compatibility while retaining full precision for modern browsers,
    legacy colors that contain at least one non-integer channel will now use
    percentages for their channels (for example, rgb(0%, 100%, 50%) rather than
    rgb(0, 255, 127.5)).

  • Fix a bug where the values of plain-CSS if() expressions were emitted using
    their meta.inspect() format rather than their CSS serialization format.

v1.101.3

Compare Source

  • No user-visible changes.

v1.101.0

Compare Source

  • Potentially breaking bug fix: The Node package importer now properly
    supports resolving import-only variants of Sass files declared in the
    exports, sass, and style fields of package.json. Previously, these
    files were ignored even when loaded via @import, so any code relying on
    loading module-system-only files this way may break.

v1.100.0

Compare Source

  • Writing two compound selectors adjacent to one another without any whitespace
    between them, such as [class]a, is now deprecated. This was always an error
    in CSS and Sass only supported it by mistake.

    See the Sass website for
    details.

v1.99.0

Compare Source

  • Add support for parent selectors (&) at the root of the document. These are
    emitted as-is in the CSS output, where they're interpreted as the scoping
    root
    .

  • User-defined functions named calc or clamp are no longer forbidden. If
    such a function exists without a namespace in the current module, it will be
    used instead of the built-in calc() or clamp() function.

  • User-defined functions whose names begin with - and end with -expression,
    -url, -and, -or, or -not are no longer forbidden. These were
    originally intended to match vendor prefixes, but in practice no vendor
    prefixes for these functions ever existed in real browsers.

  • User-defined functions named EXPRESSION, URL, and ELEMENT, those that
    begin with - and end with -ELEMENT, as well as the same names with some
    lowercase letters are now deprecated, These are names conflict with plain CSS
    functions that have special syntax.

    See the Sass website for details.

  • In a future release, calls to functions whose names begin with - and end
    with -expression and -url will no longer have special parsing. For now,
    these calls are deprecated if their behavior will change in the future.

    See the Sass website for details.

  • Calls to functions whose names begin with - and end with -progid:... are
    deprecated.

    See the Sass website for details.

serde-rs/serde (serde)

v1.0.229

Compare Source

  • Update to syn 3
webpack/minimizer-webpack-plugin (terser-webpack-plugin)

v5.6.1

Compare Source

Patch Changes
  • deduplicate extracted comments in linear time, so builds stay fast when an asset contains many distinct preserved comments (by @​alexander-akait in #​682)

v5.6.0

Compare Source

Minor Changes
  • support array of minimizers for minify and terserOptions (by @​alexander-akait in #​674)

  • add built-in CSS minimizers from css-minimizer-webpack-plugin (by @​alexander-akait in #​674)

  • add built-in HTML minimizers from html-minimizer-webpack-plugin (by @​alexander-akait in #​674)

  • add filter method to minimizers, allowing a single plugin instance to handle multiple asset types (by @​alexander-akait in #​674)

  • terser-webpack-plugin has been renamed to minimizer-webpack-plugin, merging other minimizers from css-minimizer-webpack-plugin and html-minimizer-webpack-plugin. We will continue to publish new releases under the old name, but we recommend switching to the new package - minimizer-webpack-plugin. It is now a single plugin for minification. We also added the ability to specify different minifier types using only one plugin instance, which will improve performance. (by @​alexander-akait in #​677)

  • rename terserOptions to minimizerOptions; terserOptions is kept as a deprecated alias (by @​alexander-akait in #​674)

All notable changes to this project will be documented in this file. See standard-version for commit guidelines.

v5.5.0

Compare Source

Features
frondeus/test-case (test-case)

v3.4.1

Compare Source

Fixes
  • test_case no longer triggers clippy::redundant_test_prefix lint (#​155)
  • test_case with => panics no longer fails when test_case panics (#​153) thanks to @​jtmoon79

v3.4.0

Compare Source

Changes
  • Adds test case number to automatically distinguish test cases with the same generated name (#​151)
    Instead of having a conflict in example like this:

#[test_case(42)]
#[test_case("42")]
fn cases_are_enumerated(value: impl std::fmt::Display) {
   assert_eq!("42", &value.to_string())
}

It now generates prefix name for each test case. In all cases:

test cases_are_enumerated::test_case_1_42_expects ... ok
test cases_are_enumerated::test_case_2_42_expects ... ok
  • Inverts the left and right output for simple test cases.
    Generates assert_eq!(result, expectation) instead of previous assert_eq!(expectation, result);
  • Upgrades edition to 2024
  • Updates:
    • regex to 1.9
    • insta to 1.43
    • itertools to 0.15
    • syn to 3.0
dtolnay/thiserror (thiserror)

v2.0.21

Compare Source

  • Fix parsing of generic unit variants in display expressions (#​459)

v2.0.20

Compare Source

  • Suppress redundant_field_names clippy lint in generated code (#​454)

v2.0.19

Compare Source

  • Update to syn 3
kulshekhar/ts-jest (ts-jest)

v29.4.15

Compare Source

Bug Fixes
  • compiler: resolve modules with tsconfig options regardless of cache state (268746c), closes #​5216
  • support .cjs config files in config:migrate (4001b4e), closes #​4485

v29.4.14

Compare Source

Reverts

v29.4.13

Compare Source

Features
Performance Improvements

v29.4.12

Compare Source

Features
  • compiler: support TypeScript 7 projects through compatibility aliases (#​5386)

v29.4.11

Compare Source

Bug Fixes
  • preserve Bundler on the CJS path under TypeScript >= 6 (3941818), closes #​4198

v29.4.10

Compare Source

Bug Fixes
  • pass resolutionMode to ts.resolveModuleName for hybrid module support (b557a85)
  • rebuild Program when consecutive compiles need different module kinds (a82a2b3), closes #​4774
  • respect tsconfig moduleResolution instead of forcing Node10 (1bffffc)
  • transformer: transpile mjs files from node_modules for CJS mode (96d025d)
  • transformer: use a consistent comparator in hoist-jest sortStatements (8a8fd2f)

v29.4.9

Compare Source

Bug Fixes
  • use correct registry for npm OIDC trusted publishing (f8a9cc9)

v29.4.8

Compare Source

Bug Fixes
  • wrong published assets

v29.4.7

Compare Source

Features
TypeStrong/ts-loader (ts-loader)

v9.6.2

Compare Source

Officially ts-loader has supported 3.6.3+ versions of TypeScript. This change means that certain scenarios with older versions of TS will now certainly fail. If anyone is actually using these versions it would be surprising.

v9.6.1

Compare Source

v9.6.0

Compare Source

v9.5.7

Compare Source

Skipping 9.5.5-9.5.6 due to publishing issues

Microsoft/tslib (tslib)

v2.9.1: tslib 2.9.1

Compare Source

What's Changed

Full Changelog: https://github.com/microsoft/tslib/compare/v2.8.1...v2.9.1

wasm-bindgen/wasm-bindgen (wasm-bindgen)

v0.2.130

Compare Source

Added
  • A borrowed number, bool, char or borrowed string crosses by copy, so
    &f64, &Option<T>, &Nullable<T>, Option<&f64> and
    Option<&Nullable<T>> are argument types, and an
    experimental_generic_mono import taking &T accepts T = f64,
    Option<f64> or Nullable<String>, as std's contains(&T) does.
    #​5436

  • Added a rejection type parameter to js_sys::Promise<T, E = JsValue>,
    mirrored on JsFuture<T, E>, PromiseState<T, E> and
    PromiseWithResolvers<T, E>. Awaiting a Promise<T, E> yields
    Result<T, E>, converting the rejection reason as an E the same unchecked
    way the fulfilled value is converted as a T. Both parameters are covariant
    under Upcast; catch, then_with_reject and the withResolvers reject
    function receive an E; all_tuple / all_settled_tuple carry a shared E
    through; and under js_sys_unstable_apis, Promise::new, Promise::reject
    and Promise::any are typed on the rejection too, any as
    AggregateError. The default keeps existing Promise<T> code unchanged.
    PromiseWithResolvers<T, E> is invariant in both, since its resolve and
    reject functions take them, and JsFuture<T, E> is UnwindSafe whenever
    T and E are.
    #​5426

  • Added the --js-string-builtins CLI flag, importing static_string
    constants as JS String Builtins
    string constants from wasm:js/string-constants instead of defining them in
    the JS glue. With reference types, static_string constants now occupy
    fixed externref table slots filled in when the module is instantiated, so
    cloning and dropping them is free and never calls into JS.
    #​5401

  • Added Nullable<T>, re-exported as js_sys::Nullable, for a T | null
    value at the JS boundary, as Option<T> is for T | undefined, with
    Option<Nullable<T>> for T | null | undefined. Both are accepted wherever
    Option<T> is, for every T and in every position: JS null is
    Nullable::Null and is sent back as null, while undefined into a plain
    Nullable<T> goes to T's own conversion. A plain Option<T> still reads
    both undefined and null as None and writes None as undefined; the
    Option layer of Option<Nullable<T>> treats only undefined as None,
    since null has to reach the Nullable layer. Option<T> converts from
    and into Nullable<T>, and
    JsNullable<T> converts from both and into Option<Nullable<T>> for
    T: JsGeneric.
    The API follows Option's, including ok_or, and_then, filter,
    as_deref, take, replace and IntoIterator, and
    --cfg wasm_bindgen_unstable_try_trait enables ? on nightly.
    NullableIntoWasmAbi / NullableFromWasmAbi carry Nullable<T>'s null
    for every T, and are supertraits of JsStringLike and the js-sys
    primitive-union markers, so Nullable<impl JsStringLike> and
    Nullable<impl JsNumberOrStringLike> work under experimental_generic_mono,
    and Nullable<T> erases like Option<T> on a generic import.
    #​5410
    #​5423

  • Nullable<T> converts into JsValue with From, Null becoming null
    as None becomes undefined for Option<T>, and Option<T>,
    Nullable<T> and Result<T, E> are Promising for any T: Promising,
    so a Promise<Nullable<JsString>> awaits to a Nullable<JsString>.
    String and &str upcast to JsValue, and String to itself, so a
    Promise<String> from an experimental_generic_mono import is JsGeneric
    and upcasts to Promise<JsValue> as Promise<bool> does. Together these
    make a Promise<Nullable<JsString>> or Promise<String> from a mono
    import usable wherever a promise is expected. &str and String upcast to
    each other, so an Array<&str> inferred from borrowed arguments settles to
    Array<String>. Option<T> and Nullable<T> upcast to JsValue whenever
    T does, so a Promise<Option<String>> relabels to Promise<JsValue>, and
    Undefined and Null upcast to Option<T> and Null to Nullable<T>, so a
    Function<fn(A) -> R> stands in for a Function<fn(A, Option<B>) -> R>.
    Every Rust and JS carrier wraps into Option<Target> and Nullable<Target>
    whenever it upcasts to Target, and Nullable<T> upcasts to Option<T>,
    so an Array<JsString> relabels to Array<Option<JsString>> or
    Array<Option<Nullable<JsString>>>, and a Function<fn(Option<T>) -> R>
    stands in for a Function<fn(T) -> R>.
    #​5427
    #​5437

  • Added MaybeIntoWasmAbi / MaybeFromWasmAbi, the ABI of Option<T> for
    every T, with an associated MaybeAbi that lets a type without a spare
    value in its own ABI, such as i32 or f64, pick a wider one. Option<T>
    converts through it, and a blanket impl provides it for every
    OptionIntoWasmAbi / OptionFromWasmAbi type, so existing impls and bounds
    are unaffected. NullableIntoWasmAbi / NullableFromWasmAbi extend it with
    null. As a result, Option<impl JsNumberOrStringLike> and the other
    primitive-union bounds now work in experimental_generic_mono imports
    without a where Option<T>: IntoWasmAbi clause.
    #​5423

  • Under js_sys_unstable_apis, RegExp::exec and JsString::match_ return
    Nullable<T> rather than Option<T>, as the JS APIs return null on no
    match.
    #​5410

  • Added the slice = view | copy | array and vec = copy | array
    attributes for imported JS functions, choosing what JS receives for a
    sequence argument with numeric elements: a live typed array over wasm
    memory, a fresh typed array, or a fresh plain Array. slice applies to
    borrowed slices (&[T], Option<&[T]>, Clamped<&[u8]>) and vec to
    owned ones (Vec<T>, Box<[T]>, Option<Vec<T>>, Clamped<Vec<u8>>).
    Each key is accepted per argument, per function and per extern "C" block,
    with a more specific level overriding a broader one. Inherited from a
    function or block, a key only affects arguments of its own shape; written
    on an argument it doesn't fit, it is an error. A generic element type
    resolves the mode per instantiation under experimental_generic_mono,
    where Option<&[T]> is now supported too. Neither key is accepted on
    exported functions.
    #​5384

  • Borrowed slices of String, &str, bool, char and exported enums
    (&[T] and Option<&[T]>) can be passed to imported JS functions,
    arriving as a fresh Array.
    #​5384

  • Slices of every JsStringLike shape, including &String, &Box<str>,
    &Cow<str> and &JsString, can be passed to imported JS functions, and
    JsStringLike alone bounds a &[T] argument of an
    experimental_generic_mono import.
    #​5384

  • Owned vectors (Vec<T>, Box<[T]>, Option<Vec<T>>) of bool, char
    and string enums can be passed to and from JS, and Vec<&str> can be
    passed to JS.
    #​5384

  • String enums implement TryFromJsValue, accepting only their listed values,
    so they can be used as dynamic-union variant payloads.
    #​5376

  • Added JsValue::from_utf8_lossy to create a JS string directly from a
    &[u8], decoding on the JS side with replacement characters for invalid
    UTF-8 instead of requiring a String::from_utf8_lossy allocation first.
    #​5370

  • Documented in the guide that passing an exported Rust type by value moves it
    out of the JavaScript object, which throws on any later use.
    #​5354

  • Added Rolldown compatibility to the deployment docs in the guide.
    #​5355

  • Added source property to ToggleEvent.
    #​5353

  • Added 11 experimental js-sys marker traits for every union of two or more
    of the TypeScript bigint, boolean, number, and string primitive
    categories. Traits such as JsNumberOrStringLike can bound
    experimental_generic_mono import parameters while preserving each concrete
    Rust type's native ABI representation. String-containing unions accept every
    wasm_bindgen::JsStringLike type.
    #​5341

  • Added the experimental js_sys::PropertyKey marker trait for the
    string | number | symbol keys accepted by TypeScript's Record type.
    JsNumberOrStringLike widens to PropertyKey.
    #​5341

  • JsStringLike and the js-sys string primitive-union traits now accept
    &String, &Box<str> and &Cow<str>. These shapes, and Option of each,
    also work as plain import argument types.
    #​5374

  • Added support for threads on memory64 (wasm64-unknown-unknown with
    +atomics). On memory64, __wbindgen_thread_destroy takes JS numbers.
    #​5378

  • Added js-sys bindings for the modern ECMAScript builtins that were still
    missing: the Iterator helpers (Iterator.from as from_iterable,
    Iterator.concat, map,
    filter, take, drop, flatMap, reduce, toArray, forEach, some,
    every, find), Map / WeakMap getOrInsert and getOrInsertComputed,
    Object.groupBy and Map.groupBy, Promise.try and
    Promise.withResolvers (with a PromiseWithResolvers<T> type), explicit
    resource management (DisposableStack, AsyncDisposableStack,
    SuppressedError, Symbol.dispose, Symbol.asyncDispose), Uint8Array
    base64 and hex conversion (fromBase64, fromHex, toBase64, toHex,
    setFromBase64, setFromHex, with Base64Options, its Base64Alphabet
    and Base64LastChunkHandling enums and a SetFromResult type), Error.isError, Math.sumPrecise, Math.f16round,
    RegExp.escape and the dotAll, hasIndices and unicodeSets flag
    getters, String.prototype.isWellFormed and toWellFormed,
    Symbol.prototype.description, JSON.rawJSON and JSON.isRawJSON, and
    the typed array toReversed, toSorted, with, findLast,
    findLastIndex, includes and indexOf methods. From ECMA-402, the
    Intl.Locale firstDayOfWeek and variants getters. From the WebAssembly
    JS API, WebAssembly.JSTag, the compile-options variants of validate,
    compile, compileStreaming, instantiate, instantiateStreaming and
    the Module constructor (taking a CompileOptions dictionary, with an
    InstantiatedSource result type),
    Memory toResizableBuffer and toFixedLengthBuffer, Global.valueOf
    and Exception.stack.
    #​5403
    #​5421

Changed
  • Reworked the js_sys::Temporal bindings and Date::to_temporal_instant,
    which stay behind js_sys_unstable_apis and now also need the new temporal
    feature, against the final Stage 4
    specification and reshaped them to the web-sys conventions. Inputs are
    typed: *Like dictionaries such as PlainDateLike for from, calendar-free
    *Fields dictionaries for with, and the bare form of a method takes the
    type its argument converts to (&str time zones and calendars, &PlainTime,
    &Duration, &Self for until/since/equals), while every other member
    of a specification union gets a _with_<type> variant, so
    with_calendar_with_plain_date, add_with_duration_like, add_with_str,
    equals_with_zoned_date_time, with_plain_time_with_str,
    PlainYearMonth::from_with_plain_date and the typed relativeTo, calendar,
    timeZone and plainTime dictionary setters all exist; compare keeps
    taking &Self only. Optional arguments expand to the plain method plus
    _with_options/_and_options, to_locale_string takes no locale, a
    _with_str/_with_str_sequence one or an Option<&str> with options, and round,
    total and get_time_zone_transition take their options dictionary, with
    round_with_unit, total_with_unit and
    get_time_zone_transition_with_direction shortcuts. The option dictionaries
    are OverflowOptions, DifferenceOptions, RoundToOptions::new(unit),
    DurationTotalOptions::new(unit), TimeZoneTransitionOptions::new(direction)
    and friends, the enums drop their Temporal prefix (Overflow, Unit,
    LargestUnit, TransitionDirection, …). Bindings for the removed
    toPlainYearMonth/toPlainMonthDay on PlainDateTime and ZonedDateTime,
    ZonedDateTime::with_plain_date and PlainTime::to_plain_date_time are gone,
    offset_nanoseconds returns f64, era, era_year, week_of_year and
    year_of_week return Options, fractionalSecondDigits is a u8,
    get_time_zone_transition returns Nullable<ZonedDateTime>,
    to_js_string_with_options and to_locale_string are fallible, constructors
    expand their optional trailing fields (PlainTime::new(), new_with_hour, …,
    PlainDate::new_with_calendar), and catch follows the specification:
    equals, compare, the typed from forms (except PlainYearMonth's date
    conversions, which can leave the range) and the option-less
    Instant/PlainTime arithmetic are infallible, while
    ZonedDateTime::start_of_day, hours_in_day and
    PlainDate::to_plain_year_month are fallible. Fallible bindings return
    Result<T, RangeError>, or Result<T, Error> where a property bag, a
    relativeTo/plainTime union or Intl options can also throw a TypeError. PartialEq/Eq on the
    date-time types compare by the spec equals(), and Instant and PlainTime
    are Ord through compare().
    #​5402

  • The js-sys JsFunction* traits' associated types (Ret, ArgN, BindN)
    no longer carry a JsGeneric bound, so a Function<fn(..)> signature may
    name a converted carrier such as Nullable<JsString>, and
    Function::from_closure accepts a closure with converted arguments. Generic
    code over these traits that calls call* or bind* now needs the bound
    itself, as where F::Ret: JsGeneric, F::Arg1: JsGeneric. The hidden
    PromiseTuple trait's Joined and Settled likewise drop it, its
    Rust-tuple impl packing the promise handles directly rather than upcasting
    each, and the
    JsGeneric bounds that only existed to satisfy a Function<fn(..)> slot
    or to tag a type argument are gone: Promising for Promise<T, E>,
    Promise::new_typed, the PromiseWithResolvers resolve/reject
    getters, the PropertyDescriptor get/set accessors, WeakMap::new and
    the entries/from_entries family of Array, Set, Map and Object.
    #​5427

  • Option<T>: TryFromJsValue now reads null as None, as the Option<T>
    ABI does, so Option::<JsValue>::try_from_js_value(JsValue::NULL) is
    None where it was Some(null). A T that accepts null as a distinct
    value space sets the new TryFromJsValue::NULLABLE const, as
    Nullable<T> does, and an Option of it passes null through, so
    Option<Nullable<T>> reads it as Some(Nullable::Null). Nullable<T>
    itself converts from a JsValue with TryFromJsValue.
    #​5427

  • With reference types, static_string constants and the reserved
    undefined, null, true and false values are stored at fixed slots of
    the externref table, which is now sized to include them, and cloning or
    dropping them no longer allocates or calls into JS. The per-string JS import
    function is no longer emitted.
    #​5401

  • Breaking (experimental): experimental_generic_mono imports no longer add
    hidden ABI bounds to the generated wrapper. The conversion bounds each
    position needs are now declared on the import like any other bound:
    T: IntoWasmAbi for an argument, T: RefIntoWasmAbi (a new trait in
    wasm_bindgen::convert) for a &T argument, T: VectorRefIntoWasmAbi for a
    &[T] or Option<&[T]> argument, T: FromWasmAbi for a return
    (+ 'static when async), A: FromWasmAbi for a callback argument and
    R: IntoWasmAbi for a callback return. A missing bound is reported at the
    position that needs it.
    #​5385

  • The generated TextDecoder no longer sets fatal: true. Rust &str is
    always valid UTF-8, so this only removes a redundant check and lets
    JsValue::from_str and JsValue::from_utf8_lossy share a single decoder.
    #​5370

  • Replaced the once_cell dependency with core::cell::LazyCell, which is
    available now that the library MSRV is 1.81.
    #​5359

  • Under js_sys_unstable_apis, the unsuffixed Object::define_property,
    Object::from_entries, Object::get_own_property_descriptor,
    Object::has_own, Object::property_is_enumerable,
    Reflect::define_property, Reflect::delete_property, Reflect::get,
    Reflect::get_own_property_descriptor, Reflect::has, and Reflect::set
    now take a generic K: PropertyKey key, accepting string, number, or symbol
    keys. Object::get_own_property_descriptor and
    Reflect::get_own_property_descriptor now return
    Option<PropertyDescriptor<T>>, and Reflect::has now takes an
    &Object<T> target. Callers passing &"key".into() should pass "key" (or
    another concrete key type) instead.
    #​5341

  • wasm-bindgen-test no longer depends on async-trait. Its benchmark code
    now uses native async fn in traits.
    #​5365

  • Escape string inputs in debugString.
    #​5366

  • #[wasm_bindgen] now warns when a function sets more than one of this,
    getter, setter, indexing_getter, indexing_setter and
    indexing_deleter. Only one of them takes effect, and the others used to be
    ignored silently. Conflicting options will be an error in the next major
    version.
    #​4272
    #​5369

  • &[T], Vec<T>, Box<[T]>, Option<Vec<T>> and Option<Box<[T]>>
    arguments with a number element type are now declared in TypeScript and
    JSDoc as the typed array or a plain array (e.g. Uint8Array | number[], or
    BigInt64Array | bigint[] for 64-bit elements), matching what the generated
    JS already accepts. Read-write struct fields of these types are declared as
    a getter and setter pair. &mut [T] arguments still take only a typed
    array, since the results are copied back into its buffer, and so do
    Clamped arguments, since numbers in a plain array would wrap around
    instead of being clamped.
    #​4504

  • Numeric enums are passed between JS and Rust as an f64, so a value from
    JS that isn't one of the enum's values, such as 'abc', NaN, 1.5 or
    2 ** 32, throws "invalid enum value passed" in release builds too,
    rather than becoming variant 0 or being truncated. Conversions from
    JsValue likewise reject NaN and fractions. Values above
    i32::MAX in a #[repr(u32)] enum are now returned to JS unchanged
    rather than as negative numbers.
    #​5384

  • A Vec<T> of a numeric enum passed from JS checks each element as a
    single enum value, so a wrong element throws the same error a single
    argument would, rather than "array contains a value of the wrong type".
    #​5384

Fixed
  • Upcast::upcast and upcast_into no longer let a safe UpcastFrom impl
    extend a borrow's lifetime: ErasableGeneric::Repr now keeps the real
    lifetime of a reference, slice, &str, closure reference or
    ScopedClosure instead of 'static, so the Repr-equality bound rejects
    such an upcast. A generic import likewise no longer accepts an owned
    ScopedClosure that borrows a non-'static value, which handed JS a
    closure over freed data; borrowed arguments, and owned ones that only
    contain a borrow, still accept any lifetime.
    #​5178

  • Concurrent calls to the web and no-modules init function no longer
    instantiate the module more than once; later calls share the in-flight
    initialization and resolve to the same instance.
    #​5429

  • js_sys::Promise::catch_map's handler now receives the rejection reason,
    typed as the promise's E, instead of the reason mislabelled as the
    fulfilled type T. A handler on a Promise<Foo> written as |v: Foo| must
    take JsValue; it was never a Foo.
    #​5426

  • Large JS snippets (module = "...", inline_js) and
    typescript_custom_section expressions such as include_str! no longer make
    compilation slow or print "constant evaluation is taking a long time"
    warnings. The macro now lays out the __wasm_bindgen_unstable custom section
    as a #[repr(C)] struct of byte arrays, so const evaluation copies each
    chunk at once instead of byte by byte. A crate with a 5 MB snippet went from
    64 s to under a second for cargo check; the section's bytes are unchanged.
    #​5413

  • Emscripten output now keeps a private class that is only created from
    Rust, such as one converted into a JsValue and passed to JS. Every
    generated function that references a class by name now lists it in its
    __deps. Previously emcc dropped the class, and calling into it failed with
    ReferenceError: <Class> is not defined.
    #​5415

  • Imported methods, static methods and constructors without a js_class now
    bind to the js_name and js_namespace of the type they belong to when that
    type is declared in the same extern "C" block. Previously they used the
    type's Rust name, so for example a constructor of
    #[wasm_bindgen(js_name = CustomName)] type Type; called new Type().
    #​5391

  • Lists passed from JS to Rust no longer leak memory when an element is
    rejected, such as a value of the wrong type in a Vec<String> or
    Vec<T> of exported structs, or an invalid value in a Vec<T> of a
    numeric enum.
    #​5384

  • An exported function or closure that rejects an argument from JS, such as
    an invalid numeric enum value or an exported struct that is still borrowed,
    no longer leaks its other arguments or leaves an exported object it borrowed,
    including self, permanently borrowed. Field setters, free() on a
    borrowed object, closures called after being dropped and FnOnce closures
    called twice also release what JS passed them. The same holds when the
    generated JS rejects an argument before calling Rust, such as an object of
    the wrong class or a number passed for a u64, after copying an earlier
    string or array into Wasm memory.
    #​5388

  • An exported function taking an Option<JsValue>, or without reference
    types an owned JsValue, no longer leaks an externref table or JS heap
    slot when Wasm rejects a later numeric argument, such as a number passed
    for a u64.
    #​5404

  • The test runner works again with WASM_BINDGEN_NO_DEBUG=1, so a test suite
    can run against the glue a release build gets. The tests are reached through
    the __wasm export, which only debug glue has had since #​4879; the new
    Bindgen::export_wasm option exports it on its own.
    #​5404

  • An async export now converts its arguments when it is called, rather than
    when its future is first polled. A rejected argument rejects the returned
    promise, instead of throwing from the task queue, and an async method's
    self stays borrowed from the call on, so freeing the object before the
    future runs throws instead of leaving the method with a freed self.
    #​5388

  • Reference types are now detected from the runtime's externref intrinsics when
    the target_features section is missing, as with strip = true. Previously
    such builds skipped the externref transform, and #[wasm_bindgen(catch)]
    imports failed with externref table required for catch wrappers. A warning
    now recommends running wasm-opt on the wasm-bindgen output instead of
    strip = true.
    #​5382

  • String enums, numeric enums and dynamic unions with the same name in
    different modules of one crate are now handled like same-named items in
    different crates: two public definitions report that the name is exported
    multiple times, and private copies are numbered (Mode, Mode2, ...).
    Previously wasm-bindgen failed with dynamic union variant descriptor not found or duplicate enums.
    #​5381

  • private string enums and dynamic unions with the same name in different
    crates can now coexist, numbered like structs and numeric enums.
    #​5381

  • The TypeScript alias for a string enum that is only referenced through a
    dynamic union is now emitted.
    #​5376

  • Attributes on imported statics, such as doc comments, #[allow(...)],
    #[deprecated] and #[cfg(...)], are now applied to the generated static
    instead of being dropped.
    #​5377

  • Imported functions and statics from two different inline_js snippets no
    longer share one binding when they have the same name and signature. The
    snippet contents are now part of the generated shim name, so each import
    reads its own snippet's export.
    #​3878

  • Imported types with the same Rust name no longer share one instanceof
    check when their module, inline_js snippet, js_name or js_namespace
    differ. Imported static_string statics with the same name no longer share
    one string.
    #​5352

  • Imported functions with the same name and signature no longer share one
    binding when they differ in how JS is called: catch, variadic, final,
    slice_to_array, suspending, experimental_generic_mono, the method kind
    (constructor, static_method_of, getter, setter, indexing_*), or a
    js_name with characters that a shim name drops. Two
    experimental_generic_mono imports that differ only in one of these now
    both bind instead of failing the build.
    #​5352

  • debugString handles bigint values (e.g. 123n).
    #​5356

  • Fixed JSPI task pointers being truncated to 32 bits on wasm64.
    #​5358

  • Return pointers above 2 GiB on wasm32 (e.g. thread stacks allocated under
    +atomics) are no longer treated as negative offsets in the generated JS,
    which previously threw a RangeError on number and string conversions.
    #​5360

  • With --debug, passing a value that is not an object with a numeric
    length, such as an ArrayBuffer or a string, where Rust takes &[T],
    Vec<T>, Box<[T]> or Option<Vec<T>> now throws an error naming the
    expected and received types, instead of silently passing an empty or zeroed
    slice. &mut [T] arguments must be a typed array with the same element size
    and the same integer or float kind, since the results are copied back into
    its buffer.
    #​1961

  • Exported function arguments named like an identifier their generated JS
    glue binds or references, such as wasm, ret or a class name, no longer
    shadow it, which made calling the function throw. Such arguments get a
    numeric suffix in the JS, while the TypeScript definitions keep their name.
    #​3729

  • Getters generated by getter_with_clone no longer trigger the
    clippy::clone_on_copy lint.
    #​5363

v0.2.129

Compare Source

Added
  • Added the WebGL extension interface EXT_polygon_offset_clamp.
    #​5336

  • Added the texture-compression-unaligned variant to GpuFeatureName,
    matching the WebGPU specification.
    #​5335

  • Added an Emscripten Target page to the guide covering the
    wasm32-unknown-emscripten build flow, including the experimental
    #[wasm_bindgen(experimental_tokio)] attribute for driving an exported
    async function on a Tokio event-loop runtime there, gated behind
    --cfg wasm_bindgen_unstable_tokio.
    #​5334

  • Added experimental JSPI support on the wasm32-unknown-emscripten target,
    gated behind --cfg wasm_bindgen_unstable_jspi: #[wasm_bindgen(jspi)],
    #[wasm_bindgen(suspending)], jspi_block_on_promise and the JSPI context
    inheritance of spawn_local work when linking with -sJSPI and
    -sJSPI_HOOKS (or -sREENTRANT_JSPI). The fibers belong to Emscripten's
    JSPI runtime, which wasm-bindgen integrates with through its lifecycle hook
    exports instead of its own shadow stack management. jspi combines with
    experimental_tokio into a parked runtime: the export is a promising
    activation running its future with block_on on a Tokio runtime whose
    waits are JSPI suspensions, so invocations interleave at every wait.
    #​5333

Changed
  • Library MSRV bumped from 1.77 to 1.81, per the 2-year MSRV policy.
    #​5257
Fixed
  • js-sys: the Number constants no longer trigger deprecation warnings for
    the core::f64 module constants when building the crate from source.
    #​5351

  • The wasm_bindgen, wasm_bindgen_futures and js_sys crate-path options
    on a #[wasm_bindgen] impl block now apply to its methods; previously they
    were ignored there.
    #​5333

  • Struct field getters no longer trigger the unsafe_op_in_unsafe_fn lint
    (warn by default in edition 2024) when the field name comes from a
    macro_rules! body, for example through paste!.
    #​4465

  • The headless test runner now keeps the path of a remote WebDriver URL set
    with variables like CHROMEDRIVER_REMOTE. A driver at
    http://host/wd/hub/ now gets http://host/wd/hub/session instead of
    http://host/session.
    #​2841

  • The bundler entry module no longer re-exports #[wasm_bindgen(private)]
    items from *_bg.js, which does not export them.
    #​5343

  • web-sys: WebGL extension interfaces declared with LegacyNoInterfaceObject
    (OVR_multiview2, WEBGL_multi_draw, EXT_polygon_offset_clamp) now
    generate is_type_of = |_| false like their NoInterfaceObject counterparts.
    #​5336

  • The blanket From<E: Error> for JsError impl is now available without the
    std feature, using core::error::Error, so ? works in no_std crates.
    #​5029

  • Emscripten output no longer emits the instance reinit machinery, which
    Emscripten's JS compiler rejected (unescaped multi-line __postset, and
    var reinit_scheduled = let ...): schedule_reinit() is a no-op there since
    Emscripten owns instantiation. The closure finalization __postset is now
    emitted as an escaped string literal.
    #​5332

  • Updated walrus to 0.27.2, fixing --keep-debug output that wasm-opt -g
    could not process: .debug_loc entries for removed code were unparseable
    (debug_loc error), and DW_AT_high_pc was re-encoded as variable-width
    udata (compile unit size was incorrect).
    #​5328

  • The headless test runner no longer hangs on a WebDriver that never answers, or on
    a browser holding the driver's stdio pipes open.
    #​5338

  • The CLI's schema version mismatch error now names the input Wasm file and
    the path of the running wasm-bindgen binary.
    #​4430

  • #[wasm_bindgen(inspectable)] on a tuple struct no longer generates invalid
    JavaScript. The generated toJSON now reads the 0, 1, ... fields as
    this["0"] instead of this.0.
    #​2573

v0.2.128

Compare Source

Added
  • Added OffscreenCanvas overloads for the WebGL texImage2D, texSubImage2D,
    texImage3D and texSubImage3D functions, matching the TexImageSource
    typedef in the WebGL specification.
    #​5312

  • Added --split-debug-info to the CLI. This option extracts the DWARF debug
    info to a separate *_bg.debug.wasm file. Use --debug-info-url to set
    the recorded URL for the debug info. #​5279

  • Added #[wasm_bindgen(experimental_generic_mono)] for imported functions,
    which binds a generic import once per monomorphisation instead of erasing
    its type parameters to JsValue. It can be applied to an individual import
    or to a whole extern "C" block, which every generic function in the block
    then inherits. Each instantiation gets its own descriptor, so arguments and
    return values are marshalled at their concrete types (a u32 crosses as a
    number, a String as a string) rather than being boxed. Trait bounds,
    where predicates (including higher-ranked ones), associated-type
    projections, lifetime parameters, argument-position impl Trait, raw
    callbacks with owned generic inputs and returns, async, catch, and
    slice_to_array are all supported; see
    the guide
    for the supported surface and the shapes that are rejected. The attribute
    is experimental and may change as it stabilizes.
    #​5230
    #​5272
    #​5314

  • Added the experimental, sealed JsStringLike marker trait — implemented for
    String/&str (and js_sys::JsString/&js_sys::JsString in js-sys) —
    as a bound for experimental_generic_mono imports that accept any string
    shape at its native wire format.

  • #[wasm_bindgen(experimental_generic_mono)] now supports class-level generic
    parameters: an imported type that is itself generic (type Holder<T>),
    used as a method receiver (this: &Holder<T>), or as the return type of a
    constructor or self-returning static method (fn new<T>(value: T) -> Holder<T>). See Class-level generics
    in the guide.
    #​5290

  • A generic imported type used as a method receiver or a constructor's return
    type may now carry concrete generic arguments (this: &Holder<u32>,
    this: &Holder<u32, T>). The arguments are re-emitted as written, so the
    generated method hangs off impl Holder<u32> rather than the class's own
    parameter defaults.
    #​5290

  • Added experimental JSPI (JS Promise Integration) support: using it emits a
    compiler warning noting the experimental status.
    Supports #[wasm_bindgen(jspi)] on exports (sync or async), within which
    a #[wasm_bindgen(suspending)] import call can suspend to the JS event
    loop until its Promise settles. js_sys::futures::jspi_block_on_promise
    also suspends on any Promise inside a synchronous function, while
    spawn_local is context-aware: tasks spawned from within a JSPI context
    support synchronous JSPI suspensions throughout their call trees.
    Compatible with catch (rejections as Err), async, and
    panic=unwind.
    #​5193

  • Added a --ts-typed-array-buffers CLI flag to declare owned typed-array
    return values (e.g. Vec<u8>) as Uint8Array<ArrayBuffer> in generated
    TypeScript, since they are always copied into a fresh, non-shared
    ArrayBuffer. Requires TypeScript 5.7+.
    #​5263

Changed
  • Export shim symbols are now mangled with a per-crate hash, so identically
    named exports from different crates (or two versions of one crate) no
    longer fail the link with duplicate-symbol errors; the CLI restores the
    canonical names in the final module. Same-named #[wasm_bindgen(private)]
    structs/enums now coexist (numbered Name, Name2, ... internally in the
    generated bindings), while genuinely conflicting public exports are
    reported as a wasm-bindgen error instead of a wasm-ld failure. Requires
    matching wasm-bindgen and CLI versions (schema bump).
    #​2247

  • Setting js_namespace on both an extern "C" block and an item inside it
    is now a hard error. Nested paths must be written in a single attribute,
    e.g. js_namespace = ["a", "b"]. The previous behavior silently dropped
    the block-level namespace.
    #​4324

  • Changed WebGPU setImmediates APIs to take immutable u8 slice.
    #​5289

  • Changed Web Bluetooth writeValue / writeValueWithResponse /
    writeValueWithoutResponse and WebUSB controlTransferOut / transferOut
    / isochronousTransferOut APIs to take immutable u8 slices.
    #​5309

  • Emscripten glue no longer reads wasmExports['name'] inline inside inner
    functions. It now references the asmjs-mangled identifiers emcc's own
    top-level assignWasmExports receiving code binds for every wasm export
    (e.g. ___wbindgen_malloc, ___wbindgen_externrefs), which are the
    canonical DCE-graph pairs: wasm-metadce keeps exactly the exports the
    included glue uses (previously internal exports and the externref table
    could be stripped or left unrenamed by the import/export minifier at -O2,
    breaking at runtime). Hoisted classes are now emitted as =-prefixed
    string value snippets so jsifier declares them as
    export var Class = class Class {...} instead of an export class
    declaration, which crashes emcc's acorn-optimizer under
    -sMODULARIZE=instance.

Fixed
  • C-style #[wasm_bindgen] enums in Vec<T> / Box<[T]> now generate
    TypeScript and JSDoc as EnumName[] instead of any[].
    #​5321

  • Fixed js-sys failing to compile with no_std and the
    futures-core-03-stream feature enabled, since the feature unconditionally
    pulled in futures-util/std. The std feature of futures-util is now only
    enabled by the js-sys std feature.
    #​5322

  • The thread-bootstrap transform is now skipped in Emscripten mode, where the
    Emscripten runtime owns pthread startup and TLS. It previously ran on any
    module with shared memory and aborted the build (failed to find __wasm_init_tls), since Emscripten's linker had already consumed the
    synthetic symbols it looks for.
    #​5315

  • Fixed conflicting deprecation messages on web-sys dictionary fields that
    are themselves deprecated: the deprecated builder-style method no longer
    points at an equally-deprecated setter, and the WebAuthn fields removed from
    the specification (such as PublicKeyCredentialRpEntity's icon) now state
    why they are deprecated.
    #​5302

  • #[wasm_bindgen] on a struct now reports an actionable error when the path
    to the wasm_bindgen crate cannot be resolved (e.g. when wasm-bindgen is
    only a transitive dependency through web-sys), instead of a confusing
    recursion limit error.
    #​5295

  • Fixed js_namespace exports missing from the bundler target's entry module
    re-export list, making namespaces unreachable when importing the package.
    #​5267

  • The CLI now reports an actionable error when the __wasm_bindgen_unstable
    custom section is missing from a module that still contains wasm-bindgen
    shims (e.g. stripped by llvm-objcopy --strip-all, which removes all custom
    sections since LLVM 23), instead of the confusing
    import of `X` doesn't have an adapter listed.
    #​5268

  • The generated &T handle conversions (IntoWasmAbi/OptionIntoWasmAbi) for
    an imported type with lifetime parameters (type Holder<'a, T>) no longer
    reuse 'a for the reference itself. Previously the impl header declared only
    a fresh 'a plus the type's type parameters, so a type whose lifetime was
    not literally named 'a failed with E0261 against generated code, and one
    that was named 'a had its lifetime forced to unify with the borrow of
    &self — surfacing as E0521 whenever a generic method also had to resolve
    through the same impl.
    #​5290

  • An inline lifetime bound on a generic import (fn f<'a: 'b, 'b, T>(..)) is no
    longer dropped from the generated wrapper. Previously the bound was lost while
    the generated shim still declared it, so calling the import failed with
    "lifetime may not live long enough" reported against generated code.
    #​5290

  • A type-parameter default on a #[wasm_bindgen(experimental_generic_mono)] import is no
    longer silently ignored. It has no meaning there (every instantiation gets its
    own shim, so there is no single one to default) and rustc's own
    invalid_type_param_default lint cannot see it, since nothing of the original
    signature survives expansion; it is now rejected with the same
    defaults for generic parameters are not allowed here diagnostic rustc gives.
    Defaults on the type-erasure generic path are unaffected, where they remain
    meaningful.
    #​5290

  • Fix js-sys wasm64 build with atomics feature.
    #​5274

  • Declare initSync in the generated TypeScript definitions for
    --target no-modules, matching the wasm_bindgen.initSync function that
    the JS output already exposes.
    #​5284

  • Removed the last panicking code paths from externref table management:
    RefCell::borrow_mut() embedded panic location data (including the source
    path string) in .rodata of optimized builds, which not even wasm-opt
    could remove.
    #​5292

  • Fix --no-modules-global being ignored: the custom global name is now used
    for the generated JS binding and TypeScript declarations, and the name is
    validated as a JS identifier.
    #​5286

v0.2.127

Compare Source

Added
  • Navigation API
    to web-sys #​5247

  • Added riscv64gc-unknown-linux-gnu release artifacts.
    #​5265

  • Added JsNullable<T>, modeling WebIDL nullable types (T | null). Both
    null and undefined are treated as absent, per WebIDL's ECMAScript
    conversion rules; the canonical empty value produced from Rust is null.
    web-sys now uses JsNullable<T> instead of JsOption<T> for nullable
    types nested inside generics (e.g. Promise<GpuError?> from
    GPUDevice.popErrorScope()), fixing spec-defined null resolutions being
    treated as present values under JsOption<T>'s strict undefined-only
    semantics. JsNullable<T> participates in the same upcast lattice as
    JsOption<T> (including contravariant closure argument casts), and
    additionally upcasts from Null and from JsOption<T> itself. Imported
    extern types now also upcast into JsOption<JsValue> and
    JsNullable<JsValue>, so catch-all nullable closures can be used where a
    typed callback is expected.
    #​5234

Changed
  • Emscripten output now marks public exports (free functions, classes, enums,
    and namespace roots) with the __export: true and __force: true symbol
    attributes on their addToLibrary entries, instead of mutating
    EXPORTED_FUNCTIONS and pushing to extraLibraryFuncs at library-load time.
    The $initBindgen init closure is kept via __force: true, and private
    symbols (including namespace leaves) carry neither attribute — they remain
    reachable through __deps. Requires an emscripten with __export/__force
    symbol-attribute support.

  • Updated WebGPU bindings to the August 2026 spec, including the new
    GPUCommandEncoder::copy_buffer_to_buffer overloads and setImmediates.
    #​5246

  • Unstable API overload names now elide name tokens shared by every overload
    variant: LockManager::request_with_callback is now request, and
    request_with_options_and_callback is now request_with_options.
    #​5246

Fixed
  • The name property of the JS error thrown for panic=unwind is now set from
    a string literal instead of PanicError.name, so it survives minification.
    #​5260

  • Fixed Emscripten builds using pthreads failing to link.
    #​5254

  • __wbg_load in web targets now throws a clear error including the HTTP
    status and URL when given a non-ok fetch Response, instead of surfacing a
    misleading MIME-type or Wasm-magic-number error.
    #​5256

  • Restored __stack_pointer when an exception unwinds out of a wasm export,
    preventing repeated panic = "unwind" calls from leaking shadow-stack frames
    until the shadow stack is exhausted and calls trap. Node reports
    memory access out of bounds; poisoned instances can instead report
    Module terminated.
    #​5244

  • slice_to_array on a &mut slice (which silently discarded JS's writes) or
    on a slice with a generic element type is now a compile error, and strings
    and arrays received by JS (e.g. a Vec<String> return value) no longer make
    a redundant copy of the freshly built value.
    #​5261

  • Fixed async imports with non-JS-handle resolved types (e.g.
    async fn f() -> u32;) silently producing garbage since 0.2.109: the
    descriptor named the resolved type instead of the Promise handle that
    actually crosses the ABI.
    #5249

  • Fixed catch imports returning i64/u64 throwing a TypeError (and
    panicking in __wbindgen_exn_store) when the JS import throws, since the
    handleError catch path returned undefined which cannot be converted to
    a Wasm i64.
    #​5238

  • js_namespace is now part of an imported function's and imported static's
    generated shim name. Two imports with identical Rust signatures that differed
    only in their js_namespace hashed to the same __wbg_<name>_<hash>
    symbol, so they were treated as one binding and one of the two call sites
    silently invoked the wrong JS value.
    #​5250

  • Macro hygiene fixes - slice_to_array now works in #![no_std] crates.
    Generated code no longer names core or std unqualified.
    #​5251

  • Fixed length prefixes in descriptor strings to count chars rather than
    UTF-8 bytes, so non-ASCII names in js_name/typescript_type no longer
    panic the CLI or mis-bind the generated bindings.
    #​5248

  • Fixed threaded Wasm memory layout to reserve wasm-bindgen's internal thread
    page after the module's original initial memory instead of at __heap_base,
    avoiding overlap with allocators that resolve __heap_base/__heap_end at
    link time and treat that range as preexisting heap space.
    #​5225

  • Emscripten output now reaches wasm exports through emscripten's wasmExports
    object using bracket (string-literal) access (wasmExports['__wbindgen_start'])
    instead of a local wasm alias with dot access. wasmExports['name'] is the
    form emcc's DCE graph roots and its import/export minifier renames in the JS
    and the wasm together, so the glue now survives and stays consistent under
    -O3/-Os (previously the export names were minified without updating the JS
    call sites, e.g. __wbindgen_start is not defined).

  • The emscripten detection marker static is no longer leaked as public API.
    #​5220
    #​5222

v0.2.126

Compare Source

Changed
  • Emscripten output now hoists every clean export (free functions, classes,
    enums, plus their finalization registries and string-enum tables) out of the
    $initBindgen init closure into its own top-level addToLibrary symbol and
    self-registers it into EXPORTED_FUNCTIONS. emscripten then emits the clean
    API (add, Counter, ...) as named ESM exports under -sMODULARIZE=instance
    and as Module.<name> properties (via each symbol's __postset) in factory
    mode, with no extra sidecar files. Namespaced exports are reached through
    their namespace root (e.g. app), assembled in the root symbol's __postset.
    User module/inline-js imports are now wired as addToLibrary shims (they were
    previously dropped, since emcc resolves imports only against env), and their
    ESM-imported bindings are __wbg_-prefixed to avoid colliding with emcc
    runtime names such as Module/HEAP8.
    #​5210
Fixed
  • The descriptor interpreter now follows emscripten invoke_* trampolines.
    emscripten's exception/longjmp lowering rewrites direct calls into indirect
    calls through the function table wrapped in imported invoke_*(fnptr, ..args)
    helpers, including the describe helpers a descriptor function must reach. The
    interpreter resolves fnptr against the reconstructed function table, forwards
    the trailing arguments, and evaluates the surrounding "did it throw?" control
    flow (if/else, loop, br_table), so descriptors are interpreted
    correctly on emscripten builds with unwinding/longjmp enabled.
    #​5215

  • Relaxed alignment requirement for 8-byte types.
    #​5204

  • Fixed compilation with (feature = "std", panic = "unwind", target_feature = "atomics")
    and prevented a Task leak when a future unwinds out of poll (via a Rust
    panic or a foreign JS exception) in both the single-threaded and
    multi-threaded executors.
    #​5214

  • Headless Chrome/Edge tests now surface the WebDriver's own error message when
    session creation fails (e.g. a chromedriver/Chrome version mismatch) instead
    of a confusing http status: 404.
    #​5211

Removed

v0.2.125

Compare Source

Added
  • Added the --force-enable-abort-handler CLI flag, which emits the hard-abort
    detection and set_on_abort machinery on panic=abort builds. With
    panic=unwind this machinery is generated automatically; the flag does
    nothing there.
    #​5191
Changed
  • Made the internal __wbindgen_destroy_closure export private in the Rust API.
    #​5196

v0.2.123

Compare Source

Added
  • Added the maxAge attribute to the CookieInit dictionary in web-sys,
    matching the current Cookie Store API specification.
    #​5169

  • The js-sys futures codegen opt-in can now also be enabled via the
    WASM_BINDGEN_USE_JS_SYS=1 environment variable, in addition to
    --cfg=wasm_bindgen_use_js_sys. This works on stable when --target
    is in use, where Cargo does not propagate the cfg to host proc-macros.
    #​5164

Changed
  • JsOption<T> now treats only undefined as empty, aligning it with
    TypeScript's strict T | undefined semantics and with Option<T>'s wire
    shape (None ↔ undefined). Previously is_empty, as_option,
    into_option, unwrap, expect, unwrap_or_default, and
    unwrap_or_else treated both null and undefined as absent; JS null
    is now a distinct present value. The impl<T> UpcastFrom<Null> for JsOption<T> is removed (Undefined still models absence), and the
    Debug/Display absent placeholder changed from "null" to
    "undefined". Code relying on null → None should return undefined
    from the JS side, or check explicitly with
    val.as_option().filter(|v| !v.is_null()).
    #​5170
Fixed
  • Removed invalid js_sys::Array<T> to js_sys::ArrayTuple<(...)> upcasts.
    ArrayTuple encodes a fixed tuple arity, while a plain JavaScript array does
    not prove that arity statically.

  • Fixed incorrect variance in &mut reference upcasting. &mut T upcasts
    were covariant in the pointee, so a &mut T could be widened to a &mut
    of a supertype and used to write back a value the original type would not
    accept, leaving a reference whose static type no longer matches the value
    it points to. Mutable references are now invariant in their pointee:
    &mut T only upcasts to &mut Target when both Target: UpcastFrom<T>
    and T: UpcastFrom<Target> hold. This rejects the invalid widening but is
    a breaking change for callers that relied on widening &mut references.
    #​5176

  • Fixed WASI targets (wasm32-wasip1/wasm32-wasip2) emitting unresolved
    __wbindgen_placeholder__ imports, which broke component linking. The
    codegen and runtime gates now exclude target_os = "wasi" (restoring the
    pre-0.2.115 stub behavior), including the panic = "unwind" paths in
    wasm-bindgen-futures.
    #​5175

  • Fixed a panic ("Unhandled load width 8") in the descriptor interpreter when
    processing -Cinstrument-coverage-instrumented modules, unblocking
    cargo llvm-cov --target wasm32-unknown-unknown for crates whose describe
    helpers get instrumented.
    #​5179

  • Fixed main silently never running on wasm64 for bin crates.
    #​5181

v0.2.122

Compare Source

Notices
  • Threading support now requires -Clink-arg=--export=__heap_base to be set
    in RUSTFLAGS for nightly toolchains from 2026-05-06 onward, after
    rust-lang/rust#156174
    removed the implicit __heap_base/__data_end exports on wasm*
    targets. Atomics CI, CLI reference tests, and the nodejs-threads,
    raytrace-parallel, and wasm-audio-worklet examples have been
    updated to pass --export=__heap_base explicitly. The flag is
    backward-compatible with older nightlies.

  • -Cpanic=unwind on wasm targets now emits modern (exnref) exception
    handling by default after
    rust-lang/rust#156061,
    and requires Node.js 22.22.3+ (for WebAssembly.JSTag). Legacy EH wasm
    can still be produced on current nightlies by adding
    -Cllvm-args=-wasm-use-legacy-eh to RUSTFLAGS; Node.js 20 may be
    supported with legacy exception handling, with a tracking issue in
    #​5151.

Added
  • Implemented TryFromJsValue for Vec<T> where T: TryFromJsValue.
    A JS value converts when it is a real Array (per Array.isArray)
    and every element converts via T::try_from_js_value. This composes
    recursively (Vec<Vec<String>>, Vec<Option<T>>) and works for any
    T with a TryFromJsValue impl, including primitives, String,
    JsValue, and JsCast types. Array-likes (objects with length and
    numeric indices) are intentionally rejected to mirror the static ABI
    representation used by js_value_vector_from_abi.

  • New extends_js_class and extends_js_namespace attributes on
    exported structs to allow defining the parent js_class name when
    it has been customized by js_name and the parent's own js_namespace
    as well in turn. New validation is added at code generation time that
    will now catch these cases instead of emitting invalid code. Example:

    #[wasm_bindgen(js_name = "Animal", js_namespace = zoo)]
    pub struct AnimalImpl { /* ... */ }
    
    #[wasm_bindgen(
        extends = AnimalImpl,
        extends_js_class = "Animal",
        extends_js_namespace = zoo,
    )]
    pub struct DogImpl { /* ... */ }
    

    #​5154

Changed
  • When an exported struct uses js_namespace, the corresponding value
    must now be repeated on every impl block. Previously the impl-side
    defaults silently worked resulting in inconsistent emission. Example:

    // Before:
    #[wasm_bindgen(js_namespace = "default")]
    pub struct Counter { /* ... */ }
    
    #[wasm_bindgen]              // worked, but fragile
    impl Counter { /* ... */ }
    
    // After:
    #[wasm_bindgen(js_namespace = "default")]
    pub struct Counter { /* ... */ }
    
    #[wasm_bindgen(js_namespace = "default")]   // now required
    impl Counter { /* ... */ }
    

    To ease this transition for js_namespace usage, diagnostic
    messages now include hints for missing namespaces for easier
    fixing.

    #​5154

Fixed
  • Fixed the descriptor interpreter panicking on Br and BrIf
    instructions emitted by recent nightly compilers when building with
    panic=unwind.
    #​5158

  • Emscripten output now works against vanilla upstream emscripten without
    requiring a fork. Dependency tracking, HEAP_DATA_VIEW setup,
    function-decl intrinsic inlining, catch-wrapper gating, and imported
    global handling have all been corrected; ESM imports
    (#[wasm_bindgen(module = "...")] and snippets) are emitted to a
    sidecar library_bindgen.extern-pre.js consumers pass to emcc via
    --extern-pre-js; namespaced exports (js_namespace = [...] on a
    struct/impl) now attach to Module.<segments> instead of emitting
    top-level export const (which emcc's library evaluator rejects);
    the generated .d.ts for namespaced exports is now valid TypeScript
    (mangled identifiers stay module-internal via declare class /
    declare enum / declare function plus export { BindgenModule };
    to mark the file as a module; no spurious unqualified Calc:
    property on BindgenModule for namespaced items; namespace shapes
    land as plain interface members (app: { math: { Calc: typeof app__math__Calc } };) instead of the previously-emitted export let app: { ... }; which was invalid TS1131 syntax inside an
    interface body).
    #​5156

  • Fixed a duplicate phantom class being emitted for an exported struct
    renamed via js_name (Rust ident != JS class name) and/or placed in a
    js_namespace, when the struct crosses the boundary as a JsValue
    (e.g. via .into()). The WrapInExportedClass / UnwrapExportedClass
    imports were keyed by the Rust ident rather than the qualified JS name
    that exported_classes is keyed by (a regression from #​5154), so a
    fresh empty class entry was minted and emitted alongside the real one,
    with a free() referencing a nonexistent wasm export. Riding the
    same release's #​5154 wire-format bump, the now-vestigial rust_name
    field is dropped from the schema and the namespace-qualified name is
    no longer cached on AuxStruct, AuxEnum, or ExportedClass
    (derived on demand from (name, js_namespace)), collapsing three
    fallback chains that only papered over the pre-#​5154 keying.

    #​5160

v0.2.121

Compare Source

Added
  • Added the slice_to_array attribute for imported JS functions,
    which makes a &[T] (or Option<&[T]>) argument arrive on the JS
    side as a plain Array rather than a typed array — without
    changing the Rust-side &[T] signature. Useful when binding JS
    APIs that take T[] rather than TypedArray<T>. For primitive
    element kinds the wire is the same zero-copy borrow used by plain
    &[T], with the JS-side shim wrapping the view in Array.from(...)
    to materialise the Array — no extra allocation. For String,
    JsValue, and JS-imported element types the Rust side builds a
    fresh [u32] index buffer that JS reads and frees, with per-element
    &T -> JsValue (refcount bump for handle-shaped types). No T: Clone bound is required. The attribute can be set per-fn
    (#[wasm_bindgen(slice_to_array)] fn ...) or per-block on an
    extern "C" { ... } declaration to apply to every imported function
    in that block. &[ExportedRustStruct] remains unsupported (use
    owned Vec<T> for that). Has no effect on exported functions;
    default &[T] (typed-array view / memory borrow) and owned
    Vec<T> semantics are unchanged for callers that didn't opt in.
    See the
    slice_to_array guide page.
    #​5145

  • Added js_sys::AggregateError bindings (constructor, errors getter, and
    new_with_message / new_with_options overloads). AggregateError represents
    multiple unrelated errors wrapped in a single error, e.g. as thrown by
    Promise.any when all input promises reject, along with js_sys::ErrorOptions,
    accepted by built-in error constructors. ErrorOptions::new(cause)
    constructs an instance pre-populated with cause, and get_cause /
    set_cause provide typed access to the property. All standard error
    constructors that previously took only a message (EvalError,
    RangeError, ReferenceError, SyntaxError, TypeError, URIError,
    WebAssembly.CompileError, WebAssembly.LinkError,
    WebAssembly.RuntimeError) now expose a new_with_options(message, &ErrorOptions) overload, and Error gains
    new_with_error_options(message, &ErrorOptions) alongside the existing
    untyped new_with_options. AggregateError::new_with_options also takes
    &ErrorOptions.
    #​5139

  • Added inheritance for Rust-exported types: an exported struct may
    declare #[wasm_bindgen(extends = Parent)] to inherit from another
    exported #[wasm_bindgen] struct. The macro injects a hidden
    parent: wasm_bindgen::Parent<Parent> field (a refcounted cell around
    the parent value) and emits class Child extends Parent in the
    generated JS / .d.ts. The child gets an AsRef<Parent<Parent>> impl
    for the direct parent, and threads per-class pointer slots through
    the wasm ABI so that instanceof Parent is true and parent methods
    dispatch soundly via the JS prototype chain. From inside child
    methods, parent data is reached via self.parent.borrow() /
    self.parent.borrow_mut(). See the new
    extends guide page.
    #​5120

  • Added js_sys::FinalizationRegistry bindings (constructor, register,
    register_with_token, and unregister). The cleanup callback parameter
    is typed as &Function<fn(JsValue) -> Undefined>, so closures created via
    Closure::new can be passed using Function::from_closure (for owned
    closures retained by JS) or Function::closure_ref (for borrowed scoped
    closures). Pairs with the existing js_sys::WeakRef bindings.
    #​5140

  • Added support for well-known symbols in js_name, getter, and
    setter via the explicit bracket-string form
    "[Symbol.<name>]". This works for imported and exported methods,
    fields, getters, and setters. For example,
    #[wasm_bindgen(js_name = "[Symbol.iterator]")] on an exported method
    generates [Symbol.iterator]() { ... } on the generated JS class, and
    the same syntax works for getter / setter and for imported items.
    #​4230

  • Added level 2 bindings for ViewTransition to web-sys.
    #​5138

  • Add support for dynamic unions: a #[wasm_bindgen] enum that mixes string-literal
    variants with single-field tuple variants is now exported as an untagged TypeScript
    union and dispatched dynamically at the JS↔Rust boundary. The new enum-level
    #[wasm_bindgen(fallback)] attribute makes the last tuple variant an
    unconditional catch-all, supporting unions whose trailing variant has no
    runtime check (e.g., interface-only imports). String enums and dynamic
    unions now emit export type (was bare type) so the alias is a named
    export, and both honour the private flag to suppress the keyword.
    #​4734
    #​2153
    #​2088

Fixed
  • From<Promise<T>> for JsFuture<T> and IntoFuture for Promise<T> now
    accept any T: FromWasmAbi (rather than T: JsGeneric), letting
    imported async fns return dynamic-union enums.

  • TryFromJsValue for C-style enums no longer accepts non-numeric values
    via JS unary + coercion. Previously calling dyn_into::<MyEnum>() on
    a string would silently coerce it via +"foo" (yielding NaN, then
    NaN as u32 = 0) and could match a discriminant by accident; the
    conversion now returns None for any value that is not a JS number.
    #​4734

  • Fix compilation failure with no_std + release
    #​5134

  • Raw identifiers (r#name) on enums, enum variants, extern types, statics,
    and impl blocks no longer leak the r# prefix into generated JS / TS
    output and shim names. The Rust-side identifier and the JS-side name are
    now tracked separately for enum variants, and all known identifier
    fallback paths apply Ident::unraw() so e.g.
    pub enum r#Enum { r#A } generates Enum.A instead of producing
    syntactically invalid JS.
    #​4323

  • Using the -C panic=unwind option when building for the bundler target
    would produce invalid JS.
    #​5142

Changed
  • js_sys::DataView now implements the js_sys::TypedArray trait. A
    FIXME notes that the trait should be renamed to ArrayBufferView in
    the next major release to better reflect the WebIDL spec name covering
    both DataView and the typed-array types.
    #​5135

v0.2.120

Compare Source

Added
  • Added support for the wasm64-unknown-unknown target (memory64 / wasm64).
    usize / isize and raw pointers are now lowered through an f64 JS
    number ABI on wasm64 (matching the existing convention used for Option<u32>
    etc. on wasm32), with the CLI inspecting the module's memory type to pick
    the right codegen path. Includes a dedicated wasm64 CI job and test
    suite covering the new ABI paths.
    #​5004

  • Promise ergonomics: Promise::all_tuple and Promise::all_settled_tuple
    for heterogeneous concurrent awaits (arity 1..=8, destructure via
    .into_tuple()), and a new wasm_bindgen::IntoJsGeneric trait underpinning
    typed-Array inference (with codegen-emitted identity impls and a
    #[wasm_bindgen(no_into_js_generic)] opt-out for types like JsClosure).
    Also re-exports JsGeneric from the prelude. Typed collection on
    js_sys::Array<T> is exposed as the inherent constructor
    Array::<T>::from_iter_typed (and companion extend_typed), inferring T
    from the iterator item via IntoJsGeneric. The stable FromIterator /
    Extend impls on Array (= Array<JsValue>) bound by AsRef<JsValue>
    are preserved, so existing .collect::<Array>() call sites keep compiling
    unchanged. Fixes #​5042.
    #​5121,
    #​5125

  • Added wasm_bindgen::instance() to return the current
    WebAssembly.Instance. The generated JS glue retains the
    instantiated WebAssembly.Instance.
    #​5118

  • Added a --cfg=wasm_bindgen_use_js_sys opt-in that makes async macro codegen
    use js_sys::futures instead of wasm_bindgen_futures, dropping the need
    for wasm-bindgen-futures when the crate already depends on js-sys. A cfg
    is used rather than a Cargo feature so the choice stays scoped to the crate
    that opts in.
    #​5112
    #​5127

Changed
  • Simplified generated web-sys bindings by omitting redundant
    #[wasm_bindgen] attributes when they match wasm-bindgen defaults, including
    structural method annotations and matching js_name entries. The
    #[wasm_bindgen] attribute parser now also accepts string-literal forms for
    extends, static_method_of, and vendor_prefix (alongside the existing
    bare-path/ident syntax), and the generator emits these arguments along with
    js_name as string literals so rustfmt can format the generated
    #[wasm_bindgen(...)] attributes uniformly.
    #​5122
Fixed
  • Fixed namespaced export identifiers in generated JS/TS to use qualified names
    consistently, resolving order-dependent codegen issues across platforms. Also
    fixed Vec<T> types in TS signatures to resolve through the identifier map.
    #​5106

  • Fixed wasm-bindgen-test-runner treating ChromeDriver stderr warnings as
    startup failures on macOS, causing a restart loop until timeout. The runner
    no longer uses stderr output to determine if a driver has failed; instead a
    per-attempt timeout detects stuck drivers and retries on a new port.
    #​5111

v0.2.118

Compare Source

Added
  • Added Error::stack_trace_limit() and Error::set_stack_trace_limit() bindings
    to js-sys for the non-standard V8 Error.stackTraceLimit property.
    #​5082

  • Added support for multiple #[wasm_bindgen(start)] functions, which are
    chained together at initialization, as well as a new
    #[wasm_bindgen(start, private)] to register a start function without
    exporting it as a public export.
    #​5081

  • Reinitialization is no longer automatically applied when using panic=unwind
    and --experimental-reset-state-function, instead it is triggered by any
    use of the handler::schedule_reinit() function under panic=unwind,
    which is supported from within the on_abort handler for reinit workflows.
    Renamed handler::reinit() to handler::schedule_reinit() and removed
    the set_on_reinit() handler. The __instance_terminated address
    is now always a simple boolean (0 = live, 1 = terminated).
    #​5083

  • handler::schedule_reinit() now works under panic=abort builds. Previously
    it was a no-op; it now sets the JS-side reinit flag and the next export call
    transparently creates a fresh WebAssembly.Instance.
    #​5099

Changed
  • MSRV bump from 1.71 to 1.76 for the CLI, and 1.82 to 1.86 for the API
    #​5102
Fixed
  • ES module import statements are now hoisted to the top of generated JS
    files, placed right after the @ts-self-types directive. This ensures
    valid ES module output since import declarations must precede other
    statements.
    #​5103

  • Fixed two CLI issues affecting WASM modules built by rustc 1.94+. First,
    a panic (failed to find N in function table) caused by lld emitting element
    segment offsets as global.get $__table_base or extended const expressions
    instead of plain i32.const N for large function tables; the fix adds a
    const-expression evaluator in get_function_table_entry and guards against
    integer underflow in multi-segment tables. Second, the descriptor interpreter
    now routes all global reads/writes through a single globals HashMap seeded
    from the module's own globals, and mirrors the module's actual linear memory
    rather than a fixed 32KB buffer, so the stack pointer's real value is valid
    without any override. This fixes panics like failed to find 32752 in function table caused by GOT.func.internal.* globals being misidentified as the
    stack pointer.
    #​5076
    #​5080
    #​5093
    #​5095

v0.2.117

Compare Source

Fixed
  • Fixed a regression introduced in #​5026 where stable web-sys methods that
    accept a union type containing a [WbgGeneric] interface (e.g.
    ImageBitmapSource, which includes VideoFrame) incorrectly applied typed
    generics to all union expansions rather than only those whose argument type
    is itself [WbgGeneric]. In practice this caused Window::create_image_bitmap_with_*
    and the corresponding WorkerGlobalScope overloads to return
    Promise<ImageBitmap> instead of Promise<JsValue> for the stable
    (non-VideoFrame) call sites, breaking JsFuture::from(promise).await?.
    #​5064
    #​5073

  • Fixed handling logic for environment variable WASM_BINDGEN_TEST_ADDRESS in
    the test runner, when running tests in headless mode.
    #​5087

v0.2.116

Compare Source

Added
  • Added js_sys::Float16Array bindings, DataView float16 accessors using
    f32, and raw [u16] helper APIs for interoperability with binary16
    representations such as half::f16.
    #​5033
Changed
  • Updated to Walrus 0.26.1 for deterministic type section ordering.
    #​5069

  • The #[wasm_bindgen] macro now emits &mut (impl FnMut(...) + MaybeUnwindSafe)
    / &(impl Fn(...) + MaybeUnwindSafe) for raw &mut dyn FnMut / &dyn Fn
    import arguments instead of a hidden generic parameter and where-clause. The
    generated signature is cleaner and the MaybeUnwindSafe bound is visible
    directly in the argument position. The ABI and wire format are unchanged.
    When building with panic=unwind, closures that capture non-UnwindSafe
    values (e.g. &mut T, Cell<T>) must wrap them in AssertUnwindSafe before
    capture; on all other targets MaybeUnwindSafe is a no-op blanket impl.
    #​5056

v0.2.115

Compare Source

Added
  • console.debug/log/info/warn/error output from user-spawned Worker and
    SharedWorker instances is now forwarded to the CLI test runner during
    headless browser tests, just like output from the main thread. Works for
    blob URL workers, module workers, URL-based workers (importScripts), nested
    workers, and shared workers (including logs emitted before the first port
    connection). Non-cloneable arguments are serialized via String() rather
    than crashing the worker. The --nocapture flag is respected.
    #​5037

  • js_sys::Promise<T> now implements IntoFuture, enabling direct .await on
    any JS promise without a wrapper type. The wasm-bindgen-futures implementation
    has been moved into js-sys behind an optional futures feature, which is
    activated automatically when wasm-bindgen-futures is a dependency. All
    existing wasm_bindgen_futures::* import paths continue to work unchanged via
    re-exports. js_sys::futures is also available directly for users who want
    promise.await without depending on wasm-bindgen-futures.
    #​5049

  • Added --target emscripten support, generating a library_bindgen.js file
    for consumption by Emscripten at link time. Includes support for futures,
    JS closures, and TypeScript output. A new Emscripten-specific test runner is
    also included, along with CI integration.
    #​4443

  • Added VideoFrame, VideoColorSpace, and related WebCodecs dictionaries/enums to web-sys.
    #​5008

  • Added wasm_bindgen::handler module with set_on_abort and set_on_reinit
    hooks for panic=unwind builds. set_on_abort registers a callback invoked
    after the instance is terminated (hard abort, OOM, stack overflow).
    set_on_reinit registers a callback invoked after reinit() resets the
    WebAssembly instance via --experimental-reset-state-function. Handlers are
    stored as Wasm indirect-function-table indices so dispatch is safe even when
    linear memory is corrupt.

Changed
  • Replaced per-closure generic destructors with a single __wbindgen_destroy_closure
    export.
    #​5019

  • Refactored the headless browser test runner logging pipeline for dramatically improved
    performance (>400x faster on Chrome, >10x on Firefox, ~5x on Safari). Switched to
    incremental DOM scraping with textContent.slice(offset), append-only output semantics,
    unified log capture across all log levels on failure, and browser-specific invisible-div
    optimizations (display:none for Chrome/Firefox, visibility:hidden for Safari).
    #​4960

  • TTY-gated status/clear output in the test runner shell to avoid \r control-character
    artifacts in non-interactive (CI) environments.
    #​4960

  • Added bench_console_log_10mb benchmark alongside the existing 1MB benchmark for the
    headless test runner. The main branch cannot complete this benchmark at any volume.
    #​4960

  • Updated to Walrus 0.26
    #​5057

Fixed
  • Fixed argument order when calling multi-parameter functions in the
    wasm-bindgen interpreter by reversing the args collected from the stack.
    #​5047

  • Added support for per-operation [WbgGeneric] in WebIDL, restoring typed
    generic return types (e.g. Promise<ImageBitmap>) for createImageBitmap on
    Window and WorkerGlobalScope that were lost after the VideoFrame
    stabilization.
    #​5026

  • Fixed missing #[cfg(feature = "...")] gates on deprecated dictionary builder
    methods and getters for union-typed fields (e.g. {Open,Save,Directory}FilePickerOptions::start_in()),
    and fixed per-setter doc requirements to list each setter's own required features.
    #​5039

  • Fixed JsOption::new() to use undefined instead of null, to be compatible with Option::None and JS default parameters.
    #​5023

  • Fixed unsound unsafe transmutes in JsOption<T>::wrap, as_option, and into_option
    by replacing transmute_copy with unchecked_into(). Also tightened the JsGeneric
    trait bound and JsOption<T> impl block to require T: JsGeneric (which implies JsCast),
    preventing use with arbitrary non-JS types.
    #​5030

  • Fixed headless test runner emitting \r carriage-return sequences in non-TTY environments,
    which polluted captured logs in CI and complicated output-matching tests.
    #​4960

  • Fixed headless test runner printing incomplete and out-of-order log output on test failures
    by merging all five log levels into a single unified output div.
    #​4960

  • Fixed large test outputs (10MB+) causing oversized WebDriver responses that were either
    extremely slow or crashed completely, by switching to incremental streaming output collection.
    #​4960

  • Fixed a duplciate wasm export in node ESM atomics, when compiled in debug mode
    #​5028

  • Fixed a type inference regression (E0283: type annotations needed) introduced
    in v0.2.109 where the stable FromIterator and Extend impls on js_sys::Array
    were changed from A: AsRef<JsValue> to A: AsRef<T>. Because #[wasm_bindgen]
    generates multiple AsRef impls per type, the compiler could not uniquely resolve
    T, breaking code like Array::from_iter([my_wasm_value]) without explicit
    annotations. The stable impls are restored to A: AsRef<JsValue> (returning
    Array<JsValue>); the generic A: AsRef<T> forms remain available under
    js_sys_unstable_apis.
    #​5052

  • Fixed skip_typescript not being respected when using reexport, causing
    TypeScript definitions to be incorrectly emitted for re-exported items marked
    with #[wasm_bindgen(skip_typescript)].
    #​5051

Removed
webpack/webpack (webpack)

v5.112.2

Compare Source

Patch Changes

v5.112.1

Compare Source

Patch Changes

v5.112.0

Compare Source

Minor Changes
Patch Changes

v5.111.1

Compare Source

Patch Changes

v5.111.0

Compare Source

Minor Changes
Patch Changes

v5.110.3

Compare Source

Patch Changes

v5.110.2

Compare Source

Patch Changes

v5.110.1

Compare Source

Patch Changes

v5.110.0

Compare Source

Minor Changes
  • Wrap concatenated modules in lazy __webpack_require__.cw accessors and inline require(), keeping a wrapped body's names and side effects intact. (by @​hai-x in #​21519)

  • Add performance hints reporting what a build costs: duplicate packages and modules, circular dependencies, broad contexts, large modules and chunks, hotspots, eval, missing PURE annotations, polyfills, redundant dynamic imports, OS-dependent rules, cache effectiveness, how chunks load, what splitting refused, why an optimization was skipped, and rules, defines, externals, aliases and barrel reexports nothing uses. An oversized asset names its largest modules, and an entrypoint carrying the runtime recommends optimization.runtimeChunk. Enable every check not set individually with performance.all, report hints in stats only with performance.hints: "stats", and get them in a stable order that leaves the build hashes unchanged. (by @​alexander-akait in #​21841)

  • Add the descriptionRelativePath module rule condition. (by @​alexander-akait in #​21705)

  • Add OS-independent glob matching to module rules. (by @​alexander-akait in #​21771)

  • Report inner-graph, AMD and bare module bailouts in optimizationBailout. (by @​alexander-akait in #​21740)

  • Allow marking externals as side-effect-free with a sideEffects flag. (by @​alexander-akait in #​21712)

  • Give externals the original request of a context module element. (by @​alexander-akait in #​21780)

  • Add the externalsPresets.nodeModules preset with an allowlist option to externalize installed packages, replacing the webpack-node-externals plugin. (by @​alexander-akait in #​21569)

  • Add output.library.umdAmdContainer for an AMD-style loader branch in UMD. (by @​hai-x in #​21770)

  • Resolve @custom-media values that are true / false or name another custom media. (by @​alexander-akait in #​21624)

  • Add the __webpack_css_server_styles__ module variable to read the CSS collected while rendering without a DOM, and keep that CSS in the order the styles were applied. (by @​alexander-akait in #​21576)

  • Patch the HTML <head> in place on hot update instead of forcing a full reload, including when a <script> that never executed is removed. (by @​alexander-akait in #​21624)

  • Scope counter names in CSS modules; fix the counter() counter-style and animation timeline keywords. (by @​alexander-akait in #​21600)

  • Derive import defer / import source from the target and fix the source phase. (by @​alexander-akait in #​21810)

  • Emit analyzable ESM urls for chunks, assets, styles, workers and wasm. (by @​alexander-akait in #​21788)

  • Tree shake CommonJS: module.exports object literals, exports destructured from a require() binding, unused method requires, and unused side-effect-free require() calls and reexports. (by @​alexander-akait in #​21841)

  • Resolve relative entry baseUri values and bake one side of a hash cycle. (by @​alexander-akait in #​21750)

  • Minify CSS further, only where the document is unchanged: shorthands and box longhands, font-weight, <position> and font-stretch keywords, colors (polar, Lab and hsl() converted to hex), numbers, times, zero units, calc() and every math function the spec names folded over constants, selector lists, An+B, keyframe selectors, media-feature ranges, unicode-range, transition layers, display, transforms, gradients, font families, identical repeated declarations, and rules an identical later one makes dead. Abilities are read off the target browsers, vendorPrefixes adds and drops vendor prefixes for them, and rewriteCustomProperties shortens custom property values. Minification never changes whether a declaration parses, and beautifying keeps every rule. (by @​alexander-akait in #​21841)

  • Safely minify CSS (with source maps) and HTML assets when optimization.minimize is enabled, unless a minimizer is already configured for them, making only transformations an engine cannot tell apart. Every rewrite is named as an option, so it can be switched off. (by @​alexander-akait in #​21841)

  • Minify HTML further where the parsed document is unchanged: drop redundant quotes, whitespace nothing renders, escapes text does not need, implied tags, optional end tags nothing prints behind, empty attributes and nested empty elements; fold enumerated values and casing; normalize each attribute against the element it is on; and rewrite style, token lists, srcset, sizes, URL, integer and boolean attributes, viewport content, inline <style> and a JSON <script> body through their own grammars. Adds the optimization.minimize.html options collapseWhitespace, mergeStyles, minifyConditionalComments, minifySrcdoc, preserveComments, removeEmptyAttributes, removeEmptyElements, removeImpliedTags, removeRedundantAttributes, sortAttributes and sortTokenLists, and keeps an end tag the parent, the next element or the adoption agency would otherwise restructure the tree over. (by @​alexander-akait in #​21841)

  • Suggest the closest name or a casing fix anywhere in a failed request. (by @​alexander-akait in #​21727)

  • Add aggregated shutdown hook to MultiCompiler. (by @​bjohansebas in #​21578)

  • Report which compilers changed on the MultiCompiler done hook. (by @​bjohansebas in #​21580)

  • Add [containedpath]/[containedfile] placeholders, used for [path]/[file] of asset and html modules with experiments.futureDefaults. (by @​alexander-akait in #​21592)

  • Support an object for an entry's html that overrides output.html per option. (by @​alexander-akait in #​21574)

  • Configure or exclude each asset type's minifier via optimization.minimize. (by @​alexander-akait in #​21663)

  • Support printing CSS and HTML beautified as well as minified. (by @​alexander-akait in #​21660)

  • Add renderEmbeddedSource, and minify what it offers out of the box. (by @​alexander-akait in #​21830)

  • Report bindings named eval, arguments or reserved words in ES module output. (by @​alexander-akait in #​21567)

  • Emit no development source map for module libraries, or any with futureDefaults. (by @​alexander-akait in #​21839)

  • Speed up builds and cut memory: faster CSS, HTML and JavaScript parsing and minification, a built-in scope analyzer replacing eslint-scope, faster dependency hot paths, module diagnostics, CommonJS export scanning and concatenated module renaming, runtime modules, parsers, generators and dependencies loaded only when used, one file watcher pool shared between MultiCompiler children, and lower parser, graph and startup memory. (by @​alexander-akait in #​21841)

  • Improve tree-shaking for a namespace reexported as default, and fix import d from "./mod"; d.member reading undefined in that case. (by @​alexander-akait in #​21841)

  • Warn on cross-kind CSS module export conflicts and let the class win. (by @​alexander-akait in #​21538)

  • Add output.resourceHints.dedupe to skip prefetch links for already preloaded/prefetched chunks. (by @​alexander-akait in #​21386)

Patch Changes
  • Let a memory-cache etag mismatch fall through to the file cache instead of reporting a miss. (by @​alexander-akait in #​21624)

  • Determine provided exports in dependency order, so a build's module hashes no longer depend on what the persistent cache held. (by @​alexander-akait in #​21630)

  • Emit no dead module and no failing require for an asset-url external. (by @​alexander-akait in #​21713)

  • Fix names, hidden devtools and cache reuse for CSS maps inlined into JS. (by @​alexander-akait in #​21558)

  • Follow the HTML spec more closely when parsing and printing: frameset content, quirks paragraphs and selects, <![CDATA[ outside foreign content as a bogus comment, <?target data?> as a processing instruction, </> dropped, comment data and DOCTYPE identifiers read from the tokenizer states, attributes merged from a repeated <html>/<body> tag, legacy JavaScript script types, void keygen and font format detection — and hand back the tree a parsed document was built from when printing it. (by @​alexander-akait in #​21841)

  • Clear a Watching's blocked flag when its build starts, so it reports only a child actually waiting for its MultiCompiler parent. (by @​bjohansebas in #​21639)

  • Fix AMD define() output using the wrong module and exports argument names. (by @​hai-x in #​21814)

  • Fix ReferenceError from import.meta.main using the wrong module argument. (by @​hai-x in #​21620)

  • Leave a @namespace URI alone instead of resolving and rewriting it as an asset. (by @​alexander-akait in #​21658)

  • Resolve escaped CSS names, and scope a grid area cell name as one name. (by @​alexander-akait in #​21665)

  • Track exports usage of side-effect-free modules an active import() evaluates. (by @​hai-x in #​21623)

  • Resolve absolute symlink targets and treat an unreadable context as missing. (by @​alexander-akait in #​21647)

  • Fix corrupted icon URLs in a .webmanifest with a BOM or non-ASCII text. (by @​alexander-akait in #​21655)

  • Respect strictThisContextOnImports for require() member calls. (by @​hai-x in #​21601)

  • Fix import.meta, [object Object] asset urls and crashes in build-time executed modules. (by @​alexander-akait in #​21841)

  • Inherit sideEffects past a type-only nested package.json for files under node_modules. (by @​xiaoxiaojx in #​21686)

  • Do not fail directory creation when the file system reports it already exists. (by @​alexander-akait in #​21698)

  • Fix top-level using and await using declarations in modules. (by @​alexander-akait in #​21557)

  • Fix DefinePlugin optional chains reading an undefined object member. (by @​lazerg in #​21823)

  • Fix MultiCompiler: compute the common outputPath by whole path segments, run again after a dependency validation failure, and recover watch mode from a fatal child error without leaking watchings. (by @​alexander-akait in #​21841)

  • Keep a nested bundle's runtime tables separate when bundling webpack output. (by @​alexander-akait in #​21568)

  • Keep the runtime out of strict mode when output.globalObject reads this. (by @​alexander-akait in #​21715)

  • Run an even-priority __webpack_require__.O handler without waiting. (by @​alexander-akait in #​21803)

  • Treat top-level this in a classic worker entry as its global scope. (by @​alexander-akait in #​21720)

  • Rehash runtime modules whose code changes under a content-named filename. (by @​alexander-akait in #​21828)

  • Fix namespace object reexports and string export names in module library output and emit a CommonJS entry's default as export default. (by @​alexander-akait in #​21589)

  • Keep tree-shaken JSON arrays as arrays when a prototype property is read. (by @​hai-x in #​21599)

  • Generate every CSS and HTML lookup table into lib/{css,html}/data.js from mdn-data, color-name and the spec IDL — including the value-type facts read out of the CSS value-definition grammars — leaving both syntax.js files algorithm only. (by @​alexander-akait in #​21841)

  • Support UNC paths in module and context replacement plugins. (by @​avivkeller in #​21645)

  • Emit less runtime code: shorter syntax where output.environment allows, no IIFE for a RuntimeModule without locals, no unread __webpack_esm_id__ and exports.id chunk exports, and an ESM entry chunk installing its own modules from its local bindings instead of importing itself. (by @​alexander-akait in #​21841)

  • Release the compilation and file system caches retained after compiler.close(). (by @​alexander-akait in #​21603)

v5.109.2

Compare Source

Patch Changes
  • Resolve aliases pointing at a package directory whose name ends with .js again. (by @​alexander-akait in #​21542)

  • Name CSS sources in source maps by their resource path, without the css prefix. (by @​bjohansebas in #​21536)

  • Delete no longer referenced files from the filesystem cache directory after storing the cache, age them by recorded time so restored caches are cleaned too, and collect every fully expired pack in one store instead of one per build. (by @​bjohansebas in #​21528)

  • Report "universal" as the loader context target for the universal target. (by @​alexander-akait in #​21540)

  • Skip require().prop in dead branches gated by inlined imported constants. (by @​hai-x in #​21517)

  • Annotate configuration options and public hooks in the generated types with the @since JSDoc tag. (by @​bjohansebas in #​21473)

v5.109.1

Compare Source

Patch Changes
  • Fix stray semicolon emitted before an imported call following a parenthesized sequence element. (by @​alexander-akait in #​21533)

  • Make require(esm) module.exports re-export analysis independent of module processing order. (by @​alexander-akait in #​21521)

  • Ignore ERR_SERVER_NOT_RUNNING on lazy-compilation backend dispose so compiler.close() succeeds on Bun. (by @​alexander-akait in #​21521)

  • Name the failing key when DefinePlugin fails to evaluate a typeof value. (by @​alexander-akait in #​21503)

  • Improve Deno compatibility: guard setNoDelay and force-close connections on lazy-compilation backend dispose, and return a real ArrayBuffer from the Node async/sync wasm loader so WebAssembly.instantiate accepts it. (by @​alexander-akait in #​21524)

  • Speed up the HTML parser and cut its peak memory: module-scope helpers/state and tokenizer callbacks, plus exact AST column pre-sizing. (by @​alexander-akait in #​21492)

  • Track CommonJS build dependencies by parsing sources when require.cache children are unavailable (e.g. Bun). (by @​alexander-akait in #​21531)

  • Cook common string-literal escapes on the JS parser fast path and own the tokenizer's cold-path readers. (by @​alexander-akait in #​21500)

  • Build the CSS parseA* AST on the SoA store instead of node classes, cutting parse memory and time. (by @​alexander-akait in #​21498)

  • Speed up and cut memory of the experimental CSS and HTML parsers: drop two derivable AST node columns, and scan long string, url, comment, and plaintext token bodies natively. (by @​alexander-akait in #​21504)

  • Speed up non-modules CSS parsing: skip redundant token re-reads, drop selector-prelude tokens without materializing nodes, allocate rule preludes lazily, and fast-path empty list seals. (by @​alexander-akait in #​21511)

  • Speed up stats generation and cut its peak memory: reuse cached sort comparators instead of thrashing the comparator caches on every sort, and drop redundant module-graph lookups and allocations in the extractors. (by @​alexander-akait in #​21506)

  • Speed up CSS parsing: byte-range function-name checks, indexed sibling lookahead. (by @​bjohansebas in #​21520)

  • Reduce allocations and redundant work across the code-generation, module-concatenation, exports/usage-analysis, hashing, and chunk-splitting hot paths. (by @​alexander-akait in #​21516)

  • Enable the Node.js compile cache in the webpack CLI entry point. (by @​bjohansebas in #​21523)

  • Encode the persistent cache with V8's value serializer. (by @​avivkeller in #​21514)

  • Speed up SplitChunksPlugin: reject non-subset chunk sets with 64-bit signatures, cache unnamed entry keys, and drop per-module closures. (by @​avivkeller in #​21529)

  • Initialize NormalModule._ast in the constructor so each instance keeps a single hidden-class shape. (by @​alexander-akait in #​21515)

  • Reduce allocations in the binary serialization hot paths. (by @​alexander-akait in #​21526)

  • Deduplicate and simplify several lib modules and speed up AggressiveMergingPlugin. (by @​alexander-akait in #​21525)

  • Rename nested const/let __webpack_require__ and __webpack_exports__ declarations in bundled webpack output. (by @​hai-x in #​21508)

v5.109.0

Compare Source

Minor Changes
  • Default experiments.typescript to "auto", enabling built-in TypeScript support on Node.js >= 22.6 when no TypeScript loader is registered. (by @​alexander-akait in #​21398)

  • Default experiments.css, experiments.html and experiments.asyncWebAssembly to "auto", enabling built-in support unless a loader is registered for those files; modules with inline or hook-injected loaders (e.g. html-webpack-plugin templates) keep being parsed as JavaScript. (by @​alexander-akait in #​21365)

  • Add output.resourceHints to emit resource hints (preload/prefetch/modulepreload/preconnect), on by default for ESM output, plus module.parser.<type>.urlHints, css.fontPreload and javascript.dynamicImportCssPreload. (by @​alexander-akait in #​21408)

  • Add built-in build progress via infrastructureLogging.progress, plus estimatedTime, phaseTimings, progress bar width and progressBar: "auto" on ProgressPlugin. (by @​alexander-akait in #​21352)

  • Concatenate CommonJS modules with statically analyzable exports; opt out via optimization.concatenateModules: { commonjs: false }. (by @​alexander-akait in #​21417)

  • Wrap "weird" CommonJS modules into module concatenation instead of bailing out. (by @​alexander-akait in #​21436)

  • Add output.html.inline (true | "script" | "style") and the webpackInline magic comment to inline chunk content into HTML. (by @​alexander-akait in #​21260)

  • Add output.html.inject to control where chunk tags are injected. (by @​alexander-akait in #​21383)

  • Add output.html.title, output.html.meta and output.html.base options for head generation. (by @​alexander-akait in #​21394)

  • Support per-icon link attributes (sizes, media, color, type, crossorigin) and arrays in output.html.favicon. (by @​alexander-akait in #​21487)

  • Add output.html.manifest to generate and link a web app manifest with hashed icons. (by @​alexander-akait in #​21487)

  • Add output.html.csp to inject a Content-Security-Policy meta with inline-content hashes and an optional nonce. (by @​alexander-akait in #​21487)

  • Add the output.html injectTags compilation hook to inject tags (script/link/meta/…) with injectTo placement. (by @​alexander-akait in #​21487)

  • Add the output.html transformTags compilation hook to mutate, remove, or move (between <head> and <body>) a page's existing <script>/<link>/<style>/<meta> tags. (by @​alexander-akait in #​21487)

  • Extend the HTML pipeline with html link sources (bundled as their own emitted page) and rel="preload"/"prefetch" links bundled as chunks. (by @​alexander-akait in #​21346)

  • Recognize more asset-bearing HTML sources: the twitter:player:stream meta, legacy SVG references, and Web App Manifest icons/screenshots/shortcuts URLs. (by @​alexander-akait in #​21355)

  • Add module.parser.html.as to parse HTML as a document or an element fragment. (by @​alexander-akait in #​21441)

  • Allow disabling a built-in HTML parser source via type: false in sources. (by @​alexander-akait in #​21441)

  • Export webpack.html.HtmlModulesPlugin with transformHtml/htmlEmitted compilation hooks. (by @​alexander-akait in #​21487)

  • Resolve @custom-media (including media-type values) and @custom-selector in native CSS. (by @​alexander-akait in #​21442)

  • Scope view-transition-name/-group/-class names and ::view-transition-*() pseudo references in CSS modules under customIdents. (by @​alexander-akait in #​21486)

  • Add import.meta.glob support, with a caseSensitive option and consistent hidden/node_modules matching. (by @​alexander-akait in #​21385)

  • Resolve import.meta.resolve("./asset") to the emitted asset URL via the importMeta.resolve parser option. (by @​alexander-akait in #​21415)

  • Add import.meta.env defaults: MODE, DEV, PROD, SSR and BASE_URL. (by @​alexander-akait in #​21440)

  • Add fine-grained import.meta parser options. (by @​alexander-akait in #​21327)

  • Deprecate the importMetaContext parser option in favor of importMeta.webpackContext. (by @​alexander-akait in #​21360)

  • Emit analyzable new URL(…, import.meta.url), worker/worklet URL and import() references with literal specifiers for ESM module output. (by @​alexander-akait in #​21194)

  • Compile async modules to generators for targets without async/await. (by @​alexander-akait in #​21410)

  • Evaluate and validate the second argument of dynamic import(specifier, options). (by @​alexander-akait in #​21446)

  • Add module.parser.javascript.worklet to bundle Worklet addModule() entries. (by @​alexander-akait in #​21384)

  • Add ?raw, ?url, ?inline and ?no-inline asset query suffixes under experiments.futureDefaults. (by @​alexander-akait in #​21379)

  • Add an interop ("default" | "esModule") hint for object externals to control default-export interop. (by @​alexander-akait in #​21371)

  • Add an amd-async externals type that loads AMD externals without an AMD library wrapper. (by @​alexander-akait in #​21340)

  • Support cache.compression: "zstd" for the filesystem cache. (by @​alexander-akait in #​21438)

  • Warn on strict-mode-only syntax and semantic hazards in ES module output, configurable via the strictModeViolations parser option. (by @​alexander-akait in #​21387)

  • Support parsers without location APIs: locations derive from node offsets and AST nodes no longer carry loc. (by @​alexander-akait in #​21451)

  • Attach the original DOM event to ChunkLoadError and ScriptExternalLoadError as error.event. (by @​alexander-akait in #​21388)

  • Add output.wasmStreamingFallback for wasm fallback on a wrong MIME type. (by @​alexander-akait in #​21299)

  • Show why a module was marked as not cacheable in stats output. (by @​alexander-akait in #​21403)

  • Expose the active MultiWatching on MultiCompiler.watching. (by @​alexander-akait in #​21469)

  • Resolve git merge conflicts when parsing the build-http lockfile. (by @​alexander-akait in #​21397)

Patch Changes

v5.108.4

Compare Source

Patch Changes

v5.108.3

Compare Source

Patch Changes

v5.108.2

Compare Source

Patch Changes

v5.108.1

Compare Source

Patch Changes
  • Fix invalid property access for escaped namespace imports with multi-character mangled export names. (by @​xiaoxiaojx in #​21280)

  • Add frames to ProfilingPlugin TracingStartedInBrowser event so the trace loads in Chrome DevTools. (by @​alexander-akait in #​21269)

v5.108.0

Compare Source

Minor Changes
  • Treat top-level await and import.meta as ES module markers, matching Node.js syntax detection so no explicit module type is needed. (by @​alexander-akait in #​21218)

  • Add a bun target that emits ESM and externalizes bun:* and node.js built-in modules. (by @​alexander-akait in #​21248)

  • Support CommonJS reexports via Object.defineProperty value and getter descriptors. (by @​alexander-akait in #​21129)

  • Support JSON Schema const when generating CLI flags from a schema. (by @​alexander-akait in #​21087)

  • Support JSON Schema if/then/else when generating CLI flags from a schema. (by @​alexander-akait in #​21087)

  • Skip import specifiers, require() and import() calls in dead conditional branches gated by inlined imported constants (isDEV ? A : B), evaluated via getCondition. (by @​hai-x in #​21136)

  • CSS localIdentName [hash] now resolves to the local ident hash (matching css-loader); use [modulehash] for the module hash. (by @​alexander-akait in #​21259)

  • Add CSS parser as option and resolve url() inside HTML style attributes. (by @​alexander-akait in #​21157)

  • Add dedicated module classes for all built-in module types. (by @​alexander-akait in #​21164)

  • Support .html/.css for the default ./src entry under the html/css experiments. (by @​alexander-akait in #​21039)

  • Add defineConfig helper for typed configuration files. (by @​alexander-akait in #​21169)

  • Add a deno target (with versions, e.g. deno, deno2, deno1.40) that emits ESM, resolves node.js built-ins via the required node: specifier, and keeps Deno's own import protocols (npm:, jsr:, node:, http(s)://) external. (by @​alexander-akait in #​21247)

  • Use module-import for electron externals when the target supports ESM. (by @​alexander-akait in #​21184)

  • Add output.environment.logicalAssignment to emit ||= in runtime code when the target supports logical assignment operators. (by @​bjohansebas in #​21219)

  • Resolve and rewrite asset URLs inside <iframe srcdoc> in HTML modules. (by @​bjohansebas in #​21226)

  • Add HMR support for HTML modules with body/title DOM patching on update. (by @​alexander-akait in #​21011)

  • Add css-url html source type extracting url() references from CSS-valued attributes. (by @​alexander-akait in #​21250)

  • Add module.parser.html.sources option to disable or customize URL-attribute extraction for HTML modules, with script / script-module / stylesheet / stylesheet-inline types for custom attributes (by @​alexander-akait in #​21022)

  • Add module.parser.html.template option to transform HTML module source before parsing. (by @​alexander-akait in #​21055)

  • Extract more source URLs in HTML modules (SVG, legacy and obsolete attributes). (by @​alexander-akait in #​21241)

  • Inline export default <const> when the default-exported value is a primitive constant. (by @​hai-x in #​21189)

  • Support optimization.inlineExports for better tree-shaking. (by @​hai-x in #​20973)

  • Re-encode inline hash digests ([contenthash]/[chunkhash]/[fullhash]/[modulehash]) from the full content hash, so they carry full entropy and work under optimization.realContentHash and in dynamically-loaded chunk filenames; also preserve leading zero bytes in base-N digests. (by @​alexander-akait in #​21267)

  • Allow tree-shaking unused calls to /*#__NO_SIDE_EFFECTS__*/-annotated (pure) exports across module boundaries. (by @​hai-x in #​20907)

  • Defer building unused re-export targets of side-effect-free barrel modules. (by @​hai-x in #​21165)

  • Keep export mangling enabled for modules whose namespace object is used as a whole value, by materializing a decoupled namespace object that keeps the original export names. (by @​alexander-akait in #​21234)

  • Add output.environment.let option (paired with target's let capability) and emit let/const instead of var in generated runtime code wherever it is safe. Bindings that may be wrapped in runtime-condition if blocks (harmony imports, ConcatenatedModule external imports) continue to use var to preserve function scoping. (by @​alexander-akait in #​21010)

  • Add output.html to emit an HTML file per entrypoint, injecting its JS/CSS chunks (including dependOn shared chunks). (by @​alexander-akait in #​21215)

  • Add module.parser.javascript.pureFunctions to mark top-level names as side-effect-free for tree shaking. (by @​hai-x in #​21063)

  • Add universal to compiler.platform, true for universal targets ("universal" or ["web", "node"]). (by @​bjohansebas in #​21252)

  • Add output.strictModuleResolution to gate the runtime MODULE_NOT_FOUND guard. (by @​hai-x in #​21067)

  • Support an inline digest in hash path placeholders, e.g. [contenthash:base64:8]. (by @​alexander-akait in #​21259)

  • Support [uniqueName] and its [uniquename] alias in template paths. (by @​alexander-akait in #​21155)

  • Support CSS in Node for universal targets, collecting styles for SSR. (by @​alexander-akait in #​21208)

  • Improve commonjs, node-commonjs and global externals for universal targets. (by @​alexander-akait in #​21187)

  • Add a universal target preset (browser + web worker + Node.js + Electron + NW.js) that always outputs ECMAScript modules. (by @​alexander-akait in #​21214)

  • Support new Worker(new URL(...)) in universal (node + web) targets by resolving the Worker constructor from worker_threads when no global Worker exists. (by @​alexander-akait in #​21195)

  • Add output.workerChunkFilename and entry.worker for worker chunk filenames. (by @​alexander-akait in #​21128)

Patch Changes

v5.107.2

Compare Source

Patch Changes
  • Reduce per-file overhead in ContextModuleFactory.resolveDependencies by batching alternativeRequests hook calls. Previously the hook was invoked once per file in the context (with a single-item array), paying per-call overhead (closure allocation, resolverFactory.get, intermediate arrays in RequireContextPlugin) for every file. The hook is now invoked once per directory with all matched files in one batch — RequireContextPlugin's tap already iterates the items array, so the output is unchanged. Steady-state rebuild on a 4000-file require.context drops a further ~15 ms (after the watch-mode purge fix in the same release). (by @​alexander-akait in #​21020)

  • Include each external info's runtimeCondition in ConcatenatedModule#updateHash so changes to a concatenated external's runtime condition invalidate persistent caches instead of slipping through with the module id alone. (by @​alexander-akait in #​21023)

  • Fix HTML [contenthash] for referenced asset and inline-style URL changes. (by @​alexander-akait in #​21018)

  • Resolve chunk-hash placeholders in chunk URLs embedded into extracted HTML. (by @​alexander-akait in #​21018)

  • Remove unnecessary __webpack_require__ runtime helpers in ESM library output with multi-module chunks. (by @​xiaoxiaojx in #​21032)

  • Rewrite NormalModule#getSideEffectsConnectionState walk as an allocation-light iterative loop instead of a generator trampoline, restoring rebuild performance lost in #​20993 while keeping deep import chains stack-safe. (by @​alexander-akait in #​21014)

  • Fix runtime ReferenceError on the first activation of a lazy-compiled module when output.library.type produces a closure-wrapped bundle (umd, umd2, amd, amd-require, system). (by @​alexander-akait in #​21013)

    External modules of these types reference closure-bound identifiers like __WEBPACK_EXTERNAL_MODULE_react__, supplied by the library wrapper that is generated once per chunk. When lazyCompilation activates an entry or import for the first time, any external dependency the lazily-built module pulls in arrives in a hot-update chunk that lives outside the original wrapper closure, so its factory body cannot resolve the closure identifier and only a manual page refresh recovers.

    The inactive LazyCompilationProxyModule now declares statically-enumerable externals (string and object forms of externals) as its own dependencies, so the initial entry chunk's library wrapper already exposes their closure identifiers. When activation later pulls in those externals through the lazily-compiled module, they resolve to the already-installed factories instead of throwing. Function and RegExp externals are not pre-populated because their effective request set isn't knowable up front.

  • Fill in missing entryOptions when an async block joins an existing entrypoint. (by @​alexander-akait in #​21026)

  • Release per-child codeGenerationResults in MultiCompiler and at Compiler.close to reduce memory retention. (by @​alexander-akait in #​21015)

  • Reduce peak memory of SourceMapDevToolPlugin on large builds (closes #​20961). (by @​alexander-akait in #​20963)

  • Fix slow require.context() / dynamic import() rebuilds in watch mode (#​13636). When a file inside a watched context directory changed, NodeWatchFileSystem would call inputFileSystem.purge(contextDir). The enhanced-resolve purge implementation matches cache keys with key.startsWith(contextDir), so the stat cache of every file under the directory was discarded on every rebuild — ContextModuleFactory.resolveDependencies then re-stat-ed the whole tree on each rebuild. Single-file rebuilds on a 4000-file context now reuse the warm stat cache, dropping median rebuild from ~1260 ms to ~650 ms in a local reproduction (≈49%). For directory items that are explicitly watched contexts, purge is now called with { exact: true } (added in enhanced-resolve@5.22.0) so only the directory's own entry is invalidated; file-level changes in the same aggregated event continue to purge file stats and the parent readdir as before. (by @​alexander-akait in #​21020)

v5.107.1

Compare Source

Patch Changes
  • Align the experimental HTML tokenizer with the WHATWG spec: fix offset-range bugs in the script-data, content-mode end-tag, attribute-value, and EOF states; surface tokenizer parse errors to consumers via a new parseError callback ("warning" when the tokenizer recovers and the emitted token is still well-formed, "error" when the offset range is incomplete — e.g. eof-in-tag); and add the full WHATWG named character references table so decodeHtmlEntities handles all named entities (including legacy bare forms like &AMP and multi-code-point entities like &NotEqualTilde;) with proper longest-prefix backtracking. (by @​alexander-akait in #​21000)

  • Tree-shake CommonJS modules imported through a const NAME = require(LITERAL) binding when only static members of NAME are read. Previously webpack treated every export of such modules as referenced (because the bare require() dependency reports EXPORTS_OBJECT_REFERENCED), so unused exports.x = ... assignments remained in the bundle even with usedExports enabled. The parser now forwards NAME.x / NAME.x() / NAME["x"] accesses to the underlying CommonJsRequireDependency as referenced exports, falling back to the full exports object the moment NAME is read in any other context (passed by value, destructured later, accessed with a dynamic key, …). This brings the binding form to parity with the existing destructuring form (const { x } = require(...)). (by @​alexander-akait in #​21003)

  • Fix RangeError: Maximum call stack size exceeded thrown from HarmonyImportSideEffectDependency.getModuleEvaluationSideEffectsState on long linear chains of side-effect-free imports. NormalModule.getSideEffectsConnectionState previously descended through HarmonyImportSideEffectDependency.getModuleEvaluationSideEffectsState recursively, adding two stack frames per module, which overflowed V8's stack at a few thousand modules deep. The traversal is now iterative. (by @​alexander-akait in #​20993)

  • Fix NormalModuleFactory parser/generator types: (by @​alexander-akait in #​20999)

    • module.generator.html now uses HtmlGeneratorOptions instead of EmptyGeneratorOptions (the extract option was hidden from the createGenerator / generator hook types).
    • WebAssembly (webassembly/async, webassembly/sync) generator hooks now use EmptyGeneratorOptions instead of EmptyParserOptions.
    • NormalModuleFactory#getParser / createParser / getGenerator / createGenerator are now generic over the module-type string, returning the specific parser/generator class for known types (e.g. JavascriptParser for "javascript/auto", CssGenerator for "css", etc.) instead of always returning the base Parser / Generator.
    • NormalModuleCreateData is now generic over the module type so parser, parserOptions, generator, and generatorOptions are narrowed to the specific class / options for the given type.
  • Link import bindings used inside define(...) callbacks in ES modules. Previously, HarmonyDetectionParserPlugin skipped walking the arguments of define calls in harmony modules, so references to imported bindings inside an inline AMD define factory (e.g. define(function () { console.log(foo); })) were not rewritten to their imported references and could cause ReferenceError at runtime. Inner graph usage analysis is also fixed for the related pattern const fn = function () { foo; }; define(fn);. (by @​alexander-akait in #​20990)

  • HTML-entry pipeline (experiments.html + experiments.css): emit <link rel="stylesheet"> tags for CSS chunks reachable from a <script src> entry. Previously when the bundled JS imported CSS, the resulting .css file was emitted to disk but never referenced from the extracted HTML (no <link> tag), and when splitChunks extracted CSS into sibling chunks the HTML cloned the originating <script> for each one — producing <script src="style.js"> pointing at non-existent JS filenames instead of <link rel="stylesheet" href="style.css">. CSS chunks are now sorted by the entrypoint's module post-order index so the <link> tags also appear in source import order, fixing the cascade ordering issue documented in html-webpack-plugin#1838 and webpack/mini-css-extract-plugin#959 for HTML-entry builds. nonce/crossorigin/referrerpolicy are copied from the originating tag onto the emitted <link>. (by @​alexander-akait in #​21002)

  • Allow devtool and SourceMapDevToolPlugin (or multiple SourceMapDevToolPlugin instances) to coexist on the same asset. Previously the second instance would silently skip any asset whose info.related.sourceMap had already been set by an earlier instance, and even when it ran the asset had been rewrapped as a RawSource so no source map could be recovered — producing an empty .map file. The plugin now keeps a per-compilation stash of pristine source maps, namespaces its persistent cache entries by the options that affect output, and appends additional related.sourceMap entries instead of overwriting them. The classic workaround of pairing devtool: 'hidden-source-map' with a new webpack.SourceMapDevToolPlugin({ filename: '[file].secondary.map', noSources: true }) now produces both maps in a single build. (by @​alexander-akait in #​21001)

  • Narrow TemplatePathFn callback types by context. pathData.chunk is now non-optional for chunk filename callbacks (output.filename, chunkFilename, cssFilename, cssChunkFilename, htmlFilename, htmlChunkFilename, optimization.splitChunks.cacheGroups[*].filename), and pathData.module is non-optional for module filename callbacks (output.assetModuleFilename, per-module generator.filename / generator.outputPath, module.parser.css.localIdentName). (by @​alexander-akait in #​20987)

  • Tighten the CreateData typedef in NormalModuleFactory. CreateData now represents the fully-populated value passed to the createModule, module, and createModuleClass hooks (NormalModuleCreateData & { settings: ModuleSettings }), while ResolveData.createData is typed as Partial<CreateData> to reflect the empty initial state. Plugins tapping those hooks no longer need to cast individual fields away from optional. (by @​alexander-akait in #​20992)

  • Stop webpackPrefetch / webpackPreload magic comments from leaking across import() call sites that share a webpackChunkName. When two imports targeted the same named chunk and only one of them set webpackPrefetch: true, the prefetch directive was applied from every parent chunk that referenced the named chunk. Prefetch and preload orders are now resolved per import() call site instead of from the shared chunk group's accumulated options. (by @​alexander-akait in #​20994)

  • Fix [fullhash:N] and [hash:N] (with length suffix) in output.publicPath not being interpolated at runtime. The detection regex in RuntimePlugin only matched [fullhash] / [hash] without a length suffix, so the PublicPathRuntimeModule was not flagged as a full-hash module and __webpack_require__.p was emitted with the placeholder XXXX left in place (e.g. out/XXXX/) instead of the real hash truncated to the requested length. (by @​alexander-akait in #​21004)

  • Re-export ModuleNotFoundError from webpack/lib/ModuleNotFoundError for backward compatibility with old plugins that import it from that path. This re-export will be removed in webpack 6. (by @​alexander-akait in #​20988)

v5.107.0

Compare Source

Minor Changes
  • Add module.generator.javascript.anonymousDefaultExportName option to control whether webpack sets .name to "default" for anonymous default export functions and classes per ES spec. Defaults to true for applications and false for libraries (when output.library is set) to avoid unnecessary bundle size overhead. Also extract anonymous default export .name fix-up into a shared runtime helper (__webpack_require__.dn), replacing repeated inline Object.defineProperty / Object.getOwnPropertyDescriptor calls with a single short call per module to reduce output size. (by @​xiaoxiaojx in #​20894)

  • Support module concatenation (scope hoisting) for CSS modules with text, css-style-sheet, style, and link export types (by @​xiaoxiaojx in #​20851)

  • The generator.exportsConvention function form for CSS modules now accepts string[] in addition to string. (by @​alexander-akait in #​20914)

  • Add linkInsert hook to CssLoadingRuntimeModule.getCompilationHooks(compilation) so plugin developers can control where stylesheet <link> elements are inserted into the document. (by @​alexander-akait in #​20947)

  • Add CssModulesPlugin.getCompilationHooks(compilation).orderModules hook. (by @​alexander-akait in #​20978)

  • Add a pure parser option for css/module and css/auto types matching postcss-modules-local-by-default's pure mode: every selector must contain at least one local class or id, otherwise webpack emits a build error. (by @​alexander-akait in #​20946)

  • Support CSS Modules @value identifiers as @import URLs and inside url() functions, e.g. @value path: "./other.css"; @import path; and @value bg: "./image.png"; .a { background: url(bg); } (by @​alexander-akait in #​20925)

  • Add experimental TypeScript support via experiments.typescript: true (auto-enabled by experiments.futureDefaults). Uses Node.js's built-in module.stripTypeScriptTypes (Node.js >= 22.6 with the stable mode: "strip" API, including Node.js 26) to transform .ts, .cts, .mts, data:text/typescript, and data:application/typescript modules — no type checking, only erasable TypeScript (types, generics, import type, casts). .tsx/JSX and non-erasable syntax (enum, namespace, parameter-property constructors, decorator metadata) are NOT supported; use a TSX-capable loader (e.g. ts-loader, swc-loader) for those. (by @​alexander-akait in #​20964)

  • Added an experiments.html flag that reserves the html module type for the first-class HTML entry-point support. (by @​aryanraj45 in #​20902)

  • Preserve defer / source import phase keywords on external dependencies in ESM output, the same way import attributes are preserved. (by @​alexander-akait in #​20934)

  • Support the #__NO_SIDE_EFFECTS__ annotation to mark functions as pure for better tree-shaking. (by @​hai-x in #​20775)

  • Add module.generator.html.extract for HTML modules and the matching output.htmlFilename / output.htmlChunkFilename filename templates (defaults derived from output.filename / output.chunkFilename with .js swapped for .html, mirroring the CSS pipeline). When extraction is on, the parsed and URL-rewritten HTML is emitted as a standalone .html output file alongside the module's JavaScript export. (by @​alexander-akait in #​20979)

  • Add "module-sync" to default conditionNames for resolver defaults to align with Node.js, which exposes the module-sync community condition for synchronously-loadable ESM. (by @​alexander-akait in #​20933)

Patch Changes
  • Fix CSS modules composes so composes: foo from "./self.module.css" from inside self.module.css no longer creates a duplicate module instance. Fix CSS modules composes parsing so local() and global() function wrappers are tracked per class name. Fix CSS modules composes: ... from "<file>" so the composed files load in an order consistent with every rule's local composes order, instead of source first-appearance order. (by @​alexander-akait in #​20929)

  • Avoid emitting the __webpack_require__ runtime in CSS bundles when all imported CSS modules were concatenated into the same scope. (by @​alexander-akait in #​20936)

  • Recompute the CSS chunk's [contenthash] and the rendered CSS bytes when an asset referenced by url()/src()/string in CSS changes its hashed filename. (by @​alexander-akait in #​20938)

  • Embed an inline sourceMappingURL data URI inside the CSS when the parser.exportType option are text, style, or css-style-sheet. Also merge @imported CSS at build time for text and css-style-sheet exportTypes so the bundle ships a single accurate inline source map covering every contributing file. Map each generated CSS-module class export line in the JS bundle back to its selector position in the original CSS file (e.g. btn: "..." → .btn { ... }). (by @​alexander-akait in #​20886)

  • Fix CSS modules deduplication so a .module.<ext> file imported both directly (JS) and via icss (composes from / :import) becomes a single module instance. (by @​alexander-akait in #​20929)

  • Preserve @charset at-rule when CSS modules use exportType: "text". (by @​alexander-akait in #​20912)

  • Resolve [hash]/[fullhash] placeholders in output.publicPath when generating url() references for experiments.css. (by @​alexander-akait in #​20879)

  • Fix HMR for concatenated CSS modules with style exportType by using stable per-module identifiers for injected style elements and tracking inner module IDs of concatenated modules in HMR records (by @​xiaoxiaojx in #​20911)

  • Fix CSS Modules @value resolution when the same local name is imported from multiple modules. (by @​alexander-akait in #​20940)

  • Fix typeof ns.default / ns.default instanceof X on a static import defer * as ns from "./mod" for default-only and default-with-named external modules under optimization.concatenateModules. The concatenated-module rewrite was collapsing ns.default to the deferred-namespace proxy itself instead of routing through the optimized .a getter (which lazily evaluates the module and returns its default value), so typeof ns.default observed "object" (the proxy) rather than the type of the default. The dynamic exportsType already used .a correctly; default-only and default-with-named now match. (by @​alexander-akait in #​20910)

  • Make import defer * as ns more spec-compliant: ns.x = value no longer triggers module evaluation (per the TC39 import-defer [[Set]] algorithm), and the deferred namespace is now a distinct object from the eager namespace, with the same Deferred Module Namespace Exotic Object shared across defer-import call sites for the same module. (by @​alexander-akait in #​20913)

  • Fixed spec deviations in the deferred namespace object returned by __webpack_require__.z (import defer * as ns / import.defer(...)). (by @​alexander-akait in #​20910)

  • Drop the __webpack_require__, __webpack_require__.d, and __webpack_require__.o runtime helpers from library: { type: "module" } bundles when the on-demand exports source they were emitted for ends up dropped (e.g. a single concatenated entry without an IIFE). (by @​alexander-akait in #​20901)

  • Resolve the static specifier of a dynamic import() whose argument is a side-effect-free SequenceExpression, e.g. import((1, 0, "./mod.js")) is now treated the same as import("./mod.js") instead of being rejected as unresolvable. (by @​alexander-akait in #​20917)

  • Stable shared module ids and runtime-chunk emission order. (by @​imccausl in #​20860)

  • Fix snapshot validity check for context dependencies in watch mode by treating watchpack's existence-only entries ({}) as cache misses. (by @​alexander-akait in #​20916)

  • Support no-expression template literals in computed member access (e.g. import.meta[`url`]). (by @​alexander-akait in #​20889)

  • Improve tree-shaking in isPure: handle more expression types (ArrayExpression, ObjectExpression, NewExpression, ChainExpression, UnaryExpression (safe operators), MetaProperty, TaggedTemplateExpression, BinaryExpression (strict equality)), prevent /*#__PURE__*/ comments from leaking across ObjectExpression properties, and detect PURE comments inside TemplateLiteral interpolations. (by @​alexander-akait in #​20723)

  • Reject new import.defer(...) and new import.source(...) as a parse-time SyntaxError, matching the spec — ImportCall is a CallExpression and is not a valid operand of new. Parenthesized forms (new (import.defer(...))) remain valid and continue to throw TypeError at runtime as before. (by @​alexander-akait in #​20917)

  • Escape # characters that appear inside a path-shaped request's directory portion before passing the request to the resolver, so projects located in directories like /home/user/proj#1 (and tools like webpack-dev-server that build entry requests with query strings) resolve correctly. The escape only kicks in when the request contains both a # in the path portion and a ? query string — paths without a query keep their existing semantics. (by @​alexander-akait in #​20980)

  • Silence unhandled rejection from the prefetch trigger when chunk loading fails. The ensureChunkHandlers.prefetch runtime created Promise.all(promises).then(...) whose result is discarded by __webpack_require__.e. If chunk loading rejected (e.g. chunkLoadTimeout), that dangling chain produced an unhandled rejection. Prefetch is best-effort, so a no-op rejection handler is now attached. (by @​alexander-akait in #​20898)

  • Align require() of an ES module with Node.js's require(esm) "module.exports" named-export convention. When CommonJS require() resolves to an ES module that exports a binding with the literal string name "module.exports" (e.g. export { value as "module.exports" }), require() now returns the value of that export instead of the module's namespace object — matching Node.js v22.12+/v23+ behavior and easing migration of dual ESM/CJS libraries that rely on module.exports = …. The unwrap applies to plain require(), require().foo, calls (require()(…)), destructuring, and to CJS wrappers like module.exports = require(esm) / exports.x = require(esm). (by @​alexander-akait in #​20981)

  • Remove outdated @types/eslint-scope package from dependencies. (by @​alexander-akait in #​20869)

  • Fix export * resolution when a star-reexported module re-exports a name back to the importer cyclically. Previously, in a graph where a does export * from "./b"; export * from "./c"; and b does export { foo } from "./a"; while c provides the actual foo binding, webpack hoisted foo from b into a's namespace without per-name cycle detection — emitting a getter chain (a.foo → b.foo → a.foo) that threw "Maximum call stack size exceeded" at runtime. The TC39 ResolveExport algorithm requires the cyclic branch to return null and the star loop to fall through to the non-cyclic source. (by @​alexander-akait in #​20959)

  • Preserve using declaration initializers when the inner graph optimization is enabled. (by @​hai-x in #​20906)

  • Fixed typescript types. (by @​alexander-akait in #​20880)

  • Bump webpack-sources to ^3.4.1 and feed asset bytes into hashes via the new Source.prototype.buffers() API. For large ConcatSource/ReplaceSource outputs this avoids the intermediate Buffer.concat that source.buffer() performs, removing a peak-memory spike equal to the source's total size on each hashed asset (AssetGenerator.getFullContentHash, CssIcssExportDependency content hashing, and RealContentHashPlugin). A small benchmark on a 64 MiB ConcatSource shows ~64 MiB lower peak external memory and ~45% faster hashing. (by @​alexander-akait in #​20897)

v5.106.2

Compare Source

Patch Changes
  • CSS @​import now inherits the parent module's exportType, so a file configured as "text" correctly creates a style tag when @​imported by a "style" parent. (by @​xiaoxiaojx in #​20838)

  • Make asset modules available in JS context when referenced from both CSS and a lazily compiled JS chunk. (by @​xiaoxiaojx in #​20801)

  • Include missing generator options in hash to ensure persistent cache invalidation when configuration changes (CssGenerator exportsOnly, JsonGenerator JSONParse, WebAssemblyGenerator mangleImports). (by @​xiaoxiaojx in #​20821)

  • Fix || default value handling in ProgressPlugin and ManifestPlugin that incorrectly overrode user-provided falsy values (e.g. modules: false, entries: false, entrypoints: false). (by @​xiaoxiaojx in #​20823)

  • Migrate from mime-types to mime-db. (by @​alexander-akait in #​20812)

  • Handle @charset at-rules in CSS modules. (by @​alexander-akait in #​20831)

  • Marked all experimental options in types. (by @​alexander-akait in #​20814)

v5.106.1

Compare Source

Patch Changes
  • Fix two ES5-environment regressions in the anonymous default export .name fix-up: the generated code referenced an undeclared __WEBPACK_DEFAULT_EXPORT__ binding causing ReferenceError, and used Reflect.defineProperty which is not available in pre-ES2015 runtimes. The fix-up now references the real assignment target and uses Object.defineProperty / Object.getOwnPropertyDescriptor. (by @​xiaoxiaojx in #​20796)

  • Prevent !important from being renamed as a local identifier in CSS modules. (by @​xiaoxiaojx in #​20798)

  • Use compiler context instead of module context for CSS modules local ident hashing to avoid hash collisions when files with the same name exist in different directories. (by @​xiaoxiaojx in #​20799)

v5.106.0

Compare Source

Minor Changes
  • Add exportType: "style" for CSS modules to inject styles into DOM via HTMLStyleElement, similar to style-loader functionality. (by @​xiaoxiaojx in #​20579)

  • Add context option support for VirtualUrlPlugin (by @​xiaoxiaojx in #​20449)

    • The context for the virtual module. A string path. Defaults to 'auto', which will try to resolve the context from the module id.
    • Support custom context path for resolving relative imports in virtual modules
    • Add examples demonstrating context usage and filename customization
  • Generate different CssModule instances for different exportType values. (by @​xiaoxiaojx in #​20590)

  • Added the localIdentHashFunction option to configure the hash function to be used for hashing. (by @​alexander-akait in #​20694)
    Additionally, the localIdentName option can now be a function.

  • Added support for destructuring assignment require in cjs, allowing for tree shaking. (by @​ahabhgk in #​20548)

  • Added the validate option to enable/disable validation in webpack/plugins/loaders, also implemented API to make it inside plugins. (by @​xiaoxiaojx in #​20275)

  • Added source support for async WASM modules. (by @​magic-akari in #​20364)

Patch Changes
  • Add a static getSourceBasicTypes method to the Module class to prevent errors across multiple versions. (by @​xiaoxiaojx in #​20614)

  • Included fragment groups in the conflicting order warning for CSS. (by @​aryanraj45 in #​20660)

  • Avoid rendering unused top-level __webpack_exports__ declaration when output ECMA module library. (by @​hai-x in #​20669)

  • Fixed resolving in CSS modules. (by @​alexander-akait in #​20771)

  • Allow external modules place in async chunks when output ECMA module. (by @​hai-x in #​20662)

  • Implement deprecate flag in schema for better TypeScript support to show which options are already deprecated by the configuration (by @​bjohansebas in #​20432)

  • Set .name to "default" for anonymous default export functions and classes per ES spec (by @​xiaoxiaojx in #​20773)

  • Hash entry chunks after runtime chunks to prevent stale content hash references in watch mode (by @​xiaoxiaojx in #​20724)

  • Fix multiple bugs and optimizations in CSS modules: correct third code point position in walkCssTokens number detection, fix multiline CSS comment regex, fix swapped :import/:export error message, fix comma callback incorrectly popping balanced stack, fix cache comparison missing array length check, fix match.index mutation side effect, move publicPathAutoRegex to module scope, precompute merged callbacks in consumeUntil, simplify redundant ternary in CssGenerator, fix typo GRID_TEMPLATE_ARES, remove duplicate grid-column-start, and merge duplicate getCompilationHooks calls. (by @​xiaoxiaojx in #​20648)

  • Correct url() path resolution and preserve source maps for non-link CSS export types (style, text, css-style-sheet) (by @​xiaoxiaojx in #​20717)

  • Emit error when proxy server returns non-200 status code in HttpUriPlugin instead of silently failing. (by @​xiaoxiaojx in #​20646)

  • import.meta as standalone expression now returns a complete object with known properties (url, webpack, main, env) instead of an empty object ({}), and hoists it as a module-level variable to ensure import.meta === import.meta identity. In preserve-unknown mode (ESM output), the hoisted object merges runtime import.meta properties via Object.assign. (by @​xiaoxiaojx in #​20658)

  • Fix incorrect condition in FileSystemInfo that always evaluated to false, preventing trailing slash removal from directory paths during build dependency resolution. (by @​xiaoxiaojx in #​20649)

  • fix: VirtualUrlPlugin absolute path virtual module IDs getting concatenated with compiler context (by @​xiaoxiaojx in #​20656)

    When a virtual module ID is an absolute path (e.g. virtual:C:/project/user.js), the auto-derived context was incorrectly joined with compiler.context, producing a concatenated path like C:\cwd\C:\project. Now absolute-path contexts are used directly.

  • All deprecated methods and options now have @deprecated flag in types. (by @​alexander-akait in #​20707)

  • Fix CompatibilityPlugin to correctly rename __webpack_require__ when it appears as an arrow function parameter (e.g. (__webpack_module, __webpack_exports, __webpack_require__) => { ... }). (by @​hai-x in #​20661)


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate CLI.

This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [insta](https://insta.rs/) ([source](https://github.com/mitsuhiko/insta)) | dev-dependencies | minor | `1.46.3` → `1.49.0` | | [jest](https://jestjs.io/) ([source](https://github.com/jestjs/jest/tree/HEAD/packages/jest)) | devDependencies | minor | [`30.3.0` → `30.5.2`](https://renovatebot.com/diffs/npm/jest/30.3.0/30.5.2) | | [prettier](https://prettier.io) ([source](https://github.com/prettier/prettier)) | devDependencies | minor | [`3.8.1` → `3.9.10`](https://renovatebot.com/diffs/npm/prettier/3.8.1/3.9.10) | | [pyo3](https://pyo3.rs/) ([source](https://github.com/pyo3/pyo3)) | dependencies | minor | `0.28.2` → `0.30.0` | | [rust](https://rust-lang.org/) ([source](https://github.com/rust-lang/rust), [changelog](https://github.com/rust-lang/rust/blob/main/RELEASES.md)) | toolchain | minor | `1.94.0` → `1.99.1` | | [sass](https://github.com/sass/dart-sass) | devDependencies | minor | [`1.98.0` → `1.107.1`](https://renovatebot.com/diffs/npm/sass/1.98.0/1.107.1) | | [serde](https://serde.rs) ([source](https://github.com/serde-rs/serde)) | dev-dependencies | patch | `1.0.228` → `1.0.229` | | [serde](https://serde.rs) ([source](https://github.com/serde-rs/serde)) | dependencies | patch | `1.0.228` → `1.0.229` | | [terser-webpack-plugin](https://github.com/webpack/minimizer-webpack-plugin) | devDependencies | minor | [`5.4.0` → `5.6.1`](https://renovatebot.com/diffs/npm/terser-webpack-plugin/5.4.0/5.6.1) | | [test-case](https://github.com/frondeus/test-case) | dev-dependencies | minor | `3.3.1` → `3.4.1` | | [thiserror](https://github.com/dtolnay/thiserror) | dependencies | patch | `2.0.18` → `2.0.21` | | [ts-jest](https://kulshekhar.github.io/ts-jest) ([source](https://github.com/kulshekhar/ts-jest)) | devDependencies | patch | [`29.4.6` → `29.4.15`](https://renovatebot.com/diffs/npm/ts-jest/29.4.6/29.4.15) | | [ts-loader](https://github.com/TypeStrong/ts-loader) | devDependencies | minor | [`9.5.4` → `9.6.2`](https://renovatebot.com/diffs/npm/ts-loader/9.5.4/9.6.2) | | [tslib](https://www.typescriptlang.org/) ([source](https://github.com/Microsoft/tslib)) | devDependencies | minor | [`2.8.1` → `2.9.1`](https://renovatebot.com/diffs/npm/tslib/2.8.1/2.9.1) | | [wasm-bindgen](https://wasm-bindgen.github.io/wasm-bindgen) ([source](https://github.com/wasm-bindgen/wasm-bindgen)) | dependencies | patch | `0.2.114` → `0.2.130` | | [wasm-bindgen-test](https://github.com/wasm-bindgen/wasm-bindgen) | dev-dependencies | patch | `0.3.64` → `0.3.80` | | [webpack](https://github.com/webpack/webpack) | devDependencies | minor | [`5.105.4` → `5.112.2`](https://renovatebot.com/diffs/npm/webpack/5.105.4/5.112.2) | --- ### Release Notes <details> <summary>mitsuhiko/insta (insta)</summary> ### [`v1.49.0`](https://github.com/mitsuhiko/insta/blob/HEAD/CHANGELOG.md#1490) [Compare Source](https://github.com/mitsuhiko/insta/compare/1.48.0...1.49.0) - Allow `Option<&OsStr>` snapshot names, such as `Path::file_name()`, without explicit string conversion. [#&#8203;929](https://github.com/mitsuhiko/insta/issues/929) ([@&#8203;dislogical](https://github.com/dislogical)) - Add prebuilt `cargo-insta` binaries for ARM64 Linux (`aarch64-unknown-linux-gnu`). [#&#8203;942](https://github.com/mitsuhiko/insta/issues/942) ([@&#8203;aljohri](https://github.com/aljohri)) - Fix JSON serialization of maps keyed by unit enum variants. Keys use the serialized variant name, including serde renames. [#&#8203;934](https://github.com/mitsuhiko/insta/issues/934) ([@&#8203;teddytennant](https://github.com/teddytennant)) - Remove trailing semicolons from serialization macro bodies to avoid compiler warnings when used in expression position. [#&#8203;940](https://github.com/mitsuhiko/insta/issues/940) ([@&#8203;Tiwalun](https://github.com/Tiwalun)) - Mention `INSTA_UPDATE=always` in snapshot mismatch hints for file snapshots. [#&#8203;927](https://github.com/mitsuhiko/insta/issues/927) ([@&#8203;hiro-nikaitou](https://github.com/hiro-nikaitou)) - Update the lockfile's `tempfile` and `rustix` dependencies to fix builds with newer Rust toolchains. [#&#8203;939](https://github.com/mitsuhiko/insta/issues/939) - Fix `cargo insta test --all-targets --test-runner nextest` failing with "Can't mix --doc with other target selecting options". Like `cargo test --all-targets`, it no longer runs doctests. [#&#8203;460](https://github.com/mitsuhiko/insta/issues/460) ### [`v1.48.0`](https://github.com/mitsuhiko/insta/blob/HEAD/CHANGELOG.md#1480) [Compare Source](https://github.com/mitsuhiko/insta/compare/1.47.2...1.48.0) - Add `strip_ansi_escape_codes` setting which removes ANSI escape sequences (color codes, cursor movement, etc.) from snapshot content before comparison. Requires the `filters` feature. [#&#8203;899](https://github.com/mitsuhiko/insta/issues/899) ([@&#8203;pierluigilenoci](https://github.com/pierluigilenoci)) - Add opt-in support for YAML literal blocks for multiline strings in snapshot metadata fields such as `description` and `expression`. Set `INSTA_YAML_BLOCK_STYLE=1` to enable. [#&#8203;851](https://github.com/mitsuhiko/insta/issues/851) ([@&#8203;ivov](https://github.com/ivov)) - Setting `CI=true` normally makes `cargo insta test` behave as though `--check` was passed. Explicit snapshot handling options such as `--accept` now take precedence over this environment variable, allowing users to override this behavior if they want to. [#&#8203;924](https://github.com/mitsuhiko/insta/issues/924) - Fix `cargo insta test --profile` being forwarded to nextest as the nextest profile instead of the cargo build profile; it now translates to `--cargo-profile` for the nextest runner. Add `--nextest-profile` to select the nextest profile. [#&#8203;910](https://github.com/mitsuhiko/insta/issues/910) - Fix `cargo insta pending-snapshots` printing unusable `\\?\`-prefixed paths on Windows. The `--snapshot` filter now also accepts partial paths: any trailing path suffix of the snapshot file matches, so a bare `--snapshot my_test.snap` works. [#&#8203;904](https://github.com/mitsuhiko/insta/issues/904) - Accepting a binary snapshot no longer fails with `os error 2` when its data file is missing (e.g. gitignored and not committed). [#&#8203;914](https://github.com/mitsuhiko/insta/issues/914) ### [`v1.47.2`](https://github.com/mitsuhiko/insta/blob/HEAD/CHANGELOG.md#1472) [Compare Source](https://github.com/mitsuhiko/insta/compare/1.47.1...1.47.2) - Restore `Send + Sync` on `Settings`, `Redactions`, and `Redaction` by reverting the `Arc` to `Rc` change from 1.47.0, which was semver-breaking. [#&#8203;873](https://github.com/mitsuhiko/insta/issues/873) [#&#8203;874](https://github.com/mitsuhiko/insta/issues/874) - Add `Send + Sync` bounds to `Comparator` trait for consistency with `Arc`-based storage. [#&#8203;872](https://github.com/mitsuhiko/insta/issues/872) - Add compile-time assertion to prevent future auto-trait regressions. ### [`v1.47.1`](https://github.com/mitsuhiko/insta/blob/HEAD/CHANGELOG.md#1471) [Compare Source](https://github.com/mitsuhiko/insta/compare/1.47.0...1.47.1) - Revert sorting of sequences in `sort_maps`. The change in 1.47.0 sorted all `Seq` values (including `Vec`), not just non-deterministic collections like `HashSet`, which was a breaking change. [#&#8203;876](https://github.com/mitsuhiko/insta/issues/876) ### [`v1.47.0`](https://github.com/mitsuhiko/insta/blob/HEAD/CHANGELOG.md#1470) [Compare Source](https://github.com/mitsuhiko/insta/compare/1.46.3...1.47.0) - Add `Comparator` trait for customizing how snapshot values are compared. [#&#8203;872](https://github.com/mitsuhiko/insta/issues/872) ([@&#8203;dstu](https://github.com/dstu)) - Sort sequences in `sort_maps` to fix non-deterministic `HashSet` snapshots. [#&#8203;876](https://github.com/mitsuhiko/insta/issues/876) - Improve TOML serialization error message for unsupported types, suggesting `assert_json_snapshot!` or `assert_yaml_snapshot!` as alternatives. [#&#8203;880](https://github.com/mitsuhiko/insta/issues/880) - Remove unnecessary `Send + Sync` bounds from `Redaction`, allowing non-`Send` closures in dynamic redactions. [#&#8203;874](https://github.com/mitsuhiko/insta/issues/874) - Don't use `Arc` in `Settings` unnecessarily. [#&#8203;873](https://github.com/mitsuhiko/insta/issues/873) ([@&#8203;dstu](https://github.com/dstu)) - Upgrade `console` to 0.16 and MSRV to 1.66. [#&#8203;885](https://github.com/mitsuhiko/insta/issues/885) - Upgrade `toml-edit` to 0.25. [#&#8203;882](https://github.com/mitsuhiko/insta/issues/882) ([@&#8203;alexanderkjall](https://github.com/alexanderkjall)) </details> <details> <summary>jestjs/jest (jest)</summary> ### [`v30.5.2`](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3052) [Compare Source](https://github.com/jestjs/jest/compare/v30.5.1...v30.5.2) ##### Features - `[@jest/transform]` Strip TypeScript types with Node when no transformer claims a `.ts`, `.mts` or `.cts` file ([#&#8203;16421](https://github.com/jestjs/jest/pull/16421)) ##### Fixes - `[jest-core, jest-haste-map, jest-transform]` Keep `require('../package.json')` external when bundling, so `jest --version` and the transform and haste-map cache keys report the released version instead of the previous one ([#&#8203;16422](https://github.com/jestjs/jest/pull/16422)) - `[jest-each]` Escape a table row's keys before building the `$variable` interpolation `RegExp`, so a column name such as `count(*)` no longer fails the whole table with `Invalid regular expression`, and a `.` or `|` in a column name is matched literally ([#&#8203;16345](https://github.com/jestjs/jest/pull/16345)) - `[@jest/source-map]` Resolve absolute Windows paths in a source map's `sources` and `sourceRoot` again, instead of appending them to the transformed file's directory ([#&#8203;16439](https://github.com/jestjs/jest/pull/16439)) ### [`v30.5.1`](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3051) [Compare Source](https://github.com/jestjs/jest/compare/v30.5.0...v30.5.1) ##### Fixes - `[jest-config]` Don't warn about global-only options in the config that supplies the global config - the root config a project resolves to, or the first entry of `--projects` when no root config is passed ([#&#8203;16411](https://github.com/jestjs/jest/pull/16411)) - `[jest-config, jest-types]` Stop accepting `reporters`, `coverageReporters`, `workerIdleMemoryLimit`, `cwd` and `runnerOptions` in a project config - they were silently ignored, and now warn like the other global-only options ([#&#8203;16411](https://github.com/jestjs/jest/pull/16411)) - `[jest-config, jest-validate]` Warn about `maxWorkers` and `coverageThreshold` in a project config instead of dropping them without a word ([#&#8203;16411](https://github.com/jestjs/jest/pull/16411)) - `[jest-resolve]` Match `moduleNameMapper` patterns against the specifier as written again (reverting [#&#8203;16390](https://github.com/jestjs/jest/pull/16390)) ([#&#8203;16417](https://github.com/jestjs/jest/pull/16417)) - `[jest-runtime]` Resolve package `imports` specifiers like `#dep` under ESM again ([#&#8203;16413](https://github.com/jestjs/jest/pull/16413)) ##### Chore & Maintenance - `[jest-util]` Name the `testEnvironmentOptions.globalsCleanup` option and link the docs from the `JEST-01` deprecation warning, and document the option's modes ([#&#8203;16404](https://github.com/jestjs/jest/pull/16404)) ### [`v30.5.0`](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3050) [Compare Source](https://github.com/jestjs/jest/compare/v30.4.2...v30.5.0) ##### Features - `[@jest/expect-utils, jest-mock]` Add `mockFn.whenCalledWith(...args)` for configuring return values per argument list, with first-class asymmetric-matcher support ([#&#8203;16053](https://github.com/jestjs/jest/pull/16053)) - `[@jest/expect-utils]` Export `AsymmetricMatcher` and `FunctionParameters` types (previously private to `expect`) ([#&#8203;16053](https://github.com/jestjs/jest/pull/16053)) - `[jest-circus, jest-core, jest-jasmine2, jest-test-result, jest-types]` `--collectTests` now expands `test.each`/`describe.each` cases and reports per-status counts (skipped/todo via the new `wouldRun` flag for selected tests) plus a summary line that match a real run, including under `--testNamePattern` and `.only`/`fdescribe` focus on both the circus and jasmine2 runners ([#&#8203;16259](https://github.com/jestjs/jest/pull/16259)) - `[jest-circus, jest-environment, jest-runtime, jest-types]` Add describe-level retries via `jest.retryTimes(..., {entireDescribe: true})` ([#&#8203;16322](https://github.com/jestjs/jest/pull/16322)) - `[jest-circus, jest-message-util, jest-reporters, jest-types]` Add `retryMessages` to `AssertionResult` and export `formatErrorStack`, so the retry log renders nested `cause` and `AggregateError` sections with code frames instead of serialized `[cause]:`/`[errors]:` markers ([#&#8203;16316](https://github.com/jestjs/jest/pull/16316)) - `[jest-circus, jest-types]` Add `unhandledErrorsDetailed` to `Circus.RunResult`, so an unhandled rejection reports its `cause` chain and `AggregateError` entries with code frames instead of a pre-serialized stack ([#&#8203;16316](https://github.com/jestjs/jest/pull/16316)) - `[jest-haste-map]` Replace `NodeWatcher` and `FSEventsWatcher` with `@parcel/watcher` for the non-watchman watch path ([#&#8203;16188](https://github.com/jestjs/jest/pull/16188)) - `[jest-resolve]` Bump `unrs-resolver` to 1.12.1, remove `jest-pnp-resolver` and unnecessary checks ([#&#8203;15721](https://github.com/jestjs/jest/pull/15721)) - `[jest-resolve]` Honor Node's `--preserve-symlinks` / `NODE_PRESERVE_SYMLINKS` in the default resolver by passing `symlinks: false` to `unrs-resolver` ([#&#8203;16260](https://github.com/jestjs/jest/pull/16260)) - `[jest-runtime]` Apply automocking and manual `__mocks__` files to synchronously evaluable ESM graphs on Node 24.9+ - static imports, dynamic `import()` and `require()` of an ESM file now generate an automock from the real module's namespace instead of failing with "Attempting to import a mock without a factory". Graphs that need async evaluation (top-level await) or an async-only resolver or transformer still throw ([#&#8203;16391](https://github.com/jestjs/jest/pull/16391)) - `[jest-runtime]` Route `process.getBuiltinModule` through the sandbox, so it returns the sandbox `process` and the hooked `node:module` instead of the host's ([#&#8203;16391](https://github.com/jestjs/jest/pull/16391)) - `[jest-runtime]` Throw an actionable error from `module.register()` and `module.registerHooks()` inside a test - the hooks attached to the loader running Jest itself, never saw the sandboxed requires they were meant for, and stayed registered for every later test file in the worker ([#&#8203;16391](https://github.com/jestjs/jest/pull/16391)) - `[jest-runtime]` Surface resolution and import-attribute errors in an ESM graph before executing any of its CJS dependencies on Node 24.9+, matching Node's run-nothing-on-a-broken-graph behavior; the legacy loader on older versions keeps its linking-time execution order ([#&#8203;16391](https://github.com/jestjs/jest/pull/16391)) - `[jest-runtime]` Throw `ERR_SOURCE_PHASE_NOT_DEFINED` with an actionable message for `import source` and `import.source()`, instead of failing at instantiation with V8's bare "Source phase import object is not defined" ([#&#8203;16391](https://github.com/jestjs/jest/pull/16391)) - `[jest-runtime]` Emit the JSON-without-import-attribute deprecation warning once per test file instead of once per worker, so it is no longer silently swallowed for every file after the first ([#&#8203;16391](https://github.com/jestjs/jest/pull/16391)) - `[jest-runtime]` Set `import.meta.main` to `true` in the test file and `false` in every module it loads, matching Node 24+ ([#&#8203;16367](https://github.com/jestjs/jest/pull/16367)) - `[jest-runtime]` Resolve the `module-sync` export condition, so a package that exposes its ESM entry point for `require()` loads the same file Node would ([#&#8203;16336](https://github.com/jestjs/jest/pull/16336)) - `[jest-snapshot]` Add external snapshot paths to custom reporter failure details ([#&#8203;16374](https://github.com/jestjs/jest/pull/16374)) ##### Fixes - `[jest-console, jest-reporters]` `CustomConsole` now buffers console output so `TestResult.console` is populated for reporters when `verbose` is enabled, while `GitHubActionsReporter` avoids replaying buffered output in verbose mode ([#&#8203;16155](https://github.com/jestjs/jest/pull/16155)) - `[expect, jest-message-util, jest-pattern, jest-regex-util, jest-util]` Revert `node:` protocol imports to restore webpack/browser-bundle compatibility ([#&#8203;16167](https://github.com/jestjs/jest/pull/16167)) - `[expect]` Widen `toMatchObject` and `objectContaining` parameter type from `Record<string, unknown>` to `object` so class instances are accepted ([#&#8203;16196](https://github.com/jestjs/jest/pull/16196)) - `[jest-circus]` Call a generator test body with the shared test context, so `this` matches what a regular test function receives ([#&#8203;16347](https://github.com/jestjs/jest/pull/16347)) - `[jest-circus]` Capture the error listeners of the parent process instead of the in-sandbox `process`, so listeners registered before the test file survive teardown and sandbox listeners no longer leak onto the parent ([#&#8203;16347](https://github.com/jestjs/jest/pull/16347)) - `[jest-circus]` Clear `currentlyRunningTest` after skipped and todo tests ([#&#8203;16342](https://github.com/jestjs/jest/pull/16342)) - `[jest-circus]` Prevent late `done()` callbacks from affecting later test or hook invocations ([#&#8203;16343](https://github.com/jestjs/jest/pull/16343)) - `[jest-circus, jest-jasmine2]` Honor `--expand` when formatting `node:assert` failures, instead of always collapsing the diff ([#&#8203;16347](https://github.com/jestjs/jest/pull/16347)) - `[jest-circus, jest-jasmine2, jest-message-util]` Serialize the inner errors of an `AggregateError` into `failureMessages`, `retryReasons` and `unhandledErrors`, so `--json` output and reporter annotations include them ([#&#8203;16316](https://github.com/jestjs/jest/pull/16316)) - `[jest-circus, jest-snapshot]` Keep snapshot state and counts correct when a test retries ([#&#8203;16344](https://github.com/jestjs/jest/pull/16344)) - `[@jest/create-cache-key-function]` Include the caller support flags in the generated key, so a transformer that emits ESM or CJS based on them no longer shares one cache entry between the two ([#&#8203;16331](https://github.com/jestjs/jest/pull/16331)) - `[@jest/create-cache-key-function]` Include the stringified project config in the generated key, so editing a transformer's own settings invalidates what it cached ([#&#8203;16331](https://github.com/jestjs/jest/pull/16331)) - `[@jest/transform]` Include the caller support flags in a transform's cache key, so a file transformed both as ESM and as CJS no longer serves one shape's output for the other ([#&#8203;16331](https://github.com/jestjs/jest/pull/16331)) - `[jest-config]` Add missing `findRelatedTests`, `outputFile`, and `replname` entries to `ValidConfig` so they no longer trigger spurious "Unknown option" warnings ([#&#8203;16224](https://github.com/jestjs/jest/pull/16224)) - `[jest-config]` Use `--config` for the global config when multiple `--projects` are specified ([#&#8203;16273](https://github.com/jestjs/jest/pull/16273)) - `[jest-core]` Serialize `bigint` values in `--json` and `--outputFile` output as their literal form (`4n`), instead of failing the run with `TypeError: Do not know how to serialize a BigInt` ([#&#8203;16338](https://github.com/jestjs/jest/pull/16338)) - `[jest-core]` Do not report a `CustomGC` async resource (used by N-API addons such as napi-rs for per-isolate GC bookkeeping) as an open handle, since it is `napi_unref`'d by the addon and can never keep the event loop alive ([#&#8203;16379](https://github.com/jestjs/jest/pull/16379)) - `[jest-each]` Keep a `$&`, `` $` ``, `$'` or `$$` inside a `%p` param value out of the replacement, so the title shows the value instead of the text around it ([#&#8203;16338](https://github.com/jestjs/jest/pull/16338)) - `[jest-each]` Interpolate a `bigint` into a `%j` title as its literal form (`"4n"`) at any depth, instead of throwing `TypeError: Do not know how to serialize a BigInt` while collecting the tests ([#&#8203;16338](https://github.com/jestjs/jest/pull/16338)) - `[jest-environment, jest-runtime]` Bind `sandboxInjectedGlobals` to the right values when `injectGlobals` is `false`, instead of shifting every one of them by a position ([#&#8203;16377](https://github.com/jestjs/jest/pull/16377)) - `[jest-environment-node, jest-util]` Only warn about a conflicting `globalsCleanup` mode when one was explicitly configured, and follow the mode that is actually in effect ([#&#8203;16323](https://github.com/jestjs/jest/pull/16323)) - `[jest-environment-node, jest-util]` Stop resolving lazy globals when setting up an environment, so Node 26's builtin module globals are no longer loaded (and no longer emit their deprecation warnings) for every test file ([#&#8203;16324](https://github.com/jestjs/jest/pull/16324)) - `[jest-haste-map]` Keep watch mode alive when an outside process briefly makes a file unreadable on Windows, instead of tearing the watcher down on `EPERM` ([#&#8203;16295](https://github.com/jestjs/jest/pull/16295)) - `[jest-haste-map]` Keep indexing when an outside process holds a file open on Windows, instead of failing the whole crawl on `EPERM` ([#&#8203;16358](https://github.com/jestjs/jest/pull/16358)) - `[jest-haste-map]` Keep a duplicated manual mock resolving when the file it pointed at is deleted in watch mode ([#&#8203;16360](https://github.com/jestjs/jest/pull/16360)) - `[jest-haste-map]` Shut the worker farm down when a duplicate manual mock aborts the build under `throwOnModuleCollision` ([#&#8203;16354](https://github.com/jestjs/jest/pull/16354)) - `[jest-haste-map]` Attach the watchman client's `error` listener before the first command, so a watchman failure falls back to the node crawler instead of crashing on an unhandled `error` event, and always end the client ([#&#8203;16355](https://github.com/jestjs/jest/pull/16355)) - `[jest-haste-map]` Stop delivering watch events after `WatchmanWatcher` is closed, and route its warnings through the configured console ([#&#8203;16355](https://github.com/jestjs/jest/pull/16355)) - `[jest-haste-map]` Restore the nested `duplicates` index correctly in `ModuleMap.fromJSON`, so a haste collision reported inside a test worker raises `DuplicateHasteCandidatesError` instead of a `TypeError` ([#&#8203;16353](https://github.com/jestjs/jest/pull/16353)) - `[jest-haste-map]` Match watched files on a full extension, so `moduleFileExtensions: ['js']` no longer accepts `foo.mjs` ([#&#8203;16352](https://github.com/jestjs/jest/pull/16352)) - `[jest-haste-map]` Delimit the fields that make up the haste map cache key, so two different option sets cannot hash to the same cache file ([#&#8203;16352](https://github.com/jestjs/jest/pull/16352)) - `[jest-message-util]` Print the inner errors of an `AggregateError` thrown inside a test ([#&#8203;16316](https://github.com/jestjs/jest/pull/16316)) - `[jest-message-util]` Indent nested `cause` and `AggregateError` sections of a test failure by one level per depth, so the nesting is legible instead of rendering flat ([#&#8203;16316](https://github.com/jestjs/jest/pull/16316)) - `[jest-message-util]` Color stack traces line by line so blank lines stay blank ([#&#8203;16316](https://github.com/jestjs/jest/pull/16316)) - `[jest-message-util]` Detect Jest's own frames without assuming the checkout directory's name, and cover `@jest/*` packages, so stack traces and code frames point at user code ([#&#8203;16326](https://github.com/jestjs/jest/pull/16326)) - `[jest-mock]` `mockResolvedValue` / `mockRejectedValue` now see all overload return types, so a Promise-returning overload survives even when a later overload returns a non-Promise (e.g. `pg.Client['end']`) ([#&#8203;16237](https://github.com/jestjs/jest/pull/16237)) - `[@jest-environment/jsdom-abstract]` Make `@types/jsdom` a peer dependency ([#&#8203;16166](https://github.com/jestjs/jest/pull/16166)) - `[jest-mock]` Remove the leftover own accessor descriptor when restoring a `spyOn` of an inherited getter or setter, so the instance keeps reflecting the prototype ([#&#8203;16226](https://github.com/jestjs/jest/pull/16226)) - `[jest-resolve]` Include `extensionsToTreatAsEsm` in the `shouldLoadAsEsm` cache key, so projects with different extension lists don't read each other's answers ([#&#8203;16369](https://github.com/jestjs/jest/pull/16369)) - `[jest-resolve]` Make `getModuleIDAsync` build and cache `data:` URI module IDs the same way as `getModuleID` ([#&#8203;16370](https://github.com/jestjs/jest/pull/16370)) - `[jest-resolve]` Keep the `node:` prefix when resolving a core module asynchronously, so a builtin that only exists prefixed (`node:sea`, `node:sqlite`, `node:test`, `node:test/reporters`) resolves instead of failing as a missing bare package ([#&#8203;16388](https://github.com/jestjs/jest/pull/16388)) - `[jest-resolve]` Look up manual mocks for `node:` protocol specifiers under the unprefixed name they are stored as ([#&#8203;16388](https://github.com/jestjs/jest/pull/16388)) - `[jest-resolve]` Apply `moduleNameMapper` consistently to both spellings of core module specifiers (`fs` vs `node:fs`) ([#&#8203;16390](https://github.com/jestjs/jest/pull/16390)) - `[jest-resolve]` Keep virtual and ordinary mock module IDs isolated across test files ([#&#8203;16296](https://github.com/jestjs/jest/pull/16296)) - `[jest-resolve]` Guard missing `require.resolve.paths` ([#&#8203;16052](https://github.com/jestjs/jest/pull/16052)) - `[jest-resolve, jest-config, jest-runner]` Support a user resolver written as an ES module ([#&#8203;16332](https://github.com/jestjs/jest/pull/16332)) - `[jest-resolve, jest-runtime]` Throw the CJS parse error for ESM syntax in a `"type": "commonjs"` package or a `.cjs` file instead of loading it as ESM, matching Node ([#&#8203;16368](https://github.com/jestjs/jest/pull/16368)) - `[@jest/source-map]` Keep source map sources that name a scheme, such as `webpack:///`, instead of resolving them into a path that does not exist ([#&#8203;16327](https://github.com/jestjs/jest/pull/16327)) - `[@jest/source-map]` Look up `--testLocationInResults` positions at the right column, and keep a mapping to the first column instead of discarding it ([#&#8203;16327](https://github.com/jestjs/jest/pull/16327)) - `[@jest/source-map]` Warn when a source map cannot be parsed, instead of silently leaving its frames untranslated ([#&#8203;16327](https://github.com/jestjs/jest/pull/16327)) - `[jest-runner, @jest/source-map]` Keep a source-mapped stack for an error thrown after the test environment was torn down ([#&#8203;16327](https://github.com/jestjs/jest/pull/16327)) - `[jest-runtime, @jest/source-map]` Keep source maps past teardown and past the next test file's `install`, so a stack from a file no earlier stack mentioned still points at the original source ([#&#8203;16330](https://github.com/jestjs/jest/pull/16330)) - `[jest-runtime]` Report that no coverage was collected when `getAllV8CoverageInfoCopy` is called after `teardown`, instead of returning an empty result ([#&#8203;16385](https://github.com/jestjs/jest/pull/16385)) - `[jest-runtime]` Cache a CJS module's parsed exports before walking its re-exports, so two modules that re-export each other no longer overflow the stack when imported from ESM ([#&#8203;16363](https://github.com/jestjs/jest/pull/16363)) - `[jest-runtime]` Keep a re-exported ES module's parse failure from marking the re-exporting CommonJS file as ESM, so `module.exports = require('./dep.mjs')` loads instead of failing with `module is not defined` ([#&#8203;16363](https://github.com/jestjs/jest/pull/16363)) - `[jest-runtime]` Scope module mocks instantiated inside `jest.isolateModules`/`isolateModulesAsync` to that block, so a mock first imported there no longer outlives it - matching how CommonJS mocks already behave ([#&#8203;16365](https://github.com/jestjs/jest/pull/16365)) - `[jest-runtime]` Suspend module isolation while generating an automock, so loading the real module to read its shape no longer populates the isolated registry ([#&#8203;16365](https://github.com/jestjs/jest/pull/16365)) - `[jest-runtime]` Check a cached ES module's status before `require()` returns it, so a module whose evaluation threw rethrows that error and one left linked by a failed sibling is evaluated instead of returning uninitialized bindings ([#&#8203;16364](https://github.com/jestjs/jest/pull/16364)) - `[jest-runtime]` Report the original `ERR_REQUIRE_ASYNC_MODULE` when a `require()` of a top-level-await graph is retried, instead of a spurious "concurrent `import()`" error ([#&#8203;16364](https://github.com/jestjs/jest/pull/16364)) - `[jest-runtime]` Throw the evaluation error when another caller's `import()` of the same module failed while we awaited it, instead of resolving with the errored module ([#&#8203;16364](https://github.com/jestjs/jest/pull/16364)) - `[jest-runtime]` Mark the result of `require()`ing an ES module that has a default export with `__esModule: true` through a live-binding facade, and serve the same object from `require.cache`, matching Node ([#&#8203;16367](https://github.com/jestjs/jest/pull/16367)) - `[jest-runtime]` Provide a CommonJS module's exports under the `'module.exports'` named export when imported from ESM, matching Node 23+ ([#&#8203;16367](https://github.com/jestjs/jest/pull/16367)) - `[jest-runtime]` Give the test file itself a non-null `require.main` ([#&#8203;16367](https://github.com/jestjs/jest/pull/16367)) - `[jest-runtime]` Populate `module.children` with the modules a file loads, matching Node ([#&#8203;16368](https://github.com/jestjs/jest/pull/16368)) - `[jest-runtime]` Provide `import.meta.resolve` and `import.meta.jest` in `data:` URI modules, accept any-case mediatype parameters, and use Node's error codes for invalid `data:` URIs ([#&#8203;16368](https://github.com/jestjs/jest/pull/16368)) - `[jest-runtime]` Key ES modules by full URL, so query and fragment suffixes create the same module instances as Node and show up in `import.meta.url` ([#&#8203;16375](https://github.com/jestjs/jest/pull/16375)) - `[jest-runtime]` Share modules between overlapping graphs when a CommonJS module `require()`s an ES module mid-load, instead of evaluating shared dependencies twice ([#&#8203;16375](https://github.com/jestjs/jest/pull/16375)) - `[jest-runtime]` Throw `ERR_REQUIRE_CYCLE_MODULE` like Node when a CommonJS module `require()`s an ES module that is still being loaded, instead of evaluating the module a second time ([#&#8203;16366](https://github.com/jestjs/jest/pull/16366)) - `[jest-runtime]` Key builtin modules in the ESM registry by one canonical specifier ([#&#8203;16341](https://github.com/jestjs/jest/pull/16341)) - `[jest-runtime]` `import.meta.resolve()` for a builtin uses its `node:` specifier ([#&#8203;16341](https://github.com/jestjs/jest/pull/16341)) - `[jest-runtime]` Fall back to native ESM when a `.js` file contains ESM syntax but has no `"type":"module"` marker ([#&#8203;16152](https://github.com/jestjs/jest/pull/16152)) - `[jest-runtime]` Allow `require()` of ESM-marked files on Node < 24.9 via transform fallback ([#&#8203;16244](https://github.com/jestjs/jest/pull/16244)) - `[jest-runtime, @jest/transform]` Surface actionable `ERR_REQUIRE_ESM` error for files with untransformed ESM syntax instead of the generic "unexpected token" message ([#&#8203;16244](https://github.com/jestjs/jest/pull/16244)) - `[jest-runtime]` Support older test environments whose `moduleMocker` does not implement `clearMocksOnScope` ([#&#8203;16169](https://github.com/jestjs/jest/pull/16169)) - `[jest-runtime]` Apply `jest.unstable_mockModule` when the mocked file itself is `require()`d, not only when it is imported as a dependency ([#&#8203;16389](https://github.com/jestjs/jest/pull/16389)) - `[jest-runtime]` Apply `jest.unstable_mockModule` to statically imported `data:` URIs on Node 24.9+, matching dynamic `import()` ([#&#8203;16389](https://github.com/jestjs/jest/pull/16389)) - `[jest-runtime]` Run an async `jest.unstable_mockModule` factory once per module instead of twice, and fail the import instead of crashing the worker when the factory rejects ([#&#8203;16389](https://github.com/jestjs/jest/pull/16389)) - `[jest-runtime]` Hide a `require(esm)` module that failed to evaluate from `require.cache`, as Node does, instead of exposing a namespace with uninitialized bindings ([#&#8203;16389](https://github.com/jestjs/jest/pull/16389)) - `[jest-runtime]` Strip the byte-order mark when importing a JSON module, matching `require()` and Node ([#&#8203;16389](https://github.com/jestjs/jest/pull/16389)) - `[jest-runtime]` Throw `ERR_REQUIRE_ASYNC_MODULE` when `require(esm)` runs under an async-only custom resolver, instead of silently resolving with the default resolver ([#&#8203;16389](https://github.com/jestjs/jest/pull/16389)) - `[jest-runtime]` Parse imported JSON modules with the test realm's `JSON`, so their objects pass `instanceof Object` inside the test like `require()`d JSON does ([#&#8203;16389](https://github.com/jestjs/jest/pull/16389)) - `[jest-runtime]` Accept every `file:` URL string in the sandboxed `module.createRequire`, including one with a `localhost` authority, as Node does ([#&#8203;16389](https://github.com/jestjs/jest/pull/16389)) - `[jest-runtime]` Point at `{virtual: true}` when `jest.mock` or `jest.unstable_mockModule` is given a module that cannot be resolved ([#&#8203;16389](https://github.com/jestjs/jest/pull/16389)) - `[jest-reporters]` Fix coverage report table formatting in CI/GitHub Actions environments where `process.stdout.columns` is undefined by falling back to the `COLUMNS` env var or `80` columns in CI, preserving existing behaviour in other non-TTY environments ([#&#8203;16227](https://github.com/jestjs/jest/pull/16227)) - `[jest-runtime]` Support CJS-in-ESM exports via `"module.exports"` named exports ([#&#8203;16277](https://github.com/jestjs/jest/pull/16277)) - `[jest-snapshot]` Keep a skipped or failed test's hinted snapshots, instead of reporting them obsolete ([#&#8203;16348](https://github.com/jestjs/jest/pull/16348)) - `[jest-util]` Stop `globsToMatcher` reusing a cached matcher compiled with different picomatch options, and keep its `dot: true` default when `dot` is passed as `undefined` ([#&#8203;16381](https://github.com/jestjs/jest/pull/16381)) - `[pretty-format]` Move the `react-is` aliases into the `@jest` scope, so they cannot be shadowed by unrelated packages published under the alias names ([#&#8203;16333](https://github.com/jestjs/jest/pull/16333)) ##### Chore & Maintenance - `[docs]` Document the intentional divergences from Node's module system in the ECMAScript Modules page ([#&#8203;16368](https://github.com/jestjs/jest/pull/16368)) - `[docs]` Note deprecation of `react-test-renderer` in React Native tutorial and `pretty-format` README ([#&#8203;16294](https://github.com/jestjs/jest/pull/16294)) - `[docs]` Use `@testing-library/react-native` in the React Native tutorial instead of the deprecated `react-test-renderer` ([#&#8203;16318](https://github.com/jestjs/jest/pull/16318)) - `[babel-jest, @jest/transform]` Update `babel-plugin-istanbul` to v8 ([#&#8203;16049](https://github.com/jestjs/jest/pull/16049)) - `[jest-config, @jest/reporters, jest-runtime]` Update `glob` to v13 ([#&#8203;16397](https://github.com/jestjs/jest/pull/16397)) - `[jest-haste-map]` Refactor massive class into multiple files ([#&#8203;16180](https://github.com/jestjs/jest/pull/16180)) - `[jest-haste-map]` Drop `walker` dependency; replace hand-rolled directory recursion in the JS crawler and watcher startup with `fdir` ([#&#8203;16187](https://github.com/jestjs/jest/pull/16187)) - `[jest-haste-map]` Reuse cached metadata for files whose haste name is a known duplicate, instead of re-reading and re-parsing them on every startup ([#&#8203;16351](https://github.com/jestjs/jest/pull/16351)) - `[jest-haste-map]` Cache the watchman socket path and replace the `watchman --version` probe with `get-sockname`, so warm runs spawn no watchman processes ([#&#8203;16386](https://github.com/jestjs/jest/pull/16386)) - `[jest-resolve]` Store the per-directory package-type lookup in the cache it reads, so it actually memoizes ([#&#8203;16369](https://github.com/jestjs/jest/pull/16369)) - `[jest-resolve, jest-runtime]` Cut repeated work on the resolution hot path: hoist the platform-extension list to construction, memoize `isCoreModule` and the options cache-key serialization, skip mapper preparation when no `moduleNameMapper` is configured, run each mapper regex once, and stop re-parsing `NODE_OPTIONS` on every default-resolver call ([#&#8203;16371](https://github.com/jestjs/jest/pull/16371)) - `[jest-resolve]` Cut warm resolution cost to about a third: reuse one `unrs-resolver` factory per options shape instead of cloning per resolution, compose the factory cache key from per-array cached strings instead of serializing options, and stop constructing an `Error` for misses that `findNodeModule` swallows; add a `__benchmarks__` suite for the default resolver ([#&#8203;16373](https://github.com/jestjs/jest/pull/16373)) - `[jest-runner, @jest/source-map]` Replace `source-map-support` with an implementation in `@jest/source-map` ([#&#8203;16327](https://github.com/jestjs/jest/pull/16327)) - `[jest-snapshot]` Load babel, semver and synckit lazily, so requiring the package (which every test process does through `@jest/expect`) no longer loads \~200 modules that only writing inline snapshots needs ([#&#8203;16387](https://github.com/jestjs/jest/pull/16387)) - `[jest-runtime]` Reduce per-require overhead: skip module ID resolution when no mock can apply, answer core modules before probing for a manual mock, share one `require.cache` proxy across modules, and cache empty files ([#&#8203;16376](https://github.com/jestjs/jest/pull/16376)) - `[@jest/source-map]` Deprecate `getCallsite` in favour of `SourceMapSupport#getCallsite` ([#&#8203;16327](https://github.com/jestjs/jest/pull/16327)) - `[jest-runtime]` Avoid magical `null` value in ESM loader ([#&#8203;16160](https://github.com/jestjs/jest/pull/16160)) ### [`v30.4.2`](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3042) [Compare Source](https://github.com/jestjs/jest/compare/v30.4.1...v30.4.2) ##### Fixes - `[jest-runtime]` Fix named imports from CJS modules whose `module.exports` is a function with own-property exports ([#&#8203;16150](https://github.com/jestjs/jest/pull/16150)) ### [`v30.4.1`](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3041) [Compare Source](https://github.com/jestjs/jest/compare/v30.4.0...v30.4.1) ##### Features - `[jest-config, jest-core, jest-runner, jest-schemas, jest-types]` Allow custom runner configuration options via tuple format `['runner-path', {options}]` ([#&#8203;16141](https://github.com/jestjs/jest/pull/16141)) ##### Fixes - `[jest-runtime]` Align CJS-from-ESM default export with Node: `module.exports` is always the ESM default, `__esModule` unwrapping is no longer applied ([#&#8203;16143](https://github.com/jestjs/jest/pull/16143)) ### [`v30.4.0`](https://github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3040) [Compare Source](https://github.com/jestjs/jest/compare/v30.3.0...v30.4.0) ##### Features - `[babel-jest]` Support collecting coverage from `.mts`, `.cts` (and other) files ([#&#8203;15994](https://github.com/jestjs/jest/pull/15994)) - `[jest-circus, jest-cli, jest-config, jest-core, jest-jasmine2, jest-types]` Add `--collect-tests` flag to discover and list tests without executing them ([#&#8203;16006](https://github.com/jestjs/jest/pull/16006)) - `[jest-config, jest-runner, jest-worker]` Add `workerGracefulExitTimeout` config option to control how long workers are given to exit before being force-killed ([#&#8203;15984](https://github.com/jestjs/jest/pull/15984)) - `[jest-config]` Add support for `jest.config.mts` as a valid configuration file ([#&#8203;16005](https://github.com/jestjs/jest/pull/16005)) - `[jest-config, jest-core, jest-reporters, jest-runner]` `verbose` and `silent` can now be set per-project; the project-level value overrides the global value for that project's tests ([#&#8203;16133](https://github.com/jestjs/jest/pull/16133)) - `[@jest/fake-timers]` Accept `Temporal.Duration` in `jest.advanceTimersByTime()` and `jest.advanceTimersByTimeAsync()` ([#&#8203;16128](https://github.com/jestjs/jest/pull/16128)) - `[@jest/fake-timers]` Accept `Temporal.Instant` and `Temporal.ZonedDateTime` in `jest.setSystemTime()` and `useFakeTimers({now})` ([#&#8203;16128](https://github.com/jestjs/jest/pull/16128)) - `[@jest/fake-timers]` Support faking `Temporal.Now.*` ([#&#8203;16131](https://github.com/jestjs/jest/pull/16131)) - `[jest-mock]` Add `clearMocksOnScope(scope)` on `ModuleMocker` for clearing every mock function exposed on a scope object ([#&#8203;16088](https://github.com/jestjs/jest/pull/16088)) - `[jest-resolve]` Add `canResolveSync()` on `Resolver` so callers can detect when a user-configured resolver only exports an `async` hook ([#&#8203;16064](https://github.com/jestjs/jest/pull/16064)) - `[jest-runtime]` Use synchronous `evaluate()` for ES modules without top-level `await` on Node versions that support it (v24.9+), and prefer the synchronous transform path when a sync transformer is configured ([#&#8203;16062](https://github.com/jestjs/jest/pull/16062)) - `[jest-runtime]` Support `require()` of ES modules on Node v24.9+ ([#&#8203;16074](https://github.com/jestjs/jest/pull/16074)) - `[jest-runtime]` Validate TC39 import attributes (`with { type: 'json' }`) on ESM imports ([#&#8203;16127](https://github.com/jestjs/jest/pull/16127)) - `[@jest/transform]` Add `canTransformSync(filename)` on `ScriptTransformer` so callers can pick the sync vs async transform path ([#&#8203;16062](https://github.com/jestjs/jest/pull/16062)) - `[jest-util]` Add `isError` helper ([#&#8203;16076](https://github.com/jestjs/jest/pull/16076)) - `[pretty-format]` Support React 19 ([#&#8203;16123](https://github.com/jestjs/jest/pull/16123)) ##### Fixes - `[expect-utils]` Fix `toStrictEqual` failing on `structuredClone` results due to cross-realm constructor mismatch ([#&#8203;15959](https://github.com/jestjs/jest/pull/15959)) - `[@jest/expect-utils]` Prevent `toMatchObject`/subset matching from throwing when encountering exotic iterables ([#&#8203;15952](https://github.com/jestjs/jest/pull/15952)) - `[fake-timers]` Convert `Date` to milliseconds before passing to `@sinonjs/fake-timers` ([#&#8203;16029](https://github.com/jestjs/jest/pull/16029)) - `[jest]` Export `GlobalConfig` and `ProjectConfig` TypeScript types ([#&#8203;16132](https://github.com/jestjs/jest/pull/16132)) - `[jest-circus]` Prevent crash when `asyncError` is undefined for non-Error throws ([#&#8203;16003](https://github.com/jestjs/jest/pull/16003)) - `[jest-circus, jest-jasmine2]` Include `Error.cause` in JSON `failureMessages` output ([#&#8203;15967](https://github.com/jestjs/jest/pull/15967)) - `[jest-config]` Fix preset path resolution on Windows when the preset uses subpath `exports` ([#&#8203;15961](https://github.com/jestjs/jest/pull/15961)) - `[jest-config]` Allow `collectCoverage` and `coverageProvider` in project config without a validation warning ([#&#8203;16132](https://github.com/jestjs/jest/pull/16132)) - `[jest-config]` Project config validator now emits "is not supported in an individual project configuration" instead of "probably a typing mistake" for known global-only options ([#&#8203;16132](https://github.com/jestjs/jest/pull/16132)) - `[jest-environment-node]` Fix `--localstorage-file` warning on Node 25+ ([#&#8203;16086](https://github.com/jestjs/jest/pull/16086)) - `[jest-reporters]` Apply global coverage threshold to unmatched pattern files in addition to glob/path thresholds ([#&#8203;16137](https://github.com/jestjs/jest/pull/16137)) - `[jest-reporters, jest-runner, jest-runtime, jest-transform]` Fix coverage report not showing correct code coverage when using `projects` config option ([#&#8203;16140](https://github.com/jestjs/jest/pull/16140)) - `[jest-runtime]` Resolve `expect` and `@jest/expect` from the internal module registry so test-file imports share the same `JestAssertionError` as the global `expect` ([#&#8203;16130](https://github.com/jestjs/jest/pull/16130)) - `[jest-runtime]` Improve CJS-from-ESM interop: `__esModule`/Babel default unwrap, broader named-export coverage, and shared CJS singleton across importers ([#&#8203;16050](https://github.com/jestjs/jest/pull/16050)) - `[jest-runtime]` Load `.js` files with ESM syntax but no `"type":"module"` marker as native ESM ([#&#8203;16050](https://github.com/jestjs/jest/pull/16050)) - `[jest-runtime]` Extend the `.js`-with-ESM-syntax fallback to `require()` on Node v24.9+ - falls back to `require(esm)` when the CJS parser rejects ESM syntax ([#&#8203;16078](https://github.com/jestjs/jest/pull/16078)) - `[jest-runtime]` Fix deadlocks and double-evaluation in concurrent ESM and wasm imports ([#&#8203;16050](https://github.com/jestjs/jest/pull/16050)) - `[jest-runtime]` Fix error when `require()` is called after the Jest environment has been torn down ([#&#8203;15951](https://github.com/jestjs/jest/pull/15951)) - `[jest-runtime]` Fix missing error when `import()` is called after the Jest environment has been torn down ([#&#8203;16080](https://github.com/jestjs/jest/pull/16080)) - `[jest-runtime]` Fix virtual `unstable_mockModule` registrations not respected in ESM ([#&#8203;16081](https://github.com/jestjs/jest/pull/16081)) - `[jest-runtime]` Apply `moduleNameMapper` when resolving modules with `require.resolve()` and the `paths` option ([#&#8203;16135](https://github.com/jestjs/jest/pull/16135)) ##### Chore & Maintenance - `[@jest/fake-timers]` Upgrade `@sinonjs/fake-timers` ([#&#8203;16139](https://github.com/jestjs/jest/pull/16139)) - `[jest-runtime]` Use synchronous `linkRequests` / `instantiate` for ESM linking on Node v24.9+ ([#&#8203;16063](https://github.com/jestjs/jest/pull/16063)) </details> <details> <summary>prettier/prettier (prettier)</summary> ### [`v3.9.10`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#3910) [Compare Source](https://github.com/prettier/prettier/compare/3.9.9...3.9.10) [diff](https://github.com/prettier/prettier/compare/3.9.9...3.9.10) ##### Markdown: Update `micromark-extension-gfm-table` to fix the table parse issue on performance ([#&#8203;20266](https://github.com/prettier/prettier/pull/20266) by [@&#8203;fisker](https://github.com/fisker)) See [micromark/micromark-extension-gfm-table@`4f43ead`](https://github.com/micromark/micromark-extension-gfm-table/commit/4f43ead37b786bc531d924530d4ab4c714886267) for details. ### [`v3.9.9`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#399) [Compare Source](https://github.com/prettier/prettier/compare/3.9.8...3.9.9) [diff](https://github.com/prettier/prettier/compare/3.9.8...3.9.9) ##### Markdown: Fix text with `$` been incorrectly parsed as math syntax ([#&#8203;20140](https://github.com/prettier/prettier/pull/20140) by [@&#8203;fisker](https://github.com/fisker)) <!-- prettier-ignore --> ```md <!-- Input --> **Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR` from `c.sh`, before anything else runs here. <!-- Prettier 3.9.8 --> **Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR`from`c.sh`, before anything else runs here. <!-- Prettier 3.9.9 --> **Uses $FOO** from `a.sh` and `b.sh`, plus `$BAR` from `c.sh`, before anything else runs here. ``` ### [`v3.9.8`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#398) [Compare Source](https://github.com/prettier/prettier/compare/3.9.7...3.9.8) [diff](https://github.com/prettier/prettier/compare/3.9.7...3.9.8) ##### Markdown: Don't let Liquid objects interrupt paragraphs ([#&#8203;20087](https://github.com/prettier/prettier/pull/20087) by [@&#8203;seiyab](https://github.com/seiyab)) <!-- prettier-ignore --> ```markdown <!-- Input --> If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a {{jsxref("TypeError")}} is thrown. <!-- Prettier 3.9.7 --> If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a {{jsxref("TypeError")}} is thrown. <!-- Prettier 3.9.8 --> If `module` is not a [`WebAssembly.Module`](/en-US/docs/WebAssembly/Reference/JavaScript_interface/Module) object instance, a {{jsxref("TypeError")}} is thrown. ``` ### [`v3.9.7`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#397) [Compare Source](https://github.com/prettier/prettier/compare/3.9.6...3.9.7) [diff](https://github.com/prettier/prettier/compare/3.9.6...3.9.7) ##### Markdown: Prevent indentation drift in list-item code blocks ([#&#8203;19647](https://github.com/prettier/prettier/pull/19647), [#&#8203;19990](https://github.com/prettier/prettier/pull/19990) by [@&#8203;Austin1serb](https://github.com/Austin1serb), [@&#8203;giaBaoJS](https://github.com/giaBaoJS)) <!-- prettier-ignore --> ```markdown <!-- Input --> - [x] short first line. second paragraph at six spaces that wraps onto another line here. <!-- Prettier 3.9.6 --> - [x] short first line. second paragraph at six spaces that wraps onto another line here. <!-- Prettier 3.9.7 --> - [x] short first line. second paragraph at six spaces that wraps onto another line here. ``` ##### JavaScript: Fix embedded template literal idempotency ([#&#8203;19725](https://github.com/prettier/prettier/pull/19725) by [@&#8203;fisker](https://github.com/fisker)) <!-- prettier-ignore --> ```jsx // Input const foo = html` <div>${getText({ value, })}</div> `; // Prettier 3.9.6 (first format) const foo = html` <div> ${getText({ value, })} </div> `; // Prettier 3.9.6 (second format) const foo = html` <div> ${getText({ value, })} </div> `; // Prettier 3.9.7 const foo = html` <div> ${getText({ value, })} </div> `; ``` ##### Markdown: Preserve Liquid blocks after Markdown tables ([#&#8203;19730](https://github.com/prettier/prettier/pull/19730) by [@&#8203;wanxiankai](https://github.com/wanxiankai), [@&#8203;seiyab](https://github.com/seiyab)) <!-- prettier-ignore --> ```markdown <!-- Input --> | Argument | Type | | -------- | ---- | {% set default_params = { "model": ["str"], } %} <!-- Prettier 3.9.6 --> | Argument | Type | | ------------------------- | ---- | | {% set default_params = { | "model": ["str"], } %} <!-- Prettier 3.9.7 --> | Argument | Type | | -------- | ---- | {% set default_params = { "model": ["str"], } %} ``` ##### Markdown: Preserve single tildes in Markdown ([#&#8203;19739](https://github.com/prettier/prettier/pull/19739) by [@&#8203;lazerg](https://github.com/lazerg)) Since 3.9.0, single-tilde spans like `H~2~O` were rewritten to double tildes, turning subscript syntax into strike-through. Only double tildes are treated that way now, matching GitHub. <!-- prettier-ignore --> ```markdown <!-- Input --> H~2~O <!-- Prettier 3.9.6 --> H~~2~~O <!-- Prettier 3.9.7 --> H~2~O ``` ##### Markdown: Fix Markdown blockquote containing `>` characters ([#&#8203;19802](https://github.com/prettier/prettier/pull/19802) by [@&#8203;seiyab](https://github.com/seiyab)) <!-- prettier-ignore --> ```md <!-- Input --> > **test**\> <!-- Prettier 3.9.6 --> > **test**>\> <!-- Prettier 3.9.7 --> > **test**\> ``` ##### Markdown: Strip blockquote markers from a setext heading's continuation lines ([#&#8203;19878](https://github.com/prettier/prettier/pull/19878) by [@&#8203;Kjubikstronk](https://github.com/Kjubikstronk)) A setext heading spanning multiple lines inside a blockquote kept the `>` marker of its continuation lines as literal text. <!-- prettier-ignore --> ```md <!-- Input --> > Multi > Line > === <!-- Prettier 3.9.6 --> > Multi > Line > === <!-- Prettier 3.9.7 --> > Multi > Line > === ``` ##### Markdown: Fix HTML block indentation drift in markdown list items ([#&#8203;19987](https://github.com/prettier/prettier/pull/19987) by [@&#8203;lazerg](https://github.com/lazerg)) <!-- prettier-ignore --> ```markdown <!-- Input --> 1. Enable images: <p align="center"> <img alt="example"> </p> <!-- Prettier 3.9.6 (--tab-width=4) --> 1. Enable images: <p align="center"> <img alt="example"> </p> <!-- Prettier 3.9.7 (--tab-width=4) --> 1. Enable images: <p align="center"> <img alt="example"> </p> ``` ##### Angular: Support `@boundary` error boundaries ([#&#8203;20014](https://github.com/prettier/prettier/pull/20014) by [@&#8203;Yahiro025](https://github.com/Yahiro025)) <!-- prettier-ignore --> ```html <!-- Input --> @boundary { <complex-chart [data]="data"/> } @error (let err) { <p>{{err.message}}</p> } <!-- Prettier 3.9.6 --> SyntaxError: Unexpected character "EOF" (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.) (6:1) <!-- Prettier 3.9.7 --> @boundary { <complex-chart [data]="data" /> } @error (let err) { <p>{{ err.message }}</p> } ``` ### [`v3.9.6`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#396) [Compare Source](https://github.com/prettier/prettier/compare/3.9.5...3.9.6) [diff](https://github.com/prettier/prettier/compare/3.9.5...3.9.6) ##### TypeScript: Preserve quotes for methods named `new` ([#&#8203;19621](https://github.com/prettier/prettier/pull/19621) by [@&#8203;kovsu](https://github.com/kovsu)) <!-- prettier-ignore --> ```tsx // Input interface Container { "new"(id: string): number; } // Prettier 3.9.5 interface Container { new(id: string): number; } // Prettier 3.9.6 interface Container { "new"(id: string): number; } ``` ##### TypeScript: Support `import defer` ([#&#8203;19624](https://github.com/prettier/prettier/pull/19624), [#&#8203;19675](https://github.com/prettier/prettier/pull/19675) by [@&#8203;fisker](https://github.com/fisker)) <!-- prettier-ignore --> ```tsx // Input import defer * as foo from "foo"; // Prettier 3.9.5 import * as foo from "foo"; // Prettier 3.9.6 import defer * as foo from "foo"; ``` ##### JavaScript: Added a new official plugin `@prettier/plugin-yuku` ([#&#8203;19628](https://github.com/prettier/prettier/pull/19628), [#&#8203;19629](https://github.com/prettier/prettier/pull/19629) by [@&#8203;fisker](https://github.com/fisker)) `@prettier/plugin-yuku` is powered by [Yuku](https://yuku.fyi/) (A high-performance JavaScript/TypeScript compiler toolchain written in Zig). This plugin includes two new parsers: `yuku` (JavaScript syntax) and `yuku-ts` (TypeScript syntax). **To use this plugin:** 1. Install the plugin: ```bash yarn add --dev prettier @prettier/plugin-yuku ``` 2. Add it to your `.prettierrc`: ```yaml plugins: - "@prettier/plugin-yuku" ``` Due to package size limitations, this plugin is not bundled with the main prettier package and must be installed separately. For more information, check [the package homepage](https://github.com/prettier/prettier/tree/main/packages/plugin-yuku). Big thanks to [@&#8203;arshad-yaseen](https://github.com/arshad-yaseen) for his excellent work. ### [`v3.9.5`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#395) [Compare Source](https://github.com/prettier/prettier/compare/3.9.4...3.9.5) [diff](https://github.com/prettier/prettier/compare/3.9.4...3.9.5) ##### Markdown: Cap ordered list mark at 999,999,999 ([#&#8203;19351](https://github.com/prettier/prettier/pull/19351) by [@&#8203;tats-u](https://github.com/tats-u)) CommonMark parsers only support ordered list item numbers up to 999,999,999. With this change, Prettier now caps the ordered list item number at 999,999,999 to ensure that the output is correctly parsed as an ordered list by CommonMark parsers. Numbers larger than 999,999,999 are not parsed as list item numbers and are left unchanged in the output: <!-- prettier-ignore --> ```markdown <!-- Input --> 999999998. text 999999998. text 999999998. text 999999998. text 1234567890123456789012) text <!-- Prettier 3.9.4 --> 999999998. text 999999999. text 1000000000. text 1000000001. text 1234567890123456789012) text <!-- Prettier 3.9.5 --> 999999998. text 999999999. text 999999999. text 999999999. text 1234567890123456789012) text ``` ##### Markdown: Avoid corrupting empty link with title ([#&#8203;19487](https://github.com/prettier/prettier/pull/19487) by [@&#8203;andersk](https://github.com/andersk)) Do not remove `<>` from an inline link or image with an empty URL and a title, as this removal would change its interpretation. <!-- prettier-ignore --> ```md <!-- Input --> [link](<> "title") <!-- Prettier 3.9.4 --> [link]( "title") <!-- Prettier 3.9.5 --> [link](<> "title") ``` ##### Less: Remove extra spaces after `[` in map lookups ([#&#8203;19503](https://github.com/prettier/prettier/pull/19503) by [@&#8203;kovsu](https://github.com/kovsu)) <!-- prettier-ignore --> ```less // Input .foo { color: #theme[ primary]; color: #theme[@name]; color: #theme[@@name]; } // Prettier 3.9.4 .foo { color: #theme[ primary]; color: #theme[ @name]; color: #theme[ @@name]; } // Prettier 3.9.5 .foo { color: #theme[primary]; color: #theme[@name]; color: #theme[@@name]; } ``` ##### CSS: Prevent addition space in `type()` with `+` ([#&#8203;19516](https://github.com/prettier/prettier/pull/19516) by [@&#8203;bigandy](https://github.com/bigandy)) This fixes the addition space before `+` in CSS `type()` declaration. For example `type(<number>+)` was being converted into `type(<number> +)` which is invalid CSS and does not work. <!-- prettier-ignore --> ```css /* Input */ div { border-radius: attr(br type(<length>+)); } /* Prettier 3.9.4 */ div { border-radius: attr(br type(<length> +)); } /* Prettier 3.9.5 */ div { border-radius: attr(br type(<length>+)); } ``` ##### Less: Remove spaces between merge markers and colons ([#&#8203;19517](https://github.com/prettier/prettier/pull/19517) by [@&#8203;kovsu](https://github.com/kovsu)) <!-- prettier-ignore --> ```less // Input a { box-shadow + : 0 0 1px #&#8203;000; } // Prettier 3.9.4 a { box-shadow+ : 0 0 1px #&#8203;000; } // Prettier 3.9.5 a { box-shadow+: 0 0 1px #&#8203;000; } ``` ##### Markdown: Preserve wiki links with aliases ([#&#8203;19527](https://github.com/prettier/prettier/pull/19527) by [@&#8203;kovsu](https://github.com/kovsu)) <!-- prettier-ignore --> ```markdown <!-- Input --> [[Foo:Bar]] <!-- Prettier 3.9.4 --> [[Foo]] <!-- Prettier 3.9.5 --> [[Foo:Bar]] ``` ##### TypeScript: Fix comments being dropped on shorthand `type` import/export specifiers ([#&#8203;19565](https://github.com/prettier/prettier/pull/19565) by [@&#8203;kirkwaiblinger](https://github.com/kirkwaiblinger)) <!-- prettier-ignore --> ```tsx // Input export { type /* comment */ T } from "foo"; import { type /* comment */ T } from "foo"; // Prettier 3.9.4 Error: Comment "comment" was not printed. Please report this error! // Prettier 3.9.5 export { type /* comment */ T } from "foo"; import { type /* comment */ T } from "foo"; ``` ##### Miscellaneous: Preserving comments' `placement` property ([#&#8203;19567](https://github.com/prettier/prettier/pull/19567) by [@&#8203;Janther](https://github.com/Janther)) Prettier\@&#8203;3.9.0 deleted an undocumented property on comments, which was already used by plugins, `comment.placement` is now available again after comment attach. ##### Flow: Stop enforcing empty module declaration to break ([#&#8203;19568](https://github.com/prettier/prettier/pull/19568) by [@&#8203;fisker](https://github.com/fisker)) <!-- prettier-ignore --> ```flow // Input declare module "foo" {} // Prettier 3.9.4 declare module "foo" { } // Prettier 3.9.5 declare module "foo" {} ``` ##### Angular: Support expression for exhaustive typechecking ([#&#8203;19571](https://github.com/prettier/prettier/pull/19571) by [@&#8203;fisker](https://github.com/fisker)) <!-- prettier-ignore --> ```html <!-- Input --> @switch (state.mode) { @default never(state); } <!-- Prettier 3.9.4 --> @switch (state.mode) { @default never; } <!-- Prettier 3.9.5 --> @switch (state.mode) { @default never(state); } ``` ##### TypeScript: Ignore comments inside mapped type when checking type parameter comments ([#&#8203;19572](https://github.com/prettier/prettier/pull/19572) by [@&#8203;fisker](https://github.com/fisker)) <!-- prettier-ignore --> ```tsx // Input foo<{ // comment [key in keyof Foo]: number }>(); // Prettier 3.9.4 foo< { // comment [key in keyof Foo]: number; } >(); // Prettier 3.9.5 foo<{ // comment [key in keyof Foo]: number; }>(); ``` ##### Less: Fix adjacent block comments being corrupted ([#&#8203;19574](https://github.com/prettier/prettier/pull/19574) by [@&#8203;kovsu](https://github.com/kovsu)) <!-- prettier-ignore --> ```less // Input /* a *//* b */ /* a */* { color: red; } // Prettier 3.9.4 /* a */ /* b */ /* a * { color: red; } // Prettier 3.9.5 /* a */ /* b */ /* a */ * { color: red; } ``` ##### JavaScript: Handle dangling comments in `SwitchStatement` ([#&#8203;19581](https://github.com/prettier/prettier/pull/19581) by [@&#8203;fisker](https://github.com/fisker)) <!-- prettier-ignore --> ```jsx // Input switch (foo) { // comment } // Prettier 3.9.4 switch ( foo // comment ) { } // Prettier 3.9.5 switch (foo) { // comment } ``` ##### TypeScript: Remove space in comment-only object type ([#&#8203;19583](https://github.com/prettier/prettier/pull/19583) by [@&#8203;fisker](https://github.com/fisker)) <!-- prettier-ignore --> ```tsx // Input var foo = { /* comment */ }; type Foo = { /* comment */ }; // Prettier 3.9.4 var foo = {/* comment */}; type Foo = { /* comment */ }; // Prettier 3.9.5 var foo = {/* comment */}; type Foo = {/* comment */}; ``` ### [`v3.9.4`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#394) [Compare Source](https://github.com/prettier/prettier/compare/3.9.3...3.9.4) [diff](https://github.com/prettier/prettier/compare/3.9.3...3.9.4) ##### Angular: Format `@content(name)` -> `@content (name)` to align with other block syntax ([#&#8203;19499](https://github.com/prettier/prettier/pull/19499) by [@&#8203;fisker](https://github.com/fisker)) <!-- prettier-ignore --> ```html <!-- Input --> <FancyButton [label]="title"> @content (icon) { <span>Icon!</span> } @content (description) { <span>Description text</span> } <span>Other children</span> </FancyButton> <!-- Prettier 3.9.3 --> <FancyButton [label]="title"> @content(icon) { <span>Icon!</span> } @content(description) { <span>Description text</span> } <span>Other children</span> </FancyButton> <!-- Prettier 3.9.4 --> <FancyButton [label]="title"> @content (icon) { <span>Icon!</span> } @content (description) { <span>Description text</span> } <span>Other children</span> </FancyButton> ``` ### [`v3.9.3`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#393) [Compare Source](https://github.com/prettier/prettier/compare/3.9.2...3.9.3) [diff](https://github.com/prettier/prettier/compare/3.9.1...3.9.3) ##### Markdown: Fix unexpected removal of characters in liquid syntax ([#&#8203;19489](https://github.com/prettier/prettier/pull/19489) by [@&#8203;seiyab](https://github.com/seiyab)) <!-- prettier-ignore --> ```md // Input <!-- Input --> {{ page.title }} text <!-- Prettier 3.9.1 --> {{ page.title text <!-- Prettier 3.9.3 --> {{ page.title }} text ``` ##### TypeScript: Allow decorators to be used with declare on class fields ([#&#8203;19492](https://github.com/prettier/prettier/pull/19492) by [@&#8203;evoactivity](https://github.com/evoactivity)) Extensively used within the Ember ecosystem, decorators with `declare` on class fields will ignore the babel parser error and allow Prettier to format the code without breaking it. <!-- prettier-ignore --> ```ts // Input export default class ProjectStatusComponent extends Component<ProjectStatusSig> { @service declare server: ServerService; } // Prettier 3.9.1 // SyntaxError: Decorators can't be used with a declare field. (2:3) // 1 | export default class ProjectStatusComponent extends Component<ProjectStatusSig> { //> 2 | @service declare server: ServerService; // | ^ // 3 | } // Prettier 3.9.3 export default class ProjectStatusComponent extends Component<ProjectStatusSig> { @service declare server: ServerService; } ``` ### [`v3.9.2`](https://github.com/prettier/prettier/compare/3.9.1...3.9.2) [Compare Source](https://github.com/prettier/prettier/compare/3.9.1...3.9.2) ### [`v3.9.1`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#3910) [Compare Source](https://github.com/prettier/prettier/compare/3.9.0...3.9.1) [diff](https://github.com/prettier/prettier/compare/3.9.9...3.9.10) ##### Markdown: Update `micromark-extension-gfm-table` to fix the table parse issue on performance ([#&#8203;20266](https://github.com/prettier/prettier/pull/20266) by [@&#8203;fisker](https://github.com/fisker)) See [micromark/micromark-extension-gfm-table@`4f43ead`](https://github.com/micromark/micromark-extension-gfm-table/commit/4f43ead37b786bc531d924530d4ab4c714886267) for details. ### [`v3.9.0`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#390) [Compare Source](https://github.com/prettier/prettier/compare/3.8.5...3.9.0) [diff](https://github.com/prettier/prettier/compare/3.8.5...3.9.0) 🔗 [Release Notes](https://prettier.io/blog/2026/06/27/3.9.0) ### [`v3.8.5`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#385) [Compare Source](https://github.com/prettier/prettier/compare/3.8.4...3.8.5) [diff](https://github.com/prettier/prettier/compare/3.8.4...3.8.5) ##### Flow: Support `readonly` as a variance annotation ([#&#8203;19022](https://github.com/prettier/prettier/pull/19022) by [@&#8203;marcoww6](https://github.com/marcoww6)) Flow now accepts `readonly` as a property variance annotation, equivalent to `+` (covariant/read-only). <!-- prettier-ignore --> ```jsx // Input type T = { readonly foo: string, }; // Prettier 3.8.4 SyntaxError // Prettier 3.8.5 type T = { readonly foo: string, }; ``` ### [`v3.8.4`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#384) [Compare Source](https://github.com/prettier/prettier/compare/3.8.3...3.8.4) [diff](https://github.com/prettier/prettier/compare/3.8.3...3.8.4) ##### Markdown: Fix blank lines between list items and nested sub-lists being removed in Markdown/MDX ([#&#8203;17746](https://github.com/prettier/prettier/pull/17746) by [@&#8203;byplayer](https://github.com/byplayer)) Prettier was removing blank lines between list items and their nested sub-lists, converting loose lists into tight lists and changing their semantic meaning. <!-- prettier-ignore --> ```markdown <!-- Input --> - a - b - c - d <!-- Prettier 3.8.3 --> - a - b - c - d <!-- Prettier 3.8.4 --> - a - b - c - d ``` ### [`v3.8.3`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#383) [Compare Source](https://github.com/prettier/prettier/compare/3.8.2...3.8.3) [diff](https://github.com/prettier/prettier/compare/3.8.2...3.8.3) ##### SCSS: Prevent trailing comma in `if()` function ([#&#8203;18471](https://github.com/prettier/prettier/pull/18471) by [@&#8203;kovsu](https://github.com/kovsu)) <!-- prettier-ignore --> ```scss // Input $value: if(sass(false): 1; else: -1); // Prettier 3.8.2 $value: if( sass(false): 1; else: -1, ); // Prettier 3.8.3 $value: if(sass(false): 1; else: -1); ``` ### [`v3.8.2`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#382) [Compare Source](https://github.com/prettier/prettier/compare/3.8.1...3.8.2) [diff](https://github.com/prettier/prettier/compare/3.8.1...3.8.2) ##### Angular: Support Angular v21.2 ([#&#8203;18722](https://github.com/prettier/prettier/pull/18722), [#&#8203;19034](https://github.com/prettier/prettier/pull/19034) by [@&#8203;fisker](https://github.com/fisker)) Exhaustive typechecking with `@default never;` <!-- prettier-ignore --> ```html <!-- Input --> @switch (foo) { @case (1) {} @default never; } <!-- Prettier 3.8.1 --> SyntaxError: Incomplete block "default never". If you meant to write the @ character, you should use the "&#&#8203;64;" HTML entity instead. (3:3) <!-- Prettier 3.8.2 --> @switch (foo) { @case (1) {} @default never; } ``` `arrow function` and `instanceof` expressions. <!-- prettier-ignore --> ```html <!-- Input --> @let fn = (a) => a? 1:2; {{ fn ( a instanceof b)}} <!-- Prettier 3.8.1 --> @let fn = (a) => a? 1:2; {{ fn ( a instanceof b)}} <!-- Prettier 3.8.2 --> @let fn = (a) => (a ? 1 : 2); {{ fn(a instanceof b) }} ``` </details> <details> <summary>pyo3/pyo3 (pyo3)</summary> ### [`v0.30.1`](https://github.com/PyO3/pyo3/releases/tag/v0.30.1): PyO3 0.30.1 [Compare Source](https://github.com/pyo3/pyo3/compare/v0.29.3...v0.30.1) PyO3 0.30.1 is a re-release of PyO3 0.30.0 after investments in CI security unfortunately led to a failed crates.io publish. Rather than delete the failed tag, this new tag comes after the CI issues have (hopefully) been corrected. Thanks to [@&#8203;davidhewitt](https://github.com/davidhewitt) [@&#8203;Tpt](https://github.com/Tpt) and [@&#8203;viicos](https://github.com/viicos) for the investigation and fixes. ### [`v0.29.3`](https://github.com/pyo3/pyo3/blob/HEAD/CHANGELOG.md#0293---2026-09-30) [Compare Source](https://github.com/pyo3/pyo3/compare/v0.29.2...v0.29.3) ##### Packaging - Support GraalPy on Windows. [#&#8203;6406](https://github.com/PyO3/pyo3/pull/6406) ##### Added - Add FFI definitions `PyModule_GetState_DuringGC`, `PyModule_GetToken_DuringGC`, `PyObject_GetTypeData_DuringGC`, `PyType_GetModuleState_DuringGC`, `PyType_GetBaseByToken_DuringGC`, `PyType_GetModule_DuringGC`, and `PyType_GetModuleByToken_DuringGC` for Python 3.15 and up. [#&#8203;6419](https://github.com/PyO3/pyo3/pull/6419) ##### Changed - Optimize `u128`/`i128` conversions on Python 3.15+. [#&#8203;6160](https://github.com/PyO3/pyo3/pull/6160) - Preallocate output sets when extracting Python `set` and `frozenset` values into Rust hash sets. [#&#8203;6225](https://github.com/PyO3/pyo3/pull/6225) - Optimize `PyBytes::as_bytes()` when not using `abi3` or `abi3t`. [#&#8203;6377](https://github.com/PyO3/pyo3/pull/6377) ##### Removed - Remove FFI definitions `PyExc_RecursionErrorInst` and `Py_UseClassExceptionsFlag` (not present in supported Python versions). [#&#8203;6421](https://github.com/PyO3/pyo3/pull/6421) ##### Fixed - Revert removal of FFI definition `_PyFrameEvalFunction`, `_PyInterpreterState_GetEvalFrameFunc` and `_PyInterpreterState_SetEvalFrameFunc`, which are not currently treated as CPython private API despite their name. [#&#8203;6195](https://github.com/PyO3/pyo3/pull/6195) - Fix FFI definition `PyUnstable_Eval_RequestCodeExtraIndex` FFI binding to link to the private CPython symbol on Python versions before 3.12. [#&#8203;6195](https://github.com/PyO3/pyo3/pull/6195) - Fix FFI definitions `PyByteArray_GET_SIZE`, `PyList_GET_SIZE`, and `PySet_GET_SIZE` to use an atomic load for free-threaded Python. [#&#8203;6230](https://github.com/PyO3/pyo3/pull/6230) - `experimental-inspect`: deduplicate repeated members of a type union in the generated stubs, and put a space on both sides of the `|` rather than only before it. [#&#8203;6273](https://github.com/PyO3/pyo3/pull/6273) - `experimental-inspect`: `__next__` and `__anext__` returning `Option<T>` (or `PyResult<Option<T>>`) are now introspected as returning `T`, since `None` stops the iteration instead of being yielded. [#&#8203;6274](https://github.com/PyO3/pyo3/pull/6274) - Fix `clippy::clone_on_copy` warnings triggered on nightly Rust by `#[pyclass(from_py_object)]` on classes which implement `Copy`. [#&#8203;6309](https://github.com/PyO3/pyo3/pull/6309) - `experimental-inspect`: `__pow__`, `__rpow__` and `__get__` now introspect their trailing argument as defaulting to `None`, matching the CPython slot wrappers which substitute `None` when it is omitted. [#&#8203;6363](https://github.com/PyO3/pyo3/pull/6363) - `experimental-inspect`: fix the stubs of a package nested inside another package being written into a directory named after its parent instead of its own name. [#&#8203;6365](https://github.com/PyO3/pyo3/pull/6365) - Fix many unresolved symbols when linking for PyPy due to incorrect link names in `pyo3-ffi`. [#&#8203;6389](https://github.com/PyO3/pyo3/pull/6389) - Fix empty tuple type hints being rendered as invalid `tuple[]` instead of `tuple[()]` in generated stubs and `PyStaticExpr` display. [#&#8203;6393](https://github.com/PyO3/pyo3/pull/6393) - `experimental-inspect`: escape stub docstrings to prevent invalid Python syntax. [#&#8203;6394](https://github.com/PyO3/pyo3/pull/6394) - `experimental-inspect`: fix the generated type annotation for `PyBuffer` on `python <3.12` by using `typing_extensions.Buffer` instead of `collections.abc.Buffer`. [#&#8203;6395](https://github.com/PyO3/pyo3/pull/6395) - Fix string constants containing control characters rendering as invalid Python in `Display for PyStaticExpr`. [#&#8203;6397](https://github.com/PyO3/pyo3/pull/6397) - Fix crash when a detached thread is terminated while trying to reattach during interpreter finalization. [#&#8203;6404](https://github.com/PyO3/pyo3/pull/6404) - Fix link failures on 32-bit Windows when `raw-dylib` linking is disabled. [#&#8203;6410](https://github.com/PyO3/pyo3/pull/6410) - Fix DLL load failures on Windows with PyPy when `raw-dylib` linking is disabled. [#&#8203;6410](https://github.com/PyO3/pyo3/pull/6410) - Fix FFI definition `PyVectorcall_Call` failing to link on Python 3.11 and older. [#&#8203;6410](https://github.com/PyO3/pyo3/pull/6410) - Fix many unresolved data symbols when linking for PyPy due to incorrect link names in `pyo3-ffi`. [#&#8203;6421](https://github.com/PyO3/pyo3/pull/6421) - Fix linker errors on PyPy for outdated FFI definitions where PyPy moved from a function to a macro. [#&#8203;6422](https://github.com/PyO3/pyo3/pull/6422) - Fix crash when GC traverses a `#[pyclass]` type object during class attribute initialization. [#&#8203;6453](https://github.com/PyO3/pyo3/pull/6453) ### [`v0.29.2`](https://github.com/pyo3/pyo3/blob/HEAD/CHANGELOG.md#0292---2026-08-05) [Compare Source](https://github.com/pyo3/pyo3/compare/v0.29.1...v0.29.2) ##### Packaging - Add `PYO3_USE_RAW_DYLIB=0` opt-out of `raw-dylib` linking for Windows. [#&#8203;6185](https://github.com/PyO3/pyo3/pull/6185) ##### Fixed - Fix PyO3 0.29 regression with failure to link under Cygwin / MSYS2. [#&#8203;6185](https://github.com/PyO3/pyo3/pull/6185) - Fix stubs generation for field getters (`#[pyo3(get)]`) when `IntoPyObject` is only implemented on references of the field type. [#&#8203;6276](https://github.com/PyO3/pyo3/pull/6276) - Fix `#[classmethod]` magic methods receiving the instance instead of its type when invoked through a type slot. [#&#8203;6283](https://github.com/PyO3/pyo3/pull/6283) - Fix `pyo3_build_config::add_libpython_rpath_link_args` emitting Unix-style rpath linker arguments on Windows and Cygwin. [#&#8203;6284](https://github.com/PyO3/pyo3/pull/6284) - Fix PyO3 0.29.1 regression on PyPy causing crashes when deallocating `#[pyclass]` instances. [#&#8203;6294](https://github.com/PyO3/pyo3/pull/6294) - Fix missing trailing nul in Python 3.9 `#[pyclass]` docstrings. [#&#8203;6296](https://github.com/PyO3/pyo3/pull/6296) - Fix reference count leak of `#[classattr]` values created from `fn` items. [#&#8203;6297](https://github.com/PyO3/pyo3/pull/6297) ### [`v0.29.1`](https://github.com/pyo3/pyo3/blob/HEAD/CHANGELOG.md#0292---2026-08-05) [Compare Source](https://github.com/pyo3/pyo3/compare/v0.29.0...v0.29.1) ##### Packaging - Add `PYO3_USE_RAW_DYLIB=0` opt-out of `raw-dylib` linking for Windows. [#&#8203;6185](https://github.com/PyO3/pyo3/pull/6185) ##### Fixed - Fix PyO3 0.29 regression with failure to link under Cygwin / MSYS2. [#&#8203;6185](https://github.com/PyO3/pyo3/pull/6185) - Fix stubs generation for field getters (`#[pyo3(get)]`) when `IntoPyObject` is only implemented on references of the field type. [#&#8203;6276](https://github.com/PyO3/pyo3/pull/6276) - Fix `#[classmethod]` magic methods receiving the instance instead of its type when invoked through a type slot. [#&#8203;6283](https://github.com/PyO3/pyo3/pull/6283) - Fix `pyo3_build_config::add_libpython_rpath_link_args` emitting Unix-style rpath linker arguments on Windows and Cygwin. [#&#8203;6284](https://github.com/PyO3/pyo3/pull/6284) - Fix PyO3 0.29.1 regression on PyPy causing crashes when deallocating `#[pyclass]` instances. [#&#8203;6294](https://github.com/PyO3/pyo3/pull/6294) - Fix missing trailing nul in Python 3.9 `#[pyclass]` docstrings. [#&#8203;6296](https://github.com/PyO3/pyo3/pull/6296) - Fix reference count leak of `#[classattr]` values created from `fn` items. [#&#8203;6297](https://github.com/PyO3/pyo3/pull/6297) ### [`v0.29.0`](https://github.com/pyo3/pyo3/blob/HEAD/CHANGELOG.md#0290---2026-06-11) [Compare Source](https://github.com/pyo3/pyo3/compare/v0.28.3...v0.29.0) ##### Packaging - Support the new PEP 803 abi3t ABI with new `abi3t` and `abi3t-py315` features. [#&#8203;5807](https://github.com/PyO3/pyo3/pull/5807) - `pyo3-macros-backend` no longer depends on `pyo3-build-config`. [#&#8203;5809](https://github.com/PyO3/pyo3/pull/5809) - Drop support for Python 3.13t (3.14t and above continue to be supported; CPython declared free-threading supported starting with Python 3.14). [#&#8203;5865](https://github.com/PyO3/pyo3/pull/5865) - Drop support for Python 3.7. [#&#8203;5912](https://github.com/PyO3/pyo3/pull/5912) - Extend range of supported versions of `hashbrown` optional dependency to include version 0.17. [#&#8203;5973](https://github.com/PyO3/pyo3/pull/5973) - Support Python 3.15.0b1. [#&#8203;6014](https://github.com/PyO3/pyo3/pull/6014) - `pyo3-ffi` is now `no_std`. [#&#8203;6022](https://github.com/PyO3/pyo3/pull/6022) ##### Added - Add `PyErr::set_traceback` to set the traceback of an exception object. [#&#8203;5349](https://github.com/PyO3/pyo3/pull/5349) - Add `PyUnicodeDecodeError::new_err_from_utf8` to create a `PyErr` from a `str::Utf8Error`. [#&#8203;5668](https://github.com/PyO3/pyo3/pull/5668) - `experimental-inspect`: implement `INPUT_TYPE` and `OUTPUT_TYPE` on optional third-party crate conversions. [#&#8203;5770](https://github.com/PyO3/pyo3/pull/5770) - `experimental-inspect`: include doc comments in generated stubs. [#&#8203;5782](https://github.com/PyO3/pyo3/pull/5782) - Add `pyo3_build_config::PythonAbi`, `pyo3_build_config::PythonAbiKind`, `pyo3_build_config::PythonAbiBuilder`, `pyo3_build_config::InterpreterConfig::target_abi`, and `pyo3_build_config::InterpreterConfigBuilder::target_abi`. [#&#8203;5807](https://github.com/PyO3/pyo3/pull/5807) - Add `Borrowed::get` as an equivalent to `Bound::get` and `Py::get`. [#&#8203;5849](https://github.com/PyO3/pyo3/pull/5849) - Add `PyFrame::new`, `PyTraceBack::new`, and `PyFrameMethods::line_number`. [#&#8203;5857](https://github.com/PyO3/pyo3/pull/5857) - Add `PyUntypedBuffer::obj` to retrieve the Python object owning the buffer. [#&#8203;5870](https://github.com/PyO3/pyo3/pull/5870) - Add `PyCapsule::new_with_value` and `PyCapsule::new_with_value_and_destructor`. [#&#8203;5881](https://github.com/PyO3/pyo3/pull/5881) - Add `PyErr::set_context` and `PyErr::context`. [#&#8203;5887](https://github.com/PyO3/pyo3/pull/5887) - Add a small CLI to `pyo3-introspection` to generate stubs. [#&#8203;5904](https://github.com/PyO3/pyo3/pull/5904) - Add `Python::version_str`. [#&#8203;5921](https://github.com/PyO3/pyo3/pull/5921) - Add `TryFrom<&Bound<T>>` for `PyRef<T>`, `PyRefMut<T>`, `PyClassGuard<T>` and `PyClassGuardMut<T>`. [#&#8203;5922](https://github.com/PyO3/pyo3/pull/5922) - Add `From<&Bound<T>>` for `Bound<T>` and `Py<T>` [#&#8203;5922](https://github.com/PyO3/pyo3/pull/5922) - Add `PyDictMethods::set_default` and `PyDictMethods::set_default_ref` to allow atomically setting default values in a PyDict. [#&#8203;5955](https://github.com/PyO3/pyo3/pull/5955) - add `PyFrameMethods::outer|code|var|builtins|globals|locals`. [#&#8203;5967](https://github.com/PyO3/pyo3/pull/5967) - Add `From` conversions for `PyErr` from `std::time::TryFromFloatSecsError`, `std::time::SystemTimeError`, `std::path::StripPrefixError`, `std::env::JoinPathsError`, `std::char::ParseCharError`, and `std::char::CharTryFromError`. [#&#8203;6001](https://github.com/PyO3/pyo3/pull/6001) - Add `pyo3_build_config::InterpreterConfigBuilder`. [#&#8203;6034](https://github.com/PyO3/pyo3/pull/6034) - Add `PyCapsule::import_pointer` [#&#8203;6066](https://github.com/PyO3/pyo3/pull/6066) - Add `PyClassGuardMapMut`. [#&#8203;6073](https://github.com/PyO3/pyo3/pull/6073) - Expose `PyListMethods::get_item_unchecked`, `PyTupleMethods::get_item_unchecked`, and `PyTupleMethods::get_borrowed_item_unchecked` on abi3. [#&#8203;6075](https://github.com/PyO3/pyo3/pull/6075) - Add `PyClassGuardMapSuper`. [#&#8203;6104](https://github.com/PyO3/pyo3/pull/6104) - Add `PyClassGuard` and `PyClassGuardMut` to `pyo3::prelude`. [#&#8203;6112](https://github.com/PyO3/pyo3/pull/6112) - Add `Debug` impls for `PyClassGuard` and `PyClassGuardMut`. [#&#8203;6112](https://github.com/PyO3/pyo3/pull/6112) - Enable extending `PyDateTime`, `PyDate`, `PyTime`, `PyDelta` and `PyTzInfo` on abi3 with python 3.12+. [#&#8203;6115](https://github.com/PyO3/pyo3/pull/6115) - Expose `PyFunction` available on abi3. [#&#8203;6117](https://github.com/PyO3/pyo3/pull/6117) - FFI definitions: - Added FFI definitions `PyUnstable_Object_IsUniquelyReferenced`, `PyUnstable_Object_IsUniquelyReferencedTemporary`, `PyUnstable_EnableTryIncref`, and `PyUnstable_TryIncref`. [#&#8203;5828](https://github.com/PyO3/pyo3/pull/5828) - Add FFI definitions `ffi::PyErr_GetHandledException` and `ffi::PyErr_SetHandledException`. [#&#8203;5887](https://github.com/PyO3/pyo3/pull/5887) - Add FFI definition `Py_HASH_SIPHASH13`. [#&#8203;5891](https://github.com/PyO3/pyo3/pull/5891) - Add FFI definition `PyStructSequence_UnnamedField` constant on Python 3.9 and up (or 3.11 with abi3 features). [#&#8203;5892](https://github.com/PyO3/pyo3/pull/5892) - Add FFI definitions `PyUnstable_InterpreterFrame_GetCode`, `PyUnstable_InterpreterFrame_GetLasti`, `PyUnstable_InterpreterFrame_GetLine`, and `PyUnstable_ExecutableKinds`. [#&#8203;5932](https://github.com/PyO3/pyo3/pull/5932) - Add FFI definitions `PyMarshal_WriteLongToFile`, `PyMarshal_WriteObjectToFile`, `PyMarshal_ReadLongFromFile`, `PyMarshal_ReadShortFromFile`, `PyMarshal_ReadObjectFromFile`, and `PyMarshal_ReadLastObjectFromFile`. [#&#8203;5934](https://github.com/PyO3/pyo3/pull/5934) - Add FFI definitions `PyObject_GetAIter`, `PyAIter_Check`, `PyMapping_HasKeyWithError`, `PyMapping_HasKeyStringWithError`, `PyMapping_GetOptionalItem`, `PyMapping_GetOptionalItemString`, `PySequence_ITEM`, `PySequence_Fast_GET_SIZE`, `PySequence_Fast_GET_ITEM`, and `PySequence_Fast_ITEMS`. [#&#8203;5942](https://github.com/PyO3/pyo3/pull/5942) - Add FFI definition `compat::PyObject_HasAttrWithError`. [#&#8203;5944](https://github.com/PyO3/pyo3/pull/5944) - Add FFI definitions `PyDict_SetDefault`, `PyDict_SetDefaultRef`, `PyDict_ContainsString`, `PyDict_Pop`, `PyDict_PopString`, `PyDict_ClearWatcher`, `PyDict_Watch`, `PyDict_Unwatch`, and `PyFrozenDict_New`. [#&#8203;5947](https://github.com/PyO3/pyo3/pull/5947) - Add FFI definitions `PyDate_FromDate`, `PyDateTime_FromDateAndTime`, `PyDateTime_FromDateAndTimeAndFold`, `PyTime_FromTime`, `PyTime_FromTimeAndFold`, and `PyDelta_FromDSU`. [#&#8203;5949](https://github.com/PyO3/pyo3/pull/5949) - Add FFI definitions `PyDict_SetDefaultRef` and `compat::PyDict_SetDefaultRef`. [#&#8203;5955](https://github.com/PyO3/pyo3/pull/5955) versions. - Add FFI definitions for non-limited API header `cpython/bytearrayobject.h`. [#&#8203;5966](https://github.com/PyO3/pyo3/pull/5966) - Add FFI definitions for non-limited API version of `PyCellObject` and associated functions. [#&#8203;5978](https://github.com/PyO3/pyo3/pull/5978) - Add FFI definition `PyErr_WarnExplicitObject`. [#&#8203;5979](https://github.com/PyO3/pyo3/pull/5979) - Add FFI definition `PyTracebackObject`. [#&#8203;5980](https://github.com/PyO3/pyo3/pull/5980) - Add FFI definition `PyTuple_FromArray` on 3.15+. [#&#8203;5990](https://github.com/PyO3/pyo3/pull/5990) - Add FFI definitions for the PEP 820 PySlot C API. [#&#8203;6014](https://github.com/PyO3/pyo3/pull/6014) - Add FFI definitions for the critical section API in the limited API on Python 3.15 and newer. [#&#8203;6014](https://github.com/PyO3/pyo3/pull/6014) - Add FFI definitions for [PEP 757](https://peps.python.org/pep-0757/) `PyLong` import / export API on Python 3.14+. [#&#8203;6016](https://github.com/PyO3/pyo3/pull/6016) - Add FFI definitions `PyEval_SetProfileAllThreads` and `PyEval_SetTraceAllThreads`. [#&#8203;6038](https://github.com/PyO3/pyo3/pull/6038) - Add FFI definition `Py_UNICODE_TODECIMAL`. [#&#8203;6041](https://github.com/PyO3/pyo3/pull/6041) ##### Changed - Change exception enrichment on `#[pyfunction]` argument extraction error to use `PyErr::add_note` instead of replacing `TypeError` instances. [#&#8203;5349](https://github.com/PyO3/pyo3/pull/5349) - Deprecate super-class initialization via tuples. [#&#8203;5741](https://github.com/PyO3/pyo3/pull/5741) - Change module initialization uses the PyModExport and PyABIInfo APIs on Python 3.15+. [#&#8203;5753](https://github.com/PyO3/pyo3/pull/5753) - Deprecate `Py<T>::get_refcnt` and `PyAnyMethods::get_refcnt` in favor of `pyo3::ffi::Py_REFCNT(obj.as_ptr())`. [#&#8203;5797](https://github.com/PyO3/pyo3/pull/5797) - Change `PyEnvironmentError`, `PyIOError`, and `PyWindowsError` to be type aliases of `PyOSError` (as is the case in Python since 3.3). [#&#8203;5803](https://github.com/PyO3/pyo3/pull/5803) - Change `pyo3_build_config::InterpreterConfig::from_interpreter` to require an additional `stable_abi_version` argument. The old behavior is the same as passing `None`. [#&#8203;5807](https://github.com/PyO3/pyo3/pull/5807) - Change `PyList::new` to no longer have `ExactSizeIterator` bound. [#&#8203;5830](https://github.com/PyO3/pyo3/pull/5830) - `experimental-inspect`: emit `#[classattribute]` as plain Python class attributes and not functions annotated with `@classattribute` and `@property`. [#&#8203;5839](https://github.com/PyO3/pyo3/pull/5839) - `experimental-inspect`: use `object` as the input annotation type of magic methods that return `NonImplemented` if the input value is not of the correct type. [#&#8203;5841](https://github.com/PyO3/pyo3/pull/5841) - Deprecate `pyo3-build-config/resolve-config` feature. [#&#8203;5862](https://github.com/PyO3/pyo3/pull/5862) - Change `pyo3-ffi` to use raw-dylib for Windows linking. [#&#8203;5866](https://github.com/PyO3/pyo3/pull/5866) - Deprecate `generate-import-lib` feature. [#&#8203;5866](https://github.com/PyO3/pyo3/pull/5866) - Allow zero-sized types in `PyCapsule::new`. [#&#8203;5889](https://github.com/PyO3/pyo3/pull/5889) - `PyDate::from_timestamp` argument is now a `f64` (the Python API expects a float and not an integer) [#&#8203;5896](https://github.com/PyO3/pyo3/pull/5896) - `experimental-inspect`: Change `PathBuf::extract` input type hint from `str | os.PathLike` to `str | os.PathLike[str]` [#&#8203;5897](https://github.com/PyO3/pyo3/pull/5897) - Remove lifetime from `PythonVersionInfo`. [#&#8203;5921](https://github.com/PyO3/pyo3/pull/5921) - Remove redundant type checks for methods where CPython guarantees the type of `self`. [#&#8203;5930](https://github.com/PyO3/pyo3/pull/5930) - Elide temporary reference count cycles inside `PyAnyMethods::call`, `PyAnyMethods::call1` and `PyAnyMethods::call_method1` for arguments passed as Rust tuples containing borrowed references to Python objects. [#&#8203;5941](https://github.com/PyO3/pyo3/pull/5941) - Allow type annotations to be used in `#[pyo3(signature = ...)]` when `experimental-inspect` feature is not enabled (they will be ignored). [#&#8203;5999](https://github.com/PyO3/pyo3/pull/5999) - `pyo3-ffi` will now rebuild when the Python virtual environment changes in-place. [#&#8203;6008](https://github.com/PyO3/pyo3/pull/6008) - Change module initialization on 3.15+ to use PEP 820 PySlot API internally. [#&#8203;6014](https://github.com/PyO3/pyo3/pull/6014) - Deprecate direct access to all `pyo3_build_config::InterpreterConfig` fields; getter methods have been added as replacements. [#&#8203;6034](https://github.com/PyO3/pyo3/pull/6034) - FFI definitions `_PyCode_GetExtra`, `_PyCode_SetExtra`, and `_PyEval_RequestCodeExtraIndex` have been updated to `PyUnstable_Code_GetExtra`, `PyUnstable_Code_SetExtra`, and `PyUnstable_Eval_RequestCodeExtraIndex`. [#&#8203;6038](https://github.com/PyO3/pyo3/pull/6038) - Change `PyCapsule::import` to return an error if the pointer is not properly aligned. [#&#8203;6066](https://github.com/PyO3/pyo3/pull/6066) - Change `PyClassGuardMap` to be only for `PyClassGuard::map` and return `PyClassGuardMapMut` from `PyClassGuardMut::map`. [#&#8203;6073](https://github.com/PyO3/pyo3/pull/6073) - Change `with_critical_section_mutex2` closure to take `Option<EnteredCriticalSection>` instead of `EnteredCriticalSection` as the second argument. [#&#8203;6098](https://github.com/PyO3/pyo3/pull/6098) - `PyClassGuardMut::as_super` now returns `PyClassGuardMutSuper`. [#&#8203;6104](https://github.com/PyO3/pyo3/pull/6104) - `experimental-inspect`: Generate relative imports instead of absolute ones (useful if the stubs are not describing a root package) [#&#8203;6097](https://github.com/PyO3/pyo3/pull/6097) ##### Removed - Removed the broken (and unfixable) implementations of `From<str::Utf8Error>`, `From<string::FromUtf16Error>`, and `From<char::DecodeUtf16Error>` for `PyErr`. [#&#8203;5668](https://github.com/PyO3/pyo3/pull/5668) - Remove `Py_TRACE_REFS` support (unsupported from Python 3.13). [#&#8203;5824](https://github.com/PyO3/pyo3/pull/5824) - `experimental-inspect`: Remove the `TypeInfo` enum and the `FromPyObject::type_input` and `IntoPyObject::type_output` functions. They are replaced by the `PyStaticExpr` enum and the `FromPyObject::INPUT_TYPE` and the `IntoPyObject::OUTPUT_TYPE` associated constants. [#&#8203;5893](https://github.com/PyO3/pyo3/pull/5893) - Remove all functionality deprecated in PyO3 0.27. [#&#8203;6068](https://github.com/PyO3/pyo3/pull/6068) - FFI definitions: - Remove private FFI definitions `_PyStack_AsDict`, `_PyObject_CallNoArg`, `_PyObject_FastCall`, `_PyObject_FastCallTstate`. `_PyObject_VectorcallTstate`, `_PyObject_MakeTpCall`, `_Py_CheckFunctionResult`, `_PyObject_CallFunction_SizeT`, `_PyObject_CallMethod_SizeT`, and `_PySequence_IterSearch`. [#&#8203;5942](https://github.com/PyO3/pyo3/pull/5942) - Remove FFI definitions `PY_ITERSEARCH_COUNT`, `PY_ITERSEARCH_INDEX`, and `PY_ITERSEARCH_CONTAINS`. [#&#8203;5942](https://github.com/PyO3/pyo3/pull/5942) - Removed private FFI definitions `_PySet_NextEntry`, and `_PyLong_NumBits`. [#&#8203;5946](https://github.com/PyO3/pyo3/pull/5946) - Remove private FFI definitions `_PyFloat_CAST`, `_PyRun_SimpleFileObject`, `_PyRun_AnyFileObject`, `_PyRun_InteractiveLoopObject`, `_PyUnicode_CheckConsistency`, `_PyUnicode_COMPACT_DATA`, `_PyUnicode_NONCOMPACT_DATA`, `_PyUnicode_Ready`, and `_Py_HashBytes`. [#&#8203;6036](https://github.com/PyO3/pyo3/pull/6036) - Remove private FFI definition `_PyEval_EvalFrameDefault`. [#&#8203;6038](https://github.com/PyO3/pyo3/pull/6038) - Remove private FFI definition `_PyBytes_Resize`. [#&#8203;6042](https://github.com/PyO3/pyo3/pull/6042) - Remove private FFI definitions `_PyErr_BadInternalCall`, `_Py_GetAllocatedBlocks`, `_PyObject_GC_Malloc`, `_PyObject_GC_Calloc`, and `_PyLong_NumBits`. [#&#8203;6053](https://github.com/PyO3/pyo3/pull/6053) - Remove `Default` for FFI definitions `PyHeapTypeObject`, `PyObjectArenaAllocator`, `PyHash_FuncDef`, and `PyType_Spec`. [#&#8203;6093](https://github.com/PyO3/pyo3/pull/6093) ##### Fixed - Fix `add_libpython_rpath_link_args` emitting rpath link args on wasm targets which don't support rpath. [#&#8203;5447](https://github.com/PyO3/pyo3/pull/5447) - Fix `From<string::FromUtf8Error>` and `From<ffi::IntoStringError>` for `PyErr` producing `TypeError` due to broken internals. [#&#8203;5668](https://github.com/PyO3/pyo3/pull/5668) - Fix `PyMappingProxy::is_type_of` and `PyWeakrefReference::is_type_of` not accepting subclasses. [#&#8203;5883](https://github.com/PyO3/pyo3/pull/5883) - Fix `getattr_opt` not treating `AttributeError` subclasses as missing attributes on Python < 3.13. [#&#8203;5985](https://github.com/PyO3/pyo3/pull/5985) - Fix compilation error for `#[new]` return types that contain named lifetimes. [#&#8203;5998](https://github.com/PyO3/pyo3/pull/5998) - Fix missing `'static` bound on `PyCapsule` destructors. [#&#8203;6049](https://github.com/PyO3/pyo3/pull/6049) - Fix case where `PyFrame::builtins` could return a non-dict object. [#&#8203;6052](https://github.com/PyO3/pyo3/pull/6052) - Fix type confusion when returning a `#[pyclass]` from a different pyclass' `#[new]` method. [#&#8203;6062](https://github.com/PyO3/pyo3/pull/6062) - Fix soundness issue caused by variance in `PyClassGuardMap` by splitting off the mutable variant. [#&#8203;6073](https://github.com/PyO3/pyo3/pull/6073) - Fix nondeterministic JSON metadata emitted by the `experimental-inspect` proc macros (to enable reproducible builds). [#&#8203;6076](https://github.com/PyO3/pyo3/pull/6076) - Fix UB in `PyEval_RestoreThread` when the interpreter is shutting down on Python 3.13 and older (hang the thread instead of allowing `pthread_exit` to jump across Rust frames). [#&#8203;6085](https://github.com/PyO3/pyo3/pull/6085) - Fix possible out of bounds read in `BoundListIterator` and `BoundTupleIterator`'s `nth` and `nth_back` implementations. [#&#8203;6086](https://github.com/PyO3/pyo3/pull/6086) - Fix `BoundListIterator` and `BoundTupleIterator` not being exhausted when `nth` or `nth_back` is called with N larger than the remaining count of items. [#&#8203;6086](https://github.com/PyO3/pyo3/pull/6086) - Fix missing `Sync` bound on closure type in `PyCFunction::new_closure`. [#&#8203;6096](https://github.com/PyO3/pyo3/pull/6096) - Fix soundness issue caused by exposing a mutable reference from `PyClassGuardMut::as_super` by moving into `PyClassGuardMutSuper`. [#&#8203;6104](https://github.com/PyO3/pyo3/pull/6104) - FFI definitions: - Fix missing FFI definition for `PyTypeObject.tp_versions_used` on Python 3.13 and newer. [#&#8203;5917](https://github.com/PyO3/pyo3/pull/5917) - Mark FFI definitions no longer available on 3.11 and up: `PyUnicode_Encode`, `PyUnicode_EncodeASCII`, `PyUnicode_EncodeCharmap`, `PyUnicode_EncodeDecimal`, `PyUnicode_EncodeLatin1`, `PyUnicode_EncodeRawUnicodeEscape`, `PyUnicode_EncodeUTF7`, `PyUnicode_EncodeUTF8`, `PyUnicode_EncodeUTF16`, `PyUnicode_EncodeUTF32`, `PyUnicode_EncodeUnicodeEscape`, `PyUnicode_TransformDecimalToASCII`, and `PyUnicode_TranslateCharmap`. [#&#8203;6041](https://github.com/PyO3/pyo3/pull/6041) - Mark FFI definition `PyUnicode_ClearFreeList` no longer available on 3.9 and up. [#&#8203;6041](https://github.com/PyO3/pyo3/pull/6041) - Fix FFI definition `PyErr_SetInterruptEx` missing `c_int` return type. [#&#8203;6043](https://github.com/PyO3/pyo3/pull/6043) - Fix return type of FFI definition `PyBuffer_SizeFromFormat` on Python 3.8 (was changed from `c_int` to `Py_ssize_t` on Python 3.9). [#&#8203;6090](https://github.com/PyO3/pyo3/pull/6090) - Fix return type of FFI definition `PyUnicode_Tailmatch` on PyPy (is `c_int`, unlike CPython). [#&#8203;6090](https://github.com/PyO3/pyo3/pull/6090) ### [`v0.28.3`](https://github.com/pyo3/pyo3/blob/HEAD/CHANGELOG.md#0283---2026-04-02) [Compare Source](https://github.com/pyo3/pyo3/compare/v0.28.2...v0.28.3) ##### Fixed - Fix compile error with `#[pyclass(get_all)]` on a type named `Probe`. [#&#8203;5837](https://github.com/PyO3/pyo3/pull/5837) - Fix compile error in debug builds related to `_Py_NegativeRefcount` with Python < 3.12. [#&#8203;5847](https://github.com/PyO3/pyo3/pull/5847) - Fix a race condition where `Python::attach` or `try_attach` could return before `site.py` had finished running. [#&#8203;5903](https://github.com/PyO3/pyo3/pull/5903) - Fix unsoundness in `PyBytesWriter::write_vectored` with Python 3.15 prerelease versions. [#&#8203;5907](https://github.com/PyO3/pyo3/pull/5907) - Fix deadlock in `.into_pyobject()` implementation for C-like `#[pyclass]` enums. [#&#8203;5928](https://github.com/PyO3/pyo3/pull/5928) </details> <details> <summary>rust-lang/rust (rust)</summary> ### [`v1.99.1`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1991-2026-10-15) [Compare Source](https://github.com/rust-lang/rust/compare/1.99.0...1.99.1) \=========================== <a id="1.99.1"></a> - [library: fix missing symbol `wcslen` on UEFI and embedded targets](https://github.com/rust-lang/rust/issues/163614) - [rustc: fix miscompilation of FFI `bool` return values on x86_64](https://github.com/rust-lang/rust/issues/163911) - [rust-lld: add the rpath for `libLLVM` on macOS](https://github.com/rust-lang/rust/issues/163947) ### [`v1.99.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1990-2026-10-01) [Compare Source](https://github.com/rust-lang/rust/compare/1.98.1...1.99.0) \========================== <a id="1.99.0-Language"></a> ## Language - [Add allow-by-default `raw_borrows_via_references` lint that checks for references that decay immediately into raw borrows](https://github.com/rust-lang/rust/pull/138230) - [Extend `unconditional_panic` lint to function calls that panic when the chunks/windows size is zero](https://github.com/rust-lang/rust/pull/153563) - [Stabilize C-variadic function definitions](https://github.com/rust-lang/rust/pull/155697) - [Stabilize the ability to use `#[unsafe(naked)]` functions to define C-variadic functions (`#![feature(c_variadic_naked_functions)]`).](https://github.com/rust-lang/rust/pull/159746) - [Trait methods are now resolved on an adjusted never type (producing a FCW)](https://github.com/rust-lang/rust/pull/156047) - [Coerce from inference variables to trait objects if the inference variable is related via subtyping to a type that is known to be `Sized`](https://github.com/rust-lang/rust/pull/157820) - [Stabilize `#[my_macro] mod foo;`](https://github.com/rust-lang/rust/pull/157857). This allows outlined modules (`mod foo;`) anywhere in the body of a custom attribute or derive macro. - [Fix the `overflowing_literals` lint with repeated negation](https://github.com/rust-lang/rust/pull/158302). For instance, it will now no longer lint on `--128_i8`, which is already detected by the `arithmetic_overflow` lint. - [Add POSIX symbols to the `invalid_runtime_symbol_definitions` and `suspicious_runtime_symbol_definitions` lints](https://github.com/rust-lang/rust/pull/158522) - [Lint unused `#[path]` attributes on inline modules](https://github.com/rust-lang/rust/pull/158835) - [Enable `unreachable_cfg_select_predicates` lint as part of `unused` lint group](https://github.com/rust-lang/rust/pull/159179) - [Stabilize passing 128-bit integers via vector registers with `asm!` on x86](https://github.com/rust-lang/rust/pull/159525) - [Explicitly document that some allocations are allowed to grow in-place (but none are allowed to shrink)](https://github.com/rust-lang/rust/pull/159729) - We now [guarantee](https://github.com/rust-lang/rust/pull/159730) that the contents of an `UnsafeCell` can be accessed without going through `get` - [The `invalid_reference_casting` lint was adjusted accordingly](https://github.com/rust-lang/rust/pull/159960) - [Account for globally enabled target features in `global_asm!`](https://github.com/rust-lang/rust/pull/160594) - [Warn if an invalid `doc` attribute is used on a macro invocation](https://github.com/rust-lang/rust/pull/161003) <a id="1.99.0-Compiler"></a> ## Compiler - [Convert `-Ctarget-cpu` into a target-modifier for AVR, AMDGCN and NVPTX](https://github.com/rust-lang/rust/pull/150732) - [Enable `static_position_independent_executables` on all gnu targets](https://github.com/rust-lang/rust/pull/158510) - When providing a suggestion about a missing method, rustc now prefers an exactly matching name from a [doc alias attribute](https://doc.rust-lang.org/rustdoc/advanced-features.html#add-aliases-for-an-item-in-documentation-search) over a similarity search from other method names. If your new users sometimes expect a method under a different name, adding a doc alias will now help them find it via rustc suggestions, in addition to helping them find it via rustdoc search: [When suggesting method names, prefer *exact* doc aliases over similar names](https://github.com/rust-lang/rust/pull/160369) <a id="1.99.0-Platform-Support"></a> ## Platform Support - [Promote `riscv64-unknown-linux-musl` to Tier 2 with host tools](https://github.com/rust-lang/rust/pull/158766) Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support. [platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html <a id="1.99.0-Libraries"></a> ## Libraries - Iteration on `RangeInclusive` (`a..=b` ranges) is now [optimized better in some circumstances](https://github.com/rust-lang/rust/pull/155114). As a side effect of this, the behavior of `RangeInclusive` values that has already been exhausted (as an iterator) has changed. For example, the return values of `start()` and `end()` on such ranges may return different values, and using such ranges as slice indexes may have different behavior. These behaviors were not guaranteed to be stable, so these changes are considered to not be breaking changes. - [Relax `transmute_copy` to accept `?Sized` types](https://github.com/rust-lang/rust/pull/155989) - [Update `transmute_copy` to use a non-unwinding panic](https://github.com/rust-lang/rust/pull/155989) - [Don't escape U+FF9E and U+FF9F in `escape_debug_ext`](https://github.com/rust-lang/rust/pull/158057) - [Re-export `core::fmt::NumBuffer` in `alloc` (and `std`)](https://github.com/rust-lang/rust/pull/161430) <a id="1.99.0-Stabilized-APIs"></a> ## Stabilized APIs - [`IntoIterator` for `Box<[T; N]>`](https://doc.rust-lang.org/stable/std/iter/trait.IntoIterator.html#impl-IntoIterator-for-Box%3C%5BT;+N%5D,+A%3E) - [`IntoIterator` for `&Box<[T; N]>`](https://doc.rust-lang.org/stable/std/iter/trait.IntoIterator.html#impl-IntoIterator-for-%26Box%3C%5BT;+N%5D,+A%3E) - [`IntoIterator` for `&mut Box<[T; N]>`](https://doc.rust-lang.org/stable/std/iter/trait.IntoIterator.html#impl-IntoIterator-for-%26mut+Box%3C%5BT;+N%5D,+A%3E) - [`VecDeque::retain_back`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.retain_back) - [`core::ffi::VaList`](https://doc.rust-lang.org/stable/core/ffi/struct.VaList.html) - [`Box::into_non_null`](https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.into_non_null) - [`Box::from_non_null`](https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.from_non_null) - [`Vec::into_parts`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.into_parts) - [`Vec::from_parts`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.from_parts) - [`core::mem::size_of_val_raw`](https://doc.rust-lang.org/stable/core/mem/fn.size_of_val_raw.html) - [`core::mem::align_of_val_raw`](https://doc.rust-lang.org/stable/core/mem/fn.align_of_val_raw.html) - [`core::alloc::Layout::for_value_raw`](https://doc.rust-lang.org/stable/core/alloc/struct.Layout.html#method.for_value_raw) - [`String::from_utf8_lossy_owned`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.from_utf8_lossy_owned) - [`string::FromUtf8Error::into_utf8_lossy`](https://doc.rust-lang.org/stable/std/string/struct.FromUtf8Error.html#method.into_utf8_lossy) - [`FusedIterator for StepBy<I>`](https://doc.rust-lang.org/stable/std/iter/struct.StepBy.html#impl-FusedIterator-for-StepBy%3CI%3E) - [`std::fs::set_times`](https://doc.rust-lang.org/stable/std/fs/fn.set_times.html) - [`std::fs::set_times_nofollow`](https://doc.rust-lang.org/stable/std/fs/fn.set_times_nofollow.html) - [`<LocalKey<Cell<T>>>::update`](https://doc.rust-lang.org/stable/std/thread/struct.LocalKey.html#method.update) <a id="1.99.0-Cargo"></a> ## Cargo - Add a new built-in profile `debug`. This is a preparation for transitioning the `dev` profile away from debugging to give a saner default for faster development iterations. Currently there is no difference between `dev` and `debug` profiles. [docs](https://doc.rust-lang.org/nightly/cargo/reference/profiles.html#debug-1) [#&#8203;17214](https://github.com/rust-lang/cargo/pull/17214) - Workspace members on edition 2024 or later can now override an inherited workspace dependency's `default-features` field. For example, `serde = { workspace = true, default-features = false }` now turns off default features even when the workspace definition enables them. On earlier editions, `default-features = false` is ignored with a warning. ([RFC 3945](https://github.com/rust-lang/rfcs/pull/3945)) [#&#8203;17126](https://github.com/rust-lang/cargo/pull/17126) See also the [full Cargo changelog](https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-199-2026-10-01) <a id="1.99.0-Rustdoc"></a> ## Rustdoc - [Add new `unused_footnote_definition` rustdoc lint](https://github.com/rust-lang/rust/pull/137858) - Smarter filtering of trait impls yields performance improvements of 20% on average and up to 40% on some real-world crates. ([1](https://github.com/rust-lang/rust/pull/159623), [2](https://github.com/rust-lang/rust/pull/159721), [3](https://github.com/rust-lang/rust/pull/159779), [4](https://github.com/rust-lang/rust/pull/159854), [5](https://github.com/rust-lang/rust/pull/159091)) <a id="1.99.0-Compatibility-Notes"></a> ## Compatibility Notes - [Fully deprecate the legacy integral modules](https://github.com/rust-lang/rust/pull/146882). For example, `std::i32::MAX` should be accessed via `i32::MAX` instead. - [Upgrade `no_mangle_generic_items` into hard error](https://github.com/rust-lang/rust/pull/154585) - [The `Pin::new_unchecked` has had its safety invariants changed slightly](https://github.com/rust-lang/rust/pull/156935) - [Do not promote references to extern statics](https://github.com/rust-lang/rust/pull/157641) - [Ensure that the inferred types of `let` patterns typecheck](https://github.com/rust-lang/rust/pull/157841) - [hermit/fs: Return `unsupported()` instead of `from_raw_os_error(22)`](https://github.com/rust-lang/rust/pull/158247) - [Fixed a bug where `#[repr(simd)]` was accidentally allowed on macro invocations on stable Rust](https://github.com/rust-lang/rust/pull/158523) - [Abort const-eval when there are generics in the type of the value being produced](https://github.com/rust-lang/rust/pull/159504) - [Attributes not applying to anything are now an error in code blocks in doc comments](https://github.com/rust-lang/rust/pull/159849) - [`Box::leak`: tell people to avoid unleaking](https://github.com/rust-lang/rust/pull/160323) - [PowerPC inline ASM: Fix scalar floats being in the wrong vector lane on little endian](https://github.com/rust-lang/rust/pull/160441) - [Do not take `doc(cfg())` into account when filtering doctests](https://github.com/rust-lang/rust/pull/159014) - [Infer anonymous lifetimes in the types of associated consts as `'static`](https://github.com/rust-lang/rust/pull/156508) - Macros that expand to a semicolon now produce a warning lint (`semicolon_in_expressions_from_non_local_macros`) even when the macro comes from another crate. Previously, such warnings only appeared for macros from the same crate, to avoid showing warnings that can't be fixed locally; however, this masked problems, as integration tests from the crate providing the macro get compiled as a separate crate, so tests often wouldn't reveal this issue. If you encounter a lint like this, please make sure to report it to the crate providing the macro so they can fix it; don't just silence it in your own crate. - [`semicolon_in_expressions_from_macros`: Lint on non-local macros too](https://github.com/rust-lang/rust/pull/159222) - [Split non-local `semicolon_in_expressions_from_macros` into a separate lint](https://github.com/rust-lang/rust/pull/159700) - In Cargo, incremental compilation is now disabled by default when running in CI. CI is detected via the `CI` environment variable. [#&#8203;17220](https://github.com/rust-lang/cargo/pull/17220) - [The Rust Reference no longer recommends using a single pattern to match a union alongside another value, such as in a manually-written tagged union](https://github.com/rust-lang/reference/pull/2303). This was because it was found that such code would, in some circumstances, result in the compiler reading the contents of the union before checking if the rest of the scrutinee matches the rest of the pattern. This can cause undefined behavior in code similar to what the reference previously recommended. <a id="1.99.0-Internal-Changes"></a> ## Internal Changes These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools. - [Update to LLVM 23](https://github.com/rust-lang/rust/pull/158734) ### [`v1.98.1`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1981-2026-09-03) [Compare Source](https://github.com/rust-lang/rust/compare/1.98.0...1.98.1) \=========================== <a id="1.98.1"></a> - [rustc: fix miscompilation in generating vtables](https://github.com/rust-lang/rust/issues/161441) ### [`v1.98.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1980-2026-08-20) [Compare Source](https://github.com/rust-lang/rust/compare/1.97.1...1.98.0) \========================== <a id="1.98.0-Language"></a> ## Language - [Allow shortening lifetime of `&mut` when unsize-coercing, even in an invariant position.](https://github.com/rust-lang/rust/pull/149219) For example, you can now coerce a `Cell<&'long mut i32>` to a `Cell<&'short mut dyn Send>`. Such shortenings were already previously allowed when coercing a `&mut` to a `&`, or coercing a `&` to a `&`. - [Add deny-by-default `invalid_runtime_symbol_definitions` lint and warn-by-default `suspicious_runtime_symbol_definitions` lint](https://github.com/rust-lang/rust/pull/155521) - The lints currently specifically targets `core` runtime symbols like `memcmp`, `memset`, `strlen`, ... and is planned to be expanded in the next few releases. - [Add warn-by-default `c_void_returns` lint to check `core::ffi::c_void` as a return type](https://github.com/rust-lang/rust/pull/156379) <a id="1.98.0-Platform-Support"></a> ## Platform Support - [Add `powerpc64-unknown-linux-gnuelfv2` as Tier 3](https://github.com/rust-lang/rust/pull/144220) - [Add `aarch64-unknown-linux-pauthtest` as Tier 3 target](https://github.com/rust-lang/rust/pull/155722) - [Promote `thumbv7a-none-eabi` to Tier 2](https://github.com/rust-lang/rust/pull/155763) - [Promote `thumbv7a-none-eabihf` to Tier 2](https://github.com/rust-lang/rust/pull/155763) - [Promote `thumbv7r-none-eabi` to Tier 2](https://github.com/rust-lang/rust/pull/155763) - [Promote `thumbv7r-none-eabihf` to Tier 2](https://github.com/rust-lang/rust/pull/155763) - [Promote `thumbv8r-none-eabihf` to Tier 2](https://github.com/rust-lang/rust/pull/155763) Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support. [platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html <a id="1.98.0-Libraries"></a> ## Libraries - [Change `Location<'_>` lifetime to `'static` in `Panic[Hook]Info`](https://github.com/rust-lang/rust/pull/146561) - [Document panic in `RangeInclusive::from(legacy::RangeInclusive)`](https://github.com/rust-lang/rust/pull/155421) - [Document that `ManuallyDrop`'s `Box` interaction has been fixed](https://github.com/rust-lang/rust/pull/155750) - [Stabilize LoongArch CRC Intrinsics](https://github.com/rust-lang/rust/issues/156908) - [The `derive` macro is available at `{core,std}::derive`.](https://github.com/rust-lang/rust/issues/154645) This was previously [unintentionally stabilized in 1.96](https://github.com/rust-lang/rust/issues/159856), but is now [explicitly accepted](https://github.com/rust-lang/rust/issues/154645) as a stabilized API. - Please note that the MSRV for `{core,std}::derive` will be 1.96, and not 1.98. <a id="1.98.0-Stabilized-APIs"></a> ## Stabilized APIs - [`str::substr_range`](https://doc.rust-lang.org/stable/std/primitive.str.html#method.substr_range) - [`[T]::subslice_range`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.subslice_range) - [`core::fmt::NumBuffer`](https://doc.rust-lang.org/stable/core/fmt/struct.NumBuffer.html) - [`<{integer}>::format_into`](https://doc.rust-lang.org/stable/core/primitive.usize.html#method.format_into) - [`Send/Sync for std::process::CommandArgs`](https://doc.rust-lang.org/stable/std/process/struct.CommandArgs.html#impl-Send-for-CommandArgs%3C'a%3E) - [`{fN}::algebraic_add`](https://doc.rust-lang.org/stable/core/primitive.f32.html#method.algebraic_add) - [`{fN}::algebraic_sub`](https://doc.rust-lang.org/stable/core/primitive.f32.html#method.algebraic_sub) - [`{fN}::algebraic_mul`](https://doc.rust-lang.org/stable/core/primitive.f32.html#method.algebraic_mul) - [`{fN}::algebraic_div`](https://doc.rust-lang.org/stable/core/primitive.f32.html#method.algebraic_div) - [`{fN}::algebraic_rem`](https://doc.rust-lang.org/stable/core/primitive.f32.html#method.algebraic_rem) - [`NonZero<{integer}>::from_str_radix`](https://doc.rust-lang.org/stable/core/num/struct.NonZero.html#method.from_str_radix-4) - [`String::from_utf16le`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.from_utf16le) - [`String::from_utf16le_lossy`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.from_utf16le_lossy) - [`String::from_utf16be`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.from_utf16be) - [`String::from_utf16be_lossy`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.from_utf16be_lossy) - [`[T]::strip_circumfix`](https://doc.rust-lang.org/stable/core/primitive.slice.html#method.strip_circumfix) - [`str::strip_circumfix`](https://doc.rust-lang.org/stable/core/primitive.str.html#method.strip_circumfix) - [`Atomic<T>::from_mut`](https://doc.rust-lang.org/stable/core/sync/atomic/struct.Atomic.html#method.from_mut) - [`Atomic<T>::get_mut_slice`](https://doc.rust-lang.org/stable/core/sync/atomic/struct.Atomic.html#method.get_mut_slice) - [`Atomic<T>::from_mut_slice`](https://doc.rust-lang.org/stable/core/sync/atomic/struct.Atomic.html#method.from_mut_slice) - [`std::range::legacy`](https://doc.rust-lang.org/stable/std/range/legacy/index.html) - [`bool::ok_or`](https://doc.rust-lang.org/stable/std/primitive.bool.html#method.ok_or) - [`bool::ok_or_else`](https://doc.rust-lang.org/stable/std/primitive.bool.html#method.ok_or_else) - [`Option::map_or_default`](https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.map_or_default) - [`Result::map_or_default`](https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.map_or_default) - [`Box::as_ptr`](https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.as_ptr) - [`Box::as_mut_ptr`](https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.as_mut_ptr) - [`Path::is_empty`](https://doc.rust-lang.org/stable/std/path/struct.Path.html#method.is_empty) - [`PathBuf::into_string`](https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.into_string) - [`arch::{arm,aarch64}::vdot*`: NEON dot product intrinsics](https://github.com/rust-lang/rust/issues/117224) <a id="1.98.0-Compatibility-Notes"></a> ## Compatibility Notes - [If fully elided, lifetime bounds of trait object types may now resolve differently or even get rejected in very specific niche scenarios](https://github.com/rust-lang/rust/pull/129543) - [Error in more cases of ambiguous imports](https://github.com/rust-lang/rust/pull/145108) - [Switch the destructors implementation for thread locals on Windows to use Fiber Local Storage (FLS)](https://github.com/rust-lang/rust/pull/148799) - [Convert some cases of the `ambiguous_glob_imports` lint into a hard error](https://github.com/rust-lang/rust/pull/149195) - [Where-bounds of the form `Type = Type` and `Type == Type` are no longer syntactically allowed](https://github.com/rust-lang/rust/pull/153513) - [Ensure Send/Sync is not implemented for std::env::Vars{,Os}](https://github.com/rust-lang/rust/pull/155153) - [Fix that in some attributes, arguments were not properly rejected](https://github.com/rust-lang/rust/pull/155193) - [`repr(transparent)` is now more strict about which fields have "trivial" layout and hence can be ignored: `repr(C)` types, types with private fields, and `#[non_exhaustive]` types are no longer considered "trivial"](https://github.com/rust-lang/rust/pull/155299) - [Correctly check whether types have equal size in `transmute()` when some `repr` attributes are involved.](https://github.com/rust-lang/rust/pull/155418) - [More characters are escaped when printing strings and chars](https://github.com/rust-lang/rust/pull/155527) - [Implement fast path for `derive(PartialOrd)` when deriving `Ord`](https://github.com/rust-lang/rust/pull/155598) This can break crates in practice where a type's PartialOrd and Ord impls were inconsistent with each other. - [Add temporary scope to `assert_eq` and `assert_ne`](https://github.com/rust-lang/rust/pull/155739) - Closed a hole in the pattern matching [structural equality](https://doc.rust-lang.org/reference/patterns.html#constant-patterns) check, preventing cases where a match of a constant would be allowed, despite disagreeing with a manually written `PartialEq` implementation, when a `derive(PartialEq)` implementation for that type also exists. - [On Emscripten the WASM exception handling ABI is now unconditionally used](https://github.com/rust-lang/rust/pull/156928) The `-Zemscripten-wasm-eh=false` flag to switch back to JS exceptions has been removed. - [The UNSAFE_CODE lint is now consistently emitted for all unsafe attributes](https://github.com/rust-lang/rust/pull/157201) - [Solaris: remove `File::lock` implementation, it has the wrong semantics (return "unsupported" instead)](https://github.com/rust-lang/rust/pull/157509) - [Windows-gnu targets now specify baseline tools versions](https://github.com/rust-lang/rust/pull/158020) - [rustfmt now discovers module files that are defined in `cfg_select!`](https://github.com/rust-lang/rust/pull/158372) This may cause more code to be formatted which was previously ignored. ### [`v1.97.1`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1971-2026-07-16) [Compare Source](https://github.com/rust-lang/rust/compare/1.97.0...1.97.1) \========================== <a id="1.97.1"></a> - [rustc: Fix miscompilation in LLVM optimization](https://github.com/rust-lang/rust/issues/159035) This backports an LLVM submodule bump to include the LLVM-side fix and a revert of the rustc change that is one known trigger for the bug. The rustc side revert should not be strictly necessary but is done out of abundance of caution. ### [`v1.97.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1970-2026-07-09) [Compare Source](https://github.com/rust-lang/rust/compare/1.96.1...1.97.0) \========================== <a id="1.97.0-Language"></a> ## Language - [Consider `Result<T, Uninhabited>` and `ControlFlow<Uninhabited, T>` to be equivalent to `T` for must use lint](https://github.com/rust-lang/rust/pull/148214) - [Add allow-by-default `dead_code_pub_in_binary` lint for unused pub items in binary crates](https://github.com/rust-lang/rust/pull/149509) - [Stabilize the `div32`, `lam-bh`, `lamcas`, `ld-seq-sa` and `scq` target features](https://github.com/rust-lang/rust/pull/154510) - [Stabilize `cfg(target_has_atomic_primitive_alignment)`](https://github.com/rust-lang/rust/pull/155006) - [Allow trailing `self` in imports in more cases](https://github.com/rust-lang/rust/pull/155137) <a id="1.97.0-Platform-Support"></a> ## Platform Support - [nvptx64-nvidia-cuda: drop support for old architectures and old ISAs](https://github.com/rust-lang/rust/pull/152443) Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support. [platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html <a id="1.97.0-Stabilized-APIs"></a> ## Stabilized APIs - [`Default for RepeatN`](https://doc.rust-lang.org/stable/std/iter/struct.RepeatN.html#impl-Default-for-RepeatN%3CA%3E) - [`Copy for ffi::FromBytesUntilNulError`](https://doc.rust-lang.org/stable/std/ffi/struct.FromBytesUntilNulError.html#impl-Copy-for-FromBytesUntilNulError) - [`Send for std::fs::File` on UEFI](https://github.com/rust-lang/rust/pull/154003) - [`<{integer}>::isolate_highest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_highest_one) - [`<{integer}>::isolate_lowest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_lowest_one) - [`<{integer}>::highest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.highest_one) - [`<{integer}>::lowest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.lowest_one) - [`<{integer}>::bit_width`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.bit_width) - [`NonZero<{integer}>::isolate_highest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_highest_one) - [`NonZero<{integer}>::isolate_lowest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_lowest_one) - [`NonZero<{integer}>::highest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.highest_one) - [`NonZero<{integer}>::lowest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.lowest_one) - [`NonZero<{integer}>::bit_width`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.bit_width) These previously stable APIs are now stable in const contexts: - [`char::is_control`](https://doc.rust-lang.org/stable/std/primitive.char.html#method.is_control) <a id="1.97.0-Cargo"></a> ## Cargo - [Stabilize `build.warnings` config.](https://github.com/rust-lang/cargo/pull/16796) This controls how lint warnings from local packages are treated. Useful for enforcing a warning-free build in CI, replacing `-Dwarnings`. [docs](https://doc.rust-lang.org/nightly/cargo/reference/config.html#buildwarnings) - [Stabilize `resolver.lockfile-path` config.](https://github.com/rust-lang/cargo/pull/16694) This allows specifying the path to the lockfile to use when resolving dependencies. Useful when working with read-only source directories. [docs](https://doc.rust-lang.org/nightly/cargo/reference/config.html#resolverlockfile-path) - [cargo-clean: Error when `--target-dir` doesn't look like a Cargo target directory.](https://github.com/rust-lang/cargo/pull/16712) This prevents accidental deletion of non-target directories. - [Add `-m` shorthand for `--manifest-path`](https://github.com/rust-lang/cargo/pull/16858) - [Remove `curl` dependency from `crates-io` crate](https://github.com/rust-lang/cargo/pull/16936) <a id="1.97.0-Rustdoc"></a> ## Rustdoc - [Stabilize `--emit` flag](https://github.com/rust-lang/rust/pull/146220) - [Stabilize `--remap-path-prefix`](https://github.com/rust-lang/rust/pull/155307) <a id="1.97.0-Compatibility-Notes"></a> ## Compatibility Notes - [Emit a future-compatibility warning when relying on `f32: From<{float}>` to constrain `{float}`](https://github.com/rust-lang/rust/pull/139087) - [Rust will use the v0 symbol mangling scheme by default.](https://github.com/rust-lang/rust/pull/151994) This may cause some tools (such as debuggers or profilers, especially with old versions) to fail to demangle symbols emitted by Rust. It may also cause the formatting of text in backtraces to change. - [Prevent deref coercions in `pin!`, in order to prevent unsoundness.](https://github.com/rust-lang/rust/pull/153457) The most likely case where this might impact users is: writing `pin!(x)` where `x` has type `&mut T` will now always correctly produce a value of type `Pin<&mut &mut T>`, instead of sometimes allowing a coercion that produces a value of type `Pin<&mut T>`. This coercion was previously incorrectly allowed since Rust 1.88.0. - [Deprecate `std::char` constants and functions](https://github.com/rust-lang/rust/pull/153873) - [Warn on linker output by default](https://github.com/rust-lang/rust/pull/153968) - [Remove hidden `f64` methods which have been deprecated since 1.0](https://github.com/rust-lang/rust/pull/153975) - [report the `varargs_without_pattern` lint in deps](https://github.com/rust-lang/rust/pull/154599) - [Forbid passing generic arguments to module path segments even if the module reexports a generic enum variant](https://github.com/rust-lang/rust/pull/154971) - [Error on invalid macho `link_section` specifier](https://github.com/rust-lang/rust/pull/155065) - The encoding of certain `enum`s [have changed](https://github.com/rust-lang/rust/pull/155473). This is not a breaking change, as it only applies to `enum`s without layout guarantees, but is noted here as we've seen people impacted from having made assumptions about the layout algorithm. - [Error on `#[export_name = "..."]` where the name is empty](https://github.com/rust-lang/rust/pull/155515) - [Syntactically reject tuple index shorthands in struct patterns](https://github.com/rust-lang/rust/pull/155698) - [validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters](https://github.com/rust-lang/rust/pull/155817) - On Windows, after calling `shutdown` on a socket to shut down the write side, attempting to write to the socket will now produce a `BrokenPipe` error rather than `Other`. [Map `WSAESHUTDOWN` to `io::ErrorKind::BrokenPipe`](https://github.com/rust-lang/rust/pull/156063) ### [`v1.96.1`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1961-2026-06-30) [Compare Source](https://github.com/rust-lang/rust/compare/1.96.0...1.96.1) \=========================== <a id="1.96.1"></a> - [Cargo: fix timeout/retry behavior](https://github.com/rust-lang/cargo/pull/17131) - [Cargo: apply patches for CVE-2025-15661, CVE-2026-55199, and CVE-2026-55200 to libssh2](https://github.com/rust-lang/cargo/pull/17140) - [rustc: fix miscompilation in MIR optimization](https://github.com/rust-lang/rust/pull/158214) ### [`v1.96.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1960-2026-05-28) [Compare Source](https://github.com/rust-lang/rust/compare/1.95.0...1.96.0) \========================== <a id="1.96.0-Language"></a> ## Language - [Allow passing `expr` metavariable to `cfg`](https://github.com/rust-lang/rust/pull/146961) - [Always coerce never types in tuple expressions](https://github.com/rust-lang/rust/pull/147834) - [Avoid incorrect inference guidance of function arguments in rare cases](https://github.com/rust-lang/rust/pull/150316) - [Support s390x vector registers in inline assembly](https://github.com/rust-lang/rust/pull/154184) - [Allow using constants of type `ManuallyDrop` as patterns (fixing a regression introduced in 1.94.0)](https://github.com/rust-lang/rust/pull/154891) <a id="1.96.0-Compiler"></a> ## Compiler - [Enable link relaxation feature for LoongArch Linux targets](https://github.com/rust-lang/rust/pull/153427) - [Update `riscv64gc-unknown-fuchsia` baseline to RVA22 + vector](https://github.com/rust-lang/rust/pull/155072) <a id="1.96.0-Libraries"></a> ## Libraries - [Support iterating over ranges of `NonZero` integers](https://github.com/rust-lang/rust/pull/127534) - [refactor 'valid for read/write' definition: exclude null; add that as an exception on individual methods instead](https://github.com/rust-lang/rust/pull/152615) - [Fix SGX delayed host lookup via ToSocketAddr](https://github.com/rust-lang/rust/pull/152851) <a id="1.96.0-Stabilized-APIs"></a> ## Stabilized APIs - [`assert_matches!`](https://doc.rust-lang.org/stable/std/macro.assert_matches.html) - [`debug_assert_matches!`](https://doc.rust-lang.org/stable/std/macro.debug_assert_matches.html) - [`From<T> for AssertUnwindSafe<T>`](https://doc.rust-lang.org/stable/std/panic/struct.AssertUnwindSafe.html#impl-From%3CT%3E-for-AssertUnwindSafe%3CT%3E) - [`From<T> for LazyCell<T, F>`](https://doc.rust-lang.org/stable/std/cell/struct.LazyCell.html#impl-From%3CT%3E-for-LazyCell%3CT,+F%3E) - [`From<T> for LazyLock<T, F>`](https://doc.rust-lang.org/stable/std/sync/struct.LazyLock.html#impl-From%3CT%3E-for-LazyLock%3CT,+F%3E) - [`core::range::RangeToInclusive`](https://doc.rust-lang.org/stable/core/range/struct.RangeToInclusive.html) - [`core::range::RangeToInclusiveIter`](https://doc.rust-lang.org/stable/core/range/struct.RangeToInclusiveIter.html) - [`core::range::RangeFrom`](https://doc.rust-lang.org/stable/core/ops/struct.RangeFrom.html) - [`core::range::RangeFromIter`](https://doc.rust-lang.org/stable/core/ops/struct.RangeFromIter.html) - [`core::range::Range`](https://doc.rust-lang.org/stable/std/range/struct.Range.html) - [`core::range::RangeIter`](https://doc.rust-lang.org/stable/std/range/struct.RangeIter.html) <a id="1.96.0-Cargo"></a> ## Cargo - [Allow a dependency to specify both a git repository and an alternate registry.](https://github.com/rust-lang/cargo/pull/16810/) Just like with crates.io, the git repository will be used locally, but the registry version will be used when published. - [Added `target.'cfg(..)'.rustdocflags` support in configuration.](https://github.com/rust-lang/cargo/pull/16846) - Fixed [CVE-2026-5222](https://blog.rust-lang.org/2026/05/25/cve-2026-5222/) and [CVE-2026-5223](https://blog.rust-lang.org/2026/05/25/cve-2026-5223/). <a id="1.96-Rustdoc"></a> ## Rustdoc - [Deprecation notes are now rendered like any other documentation](https://github.com/rust-lang/rust/pull/149931). Previously they used the css `white-space: pre-wrap;` property and stripped any `<p>` elements from the rendered html, however this caused issues and unintuitive behavior. The new behavior should be more predictable, however some multi-line deprecation notes will now be rendered as as single lines. If this is undesirable, you can use the standard markdown method of forcing a linebreak, which is two spaces followed by a newline (`"\n"`). - [Don't emit rustdoc `missing_doc_code_examples` lint on impl items](https://github.com/rust-lang/rust/pull/154048) - [Separate methods and associated functions in sidebar](https://github.com/rust-lang/rust/pull/154644) <a id="1.96.0-Compatibility-Notes"></a> ## Compatibility Notes - [Fix layout of `#[repr(Int)]` enums in some edge cases involving fields of uninhabited zero-sized types](https://github.com/rust-lang/rust/pull/146989) - [Prevent unsize-coercing into `Pin<Foo>` where `Foo` doesn't implement `Deref`. Some such coercions were previously allowed, but produce a type with no useful public API.](https://github.com/rust-lang/rust/pull/149218) - [rustc: Stop passing `--allow-undefined` on wasm targets](https://github.com/rust-lang/rust/pull/149868) - [Gate the accidentally stabilized `#![reexport_test_harness_main]` attribute](https://github.com/rust-lang/rust/pull/152210) - [Error on return-position-impl-trait-in-traits whose types are too private](https://github.com/rust-lang/rust/pull/152543) - [Report the `uninhabited_static` lint in dependencies and make it deny-by-default](https://github.com/rust-lang/rust/pull/152853) - [Distributed builds now contain non-split debuginfo for windows-gnu](https://github.com/rust-lang/rust/pull/152870) This appears to improve the quality of backtraces. This change has no effect on the defaults for the output of rustc/cargo on these targets. - [Check const generic arguments are correctly typed in more positions](https://github.com/rust-lang/rust/pull/152931) - [Remove `-Csoft-float`](https://github.com/rust-lang/rust/pull/152973) - [Importing structs with `::{self [as name]}`, e.g., `struct S {}; use S::{self as Other};`, is now no longer permitted because `{self}` imports require a module parent.](https://github.com/rust-lang/rust/pull/152996) - [For `export_name`, `link_name`, and `link_section` attributes, if multiple of the same attribute is present, the first one now takes precedence.](https://github.com/rust-lang/rust/pull/153041) - [Update the minimum external LLVM to 21](https://github.com/rust-lang/rust/pull/153684) - On `avr` targets, C's `double` type is 32-bit by default, so [change `c_double` to `f32` on `avr` targets to match](https://github.com/rust-lang/rust/pull/154647). This is a breaking change, but necessary to make `c_double` match C's double. - [`BTreeMap::append()` was optimized, which may now cause panics for types with incorrect `Ord` impls](https://github.com/rust-lang/rust/pull/153107) <a id="1.96.0-Internal-Changes"></a> ## Internal Changes These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools. - [JSON targets: `aarch64` softfloat targets now have to have `rustc_abi` set to `"softfloat"`](https://github.com/rust-lang/rust/pull/152941) - [target specs: stricter checks for LLVM ABI values, and correlate that with `cfg(target_abi)`](https://github.com/rust-lang/rust/pull/153769) ### [`v1.95.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1950-2026-04-16) [Compare Source](https://github.com/rust-lang/rust/compare/1.94.1...1.95.0) \=========================== <a id="1.95-Language"></a> ## Language - [Stabilize `if let` guards on match arms](https://github.com/rust-lang/rust/pull/141295) - [`irrefutable_let_patterns` lint no longer lints on let chains](https://github.com/rust-lang/rust/pull/146832) - [Support importing path-segment keywords with renaming](https://github.com/rust-lang/rust/pull/146972) - [Stabilize inline assembly for PowerPC and PowerPC64](https://github.com/rust-lang/rust/pull/147996) - [const-eval: be more consistent in the behavior of padding during typed copies](https://github.com/rust-lang/rust/pull/148967) - [Const blocks are no longer evaluated to determine if expressions involving fallible operations can implicitly be constant-promoted.](https://github.com/rust-lang/rust/pull/150557). Expressions whose ability to implicitly be promoted would depend on the result of a const block are no longer implicitly promoted. - [Make operational semantics of pattern matching independent of crate and module](https://github.com/rust-lang/rust/pull/150681) <a id="1.95-Compiler"></a> ## Compiler - [Stabilize `--remap-path-scope` for controlling the scoping of how paths get remapped in the resulting binary](https://github.com/rust-lang/rust/pull/147611) - [Apply patches for CVE-2026-6042 and CVE-2026-40200 to vendored musl](https://github.com/rust-lang/rust/pull/155171) <a id="1.95-Platform-Support"></a> ## Platform Support - [Promote `powerpc64-unknown-linux-musl` to Tier 2 with host tools](https://github.com/rust-lang/rust/pull/149962) - [Promote `aarch64-apple-tvos` to Tier 2](https://github.com/rust-lang/rust/pull/152021) - [Promote `aarch64-apple-tvos-sim` to Tier 2](https://github.com/rust-lang/rust/pull/152021) - [Promote `aarch64-apple-watchos` to Tier 2](https://github.com/rust-lang/rust/pull/152021) - [Promote `aarch64-apple-watchos-sim` to Tier 2](https://github.com/rust-lang/rust/pull/152021) - [Promote `aarch64-apple-visionos` to Tier 2](https://github.com/rust-lang/rust/pull/152021) - [Promote `aarch64-apple-visionos-sim` to Tier 2](https://github.com/rust-lang/rust/pull/152021) Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support. [platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html <a id="1.95-Libraries"></a> ## Libraries - [`thread::scope`: document how join interacts with TLS destructors](https://github.com/rust-lang/rust/pull/149482) - [Speed up `str::contains` on aarch64 targets with `neon` target feature enabled by default](https://github.com/rust-lang/rust/pull/152176) <a id="1.95-Stabilized-APIs"></a> ## Stabilized APIs - [`MaybeUninit<[T; N]>: From<[MaybeUninit<T>; N]>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-From%3CMaybeUninit%3C%5BT;+N%5D%3E%3E-for-%5BMaybeUninit%3CT%3E;+N%5D) - [`MaybeUninit<[T; N]>: AsRef<[MaybeUninit<T>; N]>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsRef%3C%5BMaybeUninit%3CT%3E;+N%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E) - [`MaybeUninit<[T; N]>: AsRef<[MaybeUninit<T>]>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsRef%3C%5BMaybeUninit%3CT%3E%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E) - [`MaybeUninit<[T; N]>: AsMut<[MaybeUninit<T>; N]>`](https://doc.rust-lang.org/beta/std/mem/union.MaybeUninit.html#impl-AsMut%3C%5BMaybeUninit%3CT%3E;+N%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E) - [`MaybeUninit<[T; N]>: AsMut<[MaybeUninit<T>]>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsMut%3C%5BMaybeUninit%3CT%3E%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E) - [`[MaybeUninit<T>; N]: From<MaybeUninit<[T; N]>>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-From%3C%5BMaybeUninit%3CT%3E;+N%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E) - [`Cell<[T; N]>: AsRef<[Cell<T>; N]>`](https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#impl-AsRef%3C%5BCell%3CT%3E;+N%5D%3E-for-Cell%3C%5BT;+N%5D%3E) - [`Cell<[T; N]>: AsRef<[Cell<T>]>`](https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#impl-AsRef%3C%5BCell%3CT%3E%5D%3E-for-Cell%3C%5BT;+N%5D%3E) - [`Cell<[T]>: AsRef<[Cell<T>]>`](https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#impl-AsRef%3C%5BCell%3CT%3E%5D%3E-for-Cell%3C%5BT%5D%3E) - [`bool: TryFrom<{integer}>`](https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-TryFrom%3Cu128%3E-for-bool) - [`AtomicPtr::update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.update) - [`AtomicPtr::try_update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.try_update) - [`AtomicBool::update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicBool.html#method.update) - [`AtomicBool::try_update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicBool.html#method.try_update) - [`AtomicIn::update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicIsize.html#method.update) - [`AtomicIn::try_update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicIsize.html#method.try_update) - [`AtomicUn::update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicUsize.html#method.update) - [`AtomicUn::try_update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicUsize.html#method.try_update) - [`cfg_select!`](https://doc.rust-lang.org/stable/std/macro.cfg_select.html) - [`mod core::range`](https://doc.rust-lang.org/stable/core/range/index.html) - [`core::range::RangeInclusive`](https://doc.rust-lang.org/stable/core/range/struct.RangeInclusive.html) - [`core::range::RangeInclusiveIter`](https://doc.rust-lang.org/stable/core/range/struct.RangeInclusiveIter.html) - [`core::hint::cold_path`](https://doc.rust-lang.org/stable/core/hint/fn.cold_path.html) - [`<*const T>::as_ref_unchecked`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_ref_unchecked) - [`<*mut T>::as_ref_unchecked`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_ref_unchecked-1) - [`<*mut T>::as_mut_unchecked`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_mut_unchecked) - [`Vec::push_mut`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.push_mut) - [`Vec::insert_mut`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.insert_mut) - [`VecDeque::push_front_mut`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.push_front_mut) - [`VecDeque::push_back_mut`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.push_back_mut) - [`VecDeque::insert_mut`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.insert_mut) - [`LinkedList::push_front_mut`](https://doc.rust-lang.org/stable/std/collections/struct.LinkedList.html#method.push_front_mut) - [`LinkedList::push_back_mut`](https://doc.rust-lang.org/stable/std/collections/struct.LinkedList.html#method.push_back_mut) - [`Layout::dangling_ptr`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.dangling_ptr) - [`Layout::repeat`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.repeat) - [`Layout::repeat_packed`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.repeat_packed) - [`Layout::extend_packed`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.extend_packed) - [`core::arch::aarch64::__jcvt`](https://doc.rust-lang.org/stable/core/arch/aarch64/fn.__jcvt.html) These previously stable APIs are now stable in const contexts: - [`fmt::from_fn`](https://doc.rust-lang.org/stable/std/fmt/fn.from_fn.html) - [`ControlFlow::is_break`](https://doc.rust-lang.org/stable/core/ops/enum.ControlFlow.html#method.is_break) - [`ControlFlow::is_continue`](https://doc.rust-lang.org/stable/core/ops/enum.ControlFlow.html#method.is_continue) <a id="1.95-Rustdoc"></a> ## Rustdoc - [In search results, rank unstable items lower](https://github.com/rust-lang/rust/pull/149460) - [Add new "hide deprecated items" setting in rustdoc](https://github.com/rust-lang/rust/pull/151091) <a id="1.95-Compatibility-Notes"></a> ## Compatibility Notes - [Array coercions may now result in less inference constraints than before](https://github.com/rust-lang/rust/pull/140283) - Importing `$crate` without renaming, i.e. `use $crate::{self};`, is now no longer permitted due to stricter error checking for `self` imports. - [const-eval: be more consistent in the behavior of padding during typed copies.](https://github.com/rust-lang/rust/pull/148967) In very rare cases, this may cause compilation errors due to bytes from parts of a pointer ending up in the padding bytes of a `const` or `static`. - [A future-incompatibility warning lint `ambiguous_glob_imported_traits` is now reported when using an ambiguously glob imported trait](https://github.com/rust-lang/rust/pull/149058) - [Check lifetime bounds of types mentioning only type parameters](https://github.com/rust-lang/rust/pull/149389) - [Report more visibility-related ambiguous import errors](https://github.com/rust-lang/rust/pull/149596) - [Deprecate `Eq::assert_receiver_is_total_eq` and emit future compatibility warnings on manual impls](https://github.com/rust-lang/rust/pull/149978) - [powerpc64: Use the ELF ABI version set in target spec instead of guessing](https://github.com/rust-lang/rust/pull/150468) (fixes the ELF ABI used by the OpenBSD target) - Matching on a `#[non_exhaustive]` enum [now reads the discriminant, even if the enum has only one variant](https://github.com/rust-lang/rust/pull/150681). This can cause closures to capture values that they previously wouldn't. - `mut ref` and `mut ref mut` patterns, part of the unstable [Match Ergonomics 2024 RFC](https://github.com/rust-lang/rust/issues/123076), were accidentally allowed on stable within struct pattern field shorthand. These patterns are now correctly feature-gated as unstable in this position. - [Add future-compatibility warning for derive helper attributes which conflict with built-in attributes](https://github.com/rust-lang/rust/pull/151152) - [JSON target specs](https://doc.rust-lang.org/rustc/targets/custom.html) have been destabilized and now require `-Z unstable-options` to use. Previously, they could not be used without the standard library, which has no stable build mechanism. In preparation for the `build-std` project adding that support, JSON target specs are being proactively gated to ensure they remain unstable even if `build-std` is stabilized. Cargo now includes the `-Z json-target-spec` CLI flag to automatically pass `-Z unstable-options` to the compiler when needed. See [#&#8203;150151](https://github.com/rust-lang/rust/pull/150151), [#&#8203;151534](https://github.com/rust-lang/rust/pull/150151), and [rust-lang/cargo#16557](https://github.com/rust-lang/cargo/pull/16557). - [The arguments of `#[feature]` attributes on invalid targets are now checked](https://github.com/rust-lang/rust/issues/153764) <a id="1.95-Internal-Changes"></a> ## Internal Changes These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools. - [Update to LLVM 22](https://github.com/rust-lang/rust/pull/150722) ### [`v1.94.1`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1941-2026-03-26) [Compare Source](https://github.com/rust-lang/rust/compare/1.94.0...1.94.1) \=========================== <a id="1.94.1"></a> - [Fix `std::thread::spawn` on wasm32-wasip1-threads](https://github.com/rust-lang/rust/pull/153634) - [Remove new methods added to `std::os::windows::fs::OpenOptionsExt`](https://github.com/rust-lang/rust/pull/153491) The new methods were unstable, but the trait itself is not sealed and so cannot be extended with non-default methods. - [Clippy: fix ICE in `match_same_arms`](https://github.com/rust-lang/rust-clippy/pull/16685) - [Cargo: update tar to 0.4.45](https://github.com/rust-lang/cargo/pull/16769) This resolves CVE-2026-33055 and CVE-2026-33056. Users of crates.io are not affected. See [blog](https://blog.rust-lang.org/2026/03/21/cve-2026-33056/) for more details. </details> <details> <summary>sass/dart-sass (sass)</summary> ### [`v1.107.1`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11071) [Compare Source](https://github.com/sass/dart-sass/compare/1.107.0...1.107.1) - Properly report the embedded protocol version as 3.4.0. ### [`v1.107.0`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11070) [Compare Source](https://github.com/sass/dart-sass/compare/1.106.1...1.107.0) ##### Command-Line Interface - The `--fatal-deprecation` flag can now exclude deprecations that would otherwise be included by passing a version number. To exclude a deprecation, add `-` before its name. For example, `--fatal-deprecation=1.107.0,-import` includes all deprecations that were present in Dart Sass 1.107.0 *except* for the `@import` deprecation. - The `--fatal-deprecation` flag now takes the special value `dart-sass-2`, which treats as fatal all deprecations that will become fatal in Dart Sass 2.0.0. ##### JavaScript API - `Options.fatalDeprecations` can now take a `DeprecationSelectorDifference` object of the form `{include: ..., except: ...}`, where the `include` field lists deprecations to mark fatal (which can be version numbers) and the `except` field lists deprecations *not* to mark fatal. The `except` field takes precedence over `include`. - Add a (non-enumerable) `sass.deprecations.dartSass2` property which can be passed to `Options.fatalDeprecations` to mark as fatal exactly the deprecations that will become fatal in Dart Sass 2.0.0. This can be combined with other deprecations or used in a `DeprecationSelectorDifference` to modify exactly which deprecations it covers. - Passing a version number beyond the current Dart Sass version to `Options.fatalDeprecations` is now deprecated. See [the Sass website](https://sass-lang.com/d/deprecation-version) for details. ##### Dart API - Add a `Deprecation.dartSass2` property which returns exactly the set of deprecations that will become fatal in Dart Sass 2.0.0. - Passing a version number beyond the current Dart Sass version to `Deprecation.forVersion` is now deprecated. ##### Embedded Protocol - Add a `CompileRequest.fatal_deprecation_except` field which excludes deprecations from being considered fatal if they would have been enabled by `CompileRequest.fatal_deprecation`. ### [`v1.106.1`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11061) [Compare Source](https://github.com/sass/dart-sass/compare/1.106.0...1.106.1) - Fix a bug where an attribute selector with an empty value (such as `[class=""]`) would crash when serializing. - Don't crash when serializing a number with an empty unit. This is only possible through the JavaScript and Dart APIs or the embedded protocol. ##### Embedded Dart Sass - More robustly convert invalid value errors into `PARAMS` errors. ### [`v1.106.0`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11060) [Compare Source](https://github.com/sass/dart-sass/compare/1.105.2...1.106.0) - Don't normalize CSS escapes in statement contexts that can contain interpolation. For example, `@f\6Fo` is now emitted as written rather than normalized to `@foo`. - Fix a bug where quotes would be removed from attribute selector values that contained backslashes. - Fix invalid source spans that could cause crashes when encountering a syntax error in selectors or media queries that also contain escape sequences. - Fix a bug where the indented syntax parser would crash when parsing a file where the first statement was indented *and* appeared after the first line. - Fix a bug that could cause crashes when encountering errors or warnings in interpolations that contain patterns like `// */`. - **Potentially breaking compatibility fix:** CSS escape codes whose values are 0, for Unicode surrogates, or greater than the maximum allowed code point are now consistently normalized to U+FFFD REPLACEMENT CHARACTER in expression contexts. Previously, in some cases these were instead normalized to the normalized form of the original escape sequence, which violates the principle that all escape sequences for identical values should be normalized the same way. In other cases, these would simply throw errors. As a special case, `\0` on its own will continue to be normalized to `\0 ` to support historical CSS hacks. - **Potentially breaking bug fix:** Throw an error for mixins and functions that have rest parameters which are the same as normal parameters. Previously, the positional parameters wouldn't be accessible and calling such a mixin or function with a named argument would crash the compiler. - **Potentially breaking bug fix:** Fix various cases where using a CSS escape code at the beginning of an identifier would change parsing behavior versus using the character directly. - **Potentially breaking bug fix:** When a number's unit is ambiguous with a numeric exponent, the unit is now serialized as an escape code rather than a literal `e` to avoid being interpreted as an exponent by CSS. - **Potentially breaking bug fix:** Don't parse a CSS escape code for U+45 LATIN CAPITAL LETTER E or U+65 LATIN LOWERCASE LETTER E as an exponent in `@keyframes` percentage selectors. - **Potentially breaking bug fix:** Properly normalize underscores written as CSS escape codes in variable, mixin, and function names. ### [`v1.105.2`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11052) [Compare Source](https://github.com/sass/dart-sass/compare/1.105.1...1.105.2) ##### Node.js Embedded Host - Fix a deadlock when the async compiler fails to start. ### [`v1.105.1`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11051) [Compare Source](https://github.com/sass/dart-sass/compare/1.105.0...1.105.1) - Improve error messages for `@extend`s across different media queries. ### [`v1.105.0`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11050) [Compare Source](https://github.com/sass/dart-sass/compare/1.104.1...1.105.0) - Add support for first-class modules. These can be accessed using the new `meta.load()` and `meta.get-module()` functions, and may be passed as the `$module` argument to numerous eisting `sass:meta` functions. - Add the `meta.css()` mixin, which includes CSS from a first-class module. ##### JS API - Add a `SassModule` class and a corresponding `Value.assertModule()` method. ##### Dart API - Add a `SassModule` class and a corresponding `Value.assertModule()` method. ### [`v1.104.1`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11041) [Compare Source](https://github.com/sass/dart-sass/compare/1.104.0...1.104.1) - Fix a bug where loud comments before `@use` rules could be emitted multiple times under certain circumstances. - Fix a bug in which an invalid selector at the end of an indented syntax stylesheet would cause the parser to crash instead of emitting a useful error message. ##### Command Line Interface - Many-to-many compilations no longer compile any files that appear in the output directory if the output directory is also within the source directory. This fixes a bug where `--watch` mode could enter an infinite loop recompiling the same CSS file over and over. - Sass now sets the modification time of output files to the time compilation *started* rather than the time it *ended*. This ensures that, if a source file is modified during compilation, `--watch` and `--update` mode will recompile the outputs to include the new source file contents. ### [`v1.104.0`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11040) [Compare Source](https://github.com/sass/dart-sass/compare/1.103.1...1.104.0) - **Potentially breaking compatibility fix:** Colors now convert the special values NaN and negative zero, as well as infinity and negative infinity for polar-hue channels, to 0 as per the CSS spec. - The special value negative zero is now serialized as `-0` instead of `0` for greater compatibility when using it in CSS calculations. ### [`v1.103.1`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11031) [Compare Source](https://github.com/sass/dart-sass/compare/1.103.0...1.103.1) - No user-visible changes. ### [`v1.103.0`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11030) [Compare Source](https://github.com/sass/dart-sass/compare/1.102.0...1.103.0) - **Potentially breaking compatibility fix:** Colors now preserve "analogous sets" of missing channels during conversions, per the CSS spec. For example, `color.to-space(lch(50% none none), lab)` now returns `lab(50% none none)` instead of `lab(50% 0 0)`. ### [`v1.102.0`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11020) [Compare Source](https://github.com/sass/dart-sass/compare/1.101.7...1.102.0) - Use the 2.4 gamma transfer function for rec2020, as specified by the latest draft of CSS Color 4. ### [`v1.101.7`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11017) [Compare Source](https://github.com/sass/dart-sass/compare/1.101.6...1.101.7) - No user-visible changes. ### [`v1.101.6`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11016) [Compare Source](https://github.com/sass/dart-sass/compare/1.101.5...1.101.6) - No user-visible changes. ### [`v1.101.5`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11015) [Compare Source](https://github.com/sass/dart-sass/compare/1.101.4...1.101.5) - No user-visible changes. ### [`v1.101.4`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11014) [Compare Source](https://github.com/sass/dart-sass/compare/1.101.3...1.101.4) - Avoid emitting `rgb()` or `rgba()` functions with non-percent decimal channels. Older browsers only support integer values or (potentially decimal) percentages for these functions, so in order to preserve backwards-compatibility while retaining full precision for modern browsers, legacy colors that contain at least one non-integer channel will now use percentages for their channels (for example, `rgb(0%, 100%, 50%)` rather than `rgb(0, 255, 127.5)`). - Fix a bug where the values of plain-CSS `if()` expressions were emitted using their `meta.inspect()` format rather than their CSS serialization format. ### [`v1.101.3`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11013) [Compare Source](https://github.com/sass/dart-sass/compare/1.101.0...1.101.3) - No user-visible changes. ### [`v1.101.0`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11010) [Compare Source](https://github.com/sass/dart-sass/compare/1.100.0...1.101.0) - **Potentially breaking bug fix:** The Node package importer now properly supports resolving import-only variants of Sass files declared in the `exports`, `sass`, and `style` fields of `package.json`. Previously, these files were ignored even when loaded via `@import`, so any code relying on loading module-system-only files this way may break. ### [`v1.100.0`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11000) [Compare Source](https://github.com/sass/dart-sass/compare/1.99.0...1.100.0) - Writing two compound selectors adjacent to one another without any whitespace between them, such as `[class]a`, is now deprecated. This was always an error in CSS and Sass only supported it by mistake. See [the Sass website](https://sass-lang.com/d/adjacent-compounds) for details. ### [`v1.99.0`](https://github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#1990) [Compare Source](https://github.com/sass/dart-sass/compare/1.98.0...1.99.0) - Add support for parent selectors (`&`) at the root of the document. These are emitted as-is in the CSS output, where they're interpreted as [the scoping root]. [the scoping root]: https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Nesting_selector#using_outside_nested_rule - User-defined functions named `calc` or `clamp` are no longer forbidden. If such a function exists without a namespace in the current module, it will be used instead of the built-in `calc()` or `clamp()` function. - User-defined functions whose names begin with `-` and end with `-expression`, `-url`, `-and`, `-or`, or `-not` are no longer forbidden. These were originally intended to match vendor prefixes, but in practice no vendor prefixes for these functions ever existed in real browsers. - User-defined functions named `EXPRESSION`, `URL`, and `ELEMENT`, those that begin with `-` and end with `-ELEMENT`, as well as the same names with some lowercase letters are now deprecated, These are names conflict with plain CSS functions that have special syntax. See [the Sass website](https://sass-lang.com/d/function-name) for details. - In a future release, calls to functions whose names begin with `-` and end with `-expression` and `-url` will no longer have special parsing. For now, these calls are deprecated if their behavior will change in the future. See [the Sass website](https://sass-lang.com/d/function-name) for details. - Calls to functions whose names begin with `-` and end with `-progid:...` are deprecated. See [the Sass website](https://sass-lang.com/d/function-name) for details. </details> <details> <summary>serde-rs/serde (serde)</summary> ### [`v1.0.229`](https://github.com/serde-rs/serde/releases/tag/v1.0.229) [Compare Source](https://github.com/serde-rs/serde/compare/v1.0.228...v1.0.229) - Update to syn 3 </details> <details> <summary>webpack/minimizer-webpack-plugin (terser-webpack-plugin)</summary> ### [`v5.6.1`](https://github.com/webpack/minimizer-webpack-plugin/blob/HEAD/CHANGELOG.md#561) [Compare Source](https://github.com/webpack/minimizer-webpack-plugin/compare/v5.6.0...v5.6.1) ##### Patch Changes - deduplicate extracted comments in linear time, so builds stay fast when an asset contains many distinct preserved comments (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;682](https://github.com/webpack/minimizer-webpack-plugin/pull/682)) ### [`v5.6.0`](https://github.com/webpack/minimizer-webpack-plugin/blob/HEAD/CHANGELOG.md#560) [Compare Source](https://github.com/webpack/minimizer-webpack-plugin/compare/v5.5.0...v5.6.0) ##### Minor Changes - support array of minimizers for `minify` and `terserOptions` (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;674](https://github.com/webpack/minimizer-webpack-plugin/pull/674)) - add built-in CSS minimizers from `css-minimizer-webpack-plugin` (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;674](https://github.com/webpack/minimizer-webpack-plugin/pull/674)) - add built-in HTML minimizers from `html-minimizer-webpack-plugin` (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;674](https://github.com/webpack/minimizer-webpack-plugin/pull/674)) - add `filter` method to minimizers, allowing a single plugin instance to handle multiple asset types (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;674](https://github.com/webpack/minimizer-webpack-plugin/pull/674)) - terser-webpack-plugin has been renamed to minimizer-webpack-plugin, merging other minimizers from css-minimizer-webpack-plugin and html-minimizer-webpack-plugin. We will continue to publish new releases under the old name, but we recommend switching to the new package - minimizer-webpack-plugin. It is now a single plugin for minification. We also added the ability to specify different minifier types using only one plugin instance, which will improve performance. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;677](https://github.com/webpack/minimizer-webpack-plugin/pull/677)) - rename `terserOptions` to `minimizerOptions`; `terserOptions` is kept as a deprecated alias (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;674](https://github.com/webpack/minimizer-webpack-plugin/pull/674)) All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. ### [`v5.5.0`](https://github.com/webpack/minimizer-webpack-plugin/blob/HEAD/CHANGELOG.md#550-2026-04-23) [Compare Source](https://github.com/webpack/minimizer-webpack-plugin/compare/v5.4.0...v5.5.0) ##### Features - support extractComments in swcMinify ([#&#8203;665](https://github.com/webpack/terser-webpack-plugin/issues/665)) ([03143d3](https://github.com/webpack/terser-webpack-plugin/commit/03143d3fe38eae8a177eafd2cf2c225949d8fd95)) </details> <details> <summary>frondeus/test-case (test-case)</summary> ### [`v3.4.1`](https://github.com/frondeus/test-case/blob/HEAD/CHANGELOG.md#341) [Compare Source](https://github.com/frondeus/test-case/compare/v3.4.0...v3.4.1) ##### Fixes - test_case no longer triggers clippy::redundant_test_prefix lint ([#&#8203;155](https://github.com/frondeus/test-case/issues/155)) - test_case with => panics no longer fails when test_case panics ([#&#8203;153](https://github.com/frondeus/test-case/issues/153)) thanks to [@&#8203;jtmoon79](https://github.com/jtmoon79) ### [`v3.4.0`](https://github.com/frondeus/test-case/blob/HEAD/CHANGELOG.md#340) [Compare Source](https://github.com/frondeus/test-case/compare/v3.3.1...v3.4.0) ##### Changes - Adds test case number to automatically distinguish test cases with the same generated name ([#&#8203;151](https://github.com/frondeus/test-case/issues/151)) Instead of having a conflict in example like this: ```rust #[test_case(42)] #[test_case("42")] fn cases_are_enumerated(value: impl std::fmt::Display) { assert_eq!("42", &value.to_string()) } ``` It now generates prefix name for each test case. In all cases: ``` test cases_are_enumerated::test_case_1_42_expects ... ok test cases_are_enumerated::test_case_2_42_expects ... ok ``` - Inverts the left and right output for simple test cases. Generates `assert_eq!(result, expectation)` instead of previous `assert_eq!(expectation, result)`; - Upgrades edition to 2024 - Updates: - regex to 1.9 - insta to 1.43 - itertools to 0.15 - syn to 3.0 </details> <details> <summary>dtolnay/thiserror (thiserror)</summary> ### [`v2.0.21`](https://github.com/dtolnay/thiserror/releases/tag/2.0.21) [Compare Source](https://github.com/dtolnay/thiserror/compare/2.0.20...2.0.21) - Fix parsing of generic unit variants in display expressions ([#&#8203;459](https://github.com/dtolnay/thiserror/issues/459)) ### [`v2.0.20`](https://github.com/dtolnay/thiserror/releases/tag/2.0.20) [Compare Source](https://github.com/dtolnay/thiserror/compare/2.0.19...2.0.20) - Suppress redundant_field_names clippy lint in generated code ([#&#8203;454](https://github.com/dtolnay/thiserror/issues/454)) ### [`v2.0.19`](https://github.com/dtolnay/thiserror/releases/tag/2.0.19) [Compare Source](https://github.com/dtolnay/thiserror/compare/2.0.18...2.0.19) - Update to syn 3 </details> <details> <summary>kulshekhar/ts-jest (ts-jest)</summary> ### [`v29.4.15`](https://github.com/kulshekhar/ts-jest/blob/HEAD/CHANGELOG.md#29415-2026-10-15) [Compare Source](https://github.com/kulshekhar/ts-jest/compare/v29.4.14...v29.4.15) ##### Bug Fixes - **compiler:** resolve modules with tsconfig options regardless of cache state ([268746c](https://github.com/kulshekhar/ts-jest/commit/268746c0fcaf72476cebb348c5543e5c2aac3622)), closes [#&#8203;5216](https://github.com/kulshekhar/ts-jest/issues/5216) - support `.cjs` config files in `config:migrate` ([4001b4e](https://github.com/kulshekhar/ts-jest/commit/4001b4e6d28aa461e7468f09157413e113f0bd92)), closes [#&#8203;4485](https://github.com/kulshekhar/ts-jest/issues/4485) ### [`v29.4.14`](https://github.com/kulshekhar/ts-jest/blob/HEAD/CHANGELOG.md#29414-2026-09-25) [Compare Source](https://github.com/kulshekhar/ts-jest/compare/v29.4.13...v29.4.14) ##### Reverts - bring back prior changes of compiler util ([#&#8203;5471](https://github.com/kulshekhar/ts-jest/issues/5471)) ([01e5a2e](https://github.com/kulshekhar/ts-jest/commit/01e5a2e17ac9c940880865d6a81751832dcc4184)), closes [#&#8203;5469](https://github.com/kulshekhar/ts-jest/issues/5469) ### [`v29.4.13`](https://github.com/kulshekhar/ts-jest/blob/HEAD/CHANGELOG.md#29413-2026-09-22) [Compare Source](https://github.com/kulshekhar/ts-jest/compare/v29.4.12...v29.4.13) ##### Features - support Babel 8 ([#&#8203;5466](https://github.com/kulshekhar/ts-jest/issues/5466)) ([c3a0b57](https://github.com/kulshekhar/ts-jest/commit/c3a0b57c00d8b6acfb72b020e2411752d39073e2)), closes [#&#8203;5412](https://github.com/kulshekhar/ts-jest/issues/5412) ##### Performance Improvements - **compiler:** cache module resolution modes ([#&#8203;5419](https://github.com/kulshekhar/ts-jest/issues/5419)) ([697d337](https://github.com/kulshekhar/ts-jest/commit/697d337c1b79a0804972a3d30c0875b02e73bf62)), closes [#&#8203;5402](https://github.com/kulshekhar/ts-jest/issues/5402) ### [`v29.4.12`](https://github.com/kulshekhar/ts-jest/blob/HEAD/CHANGELOG.md#29412-2026-07-22) [Compare Source](https://github.com/kulshekhar/ts-jest/compare/v29.4.11...v29.4.12) ##### Features - **compiler:** support TypeScript 7 projects through compatibility aliases ([#&#8203;5386](https://github.com/kulshekhar/ts-jest/pull/5386)) ### [`v29.4.11`](https://github.com/kulshekhar/ts-jest/blob/HEAD/CHANGELOG.md#29411-2026-05-21) [Compare Source](https://github.com/kulshekhar/ts-jest/compare/v29.4.10...v29.4.11) ##### Bug Fixes - preserve Bundler on the CJS path under TypeScript >= 6 ([3941818](https://github.com/kulshekhar/ts-jest/commit/39418187515f11b6584d35a4e3ddf50231f74936)), closes [#&#8203;4198](https://github.com/kulshekhar/ts-jest/issues/4198) ### [`v29.4.10`](https://github.com/kulshekhar/ts-jest/blob/HEAD/CHANGELOG.md#29410-2026-05-18) [Compare Source](https://github.com/kulshekhar/ts-jest/compare/v29.4.9...v29.4.10) ##### Bug Fixes - pass `resolutionMode` to `ts.resolveModuleName` for hybrid module support ([b557a85](https://github.com/kulshekhar/ts-jest/commit/b557a85f85c3fd34523ec3a15293afbdc9dea83c)) - rebuild `Program` when consecutive compiles need different module kinds ([a82a2b3](https://github.com/kulshekhar/ts-jest/commit/a82a2b32c4987a5249fd5284283117dd2fa3be47)), closes [#&#8203;4774](https://github.com/kulshekhar/ts-jest/issues/4774) - respect tsconfig `moduleResolution` instead of forcing `Node10` ([1bffffc](https://github.com/kulshekhar/ts-jest/commit/1bffffc667557c173ae0c1f93dd436920775dac4)) - **transformer:** transpile `mjs` files from `node_modules` for CJS mode ([96d025d](https://github.com/kulshekhar/ts-jest/commit/96d025dd912ea2bceb18b67d2d509ada7a756d9d)) - **transformer:** use a consistent comparator in hoist-jest sortStatements ([8a8fd2f](https://github.com/kulshekhar/ts-jest/commit/8a8fd2fb8446655bba18367db9306a1089490e62)) ### [`v29.4.9`](https://github.com/kulshekhar/ts-jest/blob/HEAD/CHANGELOG.md#2949-2026-04-01) [Compare Source](https://github.com/kulshekhar/ts-jest/compare/v29.4.8...v29.4.9) ##### Bug Fixes - use correct registry for npm OIDC trusted publishing ([f8a9cc9](https://github.com/kulshekhar/ts-jest/commit/f8a9cc9892)) ### [`v29.4.8`](https://github.com/kulshekhar/ts-jest/blob/HEAD/CHANGELOG.md#2948-2026-04-01) [Compare Source](https://github.com/kulshekhar/ts-jest/compare/v29.4.7...v29.4.8) ##### Bug Fixes - wrong published assets ### [`v29.4.7`](https://github.com/kulshekhar/ts-jest/blob/HEAD/CHANGELOG.md#2947-2026-04-01) [Compare Source](https://github.com/kulshekhar/ts-jest/compare/v29.4.6...v29.4.7) ##### Features - support TypeScript v6 ([eda517d](https://github.com/kulshekhar/ts-jest/commit/eda517d226389317d99572887d3c1aa93c81be87)) </details> <details> <summary>TypeStrong/ts-loader (ts-loader)</summary> ### [`v9.6.2`](https://github.com/TypeStrong/ts-loader/blob/HEAD/CHANGELOG.md#962) [Compare Source](https://github.com/TypeStrong/ts-loader/compare/v9.6.1...v9.6.2) - [chore: trim runtime dependencies — remove enhanced-resolve/semver, swap micromatch → picomatch](https://github.com/TypeStrong/ts-loader/pull/1701) - thanks [@&#8203;johnnyreilly](https://github.com/johnnyreilly) Officially ts-loader has supported 3.6.3+ versions of TypeScript. This change means that certain scenarios with older versions of TS will now certainly fail. If anyone is actually using these versions it would be surprising. ### [`v9.6.1`](https://github.com/TypeStrong/ts-loader/blob/HEAD/CHANGELOG.md#961) [Compare Source](https://github.com/TypeStrong/ts-loader/compare/v9.6.0...v9.6.1) - [fix: rspack support](https://github.com/TypeStrong/ts-loader/pull/1699) - thanks [@&#8203;johnnyreilly](https://github.com/johnnyreilly) and [@&#8203;bhollis](https://github.com/bhollis) ### [`v9.6.0`](https://github.com/TypeStrong/ts-loader/blob/HEAD/CHANGELOG.md#960) [Compare Source](https://github.com/TypeStrong/ts-loader/compare/v9.5.7...v9.6.0) - [feat: add webpack 4 support back](https://github.com/TypeStrong/ts-loader/pull/1697) - thanks [@&#8203;johnnyreilly](https://github.com/johnnyreilly) and [@&#8203;tweet](https://github.com/tweet) ### [`v9.5.7`](https://github.com/TypeStrong/ts-loader/blob/HEAD/CHANGELOG.md#957) [Compare Source](https://github.com/TypeStrong/ts-loader/compare/v9.5.4...v9.5.7) - [fix: TS5011 errors with TypeScript 6.0: transpileModule called with rootDir: undefined](https://github.com/TypeStrong/ts-loader/pull/1679) \[[#&#8203;1678](https://github.com/TypeStrong/ts-loader/issues/1678)] - thanks [@&#8203;julioz](https://github.com/julioz) and [@&#8203;errorx666](https://github.com/errorx666) - [feat: migrate to trusted publishing](https://github.com/TypeStrong/ts-loader/pull/1680) - thanks [@&#8203;johnnyreilly](https://github.com/johnnyreilly) Skipping 9.5.5-9.5.6 due to publishing issues </details> <details> <summary>Microsoft/tslib (tslib)</summary> ### [`v2.9.1`](https://github.com/microsoft/tslib/releases/tag/v2.9.1): tslib 2.9.1 [Compare Source](https://github.com/Microsoft/tslib/compare/v2.8.1...v2.9.1) #### What's Changed - Update dependencies by [@&#8203;jakebailey](https://github.com/jakebailey) in [microsoft#283](https://github.com/microsoft/tslib/pull/283) - Switch to new release pipeline by [@&#8203;jakebailey](https://github.com/jakebailey) in [microsoft#289](https://github.com/microsoft/tslib/pull/289) - Port content mapper changes to rewriteRelativeImportExtension by [@&#8203;andrewbranch](https://github.com/andrewbranch) in [microsoft#295](https://github.com/microsoft/tslib/pull/295) - Stop requiring an ignored lockfile in release workflows by [@&#8203;jakebailey](https://github.com/jakebailey) in [microsoft#296](https://github.com/microsoft/tslib/pull/296) - Bump tslib to 2.9.0 by [@&#8203;typescript-automation](https://github.com/typescript-automation)\[bot] in [microsoft#297](https://github.com/microsoft/tslib/pull/297) - Stop running tests in the Azure release pipeline by [@&#8203;jakebailey](https://github.com/jakebailey) in [microsoft#298](https://github.com/microsoft/tslib/pull/298) - Bump tslib to 2.9.1 by [@&#8203;typescript-automation](https://github.com/typescript-automation)\[bot] in [microsoft#299](https://github.com/microsoft/tslib/pull/299) **Full Changelog**: <https://github.com/microsoft/tslib/compare/v2.8.1...v2.9.1> </details> <details> <summary>wasm-bindgen/wasm-bindgen (wasm-bindgen)</summary> ### [`v0.2.130`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02130) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.129...0.2.130) ##### Added - A borrowed number, `bool`, `char` or borrowed string crosses by copy, so `&f64`, `&Option<T>`, `&Nullable<T>`, `Option<&f64>` and `Option<&Nullable<T>>` are argument types, and an `experimental_generic_mono` import taking `&T` accepts `T = f64`, `Option<f64>` or `Nullable<String>`, as std's `contains(&T)` does. [#&#8203;5436](https://github.com/wasm-bindgen/wasm-bindgen/pull/5436) - Added a rejection type parameter to `js_sys::Promise<T, E = JsValue>`, mirrored on `JsFuture<T, E>`, `PromiseState<T, E>` and `PromiseWithResolvers<T, E>`. Awaiting a `Promise<T, E>` yields `Result<T, E>`, converting the rejection reason as an `E` the same unchecked way the fulfilled value is converted as a `T`. Both parameters are covariant under `Upcast`; `catch`, `then_with_reject` and the `withResolvers` reject function receive an `E`; `all_tuple` / `all_settled_tuple` carry a shared `E` through; and under `js_sys_unstable_apis`, `Promise::new`, `Promise::reject` and `Promise::any` are typed on the rejection too, `any` as `AggregateError`. The default keeps existing `Promise<T>` code unchanged. `PromiseWithResolvers<T, E>` is invariant in both, since its `resolve` and `reject` functions take them, and `JsFuture<T, E>` is `UnwindSafe` whenever `T` and `E` are. [#&#8203;5426](https://github.com/wasm-bindgen/wasm-bindgen/pull/5426) - Added the `--js-string-builtins` CLI flag, importing `static_string` constants as [JS String Builtins](https://github.com/WebAssembly/js-string-builtins) string constants from `wasm:js/string-constants` instead of defining them in the JS glue. With reference types, `static_string` constants now occupy fixed `externref` table slots filled in when the module is instantiated, so cloning and dropping them is free and never calls into JS. [#&#8203;5401](https://github.com/wasm-bindgen/wasm-bindgen/pull/5401) - Added `Nullable<T>`, re-exported as `js_sys::Nullable`, for a `T | null` value at the JS boundary, as `Option<T>` is for `T | undefined`, with `Option<Nullable<T>>` for `T | null | undefined`. Both are accepted wherever `Option<T>` is, for every `T` and in every position: JS `null` is `Nullable::Null` and is sent back as `null`, while `undefined` into a plain `Nullable<T>` goes to `T`'s own conversion. A plain `Option<T>` still reads both `undefined` and `null` as `None` and writes `None` as `undefined`; the `Option` layer of `Option<Nullable<T>>` treats only `undefined` as `None`, since `null` has to reach the `Nullable` layer. `Option<T>` converts from and into `Nullable<T>`, and `JsNullable<T>` converts from both and into `Option<Nullable<T>>` for `T: JsGeneric`. The API follows `Option`'s, including `ok_or`, `and_then`, `filter`, `as_deref`, `take`, `replace` and `IntoIterator`, and `--cfg wasm_bindgen_unstable_try_trait` enables `?` on nightly. `NullableIntoWasmAbi` / `NullableFromWasmAbi` carry `Nullable<T>`'s `null` for every `T`, and are supertraits of `JsStringLike` and the js-sys primitive-union markers, so `Nullable<impl JsStringLike>` and `Nullable<impl JsNumberOrStringLike>` work under `experimental_generic_mono`, and `Nullable<T>` erases like `Option<T>` on a generic import. [#&#8203;5410](https://github.com/wasm-bindgen/wasm-bindgen/pull/5410) [#&#8203;5423](https://github.com/wasm-bindgen/wasm-bindgen/pull/5423) - `Nullable<T>` converts into `JsValue` with `From`, `Null` becoming `null` as `None` becomes `undefined` for `Option<T>`, and `Option<T>`, `Nullable<T>` and `Result<T, E>` are `Promising` for any `T: Promising`, so a `Promise<Nullable<JsString>>` awaits to a `Nullable<JsString>`. `String` and `&str` upcast to `JsValue`, and `String` to itself, so a `Promise<String>` from an `experimental_generic_mono` import is `JsGeneric` and upcasts to `Promise<JsValue>` as `Promise<bool>` does. Together these make a `Promise<Nullable<JsString>>` or `Promise<String>` from a mono import usable wherever a promise is expected. `&str` and `String` upcast to each other, so an `Array<&str>` inferred from borrowed arguments settles to `Array<String>`. `Option<T>` and `Nullable<T>` upcast to `JsValue` whenever `T` does, so a `Promise<Option<String>>` relabels to `Promise<JsValue>`, and `Undefined` and `Null` upcast to `Option<T>` and `Null` to `Nullable<T>`, so a `Function<fn(A) -> R>` stands in for a `Function<fn(A, Option<B>) -> R>`. Every Rust and JS carrier wraps into `Option<Target>` and `Nullable<Target>` whenever it upcasts to `Target`, and `Nullable<T>` upcasts to `Option<T>`, so an `Array<JsString>` relabels to `Array<Option<JsString>>` or `Array<Option<Nullable<JsString>>>`, and a `Function<fn(Option<T>) -> R>` stands in for a `Function<fn(T) -> R>`. [#&#8203;5427](https://github.com/wasm-bindgen/wasm-bindgen/pull/5427) [#&#8203;5437](https://github.com/wasm-bindgen/wasm-bindgen/pull/5437) - Added `MaybeIntoWasmAbi` / `MaybeFromWasmAbi`, the ABI of `Option<T>` for every `T`, with an associated `MaybeAbi` that lets a type without a spare value in its own ABI, such as `i32` or `f64`, pick a wider one. `Option<T>` converts through it, and a blanket impl provides it for every `OptionIntoWasmAbi` / `OptionFromWasmAbi` type, so existing impls and bounds are unaffected. `NullableIntoWasmAbi` / `NullableFromWasmAbi` extend it with `null`. As a result, `Option<impl JsNumberOrStringLike>` and the other primitive-union bounds now work in `experimental_generic_mono` imports without a `where Option<T>: IntoWasmAbi` clause. [#&#8203;5423](https://github.com/wasm-bindgen/wasm-bindgen/pull/5423) - Under `js_sys_unstable_apis`, `RegExp::exec` and `JsString::match_` return `Nullable<T>` rather than `Option<T>`, as the JS APIs return `null` on no match. [#&#8203;5410](https://github.com/wasm-bindgen/wasm-bindgen/pull/5410) - Added the `slice = view | copy | array` and `vec = copy | array` attributes for imported JS functions, choosing what JS receives for a sequence argument with numeric elements: a live typed array over wasm memory, a fresh typed array, or a fresh plain `Array`. `slice` applies to borrowed slices (`&[T]`, `Option<&[T]>`, `Clamped<&[u8]>`) and `vec` to owned ones (`Vec<T>`, `Box<[T]>`, `Option<Vec<T>>`, `Clamped<Vec<u8>>`). Each key is accepted per argument, per function and per `extern "C"` block, with a more specific level overriding a broader one. Inherited from a function or block, a key only affects arguments of its own shape; written on an argument it doesn't fit, it is an error. A generic element type resolves the mode per instantiation under `experimental_generic_mono`, where `Option<&[T]>` is now supported too. Neither key is accepted on exported functions. [#&#8203;5384](https://github.com/wasm-bindgen/wasm-bindgen/pull/5384) - Borrowed slices of `String`, `&str`, `bool`, `char` and exported enums (`&[T]` and `Option<&[T]>`) can be passed to imported JS functions, arriving as a fresh `Array`. [#&#8203;5384](https://github.com/wasm-bindgen/wasm-bindgen/pull/5384) - Slices of every `JsStringLike` shape, including `&String`, `&Box<str>`, `&Cow<str>` and `&JsString`, can be passed to imported JS functions, and `JsStringLike` alone bounds a `&[T]` argument of an `experimental_generic_mono` import. [#&#8203;5384](https://github.com/wasm-bindgen/wasm-bindgen/pull/5384) - Owned vectors (`Vec<T>`, `Box<[T]>`, `Option<Vec<T>>`) of `bool`, `char` and string enums can be passed to and from JS, and `Vec<&str>` can be passed to JS. [#&#8203;5384](https://github.com/wasm-bindgen/wasm-bindgen/pull/5384) - String enums implement `TryFromJsValue`, accepting only their listed values, so they can be used as dynamic-union variant payloads. [#&#8203;5376](https://github.com/wasm-bindgen/wasm-bindgen/pull/5376) - Added `JsValue::from_utf8_lossy` to create a JS string directly from a `&[u8]`, decoding on the JS side with replacement characters for invalid UTF-8 instead of requiring a `String::from_utf8_lossy` allocation first. [#&#8203;5370](https://github.com/wasm-bindgen/wasm-bindgen/pull/5370) - Documented in the guide that passing an exported Rust type by value moves it out of the JavaScript object, which throws on any later use. [#&#8203;5354](https://github.com/wasm-bindgen/wasm-bindgen/pull/5354) - Added Rolldown compatibility to the deployment docs in the guide. [#&#8203;5355](https://github.com/wasm-bindgen/wasm-bindgen/pull/5355) - Added `source` property to ToggleEvent. [#&#8203;5353](https://github.com/wasm-bindgen/wasm-bindgen/pull/5353) - Added 11 experimental `js-sys` marker traits for every union of two or more of the TypeScript `bigint`, `boolean`, `number`, and `string` primitive categories. Traits such as `JsNumberOrStringLike` can bound `experimental_generic_mono` import parameters while preserving each concrete Rust type's native ABI representation. String-containing unions accept every `wasm_bindgen::JsStringLike` type. [#&#8203;5341](https://github.com/wasm-bindgen/wasm-bindgen/pull/5341) - Added the experimental `js_sys::PropertyKey` marker trait for the `string | number | symbol` keys accepted by TypeScript's `Record` type. `JsNumberOrStringLike` widens to `PropertyKey`. [#&#8203;5341](https://github.com/wasm-bindgen/wasm-bindgen/pull/5341) - `JsStringLike` and the `js-sys` string primitive-union traits now accept `&String`, `&Box<str>` and `&Cow<str>`. These shapes, and `Option` of each, also work as plain import argument types. [#&#8203;5374](https://github.com/wasm-bindgen/wasm-bindgen/pull/5374) - Added support for threads on memory64 (`wasm64-unknown-unknown` with `+atomics`). On memory64, `__wbindgen_thread_destroy` takes JS numbers. [#&#8203;5378](https://github.com/wasm-bindgen/wasm-bindgen/pull/5378) - Added `js-sys` bindings for the modern ECMAScript builtins that were still missing: the `Iterator` helpers (`Iterator.from` as `from_iterable`, `Iterator.concat`, `map`, `filter`, `take`, `drop`, `flatMap`, `reduce`, `toArray`, `forEach`, `some`, `every`, `find`), `Map` / `WeakMap` `getOrInsert` and `getOrInsertComputed`, `Object.groupBy` and `Map.groupBy`, `Promise.try` and `Promise.withResolvers` (with a `PromiseWithResolvers<T>` type), explicit resource management (`DisposableStack`, `AsyncDisposableStack`, `SuppressedError`, `Symbol.dispose`, `Symbol.asyncDispose`), `Uint8Array` base64 and hex conversion (`fromBase64`, `fromHex`, `toBase64`, `toHex`, `setFromBase64`, `setFromHex`, with `Base64Options`, its `Base64Alphabet` and `Base64LastChunkHandling` enums and a `SetFromResult` type), `Error.isError`, `Math.sumPrecise`, `Math.f16round`, `RegExp.escape` and the `dotAll`, `hasIndices` and `unicodeSets` flag getters, `String.prototype.isWellFormed` and `toWellFormed`, `Symbol.prototype.description`, `JSON.rawJSON` and `JSON.isRawJSON`, and the typed array `toReversed`, `toSorted`, `with`, `findLast`, `findLastIndex`, `includes` and `indexOf` methods. From ECMA-402, the `Intl.Locale` `firstDayOfWeek` and `variants` getters. From the WebAssembly JS API, `WebAssembly.JSTag`, the compile-options variants of `validate`, `compile`, `compileStreaming`, `instantiate`, `instantiateStreaming` and the `Module` constructor (taking a `CompileOptions` dictionary, with an `InstantiatedSource` result type), `Memory` `toResizableBuffer` and `toFixedLengthBuffer`, `Global.valueOf` and `Exception.stack`. [#&#8203;5403](https://github.com/wasm-bindgen/wasm-bindgen/pull/5403) [#&#8203;5421](https://github.com/wasm-bindgen/wasm-bindgen/pull/5421) ##### Changed - Reworked the `js_sys::Temporal` bindings and `Date::to_temporal_instant`, which stay behind `js_sys_unstable_apis` and now also need the new `temporal` feature, against the final Stage 4 specification and reshaped them to the web-sys conventions. Inputs are typed: `*Like` dictionaries such as `PlainDateLike` for `from`, calendar-free `*Fields` dictionaries for `with`, and the bare form of a method takes the type its argument converts to (`&str` time zones and calendars, `&PlainTime`, `&Duration`, `&Self` for `until`/`since`/`equals`), while every other member of a specification union gets a `_with_<type>` variant, so `with_calendar_with_plain_date`, `add_with_duration_like`, `add_with_str`, `equals_with_zoned_date_time`, `with_plain_time_with_str`, `PlainYearMonth::from_with_plain_date` and the typed `relativeTo`, `calendar`, `timeZone` and `plainTime` dictionary setters all exist; `compare` keeps taking `&Self` only. Optional arguments expand to the plain method plus `_with_options`/`_and_options`, `to_locale_string` takes no locale, a `_with_str`/`_with_str_sequence` one or an `Option<&str>` with options, and `round`, `total` and `get_time_zone_transition` take their options dictionary, with `round_with_unit`, `total_with_unit` and `get_time_zone_transition_with_direction` shortcuts. The option dictionaries are `OverflowOptions`, `DifferenceOptions`, `RoundToOptions::new(unit)`, `DurationTotalOptions::new(unit)`, `TimeZoneTransitionOptions::new(direction)` and friends, the enums drop their `Temporal` prefix (`Overflow`, `Unit`, `LargestUnit`, `TransitionDirection`, …). Bindings for the removed `toPlainYearMonth`/`toPlainMonthDay` on `PlainDateTime` and `ZonedDateTime`, `ZonedDateTime::with_plain_date` and `PlainTime::to_plain_date_time` are gone, `offset_nanoseconds` returns `f64`, `era`, `era_year`, `week_of_year` and `year_of_week` return `Option`s, `fractionalSecondDigits` is a `u8`, `get_time_zone_transition` returns `Nullable<ZonedDateTime>`, `to_js_string_with_options` and `to_locale_string` are fallible, constructors expand their optional trailing fields (`PlainTime::new()`, `new_with_hour`, …, `PlainDate::new_with_calendar`), and `catch` follows the specification: `equals`, `compare`, the typed `from` forms (except `PlainYearMonth`'s date conversions, which can leave the range) and the option-less `Instant`/`PlainTime` arithmetic are infallible, while `ZonedDateTime::start_of_day`, `hours_in_day` and `PlainDate::to_plain_year_month` are fallible. Fallible bindings return `Result<T, RangeError>`, or `Result<T, Error>` where a property bag, a `relativeTo`/`plainTime` union or `Intl` options can also throw a `TypeError`. `PartialEq`/`Eq` on the date-time types compare by the spec `equals()`, and `Instant` and `PlainTime` are `Ord` through `compare()`. [#&#8203;5402](https://github.com/wasm-bindgen/wasm-bindgen/pull/5402) - The js-sys `JsFunction*` traits' associated types (`Ret`, `ArgN`, `BindN`) no longer carry a `JsGeneric` bound, so a `Function<fn(..)>` signature may name a converted carrier such as `Nullable<JsString>`, and `Function::from_closure` accepts a closure with converted arguments. Generic code over these traits that calls `call*` or `bind*` now needs the bound itself, as `where F::Ret: JsGeneric, F::Arg1: JsGeneric`. The hidden `PromiseTuple` trait's `Joined` and `Settled` likewise drop it, its Rust-tuple impl packing the promise handles directly rather than upcasting each, and the `JsGeneric` bounds that only existed to satisfy a `Function<fn(..)>` slot or to tag a type argument are gone: `Promising for Promise<T, E>`, `Promise::new_typed`, the `PromiseWithResolvers` `resolve`/`reject` getters, the `PropertyDescriptor` `get`/`set` accessors, `WeakMap::new` and the `entries`/`from_entries` family of `Array`, `Set`, `Map` and `Object`. [#&#8203;5427](https://github.com/wasm-bindgen/wasm-bindgen/pull/5427) - `Option<T>: TryFromJsValue` now reads `null` as `None`, as the `Option<T>` ABI does, so `Option::<JsValue>::try_from_js_value(JsValue::NULL)` is `None` where it was `Some(null)`. A `T` that accepts `null` as a distinct value space sets the new `TryFromJsValue::NULLABLE` const, as `Nullable<T>` does, and an `Option` of it passes `null` through, so `Option<Nullable<T>>` reads it as `Some(Nullable::Null)`. `Nullable<T>` itself converts from a `JsValue` with `TryFromJsValue`. [#&#8203;5427](https://github.com/wasm-bindgen/wasm-bindgen/pull/5427) - With reference types, `static_string` constants and the reserved `undefined`, `null`, `true` and `false` values are stored at fixed slots of the `externref` table, which is now sized to include them, and cloning or dropping them no longer allocates or calls into JS. The per-string JS import function is no longer emitted. [#&#8203;5401](https://github.com/wasm-bindgen/wasm-bindgen/pull/5401) - **Breaking (experimental):** `experimental_generic_mono` imports no longer add hidden ABI bounds to the generated wrapper. The conversion bounds each position needs are now declared on the import like any other bound: `T: IntoWasmAbi` for an argument, `T: RefIntoWasmAbi` (a new trait in `wasm_bindgen::convert`) for a `&T` argument, `T: VectorRefIntoWasmAbi` for a `&[T]` or `Option<&[T]>` argument, `T: FromWasmAbi` for a return (`+ 'static` when `async`), `A: FromWasmAbi` for a callback argument and `R: IntoWasmAbi` for a callback return. A missing bound is reported at the position that needs it. [#&#8203;5385](https://github.com/wasm-bindgen/wasm-bindgen/pull/5385) - The generated `TextDecoder` no longer sets `fatal: true`. Rust `&str` is always valid UTF-8, so this only removes a redundant check and lets `JsValue::from_str` and `JsValue::from_utf8_lossy` share a single decoder. [#&#8203;5370](https://github.com/wasm-bindgen/wasm-bindgen/pull/5370) - Replaced the `once_cell` dependency with `core::cell::LazyCell`, which is available now that the library MSRV is 1.81. [#&#8203;5359](https://github.com/wasm-bindgen/wasm-bindgen/pull/5359) - Under `js_sys_unstable_apis`, the unsuffixed `Object::define_property`, `Object::from_entries`, `Object::get_own_property_descriptor`, `Object::has_own`, `Object::property_is_enumerable`, `Reflect::define_property`, `Reflect::delete_property`, `Reflect::get`, `Reflect::get_own_property_descriptor`, `Reflect::has`, and `Reflect::set` now take a generic `K: PropertyKey` key, accepting string, number, or symbol keys. `Object::get_own_property_descriptor` and `Reflect::get_own_property_descriptor` now return `Option<PropertyDescriptor<T>>`, and `Reflect::has` now takes an `&Object<T>` target. Callers passing `&"key".into()` should pass `"key"` (or another concrete key type) instead. [#&#8203;5341](https://github.com/wasm-bindgen/wasm-bindgen/pull/5341) - `wasm-bindgen-test` no longer depends on `async-trait`. Its benchmark code now uses native `async fn` in traits. [#&#8203;5365](https://github.com/wasm-bindgen/wasm-bindgen/pull/5365) - Escape string inputs in `debugString`. [#&#8203;5366](https://github.com/wasm-bindgen/wasm-bindgen/pull/5366) - `#[wasm_bindgen]` now warns when a function sets more than one of `this`, `getter`, `setter`, `indexing_getter`, `indexing_setter` and `indexing_deleter`. Only one of them takes effect, and the others used to be ignored silently. Conflicting options will be an error in the next major version. [#&#8203;4272](https://github.com/wasm-bindgen/wasm-bindgen/issues/4272) [#&#8203;5369](https://github.com/wasm-bindgen/wasm-bindgen/pull/5369) - `&[T]`, `Vec<T>`, `Box<[T]>`, `Option<Vec<T>>` and `Option<Box<[T]>>` arguments with a number element type are now declared in TypeScript and JSDoc as the typed array or a plain array (e.g. `Uint8Array | number[]`, or `BigInt64Array | bigint[]` for 64-bit elements), matching what the generated JS already accepts. Read-write struct fields of these types are declared as a getter and setter pair. `&mut [T]` arguments still take only a typed array, since the results are copied back into its buffer, and so do `Clamped` arguments, since numbers in a plain array would wrap around instead of being clamped. [#&#8203;4504](https://github.com/wasm-bindgen/wasm-bindgen/issues/4504) - Numeric enums are passed between JS and Rust as an `f64`, so a value from JS that isn't one of the enum's values, such as `'abc'`, `NaN`, `1.5` or `2 ** 32`, throws "invalid enum value passed" in release builds too, rather than becoming variant 0 or being truncated. Conversions from `JsValue` likewise reject `NaN` and fractions. Values above `i32::MAX` in a `#[repr(u32)]` enum are now returned to JS unchanged rather than as negative numbers. [#&#8203;5384](https://github.com/wasm-bindgen/wasm-bindgen/pull/5384) - A `Vec<T>` of a numeric enum passed from JS checks each element as a single enum value, so a wrong element throws the same error a single argument would, rather than "array contains a value of the wrong type". [#&#8203;5384](https://github.com/wasm-bindgen/wasm-bindgen/pull/5384) ##### Fixed - `Upcast::upcast` and `upcast_into` no longer let a safe `UpcastFrom` impl extend a borrow's lifetime: `ErasableGeneric::Repr` now keeps the real lifetime of a reference, slice, `&str`, closure reference or `ScopedClosure` instead of `'static`, so the `Repr`-equality bound rejects such an upcast. A generic import likewise no longer accepts an owned `ScopedClosure` that borrows a non-`'static` value, which handed JS a closure over freed data; borrowed arguments, and owned ones that only contain a borrow, still accept any lifetime. [#&#8203;5178](https://github.com/wasm-bindgen/wasm-bindgen/pull/5178) - Concurrent calls to the `web` and `no-modules` init function no longer instantiate the module more than once; later calls share the in-flight initialization and resolve to the same instance. [#&#8203;5429](https://github.com/wasm-bindgen/wasm-bindgen/pull/5429) - `js_sys::Promise::catch_map`'s handler now receives the rejection reason, typed as the promise's `E`, instead of the reason mislabelled as the fulfilled type `T`. A handler on a `Promise<Foo>` written as `|v: Foo|` must take `JsValue`; it was never a `Foo`. [#&#8203;5426](https://github.com/wasm-bindgen/wasm-bindgen/pull/5426) - Large JS snippets (`module = "..."`, `inline_js`) and `typescript_custom_section` expressions such as `include_str!` no longer make compilation slow or print "constant evaluation is taking a long time" warnings. The macro now lays out the `__wasm_bindgen_unstable` custom section as a `#[repr(C)]` struct of byte arrays, so const evaluation copies each chunk at once instead of byte by byte. A crate with a 5 MB snippet went from 64 s to under a second for `cargo check`; the section's bytes are unchanged. [#&#8203;5413](https://github.com/wasm-bindgen/wasm-bindgen/pull/5413) - Emscripten output now keeps a `private` class that is only created from Rust, such as one converted into a `JsValue` and passed to JS. Every generated function that references a class by name now lists it in its `__deps`. Previously emcc dropped the class, and calling into it failed with `ReferenceError: <Class> is not defined`. [#&#8203;5415](https://github.com/wasm-bindgen/wasm-bindgen/pull/5415) - Imported methods, static methods and constructors without a `js_class` now bind to the `js_name` and `js_namespace` of the type they belong to when that type is declared in the same `extern "C"` block. Previously they used the type's Rust name, so for example a constructor of `#[wasm_bindgen(js_name = CustomName)] type Type;` called `new Type()`. [#&#8203;5391](https://github.com/wasm-bindgen/wasm-bindgen/pull/5391) - Lists passed from JS to Rust no longer leak memory when an element is rejected, such as a value of the wrong type in a `Vec<String>` or `Vec<T>` of exported structs, or an invalid value in a `Vec<T>` of a numeric enum. [#&#8203;5384](https://github.com/wasm-bindgen/wasm-bindgen/pull/5384) - An exported function or closure that rejects an argument from JS, such as an invalid numeric enum value or an exported struct that is still borrowed, no longer leaks its other arguments or leaves an exported object it borrowed, including `self`, permanently borrowed. Field setters, `free()` on a borrowed object, closures called after being dropped and `FnOnce` closures called twice also release what JS passed them. The same holds when the generated JS rejects an argument before calling Rust, such as an object of the wrong class or a number passed for a `u64`, after copying an earlier string or array into Wasm memory. [#&#8203;5388](https://github.com/wasm-bindgen/wasm-bindgen/pull/5388) - An exported function taking an `Option<JsValue>`, or without reference types an owned `JsValue`, no longer leaks an externref table or JS heap slot when Wasm rejects a later numeric argument, such as a number passed for a `u64`. [#&#8203;5404](https://github.com/wasm-bindgen/wasm-bindgen/issues/5404) - The test runner works again with `WASM_BINDGEN_NO_DEBUG=1`, so a test suite can run against the glue a release build gets. The tests are reached through the `__wasm` export, which only debug glue has had since [#&#8203;4879](https://github.com/wasm-bindgen/wasm-bindgen/issues/4879); the new `Bindgen::export_wasm` option exports it on its own. [#&#8203;5404](https://github.com/wasm-bindgen/wasm-bindgen/issues/5404) - An `async` export now converts its arguments when it is called, rather than when its future is first polled. A rejected argument rejects the returned promise, instead of throwing from the task queue, and an `async` method's `self` stays borrowed from the call on, so freeing the object before the future runs throws instead of leaving the method with a freed `self`. [#&#8203;5388](https://github.com/wasm-bindgen/wasm-bindgen/pull/5388) - Reference types are now detected from the runtime's externref intrinsics when the `target_features` section is missing, as with `strip = true`. Previously such builds skipped the externref transform, and `#[wasm_bindgen(catch)]` imports failed with `externref table required for catch wrappers`. A warning now recommends running `wasm-opt` on the wasm-bindgen output instead of `strip = true`. [#&#8203;5382](https://github.com/wasm-bindgen/wasm-bindgen/pull/5382) - String enums, numeric enums and dynamic unions with the same name in different modules of one crate are now handled like same-named items in different crates: two public definitions report that the name is exported multiple times, and `private` copies are numbered (`Mode`, `Mode2`, ...). Previously `wasm-bindgen` failed with `dynamic union variant descriptor not found` or `duplicate enums`. [#&#8203;5381](https://github.com/wasm-bindgen/wasm-bindgen/pull/5381) - `private` string enums and dynamic unions with the same name in different crates can now coexist, numbered like structs and numeric enums. [#&#8203;5381](https://github.com/wasm-bindgen/wasm-bindgen/pull/5381) - The TypeScript alias for a string enum that is only referenced through a dynamic union is now emitted. [#&#8203;5376](https://github.com/wasm-bindgen/wasm-bindgen/pull/5376) - Attributes on imported statics, such as doc comments, `#[allow(...)]`, `#[deprecated]` and `#[cfg(...)]`, are now applied to the generated static instead of being dropped. [#&#8203;5377](https://github.com/wasm-bindgen/wasm-bindgen/pull/5377) - Imported functions and statics from two different `inline_js` snippets no longer share one binding when they have the same name and signature. The snippet contents are now part of the generated shim name, so each import reads its own snippet's export. [#&#8203;3878](https://github.com/wasm-bindgen/wasm-bindgen/issues/3878) - Imported types with the same Rust name no longer share one `instanceof` check when their module, `inline_js` snippet, `js_name` or `js_namespace` differ. Imported `static_string` statics with the same name no longer share one string. [#&#8203;5352](https://github.com/wasm-bindgen/wasm-bindgen/pull/5352) - Imported functions with the same name and signature no longer share one binding when they differ in how JS is called: `catch`, `variadic`, `final`, `slice_to_array`, `suspending`, `experimental_generic_mono`, the method kind (`constructor`, `static_method_of`, `getter`, `setter`, `indexing_*`), or a `js_name` with characters that a shim name drops. Two `experimental_generic_mono` imports that differ only in one of these now both bind instead of failing the build. [#&#8203;5352](https://github.com/wasm-bindgen/wasm-bindgen/pull/5352) - `debugString` handles `bigint` values (e.g. `123n`). [#&#8203;5356](https://github.com/wasm-bindgen/wasm-bindgen/pull/5356) - Fixed JSPI task pointers being truncated to 32 bits on `wasm64`. [#&#8203;5358](https://github.com/wasm-bindgen/wasm-bindgen/issues/5358) - Return pointers above 2 GiB on `wasm32` (e.g. thread stacks allocated under `+atomics`) are no longer treated as negative offsets in the generated JS, which previously threw a `RangeError` on number and string conversions. [#&#8203;5360](https://github.com/wasm-bindgen/wasm-bindgen/pull/5360) - With `--debug`, passing a value that is not an object with a numeric `length`, such as an `ArrayBuffer` or a string, where Rust takes `&[T]`, `Vec<T>`, `Box<[T]>` or `Option<Vec<T>>` now throws an error naming the expected and received types, instead of silently passing an empty or zeroed slice. `&mut [T]` arguments must be a typed array with the same element size and the same integer or float kind, since the results are copied back into its buffer. [#&#8203;1961](https://github.com/wasm-bindgen/wasm-bindgen/issues/1961) - Exported function arguments named like an identifier their generated JS glue binds or references, such as `wasm`, `ret` or a class name, no longer shadow it, which made calling the function throw. Such arguments get a numeric suffix in the JS, while the TypeScript definitions keep their name. [#&#8203;3729](https://github.com/wasm-bindgen/wasm-bindgen/issues/3729) - Getters generated by `getter_with_clone` no longer trigger the `clippy::clone_on_copy` lint. [#&#8203;5363](https://github.com/wasm-bindgen/wasm-bindgen/pull/5363) ### [`v0.2.129`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02129) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.128...0.2.129) ##### Added - Added the WebGL extension interface `EXT_polygon_offset_clamp`. [#&#8203;5336](https://github.com/wasm-bindgen/wasm-bindgen/pull/5336) - Added the `texture-compression-unaligned` variant to `GpuFeatureName`, matching the WebGPU specification. [#&#8203;5335](https://github.com/wasm-bindgen/wasm-bindgen/pull/5335) - Added an Emscripten Target page to the guide covering the `wasm32-unknown-emscripten` build flow, including the experimental `#[wasm_bindgen(experimental_tokio)]` attribute for driving an exported async function on a Tokio event-loop runtime there, gated behind `--cfg wasm_bindgen_unstable_tokio`. [#&#8203;5334](https://github.com/wasm-bindgen/wasm-bindgen/pull/5334) - Added experimental JSPI support on the `wasm32-unknown-emscripten` target, gated behind `--cfg wasm_bindgen_unstable_jspi`: `#[wasm_bindgen(jspi)]`, `#[wasm_bindgen(suspending)]`, `jspi_block_on_promise` and the JSPI context inheritance of `spawn_local` work when linking with `-sJSPI` and `-sJSPI_HOOKS` (or `-sREENTRANT_JSPI`). The fibers belong to Emscripten's JSPI runtime, which wasm-bindgen integrates with through its lifecycle hook exports instead of its own shadow stack management. `jspi` combines with `experimental_tokio` into a parked runtime: the export is a promising activation running its future with `block_on` on a Tokio runtime whose waits are JSPI suspensions, so invocations interleave at every wait. [#&#8203;5333](https://github.com/wasm-bindgen/wasm-bindgen/pull/5333) ##### Changed - Library MSRV bumped from 1.77 to 1.81, per the 2-year MSRV policy. [#&#8203;5257](https://github.com/wasm-bindgen/wasm-bindgen/pull/5257) ##### Fixed - `js-sys`: the `Number` constants no longer trigger deprecation warnings for the `core::f64` module constants when building the crate from source. [#&#8203;5351](https://github.com/wasm-bindgen/wasm-bindgen/pull/5351) - The `wasm_bindgen`, `wasm_bindgen_futures` and `js_sys` crate-path options on a `#[wasm_bindgen] impl` block now apply to its methods; previously they were ignored there. [#&#8203;5333](https://github.com/wasm-bindgen/wasm-bindgen/pull/5333) - Struct field getters no longer trigger the `unsafe_op_in_unsafe_fn` lint (warn by default in edition 2024) when the field name comes from a `macro_rules!` body, for example through `paste!`. [#&#8203;4465](https://github.com/wasm-bindgen/wasm-bindgen/issues/4465) - The headless test runner now keeps the path of a remote WebDriver URL set with variables like `CHROMEDRIVER_REMOTE`. A driver at `http://host/wd/hub/` now gets `http://host/wd/hub/session` instead of `http://host/session`. [#&#8203;2841](https://github.com/wasm-bindgen/wasm-bindgen/issues/2841) - The bundler entry module no longer re-exports `#[wasm_bindgen(private)]` items from `*_bg.js`, which does not export them. [#&#8203;5343](https://github.com/wasm-bindgen/wasm-bindgen/pull/5343) - `web-sys`: WebGL extension interfaces declared with `LegacyNoInterfaceObject` (`OVR_multiview2`, `WEBGL_multi_draw`, `EXT_polygon_offset_clamp`) now generate `is_type_of = |_| false` like their `NoInterfaceObject` counterparts. [#&#8203;5336](https://github.com/wasm-bindgen/wasm-bindgen/pull/5336) - The blanket `From<E: Error> for JsError` impl is now available without the `std` feature, using `core::error::Error`, so `?` works in `no_std` crates. [#&#8203;5029](https://github.com/wasm-bindgen/wasm-bindgen/pull/5029) - Emscripten output no longer emits the instance reinit machinery, which Emscripten's JS compiler rejected (unescaped multi-line `__postset`, and `var reinit_scheduled = let ...`): `schedule_reinit()` is a no-op there since Emscripten owns instantiation. The closure finalization `__postset` is now emitted as an escaped string literal. [#&#8203;5332](https://github.com/wasm-bindgen/wasm-bindgen/pull/5332) - Updated `walrus` to 0.27.2, fixing `--keep-debug` output that `wasm-opt -g` could not process: `.debug_loc` entries for removed code were unparseable (`debug_loc error`), and `DW_AT_high_pc` was re-encoded as variable-width `udata` (`compile unit size was incorrect`). [#&#8203;5328](https://github.com/wasm-bindgen/wasm-bindgen/pull/5328) - The headless test runner no longer hangs on a WebDriver that never answers, or on a browser holding the driver's stdio pipes open. [#&#8203;5338](https://github.com/wasm-bindgen/wasm-bindgen/pull/5338) - The CLI's schema version mismatch error now names the input Wasm file and the path of the running `wasm-bindgen` binary. [#&#8203;4430](https://github.com/wasm-bindgen/wasm-bindgen/issues/4430) - `#[wasm_bindgen(inspectable)]` on a tuple struct no longer generates invalid JavaScript. The generated `toJSON` now reads the `0`, `1`, ... fields as `this["0"]` instead of `this.0`. [#&#8203;2573](https://github.com/wasm-bindgen/wasm-bindgen/issues/2573) ### [`v0.2.128`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02128) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.127...0.2.128) ##### Added - Added `OffscreenCanvas` overloads for the WebGL `texImage2D`, `texSubImage2D`, `texImage3D` and `texSubImage3D` functions, matching the `TexImageSource` typedef in the WebGL specification. [#&#8203;5312](https://github.com/wasm-bindgen/wasm-bindgen/pull/5312) - Added `--split-debug-info` to the CLI. This option extracts the DWARF debug info to a separate `*_bg.debug.wasm` file. Use `--debug-info-url` to set the recorded URL for the debug info. [#&#8203;5279](https://github.com/wasm-bindgen/wasm-bindgen/pull/5279) - Added `#[wasm_bindgen(experimental_generic_mono)]` for imported functions, which binds a generic import once per monomorphisation instead of erasing its type parameters to `JsValue`. It can be applied to an individual import or to a whole `extern "C"` block, which every generic function in the block then inherits. Each instantiation gets its own descriptor, so arguments and return values are marshalled at their concrete types (a `u32` crosses as a number, a `String` as a string) rather than being boxed. Trait bounds, `where` predicates (including higher-ranked ones), associated-type projections, lifetime parameters, argument-position `impl Trait`, raw callbacks with owned generic inputs and returns, `async`, `catch`, and `slice_to_array` are all supported; see [the guide](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/on-js-imports/experimental_generic_mono.html) for the supported surface and the shapes that are rejected. The attribute is experimental and may change as it stabilizes. [#&#8203;5230](https://github.com/wasm-bindgen/wasm-bindgen/pull/5230) [#&#8203;5272](https://github.com/wasm-bindgen/wasm-bindgen/pull/5272) [#&#8203;5314](https://github.com/wasm-bindgen/wasm-bindgen/pull/5314) - Added the experimental, sealed `JsStringLike` marker trait — implemented for `String`/`&str` (and `js_sys::JsString`/`&js_sys::JsString` in `js-sys`) — as a bound for `experimental_generic_mono` imports that accept any string shape at its native wire format. - `#[wasm_bindgen(experimental_generic_mono)]` now supports class-level generic parameters: an imported *type* that is itself generic (`type Holder<T>`), used as a method receiver (`this: &Holder<T>`), or as the return type of a constructor or self-returning static method (`fn new<T>(value: T) -> Holder<T>`). See [Class-level generics](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/on-js-imports/experimental_generic_mono.html#class-level-generics) in the guide. [#&#8203;5290](https://github.com/wasm-bindgen/wasm-bindgen/pull/5290) - A generic imported type used as a method receiver or a constructor's return type may now carry concrete generic arguments (`this: &Holder<u32>`, `this: &Holder<u32, T>`). The arguments are re-emitted as written, so the generated method hangs off `impl Holder<u32>` rather than the class's own parameter defaults. [#&#8203;5290](https://github.com/wasm-bindgen/wasm-bindgen/pull/5290) - Added experimental JSPI (JS Promise Integration) support: using it emits a compiler warning noting the experimental status. Supports `#[wasm_bindgen(jspi)]` on exports (sync or `async`), within which a `#[wasm_bindgen(suspending)]` import call can suspend to the JS event loop until its `Promise` settles. `js_sys::futures::jspi_block_on_promise` also suspends on any `Promise` inside a synchronous function, while `spawn_local` is context-aware: tasks spawned from within a JSPI context support synchronous JSPI suspensions throughout their call trees. Compatible with `catch` (rejections as `Err`), `async`, and `panic=unwind`. [#&#8203;5193](https://github.com/wasm-bindgen/wasm-bindgen/pull/5193) - Added a `--ts-typed-array-buffers` CLI flag to declare owned typed-array return values (e.g. `Vec<u8>`) as `Uint8Array<ArrayBuffer>` in generated TypeScript, since they are always copied into a fresh, non-shared `ArrayBuffer`. Requires TypeScript 5.7+. [#&#8203;5263](https://github.com/wasm-bindgen/wasm-bindgen/pull/5263) ##### Changed - Export shim symbols are now mangled with a per-crate hash, so identically named exports from different crates (or two versions of one crate) no longer fail the link with duplicate-symbol errors; the CLI restores the canonical names in the final module. Same-named `#[wasm_bindgen(private)]` structs/enums now coexist (numbered `Name`, `Name2`, ... internally in the generated bindings), while genuinely conflicting public exports are reported as a wasm-bindgen error instead of a wasm-ld failure. Requires matching `wasm-bindgen` and CLI versions (schema bump). [#&#8203;2247](https://github.com/wasm-bindgen/wasm-bindgen/issues/2247) - Setting `js_namespace` on both an `extern "C"` block and an item inside it is now a hard error. Nested paths must be written in a single attribute, e.g. `js_namespace = ["a", "b"]`. The previous behavior silently dropped the block-level namespace. [#&#8203;4324](https://github.com/wasm-bindgen/wasm-bindgen/issues/4324) - Changed WebGPU `setImmediates` APIs to take immutable u8 slice. [#&#8203;5289](https://github.com/wasm-bindgen/wasm-bindgen/pull/5289) - Changed Web Bluetooth `writeValue` / `writeValueWithResponse` / `writeValueWithoutResponse` and WebUSB `controlTransferOut` / `transferOut` / `isochronousTransferOut` APIs to take immutable u8 slices. [#&#8203;5309](https://github.com/wasm-bindgen/wasm-bindgen/pull/5309) - Emscripten glue no longer reads `wasmExports['name']` inline inside inner functions. It now references the asmjs-mangled identifiers emcc's own top-level `assignWasmExports` receiving code binds for every wasm export (e.g. `___wbindgen_malloc`, `___wbindgen_externrefs`), which are the canonical DCE-graph pairs: wasm-metadce keeps exactly the exports the included glue uses (previously internal exports and the externref table could be stripped or left unrenamed by the import/export minifier at `-O2`, breaking at runtime). Hoisted classes are now emitted as `=`-prefixed string value snippets so jsifier declares them as `export var Class = class Class {...}` instead of an `export class` declaration, which crashes emcc's acorn-optimizer under `-sMODULARIZE=instance`. ##### Fixed - C-style `#[wasm_bindgen]` enums in `Vec<T>` / `Box<[T]>` now generate TypeScript and JSDoc as `EnumName[]` instead of `any[]`. [#&#8203;5321](https://github.com/wasm-bindgen/wasm-bindgen/pull/5321) - Fixed `js-sys` failing to compile with `no_std` and the `futures-core-03-stream` feature enabled, since the feature unconditionally pulled in `futures-util/std`. The `std` feature of `futures-util` is now only enabled by the `js-sys` `std` feature. [#&#8203;5322](https://github.com/wasm-bindgen/wasm-bindgen/pull/5322) - The thread-bootstrap transform is now skipped in Emscripten mode, where the Emscripten runtime owns pthread startup and TLS. It previously ran on any module with shared memory and aborted the build (`failed to find __wasm_init_tls`), since Emscripten's linker had already consumed the synthetic symbols it looks for. [#&#8203;5315](https://github.com/wasm-bindgen/wasm-bindgen/pull/5315) - Fixed conflicting deprecation messages on `web-sys` dictionary fields that are themselves deprecated: the deprecated builder-style method no longer points at an equally-deprecated setter, and the WebAuthn fields removed from the specification (such as `PublicKeyCredentialRpEntity`'s `icon`) now state why they are deprecated. [#&#8203;5302](https://github.com/wasm-bindgen/wasm-bindgen/issues/5302) - `#[wasm_bindgen]` on a struct now reports an actionable error when the path to the `wasm_bindgen` crate cannot be resolved (e.g. when `wasm-bindgen` is only a transitive dependency through `web-sys`), instead of a confusing recursion limit error. [#&#8203;5295](https://github.com/wasm-bindgen/wasm-bindgen/issues/5295) - Fixed `js_namespace` exports missing from the bundler target's entry module re-export list, making namespaces unreachable when importing the package. [#&#8203;5267](https://github.com/wasm-bindgen/wasm-bindgen/issues/5267) - The CLI now reports an actionable error when the `__wasm_bindgen_unstable` custom section is missing from a module that still contains wasm-bindgen shims (e.g. stripped by `llvm-objcopy --strip-all`, which removes all custom sections since LLVM 23), instead of the confusing ``import of `X` doesn't have an adapter listed``. [#&#8203;5268](https://github.com/wasm-bindgen/wasm-bindgen/issues/5268) - The generated `&T` handle conversions (`IntoWasmAbi`/`OptionIntoWasmAbi`) for an imported type with lifetime parameters (`type Holder<'a, T>`) no longer reuse `'a` for the reference itself. Previously the impl header declared only a fresh `'a` plus the type's *type* parameters, so a type whose lifetime was not literally named `'a` failed with `E0261` against generated code, and one that was named `'a` had its lifetime forced to unify with the borrow of `&self` — surfacing as `E0521` whenever a generic method also had to resolve through the same impl. [#&#8203;5290](https://github.com/wasm-bindgen/wasm-bindgen/pull/5290) - An inline lifetime bound on a generic import (`fn f<'a: 'b, 'b, T>(..)`) is no longer dropped from the generated wrapper. Previously the bound was lost while the generated shim still declared it, so calling the import failed with "lifetime may not live long enough" reported against generated code. [#&#8203;5290](https://github.com/wasm-bindgen/wasm-bindgen/pull/5290) - A type-parameter default on a `#[wasm_bindgen(experimental_generic_mono)]` import is no longer silently ignored. It has no meaning there (every instantiation gets its own shim, so there is no single one to default) and rustc's own `invalid_type_param_default` lint cannot see it, since nothing of the original signature survives expansion; it is now rejected with the same `defaults for generic parameters are not allowed here` diagnostic rustc gives. Defaults on the type-erasure generic path are unaffected, where they remain meaningful. [#&#8203;5290](https://github.com/wasm-bindgen/wasm-bindgen/pull/5290) - Fix `js-sys` wasm64 build with `atomics` feature. [#&#8203;5274](https://github.com/wasm-bindgen/wasm-bindgen/issues/5274) - Declare `initSync` in the generated TypeScript definitions for `--target no-modules`, matching the `wasm_bindgen.initSync` function that the JS output already exposes. [#&#8203;5284](https://github.com/wasm-bindgen/wasm-bindgen/issues/5284) - Removed the last panicking code paths from `externref` table management: `RefCell::borrow_mut()` embedded panic location data (including the source path string) in `.rodata` of optimized builds, which not even `wasm-opt` could remove. [#&#8203;5292](https://github.com/wasm-bindgen/wasm-bindgen/issues/5292) - Fix `--no-modules-global` being ignored: the custom global name is now used for the generated JS binding and TypeScript declarations, and the name is validated as a JS identifier. [#&#8203;5286](https://github.com/wasm-bindgen/wasm-bindgen/issues/5286) ### [`v0.2.127`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02127) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.126...0.2.127) ##### Added - [Navigation API](https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API) to `web-sys` [#&#8203;5247](https://github.com/wasm-bindgen/wasm-bindgen/pull/5247) - Added `riscv64gc-unknown-linux-gnu` release artifacts. [#&#8203;5265](https://github.com/wasm-bindgen/wasm-bindgen/pull/5265) - Added `JsNullable<T>`, modeling WebIDL nullable types (`T | null`). Both `null` and `undefined` are treated as absent, per WebIDL's ECMAScript conversion rules; the canonical empty value produced from Rust is `null`. `web-sys` now uses `JsNullable<T>` instead of `JsOption<T>` for nullable types nested inside generics (e.g. `Promise<GpuError?>` from `GPUDevice.popErrorScope()`), fixing spec-defined `null` resolutions being treated as present values under `JsOption<T>`'s strict undefined-only semantics. `JsNullable<T>` participates in the same upcast lattice as `JsOption<T>` (including contravariant closure argument casts), and additionally upcasts from `Null` and from `JsOption<T>` itself. Imported extern types now also upcast into `JsOption<JsValue>` and `JsNullable<JsValue>`, so catch-all nullable closures can be used where a typed callback is expected. [#&#8203;5234](https://github.com/wasm-bindgen/wasm-bindgen/issues/5234) ##### Changed - Emscripten output now marks public exports (free functions, classes, enums, and namespace roots) with the `__export: true` and `__force: true` symbol attributes on their `addToLibrary` entries, instead of mutating `EXPORTED_FUNCTIONS` and pushing to `extraLibraryFuncs` at library-load time. The `$initBindgen` init closure is kept via `__force: true`, and private symbols (including namespace leaves) carry neither attribute — they remain reachable through `__deps`. Requires an emscripten with `__export`/`__force` symbol-attribute support. - Updated WebGPU bindings to the August 2026 spec, including the new `GPUCommandEncoder::copy_buffer_to_buffer` overloads and `setImmediates`. [#&#8203;5246](https://github.com/wasm-bindgen/wasm-bindgen/pull/5246) - Unstable API overload names now elide name tokens shared by every overload variant: `LockManager::request_with_callback` is now `request`, and `request_with_options_and_callback` is now `request_with_options`. [#&#8203;5246](https://github.com/wasm-bindgen/wasm-bindgen/pull/5246) ##### Fixed - The `name` property of the JS error thrown for `panic=unwind` is now set from a string literal instead of `PanicError.name`, so it survives minification. [#&#8203;5260](https://github.com/wasm-bindgen/wasm-bindgen/issues/5260) - Fixed Emscripten builds using pthreads failing to link. [#&#8203;5254](https://github.com/wasm-bindgen/wasm-bindgen/pull/5254) - `__wbg_load` in web targets now throws a clear error including the HTTP status and URL when given a non-ok fetch `Response`, instead of surfacing a misleading MIME-type or Wasm-magic-number error. [#&#8203;5256](https://github.com/wasm-bindgen/wasm-bindgen/pull/5256) - Restored `__stack_pointer` when an exception unwinds out of a wasm export, preventing repeated `panic = "unwind"` calls from leaking shadow-stack frames until the shadow stack is exhausted and calls trap. Node reports `memory access out of bounds`; poisoned instances can instead report `Module terminated`. [#&#8203;5244](https://github.com/wasm-bindgen/wasm-bindgen/pull/5244) - `slice_to_array` on a `&mut` slice (which silently discarded JS's writes) or on a slice with a generic element type is now a compile error, and strings and arrays received by JS (e.g. a `Vec<String>` return value) no longer make a redundant copy of the freshly built value. [#&#8203;5261](https://github.com/wasm-bindgen/wasm-bindgen/pull/5261) - Fixed `async` imports with non-JS-handle resolved types (e.g. `async fn f() -> u32;`) silently producing garbage since 0.2.109: the descriptor named the resolved type instead of the `Promise` handle that actually crosses the ABI. \#[5249](https://github.com/wasm-bindgen/wasm-bindgen/pull/5249) - Fixed `catch` imports returning `i64`/`u64` throwing a `TypeError` (and panicking in `__wbindgen_exn_store`) when the JS import throws, since the `handleError` catch path returned `undefined` which cannot be converted to a Wasm `i64`. [#&#8203;5238](https://github.com/wasm-bindgen/wasm-bindgen/pull/5238) - `js_namespace` is now part of an imported function's and imported static's generated shim name. Two imports with identical Rust signatures that differed *only* in their `js_namespace` hashed to the same `__wbg_<name>_<hash>` symbol, so they were treated as one binding and one of the two call sites silently invoked the wrong JS value. [#&#8203;5250](https://github.com/wasm-bindgen/wasm-bindgen/pull/5250) - Macro hygiene fixes - `slice_to_array` now works in `#![no_std]` crates. Generated code no longer names `core` or `std` unqualified. [#&#8203;5251](https://github.com/wasm-bindgen/wasm-bindgen/pull/5251) - Fixed length prefixes in descriptor strings to count `char`s rather than UTF-8 bytes, so non-ASCII names in `js_name`/`typescript_type` no longer panic the CLI or mis-bind the generated bindings. [#&#8203;5248](https://github.com/wasm-bindgen/wasm-bindgen/pull/5248) - Fixed threaded Wasm memory layout to reserve wasm-bindgen's internal thread page after the module's original initial memory instead of at `__heap_base`, avoiding overlap with allocators that resolve `__heap_base`/`__heap_end` at link time and treat that range as preexisting heap space. [#&#8203;5225](https://github.com/wasm-bindgen/wasm-bindgen/pull/5225) - Emscripten output now reaches wasm exports through emscripten's `wasmExports` object using bracket (string-literal) access (`wasmExports['__wbindgen_start']`) instead of a local `wasm` alias with dot access. `wasmExports['name']` is the form emcc's DCE graph roots and its import/export minifier renames in the JS and the wasm together, so the glue now survives and stays consistent under `-O3`/`-Os` (previously the export names were minified without updating the JS call sites, e.g. `__wbindgen_start is not defined`). - The emscripten detection marker static is no longer leaked as public API. [#&#8203;5220](https://github.com/wasm-bindgen/wasm-bindgen/pull/5220) [#&#8203;5222](https://github.com/wasm-bindgen/wasm-bindgen/pull/5222) ### [`v0.2.126`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02126) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.125...0.2.126) ##### Changed - Emscripten output now hoists every clean export (free functions, classes, enums, plus their finalization registries and string-enum tables) out of the `$initBindgen` init closure into its own top-level `addToLibrary` symbol and self-registers it into `EXPORTED_FUNCTIONS`. emscripten then emits the clean API (`add`, `Counter`, ...) as named ESM exports under `-sMODULARIZE=instance` and as `Module.<name>` properties (via each symbol's `__postset`) in factory mode, with no extra sidecar files. Namespaced exports are reached through their namespace root (e.g. `app`), assembled in the root symbol's `__postset`. User module/inline-js imports are now wired as `addToLibrary` shims (they were previously dropped, since emcc resolves imports only against `env`), and their ESM-imported bindings are `__wbg_`-prefixed to avoid colliding with emcc runtime names such as `Module`/`HEAP8`. [#&#8203;5210](https://github.com/wasm-bindgen/wasm-bindgen/pull/5210) ##### Fixed - The descriptor interpreter now follows emscripten `invoke_*` trampolines. emscripten's exception/longjmp lowering rewrites direct calls into indirect calls through the function table wrapped in imported `invoke_*(fnptr, ..args)` helpers, including the describe helpers a descriptor function must reach. The interpreter resolves `fnptr` against the reconstructed function table, forwards the trailing arguments, and evaluates the surrounding "did it throw?" control flow (`if`/`else`, `loop`, `br_table`), so descriptors are interpreted correctly on emscripten builds with unwinding/longjmp enabled. [#&#8203;5215](https://github.com/wasm-bindgen/wasm-bindgen/pull/5215) - Relaxed alignment requirement for 8-byte types. [#&#8203;5204](https://github.com/wasm-bindgen/wasm-bindgen/pull/5204) - Fixed compilation with `(feature = "std", panic = "unwind", target_feature = "atomics")` and prevented a `Task` leak when a future unwinds out of `poll` (via a Rust panic or a foreign JS exception) in both the single-threaded and multi-threaded executors. [#&#8203;5214](https://github.com/wasm-bindgen/wasm-bindgen/pull/5214) - Headless Chrome/Edge tests now surface the WebDriver's own error message when session creation fails (e.g. a chromedriver/Chrome version mismatch) instead of a confusing `http status: 404`. [#&#8203;5211](https://github.com/wasm-bindgen/wasm-bindgen/pull/5211) ##### Removed ### [`v0.2.125`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02125) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.123...0.2.125) ##### Added - Added the `--force-enable-abort-handler` CLI flag, which emits the hard-abort detection and `set_on_abort` machinery on `panic=abort` builds. With `panic=unwind` this machinery is generated automatically; the flag does nothing there. [#&#8203;5191](https://github.com/wasm-bindgen/wasm-bindgen/pull/5191) ##### Changed - Made the internal `__wbindgen_destroy_closure` export private in the Rust API. [#&#8203;5196](https://github.com/wasm-bindgen/wasm-bindgen/pull/5196) ### [`v0.2.123`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02123) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.122...0.2.123) ##### Added - Added the `maxAge` attribute to the `CookieInit` dictionary in `web-sys`, matching the current Cookie Store API specification. [#&#8203;5169](https://github.com/wasm-bindgen/wasm-bindgen/pull/5169) - The js-sys futures codegen opt-in can now also be enabled via the `WASM_BINDGEN_USE_JS_SYS=1` environment variable, in addition to `--cfg=wasm_bindgen_use_js_sys`. This works on stable when `--target` is in use, where Cargo does not propagate the cfg to host proc-macros. [#&#8203;5164](https://github.com/wasm-bindgen/wasm-bindgen/pull/5164) ##### Changed - `JsOption<T>` now treats only `undefined` as empty, aligning it with TypeScript's strict `T | undefined` semantics and with `Option<T>`'s wire shape (`None` ↔ `undefined`). Previously `is_empty`, `as_option`, `into_option`, `unwrap`, `expect`, `unwrap_or_default`, and `unwrap_or_else` treated both `null` and `undefined` as absent; JS `null` is now a distinct present value. The `impl<T> UpcastFrom<Null> for JsOption<T>` is removed (`Undefined` still models absence), and the `Debug`/`Display` absent placeholder changed from `"null"` to `"undefined"`. Code relying on `null → None` should return `undefined` from the JS side, or check explicitly with `val.as_option().filter(|v| !v.is_null())`. [#&#8203;5170](https://github.com/wasm-bindgen/wasm-bindgen/pull/5170) ##### Fixed - Removed invalid `js_sys::Array<T>` to `js_sys::ArrayTuple<(...)>` upcasts. `ArrayTuple` encodes a fixed tuple arity, while a plain JavaScript array does not prove that arity statically. - Fixed incorrect variance in `&mut` reference upcasting. `&mut T` upcasts were covariant in the pointee, so a `&mut T` could be widened to a `&mut` of a supertype and used to write back a value the original type would not accept, leaving a reference whose static type no longer matches the value it points to. Mutable references are now *invariant* in their pointee: `&mut T` only upcasts to `&mut Target` when both `Target: UpcastFrom<T>` and `T: UpcastFrom<Target>` hold. This rejects the invalid widening but is a breaking change for callers that relied on widening `&mut` references. [#&#8203;5176](https://github.com/wasm-bindgen/wasm-bindgen/issues/5176) - Fixed WASI targets (`wasm32-wasip1`/`wasm32-wasip2`) emitting unresolved `__wbindgen_placeholder__` imports, which broke component linking. The codegen and runtime gates now exclude `target_os = "wasi"` (restoring the pre-0.2.115 stub behavior), including the `panic = "unwind"` paths in `wasm-bindgen-futures`. [#&#8203;5175](https://github.com/wasm-bindgen/wasm-bindgen/pull/5175) - Fixed a panic ("Unhandled load width 8") in the descriptor interpreter when processing `-Cinstrument-coverage`-instrumented modules, unblocking `cargo llvm-cov --target wasm32-unknown-unknown` for crates whose describe helpers get instrumented. [#&#8203;5179](https://github.com/wasm-bindgen/wasm-bindgen/pull/5179) - Fixed `main` silently never running on wasm64 for bin crates. [#&#8203;5181](https://github.com/wasm-bindgen/wasm-bindgen/pull/5181) ### [`v0.2.122`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02122) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.121...0.2.122) ##### Notices - Threading support now requires `-Clink-arg=--export=__heap_base` to be set in `RUSTFLAGS` for nightly toolchains from 2026-05-06 onward, after [rust-lang/rust#156174](https://github.com/rust-lang/rust/pull/156174) removed the implicit `__heap_base`/`__data_end` exports on `wasm*` targets. Atomics CI, CLI reference tests, and the `nodejs-threads`, `raytrace-parallel`, and `wasm-audio-worklet` examples have been updated to pass `--export=__heap_base` explicitly. The flag is backward-compatible with older nightlies. - `-Cpanic=unwind` on wasm targets now emits modern (exnref) exception handling by default after [rust-lang/rust#156061](https://github.com/rust-lang/rust/pull/156061), and requires Node.js 22.22.3+ (for `WebAssembly.JSTag`). Legacy EH wasm can still be produced on current nightlies by adding `-Cllvm-args=-wasm-use-legacy-eh` to `RUSTFLAGS`; Node.js 20 may be supported with legacy exception handling, with a tracking issue in [#&#8203;5151](https://github.com/wasm-bindgen/wasm-bindgen/issues/5151). ##### Added - Implemented `TryFromJsValue` for `Vec<T>` where `T: TryFromJsValue`. A JS value converts when it is a real `Array` (per `Array.isArray`) and every element converts via `T::try_from_js_value`. This composes recursively (`Vec<Vec<String>>`, `Vec<Option<T>>`) and works for any `T` with a `TryFromJsValue` impl, including primitives, `String`, `JsValue`, and `JsCast` types. Array-likes (objects with `length` and numeric indices) are intentionally rejected to mirror the static ABI representation used by `js_value_vector_from_abi`. - New `extends_js_class` and `extends_js_namespace` attributes on exported structs to allow defining the parent `js_class` name when it has been customized by `js_name` and the parent's own `js_namespace` as well in turn. New validation is added at code generation time that will now catch these cases instead of emitting invalid code. Example: ```rust #[wasm_bindgen(js_name = "Animal", js_namespace = zoo)] pub struct AnimalImpl { /* ... */ } #[wasm_bindgen( extends = AnimalImpl, extends_js_class = "Animal", extends_js_namespace = zoo, )] pub struct DogImpl { /* ... */ } ``` [#&#8203;5154](https://github.com/wasm-bindgen/wasm-bindgen/pull/5154) ##### Changed - When an exported struct uses `js_namespace`, the corresponding value must now be repeated on every `impl` block. Previously the impl-side defaults silently worked resulting in inconsistent emission. Example: ```rust // Before: #[wasm_bindgen(js_namespace = "default")] pub struct Counter { /* ... */ } #[wasm_bindgen] // worked, but fragile impl Counter { /* ... */ } // After: #[wasm_bindgen(js_namespace = "default")] pub struct Counter { /* ... */ } #[wasm_bindgen(js_namespace = "default")] // now required impl Counter { /* ... */ } ``` To ease this transition for `js_namespace` usage, diagnostic messages now include hints for missing namespaces for easier fixing. [#&#8203;5154](https://github.com/wasm-bindgen/wasm-bindgen/pull/5154) ##### Fixed - Fixed the descriptor interpreter panicking on `Br` and `BrIf` instructions emitted by recent nightly compilers when building with `panic=unwind`. [#&#8203;5158](https://github.com/wasm-bindgen/wasm-bindgen/pull/5158) - Emscripten output now works against vanilla upstream emscripten without requiring a fork. Dependency tracking, `HEAP_DATA_VIEW` setup, function-decl intrinsic inlining, catch-wrapper gating, and imported global handling have all been corrected; ESM imports (`#[wasm_bindgen(module = "...")]` and snippets) are emitted to a sidecar `library_bindgen.extern-pre.js` consumers pass to emcc via `--extern-pre-js`; namespaced exports (`js_namespace = [...]` on a struct/impl) now attach to `Module.<segments>` instead of emitting top-level `export const` (which emcc's library evaluator rejects); the generated `.d.ts` for namespaced exports is now valid TypeScript (mangled identifiers stay module-internal via `declare class` / `declare enum` / `declare function` plus `export { BindgenModule };` to mark the file as a module; no spurious unqualified `Calc:` property on `BindgenModule` for namespaced items; namespace shapes land as plain interface members (`app: { math: { Calc: typeof app__math__Calc } };`) instead of the previously-emitted `export let app: { ... };` which was invalid TS1131 syntax inside an interface body). [#&#8203;5156](https://github.com/wasm-bindgen/wasm-bindgen/pull/5156) - Fixed a duplicate phantom class being emitted for an exported struct renamed via `js_name` (Rust ident != JS class name) and/or placed in a `js_namespace`, when the struct crosses the boundary as a `JsValue` (e.g. via `.into()`). The `WrapInExportedClass` / `UnwrapExportedClass` imports were keyed by the Rust ident rather than the qualified JS name that `exported_classes` is keyed by (a regression from [#&#8203;5154](https://github.com/wasm-bindgen/wasm-bindgen/issues/5154)), so a fresh empty class entry was minted and emitted alongside the real one, with a `free()` referencing a nonexistent wasm export. Riding the same release's [#&#8203;5154](https://github.com/wasm-bindgen/wasm-bindgen/issues/5154) wire-format bump, the now-vestigial `rust_name` field is dropped from the schema and the namespace-qualified name is no longer cached on `AuxStruct`, `AuxEnum`, or `ExportedClass` (derived on demand from `(name, js_namespace)`), collapsing three fallback chains that only papered over the [pre-#&#8203;5154](https://github.com/pre-/wasm-bindgen/issues/5154) keying. [#&#8203;5160](https://github.com/wasm-bindgen/wasm-bindgen/pull/5160) ### [`v0.2.121`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02121) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.120...0.2.121) ##### Added - Added the `slice_to_array` attribute for imported JS functions, which makes a `&[T]` (or `Option<&[T]>`) argument arrive on the JS side as a plain `Array` rather than a typed array — without changing the Rust-side `&[T]` signature. Useful when binding JS APIs that take `T[]` rather than `TypedArray<T>`. For primitive element kinds the wire is the same zero-copy borrow used by plain `&[T]`, with the JS-side shim wrapping the view in `Array.from(...)` to materialise the `Array` — no extra allocation. For `String`, `JsValue`, and JS-imported element types the Rust side builds a fresh `[u32]` index buffer that JS reads and frees, with per-element `&T -> JsValue` (refcount bump for handle-shaped types). No `T: Clone` bound is required. The attribute can be set per-fn (`#[wasm_bindgen(slice_to_array)] fn ...`) or per-block on an `extern "C" { ... }` declaration to apply to every imported function in that block. `&[ExportedRustStruct]` remains unsupported (use owned `Vec<T>` for that). Has no effect on exported functions; default `&[T]` (typed-array view / memory borrow) and owned `Vec<T>` semantics are unchanged for callers that didn't opt in. See the [`slice_to_array` guide page](reference/attributes/on-js-imports/slice_to_array.html). [#&#8203;5145](https://github.com/wasm-bindgen/wasm-bindgen/pull/5145) - Added `js_sys::AggregateError` bindings (constructor, `errors` getter, and `new_with_message` / `new_with_options` overloads). `AggregateError` represents multiple unrelated errors wrapped in a single error, e.g. as thrown by `Promise.any` when all input promises reject, along with `js_sys::ErrorOptions`, accepted by built-in error constructors. `ErrorOptions::new(cause)` constructs an instance pre-populated with `cause`, and `get_cause` / `set_cause` provide typed access to the property. All standard error constructors that previously took only a `message` (`EvalError`, `RangeError`, `ReferenceError`, `SyntaxError`, `TypeError`, `URIError`, `WebAssembly.CompileError`, `WebAssembly.LinkError`, `WebAssembly.RuntimeError`) now expose a `new_with_options(message, &ErrorOptions)` overload, and `Error` gains `new_with_error_options(message, &ErrorOptions)` alongside the existing untyped `new_with_options`. `AggregateError::new_with_options` also takes `&ErrorOptions`. [#&#8203;5139](https://github.com/wasm-bindgen/wasm-bindgen/pull/5139) - Added inheritance for Rust-exported types: an exported struct may declare `#[wasm_bindgen(extends = Parent)]` to inherit from another exported `#[wasm_bindgen]` struct. The macro injects a hidden `parent: wasm_bindgen::Parent<Parent>` field (a refcounted cell around the parent value) and emits `class Child extends Parent` in the generated JS / `.d.ts`. The child gets an `AsRef<Parent<Parent>>` impl for the direct parent, and threads per-class pointer slots through the wasm ABI so that `instanceof Parent` is true and parent methods dispatch soundly via the JS prototype chain. From inside child methods, parent data is reached via `self.parent.borrow()` / `self.parent.borrow_mut()`. See the new [`extends` guide page](reference/attributes/on-rust-exports/extends.html). [#&#8203;5120](https://github.com/wasm-bindgen/wasm-bindgen/pull/5120) - Added `js_sys::FinalizationRegistry` bindings (constructor, `register`, `register_with_token`, and `unregister`). The cleanup callback parameter is typed as `&Function<fn(JsValue) -> Undefined>`, so closures created via `Closure::new` can be passed using `Function::from_closure` (for owned closures retained by JS) or `Function::closure_ref` (for borrowed scoped closures). Pairs with the existing `js_sys::WeakRef` bindings. [#&#8203;5140](https://github.com/wasm-bindgen/wasm-bindgen/pull/5140) - Added support for well-known symbols in `js_name`, `getter`, and `setter` via the explicit bracket-string form `"[Symbol.<name>]"`. This works for imported and exported methods, fields, getters, and setters. For example, `#[wasm_bindgen(js_name = "[Symbol.iterator]")]` on an exported method generates `[Symbol.iterator]() { ... }` on the generated JS class, and the same syntax works for `getter` / `setter` and for imported items. [#&#8203;4230](https://github.com/wasm-bindgen/wasm-bindgen/pull/4230) - Added level 2 bindings for `ViewTransition` to `web-sys`. [#&#8203;5138](https://github.com/wasm-bindgen/wasm-bindgen/pull/5138) - Add support for dynamic unions: a `#[wasm_bindgen]` enum that mixes string-literal variants with single-field tuple variants is now exported as an untagged TypeScript union and dispatched dynamically at the JS↔Rust boundary. The new enum-level `#[wasm_bindgen(fallback)]` attribute makes the last tuple variant an unconditional catch-all, supporting unions whose trailing variant has no runtime check (e.g., interface-only imports). String enums and dynamic unions now emit `export type` (was bare `type`) so the alias is a named export, and both honour the `private` flag to suppress the keyword. [#&#8203;4734](https://github.com/wasm-bindgen/wasm-bindgen/pull/4734) [#&#8203;2153](https://github.com/wasm-bindgen/wasm-bindgen/issues/2153) [#&#8203;2088](https://github.com/wasm-bindgen/wasm-bindgen/issues/2088) ##### Fixed - `From<Promise<T>> for JsFuture<T>` and `IntoFuture for Promise<T>` now accept any `T: FromWasmAbi` (rather than `T: JsGeneric`), letting imported `async fn`s return dynamic-union enums. - `TryFromJsValue` for C-style enums no longer accepts non-numeric values via JS unary `+` coercion. Previously calling `dyn_into::<MyEnum>()` on a string would silently coerce it via `+"foo"` (yielding `NaN`, then `NaN as u32 = 0`) and could match a discriminant by accident; the conversion now returns `None` for any value that is not a JS number. [#&#8203;4734](https://github.com/wasm-bindgen/wasm-bindgen/pull/4734) - Fix compilation failure with `no_std` + `release` [#&#8203;5134](https://github.com/wasm-bindgen/wasm-bindgen/pull/5134) - Raw identifiers (`r#name`) on enums, enum variants, extern types, statics, and `impl` blocks no longer leak the `r#` prefix into generated JS / TS output and shim names. The Rust-side identifier and the JS-side name are now tracked separately for enum variants, and all known identifier fallback paths apply `Ident::unraw()` so e.g. `pub enum r#Enum { r#A }` generates `Enum.A` instead of producing syntactically invalid JS. [#&#8203;4323](https://github.com/wasm-bindgen/wasm-bindgen/pull/4323) - Using the `-C panic=unwind` option when building for the bundler target would produce invalid JS. [#&#8203;5142](https://github.com/wasm-bindgen/wasm-bindgen/pull/5142) ##### Changed - `js_sys::DataView` now implements the `js_sys::TypedArray` trait. A `FIXME` notes that the trait should be renamed to `ArrayBufferView` in the next major release to better reflect the WebIDL spec name covering both `DataView` and the typed-array types. [#&#8203;5135](https://github.com/wasm-bindgen/wasm-bindgen/pull/5135) ### [`v0.2.120`](https://github.com/wasm-bindgen/wasm-bindgen/releases/tag/0.2.120) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.118...0.2.120) ##### Added - Added support for the `wasm64-unknown-unknown` target (memory64 / wasm64). `usize` / `isize` and raw pointers are now lowered through an `f64` JS number ABI on wasm64 (matching the existing convention used for `Option<u32>` etc. on wasm32), with the CLI inspecting the module's memory type to pick the right codegen path. Includes a dedicated `wasm64` CI job and test suite covering the new ABI paths. [#&#8203;5004](https://github.com/wasm-bindgen/wasm-bindgen/pull/5004) - Promise ergonomics: `Promise::all_tuple` and `Promise::all_settled_tuple` for heterogeneous concurrent awaits (arity 1..=8, destructure via `.into_tuple()`), and a new `wasm_bindgen::IntoJsGeneric` trait underpinning typed-`Array` inference (with codegen-emitted identity impls and a `#[wasm_bindgen(no_into_js_generic)]` opt-out for types like `JsClosure`). Also re-exports `JsGeneric` from the prelude. Typed collection on `js_sys::Array<T>` is exposed as the inherent constructor `Array::<T>::from_iter_typed` (and companion `extend_typed`), inferring `T` from the iterator item via `IntoJsGeneric`. The stable `FromIterator` / `Extend` impls on `Array` (= `Array<JsValue>`) bound by `AsRef<JsValue>` are preserved, so existing `.collect::<Array>()` call sites keep compiling unchanged. Fixes [#&#8203;5042](https://github.com/wasm-bindgen/wasm-bindgen/issues/5042). [#&#8203;5121](https://github.com/wasm-bindgen/wasm-bindgen/pull/5121), [#&#8203;5125](https://github.com/wasm-bindgen/wasm-bindgen/pull/5125) - Added `wasm_bindgen::instance()` to return the current `WebAssembly.Instance`. The generated JS glue retains the instantiated `WebAssembly.Instance`. [#&#8203;5118](https://github.com/wasm-bindgen/wasm-bindgen/pull/5118) - Added a `--cfg=wasm_bindgen_use_js_sys` opt-in that makes async macro codegen use `js_sys::futures` instead of `wasm_bindgen_futures`, dropping the need for `wasm-bindgen-futures` when the crate already depends on `js-sys`. A cfg is used rather than a Cargo feature so the choice stays scoped to the crate that opts in. [#&#8203;5112](https://github.com/wasm-bindgen/wasm-bindgen/pull/5112) [#&#8203;5127](https://github.com/wasm-bindgen/wasm-bindgen/pull/5127) ##### Changed - Simplified generated `web-sys` bindings by omitting redundant `#[wasm_bindgen]` attributes when they match wasm-bindgen defaults, including structural method annotations and matching `js_name` entries. The `#[wasm_bindgen]` attribute parser now also accepts string-literal forms for `extends`, `static_method_of`, and `vendor_prefix` (alongside the existing bare-path/ident syntax), and the generator emits these arguments along with `js_name` as string literals so `rustfmt` can format the generated `#[wasm_bindgen(...)]` attributes uniformly. [#&#8203;5122](https://github.com/wasm-bindgen/wasm-bindgen/pull/5122) ##### Fixed - Fixed namespaced export identifiers in generated JS/TS to use qualified names consistently, resolving order-dependent codegen issues across platforms. Also fixed `Vec<T>` types in TS signatures to resolve through the identifier map. [#&#8203;5106](https://github.com/wasm-bindgen/wasm-bindgen/pull/5106) - Fixed `wasm-bindgen-test-runner` treating ChromeDriver stderr warnings as startup failures on macOS, causing a restart loop until timeout. The runner no longer uses stderr output to determine if a driver has failed; instead a per-attempt timeout detects stuck drivers and retries on a new port. [#&#8203;5111](https://github.com/wasm-bindgen/wasm-bindgen/pull/5111) ### [`v0.2.118`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02118) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.117...0.2.118) ##### Added - Added `Error::stack_trace_limit()` and `Error::set_stack_trace_limit()` bindings to `js-sys` for the non-standard V8 `Error.stackTraceLimit` property. [#&#8203;5082](https://github.com/wasm-bindgen/wasm-bindgen/pull/5082) - Added support for multiple `#[wasm_bindgen(start)]` functions, which are chained together at initialization, as well as a new `#[wasm_bindgen(start, private)]` to register a start function without exporting it as a public export. [#&#8203;5081](https://github.com/wasm-bindgen/wasm-bindgen/pull/5081) - Reinitialization is no longer automatically applied when using `panic=unwind` and `--experimental-reset-state-function`, instead it is triggered by any use of the `handler::schedule_reinit()` function under `panic=unwind`, which is supported from within the `on_abort` handler for reinit workflows. Renamed `handler::reinit()` to `handler::schedule_reinit()` and removed the `set_on_reinit()` handler. The `__instance_terminated` address is now always a simple boolean (`0` = live, `1` = terminated). [#&#8203;5083](https://github.com/wasm-bindgen/wasm-bindgen/pull/5083) - `handler::schedule_reinit()` now works under `panic=abort` builds. Previously it was a no-op; it now sets the JS-side reinit flag and the next export call transparently creates a fresh `WebAssembly.Instance`. [#&#8203;5099](https://github.com/wasm-bindgen/wasm-bindgen/pull/5099) ##### Changed - MSRV bump from 1.71 to 1.76 for the CLI, and 1.82 to 1.86 for the API [#&#8203;5102](https://github.com/wasm-bindgen/wasm-bindgen/pull/5102) ##### Fixed - ES module `import` statements are now hoisted to the top of generated JS files, placed right after the `@ts-self-types` directive. This ensures valid ES module output since `import` declarations must precede other statements. [#&#8203;5103](https://github.com/wasm-bindgen/wasm-bindgen/pull/5103) - Fixed two CLI issues affecting WASM modules built by rustc 1.94+. First, a panic (`failed to find N in function table`) caused by lld emitting element segment offsets as `global.get $__table_base` or extended const expressions instead of plain `i32.const N` for large function tables; the fix adds a const-expression evaluator in `get_function_table_entry` and guards against integer underflow in multi-segment tables. Second, the descriptor interpreter now routes all global reads/writes through a single `globals` HashMap seeded from the module's own globals, and mirrors the module's actual linear memory rather than a fixed 32KB buffer, so the stack pointer's real value is valid without any override. This fixes panics like `failed to find 32752 in function table` caused by `GOT.func.internal.*` globals being misidentified as the stack pointer. [#&#8203;5076](https://github.com/wasm-bindgen/wasm-bindgen/issues/5076) [#&#8203;5080](https://github.com/wasm-bindgen/wasm-bindgen/issues/5080) [#&#8203;5093](https://github.com/wasm-bindgen/wasm-bindgen/issues/5093) [#&#8203;5095](https://github.com/wasm-bindgen/wasm-bindgen/pull/5095) ### [`v0.2.117`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02117) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.116...0.2.117) ##### Fixed - Fixed a regression introduced in [#&#8203;5026](https://github.com/wasm-bindgen/wasm-bindgen/issues/5026) where stable `web-sys` methods that accept a union type containing a `[WbgGeneric]` interface (e.g. `ImageBitmapSource`, which includes `VideoFrame`) incorrectly applied typed generics to all union expansions rather than only those whose argument type is itself `[WbgGeneric]`. In practice this caused `Window::create_image_bitmap_with_*` and the corresponding `WorkerGlobalScope` overloads to return `Promise<ImageBitmap>` instead of `Promise<JsValue>` for the stable (non-`VideoFrame`) call sites, breaking `JsFuture::from(promise).await?`. [#&#8203;5064](https://github.com/wasm-bindgen/wasm-bindgen/issues/5064) [#&#8203;5073](https://github.com/wasm-bindgen/wasm-bindgen/pull/5073) - Fixed handling logic for environment variable `WASM_BINDGEN_TEST_ADDRESS` in the test runner, when running tests in headless mode. [#&#8203;5087](https://github.com/wasm-bindgen/wasm-bindgen/pull/5087) ### [`v0.2.116`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02116) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.115...0.2.116) ##### Added - Added `js_sys::Float16Array` bindings, `DataView` float16 accessors using `f32`, and raw `[u16]` helper APIs for interoperability with binary16 representations such as `half::f16`. [#&#8203;5033](https://github.com/wasm-bindgen/wasm-bindgen/pull/5033) ##### Changed - Updated to Walrus 0.26.1 for deterministic type section ordering. [#&#8203;5069](https://github.com/wasm-bindgen/wasm-bindgen/pull/5069) - The `#[wasm_bindgen]` macro now emits `&mut (impl FnMut(...) + MaybeUnwindSafe)` / `&(impl Fn(...) + MaybeUnwindSafe)` for raw `&mut dyn FnMut` / `&dyn Fn` import arguments instead of a hidden generic parameter and where-clause. The generated signature is cleaner and the `MaybeUnwindSafe` bound is visible directly in the argument position. The ABI and wire format are unchanged. When building with `panic=unwind`, closures that capture non-`UnwindSafe` values (e.g. `&mut T`, `Cell<T>`) must wrap them in `AssertUnwindSafe` before capture; on all other targets `MaybeUnwindSafe` is a no-op blanket impl. [#&#8203;5056](https://github.com/wasm-bindgen/wasm-bindgen/pull/5056) ### [`v0.2.115`](https://github.com/wasm-bindgen/wasm-bindgen/blob/HEAD/CHANGELOG.md#02115) [Compare Source](https://github.com/wasm-bindgen/wasm-bindgen/compare/0.2.114...0.2.115) ##### Added - `console.debug/log/info/warn/error` output from user-spawned `Worker` and `SharedWorker` instances is now forwarded to the CLI test runner during headless browser tests, just like output from the main thread. Works for blob URL workers, module workers, URL-based workers (importScripts), nested workers, and shared workers (including logs emitted before the first port connection). Non-cloneable arguments are serialized via `String()` rather than crashing the worker. The `--nocapture` flag is respected. [#&#8203;5037](https://github.com/wasm-bindgen/wasm-bindgen/pull/5037) - `js_sys::Promise<T>` now implements `IntoFuture`, enabling direct `.await` on any JS promise without a wrapper type. The `wasm-bindgen-futures` implementation has been moved into `js-sys` behind an optional `futures` feature, which is activated automatically when `wasm-bindgen-futures` is a dependency. All existing `wasm_bindgen_futures::*` import paths continue to work unchanged via re-exports. `js_sys::futures` is also available directly for users who want `promise.await` without depending on `wasm-bindgen-futures`. [#&#8203;5049](https://github.com/wasm-bindgen/wasm-bindgen/pull/5049) - Added `--target emscripten` support, generating a `library_bindgen.js` file for consumption by Emscripten at link time. Includes support for futures, JS closures, and TypeScript output. A new Emscripten-specific test runner is also included, along with CI integration. [#&#8203;4443](https://github.com/wasm-bindgen/wasm-bindgen/pull/4443) - Added `VideoFrame`, `VideoColorSpace`, and related WebCodecs dictionaries/enums to `web-sys`. [#&#8203;5008](https://github.com/wasm-bindgen/wasm-bindgen/pull/5008) - Added `wasm_bindgen::handler` module with `set_on_abort` and `set_on_reinit` hooks for `panic=unwind` builds. `set_on_abort` registers a callback invoked after the instance is terminated (hard abort, OOM, stack overflow). `set_on_reinit` registers a callback invoked after `reinit()` resets the WebAssembly instance via `--experimental-reset-state-function`. Handlers are stored as Wasm indirect-function-table indices so dispatch is safe even when linear memory is corrupt. ##### Changed - Replaced per-closure generic destructors with a single `__wbindgen_destroy_closure` export. [#&#8203;5019](https://github.com/wasm-bindgen/wasm-bindgen/pull/5019) - Refactored the headless browser test runner logging pipeline for dramatically improved performance (>400x faster on Chrome, >10x on Firefox, \~5x on Safari). Switched to incremental DOM scraping with `textContent.slice(offset)`, append-only output semantics, unified log capture across all log levels on failure, and browser-specific invisible-div optimizations (`display:none` for Chrome/Firefox, `visibility:hidden` for Safari). [#&#8203;4960](https://github.com/wasm-bindgen/wasm-bindgen/pull/4960) - TTY-gated status/clear output in the test runner shell to avoid `\r` control-character artifacts in non-interactive (CI) environments. [#&#8203;4960](https://github.com/wasm-bindgen/wasm-bindgen/pull/4960) - Added `bench_console_log_10mb` benchmark alongside the existing 1MB benchmark for the headless test runner. The main branch cannot complete this benchmark at any volume. [#&#8203;4960](https://github.com/wasm-bindgen/wasm-bindgen/pull/4960) - Updated to Walrus 0.26 [#&#8203;5057](https://github.com/wasm-bindgen/walrus/pull/5057) ##### Fixed - Fixed argument order when calling multi-parameter functions in the `wasm-bindgen` interpreter by reversing the args collected from the stack. [#&#8203;5047](https://github.com/wasm-bindgen/wasm-bindgen/pull/5047) - Added support for per-operation `[WbgGeneric]` in WebIDL, restoring typed generic return types (e.g. `Promise<ImageBitmap>`) for `createImageBitmap` on `Window` and `WorkerGlobalScope` that were lost after the `VideoFrame` stabilization. [#&#8203;5026](https://github.com/wasm-bindgen/wasm-bindgen/pull/5026) - Fixed missing `#[cfg(feature = "...")]` gates on deprecated dictionary builder methods and getters for union-typed fields (e.g. `{Open,Save,Directory}FilePickerOptions::start_in()`), and fixed per-setter doc requirements to list each setter's own required features. [#&#8203;5039](https://github.com/wasm-bindgen/wasm-bindgen/pull/5039) - Fixed `JsOption::new()` to use `undefined` instead of `null`, to be compatible with `Option::None` and JS default parameters. [#&#8203;5023](https://github.com/wasm-bindgen/wasm-bindgen/pull/5023) - Fixed unsound `unsafe` transmutes in `JsOption<T>::wrap`, `as_option`, and `into_option` by replacing `transmute_copy` with `unchecked_into()`. Also tightened the `JsGeneric` trait bound and `JsOption<T>` impl block to require `T: JsGeneric` (which implies `JsCast`), preventing use with arbitrary non-JS types. [#&#8203;5030](https://github.com/wasm-bindgen/wasm-bindgen/pull/5030) - Fixed headless test runner emitting `\r` carriage-return sequences in non-TTY environments, which polluted captured logs in CI and complicated output-matching tests. [#&#8203;4960](https://github.com/wasm-bindgen/wasm-bindgen/pull/4960) - Fixed headless test runner printing incomplete and out-of-order log output on test failures by merging all five log levels into a single unified output div. [#&#8203;4960](https://github.com/wasm-bindgen/wasm-bindgen/pull/4960) - Fixed large test outputs (10MB+) causing oversized WebDriver responses that were either extremely slow or crashed completely, by switching to incremental streaming output collection. [#&#8203;4960](https://github.com/wasm-bindgen/wasm-bindgen/pull/4960) - Fixed a duplciate wasm export in node ESM atomics, when compiled in debug mode [#&#8203;5028](https://github.com/wasm-bindgen/wasm-bindgen/pull/5028) - Fixed a type inference regression (`E0283: type annotations needed`) introduced in v0.2.109 where the stable `FromIterator` and `Extend` impls on `js_sys::Array` were changed from `A: AsRef<JsValue>` to `A: AsRef<T>`. Because `#[wasm_bindgen]` generates multiple `AsRef` impls per type, the compiler could not uniquely resolve `T`, breaking code like `Array::from_iter([my_wasm_value])` without explicit annotations. The stable impls are restored to `A: AsRef<JsValue>` (returning `Array<JsValue>`); the generic `A: AsRef<T>` forms remain available under `js_sys_unstable_apis`. [#&#8203;5052](https://github.com/wasm-bindgen/wasm-bindgen/pull/5052) - Fixed `skip_typescript` not being respected when using `reexport`, causing TypeScript definitions to be incorrectly emitted for re-exported items marked with `#[wasm_bindgen(skip_typescript)]`. [#&#8203;5051](https://github.com/wasm-bindgen/wasm-bindgen/pull/5051) ##### Removed </details> <details> <summary>webpack/webpack (webpack)</summary> ### [`v5.112.2`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51122) [Compare Source](https://github.com/webpack/webpack/compare/v5.112.1...v5.112.2) ##### Patch Changes - Reduce repeated scans when concatenating imported modules. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;22865](https://github.com/webpack/webpack/pull/22865)) - Avoid allocating CSS module sets for single-group chunks. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;22866](https://github.com/webpack/webpack/pull/22866)) - Return the value of every module type loaded with `importModule()`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22869](https://github.com/webpack/webpack/pull/22869)) ### [`v5.112.1`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51121) [Compare Source](https://github.com/webpack/webpack/compare/v5.112.0...v5.112.1) ##### Patch Changes - Rebuild a lazy barrel in watch when what it defers changes, and keep the imports and re-exports it still runs. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22699](https://github.com/webpack/webpack/pull/22699)) - Rebuild under `cacheUnaffected` a module whose re-export target goes or returns. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22749](https://github.com/webpack/webpack/pull/22749)) - Fix "Self-reference dependency has unused export name" for CommonJS namespace re-exports. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22791](https://github.com/webpack/webpack/pull/22791)) - Fix `exportType: "style"` CSS modules throwing outside the runtime chunk. (by [@&#8203;lazerg](https://github.com/lazerg) in [#&#8203;22833](https://github.com/webpack/webpack/pull/22833)) - Fix crash when a CSS module with `exportType: "style"` imports an ignored stylesheet. (by [@&#8203;codeXsidd](https://github.com/codeXsidd) in [#&#8203;22846](https://github.com/webpack/webpack/pull/22846)) - Keep empty process environment variables that `.env` files don't define in `DotenvPlugin`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22794](https://github.com/webpack/webpack/pull/22794)) - Rehash an ESM entry chunk when a chunk it imports by file name changes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22804](https://github.com/webpack/webpack/pull/22804)) - Handle a NUL inside an HTML CDATA section the way the parsing spec does. (by [@&#8203;dependabot](https://github.com/apps/dependabot) in [#&#8203;22811](https://github.com/webpack/webpack/pull/22811)) - Keep module exports live across chunks, runtimes, HMR and eval, sparing globals. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22733](https://github.com/webpack/webpack/pull/22733)) - Await asynchronous modules that `ProvidePlugin` injects into ES modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22728](https://github.com/webpack/webpack/pull/22728)) - Keep a resolve that ends after the compiler closed from throwing. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22795](https://github.com/webpack/webpack/pull/22795)) - Preserve string names passed to SharedWorker constructors. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22770](https://github.com/webpack/webpack/pull/22770)) - Preserve string contents when extracting source map comments. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22768](https://github.com/webpack/webpack/pull/22768)) - Scope strict-mode, async and generator block function declarations to their block. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22800](https://github.com/webpack/webpack/pull/22800)) - Preserve raw dotenv values when reusing cached environment files. (by [@&#8203;Eshiv-Pandey](https://github.com/Eshiv-Pandey) in [#&#8203;22787](https://github.com/webpack/webpack/pull/22787)) - Preserve assigned or patched built-ins, conversions and pattern targets. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22761](https://github.com/webpack/webpack/pull/22761)) - Keep globals a `globalThis` write replaces, and `slice` on a patched array. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22862](https://github.com/webpack/webpack/pull/22862)) - Skip HTML script tags for shared chunks that emit no JavaScript. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22779](https://github.com/webpack/webpack/pull/22779)) - Keep the digits Firefox lays out a minified CSS percentage with. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22718](https://github.com/webpack/webpack/pull/22718)) - Reject a second `srcset` descriptor after a `0x` density descriptor. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22741](https://github.com/webpack/webpack/pull/22741)) - Minify JavaScript faster, folding string methods on constants and `x -= 1`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22823](https://github.com/webpack/webpack/pull/22823)) - Shorten minified JavaScript, and keep it running like its source. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22717](https://github.com/webpack/webpack/pull/22717)) - Drop more unused functions, arguments, calls, global reads and variable copies when minifying JavaScript. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22789](https://github.com/webpack/webpack/pull/22789)) - Minify JavaScript smaller where swc does, and fold a function's `length` right. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22826](https://github.com/webpack/webpack/pull/22826)) - Reduce JavaScript output size where oxc or swc produce smaller output. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22829](https://github.com/webpack/webpack/pull/22829)) - Update watchpack to 2.6.3 and rebuild on a `node_modules` created mid-build. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22743](https://github.com/webpack/webpack/pull/22743)) - Support `concatenateModules` with `cacheUnaffected`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22746](https://github.com/webpack/webpack/pull/22746)) - Update schema-utils to 4.8.1. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22774](https://github.com/webpack/webpack/pull/22774)) - Keep CSS fallbacks, vendor overrides, `oklch()` hues and HTML elements. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22753](https://github.com/webpack/webpack/pull/22753)) - Validate `CleanPlugin` and `DotenvPlugin` options with a precompiled check, so valid options no longer compile their schema at startup. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22758](https://github.com/webpack/webpack/pull/22758)) - Speed up startup and CSS minification, sharing the compile cache with workers. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;22706](https://github.com/webpack/webpack/pull/22706)) - Use precise, generic types for modules, parsers, generators, stats and loaders. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22731](https://github.com/webpack/webpack/pull/22731)) ### [`v5.112.0`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51120) [Compare Source](https://github.com/webpack/webpack/compare/v5.111.1...v5.112.0) ##### Minor Changes - Apply `plugins` set on a multi-configuration array to the `MultiCompiler`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22702](https://github.com/webpack/webpack/pull/22702)) - Add `optimization.minimize.css.dropOverriddenDeclarations`, dropping a declaration a later one overrides where no target is named. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22175](https://github.com/webpack/webpack/pull/22175)) - Export more plugins under their scope, move eleven loose exports under theirs, deprecate the old, and expose `template.DependencyTemplate`, `module.NullFactory` and `util.makeSerializable`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22261](https://github.com/webpack/webpack/pull/22261)) - Let `util.makeSerializable` take several requests, current one first. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22340](https://github.com/webpack/webpack/pull/22340)) - Emit the source map `scopes` field, so a debugger resolves imported ESM bindings by name. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21999](https://github.com/webpack/webpack/pull/21999)) - Add `library.entryExports: "all"` to expose the exports of every entry module. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22235](https://github.com/webpack/webpack/pull/22235)) - Recognize a required `const` binding assigned to `exports` as a re-export. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22276](https://github.com/webpack/webpack/pull/22276)) - Accept glob patterns in more path, module and file filter options. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22422](https://github.com/webpack/webpack/pull/22422)) - Bundle a run of inline `<script>` tags into one chunk the page can inline. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22188](https://github.com/webpack/webpack/pull/22188)) - Add `module.parser.javascript.topLevelThis` for classic-script `this` semantics. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22193](https://github.com/webpack/webpack/pull/22193)) - Add `module.parser.html.chunkName` and a `webpackChunkName` comment for tags. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22200](https://github.com/webpack/webpack/pull/22200)) - Add `include`/`exclude` version and request filters to shared modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22297](https://github.com/webpack/webpack/pull/22297)) - Keep module side-effect information in ESM output as PURE annotations. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21789](https://github.com/webpack/webpack/pull/21789)) - Add `optimization.splitChunks.dedupDepth` to discover chunk intersections. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22240](https://github.com/webpack/webpack/pull/22240)) - Add `optimization.minimizeOptions.json`, on by default with `futureDefaults`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22286](https://github.com/webpack/webpack/pull/22286)) - Add `SSRManifestPlugin` and fix server-rendered CSS collection and adoption. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21913](https://github.com/webpack/webpack/pull/21913)) - Add an `ignore` hook to `output.copy` and keep unfollowed `from` symlinks. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22216](https://github.com/webpack/webpack/pull/22216)) - Add `optimization.minimize.css.convertApproximateColors`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22157](https://github.com/webpack/webpack/pull/22157)) - Add XML parsing and SVG/XML minification with data URLs and attribute sorting. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22269](https://github.com/webpack/webpack/pull/22269)) - Extract CSS/HTML license comments like JS and safely shorten CSS gradients. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22408](https://github.com/webpack/webpack/pull/22408)) - Resolve an async `DefinePlugin.runtimeValue` over an async `beforeParse` hook. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22210](https://github.com/webpack/webpack/pull/22210)) - Add CSS `customMedia`/`customSelectors` minimize options; resolve chained names. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22360](https://github.com/webpack/webpack/pull/22360)) - Rename the `Harmony*` names to `ESM*` and deprecate the old spellings. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22283](https://github.com/webpack/webpack/pull/22283)) - Reduce `css.syntax`/`html.syntax` to `parser`, `printer`, `SourceProcessor` with one node path. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22233](https://github.com/webpack/webpack/pull/22233)) - Add a JavaScript `SyntaxTree` read like the CSS one, and `toEstreeObject`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22608](https://github.com/webpack/webpack/pull/22608)) - Fix minified code that threw, and add `pure_conversions` and `pure_heritage`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22473](https://github.com/webpack/webpack/pull/22473)) - Shorten more CSS values and selectors, fold longhands, order declarations and gather layer blocks. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22442](https://github.com/webpack/webpack/pull/22442)) - Add `optimization.minimize.css.charset`; `false` drops `@charset` for UTF-8 CSS. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22632](https://github.com/webpack/webpack/pull/22632)) ##### Patch Changes - Join rules a gathered `@layer` leaves adjacent, and an at-rule with a later one (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22204](https://github.com/webpack/webpack/pull/22204)) stating the same condition; read what a condition declares. - Read escaped CSS names and functions as spelled, and minify them unescaped. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22262](https://github.com/webpack/webpack/pull/22262)) - Minify JavaScript, CSS and HTML assets whose names carry a `#fragment`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22277](https://github.com/webpack/webpack/pull/22277)) - Require `minimizer-webpack-plugin` 5.12, so inline scripts in HTML minify again. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22296](https://github.com/webpack/webpack/pull/22296)) - Minify the attributes of an HTML tag without rewriting the template in it. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22166](https://github.com/webpack/webpack/pull/22166)) - Order joined at-rule selector lists and gather a repeated large `@layer` block. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22224](https://github.com/webpack/webpack/pull/22224)) - Preserve case-sensitive template identifiers when minifying HTML tag attributes. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22177](https://github.com/webpack/webpack/pull/22177)) - Match Acorn's strict directives, Unicode identifiers and expression validation. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22185](https://github.com/webpack/webpack/pull/22185)) - Skip concatenating modules when `optimization.providedExports` is disabled. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22410](https://github.com/webpack/webpack/pull/22410)) - Join rules a nesting lowering or duplicate drop left for a second pass. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22268](https://github.com/webpack/webpack/pull/22268)) - Write U+00A0 in a minified HTML attribute as the character, not `&nbsp;`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22208](https://github.com/webpack/webpack/pull/22208)) - Escape a foreign `<script>` or `<style>` body, which is character data. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22233](https://github.com/webpack/webpack/pull/22233)) - Name the runtime module whose generation fails while hashing. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22203](https://github.com/webpack/webpack/pull/22203)) - Rebuild a module in watch when its missing unused dependencies swap. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22693](https://github.com/webpack/webpack/pull/22693)) - Rebuild in watch mode when a file is deleted while a build is running. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22650](https://github.com/webpack/webpack/pull/22650)) - Take out the declaration a lowered shorthand writes over, which its source spelling made look like a fallback. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22270](https://github.com/webpack/webpack/pull/22270)) - Read a foreign `<script>` or `<style>` body as character data, not as raw text. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22258](https://github.com/webpack/webpack/pull/22258)) - Keep an inline `<style>` body as written when rebuilding a page webpack emitted. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22265](https://github.com/webpack/webpack/pull/22265)) - Fix minified HTML for `style` spellings, CSS quotes, `<noscript>` and a BOM. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22370](https://github.com/webpack/webpack/pull/22370)) - Record a build dependency required through a spread on Bun. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22230](https://github.com/webpack/webpack/pull/22230)) - Write a nested selector opening on a combinator against its parent the way the printer writes one. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22271](https://github.com/webpack/webpack/pull/22271)) - Fix missing async stylesheets with a shared runtime. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22659](https://github.com/webpack/webpack/pull/22659)) - Support deferred imports introduced by hot updates. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22668](https://github.com/webpack/webpack/pull/22668)) - Fix trailing commas in `require.resolve()` and `require.resolveWeak()` calls. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22658](https://github.com/webpack/webpack/pull/22658)) - Keep regular expressions, functions and plugins distinct in resolver caches. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22667](https://github.com/webpack/webpack/pull/22667)) - Order the list a lowered nested selector lands in on what is written, not on what was. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22287](https://github.com/webpack/webpack/pull/22287)) - Hoist a vendor-prefixed nested rule for a target that reads no nesting. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22308](https://github.com/webpack/webpack/pull/22308)) - Name a hoisted nested rule in the dark-scheme copy it writes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22318](https://github.com/webpack/webpack/pull/22318)) - Minify data: URL payloads in HTML attributes and `new URL`, and web manifests. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22300](https://github.com/webpack/webpack/pull/22300)) - fold a fallback's colors over the author's arguments, and print with (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22314](https://github.com/webpack/webpack/pull/22314)) `recurseBlocks: false` rather than throwing - Read a regular expression repeating a capture group name in linear time. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22187](https://github.com/webpack/webpack/pull/22187)) - Make lazy barrels defer import declarations and keep no deferral across compilations. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22359](https://github.com/webpack/webpack/pull/22359)) - Invalidate unaffected caches when connection activity or async status changes. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22431](https://github.com/webpack/webpack/pull/22431)) - Order concatenated re-exports deterministically when their source order ties. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22697](https://github.com/webpack/webpack/pull/22697)) - Regenerate a module's exports when a require() cycle forms or breaks around it. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22644](https://github.com/webpack/webpack/pull/22644)) - Recompute re-exports, code and warnings when a module goes missing or returns. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22432](https://github.com/webpack/webpack/pull/22432)) - Preserve loader resolution dependencies across cached rebuilds. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22430](https://github.com/webpack/webpack/pull/22430)) - Read unwatched changes afresh and wait for restarted watch compilers to finish. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22646](https://github.com/webpack/webpack/pull/22646)) - Parse loader output for `.wasm` as JavaScript when async wasm is auto-enabled. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22556](https://github.com/webpack/webpack/pull/22556)) - Remove modules an async chunk inherits from a named parent chunk grown later. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22555](https://github.com/webpack/webpack/pull/22555)) - Fix JavaScript minifier crashes, altered behavior, lost comments, unparsable output and null source map sources, including parameter aliases, ESTree trees and preserved names, and stop it writing into the caller's parse options. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22352](https://github.com/webpack/webpack/pull/22352)) - Preserve the source phase of dynamic WebAssembly import contexts. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22604](https://github.com/webpack/webpack/pull/22604)) - Await every async entry before resolving an ESM library import. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22617](https://github.com/webpack/webpack/pull/22617)) - Keep unknown `import.meta` properties per module, alike for aliases and direct use. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22618](https://github.com/webpack/webpack/pull/22618)) - Return WebAssembly modules directly from eager and weak source imports. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22606](https://github.com/webpack/webpack/pull/22606)) - Handle missing ESM hot update manifests in Node.js without failing HMR checks. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22613](https://github.com/webpack/webpack/pull/22613)) - Speed up JavaScript parsing: comment lookup, the tokenizer and the grammar. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22179](https://github.com/webpack/webpack/pull/22179)) - Name a core module external by its key whichever spelling the code uses. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22565](https://github.com/webpack/webpack/pull/22565)) - Prefix and drop 2009 flexbox names, keeping them where a box lays out by them. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22320](https://github.com/webpack/webpack/pull/22320)) - Keep `initial` where Gecko or WebKit reads the property's keyword apart. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22176](https://github.com/webpack/webpack/pull/22176)) - Fold `calc()` as lightningcss does, keeping it where a bare value is refused. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22205](https://github.com/webpack/webpack/pull/22205)) - Keep a `color-mix()` whose hue rests on a gray's conversion residue. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22198](https://github.com/webpack/webpack/pull/22198)) - Keep a shorthand's initial keyword where it parts two keywords of another slot. (by [@&#8203;dependabot](https://github.com/apps/dependabot) in [#&#8203;22518](https://github.com/webpack/webpack/pull/22518)) - Group `lib/` and `lib/dependencies/` sources into directories. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22118](https://github.com/webpack/webpack/pull/22118)) - Treat a browserslist target given at a bare major version (e.g. `safari 10`) as `<major>.0` when a feature's first supported version is a `[major, minor]` pair, so it is no longer reported as unsupported. (by [@&#8203;Eshiv-Pandey](https://github.com/Eshiv-Pandey) in [#&#8203;22280](https://github.com/webpack/webpack/pull/22280)) - Keep the last HMR update with `output.clean`; stop rechecking removed files. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22339](https://github.com/webpack/webpack/pull/22339)) - Read and print a CSS backslash as the spec does, and a NUL as U+FFFD. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22201](https://github.com/webpack/webpack/pull/22201)) - Make minified CSS and HTML stable on a second pass, even for truncated input. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22290](https://github.com/webpack/webpack/pull/22290)) - Minify a merged `<style>` run as one sheet, closing each where its input ended. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22302](https://github.com/webpack/webpack/pull/22302)) - Minify JavaScript with webpack's printer under `futureDefaults`, `terser` otherwise. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22217](https://github.com/webpack/webpack/pull/22217)) - Preserve `wrappedContextRegExp` flags when rebuilding context request matchers. (by [@&#8203;Eshiv-Pandey](https://github.com/Eshiv-Pandey) in [#&#8203;22303](https://github.com/webpack/webpack/pull/22303)) - Minify CSS `@supports`, `@import` and `@custom-media` conditions, and exponent numbers. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22347](https://github.com/webpack/webpack/pull/22347)) - Fold unitless `hsl()`/`hwb()` channels, and only where the separators are valid. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22242](https://github.com/webpack/webpack/pull/22242)) - Split `@value` imports on the `from` keyword, not a substring in the path. (by [@&#8203;Eshiv-Pandey](https://github.com/Eshiv-Pandey) in [#&#8203;22306](https://github.com/webpack/webpack/pull/22306)) - Destructure a dotted `DefinePlugin` key whose value is falsy or a runtimeValue. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22215](https://github.com/webpack/webpack/pull/22215)) - Make `Stats.hasErrors()` read errors through the `processErrors` hook (via `getErrors()`), matching `hasWarnings()`, so a plugin that filters errors out of the hook is no longer contradicted by `hasErrors()`. (by [@&#8203;Eshiv-Pandey](https://github.com/Eshiv-Pandey) in [#&#8203;22281](https://github.com/webpack/webpack/pull/22281)) - Allow wrapping an external concatenated module, now asked of the module itself, and re-exporting a JSON or asset `default` as a namespace object. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22226](https://github.com/webpack/webpack/pull/22226)) - Match `urlHints` rules written with `and`, `or`, `not` and `glob` conditions; profile hook map taps, such as resolver and parser hooks, in `ProfilingPlugin`; report `import.meta` option errors inside `require.ensure` callbacks, not crash; and replace `any`, `object` and `Function` with precise types in the type definitions. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22681](https://github.com/webpack/webpack/pull/22681)) - Reduce CSS and HTML build time and memory allocation. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22135](https://github.com/webpack/webpack/pull/22135)) - Reuse free names instead of re-parsing modules for the entry IIFE rename. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22206](https://github.com/webpack/webpack/pull/22206)) - Release each module's ast once scope-analysed, and encode each export path once. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22241](https://github.com/webpack/webpack/pull/22241)) - Export a module library entry's default expression as its own binding, and keep (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22227](https://github.com/webpack/webpack/pull/22227)) the export helpers where the entry is not inlined. - Give a wrapped concatenated body the same function header as a module factory. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22254](https://github.com/webpack/webpack/pull/22254)) - Skip reading every asset when no content hash is named. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22256](https://github.com/webpack/webpack/pull/22256)) - Cut graph, cached set, lazy barrel and ESM import memory and allocations. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22289](https://github.com/webpack/webpack/pull/22289)) - Stop a module source from being held as both a string and a buffer. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22294](https://github.com/webpack/webpack/pull/22294)) - Read the browserslist data and options schema only when a build needs them. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22324](https://github.com/webpack/webpack/pull/22324)) - Release the eval devtool's cached module sources after wrapping them. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22358](https://github.com/webpack/webpack/pull/22358)) - Release the rendered module sources after emitting the chunks. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22365](https://github.com/webpack/webpack/pull/22365)) - Cut the peak memory and time of minifying through webpack's printer. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22368](https://github.com/webpack/webpack/pull/22368)) - Shrink minified JS: unwrap IIFEs, fold calls, drop dead code, split arrays. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22393](https://github.com/webpack/webpack/pull/22393)) - Cut JavaScript minifier time and memory; keep token positions in large inputs. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22329](https://github.com/webpack/webpack/pull/22329)) - Keep the `calc()` around a `steps()` count `jump-none` would reject bare. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22168](https://github.com/webpack/webpack/pull/22168)) - Split the CSS syntax module into a parser file and a printer file. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22222](https://github.com/webpack/webpack/pull/22222)) - Update enhanced-resolve to 5.26.0. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22358](https://github.com/webpack/webpack/pull/22358)) - Update watchpack to 2.6.1. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22670](https://github.com/webpack/webpack/pull/22670)) - Split the HTML syntax module into a parser file and a printer file. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22223](https://github.com/webpack/webpack/pull/22223)) - Rename classes in `lib/` so each says what it does and no two share a name. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22361](https://github.com/webpack/webpack/pull/22361)) - Keep the remote fallback index aligned with registered container externals when an `internal ` external precedes a real one. (by [@&#8203;Eshiv-Pandey](https://github.com/Eshiv-Pandey) in [#&#8203;22362](https://github.com/webpack/webpack/pull/22362)) - Stop a minified inlined chunk leaving a doubled `;` in its `<script>`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22370](https://github.com/webpack/webpack/pull/22370)) - Stop `mergeDistantRules` mangling rules or reordering `all`, and merge more. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22370](https://github.com/webpack/webpack/pull/22370)) - Minify by parsing with webpack's own parser rather than terser's. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22397](https://github.com/webpack/webpack/pull/22397)) - Read JavaScript with webpack's parser alone when minifying, refusing early errors. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22397](https://github.com/webpack/webpack/pull/22397)) - Parse an `assert(...)` call after an import with no semicolon, and a regular expression after `yield` in a generator method. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22406](https://github.com/webpack/webpack/pull/22406)) - Keep the private names a direct `eval` reads when mangling. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22412](https://github.com/webpack/webpack/pull/22412)) - Keep a class dropped for its effects where they read a private name it declares. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22421](https://github.com/webpack/webpack/pull/22421)) - Parenthesize the right side of a private `in`, a `yield`, `await`, private `in` or optional chain tagging a template, and a `let` or `async` starting a statement or loop head, where the minifier printed code that no longer parsed or read otherwise. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22437](https://github.com/webpack/webpack/pull/22437)) - Keep a name a parameter list or catch parameter reads from resolving to what the function body or catch block declares, which the minifier renamed or dropped as unused. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22439](https://github.com/webpack/webpack/pull/22439)) - Scope and export a CSS Modules `@value` the same way whether local or imported. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22443](https://github.com/webpack/webpack/pull/22443)) - Keep CSS `border: none` and gradient fallbacks for units a target cannot read. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22567](https://github.com/webpack/webpack/pull/22567)) - Keep minified CSS safe for older browsers; drop dead fallbacks and overrides. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22696](https://github.com/webpack/webpack/pull/22696)) - Keep CSS rules apart from a neighbor whose selector no browser parses. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22634](https://github.com/webpack/webpack/pull/22634)) - Keep an `:nth-*()` argument with a space after its sign as written. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22700](https://github.com/webpack/webpack/pull/22700)) - Keep minified CSS readable by browsers the compat data does not cover. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22701](https://github.com/webpack/webpack/pull/22701)) - Keep a module its chunk still needs after `compilation.rebuildModule()`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22705](https://github.com/webpack/webpack/pull/22705)) - Keep a CSS rule nested under a selector opening on a combinator when lowering. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22707](https://github.com/webpack/webpack/pull/22707)) - Use module paths for webpack's built-in minimizers so parallel minification can load them directly in workers instead of serializing their function sources. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;22309](https://github.com/webpack/webpack/pull/22309)) - Keep stats from an earlier build readable after a later build no longer has one of their modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22695](https://github.com/webpack/webpack/pull/22695)) ### [`v5.111.1`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51111) [Compare Source](https://github.com/webpack/webpack/compare/v5.111.0...v5.111.1) ##### Patch Changes - Throw on a write to an imported binding without losing concatenation. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22141](https://github.com/webpack/webpack/pull/22141)) - Keep the `</html>` a page was written with, whatever opened the element. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22103](https://github.com/webpack/webpack/pull/22103)) - Look an attribute up by what its value decodes to, not how it was spelled. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22107](https://github.com/webpack/webpack/pull/22107)) - Minify HTML by what a value says rather than how it was spelled. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22154](https://github.com/webpack/webpack/pull/22154)) - Follow HTML template form and frameset rules during tree construction. (by [@&#8203;dependabot](https://github.com/apps/dependabot) in [#&#8203;22129](https://github.com/webpack/webpack/pull/22129)) - Keep the whitespace `calc()` needs around `+` and `-` in a custom property. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22150](https://github.com/webpack/webpack/pull/22150)) - Keep an attribute's delimiter and spell its value back where quoting is frozen. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22119](https://github.com/webpack/webpack/pull/22119)) - Rewrite an attribute value the source spelled with character references. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22110](https://github.com/webpack/webpack/pull/22110)) - Unquote an HTML attribute value carrying a vertical tab. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22162](https://github.com/webpack/webpack/pull/22162)) - Keep a shadow's spread and canonicalize a merged selector list. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22101](https://github.com/webpack/webpack/pull/22101)) - Leave out an implied tag and merge adjacent runs on the first pass. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22121](https://github.com/webpack/webpack/pull/22121)) - Minify in one pass what a second pass of the CSS minifier used to find. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22106](https://github.com/webpack/webpack/pull/22106)) - Cover the CSS lookup tables no stylesheet in the corpus reaches. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22126](https://github.com/webpack/webpack/pull/22126)) - Keep `initial` where an engine reads the property's initial keyword apart. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22128](https://github.com/webpack/webpack/pull/22128)) - Join the CSS rules a cut leaves adjacent, and keep a value an escape ate. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22108](https://github.com/webpack/webpack/pull/22108)) - Drop the dead CSS a cut leaves, and join more of the blocks that print alike. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22111](https://github.com/webpack/webpack/pull/22111)) - Run the printer equivalence suite against Firefox as well as Chrome. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22151](https://github.com/webpack/webpack/pull/22151)) - Finish in one CSS pass the joins, drops and collapses left to a second. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22117](https://github.com/webpack/webpack/pull/22117)) - Move the context module sources into `lib/context/`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22115](https://github.com/webpack/webpack/pull/22115)) - Declare loader context types in JSDoc instead of hand-written `.d.ts` files. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22116](https://github.com/webpack/webpack/pull/22116)) - Emit a failing module's stack relative, and name what a tap failed with. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22122](https://github.com/webpack/webpack/pull/22122)) - Finish in one CSS pass the drops, layer gathers and joins left to a second. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22120](https://github.com/webpack/webpack/pull/22120)) - Speed up CSS parsing by stepping over dropped selector preludes in bytes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22142](https://github.com/webpack/webpack/pull/22142)) - Record hoisted, module and block declarations while parsing, not by re-walking. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22147](https://github.com/webpack/webpack/pull/22147)) - Fold more enumerated attribute values and drop those naming no keyword. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22148](https://github.com/webpack/webpack/pull/22148)) - Halve the CSS minifier's browser-version tables by narrowing their element type. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22140](https://github.com/webpack/webpack/pull/22140)) - Make each `optimization.minimize.css` switch govern its own rewrite alone. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22140](https://github.com/webpack/webpack/pull/22140)) - Join the rules a top-level `@layer` gather leaves meeting at the seam. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22140](https://github.com/webpack/webpack/pull/22140)) - Gather a CSS layer past a rule that writes only a different one. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22154](https://github.com/webpack/webpack/pull/22154)) - Order HTML attributes by what reaches the output, and read values decoded. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22146](https://github.com/webpack/webpack/pull/22146)) - Drop a fallback declaration every `browserslist` target reads past. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22158](https://github.com/webpack/webpack/pull/22158)) - Fix module library exports lost under cache or missing behind a re-export. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22114](https://github.com/webpack/webpack/pull/22114)) ### [`v5.111.0`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51110) [Compare Source](https://github.com/webpack/webpack/compare/v5.110.3...v5.111.0) ##### Minor Changes - Enable `output.module` by default with `futureDefaults` on ESM-capable targets. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22088](https://github.com/webpack/webpack/pull/22088)) - Remove `experiments.outputModule`, set `output.module` to emit ESM instead. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22011](https://github.com/webpack/webpack/pull/22011)) - Add `output.copy` to copy files and directories into the output directory. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21938](https://github.com/webpack/webpack/pull/21938)) - Accept a file URL in any spelling Node reads where an absolute path is taken. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22012](https://github.com/webpack/webpack/pull/22012)) - Minify inline CSS and JSON via `renderEmbeddedSource`, exporting webpack's own. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21993](https://github.com/webpack/webpack/pull/21993)) - Export `cssMinify` and `htmlMinify` on `css.syntax` and `html.syntax`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21953](https://github.com/webpack/webpack/pull/21953)) - Make `processResult` async and let a tap rename the asset it rewrote. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21854](https://github.com/webpack/webpack/pull/21854)) - Lower a CSS spelling a target cannot read and write a color fallback before one. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21926](https://github.com/webpack/webpack/pull/21926)) - Allow optional filesystem cache build dependencies. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;21849](https://github.com/webpack/webpack/pull/21849)) - Add `output.environment.topLevelAwait` and await every async ESM entry. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21915](https://github.com/webpack/webpack/pull/21915)) - Add `unusedSymbols` and `pseudoClasses`, and evaluate a CSS color function. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21927](https://github.com/webpack/webpack/pull/21927)) - Drop an implied shorthand slot, fold a math function, tighten color conversion. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21929](https://github.com/webpack/webpack/pull/21929)) - Add `module.parser.javascript.specNamespaceObject` for spec namespace objects. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22049](https://github.com/webpack/webpack/pull/22049)) - Drop what is already said or only a gone engine reads, add `lowerUnsupported`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21931](https://github.com/webpack/webpack/pull/21931)) - Add `normalizeUrlAttributes`, `mergeScripts`, boolean and token switches. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21960](https://github.com/webpack/webpack/pull/21960)) - Minify an event handler attribute, and name the production each script body is. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21968](https://github.com/webpack/webpack/pull/21968)) - Add source-map, asset, module, bailout, federation hints; group config checks. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21961](https://github.com/webpack/webpack/pull/21961)) - Lower CSS nesting, `:dir()` and custom at-rules; gate case folding and escapes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21950](https://github.com/webpack/webpack/pull/21950)) - Add `optimization.minimize.css.mergeDistantRules` to join rules across a gap. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21969](https://github.com/webpack/webpack/pull/21969)) ##### Patch Changes - Minify an embedded body through the embedded path, dropping three html options. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21936](https://github.com/webpack/webpack/pull/21936)) - Take a minified `style` attribute's answer whatever quoting it needs. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21936](https://github.com/webpack/webpack/pull/21936)) - Name chunk imports in the chunk loader, not at each import site. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22076](https://github.com/webpack/webpack/pull/22076)) - Repair hashed names; under HMR bake hashed url maps and reload moved css names. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21916](https://github.com/webpack/webpack/pull/21916)) - Enable `output.module` for `module` and `modern-module` library types. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22071](https://github.com/webpack/webpack/pull/22071)) - Name an anonymous `export default class` before its static initializers run. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21910](https://github.com/webpack/webpack/pull/21910)) - Throw on a non-optional read past an undefined `DefinePlugin` member. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22017](https://github.com/webpack/webpack/pull/22017)) - Reject a fulfilled async cycle member with the cycle's evaluation error. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21921](https://github.com/webpack/webpack/pull/21921)) - Escape external requests in generated ESM imports and star reexports. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22078](https://github.com/webpack/webpack/pull/22078)) - Fix stack overflows in ESM library star reexport cycles with externals. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22080](https://github.com/webpack/webpack/pull/22080)) - Preserve live bindings when reexporting external ESM exports. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22082](https://github.com/webpack/webpack/pull/22082)) - Use configured external requests in ESM star reexports; reject property paths. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22079](https://github.com/webpack/webpack/pull/22079)) - Preserve import attributes on ESM library star reexports of externals. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;22081](https://github.com/webpack/webpack/pull/22081)) - Fail the build when a runtime module's code generation throws while hashing. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22034](https://github.com/webpack/webpack/pull/22034)) - Settle a css chunk load without a DOM where its stylesheet cannot be read. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21970](https://github.com/webpack/webpack/pull/21970)) - Await a deferred import's async dependency that is evaluating-async. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21934](https://github.com/webpack/webpack/pull/21934)) - Keep a color the CSS minifier would round where its channels are read back. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21923](https://github.com/webpack/webpack/pull/21923)) - Refresh a cached module's `resolveOptions` from the factory, not the pack. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21945](https://github.com/webpack/webpack/pull/21945)) - Read a `<script type>` decoded, so a reference-spelled type is minified. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21933](https://github.com/webpack/webpack/pull/21933)) - Read the extension out of a path-scoped rule's alternation, class or braces. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21946](https://github.com/webpack/webpack/pull/21946)) - Keep an HTML attribute name or list token holding a foreign template delimiter. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22018](https://github.com/webpack/webpack/pull/22018)) - Answer a name a module does not export from the spec namespace. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22092](https://github.com/webpack/webpack/pull/22092)) - Give a deferred namespace the spec's exotic shape when the exports are known. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21939](https://github.com/webpack/webpack/pull/21939)) - Give a JSON, text or CommonJS namespace the spec's exotic shape and identity. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22087](https://github.com/webpack/webpack/pull/22087)) - Report a missing asset instead of a code generation deadlock. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21992](https://github.com/webpack/webpack/pull/21992)) - Keep a concatenated CommonJS reference a separate statement, guarding it once. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21962](https://github.com/webpack/webpack/pull/21962)) - Keep CSS module exports for a direct loader `importModule()` call. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22047](https://github.com/webpack/webpack/pull/22047)) - Fix `import.meta` and `require.main`, and scope-hoist `import.meta.main`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21973](https://github.com/webpack/webpack/pull/21973)) - Honor `resolve.fileSystem` and say where `module.exprContextCritical` moved. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22091](https://github.com/webpack/webpack/pull/22091)) - Release stale compilation data from nested children and idle watch builds. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22096](https://github.com/webpack/webpack/pull/22096)) - Resolve a `@value` once and then localize it, wherever it names an identifier. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22036](https://github.com/webpack/webpack/pull/22036)) - Release the printed-text store's text when the CSS printer drops it. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21958](https://github.com/webpack/webpack/pull/21958)) - Skip a foreign dependency whose `isLazy` is a flag when walking a lazy barrel. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21998](https://github.com/webpack/webpack/pull/21998)) - Move diagnostics to `buildInfo.diagnostics`, persisting parse-time bailouts. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;22055](https://github.com/webpack/webpack/pull/22055)) - Invalidate consumer codegen when an inlined export value changes. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;22020](https://github.com/webpack/webpack/pull/22020)) - Rebuild DelegatedModule when DLL manifest metadata changes. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;22028](https://github.com/webpack/webpack/pull/22028)) - Keep a CSS layer's blocks in order where one of them streams. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22044](https://github.com/webpack/webpack/pull/22044)) - Refuse inlining const exports across sync cycles with binding reads. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;22085](https://github.com/webpack/webpack/pull/22085)) - Escape a text run ending in `</`, which the tag after it made a comment of. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22086](https://github.com/webpack/webpack/pull/22086)) - Skip JS render sentinel scans on chunks without HTML. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;21974](https://github.com/webpack/webpack/pull/21974)) - Minify an attribute by what its value says, not by how the source spelled it. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;22095](https://github.com/webpack/webpack/pull/22095)) - Cut allocation and scanning in the CSS and HTML printers, output unchanged. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21997](https://github.com/webpack/webpack/pull/21997)) - Emit less chunk-loading runtime. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22094](https://github.com/webpack/webpack/pull/22094)) - Recognize the reflected attributes of `frame`, `frameset`, `marquee` and `dir`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22003](https://github.com/webpack/webpack/pull/22003)) - Drop the `neo-async` dependency in favor of a faster built-in async helper. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21959](https://github.com/webpack/webpack/pull/21959)) - Speed up cache serialization by cutting per-object lookups and call frames. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21994](https://github.com/webpack/webpack/pull/21994)) - Update dependencies and match the `ReadFileSync` type to Node.js typings. (by [@&#8203;dependabot](https://github.com/apps/dependabot) in [#&#8203;21919](https://github.com/webpack/webpack/pull/21919)) - Match acorn on `**` arrows, LS/PS cooking, string export names, `program` reuse. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21666](https://github.com/webpack/webpack/pull/21666)) - Parse a regexp literal the running engine cannot build, and keep locations. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22009](https://github.com/webpack/webpack/pull/22009)) - Parse without acorn, serialize parse-error locations, trim walker allocations. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21667](https://github.com/webpack/webpack/pull/21667)) - Drop the `acorn` dependency in favor of webpack's own JavaScript parser. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22042](https://github.com/webpack/webpack/pull/22042)) - Name HTML chunks after their tags' urls, drop the JS copy, type `text/html`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;22008](https://github.com/webpack/webpack/pull/22008)) ### [`v5.110.3`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51103) [Compare Source](https://github.com/webpack/webpack/compare/v5.110.2...v5.110.3) ##### Patch Changes - Fix `import()` options, circular reexport severity and namespace writes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21867](https://github.com/webpack/webpack/pull/21867)) - Skip ESM interop when require() targets a module outside the concatenation. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21884](https://github.com/webpack/webpack/pull/21884)) - Fix concatenated `require()` in a `require.ensure` callback or a computed request. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21907](https://github.com/webpack/webpack/pull/21907)) - Keep `optimization.minimize` a boolean; its options move to `minimizeOptions`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21886](https://github.com/webpack/webpack/pull/21886)) - Fix mangled exports read through require() and a leaked internal reference. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21905](https://github.com/webpack/webpack/pull/21905)) - Fix `new` on a default import of a wrapped CommonJS module. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21876](https://github.com/webpack/webpack/pull/21876)) - Throw when a deferred namespace of an async module is forced while it evaluates. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21871](https://github.com/webpack/webpack/pull/21871)) - Do not report a missing export for a name a side-effect-free barrel defers. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21874](https://github.com/webpack/webpack/pull/21874)) - Fix queue, URL scheme, dotenv, HTTP module and persistent cache edge cases. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21901](https://github.com/webpack/webpack/pull/21901)) - Evaluate a deferred import's async dependencies where the import sits. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21902](https://github.com/webpack/webpack/pull/21902)) - Omit ambiguous `export *` names from the module namespace. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21878](https://github.com/webpack/webpack/pull/21878)) ### [`v5.110.2`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51102) [Compare Source](https://github.com/webpack/webpack/compare/v5.110.1...v5.110.2) ##### Patch Changes - Fix analyzable ESM baking around cycles, mixed-served wasm and style url maps. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21851](https://github.com/webpack/webpack/pull/21851)) - Minify more HTML and CSS shorthands, and cut two costs off printing. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21842](https://github.com/webpack/webpack/pull/21842)) - Report a named import that is never read when it names a missing export. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21856](https://github.com/webpack/webpack/pull/21856)) - Fix ESM circular reexports, cyclic const TDZ, and defer evaluation order. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21852](https://github.com/webpack/webpack/pull/21852)) - Stop `output.html` emitting an unused JS chunk for each generated page. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21859](https://github.com/webpack/webpack/pull/21859)) - Stop emitting the CSS chunk loading runtime when every CSS chunk is initial. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21862](https://github.com/webpack/webpack/pull/21862)) - Strip a BOM a loader put on a string, and shift a source map that counted it. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21857](https://github.com/webpack/webpack/pull/21857)) ### [`v5.110.1`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51101) [Compare Source](https://github.com/webpack/webpack/compare/v5.110.0...v5.110.1) ##### Patch Changes - Fix a capture-group-less `snapshot.managedPaths` RegExp; speed up cache writes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21843](https://github.com/webpack/webpack/pull/21843)) - Throw `SyntaxError`, or `WebAssembly.CompileError`, from an unparsable module. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21847](https://github.com/webpack/webpack/pull/21847)) - Accept the `optimization.minimize: true` shorthand set by a plugin in `apply()`. (by [@&#8203;AgentEnder](https://github.com/AgentEnder) in [#&#8203;21845](https://github.com/webpack/webpack/pull/21845)) ### [`v5.110.0`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51100) [Compare Source](https://github.com/webpack/webpack/compare/v5.109.2...v5.110.0) ##### Minor Changes - Wrap concatenated modules in lazy `__webpack_require__.cw` accessors and inline `require()`, keeping a wrapped body's names and side effects intact. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21519](https://github.com/webpack/webpack/pull/21519)) - Add performance hints reporting what a build costs: duplicate packages and modules, circular dependencies, broad contexts, large modules and chunks, hotspots, `eval`, missing PURE annotations, polyfills, redundant dynamic imports, OS-dependent rules, cache effectiveness, how chunks load, what splitting refused, why an optimization was skipped, and rules, defines, externals, aliases and barrel reexports nothing uses. An oversized asset names its largest modules, and an entrypoint carrying the runtime recommends `optimization.runtimeChunk`. Enable every check not set individually with `performance.all`, report hints in stats only with `performance.hints: "stats"`, and get them in a stable order that leaves the build hashes unchanged. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Add the `descriptionRelativePath` module rule condition. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21705](https://github.com/webpack/webpack/pull/21705)) - Add OS-independent `glob` matching to module rules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21771](https://github.com/webpack/webpack/pull/21771)) - Report inner-graph, AMD and bare `module` bailouts in `optimizationBailout`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21740](https://github.com/webpack/webpack/pull/21740)) - Allow marking externals as side-effect-free with a `sideEffects` flag. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21712](https://github.com/webpack/webpack/pull/21712)) - Give externals the original request of a context module element. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21780](https://github.com/webpack/webpack/pull/21780)) - Add the `externalsPresets.nodeModules` preset with an `allowlist` option to externalize installed packages, replacing the `webpack-node-externals` plugin. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21569](https://github.com/webpack/webpack/pull/21569)) - Add `output.library.umdAmdContainer` for an AMD-style loader branch in UMD. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21770](https://github.com/webpack/webpack/pull/21770)) - Resolve `@custom-media` values that are `true` / `false` or name another custom media. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21624](https://github.com/webpack/webpack/pull/21624)) - Add the `__webpack_css_server_styles__` module variable to read the CSS collected while rendering without a DOM, and keep that CSS in the order the styles were applied. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21576](https://github.com/webpack/webpack/pull/21576)) - Patch the HTML `<head>` in place on hot update instead of forcing a full reload, including when a `<script>` that never executed is removed. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21624](https://github.com/webpack/webpack/pull/21624)) - Scope counter names in CSS modules; fix the `counter()` counter-style and `animation` timeline keywords. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21600](https://github.com/webpack/webpack/pull/21600)) - Derive `import defer` / `import source` from the target and fix the source phase. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21810](https://github.com/webpack/webpack/pull/21810)) - Emit analyzable ESM urls for chunks, assets, styles, workers and wasm. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21788](https://github.com/webpack/webpack/pull/21788)) - Tree shake CommonJS: `module.exports` object literals, exports destructured from a `require()` binding, unused method requires, and unused side-effect-free `require()` calls and reexports. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Resolve relative entry `baseUri` values and bake one side of a hash cycle. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21750](https://github.com/webpack/webpack/pull/21750)) - Minify CSS further, only where the document is unchanged: shorthands and box longhands, `font-weight`, `<position>` and `font-stretch` keywords, colors (polar, Lab and `hsl()` converted to hex), numbers, times, zero units, `calc()` and every math function the spec names folded over constants, selector lists, An+B, keyframe selectors, media-feature ranges, `unicode-range`, `transition` layers, `display`, transforms, gradients, font families, identical repeated declarations, and rules an identical later one makes dead. Abilities are read off the target browsers, `vendorPrefixes` adds and drops vendor prefixes for them, and `rewriteCustomProperties` shortens custom property values. Minification never changes whether a declaration parses, and beautifying keeps every rule. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Safely minify CSS (with source maps) and HTML assets when `optimization.minimize` is enabled, unless a minimizer is already configured for them, making only transformations an engine cannot tell apart. Every rewrite is named as an option, so it can be switched off. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Minify HTML further where the parsed document is unchanged: drop redundant quotes, whitespace nothing renders, escapes text does not need, implied tags, optional end tags nothing prints behind, empty attributes and nested empty elements; fold enumerated values and casing; normalize each attribute against the element it is on; and rewrite `style`, token lists, `srcset`, `sizes`, URL, integer and boolean attributes, viewport `content`, inline `<style>` and a JSON `<script>` body through their own grammars. Adds the `optimization.minimize.html` options `collapseWhitespace`, `mergeStyles`, `minifyConditionalComments`, `minifySrcdoc`, `preserveComments`, `removeEmptyAttributes`, `removeEmptyElements`, `removeImpliedTags`, `removeRedundantAttributes`, `sortAttributes` and `sortTokenLists`, and keeps an end tag the parent, the next element or the adoption agency would otherwise restructure the tree over. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Suggest the closest name or a casing fix anywhere in a failed request. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21727](https://github.com/webpack/webpack/pull/21727)) - Add aggregated `shutdown` hook to `MultiCompiler`. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21578](https://github.com/webpack/webpack/pull/21578)) - Report which compilers changed on the MultiCompiler `done` hook. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21580](https://github.com/webpack/webpack/pull/21580)) - Add `[containedpath]`/`[containedfile]` placeholders, used for `[path]`/`[file]` of asset and html modules with `experiments.futureDefaults`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21592](https://github.com/webpack/webpack/pull/21592)) - Support an object for an entry's `html` that overrides `output.html` per option. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21574](https://github.com/webpack/webpack/pull/21574)) - Configure or exclude each asset type's minifier via `optimization.minimize`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21663](https://github.com/webpack/webpack/pull/21663)) - Support printing CSS and HTML beautified as well as minified. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21660](https://github.com/webpack/webpack/pull/21660)) - Add `renderEmbeddedSource`, and minify what it offers out of the box. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21830](https://github.com/webpack/webpack/pull/21830)) - Report bindings named `eval`, `arguments` or reserved words in ES module output. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21567](https://github.com/webpack/webpack/pull/21567)) - Emit no development source map for module libraries, or any with futureDefaults. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21839](https://github.com/webpack/webpack/pull/21839)) - Speed up builds and cut memory: faster CSS, HTML and JavaScript parsing and minification, a built-in scope analyzer replacing `eslint-scope`, faster dependency hot paths, module diagnostics, CommonJS export scanning and concatenated module renaming, runtime modules, parsers, generators and dependencies loaded only when used, one file watcher pool shared between MultiCompiler children, and lower parser, graph and startup memory. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Improve tree-shaking for a namespace reexported as default, and fix `import d from "./mod"; d.member` reading `undefined` in that case. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Warn on cross-kind CSS module export conflicts and let the class win. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21538](https://github.com/webpack/webpack/pull/21538)) - Add `output.resourceHints.dedupe` to skip prefetch links for already preloaded/prefetched chunks. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21386](https://github.com/webpack/webpack/pull/21386)) ##### Patch Changes - Let a memory-cache etag mismatch fall through to the file cache instead of reporting a miss. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21624](https://github.com/webpack/webpack/pull/21624)) - Determine provided exports in dependency order, so a build's module hashes no longer depend on what the persistent cache held. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21630](https://github.com/webpack/webpack/pull/21630)) - Emit no dead module and no failing require for an `asset-url` external. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21713](https://github.com/webpack/webpack/pull/21713)) - Fix names, hidden devtools and cache reuse for CSS maps inlined into JS. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21558](https://github.com/webpack/webpack/pull/21558)) - Follow the HTML spec more closely when parsing and printing: frameset content, quirks paragraphs and selects, `<![CDATA[` outside foreign content as a bogus comment, `<?target data?>` as a processing instruction, `</>` dropped, comment data and DOCTYPE identifiers read from the tokenizer states, attributes merged from a repeated `<html>`/`<body>` tag, legacy JavaScript script types, void `keygen` and font format detection — and hand back the tree a parsed document was built from when printing it. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Clear a `Watching`'s `blocked` flag when its build starts, so it reports only a child actually waiting for its MultiCompiler parent. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21639](https://github.com/webpack/webpack/pull/21639)) - Fix AMD `define()` output using the wrong module and exports argument names. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21814](https://github.com/webpack/webpack/pull/21814)) - Fix `ReferenceError` from `import.meta.main` using the wrong module argument. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21620](https://github.com/webpack/webpack/pull/21620)) - Leave a `@namespace` URI alone instead of resolving and rewriting it as an asset. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21658](https://github.com/webpack/webpack/pull/21658)) - Resolve escaped CSS names, and scope a grid area cell name as one name. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21665](https://github.com/webpack/webpack/pull/21665)) - Track exports usage of side-effect-free modules an active import() evaluates. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21623](https://github.com/webpack/webpack/pull/21623)) - Resolve absolute symlink targets and treat an unreadable context as missing. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21647](https://github.com/webpack/webpack/pull/21647)) - Fix corrupted icon URLs in a `.webmanifest` with a BOM or non-ASCII text. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21655](https://github.com/webpack/webpack/pull/21655)) - Respect `strictThisContextOnImports` for `require()` member calls. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21601](https://github.com/webpack/webpack/pull/21601)) - Fix `import.meta`, `[object Object]` asset urls and crashes in build-time executed modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Inherit sideEffects past a type-only nested package.json for files under node_modules. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;21686](https://github.com/webpack/webpack/pull/21686)) - Do not fail directory creation when the file system reports it already exists. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21698](https://github.com/webpack/webpack/pull/21698)) - Fix top-level `using` and `await using` declarations in modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21557](https://github.com/webpack/webpack/pull/21557)) - Fix `DefinePlugin` optional chains reading an undefined object member. (by [@&#8203;lazerg](https://github.com/lazerg) in [#&#8203;21823](https://github.com/webpack/webpack/pull/21823)) - Fix MultiCompiler: compute the common `outputPath` by whole path segments, run again after a dependency validation failure, and recover watch mode from a fatal child error without leaking watchings. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Keep a nested bundle's runtime tables separate when bundling webpack output. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21568](https://github.com/webpack/webpack/pull/21568)) - Keep the runtime out of strict mode when `output.globalObject` reads `this`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21715](https://github.com/webpack/webpack/pull/21715)) - Run an even-priority `__webpack_require__.O` handler without waiting. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21803](https://github.com/webpack/webpack/pull/21803)) - Treat top-level `this` in a classic worker entry as its global scope. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21720](https://github.com/webpack/webpack/pull/21720)) - Rehash runtime modules whose code changes under a content-named filename. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21828](https://github.com/webpack/webpack/pull/21828)) - Fix namespace object reexports and string export names in module library output and emit a CommonJS entry's default as `export default`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21589](https://github.com/webpack/webpack/pull/21589)) - Keep tree-shaken JSON arrays as arrays when a prototype property is read. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21599](https://github.com/webpack/webpack/pull/21599)) - Generate every CSS and HTML lookup table into `lib/{css,html}/data.js` from `mdn-data`, `color-name` and the spec IDL — including the value-type facts read out of the CSS value-definition grammars — leaving both `syntax.js` files algorithm only. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Support UNC paths in module and context replacement plugins. (by [@&#8203;avivkeller](https://github.com/avivkeller) in [#&#8203;21645](https://github.com/webpack/webpack/pull/21645)) - Emit less runtime code: shorter syntax where `output.environment` allows, no IIFE for a `RuntimeModule` without locals, no unread `__webpack_esm_id__` and `exports.id` chunk exports, and an ESM entry chunk installing its own modules from its local bindings instead of importing itself. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21841](https://github.com/webpack/webpack/pull/21841)) - Release the compilation and file system caches retained after `compiler.close()`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21603](https://github.com/webpack/webpack/pull/21603)) ### [`v5.109.2`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51092) [Compare Source](https://github.com/webpack/webpack/compare/v5.109.1...v5.109.2) ##### Patch Changes - Resolve aliases pointing at a package directory whose name ends with `.js` again. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21542](https://github.com/webpack/webpack/pull/21542)) - Name CSS sources in source maps by their resource path, without the `css ` prefix. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21536](https://github.com/webpack/webpack/pull/21536)) - Delete no longer referenced files from the filesystem cache directory after storing the cache, age them by recorded time so restored caches are cleaned too, and collect every fully expired pack in one store instead of one per build. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21528](https://github.com/webpack/webpack/pull/21528)) - Report `"universal"` as the loader context target for the universal target. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21540](https://github.com/webpack/webpack/pull/21540)) - Skip `require().prop` in dead branches gated by inlined imported constants. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21517](https://github.com/webpack/webpack/pull/21517)) - Annotate configuration options and public hooks in the generated types with the `@since` JSDoc tag. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21473](https://github.com/webpack/webpack/pull/21473)) ### [`v5.109.1`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51091) [Compare Source](https://github.com/webpack/webpack/compare/v5.109.0...v5.109.1) ##### Patch Changes - Fix stray semicolon emitted before an imported call following a parenthesized sequence element. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21533](https://github.com/webpack/webpack/pull/21533)) - Make `require(esm)` `module.exports` re-export analysis independent of module processing order. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21521](https://github.com/webpack/webpack/pull/21521)) - Ignore ERR_SERVER_NOT_RUNNING on lazy-compilation backend dispose so `compiler.close()` succeeds on Bun. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21521](https://github.com/webpack/webpack/pull/21521)) - Name the failing key when DefinePlugin fails to evaluate a `typeof` value. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21503](https://github.com/webpack/webpack/pull/21503)) - Improve Deno compatibility: guard `setNoDelay` and force-close connections on lazy-compilation backend dispose, and return a real `ArrayBuffer` from the Node async/sync wasm loader so `WebAssembly.instantiate` accepts it. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21524](https://github.com/webpack/webpack/pull/21524)) - Speed up the HTML parser and cut its peak memory: module-scope helpers/state and tokenizer callbacks, plus exact AST column pre-sizing. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21492](https://github.com/webpack/webpack/pull/21492)) - Track CommonJS build dependencies by parsing sources when `require.cache` children are unavailable (e.g. Bun). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21531](https://github.com/webpack/webpack/pull/21531)) - Cook common string-literal escapes on the JS parser fast path and own the tokenizer's cold-path readers. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21500](https://github.com/webpack/webpack/pull/21500)) - Build the CSS `parseA*` AST on the SoA store instead of node classes, cutting parse memory and time. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21498](https://github.com/webpack/webpack/pull/21498)) - Speed up and cut memory of the experimental CSS and HTML parsers: drop two derivable AST node columns, and scan long string, url, comment, and plaintext token bodies natively. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21504](https://github.com/webpack/webpack/pull/21504)) - Speed up non-modules CSS parsing: skip redundant token re-reads, drop selector-prelude tokens without materializing nodes, allocate rule preludes lazily, and fast-path empty list seals. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21511](https://github.com/webpack/webpack/pull/21511)) - Speed up stats generation and cut its peak memory: reuse cached sort comparators instead of thrashing the comparator caches on every sort, and drop redundant module-graph lookups and allocations in the extractors. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21506](https://github.com/webpack/webpack/pull/21506)) - Speed up CSS parsing: byte-range function-name checks, indexed sibling lookahead. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21520](https://github.com/webpack/webpack/pull/21520)) - Reduce allocations and redundant work across the code-generation, module-concatenation, exports/usage-analysis, hashing, and chunk-splitting hot paths. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21516](https://github.com/webpack/webpack/pull/21516)) - Enable the Node.js compile cache in the webpack CLI entry point. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21523](https://github.com/webpack/webpack/pull/21523)) - Encode the persistent cache with V8's value serializer. (by [@&#8203;avivkeller](https://github.com/avivkeller) in [#&#8203;21514](https://github.com/webpack/webpack/pull/21514)) - Speed up SplitChunksPlugin: reject non-subset chunk sets with 64-bit signatures, cache unnamed entry keys, and drop per-module closures. (by [@&#8203;avivkeller](https://github.com/avivkeller) in [#&#8203;21529](https://github.com/webpack/webpack/pull/21529)) - Initialize `NormalModule._ast` in the constructor so each instance keeps a single hidden-class shape. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21515](https://github.com/webpack/webpack/pull/21515)) - Reduce allocations in the binary serialization hot paths. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21526](https://github.com/webpack/webpack/pull/21526)) - Deduplicate and simplify several lib modules and speed up AggressiveMergingPlugin. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21525](https://github.com/webpack/webpack/pull/21525)) - Rename nested `const`/`let __webpack_require__` and `__webpack_exports__` declarations in bundled webpack output. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21508](https://github.com/webpack/webpack/pull/21508)) ### [`v5.109.0`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51090) [Compare Source](https://github.com/webpack/webpack/compare/v5.108.4...v5.109.0) ##### Minor Changes - Default `experiments.typescript` to `"auto"`, enabling built-in TypeScript support on Node.js >= 22.6 when no TypeScript loader is registered. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21398](https://github.com/webpack/webpack/pull/21398)) - Default `experiments.css`, `experiments.html` and `experiments.asyncWebAssembly` to `"auto"`, enabling built-in support unless a loader is registered for those files; modules with inline or hook-injected loaders (e.g. html-webpack-plugin templates) keep being parsed as JavaScript. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21365](https://github.com/webpack/webpack/pull/21365)) - Add `output.resourceHints` to emit resource hints (`preload`/`prefetch`/`modulepreload`/`preconnect`), on by default for ESM output, plus `module.parser.<type>.urlHints`, `css.fontPreload` and `javascript.dynamicImportCssPreload`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21408](https://github.com/webpack/webpack/pull/21408)) - Add built-in build progress via `infrastructureLogging.progress`, plus `estimatedTime`, `phaseTimings`, progress bar `width` and `progressBar: "auto"` on `ProgressPlugin`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21352](https://github.com/webpack/webpack/pull/21352)) - Concatenate CommonJS modules with statically analyzable exports; opt out via `optimization.concatenateModules: { commonjs: false }`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21417](https://github.com/webpack/webpack/pull/21417)) - Wrap "weird" CommonJS modules into module concatenation instead of bailing out. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21436](https://github.com/webpack/webpack/pull/21436)) - Add `output.html.inline` (`true | "script" | "style"`) and the `webpackInline` magic comment to inline chunk content into HTML. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21260](https://github.com/webpack/webpack/pull/21260)) - Add `output.html.inject` to control where chunk tags are injected. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21383](https://github.com/webpack/webpack/pull/21383)) - Add `output.html.title`, `output.html.meta` and `output.html.base` options for head generation. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21394](https://github.com/webpack/webpack/pull/21394)) - Support per-icon link attributes (`sizes`, `media`, `color`, `type`, `crossorigin`) and arrays in `output.html.favicon`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21487](https://github.com/webpack/webpack/pull/21487)) - Add `output.html.manifest` to generate and link a web app manifest with hashed icons. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21487](https://github.com/webpack/webpack/pull/21487)) - Add `output.html.csp` to inject a Content-Security-Policy meta with inline-content hashes and an optional nonce. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21487](https://github.com/webpack/webpack/pull/21487)) - Add the `output.html` `injectTags` compilation hook to inject tags (script/link/meta/…) with `injectTo` placement. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21487](https://github.com/webpack/webpack/pull/21487)) - Add the `output.html` `transformTags` compilation hook to mutate, remove, or move (between `<head>` and `<body>`) a page's existing `<script>`/`<link>`/`<style>`/`<meta>` tags. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21487](https://github.com/webpack/webpack/pull/21487)) - Extend the HTML pipeline with `html` link sources (bundled as their own emitted page) and `rel="preload"`/`"prefetch"` links bundled as chunks. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21346](https://github.com/webpack/webpack/pull/21346)) - Recognize more asset-bearing HTML sources: the `twitter:player:stream` meta, legacy SVG references, and Web App Manifest `icons`/`screenshots`/`shortcuts` URLs. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21355](https://github.com/webpack/webpack/pull/21355)) - Add `module.parser.html.as` to parse HTML as a document or an element fragment. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21441](https://github.com/webpack/webpack/pull/21441)) - Allow disabling a built-in HTML parser source via `type: false` in `sources`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21441](https://github.com/webpack/webpack/pull/21441)) - Export `webpack.html.HtmlModulesPlugin` with `transformHtml`/`htmlEmitted` compilation hooks. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21487](https://github.com/webpack/webpack/pull/21487)) - Resolve `@custom-media` (including media-type values) and `@custom-selector` in native CSS. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21442](https://github.com/webpack/webpack/pull/21442)) - Scope `view-transition-name`/`-group`/`-class` names and `::view-transition-*()` pseudo references in CSS modules under `customIdents`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21486](https://github.com/webpack/webpack/pull/21486)) - Add `import.meta.glob` support, with a `caseSensitive` option and consistent hidden/`node_modules` matching. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21385](https://github.com/webpack/webpack/pull/21385)) - Resolve `import.meta.resolve("./asset")` to the emitted asset URL via the `importMeta.resolve` parser option. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21415](https://github.com/webpack/webpack/pull/21415)) - Add `import.meta.env` defaults: `MODE`, `DEV`, `PROD`, `SSR` and `BASE_URL`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21440](https://github.com/webpack/webpack/pull/21440)) - Add fine-grained `import.meta` parser options. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21327](https://github.com/webpack/webpack/pull/21327)) - Deprecate the `importMetaContext` parser option in favor of `importMeta.webpackContext`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21360](https://github.com/webpack/webpack/pull/21360)) - Emit analyzable `new URL(…, import.meta.url)`, worker/worklet URL and `import()` references with literal specifiers for ESM module output. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21194](https://github.com/webpack/webpack/pull/21194)) - Compile async modules to generators for targets without async/await. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21410](https://github.com/webpack/webpack/pull/21410)) - Evaluate and validate the second argument of dynamic `import(specifier, options)`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21446](https://github.com/webpack/webpack/pull/21446)) - Add `module.parser.javascript.worklet` to bundle Worklet `addModule()` entries. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21384](https://github.com/webpack/webpack/pull/21384)) - Add `?raw`, `?url`, `?inline` and `?no-inline` asset query suffixes under `experiments.futureDefaults`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21379](https://github.com/webpack/webpack/pull/21379)) - Add an `interop` (`"default" | "esModule"`) hint for object externals to control default-export interop. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21371](https://github.com/webpack/webpack/pull/21371)) - Add an `amd-async` externals type that loads AMD externals without an AMD library wrapper. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21340](https://github.com/webpack/webpack/pull/21340)) - Support `cache.compression: "zstd"` for the filesystem cache. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21438](https://github.com/webpack/webpack/pull/21438)) - Warn on strict-mode-only syntax and semantic hazards in ES module output, configurable via the `strictModeViolations` parser option. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21387](https://github.com/webpack/webpack/pull/21387)) - Support parsers without location APIs: locations derive from node offsets and AST nodes no longer carry `loc`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21451](https://github.com/webpack/webpack/pull/21451)) - Attach the original DOM event to `ChunkLoadError` and `ScriptExternalLoadError` as `error.event`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21388](https://github.com/webpack/webpack/pull/21388)) - Add `output.wasmStreamingFallback` for wasm fallback on a wrong MIME type. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21299](https://github.com/webpack/webpack/pull/21299)) - Show why a module was marked as not cacheable in stats output. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21403](https://github.com/webpack/webpack/pull/21403)) - Expose the active `MultiWatching` on `MultiCompiler.watching`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21469](https://github.com/webpack/webpack/pull/21469)) - Resolve git merge conflicts when parsing the build-http lockfile. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21397](https://github.com/webpack/webpack/pull/21397)) ##### Patch Changes - Fix broken HMR with `output.module` and non-`import` chunk loading by emitting a plain-JSON hot-update manifest. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21460](https://github.com/webpack/webpack/pull/21460)) - Fix unused CSS module exports leaking into the JS wrapper. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21301](https://github.com/webpack/webpack/pull/21301)) - Fix deferred import evaluation: re-throw cached errors, guard forcing a still-evaluating module, keep re-exported deferred namespaces identical, and evaluate initial-chunk deferred context imports lazily. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21446](https://github.com/webpack/webpack/pull/21446)) - Keep ESM live bindings for a module library's entry exports, including when the runtime is emitted as a separate chunk. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21349](https://github.com/webpack/webpack/pull/21349)) - Fix SplitChunks merging undersized modules into the wrong result group. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21356](https://github.com/webpack/webpack/pull/21356)) - Fix named id assignment reusing an already-used numbered suffix, which could produce duplicate module/chunk ids. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21406](https://github.com/webpack/webpack/pull/21406)) - Fix inlined non-binary asset modules with `encoding: false` emitting "undefined" instead of their content. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21406](https://github.com/webpack/webpack/pull/21406)) - Decode non-base64 data URIs as UTF-8 so multi-byte characters are preserved. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21366](https://github.com/webpack/webpack/pull/21366)) - Keep required JSON data intact when a prototype method (e.g. `arr.includes()`) is called on it. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21433](https://github.com/webpack/webpack/pull/21433)) - Recognize modern RegExp flags (`d`, `s`, `u`, `v`) when statically evaluating `new RegExp(...)`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21366](https://github.com/webpack/webpack/pull/21366)) - Merge object-form and dotted DefinePlugin definitions so `import.meta.env`/`process.env` are consistent across direct, whole-object and destructured access. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21419](https://github.com/webpack/webpack/pull/21419)) - Emit an error when an object external has no entry for the used externals type. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21340](https://github.com/webpack/webpack/pull/21340)) - Fix a persistent cache restore crash when a content section starts exactly on a content-buffer boundary. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21406](https://github.com/webpack/webpack/pull/21406)) - Restore missing `internalSerializables` entries (webpack/lib/Module and cold filesystem cache). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21391](https://github.com/webpack/webpack/pull/21391)) - Fix watch rebuild crash when context symlink targets lack `timestampHash`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21381](https://github.com/webpack/webpack/pull/21381)) - Fix lazy compilation backend leaking idle module entries and hanging on exit. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21468](https://github.com/webpack/webpack/pull/21468)) - Stop logging benign ECONNRESET client errors from the lazy compilation server. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21406](https://github.com/webpack/webpack/pull/21406)) - Accept compilations from another webpack copy in `getCompilationHooks` again. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21407](https://github.com/webpack/webpack/pull/21407)) - Fix `output.html` injection edge cases: escaping, head detection, duplicate meta tags, resource-hint/entry-tag retention with `inject: false`, and stylesheet placement. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21416](https://github.com/webpack/webpack/pull/21416)) - Ignore a `<base>` inside an inert `<template>` when resolving HTML URLs. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21441](https://github.com/webpack/webpack/pull/21441)) - Bust an HTML page's `[contenthash]` when its inlined chunk content changes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21441](https://github.com/webpack/webpack/pull/21441)) - Fix a dangling stylesheet `<link>` for a JS-only chunk in an HTML entry. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21441](https://github.com/webpack/webpack/pull/21441)) - Fix a malformed HTML magic comment leaking a pending `webpackInline` directive onto the next element. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21406](https://github.com/webpack/webpack/pull/21406)) - Fix off-by-one dropping the last character of an unterminated `url(...)` at end-of-input. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21406](https://github.com/webpack/webpack/pull/21406)) - Consume the trailing whitespace of a CSS hex escape when unescaping identifiers. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21366](https://github.com/webpack/webpack/pull/21366)) - Fix `[fullhash]` in `output.webassemblyModuleFilename` by dropping a stray brace and requesting the `getFullHash` runtime module. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21406](https://github.com/webpack/webpack/pull/21406)) - Fix duplicated errors/warnings in stats output when detail-less entries exceed `errorsSpace`/`warningsSpace`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21406](https://github.com/webpack/webpack/pull/21406)) - Improve module parse errors with a babel-style code frame and the module type. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21485](https://github.com/webpack/webpack/pull/21485)) - Fix `formatSize` rendering sizes of 1 TiB or larger as "undefined". (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21366](https://github.com/webpack/webpack/pull/21366)) - Skip the anonymous default export `.name` fix-up when `name` is non-configurable, instead of throwing on pre-ES2015 engines. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21370](https://github.com/webpack/webpack/pull/21370)) - Escape `?` and `#` in context module regexp identifiers so source map names are not truncated. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21422](https://github.com/webpack/webpack/pull/21422)) - Resolve directory requests to their index module in scoped `DllReferencePlugin`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21437](https://github.com/webpack/webpack/pull/21437)) - Skip the `hasSymbol` check in the async module runtime when `environment.symbol` is set. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21423](https://github.com/webpack/webpack/pull/21423)) - Use a shared `__webpack_require__.cjs` helper for wrapped CommonJS modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21464](https://github.com/webpack/webpack/pull/21464)) - Derive ASI positions from source text instead of acorn's `onInsertedSemicolon`, so custom parsers need not collect semicolons. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21453](https://github.com/webpack/webpack/pull/21453)) - Avoid a second full parse for `auto` source type by downgrading module to script in place on a top-level return. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21455](https://github.com/webpack/webpack/pull/21455)) - Fix exponential-time side-effects analysis on cyclic module graphs by memoizing cycle-free results via Tarjan lowlink. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21373](https://github.com/webpack/webpack/pull/21373)) - Speed up JavaScript parsing and AST walking and reduce parser memory usage. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21373](https://github.com/webpack/webpack/pull/21373)) - Speed up CSS and HTML parsing and code generation and reduce parser memory usage. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21332](https://github.com/webpack/webpack/pull/21332)) - Speed up snapshot creation and reduce its memory usage. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21401](https://github.com/webpack/webpack/pull/21401)) - Reduce allocations in JS codegen, concatenation, queues and parser setup. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21341](https://github.com/webpack/webpack/pull/21341)) - Speed up stats generation on large builds by reusing the item context across array items. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21425](https://github.com/webpack/webpack/pull/21425)) - Memoize loader resolution per compilation to avoid re-resolving the same loader for every matching module. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21435](https://github.com/webpack/webpack/pull/21435)) - Reuse and harden webpack's shared resource parser in the loader runner. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21392](https://github.com/webpack/webpack/pull/21392)) - Update webpack-sources to 3.5.1 and enhanced-resolve to 5.24.2 to cut peak memory. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21344](https://github.com/webpack/webpack/pull/21344)) - Inline the loader-runner package into core. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21249](https://github.com/webpack/webpack/pull/21249)) - Fix context hash crash on unsupported directory entries like FIFOs and sockets. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21484](https://github.com/webpack/webpack/pull/21484)) - Verify internalSerializables in lint:special and regenerate it in fix:special. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21476](https://github.com/webpack/webpack/pull/21476)) ### [`v5.108.4`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51084) [Compare Source](https://github.com/webpack/webpack/compare/v5.108.3...v5.108.4) ##### Patch Changes - Speed up non-CSS-Modules parsing by not building unused selector AST nodes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21324](https://github.com/webpack/webpack/pull/21324)) - Speed up non-CSS-Modules CSS parsing by dropping value tokens nothing reads. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21324](https://github.com/webpack/webpack/pull/21324)) - Resolve HTML asset URLs against the document `<base href>`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21329](https://github.com/webpack/webpack/pull/21329)) - Add HTML integration tests: generateError output, ignored src, null-char parse. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;21328](https://github.com/webpack/webpack/pull/21328)) - Reduce CPU and memory overhead of HTML and CSS parsing and code generation. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21332](https://github.com/webpack/webpack/pull/21332)) - Reduce HTML parser memory and CPU by skipping unused AST nodes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21323](https://github.com/webpack/webpack/pull/21323)) - Reduce HTML parser memory by storing the AST in struct-of-arrays form. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21331](https://github.com/webpack/webpack/pull/21331)) - Key the provided-exports cache on a lazy barrel's still-lazy re-export targets. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21326](https://github.com/webpack/webpack/pull/21326)) - Default `output.globalObject` to `globalThis` for universal targets. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21314](https://github.com/webpack/webpack/pull/21314)) - Pass through `new URL(...)` directory references instead of resolving them. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21312](https://github.com/webpack/webpack/pull/21312)) ### [`v5.108.3`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51083) [Compare Source](https://github.com/webpack/webpack/compare/v5.108.2...v5.108.3) ##### Patch Changes - Speed up CSS parsing and reduce CSS AST node memory. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21285](https://github.com/webpack/webpack/pull/21285)) - Fix HMR codegen crash for harmony accept with unresolved imports. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;21302](https://github.com/webpack/webpack/pull/21302)) - Match harmony accept dependencies by module reference so HMR codegen handles imports without a module or chunk id. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21303](https://github.com/webpack/webpack/pull/21303)) ### [`v5.108.2`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51082) [Compare Source](https://github.com/webpack/webpack/compare/v5.108.1...v5.108.2) ##### Patch Changes - Fix lazy barrel deferral of ungrouped side-effect imports. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21291](https://github.com/webpack/webpack/pull/21291)) - Respect the `node:` prefix for node.js core modules used as externals. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21286](https://github.com/webpack/webpack/pull/21286)) ### [`v5.108.1`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51081) [Compare Source](https://github.com/webpack/webpack/compare/v5.108.0...v5.108.1) ##### Patch Changes - Fix invalid property access for escaped namespace imports with multi-character mangled export names. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;21280](https://github.com/webpack/webpack/pull/21280)) - Add frames to ProfilingPlugin TracingStartedInBrowser event so the trace loads in Chrome DevTools. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21269](https://github.com/webpack/webpack/pull/21269)) ### [`v5.108.0`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51080) [Compare Source](https://github.com/webpack/webpack/compare/v5.107.2...v5.108.0) ##### Minor Changes - Treat top-level await and `import.meta` as ES module markers, matching Node.js syntax detection so no explicit module type is needed. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21218](https://github.com/webpack/webpack/pull/21218)) - Add a `bun` target that emits ESM and externalizes `bun:*` and node.js built-in modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21248](https://github.com/webpack/webpack/pull/21248)) - Support CommonJS reexports via `Object.defineProperty` value and getter descriptors. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21129](https://github.com/webpack/webpack/pull/21129)) - Support JSON Schema `const` when generating CLI flags from a schema. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21087](https://github.com/webpack/webpack/pull/21087)) - Support JSON Schema `if`/`then`/`else` when generating CLI flags from a schema. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21087](https://github.com/webpack/webpack/pull/21087)) - Skip import specifiers, `require()` and `import()` calls in dead conditional branches gated by inlined imported constants (`isDEV ? A : B`), evaluated via `getCondition`. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21136](https://github.com/webpack/webpack/pull/21136)) - CSS `localIdentName` `[hash]` now resolves to the local ident hash (matching css-loader); use `[modulehash]` for the module hash. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21259](https://github.com/webpack/webpack/pull/21259)) - Add CSS parser `as` option and resolve `url()` inside HTML `style` attributes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21157](https://github.com/webpack/webpack/pull/21157)) - Add dedicated module classes for all built-in module types. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21164](https://github.com/webpack/webpack/pull/21164)) - Support `.html`/`.css` for the default `./src` entry under the html/css experiments. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21039](https://github.com/webpack/webpack/pull/21039)) - Add `defineConfig` helper for typed configuration files. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21169](https://github.com/webpack/webpack/pull/21169)) - Add a `deno` target (with versions, e.g. `deno`, `deno2`, `deno1.40`) that emits ESM, resolves node.js built-ins via the required `node:` specifier, and keeps Deno's own import protocols (`npm:`, `jsr:`, `node:`, `http(s)://`) external. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21247](https://github.com/webpack/webpack/pull/21247)) - Use `module-import` for electron externals when the target supports ESM. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21184](https://github.com/webpack/webpack/pull/21184)) - Add `output.environment.logicalAssignment` to emit `||=` in runtime code when the target supports logical assignment operators. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21219](https://github.com/webpack/webpack/pull/21219)) - Resolve and rewrite asset URLs inside `<iframe srcdoc>` in HTML modules. (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21226](https://github.com/webpack/webpack/pull/21226)) - Add HMR support for HTML modules with body/title DOM patching on update. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21011](https://github.com/webpack/webpack/pull/21011)) - Add `css-url` html source type extracting `url()` references from CSS-valued attributes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21250](https://github.com/webpack/webpack/pull/21250)) - Add `module.parser.html.sources` option to disable or customize URL-attribute extraction for HTML modules, with `script` / `script-module` / `stylesheet` / `stylesheet-inline` types for custom attributes (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21022](https://github.com/webpack/webpack/pull/21022)) - Add `module.parser.html.template` option to transform HTML module source before parsing. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21055](https://github.com/webpack/webpack/pull/21055)) - Extract more source URLs in HTML modules (SVG, legacy and obsolete attributes). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21241](https://github.com/webpack/webpack/pull/21241)) - Inline `export default <const>` when the default-exported value is a primitive constant. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21189](https://github.com/webpack/webpack/pull/21189)) - Support `optimization.inlineExports` for better tree-shaking. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;20973](https://github.com/webpack/webpack/pull/20973)) - Re-encode inline hash digests (`[contenthash]`/`[chunkhash]`/`[fullhash]`/`[modulehash]`) from the full content hash, so they carry full entropy and work under `optimization.realContentHash` and in dynamically-loaded chunk filenames; also preserve leading zero bytes in base-N digests. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21267](https://github.com/webpack/webpack/pull/21267)) - Allow tree-shaking unused calls to `/*#__NO_SIDE_EFFECTS__*/`-annotated (pure) exports across module boundaries. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;20907](https://github.com/webpack/webpack/pull/20907)) - Defer building unused re-export targets of side-effect-free barrel modules. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21165](https://github.com/webpack/webpack/pull/21165)) - Keep export mangling enabled for modules whose namespace object is used as a whole value, by materializing a decoupled namespace object that keeps the original export names. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21234](https://github.com/webpack/webpack/pull/21234)) - Add `output.environment.let` option (paired with target's `let` capability) and emit `let`/`const` instead of `var` in generated runtime code wherever it is safe. Bindings that may be wrapped in runtime-condition `if` blocks (harmony imports, ConcatenatedModule external imports) continue to use `var` to preserve function scoping. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21010](https://github.com/webpack/webpack/pull/21010)) - Add `output.html` to emit an HTML file per entrypoint, injecting its JS/CSS chunks (including `dependOn` shared chunks). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21215](https://github.com/webpack/webpack/pull/21215)) - Add `module.parser.javascript.pureFunctions` to mark top-level names as side-effect-free for tree shaking. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21063](https://github.com/webpack/webpack/pull/21063)) - Add `universal` to `compiler.platform`, true for universal targets (`"universal"` or `["web", "node"]`). (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;21252](https://github.com/webpack/webpack/pull/21252)) - Add `output.strictModuleResolution` to gate the runtime `MODULE_NOT_FOUND` guard. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21067](https://github.com/webpack/webpack/pull/21067)) - Support an inline digest in hash path placeholders, e.g. `[contenthash:base64:8]`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21259](https://github.com/webpack/webpack/pull/21259)) - Support `[uniqueName]` and its `[uniquename]` alias in template paths. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21155](https://github.com/webpack/webpack/pull/21155)) - Support CSS in Node for universal targets, collecting styles for SSR. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21208](https://github.com/webpack/webpack/pull/21208)) - Improve commonjs, node-commonjs and global externals for universal targets. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21187](https://github.com/webpack/webpack/pull/21187)) - Add a `universal` target preset (browser + web worker + Node.js + Electron + NW\.js) that always outputs ECMAScript modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21214](https://github.com/webpack/webpack/pull/21214)) - Support `new Worker(new URL(...))` in universal (node + web) targets by resolving the Worker constructor from `worker_threads` when no global `Worker` exists. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21195](https://github.com/webpack/webpack/pull/21195)) - Add `output.workerChunkFilename` and `entry.worker` for worker chunk filenames. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21128](https://github.com/webpack/webpack/pull/21128)) ##### Patch Changes - Skip re-parsing the inlined entry module when no renaming is needed. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21167](https://github.com/webpack/webpack/pull/21167)) - Extend the avoidEntryIife no-parse fast path to multi-entry chunks. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21173](https://github.com/webpack/webpack/pull/21173)) - Reuse the binary deserialize dispatch table to speed up cache restore. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21175](https://github.com/webpack/webpack/pull/21175)) - Type `buildInfo` and `buildMeta` per module type with shared common properties. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21172](https://github.com/webpack/webpack/pull/21172)) - Avoid copying module runtime requirements when ownership is not transferred. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21140](https://github.com/webpack/webpack/pull/21140)) - Keep all CommonJS exports when an exported function accesses them via `this`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21179](https://github.com/webpack/webpack/pull/21179)) - Align CLI color-support detection across Node, Deno and Bun. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21257](https://github.com/webpack/webpack/pull/21257)) - Include the schema origin path in conflicting-schema CLI argument errors. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21087](https://github.com/webpack/webpack/pull/21087)) - Reject `__proto__`, `constructor` and `prototype` path segments in `cli.processArguments` to prevent prototype pollution. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21057](https://github.com/webpack/webpack/pull/21057)) - Speed up `Compilation.deleteAsset` and `Compilation.renameAsset` via a lazy reverse index from asset file name to containing chunks. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21035](https://github.com/webpack/webpack/pull/21035)) - Fix merging of inner modules' top-level declarations in concatenated modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21170](https://github.com/webpack/webpack/pull/21170)) - Reduce allocations in export hashing and concatenation name lookups. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21167](https://github.com/webpack/webpack/pull/21167)) - Avoid toLowerCase allocations in CSS keyword comparisons. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21109](https://github.com/webpack/webpack/pull/21109)) - Speed up CSS identifier escaping with a char-class lookup table. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21109](https://github.com/webpack/webpack/pull/21109)) - Resolve `[fullhash]` in `url()` public paths for inlined CSS export types (`style`/`text`/`css-style-sheet`) at runtime. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21054](https://github.com/webpack/webpack/pull/21054)) - Avoid quadratic line scan when building CSS module exports source maps. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21109](https://github.com/webpack/webpack/pull/21109)) - Compute CSS comment source locations lazily. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21109](https://github.com/webpack/webpack/pull/21109)) - Support inline hash digest and length in CSS module `localIdentName` placeholders. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21259](https://github.com/webpack/webpack/pull/21259)) - Resolve full CSS escapes (including hex) in CSS-Modules names, so e.g. `\75 rl()` matches `url()`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21196](https://github.com/webpack/webpack/pull/21196)) - Reduce CSS parser CPU (hoisted per-call regexes, byte-compared `@container` pure-mode keywords) and stop retaining parsed comments on the reused parser instance between modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21202](https://github.com/webpack/webpack/pull/21202)) - Reduce CSS build time and memory usage. Per-export CSS dependencies are consolidated into one dependency per module, and hot-path allocations and lookups in CSS code generation and the module-graph cache are trimmed. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21114](https://github.com/webpack/webpack/pull/21114)) - Cache CSS public-path placeholder offsets per module source to avoid re-materializing and re-scanning the source on every render. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21054](https://github.com/webpack/webpack/pull/21054)) - Fix CSS tokenizer infinite loops and dropped tokens on malformed input. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21102](https://github.com/webpack/webpack/pull/21102)) - Speed up CSS identifier unescaping with bulk run flushing. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21109](https://github.com/webpack/webpack/pull/21109)) - Skip already-visited symlink targets when resolving context hashes so cyclic symlink graphs no longer overflow the queue. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21088](https://github.com/webpack/webpack/pull/21088)) - Resolve `DefinePlugin` access to an undefined object member as `undefined`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21040](https://github.com/webpack/webpack/pull/21040)) - Avoid materializing dependency source locations when sorting, keeping them lazy to reduce build time and memory. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21228](https://github.com/webpack/webpack/pull/21228)) - Speed up serialization deserialize by replacing a Buffer.isBuffer call with a typeof check. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21203](https://github.com/webpack/webpack/pull/21203)) - Emit assets with absolute target paths as-is to avoid invalid Windows paths. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21223](https://github.com/webpack/webpack/pull/21223)) - Add `output.environment.spread`, `output.environment.hasOwn`, and `output.environment.symbol`, and use method shorthand, spread, `Object.hasOwn`, and an unguarded `Symbol` in generated runtime code where the environment supports it. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21188](https://github.com/webpack/webpack/pull/21188)) - Drop the unused loadScript runtime from ESM hot-update bundles. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21208](https://github.com/webpack/webpack/pull/21208)) - Extend value binding optimization to export default expressions. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;21117](https://github.com/webpack/webpack/pull/21117)) - Reduce ExportInfo memory and cache size for inline-exports metadata. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21171](https://github.com/webpack/webpack/pull/21171)) - Resolve nested exports info paths iteratively to cut per-level array allocations. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21137](https://github.com/webpack/webpack/pull/21137)) - Fix stale incremental cache for css, html and asset/source/inline modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21108](https://github.com/webpack/webpack/pull/21108)) - CommonJS tree-shaking no longer drops exports accessed before a deferred require binding. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;21123](https://github.com/webpack/webpack/pull/21123)) - Make CSS-referenced asset available in lazy JS chunk during incremental rebuilds. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21100](https://github.com/webpack/webpack/pull/21100)) - Correct string/template import specifier parsing for filesystem cache build dependencies and fix module-sharing hostname validation. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21232](https://github.com/webpack/webpack/pull/21232)) - perf: guard isDeferred() behind experiments.deferImport in ConcatenatedModule (by [@&#8203;shashank-u03](https://github.com/shashank-u03) in [#&#8203;21096](https://github.com/webpack/webpack/pull/21096)) - Speed up deterministicGrouping and cached comparators on large builds. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21197](https://github.com/webpack/webpack/pull/21197)) - Reduce allocations on harmony/commonjs dependency hot paths. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21180](https://github.com/webpack/webpack/pull/21180)) - Force-load a module's new owning chunk during HMR when its only loaded chunk is removed from a runtime, so it keeps receiving updates. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21131](https://github.com/webpack/webpack/pull/21131)) - Fix HTML parser adoption agency to handle a `nobr` shielded by a marker. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21274](https://github.com/webpack/webpack/pull/21274)) - Expand HTML parser tag/attribute coverage and decode character references. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21159](https://github.com/webpack/webpack/pull/21159)) - Speed up and reduce allocations in the experimental HTML parser's tokenizer, tree builder, and entity decoder. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21152](https://github.com/webpack/webpack/pull/21152)) - Speed up the experimental HTML parser and reduce its memory usage. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21130](https://github.com/webpack/webpack/pull/21130)) - Avoid redundant HTML module work: reuse the dependency-template render across the JS and HTML code-generation passes, and memoize sentinel resolution/content hashing per source. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21054](https://github.com/webpack/webpack/pull/21054)) - Release inner-graph state after use and speed up inlined-export checks. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21167](https://github.com/webpack/webpack/pull/21167)) - Reduce JavascriptParser allocations on the walk hot path to speed up parsing and lower memory usage. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21139](https://github.com/webpack/webpack/pull/21139)) - Reduce CPU and memory overhead of the lazy barrel optimization. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21213](https://github.com/webpack/webpack/pull/21213)) - Keep the error message in module build errors on engines whose `Error.stack` omits it. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21239](https://github.com/webpack/webpack/pull/21239)) - Speed up module concatenation by caching repeated per-module computations. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21115](https://github.com/webpack/webpack/pull/21115)) - Move the `hot` flag from `Module` to `NormalModule`, where it's actually read and written. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21028](https://github.com/webpack/webpack/pull/21028)) - Move the `weak` flag from `Dependency` to `ModuleDependency`, where it's actually set. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21111](https://github.com/webpack/webpack/pull/21111)) - Avoid the entry IIFE for multiple inlined entry modules by renaming collisions. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21151](https://github.com/webpack/webpack/pull/21151)) - Reject `new import.defer(...)`/`new import.source(...)` with member access as a SyntaxError. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21211](https://github.com/webpack/webpack/pull/21211)) - Avoid `ProvidePlugin` injection for local CommonJS require bindings that use the same variable name. (by [@&#8203;fireairforce](https://github.com/fireairforce) in [#&#8203;21041](https://github.com/webpack/webpack/pull/21041)) - Resolve the global `new Worker(new URL(...))` to `worker_threads` on the `node` target. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21217](https://github.com/webpack/webpack/pull/21217)) - Use optional chaining in generated runtime code where the environment supports it. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21186](https://github.com/webpack/webpack/pull/21186)) - Allow output.path to be the filesystem root by treating EISDIR like EEXIST in mkdirp. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21223](https://github.com/webpack/webpack/pull/21223)) - Reduce memory by not retaining the source location object on every dependency. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21183](https://github.com/webpack/webpack/pull/21183)) - Keep the full exports object when a `require()` binding is re-exported. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21144](https://github.com/webpack/webpack/pull/21144)) - Replace glob-to-regexp dependency with watchpack's globToRegExp utility. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21176](https://github.com/webpack/webpack/pull/21176)) - Shrink the persistent cache: add a NULL_AND_I16 binary tier and inline tiny strings instead of larger far back-references. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;21210](https://github.com/webpack/webpack/pull/21210)) - Type serializer read/write contexts with positional tuples and fix a ProvideSharedDependency version/request swap. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21201](https://github.com/webpack/webpack/pull/21201)) - Speed up buildChunkGraph by deriving block modules from the first runtime. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21166](https://github.com/webpack/webpack/pull/21166)) - Cache re-export target resolution in SideEffectsFlagPlugin for faster builds. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21085](https://github.com/webpack/webpack/pull/21085)) - Skip pure single-star passthrough modules for `export *` re-exports. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21085](https://github.com/webpack/webpack/pull/21085)) - Skip dependency error/warning reporting for unchanged modules on rebuilds. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21154](https://github.com/webpack/webpack/pull/21154)) - Use value descriptors instead of getters for const export bindings. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;21021](https://github.com/webpack/webpack/pull/21021)) - Apply CSS hot updates on the Node side of a universal target. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21217](https://github.com/webpack/webpack/pull/21217)) - Guard CSS `style` export-type injection so it no-ops when there is no `document`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21193](https://github.com/webpack/webpack/pull/21193)) - Avoid building warning stats objects when counting warnings without a filter. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21198](https://github.com/webpack/webpack/pull/21198)) - Recognize forward-slash Windows absolute paths (e.g. C:/dir) consistently. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21223](https://github.com/webpack/webpack/pull/21223)) ### [`v5.107.2`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51072) [Compare Source](https://github.com/webpack/webpack/compare/v5.107.1...v5.107.2) ##### Patch Changes - Reduce per-file overhead in `ContextModuleFactory.resolveDependencies` by batching `alternativeRequests` hook calls. Previously the hook was invoked once per file in the context (with a single-item array), paying per-call overhead (closure allocation, `resolverFactory.get`, intermediate arrays in `RequireContextPlugin`) for every file. The hook is now invoked once per directory with all matched files in one batch — `RequireContextPlugin`'s tap already iterates the items array, so the output is unchanged. Steady-state rebuild on a 4000-file `require.context` drops a further \~15 ms (after the watch-mode purge fix in the same release). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21020](https://github.com/webpack/webpack/pull/21020)) - Include each external info's `runtimeCondition` in `ConcatenatedModule#updateHash` so changes to a concatenated external's runtime condition invalidate persistent caches instead of slipping through with the module id alone. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21023](https://github.com/webpack/webpack/pull/21023)) - Fix HTML `[contenthash]` for referenced asset and inline-style URL changes. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21018](https://github.com/webpack/webpack/pull/21018)) - Resolve chunk-hash placeholders in chunk URLs embedded into extracted HTML. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21018](https://github.com/webpack/webpack/pull/21018)) - Remove unnecessary `__webpack_require__` runtime helpers in ESM library output with multi-module chunks. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;21032](https://github.com/webpack/webpack/pull/21032)) - Rewrite `NormalModule#getSideEffectsConnectionState` walk as an allocation-light iterative loop instead of a generator trampoline, restoring rebuild performance lost in [#&#8203;20993](https://github.com/webpack/webpack/issues/20993) while keeping deep import chains stack-safe. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21014](https://github.com/webpack/webpack/pull/21014)) - Fix runtime `ReferenceError` on the first activation of a lazy-compiled module when `output.library.type` produces a closure-wrapped bundle (`umd`, `umd2`, `amd`, `amd-require`, `system`). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21013](https://github.com/webpack/webpack/pull/21013)) External modules of these types reference closure-bound identifiers like `__WEBPACK_EXTERNAL_MODULE_react__`, supplied by the library wrapper that is generated once per chunk. When `lazyCompilation` activates an entry or import for the first time, any external dependency the lazily-built module pulls in arrives in a hot-update chunk that lives outside the original wrapper closure, so its factory body cannot resolve the closure identifier and only a manual page refresh recovers. The inactive `LazyCompilationProxyModule` now declares statically-enumerable externals (string and object forms of `externals`) as its own dependencies, so the initial entry chunk's library wrapper already exposes their closure identifiers. When activation later pulls in those externals through the lazily-compiled module, they resolve to the already-installed factories instead of throwing. Function and RegExp externals are not pre-populated because their effective request set isn't knowable up front. - Fill in missing `entryOptions` when an async block joins an existing entrypoint. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21026](https://github.com/webpack/webpack/pull/21026)) - Release per-child `codeGenerationResults` in `MultiCompiler` and at `Compiler.close` to reduce memory retention. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21015](https://github.com/webpack/webpack/pull/21015)) - Reduce peak memory of `SourceMapDevToolPlugin` on large builds (closes [#&#8203;20961](https://github.com/webpack/webpack/issues/20961)). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20963](https://github.com/webpack/webpack/pull/20963)) - Fix slow `require.context()` / dynamic `import()` rebuilds in watch mode ([#&#8203;13636](https://github.com/webpack/webpack/issues/13636)). When a file inside a watched context directory changed, `NodeWatchFileSystem` would call `inputFileSystem.purge(contextDir)`. The enhanced-resolve `purge` implementation matches cache keys with `key.startsWith(contextDir)`, so the stat cache of every file under the directory was discarded on every rebuild — `ContextModuleFactory.resolveDependencies` then re-`stat`-ed the whole tree on each rebuild. Single-file rebuilds on a 4000-file context now reuse the warm stat cache, dropping median rebuild from \~1260 ms to \~650 ms in a local reproduction (≈49%). For directory items that are explicitly watched contexts, `purge` is now called with `{ exact: true }` (added in `enhanced-resolve@5.22.0`) so only the directory's own entry is invalidated; file-level changes in the same aggregated event continue to purge file stats and the parent `readdir` as before. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21020](https://github.com/webpack/webpack/pull/21020)) ### [`v5.107.1`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51071) [Compare Source](https://github.com/webpack/webpack/compare/v5.107.0...v5.107.1) ##### Patch Changes - Align the experimental HTML tokenizer with the WHATWG spec: fix offset-range bugs in the script-data, content-mode end-tag, attribute-value, and EOF states; surface tokenizer parse errors to consumers via a new `parseError` callback (`"warning"` when the tokenizer recovers and the emitted token is still well-formed, `"error"` when the offset range is incomplete — e.g. `eof-in-tag`); and add the full WHATWG named character references table so `decodeHtmlEntities` handles all named entities (including legacy bare forms like `&AMP` and multi-code-point entities like `&NotEqualTilde;`) with proper longest-prefix backtracking. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21000](https://github.com/webpack/webpack/pull/21000)) - Tree-shake CommonJS modules imported through a `const NAME = require(LITERAL)` binding when only static members of `NAME` are read. Previously webpack treated every export of such modules as referenced (because the bare `require()` dependency reports `EXPORTS_OBJECT_REFERENCED`), so unused `exports.x = ...` assignments remained in the bundle even with `usedExports` enabled. The parser now forwards `NAME.x` / `NAME.x()` / `NAME["x"]` accesses to the underlying `CommonJsRequireDependency` as referenced exports, falling back to the full exports object the moment `NAME` is read in any other context (passed by value, destructured later, accessed with a dynamic key, …). This brings the binding form to parity with the existing destructuring form (`const { x } = require(...)`). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21003](https://github.com/webpack/webpack/pull/21003)) - Fix `RangeError: Maximum call stack size exceeded` thrown from `HarmonyImportSideEffectDependency.getModuleEvaluationSideEffectsState` on long linear chains of side-effect-free imports. `NormalModule.getSideEffectsConnectionState` previously descended through `HarmonyImportSideEffectDependency.getModuleEvaluationSideEffectsState` recursively, adding two stack frames per module, which overflowed V8's stack at a few thousand modules deep. The traversal is now iterative. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20993](https://github.com/webpack/webpack/pull/20993)) - Fix `NormalModuleFactory` parser/generator types: (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20999](https://github.com/webpack/webpack/pull/20999)) - `module.generator.html` now uses `HtmlGeneratorOptions` instead of `EmptyGeneratorOptions` (the `extract` option was hidden from the `createGenerator` / `generator` hook types). - WebAssembly (`webassembly/async`, `webassembly/sync`) generator hooks now use `EmptyGeneratorOptions` instead of `EmptyParserOptions`. - `NormalModuleFactory#getParser` / `createParser` / `getGenerator` / `createGenerator` are now generic over the module-type string, returning the specific parser/generator class for known types (e.g. `JavascriptParser` for `"javascript/auto"`, `CssGenerator` for `"css"`, etc.) instead of always returning the base `Parser` / `Generator`. - `NormalModuleCreateData` is now generic over the module type so `parser`, `parserOptions`, `generator`, and `generatorOptions` are narrowed to the specific class / options for the given `type`. - Link import bindings used inside `define(...)` callbacks in ES modules. Previously, `HarmonyDetectionParserPlugin` skipped walking the arguments of `define` calls in harmony modules, so references to imported bindings inside an inline AMD `define` factory (e.g. `define(function () { console.log(foo); })`) were not rewritten to their imported references and could cause `ReferenceError` at runtime. Inner graph usage analysis is also fixed for the related pattern `const fn = function () { foo; }; define(fn);`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20990](https://github.com/webpack/webpack/pull/20990)) - HTML-entry pipeline (`experiments.html` + `experiments.css`): emit `<link rel="stylesheet">` tags for CSS chunks reachable from a `<script src>` entry. Previously when the bundled JS imported CSS, the resulting `.css` file was emitted to disk but never referenced from the extracted HTML (no `<link>` tag), and when `splitChunks` extracted CSS into sibling chunks the HTML cloned the originating `<script>` for each one — producing `<script src="style.js">` pointing at non-existent JS filenames instead of `<link rel="stylesheet" href="style.css">`. CSS chunks are now sorted by the entrypoint's module post-order index so the `<link>` tags also appear in source import order, fixing the cascade ordering issue documented in `html-webpack-plugin#1838` and `webpack/mini-css-extract-plugin#959` for HTML-entry builds. `nonce`/`crossorigin`/`referrerpolicy` are copied from the originating tag onto the emitted `<link>`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21002](https://github.com/webpack/webpack/pull/21002)) - Allow `devtool` and `SourceMapDevToolPlugin` (or multiple `SourceMapDevToolPlugin` instances) to coexist on the same asset. Previously the second instance would silently skip any asset whose `info.related.sourceMap` had already been set by an earlier instance, and even when it ran the asset had been rewrapped as a `RawSource` so no source map could be recovered — producing an empty `.map` file. The plugin now keeps a per-compilation stash of pristine source maps, namespaces its persistent cache entries by the options that affect output, and appends additional `related.sourceMap` entries instead of overwriting them. The classic workaround of pairing `devtool: 'hidden-source-map'` with a `new webpack.SourceMapDevToolPlugin({ filename: '[file].secondary.map', noSources: true })` now produces both maps in a single build. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21001](https://github.com/webpack/webpack/pull/21001)) - Narrow `TemplatePathFn` callback types by context. `pathData.chunk` is now non-optional for chunk filename callbacks (`output.filename`, `chunkFilename`, `cssFilename`, `cssChunkFilename`, `htmlFilename`, `htmlChunkFilename`, `optimization.splitChunks.cacheGroups[*].filename`), and `pathData.module` is non-optional for module filename callbacks (`output.assetModuleFilename`, per-module `generator.filename` / `generator.outputPath`, `module.parser.css.localIdentName`). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20987](https://github.com/webpack/webpack/pull/20987)) - Tighten the `CreateData` typedef in `NormalModuleFactory`. `CreateData` now represents the fully-populated value passed to the `createModule`, `module`, and `createModuleClass` hooks (`NormalModuleCreateData & { settings: ModuleSettings }`), while `ResolveData.createData` is typed as `Partial<CreateData>` to reflect the empty initial state. Plugins tapping those hooks no longer need to cast individual fields away from optional. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20992](https://github.com/webpack/webpack/pull/20992)) - Stop `webpackPrefetch` / `webpackPreload` magic comments from leaking across `import()` call sites that share a `webpackChunkName`. When two imports targeted the same named chunk and only one of them set `webpackPrefetch: true`, the prefetch directive was applied from every parent chunk that referenced the named chunk. Prefetch and preload orders are now resolved per `import()` call site instead of from the shared chunk group's accumulated options. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20994](https://github.com/webpack/webpack/pull/20994)) - Fix `[fullhash:N]` and `[hash:N]` (with length suffix) in `output.publicPath` not being interpolated at runtime. The detection regex in `RuntimePlugin` only matched `[fullhash]` / `[hash]` without a length suffix, so the `PublicPathRuntimeModule` was not flagged as a full-hash module and `__webpack_require__.p` was emitted with the placeholder `XXXX` left in place (e.g. `out/XXXX/`) instead of the real hash truncated to the requested length. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;21004](https://github.com/webpack/webpack/pull/21004)) - Re-export `ModuleNotFoundError` from `webpack/lib/ModuleNotFoundError` for backward compatibility with old plugins that import it from that path. This re-export will be removed in webpack 6. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20988](https://github.com/webpack/webpack/pull/20988)) ### [`v5.107.0`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51070) [Compare Source](https://github.com/webpack/webpack/compare/v5.106.2...v5.107.0) ##### Minor Changes - Add `module.generator.javascript.anonymousDefaultExportName` option to control whether webpack sets `.name` to `"default"` for anonymous default export functions and classes per ES spec. Defaults to `true` for applications and `false` for libraries (when `output.library` is set) to avoid unnecessary bundle size overhead. Also extract anonymous default export `.name` fix-up into a shared runtime helper (`__webpack_require__.dn`), replacing repeated inline `Object.defineProperty` / `Object.getOwnPropertyDescriptor` calls with a single short call per module to reduce output size. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20894](https://github.com/webpack/webpack/pull/20894)) - Support module concatenation (scope hoisting) for CSS modules with `text`, `css-style-sheet`, `style`, and `link` export types (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20851](https://github.com/webpack/webpack/pull/20851)) - The `generator.exportsConvention` function form for CSS modules now accepts `string[]` in addition to `string`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20914](https://github.com/webpack/webpack/pull/20914)) - Add `linkInsert` hook to `CssLoadingRuntimeModule.getCompilationHooks(compilation)` so plugin developers can control where stylesheet `<link>` elements are inserted into the document. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20947](https://github.com/webpack/webpack/pull/20947)) - Add `CssModulesPlugin.getCompilationHooks(compilation).orderModules` hook. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20978](https://github.com/webpack/webpack/pull/20978)) - Add a `pure` parser option for `css/module` and `css/auto` types matching `postcss-modules-local-by-default`'s pure mode: every selector must contain at least one local class or id, otherwise webpack emits a build error. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20946](https://github.com/webpack/webpack/pull/20946)) - Support CSS Modules `@value` identifiers as `@import` URLs and inside `url()` functions, e.g. `@value path: "./other.css"; @import path;` and `@value bg: "./image.png"; .a { background: url(bg); }` (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20925](https://github.com/webpack/webpack/pull/20925)) - Add experimental TypeScript support via `experiments.typescript: true` (auto-enabled by `experiments.futureDefaults`). Uses Node.js's built-in `module.stripTypeScriptTypes` (Node.js >= 22.6 with the stable `mode: "strip"` API, including Node.js 26) to transform `.ts`, `.cts`, `.mts`, `data:text/typescript`, and `data:application/typescript` modules — no type checking, only erasable TypeScript (types, generics, `import type`, casts). `.tsx`/JSX and non-erasable syntax (`enum`, `namespace`, parameter-property constructors, decorator metadata) are NOT supported; use a TSX-capable loader (e.g. `ts-loader`, `swc-loader`) for those. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20964](https://github.com/webpack/webpack/pull/20964)) - Added an `experiments.html` flag that reserves the `html` module type for the first-class HTML entry-point support. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;20902](https://github.com/webpack/webpack/pull/20902)) - Preserve `defer` / `source` import phase keywords on external dependencies in ESM output, the same way import attributes are preserved. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20934](https://github.com/webpack/webpack/pull/20934)) - Support the `#__NO_SIDE_EFFECTS__` annotation to mark functions as pure for better tree-shaking. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;20775](https://github.com/webpack/webpack/pull/20775)) - Add `module.generator.html.extract` for HTML modules and the matching `output.htmlFilename` / `output.htmlChunkFilename` filename templates (defaults derived from `output.filename` / `output.chunkFilename` with `.js` swapped for `.html`, mirroring the CSS pipeline). When extraction is on, the parsed and URL-rewritten HTML is emitted as a standalone `.html` output file alongside the module's JavaScript export. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20979](https://github.com/webpack/webpack/pull/20979)) - Add `"module-sync"` to default `conditionNames` for resolver defaults to align with Node.js, which exposes the `module-sync` community condition for synchronously-loadable ESM. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20933](https://github.com/webpack/webpack/pull/20933)) ##### Patch Changes - Fix CSS modules `composes` so `composes: foo from "./self.module.css"` from inside `self.module.css` no longer creates a duplicate module instance. Fix CSS modules `composes` parsing so `local()` and `global()` function wrappers are tracked per class name. Fix CSS modules `composes: ... from "<file>"` so the composed files load in an order consistent with every rule's local composes order, instead of source first-appearance order. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20929](https://github.com/webpack/webpack/pull/20929)) - Avoid emitting the `__webpack_require__` runtime in CSS bundles when all imported CSS modules were concatenated into the same scope. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20936](https://github.com/webpack/webpack/pull/20936)) - Recompute the CSS chunk's `[contenthash]` and the rendered CSS bytes when an asset referenced by `url()`/`src()`/string in CSS changes its hashed filename. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20938](https://github.com/webpack/webpack/pull/20938)) - Embed an inline `sourceMappingURL` data URI inside the CSS when the `parser.exportType` option are `text`, `style`, or `css-style-sheet`. Also merge `@import`ed CSS at build time for `text` and `css-style-sheet` exportTypes so the bundle ships a single accurate inline source map covering every contributing file. Map each generated CSS-module class export line in the JS bundle back to its selector position in the original CSS file (e.g. `btn: "..."` → `.btn { ... }`). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20886](https://github.com/webpack/webpack/pull/20886)) - Fix CSS modules deduplication so a `.module.<ext>` file imported both directly (JS) and via icss (`composes from` / `:import`) becomes a single module instance. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20929](https://github.com/webpack/webpack/pull/20929)) - Preserve `@charset` at-rule when CSS modules use `exportType: "text"`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20912](https://github.com/webpack/webpack/pull/20912)) - Resolve `[hash]`/`[fullhash]` placeholders in `output.publicPath` when generating `url()` references for `experiments.css`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20879](https://github.com/webpack/webpack/pull/20879)) - Fix HMR for concatenated CSS modules with `style` exportType by using stable per-module identifiers for injected style elements and tracking inner module IDs of concatenated modules in HMR records (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20911](https://github.com/webpack/webpack/pull/20911)) - Fix CSS Modules `@value` resolution when the same local name is imported from multiple modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20940](https://github.com/webpack/webpack/pull/20940)) - Fix `typeof ns.default` / `ns.default instanceof X` on a static `import defer * as ns from "./mod"` for `default-only` and `default-with-named` external modules under `optimization.concatenateModules`. The concatenated-module rewrite was collapsing `ns.default` to the deferred-namespace proxy itself instead of routing through the optimized `.a` getter (which lazily evaluates the module and returns its default value), so `typeof ns.default` observed `"object"` (the proxy) rather than the type of the default. The `dynamic` exportsType already used `.a` correctly; default-only and default-with-named now match. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20910](https://github.com/webpack/webpack/pull/20910)) - Make `import defer * as ns` more spec-compliant: `ns.x = value` no longer triggers module evaluation (per the TC39 import-defer `[[Set]]` algorithm), and the deferred namespace is now a distinct object from the eager namespace, with the same Deferred Module Namespace Exotic Object shared across defer-import call sites for the same module. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20913](https://github.com/webpack/webpack/pull/20913)) - Fixed spec deviations in the deferred namespace object returned by `__webpack_require__.z` (`import defer * as ns` / `import.defer(...)`). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20910](https://github.com/webpack/webpack/pull/20910)) - Drop the `__webpack_require__`, `__webpack_require__.d`, and `__webpack_require__.o` runtime helpers from `library: { type: "module" }` bundles when the on-demand exports source they were emitted for ends up dropped (e.g. a single concatenated entry without an IIFE). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20901](https://github.com/webpack/webpack/pull/20901)) - Resolve the static specifier of a dynamic `import()` whose argument is a side-effect-free `SequenceExpression`, e.g. `import((1, 0, "./mod.js"))` is now treated the same as `import("./mod.js")` instead of being rejected as unresolvable. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20917](https://github.com/webpack/webpack/pull/20917)) - Stable shared module ids and runtime-chunk emission order. (by [@&#8203;imccausl](https://github.com/imccausl) in [#&#8203;20860](https://github.com/webpack/webpack/pull/20860)) - Fix snapshot validity check for context dependencies in watch mode by treating watchpack's existence-only entries (`{}`) as cache misses. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20916](https://github.com/webpack/webpack/pull/20916)) - Support no-expression template literals in computed member access (e.g. ``import.meta[`url`]``). (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20889](https://github.com/webpack/webpack/pull/20889)) - Improve tree-shaking in `isPure`: handle more expression types (`ArrayExpression`, `ObjectExpression`, `NewExpression`, `ChainExpression`, `UnaryExpression` (safe operators), `MetaProperty`, `TaggedTemplateExpression`, `BinaryExpression` (strict equality)), prevent `/*#__PURE__*/` comments from leaking across `ObjectExpression` properties, and detect PURE comments inside `TemplateLiteral` interpolations. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20723](https://github.com/webpack/webpack/pull/20723)) - Reject `new import.defer(...)` and `new import.source(...)` as a parse-time `SyntaxError`, matching the spec — `ImportCall` is a `CallExpression` and is not a valid operand of `new`. Parenthesized forms (`new (import.defer(...))`) remain valid and continue to throw `TypeError` at runtime as before. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20917](https://github.com/webpack/webpack/pull/20917)) - Escape `#` characters that appear inside a path-shaped request's directory portion before passing the request to the resolver, so projects located in directories like `/home/user/proj#1` (and tools like webpack-dev-server that build entry requests with query strings) resolve correctly. The escape only kicks in when the request contains both a `#` in the path portion and a `?` query string — paths without a query keep their existing semantics. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20980](https://github.com/webpack/webpack/pull/20980)) - Silence unhandled rejection from the prefetch trigger when chunk loading fails. The `ensureChunkHandlers.prefetch` runtime created `Promise.all(promises).then(...)` whose result is discarded by `__webpack_require__.e`. If chunk loading rejected (e.g. `chunkLoadTimeout`), that dangling chain produced an unhandled rejection. Prefetch is best-effort, so a no-op rejection handler is now attached. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20898](https://github.com/webpack/webpack/pull/20898)) - Align `require()` of an ES module with Node.js's [`require(esm)`](https://nodejs.org/docs/latest/api/modules.html#loading-ecmascript-modules-using-require) `"module.exports"` named-export convention. When CommonJS `require()` resolves to an ES module that exports a binding with the literal string name `"module.exports"` (e.g. `export { value as "module.exports" }`), `require()` now returns the value of that export instead of the module's namespace object — matching Node.js v22.12+/v23+ behavior and easing migration of dual ESM/CJS libraries that rely on `module.exports = …`. The unwrap applies to plain `require()`, `require().foo`, calls (`require()(…)`), destructuring, and to CJS wrappers like `module.exports = require(esm)` / `exports.x = require(esm)`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20981](https://github.com/webpack/webpack/pull/20981)) - Remove outdated `@types/eslint-scope` package from dependencies. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20869](https://github.com/webpack/webpack/pull/20869)) - Fix `export *` resolution when a star-reexported module re-exports a name back to the importer cyclically. Previously, in a graph where `a` does `export * from "./b"; export * from "./c";` and `b` does `export { foo } from "./a";` while `c` provides the actual `foo` binding, webpack hoisted `foo` from `b` into `a`'s namespace without per-name cycle detection — emitting a getter chain (`a.foo` → `b.foo` → `a.foo`) that threw "Maximum call stack size exceeded" at runtime. The TC39 `ResolveExport` algorithm requires the cyclic branch to return null and the star loop to fall through to the non-cyclic source. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20959](https://github.com/webpack/webpack/pull/20959)) - Preserve `using` declaration initializers when the inner graph optimization is enabled. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;20906](https://github.com/webpack/webpack/pull/20906)) - Fixed typescript types. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20880](https://github.com/webpack/webpack/pull/20880)) - Bump `webpack-sources` to `^3.4.1` and feed asset bytes into hashes via the new `Source.prototype.buffers()` API. For large `ConcatSource`/`ReplaceSource` outputs this avoids the intermediate `Buffer.concat` that `source.buffer()` performs, removing a peak-memory spike equal to the source's total size on each hashed asset (`AssetGenerator.getFullContentHash`, `CssIcssExportDependency` content hashing, and `RealContentHashPlugin`). A small benchmark on a 64 MiB `ConcatSource` shows \~64 MiB lower peak external memory and \~45% faster hashing. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20897](https://github.com/webpack/webpack/pull/20897)) ### [`v5.106.2`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51062) [Compare Source](https://github.com/webpack/webpack/compare/v5.106.1...v5.106.2) ##### Patch Changes - CSS [@&#8203;import](https://github.com/import) now inherits the parent module's exportType, so a file configured as "text" correctly creates a style tag when [@&#8203;imported](https://github.com/imported) by a "style" parent. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20838](https://github.com/webpack/webpack/pull/20838)) - Make asset modules available in JS context when referenced from both CSS and a lazily compiled JS chunk. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20801](https://github.com/webpack/webpack/pull/20801)) - Include missing generator options in hash to ensure persistent cache invalidation when configuration changes (CssGenerator `exportsOnly`, JsonGenerator `JSONParse`, WebAssemblyGenerator `mangleImports`). (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20821](https://github.com/webpack/webpack/pull/20821)) - Fix `||` default value handling in ProgressPlugin and ManifestPlugin that incorrectly overrode user-provided falsy values (e.g. `modules: false`, `entries: false`, `entrypoints: false`). (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20823](https://github.com/webpack/webpack/pull/20823)) - Migrate from `mime-types` to `mime-db`. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20812](https://github.com/webpack/webpack/pull/20812)) - Handle `@charset` at-rules in CSS modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20831](https://github.com/webpack/webpack/pull/20831)) - Marked all experimental options in types. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20814](https://github.com/webpack/webpack/pull/20814)) ### [`v5.106.1`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51061) [Compare Source](https://github.com/webpack/webpack/compare/v5.106.0...v5.106.1) ##### Patch Changes - Fix two ES5-environment regressions in the anonymous default export `.name` fix-up: the generated code referenced an undeclared `__WEBPACK_DEFAULT_EXPORT__` binding causing `ReferenceError`, and used `Reflect.defineProperty` which is not available in pre-ES2015 runtimes. The fix-up now references the real assignment target and uses `Object.defineProperty` / `Object.getOwnPropertyDescriptor`. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20796](https://github.com/webpack/webpack/pull/20796)) - Prevent `!important` from being renamed as a local identifier in CSS modules. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20798](https://github.com/webpack/webpack/pull/20798)) - Use compiler context instead of module context for CSS modules local ident hashing to avoid hash collisions when files with the same name exist in different directories. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20799](https://github.com/webpack/webpack/pull/20799)) ### [`v5.106.0`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51060) [Compare Source](https://github.com/webpack/webpack/compare/v5.105.4...v5.106.0) ##### Minor Changes - Add `exportType: "style"` for CSS modules to inject styles into DOM via HTMLStyleElement, similar to style-loader functionality. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20579](https://github.com/webpack/webpack/pull/20579)) - Add `context` option support for VirtualUrlPlugin (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20449](https://github.com/webpack/webpack/pull/20449)) - The context for the virtual module. A string path. Defaults to 'auto', which will try to resolve the context from the module id. - Support custom context path for resolving relative imports in virtual modules - Add examples demonstrating context usage and filename customization - Generate different `CssModule` instances for different `exportType` values. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20590](https://github.com/webpack/webpack/pull/20590)) - Added the `localIdentHashFunction` option to configure the hash function to be used for hashing. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20694](https://github.com/webpack/webpack/pull/20694)) Additionally, the `localIdentName` option can now be a function. - Added support for destructuring assignment `require` in cjs, allowing for tree shaking. (by [@&#8203;ahabhgk](https://github.com/ahabhgk) in [#&#8203;20548](https://github.com/webpack/webpack/pull/20548)) - Added the `validate` option to enable/disable validation in webpack/plugins/loaders, also implemented API to make it inside plugins. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20275](https://github.com/webpack/webpack/pull/20275)) - Added `source` support for async WASM modules. (by [@&#8203;magic-akari](https://github.com/magic-akari) in [#&#8203;20364](https://github.com/webpack/webpack/pull/20364)) ##### Patch Changes - Add a static getSourceBasicTypes method to the Module class to prevent errors across multiple versions. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20614](https://github.com/webpack/webpack/pull/20614)) - Included fragment groups in the conflicting order warning for CSS. (by [@&#8203;aryanraj45](https://github.com/aryanraj45) in [#&#8203;20660](https://github.com/webpack/webpack/pull/20660)) - Avoid rendering unused top-level `__webpack_exports__` declaration when output ECMA module library. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;20669](https://github.com/webpack/webpack/pull/20669)) - Fixed resolving in CSS modules. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20771](https://github.com/webpack/webpack/pull/20771)) - Allow external modules place in async chunks when output ECMA module. (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;20662](https://github.com/webpack/webpack/pull/20662)) - Implement `deprecate` flag in schema for better TypeScript support to show which options are already deprecated by the configuration (by [@&#8203;bjohansebas](https://github.com/bjohansebas) in [#&#8203;20432](https://github.com/webpack/webpack/pull/20432)) - Set `.name` to `"default"` for anonymous default export functions and classes per ES spec (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20773](https://github.com/webpack/webpack/pull/20773)) - Hash entry chunks after runtime chunks to prevent stale content hash references in watch mode (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20724](https://github.com/webpack/webpack/pull/20724)) - Fix multiple bugs and optimizations in CSS modules: correct third code point position in walkCssTokens number detection, fix multiline CSS comment regex, fix swapped :import/:export error message, fix comma callback incorrectly popping balanced stack, fix cache comparison missing array length check, fix match.index mutation side effect, move publicPathAutoRegex to module scope, precompute merged callbacks in consumeUntil, simplify redundant ternary in CssGenerator, fix typo GRID_TEMPLATE_ARES, remove duplicate grid-column-start, and merge duplicate getCompilationHooks calls. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20648](https://github.com/webpack/webpack/pull/20648)) - Correct url() path resolution and preserve source maps for non-link CSS export types (style, text, css-style-sheet) (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20717](https://github.com/webpack/webpack/pull/20717)) - Emit error when proxy server returns non-200 status code in HttpUriPlugin instead of silently failing. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20646](https://github.com/webpack/webpack/pull/20646)) - `import.meta` as standalone expression now returns a complete object with known properties (`url`, `webpack`, `main`, `env`) instead of an empty object `({})`, and hoists it as a module-level variable to ensure `import.meta === import.meta` identity. In `preserve-unknown` mode (ESM output), the hoisted object merges runtime `import.meta` properties via `Object.assign`. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20658](https://github.com/webpack/webpack/pull/20658)) - Fix incorrect condition in FileSystemInfo that always evaluated to false, preventing trailing slash removal from directory paths during build dependency resolution. (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20649](https://github.com/webpack/webpack/pull/20649)) - fix: VirtualUrlPlugin absolute path virtual module IDs getting concatenated with compiler context (by [@&#8203;xiaoxiaojx](https://github.com/xiaoxiaojx) in [#&#8203;20656](https://github.com/webpack/webpack/pull/20656)) When a virtual module ID is an absolute path (e.g. `virtual:C:/project/user.js`), the auto-derived context was incorrectly joined with `compiler.context`, producing a concatenated path like `C:\cwd\C:\project`. Now absolute-path contexts are used directly. - All deprecated methods and options now have `@deprecated` flag in types. (by [@&#8203;alexander-akait](https://github.com/alexander-akait) in [#&#8203;20707](https://github.com/webpack/webpack/pull/20707)) - Fix `CompatibilityPlugin` to correctly rename `__webpack_require__` when it appears as an arrow function parameter (e.g. `(__webpack_module, __webpack_exports, __webpack_require__) => { ... }`). (by [@&#8203;hai-x](https://github.com/hai-x) in [#&#8203;20661](https://github.com/webpack/webpack/pull/20661)) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODkuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE5Ny4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
Update all dependencies
Some checks failed
renovate/artifacts Artifact file update failure
Check / build (pull_request) Failing after 1m2s
79046c025a
Author
Owner

⚠️ Artifact update problem

Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.

♻ Renovate will retry this branch, including artifacts, only when one of the following happens:

  • any of the package files in this branch needs updating, or
  • the branch becomes conflicted, or
  • you click the rebase/retry checkbox if found above, or
  • you rename this PR's title to start with "rebase!" to trigger it manually

The artifact failure details are included below:

File name: Cargo.lock
    Updating crates.io index
error: failed to select a version for the requirement `wasm-bindgen = "=0.2.114"`
candidate versions found which didn't match: 0.2.130
location searched: crates.io index
required by package `wasm-bindgen-test v0.3.64`
    ... which satisfies dependency `wasm-bindgen-test = "^0.3.64"` (locked to 0.3.64) of package `reconcile-text v0.14.1 (/tmp/renovate/repos/forgejo/andras/reconcile)`

### ⚠️ Artifact update problem Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is. ♻ Renovate will retry this branch, including artifacts, only when one of the following happens: - any of the package files in this branch needs updating, or - the branch becomes conflicted, or - you click the rebase/retry checkbox if found above, or - you rename this PR's title to start with "rebase!" to trigger it manually The artifact failure details are included below: ##### File name: Cargo.lock ``` Updating crates.io index error: failed to select a version for the requirement `wasm-bindgen = "=0.2.114"` candidate versions found which didn't match: 0.2.130 location searched: crates.io index required by package `wasm-bindgen-test v0.3.64` ... which satisfies dependency `wasm-bindgen-test = "^0.3.64"` (locked to 0.3.64) of package `reconcile-text v0.14.1 (/tmp/renovate/repos/forgejo/andras/reconcile)` ```
andras force-pushed renovate/all from 79046c025a
Some checks failed
renovate/artifacts Artifact file update failure
Check / build (pull_request) Failing after 1m2s
to d5cd8ff7f6
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 27s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
2026-10-30 01:04:24 +00:00
Compare
andras force-pushed renovate/all from d5cd8ff7f6
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 27s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
to 77876d8681
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 27s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
2026-10-30 13:25:22 +00:00
Compare
andras force-pushed renovate/all from 77876d8681
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 27s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
to 877e8bc996
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m33s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
2026-10-30 17:51:36 +00:00
Compare
andras changed title from Update all dependencies to Update all non-major dependencies 2026-10-30 17:51:40 +00:00
andras force-pushed renovate/all from 877e8bc996
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m33s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
to 15eab16e67
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m37s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
2026-10-31 00:04:03 +00:00
Compare
andras force-pushed renovate/all from 15eab16e67
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m37s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
to 79b929e138
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m37s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
2026-10-31 18:42:42 +00:00
Compare
andras force-pushed renovate/all from 79b929e138
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m37s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
to 78a2d401fe
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m43s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
2026-11-01 00:53:34 +00:00
Compare
andras force-pushed renovate/all from 78a2d401fe
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m43s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
to 20704f6526
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m42s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
2026-11-02 20:14:25 +00:00
Compare
andras force-pushed renovate/all from 20704f6526
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m42s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
to ad5751095a
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m37s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
2026-11-03 02:25:42 +00:00
Compare
andras force-pushed renovate/all from ad5751095a
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m37s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
to 1435a2223e
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m33s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
2026-11-03 14:47:41 +00:00
Compare
Some checks failed
renovate/artifacts Artifact file update failure
Check and publish / build (pull_request) Failing after 1m33s
Check and publish / publish-crate (pull_request) Has been skipped
Check and publish / publish-pypi (pull_request) Has been skipped
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin "renovate/all:renovate/all"
git switch "renovate/all"

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch "main"
git merge --no-ff "renovate/all"
git switch "renovate/all"
git rebase "main"
git switch "main"
git merge --ff-only "renovate/all"
git switch "renovate/all"
git rebase "main"
git switch "main"
git merge --no-ff "renovate/all"
git switch "main"
git merge --squash "renovate/all"
git switch "main"
git merge --ff-only "renovate/all"
git switch "main"
git merge "renovate/all"
git push origin "main"
Sign in to join this conversation.
No description provided.