unstale

npm / tsdown

tsdown

What changed in tsdown 0.15 to 0.23, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-18.

51 breaking5 deprecations53 new APIs and options4 performance42 behavior and defaults10 tooling73 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli 0.1.1 on npm

tsdown 0.2331 changes

Breaking changes 19

  • The asyncDispose polyfill was removed.

    0.23.0release notes

  • The default profile changed from strict to esm-only; set profile: 'strict' to preserve the previous checks.

    0.23.0release notes

  • build() now returns { bundles, watch }, so callers should destructure bundles from the result.

    0.23.0release notes

  • Replace bundle: false with unbundle: true; bundle: true can be removed.

    0.23.0release notes

  • Use copy instead of publicDir or --public-dir.

    0.23.0release notes

  • Use --copy instead of --public-dir.

    0.23.0release notes

  • Use css.inject in place of injectStyle.

    0.23.0release notes

  • Custom languages, including vue, now throw when combined with an incompatible generator.

    0.23.0release notes

  • Use deps.neverBundle: true instead of skipNodeModulesBundle: true.

    0.23.0release notes

  • Use deps.onlyBundle instead of inlineOnly or deps.onlyAllowBundle.

    0.23.0release notes

  • The option was removed; dual-format builds now generate CJS declarations in a separate pass.

    0.23.0release notes

  • Use dts.customLanguages instead of dts.volarPlugins, and rename each language's create hook to createVolarPlugins.

    0.23.0release notes

  • 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.0release notes

  • Nested flag keys are now camel-cased.

    0.23.0release notes

  • Node.js 25 is no longer supported; use ^22.18.0, ^24.11.0, or >=26.0.0.

    0.23.0release notes

  • Replace removeNodeProtocol: true with nodeProtocol: 'strip'.

    0.23.0release notes

  • Use outExtensions in place of the renamed outExtension option.

    0.23.0release notes

  • The option now defaults to false; set it to true to preserve the previous behavior.

    0.23.0release notes

  • Legacy types and typesVersions fallbacks were removed; use TypeScript's bundler, node16, or nodenext module resolution.

    0.23.0release notes

New APIs and options 3

  • css.modules.localsConvention now supports a function form.

    0.23.0release notes

  • The summary option skips per-file size logs.

    0.23.0release notes

  • Programmatic watch controls are now exposed through the build result.

    0.23.0release notes

Behavior and default changes 4

  • Inlined dependencies are now scoped to configurations with exports.

    0.23.0release notes

  • Files imported through CSS @import are now watched.

    0.23.0release notes

  • The migration tool now supports non-interactive environments.

    0.23.0release notes

  • Optional dependencies are now ignored in type definitions.

    0.23.0release notes

Tooling 1

Fixes and other changes 4

  • Object entries now honor a custom root.

    0.23.1release notes

  • The dry-run publish command now packs the tarball.

    0.23.1release notes

  • False tsconfig option values are preserved instead of being overridden.

    0.23.1release notes

  • resolveDepSubpath is now applied when neverBundle is true.

    0.23.0release notes

tsdown 0.2237 changes

Breaking changes 6

  • The minimum Node.js version for exe is standardized, which may affect which Node.js versions developers can use.

    0.22.12release notes

  • Node.js 24.0–24.10 are no longer supported.

    0.22.3release notes

  • Support for Node.js 23 is explicitly dropped.

    0.22.0release notes

  • tsdown now requires Node.js 22.18.0 or later; Bun and Deno remain supported experimentally.

    0.22.0release notes

  • tsdown now uses pkg from publint results and requires publint v0.3.8 or later.

    0.22.0release notes

  • unrun is no longer bundled. Install it manually when your environment needs it with the default auto config loader.

    0.22.0release notes

New APIs and options 9

  • Adds a CLI option to control build concurrency.

    0.22.14release notes

  • Setting deps.neverBundle to true externalizes all dependencies.

    0.22.13release notes

  • Adds the resolveDepSubpath option for dependency subpath resolution.

    0.22.11release notes

  • The exe feature supports a custom Node index and download URL.

    0.22.10release notes

  • Adds the onlyImport option to deps.

    0.22.8release notes

  • Adds the logger option suppressWarnings to filter warnings.

    0.22.7release notes

  • Exports the tsdown version for use by consumers.

    0.22.4release notes

  • Adds deps.dts to override dependency bundling for declaration files.

    0.22.1release notes

  • tsx can now be used as an alternative config loader; install it manually when needed.

    0.22.0release notes

Performance 3

  • Reduces the size of the tsdown installation.

    0.22.4release notes

  • Reuses the Sass async compiler when processing CSS.

    0.22.4release notes

  • Skips renderChunk when no CSS has been collected, avoiding unnecessary work.

    0.22.3release notes

Behavior and default changes 2

  • 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.0release notes

  • When compilerOptions.declaration is true, tsdown now auto-enables dts; set dts: false to opt out.

    0.22.0release notes

Tooling 1

Fixes and other changes 16

  • tinyexec no longer modifies PATH.

    0.22.13release notes

  • Dependencies listed through peerDependenciesMeta are handled as external dependencies.

    0.22.10release notes

  • The exe feature handles Windows Node archives when running on Linux.

    0.22.10release notes

  • Dynamic imports are now checked in onlyImport.

    0.22.9release notes

  • Plugin arrays are concatenated when merging config.

    0.22.8release notes

  • Banner/footer function addons are evaluated per chunk.

    0.22.5release notes

  • Unbundled CJS output no longer emits the ESM shim banner.

    0.22.5release notes

  • Skips the cd hint when the current directory is selected.

    0.22.4release notes

  • Generates source maps to avoid the SOURCEMAP_BROKEN warning.

    0.22.4release notes

  • The option is respected regardless of the logger level.

    0.22.4release notes

  • Fixes inline CI detection.

    0.22.3release notes

  • Adds extra space for emoji rendering in Windows Terminal.

    0.22.1release notes

  • Adds shims support for unbundled builds.

    0.22.1release notes

  • Improves error handling for unsupported TypeScript syntax on Node.js.

    0.22.1release notes

  • The logic for duplicate configuration warnings has been fixed.

    0.22.0release notes

  • tsdown now detects types fields nested in conditional exports.

    0.22.0release notes

tsdown 0.2172 changes

Breaking changes 8

  • The .module suffix is stripped from CSS output filenames.

    0.21.6release notes

  • optionalDependencies are external by default.

    0.21.5release notes

  • Renames onlyAllowBundle to onlyBundle in deps configuration.

    0.21.2release notes

  • CSS support moved to @tsdown/css; users of CSS features such as CSS imports must install the package manually.

    0.21.1release notes

  • The 0.21.0 name for the renamed inlineOnly dependency option.

    0.21.0release notes

  • Moves skipNodeModulesBundle under the deps namespace.

    0.21.0release notes

  • Executable bundling now defaults to ESM format.

    0.21.0release notes

  • Executable bundling requires Node.js 25.7 or newer.

    0.21.0release notes

Deprecations 3

  • Replaces noExternal for dependencies that should always be bundled; the old option still works but is deprecated and emits warnings.

    0.21.0release notes

  • Replaces external for dependencies that should never be bundled; the old option still works but is deprecated and emits warnings.

    0.21.0release notes

  • Running on Node.js below 22.18.0 now emits a deprecation warning.

    0.21.0release notes

New APIs and options 21

  • Adds the tsdownConfig plugin hook.

    0.21.9release notes

  • Adds the tsdownConfigResolved plugin hook.

    0.21.9release notes

  • The exports option adds extensions for subpath export keys.

    0.21.8release notes

  • The target option now supports baseline-widely-available.

    0.21.8release notes

  • create-tsdown adds a Vite Plus template option.

    0.21.8release notes

  • Adds a module option for attw and publint to pass imported modules directly.

    0.21.7release notes

  • Adds a bin option that automatically generates the package.json bin field.

    0.21.6release notes

  • Adds the cjsReexport option to eliminate the dual module type hazard.

    0.21.6release notes

  • Workspace config functions now receive the root config, allowing them to use root configuration when generating workspace configs.

    0.21.6release notes

  • Adds CSS modules support.

    0.21.4release notes

  • Adds a separate output directory for executables; it defaults to build.

    0.21.2release notes

  • Adds an option for controlling output directory structure.

    0.21.2release notes

  • The new option preserves CSS imports in JavaScript output.

    0.21.1release notes

  • CSS imports support the ?inline query.

    0.21.1release notes

  • Selects the CSS transformer and adds PostCSS support.

    0.21.0release notes

  • Accepts an object format for finer-grained control over the generated exports field.

    0.21.0release notes

  • Enables experimental bundling of a TypeScript project into a standalone Node.js SEA executable.

    0.21.0release notes

  • When using the exports feature, tsdown automatically adds a package.json field listing dependencies bundled into the output.

    0.21.0release notes

  • Supports latest and latest-lts as values for nodeVersion.

    0.21.0release notes

  • CSS pipeline is extracted into a package and implemented as a native Rolldown plugin, with Lightning CSS and PostCSS support.

    0.21.0release notes

  • Provides cross-platform executable building support for Node.js SEA bundling.

    0.21.0release notes

Behavior and default changes 11

  • When devExports is enabled, bin is added to publishConfig.

    0.21.9release notes

  • Transitive config dependencies are tracked so changes to them trigger watch reloads.

    0.21.9release notes

  • Splitting now defaults to true in unbundle mode for CSS inject.

    0.21.6release notes

  • Workspace configs are merged with mergeConfig, and variadic overrides are supported.

    0.21.6release notes

  • Copy source files are now watched, so changes to them can be picked up in watch mode.

    0.21.3release notes

  • Defaults to Lightning CSS.

    0.21.0release notes

  • When all is true, non-entry chunks are included in exports.

    0.21.0release notes

  • Defaults to false instead of ci-only; explicitly set true or ci-only if warnings should fail builds in CI.

    0.21.0release notes

  • Now applies to Rolldown logs.

    0.21.0release notes

  • .node files are now bundled by default.

    0.21.0release notes

  • CSS support can resolve packages from node_modules.

    0.21.0release notesrelease notes

Tooling 2

  • The ignoreRules type now autocompletes known values, making valid rule choices easier to discover.

    0.21.8release notes

  • TypeScript v6 is supported, allowing projects using that version to use tsdown.

    0.21.5release notes

Fixes and other changes 27

  • CSS modules are detected from the full id for Vue virtual SFC styles.

    0.21.9release notes

  • The Node.js version check is skipped when running in Bun.

    0.21.9release notes

  • Skips writing package.json when its content is deeply equal.

    0.21.9release notes

  • Shim files are excluded from bundled dependency hints.

    0.21.8release notes

  • CJS dts re-exports now export types only.

    0.21.8release notes

  • CJS dts re-exports are skipped for non-entry chunks.

    0.21.8release notes

  • Relative paths are now output correctly in logger messages.

    0.21.6release notes

  • The CSS plugin is split into pre- and post-phases to support scoped CSS.

    0.21.6release notes

  • Preprocessor languages are now compiled in virtual CSS modules.

    0.21.6release notes

  • The internal importer is no longer overridden during CSS processing.

    0.21.5release notes

  • CSS module keys now use aliased exports.

    0.21.5release notes

  • Final minification now runs on merged CSS output.

    0.21.5release notes

  • Subpath extensions are resolved for packages without an exports field.

    0.21.5release notes

  • Root @types packages are resolved correctly for declaration-file deep imports.

    0.21.5release notes

  • Preserves CRLF line endings in package.json.

    0.21.4release notes

  • Inline CSS files are now watched in watch mode.

    0.21.3release notes

  • Inlined dependencies are sorted by package name.

    0.21.3release notes

  • The unbundle root is now the lowest common ancestor of the entry files.

    0.21.3release notes

  • publint now supports Yarn v1.

    0.21.3release notes

  • Data URIs and external URLs are skipped when rebasing CSS url() references.

    0.21.2release notes

  • CSS imports with URL queries are ignored.

    0.21.1release notes

  • Correct filenames are generated for Sass files when dts is enabled.

    0.21.1release notes

  • CSS handling now accommodates virtual module IDs from framework plugins.

    0.21.1release notes

  • Does not fail builds on PLUGIN_TIMINGS warnings when enabled.

    0.21.0release notes

  • Watch-mode executions are debounced to prevent duplicate execution.

    0.21.0release notes

  • The current working directory is now set for the hook.

    0.21.0release notes

  • Entry files are re-globbed after create and delete events.

    0.21.0release notes

tsdown 0.2014 changes

Breaking changes 2

  • Using skipNodeModulesBundle and noExternal together now throws an error.

    0.20.2release notes

  • The dts.resolve option was removed; update configurations that use it.

    0.20.0release notes

New APIs and options 1

  • An option was added to disable the legacy CJS warning.

    0.20.0release notes

Performance 1

  • External plugin filtering now uses a native filter.

    0.20.0release notes

Behavior and default changes 4

  • Unused inlineOnly entries now produce a hint message, helping keep the option clean.

    0.20.2release notes

  • Shows warnings when dependencies are bundled in inline-only mode.

    0.20.1release notes

  • Entry configuration now supports mixing array and object entries.

    0.20.0release notes

  • The inlineOnly option now applies to declaration files.

    0.20.0release notes

Fixes and other changes 6

  • The import condition is now ordered before require in exports.

    0.20.2release notes

  • Type-only packages matching @types/* are now external.

    0.20.2release notes

  • Build output path separators are normalized on Windows.

    0.20.0release notes

  • The configuration is reloaded when the process restarts.

    0.20.0release notes

  • A typo in config extensions was fixed.

    0.20.0release notes

  • parseEnv is now optional.

    0.20.0release notes

tsdown 0.1914 changes

Breaking changes 7

  • The option was renamed to devtools.

    0.19.0release notes

  • The option was renamed to devtools.ui.

    0.19.0release notes

  • The option was renamed to debug.

    0.19.0release notes

  • Excluded entries no longer include the extension name.

    0.19.0release notes

  • Adds the legacy option; for pure ESM, main and module fields are removed.

    0.19.0release notes

  • The types field is auto-filled only when exports.legacy is enabled.

    0.19.0release notes

  • The deprecated option was removed.

    0.19.0release notes

New APIs and options 2

Behavior and default changes 2

  • CSS exports are generated when CSS splitting is disabled.

    0.19.0release notes

  • The console is cleared when a rebuild starts.

    0.19.0release notes

Tooling 1

Fixes and other changes 2

  • The version check for require ESM support was updated.

    0.19.0release notes

  • The typeAssert utility is available again.

    0.19.0release notes

tsdown 0.1821 changes

Deprecations 1

New APIs and options 6

Behavior and default changes 8

  • Entry supports multiple patterns with the same base.

    0.18.4release notes

  • Object entry supports glob negation patterns.

    0.18.2release notes

  • Supports glob patterns for exports.exclude.

    0.18.2release notes

  • Supports glob patterns for inlineOnly.

    0.18.2release notes

  • Supports glob patterns for noExternal.

    0.18.2release notes

  • Object entry keys now support glob patterns, allowing multiple entry points to be matched with patterns.

    0.18.1release notes

  • The exports option is now marked as a stable feature.

    0.18.1release notes

  • The copy behavior is reworked to sync with rollup-plugin-copy.

    0.18.0release notes

Fixes and other changes 6

tsdown 0.1727 changes

Breaking changes 4

  • The sync behavior of rollup-plugin-copy is now used, which may affect when copied files are available.

    0.17.4release notes

  • The profile value esmOnly is renamed to esm-only.

    0.17.0release notes

  • failOnWarn is enabled by default in CI, so warnings cause CI builds to fail unless configured otherwise.

    0.17.0release notes

  • The workspace cwd now defaults to the config directory.

    0.17.0release notes

New APIs and options 4

  • The exports option gains an exclude option.

    0.17.4release notes

  • Options can now be overridden by output format.

    0.17.0release notes

  • WatchPlugin is now exported for use by developers.

    0.17.0release notes

  • A write option is available to control writing build output.

    0.17.0release notes

Behavior and default changes 9

Tooling 4

Fixes and other changes 6

tsdown 0.1616 changes

Breaking changes 5

  • Replaces the --debug CLI flag.

    0.16.0release notes

  • 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.0release notes

  • The former Options interface is now named InlineConfig.

    0.16.0release notes

  • ResolvedOptions is renamed to ResolvedConfig.

    0.16.0release notes

  • NormalizedUserConfig is renamed to UserConfig.

    0.16.0release notes

Deprecations 1

  • Deprecates the esmOnly profile value; use esm-only instead.

    0.16.8release notes

New APIs and options 4

  • Adds an enabled option to feature options.

    0.16.8release notes

  • Addon features support ci-only and local-only.

    0.16.7release notes

  • The create-tsdown template choices now include a react-compiler template.

    0.16.5release notes

  • Adds a Svelte template to create-tsdown.

    0.16.0release notes

Behavior and default changes 2

Tooling 1

  • Adds tsdown debug mode and Vite DevTools integration.

    0.16.0release notes

Fixes and other changes 3

  • Output for exports now uses correct indentation.

    0.16.5release notes

  • Improves attw execution and includes the package name in its output.

    0.16.1release notes

  • Sets root to the current working directory.

    0.16.1release notes

tsdown 0.156 changes

New APIs and options 3

Fixes and other changes 3