v0.23.0
Added 3
- Expose programmatic watch controls
- Support function form for css.modules.localsConvention
- Add summary option to report to skip per-file size logs
Changed 5
- Make dts.generator the only way to select generator
- Change attw default profile from strict to esm-only
- Disable resolveDepSubpath by default
- build() now returns { bundles, watch } instead of bundles
- Remove asyncDispose polyfill for performance
Fixed 6
- Allow unplugin-unused v0.5+
- Ignore optional dependencies in type definitions
- Camel-case nested flag keys in CLI
- Watch files imported via @import in CSS
- Apply resolveDepSubpath when neverBundle is true
- Scope inlined dependencies to configs with exports
Removed 6
- Drop support for Node.js 25; use ^22.18.0, ^24.11.0, or >=26.0.0
- Remove deprecated tsup compatibility options
- Drop types and typesVersions fields from package exports
- Remove deprecated deps.onlyAllowBundle option
- Remove deprecated skipNodeModulesBundle option
- Remove dts.cjsReexport option; dual-format builds now generate CJS declarations in a separate pass
From tsdown
🧭 Migration Guide
Most users can upgrade directly. Before upgrading, run one final build with tsdown@0.22.14 and resolve all deprecation warnings.
- config:
bundle: false→unbundle: true;bundle: truecan be removedoutExtension→outExtensionspublicDir/--public-dir→copy/--copyremoveNodeProtocol: true→nodeProtocol: 'strip'injectStyle→css.inject
- deps:
inlineOnly/deps.onlyAllowBundle→deps.onlyBundleskipNodeModulesBundle: true→deps.neverBundle: trueresolveDepSubpathnow defaults tofalse; set it totrueto preserve the previous behavior
- dts:
- Select a generator with
dts.generator, for example{ generator: 'oxc' } dts.cjsReexportwas removed; dual-format builds now generate CJS declarations in a separate pass
- Select a generator with
- attw:
- The default profile changed from
stricttoesm-only; setprofile: 'strict'to preserve the previous checks
- The default profile changed from
- programmatic API:
build()now returns{ bundles, watch }; replaceconst bundles = await build()withconst { bundles } = await build()
- requirements:
- Node.js 25 is no longer supported; use
^22.18.0,^24.11.0, or>=26.0.0 - The packages no longer publish legacy
typesandtypesVersionsfallbacks; use TypeScript’sbundler,node16, ornodenextmodule resolution
- Node.js 25 is no longer supported; use
🚨 Breaking Changes
- Drop support for Node.js 25 - by @sxzz (26950)
- Remove deprecated tsup compatibility options - by @sxzz (50766)
- Drop
typesandtypesVersionsfields - by @sxzz (be3ea) - attw:
- Change default profile to
esm-only- by @sxzz (9b3cf)
- Change default profile to
- deps:
- dts:
🚀 Features
- Expose programmatic watch controls - by @sxzz in https://github.com/rolldown/tsdown/issues/1062 (96a40)
- css: Support function form for
css.modules.localsConvention- by @sxzz and @lazerg (b566f) - report: Add
summaryoption to skip per-file size logs - by @lazerg in https://github.com/rolldown/tsdown/issues/1036 (020e9)
🐞 Bug Fixes
- Allow
unplugin-unusedv0.5+ - by @sxzz (53c78) - Ignore optional dependencies in type definitions - by @sxzz (94622)
- cli:
- Camel-case nested flag keys - by @sxzz (bf53f)
- css:
- Watch files imported via
@import- by @lazerg in https://github.com/rolldown/tsdown/issues/1038 (ebee5)
- Watch files imported via
- deps:
- Apply
resolveDepSubpathwhenneverBundleistrue- by @lazerg in https://github.com/rolldown/tsdown/issues/1053 (4943c)
- Apply
- exports:
- Scope inlined dependencies to configs with exports - by @lazerg in https://github.com/rolldown/tsdown/issues/1040 (d5b80)
- migrate:
🏎 Performance
- Remove
asyncDisposepolyfill - by @sxzz (82675) - Replace
ansiswithutil.styleText- by @sxzz (be6bf)