# What changed in tsdown

> 238 changes in tsdown 0.15 to 0.23 from its official release notes, upgrade guides and advisories: 51 breaking, 5 deprecations, 53 new APIs and options. Each one cited. Sources checked 2026-10-18. HTML: https://unstale.sh/npm/tsdown/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## tsdown 0.23

### Breaking changes

- The asyncDispose polyfill was removed. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- The default profile changed from strict to esm-only; set profile: 'strict' to preserve the previous checks. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- build() now returns { bundles, watch }, so callers should destructure bundles from the result. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Replace bundle: false with unbundle: true; bundle: true can be removed. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Use copy instead of publicDir or --public-dir. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Use --copy instead of --public-dir. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Use css.inject in place of injectStyle. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Custom languages, including vue, now throw when combined with an incompatible generator. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Use deps.neverBundle: true instead of skipNodeModulesBundle: true. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Use deps.onlyBundle instead of inlineOnly or deps.onlyAllowBundle. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- The option was removed; dual-format builds now generate CJS declarations in a separate pass. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Use dts.customLanguages instead of dts.volarPlugins, and rename each language's create hook to createVolarPlugins. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- This is now the only way to select a declaration generator; use 'oxc' or 'tsgo' instead of dts.oxc or dts.tsgo booleans. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Nested flag keys are now camel-cased. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Node.js 25 is no longer supported; use ^22.18.0, ^24.11.0, or >=26.0.0. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Replace removeNodeProtocol: true with nodeProtocol: 'strip'. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Use outExtensions in place of the renamed outExtension option. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- The option now defaults to false; set it to true to preserve the previous behavior. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Legacy types and typesVersions fallbacks were removed; use TypeScript's bundler, node16, or nodenext module resolution. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)

### New APIs and options

- css.modules.localsConvention now supports a function form. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- The summary option skips per-file size logs. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Programmatic watch controls are now exposed through the build result. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)

### Behavior and default changes

- Inlined dependencies are now scoped to configurations with exports. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Files imported through CSS @import are now watched. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- The migration tool now supports non-interactive environments. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)
- Optional dependencies are now ignored in type definitions. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)

### Tooling

- tsdown now allows unplugin-unused v0.5+. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)

### Fixes and other changes

- Object entries now honor a custom root. (0.23.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.1)
- The dry-run publish command now packs the tarball. (0.23.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.1)
- False tsconfig option values are preserved instead of being overridden. (0.23.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.1)
- resolveDepSubpath is now applied when neverBundle is true. (0.23.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.23.0)

## tsdown 0.22

### Breaking changes

- The minimum Node.js version for exe is standardized, which may affect which Node.js versions developers can use. (0.22.12) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.12)
- Node.js 24.0–24.10 are no longer supported. (0.22.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.3)
- Support for Node.js 23 is explicitly dropped. (0.22.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.0)
- tsdown now requires Node.js 22.18.0 or later; Bun and Deno remain supported experimentally. (0.22.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.0)
- tsdown now uses pkg from publint results and requires publint v0.3.8 or later. (0.22.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.0)
- unrun is no longer bundled. Install it manually when your environment needs it with the default auto config loader. (0.22.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.0)

### New APIs and options

- Adds a CLI option to control build concurrency. (0.22.14) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.14)
- Setting deps.neverBundle to true externalizes all dependencies. (0.22.13) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.13)
- Adds the resolveDepSubpath option for dependency subpath resolution. (0.22.11) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.11)
- The exe feature supports a custom Node index and download URL. (0.22.10) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.10)
- Adds the onlyImport option to deps. (0.22.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.8)
- Adds the logger option suppressWarnings to filter warnings. (0.22.7) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.7)
- Exports the tsdown version for use by consumers. (0.22.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.4)
- Adds deps.dts to override dependency bundling for declaration files. (0.22.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.1)
- tsx can now be used as an alternative config loader; install it manually when needed. (0.22.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.0)

### Performance

- Reduces the size of the tsdown installation. (0.22.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.4)
- Reuses the Sass async compiler when processing CSS. (0.22.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.4)
- Skips renderChunk when no CSS has been collected, avoiding unnecessary work. (0.22.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.3)

### Behavior and default changes

- tsdown now detects shebangs in entry chunks and automatically writes a bin field in package.json; set exports.bin to false to opt out. (0.22.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.0)
- When compilerOptions.declaration is true, tsdown now auto-enables dts; set dts: false to opt out. (0.22.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.0)

### Tooling

- tsdown supports TS 7. (0.22.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.5)

### Fixes and other changes

- tinyexec no longer modifies PATH. (0.22.13) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.13)
- Dependencies listed through peerDependenciesMeta are handled as external dependencies. (0.22.10) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.10)
- The exe feature handles Windows Node archives when running on Linux. (0.22.10) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.10)
- Dynamic imports are now checked in onlyImport. (0.22.9) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.9)
- Plugin arrays are concatenated when merging config. (0.22.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.8)
- Banner/footer function addons are evaluated per chunk. (0.22.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.5)
- Unbundled CJS output no longer emits the ESM shim banner. (0.22.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.5)
- Skips the cd hint when the current directory is selected. (0.22.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.4)
- Generates source maps to avoid the SOURCEMAP_BROKEN warning. (0.22.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.4)
- The option is respected regardless of the logger level. (0.22.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.4)
- Fixes inline CI detection. (0.22.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.3)
- Adds extra space for emoji rendering in Windows Terminal. (0.22.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.1)
- Adds shims support for unbundled builds. (0.22.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.1)
- Improves error handling for unsupported TypeScript syntax on Node.js. (0.22.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.1)
- The logic for duplicate configuration warnings has been fixed. (0.22.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.0)
- tsdown now detects types fields nested in conditional exports. (0.22.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.22.0)

## tsdown 0.21

### Breaking changes

- The `.module` suffix is stripped from CSS output filenames. (0.21.6) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.6)
- optionalDependencies are external by default. (0.21.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.5)
- Renames `onlyAllowBundle` to `onlyBundle` in deps configuration. (0.21.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.2)
- CSS support moved to @tsdown/css; users of CSS features such as CSS imports must install the package manually. (0.21.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.1)
- The 0.21.0 name for the renamed `inlineOnly` dependency option. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Moves `skipNodeModulesBundle` under the `deps` namespace. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Executable bundling now defaults to ESM format. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Executable bundling requires Node.js 25.7 or newer. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)

### Deprecations

- Replaces `noExternal` for dependencies that should always be bundled; the old option still works but is deprecated and emits warnings. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Replaces `external` for dependencies that should never be bundled; the old option still works but is deprecated and emits warnings. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Running on Node.js below 22.18.0 now emits a deprecation warning. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)

### New APIs and options

- Adds the tsdownConfig plugin hook. (0.21.9) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.9)
- Adds the tsdownConfigResolved plugin hook. (0.21.9) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.9)
- The exports option adds extensions for subpath export keys. (0.21.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.8)
- The target option now supports baseline-widely-available. (0.21.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.8)
- create-tsdown adds a Vite Plus template option. (0.21.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.8)
- Adds a module option for attw and publint to pass imported modules directly. (0.21.7) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.7)
- Adds a bin option that automatically generates the package.json bin field. (0.21.6) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.6)
- Adds the cjsReexport option to eliminate the dual module type hazard. (0.21.6) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.6)
- Workspace config functions now receive the root config, allowing them to use root configuration when generating workspace configs. (0.21.6) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.6)
- Adds CSS modules support. (0.21.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.4)
- Adds a separate output directory for executables; it defaults to build. (0.21.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.2)
- Adds an option for controlling output directory structure. (0.21.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.2)
- The new option preserves CSS imports in JavaScript output. (0.21.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.1)
- CSS imports support the `?inline` query. (0.21.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.1)
- Selects the CSS transformer and adds PostCSS support. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Accepts an object format for finer-grained control over the generated exports field. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Enables experimental bundling of a TypeScript project into a standalone Node.js SEA executable. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- When using the `exports` feature, tsdown automatically adds a package.json field listing dependencies bundled into the output. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Supports `latest` and `latest-lts` as values for `nodeVersion`. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- CSS pipeline is extracted into a package and implemented as a native Rolldown plugin, with Lightning CSS and PostCSS support. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Provides cross-platform executable building support for Node.js SEA bundling. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)

### Behavior and default changes

- When devExports is enabled, bin is added to publishConfig. (0.21.9) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.9)
- Transitive config dependencies are tracked so changes to them trigger watch reloads. (0.21.9) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.9)
- Splitting now defaults to true in unbundle mode for CSS inject. (0.21.6) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.6)
- Workspace configs are merged with mergeConfig, and variadic overrides are supported. (0.21.6) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.6)
- Copy source files are now watched, so changes to them can be picked up in watch mode. (0.21.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.3)
- Defaults to Lightning CSS. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- When `all` is true, non-entry chunks are included in exports. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Defaults to `false` instead of `ci-only`; explicitly set `true` or `ci-only` if warnings should fail builds in CI. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Now applies to Rolldown logs. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- `.node` files are now bundled by default. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- CSS support can resolve packages from node_modules. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.1), [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)

### Tooling

- The ignoreRules type now autocompletes known values, making valid rule choices easier to discover. (0.21.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.8)
- TypeScript v6 is supported, allowing projects using that version to use tsdown. (0.21.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.5)

### Fixes and other changes

- CSS modules are detected from the full id for Vue virtual SFC styles. (0.21.9) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.9)
- The Node.js version check is skipped when running in Bun. (0.21.9) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.9)
- Skips writing package.json when its content is deeply equal. (0.21.9) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.9)
- Shim files are excluded from bundled dependency hints. (0.21.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.8)
- CJS dts re-exports now export types only. (0.21.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.8)
- CJS dts re-exports are skipped for non-entry chunks. (0.21.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.8)
- Relative paths are now output correctly in logger messages. (0.21.6) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.6)
- The CSS plugin is split into pre- and post-phases to support scoped CSS. (0.21.6) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.6)
- Preprocessor languages are now compiled in virtual CSS modules. (0.21.6) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.6)
- The internal importer is no longer overridden during CSS processing. (0.21.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.5)
- CSS module keys now use aliased exports. (0.21.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.5)
- Final minification now runs on merged CSS output. (0.21.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.5)
- Subpath extensions are resolved for packages without an exports field. (0.21.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.5)
- Root @types packages are resolved correctly for declaration-file deep imports. (0.21.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.5)
- Preserves CRLF line endings in package.json. (0.21.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.4)
- Inline CSS files are now watched in watch mode. (0.21.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.3)
- Inlined dependencies are sorted by package name. (0.21.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.3)
- The unbundle root is now the lowest common ancestor of the entry files. (0.21.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.3)
- publint now supports Yarn v1. (0.21.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.3)
- Data URIs and external URLs are skipped when rebasing CSS url() references. (0.21.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.2)
- CSS imports with URL queries are ignored. (0.21.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.1)
- Correct filenames are generated for Sass files when dts is enabled. (0.21.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.1)
- CSS handling now accommodates virtual module IDs from framework plugins. (0.21.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.1)
- Does not fail builds on PLUGIN_TIMINGS warnings when enabled. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Watch-mode executions are debounced to prevent duplicate execution. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- The current working directory is now set for the hook. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)
- Entry files are re-globbed after create and delete events. (0.21.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.21.0)

## tsdown 0.20

### Breaking changes

- Using skipNodeModulesBundle and noExternal together now throws an error. (0.20.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.2)
- The dts.resolve option was removed; update configurations that use it. (0.20.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.0)

### New APIs and options

- An option was added to disable the legacy CJS warning. (0.20.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.0)

### Performance

- External plugin filtering now uses a native filter. (0.20.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.0)

### Behavior and default changes

- Unused inlineOnly entries now produce a hint message, helping keep the option clean. (0.20.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.2)
- Shows warnings when dependencies are bundled in inline-only mode. (0.20.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.1)
- Entry configuration now supports mixing array and object entries. (0.20.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.0)
- The inlineOnly option now applies to declaration files. (0.20.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.0)

### Fixes and other changes

- The import condition is now ordered before require in exports. (0.20.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.2)
- Type-only packages matching @types/* are now external. (0.20.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.2)
- Build output path separators are normalized on Windows. (0.20.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.0)
- The configuration is reloaded when the process restarts. (0.20.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.0)
- A typo in config extensions was fixed. (0.20.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.0)
- parseEnv is now optional. (0.20.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.20.0)

## tsdown 0.19

### Breaking changes

- The option was renamed to devtools. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)
- The option was renamed to devtools.ui. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)
- The option was renamed to debug. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)
- Excluded entries no longer include the extension name. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)
- Adds the legacy option; for pure ESM, main and module fields are removed. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)
- The types field is auto-filled only when exports.legacy is enabled. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)
- The deprecated option was removed. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)

### New APIs and options

- The enableDebug API is exposed. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)
- The resolveUserConfig API is exposed. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)

### Behavior and default changes

- CSS exports are generated when CSS splitting is disabled. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)
- The console is cleared when a rebuild starts. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)

### Tooling

- The migrate command now supports monorepos. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)

### Fixes and other changes

- The version check for require ESM support was updated. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)
- The typeAssert utility is available again. (0.19.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.19.0)

## tsdown 0.18

### Deprecations

- Warns that removeNodeProtocol is deprecated. (0.18.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.4)

### New APIs and options

- Adds support for splitting CSS code. (0.18.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.4)
- Adds the packageJson option to exports configuration. (0.18.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.4)
- Exports mergeConfig so developers can use it from the package. (0.18.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.4)
- Adds an option to filter specified attw rules. (0.18.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.3)
- Adds the envFile option. (0.18.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.3)
- Adds the envPrefix option. (0.18.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.3)

### Behavior and default changes

- Entry supports multiple patterns with the same base. (0.18.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.4)
- Object entry supports glob negation patterns. (0.18.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.2)
- Supports glob patterns for exports.exclude. (0.18.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.2)
- Supports glob patterns for inlineOnly. (0.18.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.2)
- Supports glob patterns for noExternal. (0.18.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.2)
- Object entry keys now support glob patterns, allowing multiple entry points to be matched with patterns. (0.18.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.1)
- The exports option is now marked as a stable feature. (0.18.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.1)
- The copy behavior is reworked to sync with rollup-plugin-copy. (0.18.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.0)

### Fixes and other changes

- Inlines the PackageJson type. (0.18.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.3)
- Shows the full entrypoint. (0.18.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.2)
- Removes dot files when cleaning. (0.18.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.2)
- Fixes skipNodeModulesBundle for monorepos. (0.18.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.2)
- The banner option is kept as-is. (0.18.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.1)
- The footer option is kept as-is. (0.18.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.18.1)

## tsdown 0.17

### Breaking changes

- The sync behavior of rollup-plugin-copy is now used, which may affect when copied files are available. (0.17.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.4)
- The profile value `esmOnly` is renamed to `esm-only`. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- failOnWarn is enabled by default in CI, so warnings cause CI builds to fail unless configured otherwise. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- The workspace cwd now defaults to the config directory. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)

### New APIs and options

- The exports option gains an exclude option. (0.17.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.4)
- Options can now be overridden by output format. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- WatchPlugin is now exported for use by developers. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- A write option is available to control writing build output. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)

### Behavior and default changes

- The cwd value is now resolved from the user config. (0.17.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.4)
- Shortcuts are now case insensitive. (0.17.4) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.4)
- The copy option supports glob patterns. (0.17.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.3)
- Errors now print their stack. (0.17.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.3)
- The rebuilt message now includes the config name. (0.17.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.3)
- The build:done hook now includes chunks. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- Outputs from multiple configs are now merged for exports. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- The migrate command now migrates optionalDependencies. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- Filtering is now supported for all workspace configs. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)

### Tooling

- Multi-config builds now support attw. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- Multi-config builds now support exports. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- tsdown uses the Rolldown native watcher. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- Multi-config builds now support publint. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)

### Fixes and other changes

- Hooks are called for each format. (0.17.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.3)
- Input and output options are merged. (0.17.3) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.3)
- Fixes handling of an empty clean array. (0.17.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.2)
- The clean setting is now respected in watch mode. (0.17.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.1)
- Functions provided for copy are now called. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)
- The ordering is corrected so require comes before import. (0.17.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.17.0)

## tsdown 0.16

### Breaking changes

- Replaces the --debug CLI flag. (0.16.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.0)
- Defaults to true when platform is node, fixing output extensions as .cjs or .mjs instead of determining them from package.json type; this may affect package.json entry fields. (0.16.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.0)
- The former Options interface is now named InlineConfig. (0.16.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.0)
- ResolvedOptions is renamed to ResolvedConfig. (0.16.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.0)
- NormalizedUserConfig is renamed to UserConfig. (0.16.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.0)

### Deprecations

- Deprecates the `esmOnly` profile value; use `esm-only` instead. (0.16.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.8)

### New APIs and options

- Adds an enabled option to feature options. (0.16.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.8)
- Addon features support ci-only and local-only. (0.16.7) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.7)
- The create-tsdown template choices now include a react-compiler template. (0.16.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.5)
- Adds a Svelte template to create-tsdown. (0.16.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.0)

### Behavior and default changes

- Glob support is enabled automatically for entries. (0.16.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.2)
- Entry extensions can be inferred. (0.16.2) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.2)

### Tooling

- Adds tsdown debug mode and Vite DevTools integration. (0.16.0) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.0)

### Fixes and other changes

- Output for exports now uses correct indentation. (0.16.5) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.5)
- Improves attw execution and includes the package name in its output. (0.16.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.1)
- Sets root to the current working directory. (0.16.1) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.16.1)

## tsdown 0.15

### New APIs and options

- tsdown now supports configuring TreeshakingOptions. (0.15.12) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.15.12)
- Adds unrun as a config loader. (0.15.10) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.15.10)
- Adds the ability to write config for debugging. (0.15.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.15.8)

### Fixes and other changes

- The unrun option is now optional. (0.15.12) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.15.12)
- Corrects generated export paths for nested index files. (0.15.10) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.15.10)
- Fixes invalid number targets. (0.15.8) — [release notes](https://github.com/rolldown/tsdown/releases/tag/v0.15.8)
