What’s New

rolldown

Developer Tools

rolldown release notes.

Latest v1.2.0 · by rolldownWebsiterolldown/rolldown

Changelog

v1.2.0

Added
  • Skip shipping factories for newly imported top-level modules in dev mode
  • Per-client ship map for HMR patch sizing in dev mode
  • Client-side HMR
  • Send a full-reload update to clients when a tsconfig changes
  • Treat import.meta['url'] and import.meta['ROLLUP_FILE_URL_*'] as side-effect free
  • Rewrite import.meta['url']
  • Add FILE_NOT_FOUND error
  • Treat import.meta.ROLLUP_FILE_URL_* as side-effect free
Fixed
  • Preserve unmapped boundaries during sourcemap composition
  • Use es instead of esm for [format] in *FileNames option for ESM format
  • Preserve coarse mappings during sourcemap composition
  • Support tsconfig paths with import.meta.glob in rolldown_plugin_vite_import_glob
  • Clear tsconfig caches for bare full builds in dev mode
  • Force a full rebuild when a tsconfig changes in dev mode
  • Treat rooted drive-less module ids as absolute in preserveModules naming
  • Rebuild when tsconfig files change in watch mode
  • Drop tsconfig-merged transform options on each rebuild in watch mode
  • Fix incorrect EMPTY_IMPORT_META warning for import.meta.ROLLUP_FILE_URL_* for CJS output
  • Rename CJS locals shadowing wrapped-ESM namespace objects in deconflict
  • Tree-shake destructured dynamic import namespace bindings
[1.2.0] - 2026-07-15
🚀 Features
  • dev: skip shipping factories for newly imported top-level modules (#10223) by @h-a-n-a
  • dev: per-client ship map for HMR patch sizing (#10208) by @h-a-n-a
  • dev: client-side HMR (#10164) by @h-a-n-a
  • dev: send a full-reload update to clients when a tsconfig changes (#10262) by @shulaoda
  • treat import.meta['url'] and import.meta['ROLLUP_FILE_URL_*'] as side-effect free (#10267) by @sapphi-red
  • rewrite import.meta['url'] (#10251) by @sapphi-red
  • add FILE_NOT_FOUND error (#10220) by @sapphi-red
  • treat import.meta.ROLLUP_FILE_URL_* as side-effect free (#10217) by @sapphi-red
🐛 Bug Fixes
  • sourcemap: preserve unmapped boundaries during composition (#10254) by @hyfdev
  • [format] in *FileNames option for ESM format should be es instead of esm (#10214) by @sapphi-red
  • sourcemap: preserve coarse mappings during composition (#10249) by @hyfdev
  • rolldown_plugin_vite_import_glob: support tsconfig paths with import.meta.glob (#10167) by @sapphi-red
  • dev: clear tsconfig caches for bare full builds (#10276) by @shulaoda
  • dev: force a full rebuild when a tsconfig changes (#10261) by @shulaoda
  • treat rooted drive-less module ids as absolute in preserveModules naming (#10235) by @IWANABETHATGUY
  • watch: rebuild when tsconfig files change (#10258) by @shulaoda
  • watch: drop tsconfig-merged transform options on each rebuild (#10257) by @shulaoda
  • incorrect EMPTY_IMPORT_META warning for import.meta.ROLLUP_FILE_URL_* for CJS output (#10221) by @sapphi-red
  • deconflict: rename CJS locals shadowing wrapped-ESM namespace objects (#9970) by @IWANABETHATGUY
  • rolldown: drop the unused runtime module after entry-level external flattening (#10237) by @IWANABETHATGUY
  • rolldown: re-propagate has_dynamic_exports to transitive star importers (#10239) by @IWANABETHATGUY
  • tree-shaking: tree-shake destructured dynamic import namespace bindings (#10213) by @logaretm
  • s390x: use json-escape-simd 3.1.1 for big-endian JSON escaping fix (#10211) by @satyamg1620
🚜 Refactor
  • dev: move full-reload to client side (#10207) by @h-a-n-a
  • readability follow-ups to the ReplaceWith migration (#10286) by @IWANABETHATGUY
  • replace take_in-then-write-back with ReplaceWith and by-value moves (#10285) by @Boshen
  • share the main resolver's cache with the transformer's tsconfig lookups (#10205) by @shulaoda
  • rolldown: extract the ns star-external __reExport emission rule into LinkingMetadata (#10238) by @IWANABETHATGUY
  • rolldown: unify link/generate diagnostics into a Diagnostics accumulator (#10234) by @IWANABETHATGUY
  • sourcemap_filenames: drop dead sourcemap-filename plumbing (#10189) by @IWANABETHATGUY
  • extract external import symbol merging into a method (#10224) by @IWANABETHATGUY
  • rolldown: skip CJS namespace merging under strict execution order (#10203) by @hyfdev
  • resolve the manual tsconfig per file instead of once at startup (#10200) by @shulaoda
  • rolldown: route interop ESM init emission through a shared init-target view (#10202) by @hyfdev
  • rolldown: collapse vestigial wrap-kind state and share chunk sort helper (#10201) by @hyfdev
📚 Documentation
  • show plugin kinds in JSDoc and each hook's description (#10218) by @sapphi-red
  • add an explanation about removing imports from external modules without any messages (#10215) by @sapphi-red
⚡ Performance
  • sourcemap: owned merge in SourceJoiner::join (4005->5 allocs/chunk) (#10250) by @Boshen
  • avoid redundant sourcemap string copies in collapse and minify paths (#10093) by @Boshen
🧪 Testing
  • code-splitting: establish strict-order review baselines (#10287) by @hyfdev
  • dev: add hot API test cases (#10181) by @h-a-n-a
  • code-splitting: normalize strict execution order variants (#10277) by @hyfdev
  • code-splitting: harden strict execution order coverage (#10252) by @hyfdev
  • code-splitting: add strict execution order regressions (#10253) by @hyfdev
⚙️ Miscellaneous Tasks
  • deps: update github actions (#10241) by @renovate[bot]
  • deps: update oxc to 0.140.0 (#10274) by @shulaoda
  • update Yunfei's GitHub username (#10275) by @hyfdev
  • deps: update napi (#10260) by @renovate[bot]
  • deps: update test262 submodule for tests (#10266) by @rolldown-guard[bot]
  • deps: update dependency vite-plus to v0.2.4 (#10256) by @renovate[bot]
  • deps: update napi (#10240) by @renovate[bot]
  • deps: update oxc resolver to v11.24.2 (#10245) by @renovate[bot]
  • deps: update rust crates (#10244) by @renovate[bot]
  • disable Renovate updates for idna_adapter (#10248) by @shulaoda
  • deps: update oxc resolver to v11.24.1 (#10232) by @renovate[bot]
  • deps: update rust crate oxc_sourcemap to v8.1.1 (#10233) by @renovate[bot]
  • deps: update dependency rolldown-plugin-dts to ^0.27.0 (#10206) by @renovate[bot]
  • deps: upgrade sugar_path to v3 (#10230) by @hyfdev
  • add dist-* to .gitignore in sourcemap-filenames/hash-final-content fixture (#10216) by @sapphi-red
  • deps: update dependency rust to v1.97.0 (#10209) by @renovate[bot]
❤️ New Contributors
  • @satyamg1620 made their first contribution in #10211

Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com

v1.1.5

Added
  • Detect top-level import-binding reads as execution-order sensitive
  • Add sourcemapFileNames option
  • Record plugin hook result kind in tracing spans
  • Skip side-effect-free modules in per-entry reachability
  • Add descriptive metadata to plugin API
  • Add --configLoader=native option
Fixed
  • Improve invalid annotation warnings
  • Keep deduplicated asset filenames stable once they can be observed
  • Use public option name in pattern errors for sourcemapFileNames
  • Hash prepared sourcemap content
  • Tree-shake unused circular declarators exported via export list
  • Don't panic when an HMR rebuild hits an unresolved import
  • Propagate errors from output.globals function
  • Revert cache mutations when a partial scan fails
  • Update importer relationships of cached modules in incremental build
  • Fall back to full reload when a changed module is not registered as executed
  • Follow entry facade edges in runtime placement cycle check
  • Ignore watcher events after close
  • Emit async wrapper for TLA modules under onDemandWrapping
  • Gate sideEffects:false modules' side effects on body demand
[1.1.5] - 2026-07-08
🚀 Features
  • detect top-level import-binding reads as execution-order sensitive (#10180) by @hyf0
  • sourcemap_filenames: add a sourcemapFileNames option (#9271) by @V1OL3TF0X
  • binding: record plugin hook result kind in tracing spans (#10154) by @IWANABETHATGUY
  • linking: skip side-effect-free modules in per-entry reachability (#10111) by @IWANABETHATGUY
  • improve error message for unresolved virtual imports (#10156) by @sapphi-red
  • add descriptive metadata to plugin API (#10106) by @sapphi-red
  • add --configLoader=native option (#10118) by @sapphi-red
🐛 Bug Fixes
  • improve invalid annotation warnings (#10185) by @hyf0
  • keep deduplicated asset filenames stable once they can be observed (#10191) by @shulaoda
  • sourcemap_filenames: use public option name in pattern errors (#10188) by @IWANABETHATGUY
  • sourcemap_filenames: hash prepared sourcemap content (#10178) by @hyf0
  • tree-shake unused circular declarators exported via export list (#10166) by @IWANABETHATGUY
  • dev: don't panic when an HMR rebuild hits an unresolved import (#10162) by @shulaoda
  • propagate errors from output.globals function (#9880) by @shulaoda
  • dev: revert cache mutations when a partial scan fails (#10110) by @shulaoda
  • dev: update importer relationships of cached modules in incremental build (#10107) by @shulaoda
  • hmr: fall back to full reload when a changed module is not registered as executed (#10132) by @shulaoda
  • chunk-optimizer: follow entry facade edges in runtime placement cycle check (#10101) by @hyf0
  • dev: ignore watcher events after close (#10113) by @hyf0
  • emit async wrapper for TLA modules under onDemandWrapping (#10086) by @IWANABETHATGUY
  • gate sideEffects:false modules' side effects on body demand (#10080) by @IWANABETHATGUY
  • rolldown_plugin_vite_resolve: return empty object for browser: false mapped modules (#10082) by @sapphi-red
  • reset the word-boundary state on newline in Hires::Boundary sourcemaps (#10025) by @shulaoda
  • trim an emptied chunk's outro/intro instead of skipping past it (#10029) by @shulaoda
  • test each edited chunk's own start against indent exclude ranges (#10026) by @shulaoda
  • preserve sourcemap mappings for indented lines when a CJS module shares the chunk (#10074) by @hyf0
🚜 Refactor
  • separate tree-shaking side effects from execution order sensitivity (#10168) by @hyf0
  • type construct_vite_preload_call to take an ObjectPattern (#10135) by @shulaoda
  • treeshake: single-source the own-export classification shared with the lazy-barrel loader (#10098) by @IWANABETHATGUY
  • dev: reuse Vite's bundledDev server (#10081) by @h-a-n-a
  • clippy: ban std HashMap/HashSet in favour of FxHashMap/FxHashSet (#10108) by @Boshen
  • treeshake: make body demand a second module bit instead of a stmt multimap (#10097) by @IWANABETHATGUY
  • seal used_symbol_refs by construction after its last writer (#10091) by @hyf0
  • treeshake: replace inclusion mutual recursion with a worklist engine (#10096) by @IWANABETHATGUY
  • treeshake: split include_statements.rs into focused modules (#10095) by @IWANABETHATGUY
  • drop redundant is_user_defined filter on partitioned entries (#10050) by @shulaoda
  • project the retained export interface out of used_symbol_refs (#10089) by @hyf0
  • track used external symbols separately from used_symbol_refs (#10088) by @hyf0
  • make module namespace inclusion an explicit linking metadata field (#10087) by @hyf0
  • rename statement evaluation metadata (#10078) by @hyf0
📚 Documentation
  • virtual modules user-facing id convention (#10155) by @sapphi-red
  • cli: clarify disabling boolean/object flags like codeSplitting (#10153) by @IWANABETHATGUY
  • chore: remove Vite+ alpha banner (#10105) by @mdong1909
  • write down the used_symbol_refs contract (#10090) by @hyf0
  • dev/lazy: update design and implementation (#10079) by @h-a-n-a
⚡ Performance
  • ast_scanner: stop order-sensitivity checks once a module is flagged (#10190) by @IWANABETHATGUY
  • return impl ExactSizeIterator from slice-backed accessors (#10133) by @Boshen
  • binding: box dev and watcher napi futures (#10103) by @Boshen
🧪 Testing
  • move string_wizard replace unit tests to the JS magic-string suite (#10176) by @IWANABETHATGUY
  • dev: assert incremental scan state matches a fresh full build after each HMR step (#10115) by @shulaoda
  • dev: restore runtime assertions of delete_file_not_used_anymore (#10112) by @shulaoda
  • dev: fix flaky dev server tests in CI (#10152) by @h-a-n-a
  • add regression test for #10099 (lazyBarrel drops default-import binding but keeps its property reads) (#10109) by @IWANABETHATGUY
⚙️ Miscellaneous Tasks
  • deploy website to Void via GitHub OIDC (#10192) by @Boshen
  • deps: update oxc to 0.139.0 (#10161) by @shulaoda
  • deps: update test262 submodule for tests (#10160) by @rolldown-guard[bot]
  • rolldown_plugin_utils: remove dead asset-url and css scaffolding (#10131) by @shulaoda
  • deps: revert vite-plus to v0.2.1 (#10148) by @shulaoda
  • deps: update github actions (#10141) by @renovate[bot]
  • deps: update dependency rust to v1.96.1 (#10145) by @renovate[bot]
  • deps: update npm packages (#10142) by @renovate[bot]
  • deps: update rust crates (#10143) by @renovate[bot]
  • deps: update napi to v3.10.3 (#10121) by @renovate[bot]
  • rolldown_utils: remove unused time module (#10138) by @shulaoda
  • remove dead CopyModulePlugin::is_active method (#10129) by @shulaoda
  • remove dead LazyCompilationContext::is_lazy_module method (#10128) by @shulaoda
  • remove dead BuildDiagnostic::downcast_ref method (#10127) by @shulaoda
  • deps: update dependency vite-plus to v0.2.2 (#10084) by @renovate[bot]
  • deps: update rust crate oxc_sourcemap to v8.1.0 (#10122) by @renovate[bot]
  • deps: update crate-ci/typos action to v1.48.0 (#10124) by @renovate[bot]
  • enable more clippy restriction lints (#10114) by @Boshen
  • deps: update rust dependencies (#10100) by @Boshen
  • deps: update oxc resolver to v11.23.0 (#10083) by @renovate[bot]
◀️ Revert
  • Revert "chore(deps): revert vite-plus to v0.2.1" (#10157) by @h-a-n-a
  • "fix(hmr): fall back to full reload when a changed module is not registered as executed (#10132)" (#10151) by @shulaoda
❤️ New Contributors
  • @V1OL3TF0X made their first contribution in #9271

Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com

v1.1.4

Changed
  • Disable experimental.lazyBarrel by default
Fixed
  • Disable lazy barrel in dev mode
  • Keep full JSON interface under preserveModules namespace
  • Serialize the KeepAssign unused minify option as keep_assign
  • Keep fragments after the newline fragment in MagicString::last_line
  • Generate undeclared JSON named exports under preserveModules
  • Deconflict rename CJS-wrapped locals that shadow chunk-root bindings
  • Keep entry facade when a shared chunk holds another entry's module
  • Treeshake also bail JSON default split when the object escapes
  • Don't classify await in a strict-mode function as top-level await
  • Avoid spurious leading newline in addon hooks
  • Handle JSON default mutation bailouts
  • Make init errors in lazy-compiled modules catchable
  • Treeshake keep computed-key side effects on namespace member access
  • Validate replace plugin delimiters length instead of panicking
  • Reconstruct nested rest patterns in into_expression
  • Reconstruct rest patterns as spread in into_expression
  • Preserve export keyword on multi-declarator exports under keepNames
  • Deterministically keep the shortest name for deduplicated assets
  • Treeshake apply @__NO_SIDE_EFFECTS__ to cross-chunk namespace calls
[1.1.4] - 2026-07-01
🚀 Features
  • disable experimental.lazyBarrel by default (#10071) by @shulaoda
🐛 Bug Fixes
  • dev: disable lazy barrel in dev mode (#10060) by @shulaoda
  • generate: keep full JSON interface under preserveModules namespa… (#10056) by @IWANABETHATGUY
  • check finalize_other_specifiers in its own Debug attribute (#10032) by @shulaoda
  • serialize the KeepAssign unused minify option as "keep_assign" (#10031) by @shulaoda
  • keep fragments after the newline fragment in MagicString::last_line (#10023) by @shulaoda
  • generate: undeclared JSON named exports under preserveModules (#10020) (#10027) by @IWANABETHATGUY
  • deconflict: rename CJS-wrapped locals that shadow chunk-root bindings (#9921) by @IWANABETHATGUY
  • rolldown: keep entry facade when a shared chunk holds another entry's module (#9997) by @hyf0
  • treeshake: also bail JSON default split when the object escapes (#9996) by @IWANABETHATGUY
  • don't classify await in a strict-mode function as top-level await (#9987) by @shulaoda
  • avoid spurious leading newline in addon hooks (banner/footer/intro/outro) (#9989) by @shulaoda
  • handle JSON default mutation bailouts (#9972) by @TheAlexLichter
  • plugin: make lazy hook metadata enumerable (#9991) by @TheAlexLichter
  • dev: make init errors in lazy-compiled modules catchable (#9981) by @h-a-n-a
  • treeshake: keep computed-key side effects on namespace member access (#9986) by @shulaoda
  • binding: validate replace plugin delimiters length instead of panicking (#9984) by @shulaoda
  • reconstruct nested rest patterns in into_expression (#9980) by @IWANABETHATGUY
  • reconstruct rest patterns as spread in into_expression (#9976) by @shulaoda
  • preserve export keyword on multi-declarator exports under keepNames (#9974) by @shulaoda
  • deterministically keep the shortest name for deduplicated assets (#9948) by @x1024
  • treeshake: apply @NO_SIDE_EFFECTS to cross-chunk namespace calls (#9960) by @IWANABETHATGUY
🚜 Refactor
  • drop redundant program scope enter/leave in finalizer (#10049) by @shulaoda
  • deconflict: extract collect_chunk_scope_captured_names (#10006) by @IWANABETHATGUY
  • unify pre-scan multi-declarator split into one decision site (#9982) by @IWANABETHATGUY
  • common: return bool from SymbolRef::is_not_reassigned (#9962) by @IWANABETHATGUY
📚 Documentation
  • rolldown: remove outdated comment for removing parenthesized expression (#10062) by @Dunqing
  • use GitHub-flavored alert for Etiquette note in contribution guide (#10012) by @IWANABETHATGUY
  • replace: explain the delimiters left and right boundaries (#9985) by @shulaoda
  • ast-mutation: remove stale Address Use section after pre-scan refactor (#9983) by @IWANABETHATGUY
  • remove fathom (#9968) by @mdong1909
  • contribution-guide: code-format main branch references (#9966) by @IWANABETHATGUY
  • contribution-guide: fix stale REPL note and tidy wording (#9957) by @hyf0
  • contribution-guide: clarify when to discuss before opening a PR (#9955) by @hyf0
⚡ Performance
  • disable preserve_parens across all parse paths (#10057) by @Dunqing
  • common: inline declared_symbols with SmallVec (#9920) by @IWANABETHATGUY
  • common: pack TaggedSymbolRef into 8 bytes (#9919) by @IWANABETHATGUY
  • sourcemap: skip newline scan on the no-sourcemap join fast path (#9936) by @Boshen
🧪 Testing
  • dev: error in lazy module should be catchable (#9975) by @sapphi-red
  • dev: reject unknown lazy compile modules (#9969) by @sapphi-red
⚙️ Miscellaneous Tasks
  • deps: update actions/cache action to v6 (#10001) by @renovate[bot]
  • trigger vite ecosystem-ci from PR comments (#10058) by @shulaoda
  • deps: update napi to v3.10.0 (#10063) by @renovate[bot]
  • remove unused From impl for RolldownLabelSpan (#10055) by @shulaoda
  • remove dead Diagnostic::with_kind method (#10054) by @shulaoda
  • remove unused StatementExt methods (#10053) by @shulaoda
  • remove unused ExpressionExt methods (#10052) by @shulaoda
  • remove commented-out re_export_all_names field (#10051) by @shulaoda
  • deps: update pnpm to v11.9.0 (#10047) by @renovate[bot]
  • remove the unused BindingGenerateHmrPatchReturn napi type (#10034) by @shulaoda
  • remove the dead inline_entry_chunk_wrapping scaffolding (#10037) by @shulaoda
  • deps: bump oxc_resolver to 11.22.0 (#10045) by @Boshen
  • remove never-constructed MatchImportKind::_Ignore variant (#10041) by @shulaoda
  • remove the unused ScheduledBuild napi struct (#10033) by @shulaoda
  • remove dead compute_hmr_update_single method (#10040) by @shulaoda
  • drop the redundant visited.insert in manual code splitting (#10038) by @shulaoda
  • remove the dead output_assets vector in render_chunk_to_assets (#10036) by @shulaoda
  • remove the unused From/Display impls for BindingLogLevel (#10035) by @shulaoda
  • deps: upgrade oxc to 0.138.0 and migrate to per-type AST construction (#10018) by @shulaoda
  • deps: update rust crates (#9911) by @renovate[bot]
  • deps: update test262 submodule for tests (#10016) by @rolldown-guard[bot]
  • deps: update github actions (#9999) by @renovate[bot]
  • deps: update npm packages (#10000) by @renovate[bot]
◀️ Revert
  • "fix(plugin): make lazy hook metadata enumerable (#9991)" (#10005) by @shulaoda
❤️ New Contributors
  • @x1024 made their first contribution in #9948

Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com

v1.1.3

Changed
  • Model ModuleId as a classified Path/Virtual/Bare enum in rolldown_common
  • Avoid allocation in default_sanitize_file_name for clean names
  • Box once-per-build futures before spawn_future in binding
  • Avoid wasted allocation in legitimize_identifier_name
Fixed
  • defer_drop crashes the browser main thread
  • Correct camel case for nested values
  • Display --help options in camelCase in CLI
  • Preserve used re-exports under preserveModules
  • Make watch close reentrant in event callbacks
  • Git for Windows treats symlink files as regular files
  • Cancel pending full reload on build error in dev
  • Pass plugin meta to codeSplitting groups name function in chunking
  • Serve assets emitted during HMR/lazy compile
  • Dry-run step no longer publishes binding packages in release
Removed
  • Remove unused LegacyModuleIdx
  • Remove unused StmtInfos::get_namespace_stmt_info
  • Remove unused Module::as_external_mut
  • Remove unused EcmaAst::is_body_empty
  • Remove dead is_css_module handling in resolve_dependencies
  • Remove redundant with_commonjs on cjs source type
[1.1.3] - 2026-06-24
🐛 Bug Fixes
  • defer_drop crashes the browser main thread (#9942) by @shulaoda
  • camel-case: correct camel case for nested values (#9933) by @kb019
  • cli: display --help options in camelCase (#9941) by @IWANABETHATGUY
  • preserve used re-exports under preserveModules (#9122) (#9934) by @IWANABETHATGUY
  • watch: make close reentrant in event callbacks (#9904) by @hyf0
  • git for windows treats symlink files as regular files (#9915) by @AliceLanniste
  • dev: cancel pending full reload on build error (#9903) by @h-a-n-a
  • chunking: pass plugin meta to codeSplitting groups name function (#9267) by @Kyujenius
  • dev: serve assets emitted during HMR/lazy compile (vite#22596) (#9815) by @h-a-n-a
  • release: dry-run step no longer publishes binding packages (#9866) by @Boshen
🚜 Refactor
  • rolldown_common: model ModuleId as a classified Path/Virtual/Bare enum (#9927) by @Boshen
  • remove unused LegacyModuleIdx (#9872) by @shulaoda
  • remove unused StmtInfos::get_namespace_stmt_info (#9870) by @shulaoda
  • remove unused Module::as_external_mut (#9871) by @shulaoda
  • remove unused EcmaAst::is_body_empty (#9869) by @shulaoda
  • drop dead is_css_module handling in resolve_dependencies (#9867) by @shulaoda
  • drop redundant with_commonjs on cjs source type (#9868) by @shulaoda
📚 Documentation
  • clarify on drafting PRs (#9952) by @h-a-n-a
  • update contribution guidelines (#9944) by @fubhy
  • note Rust crates don't follow semver in AGENTS.md (#9905) by @IWANABETHATGUY
  • add feedback form (#9159) by @TheAlexLichter
⚡ Performance
  • utils: avoid allocation in default_sanitize_file_name for clean names (#9928) by @Boshen
  • binding: box once-per-build futures before spawn_future (#9864) by @Boshen
  • utils: avoid wasted allocation in legitimize_identifier_name (#9926) by @Boshen
  • rolldown: fuse the canonical-name dedup and insert in the renamer (#9900) by @Boshen
  • rolldown: probe the name map once in ConflictResolver::resolve (#9899) by @Boshen
  • cut two heap allocations from wrapped ESM init finalize (#9901) by @Boshen
  • rolldown_plugin_vite_reporter: hoist invariant out_dir prefix out of reporter loop (#9873) by @shulaoda
  • drop throwaway Vec in wrapped esm init stmt (#9878) by @shulaoda
  • borrow owner_filename in build-import-analysis AddDeps (#9874) by @shulaoda
🧪 Testing
  • cover preserveModules named export via namespace re-export (#6010) (#9937) by @IWANABETHATGUY
⚙️ Miscellaneous Tasks
  • deps: update napi to v3.9.4 (#9954) by @shulaoda
  • reduce noise from CODEOWNERS for trival changes (#9953) by @h-a-n-a
  • deps: update mimalloc-safe to 0.1.64 (#9950) by @shulaoda
  • deps: update rollup submodule for tests to v4.62.2 (#9931) by @rolldown-guard[bot]
  • deps: test mimalloc-safe upstream-mimalloc switch in CI (#9930) by @shulaoda
  • rolldown_plugin_vite_build_import_analysis: remove unused v2 code path (#9917) by @shulaoda
  • rolldown_plugin_vite_manifest: remove unused is_enable_v2 code path (#9916) by @shulaoda
  • rolldown_plugin_vite_asset_import_meta_url: remove unexposed native vite plugin (#9896) by @shulaoda
  • rolldown_plugin_vite_asset: remove unexposed native vite plugin (#9895) by @shulaoda
  • rolldown_plugin_vite_css_post: remove unexposed native vite plugin (#9894) by @shulaoda
  • rolldown_plugin_vite_css: remove unexposed native vite plugin (#9893) by @shulaoda
  • rolldown_plugin_vite_html_inline_proxy: remove unexposed native vite plugin (#9892) by @shulaoda
  • rolldown_plugin_vite_html: remove unexposed native vite plugin (#9891) by @shulaoda
  • deps: update github actions (#9909) by @renovate[bot]
  • deps: update rust crate oxc_sourcemap to v8.0.2 (#9910) by @renovate[bot]
  • deps: update npm packages (#9912) by @renovate[bot]
  • deps: update github actions to v7 (#9913) by @renovate[bot]
  • deps: update rolldown-plugin-dts to ^0.26.0 (#9897) by @renovate[bot]
  • remove rolldown_filter_analyzer crate (#9865) by @Boshen
❤️ New Contributors
  • @fubhy made their first contribution in #9944

Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com

v1.1.2

Added
  • Add option names for invalid return type errors in more places
  • Infer decorator strictNullChecks from tsconfig in transform
  • Gate chrome-json trace layer behind chrome-tracing feature in tracing
  • Align test-dev-server with Vite dev server
Changed
  • Honor explicit non-TS extensions in tsconfig include, allowing compilerOptions.paths to resolve for importers whose extension is explicitly listed in include such as .vue and .svelte files
  • Auto-discovery no longer attaches the outermost ancestor tsconfig.json to files that no project owns, preventing aliases from leaking into unowned files
Fixed
  • Correct contradictory panic message in cjs cross-chunk symbol lookup
  • Preserve with clause on export * from external
  • Make external_import_binding_merger deterministic
  • Surface invalid manualCodeSplitting group test regex as an error
  • Avoid panic on output.file without a file name
  • Avoid O(N^2) rendering of high-volume diagnostics
  • Avoid panic on JSON numbers outside f64 range
  • Fix worker_threads segfault by bumping mimalloc-safe to 0.1.63
  • Cache ESM evaluation errors
  • Wrap node require helper in pure IIFE
  • Load locally-used imports on a re-exported record in lazy-barrel
  • Avoid dangling wrapped-ESM init call across chunks
  • Detect same-second rewrites in CI poll watcher in dev
  • Force rebuild after HMR errors in dev
[1.1.2] - 2026-06-18
📝 Notable tsconfig behavior changes

These ship via the oxc_resolver 11.21.3 bump (#9841) and affect resolve.tsconfigPaths (Vite 8 resolves through oxc-resolver):

  • Honor explicit non-TS extensions in include (oxc-project/oxc-resolver#1213). compilerOptions.paths now resolve for importers whose extension is explicitly listed in a tsconfig's include (e.g. src/**/*.vue, src/**/*.svelte). Previously oxc-resolver filtered importers by extension before evaluating the include globs, so a .vue/.svelte file listed in include never matched its project and its paths were skipped. This unblocks the default create-vite Vue + TS layout (a solution-style root plus a referenced tsconfig.app.json that declares paths and include: ["src/**/*.ts", "src/**/*.vue"]). Matches vue-tsc and svelte-check, which register these extensions via TypeScript's extraFileExtensions.
  • No fallback to the outermost tsconfig in auto-discovery (oxc-project/oxc-resolver#1220). Auto-discovery no longer attaches the topmost ancestor tsconfig.json to a file that no project actually owns (via files / include / project references). Previously such a file inherited the outermost ancestor's paths / baseUrl, leaking aliases into files that project does not own. oxc-resolver now returns no config in that case, matching tsserver / typescript-go, which route such files to an inferred project with no aliases.
🚀 Features
  • add option named for invalid return type errors for more places (#9846) by @shulaoda
  • add option names for invalid return type errors (#9821) by @sapphi-red
  • transform: infer decorator strictNullChecks from tsconfig (#9590) by @kylecannon
  • tracing: gate chrome-json trace layer behind chrome-tracing feature (#9773) by @hyf0
  • dev: align test-dev-server with Vite dev server (#9668) by @h-a-n-a
🐛 Bug Fixes
  • plugin_timings: point doc link to existing checks reference page (#9837) by @hyf0
  • generator: correct contradictory panic message in cjs cross-chunk symbol lookup (#9836) by @hyf0
  • esm: preserve with clause on export * from external (#9796) by @hyf0
  • Make external_import_binding_merger deterministic (#9755) by @naruaway
  • surface invalid manualCodeSplitting group test regex as an error (#9792) by @shulaoda
  • avoid panic on output.file without a file name (#9789) by @shulaoda
  • avoid O(N^2) rendering of high-volume diagnostics (#9748) (#9749) by @IWANABETHATGUY
  • avoid panic on JSON numbers outside f64 range (#9788) by @shulaoda
  • deps: bump mimalloc-safe to 0.1.63 to fix worker_threads segfault (#9785) by @shulaoda
  • cache ESM evaluation errors (#9784) by @sapphi-red
  • wrap node require helper in pure IIFE (#9783) by @kb019
  • lazy-barrel: load locally-used imports on a re-exported record (#9757) by @shulaoda
  • avoid dangling wrapped-ESM init call across chunks (#9502) (#9717) by @IWANABETHATGUY
  • dev: detect same-second rewrites in CI poll watcher (#9736) by @h-a-n-a
  • dev: force rebuild after HMR errors (#9686) by @h-a-n-a
  • dev: print build errors on browser refresh after a failed build (#9652) by @h-a-n-a
🚜 Refactor
  • single-source the chunk $N symbol-naming algorithm (#9831) by @Dunqing
  • simplify common_dir helper (#9857) by @IWANABETHATGUY
  • drop commondir crate in favor of in-house helper (#9849) by @Boshen
  • binding: extract helpers from normalize_binding_options (#9842) by @Boshen
  • move rolldown_filter_analyzer to tasks and scope oxc cfg feature (#9839) by @Boshen
  • options: merge manualCodeSplitting into codeSplitting object form (#9805) by @IWANABETHATGUY
  • options: support codeSplitting object form in CodeSplittingMode (#9804) by @IWANABETHATGUY
  • diagnostic: reuse ByteLocator for per-source line lookup (#9762) by @IWANABETHATGUY
  • remove redundant Arc around tracing spans (#9778) by @camc314
  • remove unnecessary Arc around sourcemap sender (#9777) by @camc314
  • rolldown_plugin_vite_wasm_fallback: remove the plugin (#9775) by @sapphi-red
  • binding: remove infer-able napi(ts_type) (#9737) by @sapphi-red
  • remove preprocessor span dedup (#9734) by @hyf0
  • identify AST nodes by NodeId instead of Span/Address (#9609) by @IWANABETHATGUY
📚 Documentation
  • tsconfig: align auto-discovery docs with oxc-resolver behavior (#9845) by @shulaoda
  • relocate meta/design to internal-docs, split design from implementation (#9826) by @h-a-n-a
  • meta: add options normalization design doc (#9818) by @IWANABETHATGUY
  • document why the napi tracing feature is enabled (#9766) by @Boshen
  • dev: move test-dev-server test guidance into the testing docs (#9809) by @h-a-n-a
⚡ Performance
  • drop unused regex unicode property tables from the binding (#9848) by @Boshen
  • drop urlencoding crate in favor of percent-encoding (#9851) by @Boshen
  • drop owo-colors supports-colors feature in vite reporter (#9824) by @Boshen
  • skip enum member value extraction for non-TypeScript modules (#9840) by @shulaoda
  • rolldown: use unstable sort for itertools sorted_by at unique-key sites (#9827) by @Boshen
  • cheaper deterministic ordering in external import binding merger (#9810) by @IWANABETHATGUY
  • disable idna's ICU backend by pinning idna_adapter to 1.0.0 (-129 KB) (#9811) by @Boshen
  • size: use unstable sort where stability is unneeded (#9803) by @Boshen
  • remove num-format dependency from vite reporter (#9795) by @Boshen
  • reduce js callback error size (#9776) by @Boshen
  • rolldown_error: remove Debug supertrait from BuildEvent (#9798) by @Boshen
  • reduce plugin hook order code size (#9761) by @Boshen
  • deps: disable infer default features to reduce binary size (#9765) by @Boshen
  • reduce pluginable monomorphization size (#9771) by @Boshen
  • avoid rebuilding replace plugin values (#9764) by @Boshen
  • defer link-stage-output drop to rayon workers after output is produced (#9733) by @Brooooooklyn
  • tree-shaking: hoist already-included guard to call sites in inclusion DFS (#9738) by @Brooooooklyn
  • renamer: dedup before allocating the owned name in add_symbol_in_root_scope (#9740) by @Brooooooklyn
🧪 Testing
  • allocs: track allocation counts for rolldown_sourcemap (#9835) by @hyf0
  • bench: add CodSpeed micro-benchmarks for rolldown_sourcemap (#9834) by @hyf0
  • add cjs named export mutation test (#9823) by @sapphi-red
  • dev: restore shared-page reliability conventions in AGENTS.md (#9786) by @h-a-n-a
  • dev: add AGENTS.md test guidance for agents (#9763) by @h-a-n-a
  • dev: split out initial-build-error into its own playground (#9772) by @h-a-n-a
  • dev: align e2e suite with Vite and parallelize playgrounds (#9759) by @h-a-n-a
  • remove unnecessary module namespace object JSON serializations in tests (#9725) by @sapphi-red
  • use assert.deepStrictEqual instead of assert.deepEqual by using assert/strict instead of assert (#9724) by @sapphi-red
  • hmr: add test case for #5301 (#5302) by @sapphi-red
  • dev: add tests for dev-engine principles (#9720) by @h-a-n-a
  • dev: align dev-engine test harness with Vite (#9684) by @h-a-n-a
⚙️ Miscellaneous Tasks
  • deps: update napi to 3.9.3 (#9862) by @shulaoda
  • deps: update oxc to 0.137.0 (#9856) by @Boshen
  • re-enable default lld linker on x86_64-unknown-linux-gnu (#9855) by @Boshen
  • deps: bump vite-plus to 0.2.1 (#9850) by @Boshen
  • skills: translate _config.json when encoding rolldown REPL links (#9847) by @IWANABETHATGUY
  • deps: update oxc_resolver and oxc_resolver_napi to 11.21.3 (#9841) by @Boshen
  • pin vite-plus (vp) CLI to 0.1.24 in setup-vp (#9830) by @Boshen
  • add crate/package-level CODEOWNERS (#9819) by @IWANABETHATGUY
  • drop unused derive_more display feature from rolldown_plugin (#9820) by @Boshen
  • remove auto-assign PR workflow (#9807) by @IWANABETHATGUY
  • deps: update rollup submodule for tests to v4.62.0 (#9780) by @rolldown-guard[bot]
  • deps: update esbuild for tests to 0.28.1 (#9779) by @rolldown-guard[bot]
  • deps: update test262 submodule for tests (#9781) by @rolldown-guard[bot]
  • deps: update oxc to 0.136.0 (#9770) by @Boshen
  • add pull request template (#9756) by @sapphi-red
  • clarify rolldown_plugin_vite_* is compatible for the same minor (#9774) by @sapphi-red
  • deps: update github actions (#9745) by @renovate[bot]
  • deps: update rust crates (#9747) by @renovate[bot]
  • deps: update napi to v3.9.2 (#9744) by @renovate[bot]
  • deps: update npm packages (#9746) by @renovate[bot]
  • deps: update @napi-rs/cli and emnapi deps (#9741) by @Brooooooklyn
  • generator: fix vp fmt on Windows (#9727) by @sapphi-red
  • ban importing from assert and recommend assert/strict (#9726) by @sapphi-red
❤️ New Contributors
  • @naruaway made their first contribution in #9755
  • @kb019 made their first contribution in #9783

Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com

v1.1.1

Added
  • Introduce AstFactory for AST construction in ecmascript_utils
  • Report the full-reload reason for the invalidate-loop case in HMR
Changed
  • Precompute wrapped-ESM init metadata in generate stage
  • Always split runtime module first
  • Migrate multiple finalizers and utilities to use AstFactory
Fixed
  • Resolver now honors package.json#type for .jsx/.tsx extensions
  • Explicit moduleSideEffects from a hook takes priority over package.json#sideEffects
  • Keep the rolldown-runtime name for the standalone runtime chunk
  • Request all exports for entry barrels on first encounter in lazy-barrel
  • Skip init_*() for tree-shaken wrapped ESM owners in finalizer
  • Order chunk.imports by execution order
  • Preserve slash separators for Sass partial exports in vite-resolve
  • Cross-chunk CJS wrapper no longer shadowed by author-local binding
Removed
  • Drop no-op init calls for empty wrapped-ESM modules
[1.1.1] - 2026-06-11
🚀 Features
  • ecmascript_utils: introduce AstFactory for AST construction (#9682) by @hyf0
  • drop no-op init calls for empty wrapped-ESM modules (#9678) by @IWANABETHATGUY
🐛 Bug Fixes
  • resolver: honor package.json#type for .jsx/.tsx extensions (#9690) (#9699) by @IWANABETHATGUY
  • hmr: report the full-reload reason for the invalidate-loop case (#9708) by @hyf0
  • explicit moduleSideEffects from a hook must take priority over the package.json#sideEffects (#9688) by @sapphi-red
  • keep the rolldown-runtime name for the standalone runtime chunk (#9685) by @shulaoda
  • lazy-barrel: request all exports for entry barrels on first encounter (#9672) by @shulaoda
  • finalizer: skip init_*() for tree-shaken wrapped ESM owners (#9669) by @IWANABETHATGUY
  • order chunk.imports by execution order (#9654) by @chuganzy
  • vite-resolve: preserve slash separators for Sass partial exports (#9546) by @cjc0013
  • cross-chunk CJS wrapper shadowed by author-local binding (#9648) by @IWANABETHATGUY
🚜 Refactor
  • precompute wrapped-ESM init metadata in generate stage (#9712) by @IWANABETHATGUY
  • ecmascript_utils: fold construction ext traits onto AstFactory and delete AstSnippet (#9702) by @hyf0
  • finalizer: finish ScopeHoistingFinalizer migration to AstFactory (#9701) by @hyf0
  • finalizer: migrate module_finalizers/mod.rs to AstFactory (#9700) by @hyf0
  • hmr: migrate hmr finalizer to AstFactory (#9695) by @hyf0
  • plugin: migrate vite_build_import_analysis to AstFactory (#9693) by @hyf0
  • scanner: migrate tweak_ast_for_scanning to AstFactory (#9683) by @hyf0
  • always split runtime module first (#9419) by @IWANABETHATGUY
📚 Documentation
  • tsconfig: correct auto-discovery resolution to match TypeScript (#9714) by @shulaoda
  • design: plan to unify all internal AST construction (#9673) by @hyf0
  • tsconfig: align reference resolution docs with TypeScript behavior (#9641) by @shulaoda
⚡ Performance
  • avoid per-module join Strings in scope-hoisting concatenation (#9645) by @Boshen
  • avoid intermediate Strings in the ESM export clause (#9644) by @Boshen
  • reuse a scratch buffer for facade namespace names in the scanner (#9642) by @Boshen
  • reuse the import-matching tracker stack across named imports (#9643) by @Boshen
  • avoid cloning the per-chunk export-items map in render_chunk_exports (#9639) by @Boshen
  • avoid CompactStr allocation in sorted-exports membership check (#9640) by @Boshen
🧪 Testing
  • add more moduleSideEffects precedence tests (#9689) by @sapphi-red
  • 9651: drop shimMissingExports from regression fixture (#9674) by @IWANABETHATGUY
⚙️ Miscellaneous Tasks
  • update react repo links (#9711) by @iiio2
  • remove outdated pnpm configurations (#9666) by @btea
  • deps: update github actions to v2.81.5 (#9665) by @renovate[bot]
  • testing: migrate test harness off deprecated inlineDynamicImports (#9710) by @IWANABETHATGUY
  • hmr: delete commented-out dead code left from old register-module codegen (#9707) by @hyf0
  • deps: update napi-rs toolchain (#9706) by @shulaoda
  • deps: update rollup submodule for tests to v4.61.1 (#9676) by @rolldown-guard[bot]
  • deps: update test262 submodule for tests (#9677) by @rolldown-guard[bot]
  • deps: update oxc to 0.135.0 (#9670) by @Boshen
  • pass ALGOLIA_APP_ID and ALGOLIA_API_KEY to void deploy (#9667) by @Boshen
  • deps: update github actions (#9662) by @renovate[bot]
  • deps: update rust crates (#9663) by @renovate[bot]
  • deps: update rolldown-plugin-dts to v0.25.2 (#9661) by @renovate[bot]
  • deps: update typos to v1.47.2 (#9660) by @renovate[bot]
  • deps: update docs dependencies (#9657) by @bddjr
  • deps: update typos to v1.47.1 (#9655) by @renovate[bot]
  • deploy website in its own workflow, only on docs output change (#9650) by @Boshen
  • publish to pkg.pr.new add pm and commentWithDev option (#9638) by @btea
❤️ New Contributors
  • @chuganzy made their first contribution in #9654
  • @cjc0013 made their first contribution in #9546

v1.1.0

Added
  • import.meta.glob now supports caseSensitive option
  • add SOURCEMAP_BROKEN warning for renderChunk hook
  • add SOURCEMAP_BROKEN warning for transform hook
  • add @__NO_SIDE_EFFECTS__ hint for invalid @__PURE__ before function declarations
  • code-splitting now supports group-local includeDependenciesRecursively
Changed
  • experimental.lazyBarrel is now enabled by default, skipping compilation of re-exported modules that are never used in barrel modules recognized as side-effect-free
  • tsconfig project-reference resolution now aligns with TypeScript by searching upward from the file's directory and using the first tsconfig.json that owns the file
  • tsconfig referenced project that includes a file now takes precedence over the root instead of the root matching it first
  • tsconfig allowJs option is now decided by each referenced project's own setting instead of the root's

[!IMPORTANT] This is a minor release. Two changes alter default behavior compared to 1.0.3. Please read this section before upgrading. Everything else is additive (new features, fixes, deps).

⚠️ Notable behavior changes
1. experimental.lazyBarrel is now enabled by default (#9632)

What changed. experimental.lazyBarrel now defaults to true. When a barrel module is recognized as side-effect-free, Rolldown skips compiling the re-exported modules that are never actually used.

Impact. For codebases with large barrel files (component libraries such as Ant Design, @mui/icons-material, etc.) this is a meaningful build-time speedup, and for the vast majority of projects the emitted output is unchanged. In rare cases where a barrel is incorrectly treated as side-effect-free, the optimization could drop a module that was being relied on for its side effects.

How to opt out (backward compatible).

// rolldown.config.js
export default {
  experimental: { lazyBarrel: false },
}

Note: this opt-out flag is planned to be removed in a future release. If you have a case where you must turn it off, please open an issue so we can fix the underlying detection instead.


2. tsconfig project-reference resolution now aligns with TypeScript

Upgrading oxc_resolver (11.19.111.20.0 in #9549, then → 11.21.0 in #9634) changes how Rolldown discovers and resolves tsconfig.json, in particular for a solution-style config (one that only lists references and delegates the real settings to tsconfig.app.json / tsconfig.node.json, as Vite scaffolds), bringing it in line with how TypeScript (tsc / tsserver) itself behaves:

  • Auto-discovery walk-up (oxc-resolver #1154): in auto-discovery mode (tsconfig: true, the default), Rolldown now searches upward from the file's directory and uses the first tsconfig.json that owns the file. A tsconfig.json owns the file when the file matches its files/include/exclude, or when one of its references matches the file. A tsconfig.json that does not own the file is skipped, and the search continues in the parent directory. When no tsconfig.json up the tree owns the file, Rolldown falls back to the outermost (topmost) one found, not the nearest. Previously the nearest tsconfig.json was used unconditionally. This mirrors how TypeScript's tsserver assigns a file to a project.
  • Reference match priority (oxc-resolver #1151): when the root has references, a referenced project that includes the file now takes precedence over the root, instead of the root matching it first (this is what TypeScript already does). So that project's compilerOptions.paths now apply.
  • allowJs (oxc-resolver #1198): whether a .js/.jsx/.mjs/.cjs file is included is now decided by each referenced project's own allowJs, not the root's (again matching TypeScript). So tsconfig.app.json with allowJs: true + paths now resolves aliases for .js files even when the root doesn't set allowJs.

For most projects this is a fix (the standard Vite paths aliases now resolve, closes rolldown/rolldown#8468), but it is a behavior change if you relied on the previous behavior, where the root's paths / allowJs took precedence.

If you relied on the old "root wins" behavior. There is no exact toggle back, because the old behavior was the bug being fixed. The recommended path is to align your config with TypeScript: declare the paths / allowJs on the referenced project that actually owns the files.

If you must keep the old precedence while still using references: a referenced project's match wins, and the first matching references entry takes priority (the root is only a fallback when no reference claims the file). So extract the old root settings into their own config and list it first:

// tsconfig.json (solution root)
{
  "files": [],
  "references": [
    { "path": "./tsconfig.base.json" }, // old root paths/allowJs — listed first, so it wins
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ]
}

tsconfig.base.json should carry the paths you previously declared on the root, plus allowJs: true if it needs to claim .js files (the extension is checked against each config's own allowJs). With no include, it defaults to **/* under its directory and claims every file first.

One consequence of the new walk-up behavior to keep in mind: this solution root (files: [], only references) has no file patterns of its own, so it owns a file only when one of its references matches it. When no tsconfig.json owns the file (for example a file outside tsconfig.base.json's directory), Rolldown does not fall back to this tsconfig.json. It keeps searching upward through ancestor directories. Before this release the nearest tsconfig.json was used unconditionally, so such files previously stopped at this solution root.

Alternatively, bypass reference resolution entirely by pointing the top-level tsconfig option at a single config: export default { tsconfig: './tsconfig.app.json' }.


[1.1.0] - 2026-06-03
🚀 Features
  • enable experimental.lazyBarrel by default (#9632) by @shulaoda
  • import.meta.glob support caseSensitive option (#9594) by @btea
  • add SOURCEMAP_BROKEN warning for renderChunk hook (#9601) by @sapphi-red
  • add SOURCEMAP_BROKEN warning for transform hook (#9600) by @sapphi-red
  • add @__NO_SIDE_EFFECTS__ hint for invalid @__PURE__ before function declarations (#9505) by @Copilot
  • code-splitting: support group-local includeDependenciesRecursively (#9587) by @hyf0
🐛 Bug Fixes
  • report TSCONFIG_ERROR instead of UNHANDLEABLE_ERROR for a missing tsconfig file (#9633) by @shulaoda
  • browser: add missing exports and ensure consistency with rolldown package (#9629) by @sapphi-red
  • should build test-dev-server when test-node (#9610) by @situ2001
  • chunk-optimizer: refuse asymmetric merge for cyclic dynamic entries (#9320) (#9322) by @aminpaks
  • dev: handle the remaining errors in dev (#9570) by @h-a-n-a
  • handle slash-normalized ids with preserveModulesRoot (#9595) by @IWANABETHATGUY
  • json: preserve .default access on JSON default imports (#9568) by @IWANABETHATGUY
  • testing: remove unintended trigger_full_build from test harness (#9573) by @hyf0
🚜 Refactor
  • js-regex: use regress native replace/replace_all (#9607) by @IWANABETHATGUY
  • remove never-constructed ImportStatus variants (#9606) by @Boshen
📚 Documentation
  • clarify that RolldownBuild::close method should be called in most cases (#9619) by @sapphi-red
⚡ Performance
  • avoid unnecessary intermediate sourcemaps (#9599) by @sapphi-red
🧪 Testing
  • add unit test for collapsing module sourcemap (#9626) by @sapphi-red
  • cover vite-alias regex capture-group expansion (#9602) (#9608) by @IWANABETHATGUY
⚙️ Miscellaneous Tasks
  • deps: update oxc_resolver to 11.21.0 (#9634) by @shulaoda
  • update invalid option diagnostic link to point to Rolldown docs (#9631) by @sapphi-red
  • deps: update vite+ to v0.1.24 (#9628) by @renovate[bot]
  • deps: update oxc resolver to v11.20.0 (#9549) by @renovate[bot]
  • deps: update dependency vite-plus to v0.1.24 (#9470) by @renovate[bot]
  • deps: update npm packages (#9614) by @renovate[bot]
  • deps: upgrade oxc to 0.134.0 (#9625) by @shulaoda
  • deps: update crate-ci/typos action to v1.47.0 (#9620) by @renovate[bot]
  • deps: update rollup submodule for tests to v4.61.0 (#9623) by @rolldown-guard[bot]
  • deps: update github actions (#9613) by @renovate[bot]
  • deps: update pnpm to v11.4.0 (#9616) by @renovate[bot]
  • deps: update rust crates (#9615) by @renovate[bot]
  • deps: update test262 submodule for tests (#9624) by @rolldown-guard[bot]
  • deps: update dependency @napi-rs/cli to v3.7.0 (#9588) by @renovate[bot]
  • deps: update dependency rust to v1.96.0 (#9596) by @renovate[bot]
  • re-enable WASI testing with proper infrastructure (#9397) by @Boshen
❤️ New Contributors
  • @aminpaks made their first contribution in #9322

Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com

v1.0.3

Added
  • Respect decorator strictNullChecks option in transform
Changed
  • Distinguish map: null vs map: undefined in transform hook output
  • Thread ast_table by value into codegen consumer for generation
  • Replace _reExport construction with a direct call to avoid calling clone_in in finalizers
  • Reorder hot-path boolean checks to short-circuit on cheap predicates first
Fixed
  • onOutput called twice when initial build fails
  • Make ensureCurrentBuildFinish not returning error when engine closes
  • Route require() to CJS helper variant in oxc-runtime
  • Use exporter chunk's export mode for CJS default re-exports in generator
  • Always run reduced-atom static cycle check in rolldown
  • Apply transform.dropLabels before scanning
  • Keep the scan-stage cache consistent when a build fails
  • Skip JSON default-import namespace optimization for write targets
Removed
  • Drop defer keyword
[1.0.3] - 2026-05-27
🚀 Features
  • transform: respect decorator strictNullChecks option (#9580) by @kylecannon
  • drop defer keyword (#9503) by @TheAlexLichter
🐛 Bug Fixes
  • ci: create target dir before cargo release-oxc update (#9584) by @shulaoda
  • ci: reorder prepare-release steps to avoid dirty git check failure (#9583) by @shulaoda
  • testing: canonicalize temp dir early and use platform-specific separator in test262 (#9582) by @shulaoda
  • testing: resolve symlinked temp dir in test262 snapshot normalization (#9581) by @shulaoda
  • testing: canonicalize temp dir path in test262 snapshot normalization (#9579) by @shulaoda
  • dev: onOutput called twice when initial build fails (#9552) by @hyf0
  • dev: make ensureCurrentBuildFinish not returning error when engine closes (#9564) by @h-a-n-a
  • oxc-runtime: route require() to CJS helper variant (#9263) (#9526) by @IWANABETHATGUY
  • generator: use exporter chunk's export mode for CJS default re-exports (#9299) (#9529) by @IWANABETHATGUY
  • rolldown: always run reduced-atom static cycle check (#9441) (#9514) by @IWANABETHATGUY
  • apply transform.dropLabels before scanning (#9521) (#9522) by @IWANABETHATGUY
  • rolldown_watcher: take rolldown dep through the workspace (#9510) by @Boshen
  • cache: keep the scan-stage cache consistent when a build fails (#9495) by @h-a-n-a
  • skip JSON default-import namespace optimization for write targets (#9484) (#9489) by @IWANABETHATGUY
  • deps: skip pnpm frozen-lockfile on Netlify to dodge catalog mismatch bug (#9471) by @Boshen
🚜 Refactor
  • oxc-runtime: use Cow for helper path construction (#9538) by @IWANABETHATGUY
  • fold import defer phase drop into PreProcessor (#9524) by @IWANABETHATGUY
  • distinguish map: null vs map: undefined in transform hook output (#9497) by @sapphi-red
📚 Documentation
  • explain the policy for Rust crates (#9547) by @sapphi-red
  • cache: add design doc for cache (#9544) by @h-a-n-a
  • guide/troubleshooting: add TDZ error section (#9537) by @sapphi-red
  • dev-engine: add design doc for dev-engine (#9479) by @h-a-n-a
  • lazy-barrel: tweak some words (#9483) by @shulaoda
  • lazy-barrel: expand reasoning behind LARGE_BARREL_MODULES advice (#9477) by @shulaoda
⚡ Performance
  • generate: thread ast_table by value into codegen consumer (#9555) by @Boshen
  • finalizers: replace _reExport construction with a direct call to avoid calling clone_in (#9501) by @Dunqing
  • reorder hot-path boolean checks to short-circuit on cheap predicates first (#9523) by @Boshen
🧪 Testing
  • rolldown: regression fixture for #9401 (#9418) by @IWANABETHATGUY
  • failing test for #9441 (#9504) by @TheAlexLichter
⚙️ Miscellaneous Tasks
  • deps: upgrade oxc to 0.133.0 (#9563) by @Dunqing
  • deps: update crate-ci/typos action to v1.46.3 (#9576) by @renovate[bot]
  • deps: update mimalloc-safe to 0.1.62 (#9577) by @shulaoda
  • mimalloc-safe: update to a bug-fix branch for verification (#9569) by @shulaoda
  • deps: update test262 submodule for tests (#9551) by @rolldown-guard[bot]
  • point published crates' readme to root README.md (#9553) by @Boshen
  • replace actions-cool/issues-helper with gh CLI (#9543) by @Boshen
  • deps: update cargo-shear to 1.12.4 (#9541) by @Boshen
  • deps: update taiki-e/install-action action to v2.79.4 (#9535) by @renovate[bot]
  • deps: update github actions (#9532) by @renovate[bot]
  • deps: update rust crates (#9534) by @renovate[bot]
  • deps: update npm packages (#9533) by @renovate[bot]
  • gate experimental/testing-only items to silence dead_code in publish builds (#9517) by @Boshen
  • docs: deploy to Void (#9509) by @Boshen
  • release: set up cargo-release-oxc for publishing crates (#9476) by @Boshen
  • rolldown_plugin_lazy_compilation: add missing description (#9507) by @Boshen
  • mimalloc-safe: update to a bug-fix branch for verification (#9506) by @shulaoda
  • deps: update crate-ci/typos action to v1.46.2 (#9468) by @renovate[bot]
❤️ New Contributors
  • @kylecannon made their first contribution in #9580

v1.0.2

Added
  • Devtools emit package size in PackageGraphReady
  • Devtools classify package dependency types
  • Devtools map packages to modules and chunks
  • Devtools mark used packages
  • Devtools make duplicate packages discoverable
  • Devtools emit package metadata
  • Allow checks.* to escalate emissions to hard errors
  • Dev watcher support for options `include` and `exclude`
  • Emit warnings for invalid pure annotations
Changed
  • Update oxc to 0.132.0
  • Update oxc to 0.131.0
Fixed
  • Keep chunk file names stable when an unrelated entry is added
  • Call `codeSplitting.groups[].name` in deterministic order
  • Make `resolve_id` idempotent when the resolved id is already a lazy entry
  • Publish absorbed dynamic-entry namespace cross-chunk
  • Propagate pure annotation through compound expressions
  • Skip redundant init call when barrel executes in same chunk
  • Initialize wrapped ESM re-export owners
  • Do not inherit __toESM across chunks for named-only external imports
  • Watcher does not write output or emit events after close()
[1.0.2] - 2026-05-20
🚀 Features
  • devtools: emit package size in PackageGraphReady (#9434) by @IWANABETHATGUY
  • devtools: classify package dependency types (#9427) by @IWANABETHATGUY
  • devtools: map packages to modules and chunks (#9426) by @IWANABETHATGUY
  • devtools: mark used packages (#9423) by @IWANABETHATGUY
  • devtools: make duplicate packages discoverable (#9422) by @IWANABETHATGUY
  • devtools: emit package metadata (#9421) by @IWANABETHATGUY
  • update oxc to 0.132.0 (#9449) by @shulaoda
  • update oxc to 0.131.0 (#9424) by @shulaoda
  • allow checks.* to escalate emissions to hard errors (#9388) by @IWANABETHATGUY
  • dev: support watcher options include and exclude (#9395) by @h-a-n-a
  • emit warnings for invalid pure annotations (#9381) by @Kyujenius
🐛 Bug Fixes
  • hash: keep chunk file names stable when an unrelated entry is added (#9444) by @hyf0
  • call codeSplitting.groups[].name in deterministic order (#9457) by @sapphi-red
  • dev/lazy: make resolve_id idempotent when the resolved id is already a lazy entry (#9439) by @h-a-n-a
  • chunk-optimization: publish absorbed dynamic-entry namespace cross-chunk (#9448) by @IWANABETHATGUY
  • treeshake: propagate pure annotation through compound exprs (#9431) by @Dunqing
  • finalizer: skip redundant init call when barrel executes in same chunk (#9354) by @IWANABETHATGUY
  • linking: initialize wrapped ESM re-export owners (#9353) by @IWANABETHATGUY
  • do not inherit __toESM across chunks for named-only external imports (#9333) (#9415) by @IWANABETHATGUY
  • watcher: don't write output or emit events after close() (#9328) by @situ2001
  • chunk-optimization: avoid unsafe dynamic-only merges (#9398) by @IWANABETHATGUY
  • cjs: rename CJS-wrapped locals that would shadow chunk-scope names (#9392) by @hyf0
  • dev/lazy: watch lazy modules added in rebuilds (#9391) by @h-a-n-a
🚜 Refactor
  • rolldown_dev: move dev example to break publish cycle (#9465) by @Boshen
  • binding: drop unsafe napi string helper, hoist transform ArcStr (#9456) by @hyf0
  • ecmascript_utils: split rewrite_ident_reference off JsxExt trait (#9417) by @IWANABETHATGUY
  • use ThreadsafeFunction::call_async_catch (#9390) by @sapphi-red
📚 Documentation
  • devtools: document @rolldown/debug usage and package graph consumption (#9435) by @IWANABETHATGUY
  • replace Inter with system font stack in OG template SVG (#9240) by @yvbopeng
  • remove output.comments warning as all issues have been resolved (#9393) by @sapphi-red
  • in-depth: clarify @PURE scope and document positions (#9389) by @Kyujenius
  • readme: remove release candidate notice (#9387) by @shulaoda
⚡ Performance
  • vite-resolve: cache importer existence checks (#9443) by @Brooooooklyn
  • binding: reduce plugin string clones (#9436) by @Brooooooklyn
🧪 Testing
  • enable legal_comments_inline test (#9394) by @sapphi-red
⚙️ Miscellaneous Tasks
  • bump pnpm to v11.1.2 (#9447) by @Boshen
  • deps: update rust crates (#9461) by @renovate[bot]
  • deps: update rollup submodule for tests to v4.60.4 (#9453) by @rolldown-guard[bot]
  • deps: update test262 submodule for tests (#9454) by @rolldown-guard[bot]
  • deps: update npm packages (#9430) by @renovate[bot]
  • deps: update github actions (#9429) by @renovate[bot]
  • deps: update dependency rolldown-plugin-dts to v0.25.1 (#9452) by @renovate[bot]
  • deps: update rust crates (#9428) by @renovate[bot]
  • revert allow checks.* to escalate emissions to hard errors (#9388) (#9438) by @IWANABETHATGUY
  • update mimalloc-safe to 0.1.61 (#9413) by @shulaoda
  • deny todo, unimplemented, and print_stderr clippy lints (#9412) by @Boshen
  • deps: update mimalloc-safe to 0.1.60 (#9410) by @shulaoda
  • remove pip install setuptools workaround for node-gyp on macOS (#9370) by @sapphi-red
  • renovate: disable automerge to require manual approval (#9386) by @shulaoda
  • deps: update napi (#9385) by @renovate[bot]
❤️ New Contributors
  • @yvbopeng made their first contribution in #9240

Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com

v1.0.1

Added
  • experimental/lazy-barrel: advice on oversized barrel modules
  • rolldown: inline optional-chain enum access
  • chunk-optimization: dedupe already-loaded dynamic deps
  • binding: call moduleParsed hook in ParallelJsPlugin
Changed
  • binding: enable mimalloc v3 to reduce idle memory
  • migrate @rolldown/pluginutils to rolldown/plugins
  • deps: upgrade oxc to 0.130.0
Fixed
  • transform: enable enum_eval for transformSync and vite TS transform
  • error: remove severity prefix from diagnostic messages
  • dev/lazy: fix exports of lazy requests in lazy chunks
  • rolldown_plugin_vite_resolve: handle errors in resolveSubpathImports callback
  • rolldown_plugin_lazy_compilation: use loadExports for fetched proxy to preserve original export names
  • common: include offending index in HybridIndexVec panic message
[1.0.1] - 2026-05-13
🚀 Features
  • experimental/lazy-barrel: advice on oversized barrel modules (#9236) by @shulaoda
  • rolldown: inline optional-chain enum access (#9379) by @Dunqing
  • chunk-optimization: dedupe already-loaded dynamic deps (#9305) by @IWANABETHATGUY
  • binding: call moduleParsed hook in ParallelJsPlugin (#9318) by @jaehafe
🐛 Bug Fixes
  • transform: enable enum_eval for transformSync and vite TS transform (#9325) by @Dunqing
  • error: remove severity prefix from diagnostic messages (#9262) by @Kyujenius
  • deps: pin pnpm to 10.23.0 to work around catalog mismatch on Netlify (#9364) by @shulaoda
  • ci: pin mimalloc-safe to 0.1.58 (#9361) by @shulaoda
  • dev/lazy: fix exports of lazy requests in lazy chunks (#9249) by @h-a-n-a
  • rolldown_plugin_vite_resolve: handle errors in resolveSubpathImports callback (#9355) by @sapphi-red
  • rolldown_plugin_lazy_compilation: use loadExports for fetched proxy to preserve original export names (#9132) by @h-a-n-a
  • common: include offending index in HybridIndexVec panic message (#9296) by @SAY-5
🚜 Refactor
  • ecmascript: extract semantic_builder_for_transform helper (#9326) by @Dunqing
  • test: extract reusable static-import-cycle helper (#9332) by @IWANABETHATGUY
📚 Documentation
  • clarify scope of topLevelVar (#9380) by @IWANABETHATGUY
  • meta/design: add ast-mutation design doc (#9338) by @hyf0
  • feat: add ai policy in contribution guide (#9315) by @mdong1909
⚡ Performance
  • binding: enable mimalloc v3 to reduce idle memory (#9349) by @shulaoda
🧪 Testing
  • mcs: cover require() in $initial group (#9376) by @hyf0
  • add regression for CJS facade chunk merge into entry (#9351) by @IWANABETHATGUY
⚙️ Miscellaneous Tasks
  • switch prepare-release to manual dispatch with version input (#9383) by @shulaoda
  • migrate @rolldown/pluginutils to rolldown/plugins (#9317) by @shulaoda
  • deps: pin libmimalloc-sys2 to 0.1.54 (#9372) by @shulaoda
  • replace igorskyflyer/action-readfile with cat (#9369) by @sapphi-red
  • deps: update test262 submodule for tests (#9371) by @rolldown-guard[bot]
  • use app token for test dep update PRs (#9368) by @sapphi-red
  • replace some actions with gh commands (#9367) by @sapphi-red
  • replace action-semantic-pull-request with inline regex (#9366) by @sapphi-red
  • remove pull_request_target workflows (#9188) by @Boshen
  • deps: upgrade oxc to 0.130.0 (#9360) by @shulaoda
  • deps: update github actions (major) (#9348) by @renovate[bot]
  • deps: update github actions (#9341) by @renovate[bot]
  • deps: update rust crates (#9344) by @renovate[bot]
  • deps: update crate-ci/typos action to v1.46.1 (#9357) by @renovate[bot]
  • deps: update npm packages (#9343) by @renovate[bot]
  • deps: update pnpm to v10.33.4 (#9347) by @renovate[bot]
  • deps: update dependency rolldown-plugin-dts to ^0.25.0 (#9346) by @renovate[bot]
  • .claude: add rolldown-repl encoder, rename decode skill (#9352) by @IWANABETHATGUY
  • deps: update crate-ci/typos action to v1.46.0 (#9345) by @renovate[bot]
  • deps: update napi to v3.8.6 (#9342) by @renovate[bot]
  • deps: update dependency vite-plus to v0.1.20 (#9340) by @renovate[bot]
  • enable rollup chunking-form test (#9335) by @IWANABETHATGUY
  • typo: fix typo in watcher options comment (#9324) by @thescripted
❤️ New Contributors
  • @Kyujenius made their first contribution in #9262
  • @SAY-5 made their first contribution in #9296
  • @thescripted made their first contribution in #9324

Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com