tsdown v0.23.0

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: falseunbundle: true; bundle: true can be removed
    • outExtensionoutExtensions
    • publicDir / --public-dircopy / --copy
    • removeNodeProtocol: truenodeProtocol: 'strip'
    • injectStylecss.inject
  • deps:
    • inlineOnly / deps.onlyAllowBundledeps.onlyBundle
    • skipNodeModulesBundle: truedeps.neverBundle: true
    • resolveDepSubpath now defaults to false; set it to true to preserve the previous behavior
  • dts:
    • Select a generator with dts.generator, for example { generator: 'oxc' }
    • dts.cjsReexport was removed; dual-format builds now generate CJS declarations in a separate pass
  • attw:
    • The default profile changed from strict to esm-only; set profile: 'strict' to preserve the previous checks
  • programmatic API:
    • build() now returns { bundles, watch }; replace const bundles = await build() with const { 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 types and typesVersions fallbacks; use TypeScript’s bundler, node16, or nodenext module resolution
   🚨 Breaking Changes
  • Drop support for Node.js 25  -  by @sxzz (26950)
  • Remove deprecated tsup compatibility options  -  by @sxzz (50766)
  • Drop types and typesVersionsfields  -  by @sxzz (be3ea)
  • attw:
    • Change default profile to esm-only  -  by @sxzz (9b3cf)
  • deps:
    • Remove deprecated deps.onlyAllowBundle  -  by @sxzz (30c55)
    • Disable resolveDepSubpath by default  -  by @sxzz (d300f)
    • Remove deprecated skipNodeModulesBundle  -  by @sxzz (f2a3d)
  • dts:
    • Remove dts.cjsReexport option  -  by @sxzz (9c70f)
    • Make dts.generator the only way to select generator  -  by @sxzz (eb75f)
   🚀 Features
   🐞 Bug Fixes
   🏎 Performance
  • Remove asyncDispose polyfill  -  by @sxzz (82675)
  • Replace ansis with util.styleText  -  by @sxzz (be6bf)
    View changes on GitHub
View original

Upgraded? How did it go?

Discussion