You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#215915cf592 Thanks @ingvaldlorentzen! - Fixed already-published version detection with npm 12, which always wraps successful npm info --json output in an array. The unwrapped output made changeset publish treat every package as unpublished and fail attempting to republish existing versions.
#188996ca062 Thanks @mixelburg! - Error on unsupported flags for individual CLI commands and print the matching command usage to make mistakes easier to spot.
#187342943b7 Thanks @mixelburg! - Respond to --help on all subcommands. Previously, --help was only handled when it was the sole argument; passing it alongside a subcommand (e.g. changeset version --help) would silently execute the command instead. Now --help always exits early and prints per-command usage when a known subcommand is provided, or the general help text otherwise.
Patch Changes
d2121dc Thanks @Andarist! - Fix npm auth for path-based registries during publish by preserving configured registry URLs instead of normalizing them.
#1888036fdd4 Thanks @mixelburg! - Fix several changeset version issues with workspace protocol dependencies. Valid explicit workspace: ranges and aliases are no longer rewritten unnecessarily, and workspace path references are handled correctly during versioning.
#19035c4731f Thanks @Andarist! - Gracefully handle stale npm info data leading to duplicate publish attempts.
#1867f61e716 Thanks @Andarist! - Improved detection for published state of prerelease-only packages without latest dist-tag on GitHub Packages registry.
#3032229154b Thanks @stipsan! - fix: use a literal @ instead of the percent-encoded %40 in the homepage links to the packages/@sanity/* directories, so the URLs read cleanly in the npm UI (GitHub resolves both forms)
#29597a1e207 Thanks @stipsan! - Add outDir: "${configDir}/dist" to the recommended preset
Emitting to dist is already the default in @sanity/pkg-utils and tsdown, but every repo extending these presets had to repeat it in their own tsconfig. Since ${configDir} resolves to the directory of the tsconfig that extends the preset, output now lands in the dist folder next to your package.json by default, and the manual declaration can be removed:
#364695ad65a Thanks @stipsan! - Add panda.cascadeLayers, passed through to @sanity/pandacss-tsdown-plugin. It defaults to true, so the Panda stylesheet keeps its cascade layers, as before; panda: {cascadeLayers: false} publishes it without them, so consumers can override its base styles without overriding its states. Switching the default to false is planned for a later release of its own, once @sanity/ui and sanity have adopted the option.
A panda option the installed plugin doesn't have (cascadeLayers on a plugin before 0.2.0, say) now fails the config with the upgrade to make, instead of reaching a plugin that ignores it; the peer range still accepts every version of the plugin.
target: 'baseline-widely-available' now transforms the CSS of vanillaExtract, panda and css for the browsers tsdown expands it to, instead of the @sanity/browserslist-config fallback. A browser you name next to the alias (['chrome61', 'baseline-widely-available']) keeps the lower of the two versions.
panda reads the top-level target from the final config, so a target you set with mergeConfig() after defineConfig() decides the browsers. An explicit panda.target or panda.lightningcss.targets still wins.
panda and vanillaExtract or css writing the same stylesheet is detected for ./-prefixed names too, and a css option with splitting no longer counts as a conflict.
Enabling panda without @sanity/pandacss-tsdown-plugin installed explains how to install it.
The target fixes apply with @sanity/pandacss-tsdown-plugin 0.1.0 as well.
#3639da36413 Thanks @stipsan! - Add the panda option for packages styled with Panda CSS. Set panda: true to enable @sanity/pandacss-tsdown-plugin with the Sanity defaults, or pass an options object to customize it.
By default:
the style calls that can be resolved statically are rewritten into class names, and the generated CSS is extracted into dist/bundle.css
the entry chunks that use Panda styles import the stylesheet
the stylesheet is published as a conditional ./bundle.css export: the browser and style conditions select the CSS file, node and default a no-op JS shim, so the import also loads in Node.js
The CSS syntax is transformed for the configured browsers — panda.target, falling back to the top-level target. When neither names browsers (for example node20), the browsers of @sanity/browserslist-config are used instead.
Setup: install @sanity/pandacss-tsdown-plugin as a dev dependency; it is an optional peer dependency of this package. @pandacss/dev is recommended — for the usual "prepare": "panda codegen" script and the panda CLI — but not required.
#362304ff6bd Thanks @stipsan! - vanillaExtract.minify and css.minify no longer default to true. CSS is left unminified unless minify: true is set. The CSS syntax-lowering target default is unchanged.
#3618a5b59df Thanks @stipsan! - feat: add the opt-in identifiers: 'safe' option, keeping class names apart across package releases
The default 'short' identifiers hash only the package name and the file path, then append a counter of the identifiers generated in the file so far. So a release that reorders a file's styles reuses its class names for different rules: ._2mi48t0 is the Button loading overlay in @sanity/ui 4.4.2 and the Button root in 4.4.4, and pages that loaded the CSS of both releases styled the new Buttons with the old overlay rule.
identifiers: 'safe' is 'short' with the package version in the file-scope hash: @emotion/hash(packageName + '@' + packageVersion + filePath), followed by the same base-36 counter, with the same _ prefix when the name starts with a digit. The version is read from the same package.json as the package name. Every release gets its own class names, and the same release always builds the same ones. It is available in @sanity/vanilla-extract-rolldown-plugin, @sanity/vanilla-extract-tsdown-plugin, @sanity/vanilla-extract-vite-plugin (including createCompiler), and the vanillaExtract option of @sanity/tsdown-config:
The defaults are unchanged. @sanity/vanilla-extract-integration exports resolveIdentifierOption() and the PluginIdentifierOption type that implement the option, and getPackageInfo() now also returns the package version.
BREAKING: the @sanity/tsdown-config and @sanity/vanilla-extract-tsdown-plugin tsdown peer range is now ^0.23.0; tsdown 0.22 is no longer supported. Node.js 25
can no longer run either package or pkg build. Use Node ^22.18.0, ^24.11.0, or >=26.0.0.
tsdown 0.23 removes deprecated config options. Replace dts.tsgo: true and dts.oxc: true with dts.generator: 'tsgo' and dts.generator: 'oxc'.
Replace dts.oxc: false with dts.generator: 'tsc'. Remove dts.cjsReexport.
Replace dts.volarPlugins with dts.customLanguages and rename each language's create hook to createVolarPlugins.
Under deps, replace skipNodeModulesBundle: true with neverBundle: true
and onlyAllowBundle with onlyBundle.
deps.resolveDepSubpath: true preserves the old dependency-specifier behavior. pkg watch now closes tsdown's native watch handle, including its Rolldown watchers
and keyboard-shortcut resources, and sets ignoreWatch on package.json and tsconfig.json so tsdown does not restart itself and orphan a watcher that abort
cannot close. CSS builds now need @tsdown/css@0.23.0, the exact version tsdown 0.23
pins.
tsdown 0.23 also emits declarations with inline export declare modifiers instead of
a trailing export list. A .d.ts with no export statement is an export context, so a
type that the source left unexported becomes part of the published API. Export the
types you mean to publish and tag them @public.
#33208d15fe5 Thanks @stipsan! - Breaking: the babel pipeline is opt-in. reactCompiler defaults to transform: 'oxc', and @rolldown/plugin-babel + @babel/core are optional peer dependencies instead of dependencies. To stay on babel: set transform: 'babel' and pnpm add -D @rolldown/plugin-babel @babel/core babel-plugin-react-compiler.
#3319f4ce0f7 Thanks @stipsan! - Installing only one of the optional React Compiler packages no longer breaks defineConfig()'s types. The missing package's typings used to degrade to any and collapse the ReactCompilerOptions union, so every reactCompiler config resolved to the reactServer: true overload (Promise<UserConfig[]>) unless consumers stubbed the missing module. Now the uninstalled branch degrades to just transform/reactServer while the installed one keeps its real typings — stubs like sanity-io/ui's typings/babel-plugin-react-compiler.d.ts can be deleted.
#331224bfc3f Thanks @stipsan! - Add reactCompiler.transform to pick the React Compiler implementation: 'babel' (the default, runs babel-plugin-react-compiler) or the experimental 'oxc' (runs oxc-transform-react, the Rust port — one native pass for React Compiler + TypeScript/JSX). Both compilers are optional peer dependencies.
Pass an object to customize format / fileName. The report is not a publishable artifact — exclude it from package.jsonfiles (e.g. "!dist/analyze-data.md"). @sanity/pkg-utils forwards the same option from package.config.ts.
#32885bfa760 Thanks @stipsan! - Stop flagging the synthesized namespace wrappers of the declaration bundler with ae-missing-release-tag.
Namespace re-exports (export * as ns from './module', or import * as ns + export {ns}) make the declaration bundling pass synthesize a declare namespace <module>_d_exports {…} wrapper that drops the doc comment of the re-export statement, so the wrapper could never carry a release tag and there was no userland fix short of downgrading the rule for the whole package. The TSDoc check now recognizes those wrappers (the interop naming, declared as a namespace in the entry or a shared chunk, a body that only re-exports sibling declarations, and re-exported under an alias) and exempts them from ae-missing-release-tag, like API Extractor's own rollups never checked the equivalent namespace. Everything else, including user namespaces that merely resemble the interop naming, stays checked: a namespace that declares members of its own is yours to tag, even when the bundler's deconflicting hands it a wrapper-shaped name.
#325033e7b93 Thanks @stipsan! - Move the conditional CSS export from inject.nodeCompat to exports.nodeCompat, and give @tsdown/css output the same treatment.
nodeCompat configures how the CSS file is published, not how the import is injected, so it moves to a dedicated exports option. inject and exports are now independent: inject prepends an import of the CSS to entry chunks, while exports publishes it as the ./<fileName> export subpath (which also makes any injected import self-referential). exports: true declares a plain string export for browser-only packages; exports: {nodeCompat: true} declares the conditional export and emits the no-op JS shim plus its .d.ts. inject: {nodeCompat: true} keeps working, normalized to {inject: true, exports: {nodeCompat: true}} with a deprecation warning; an explicit exports wins over it.
@sanity/tsdown-config gains a css.exports option implementing the same pattern on top of @tsdown/css (an optional peer dependency), which compiles CSS but has no node-shim concept of its own — its inject emits a relative import that throws in runtimes that cannot load .css files.
@sanity/pkg-utils gains a css option, and builds a .css export subpath that declares a source:
pkg build compiles it to dist/ui/styles.css with the same minify and lowering settings vanillaExtract gets, emits the shim, and fills in the types/browser/style/node/default conditions. @sanity/parse-package-json exposes the new parseCssExports for reading those subpaths, and parseExports no longer returns them as JS entries.
#3253bc16006 Thanks @stipsan! - Suppress CIRCULAR_DEPENDENCY warnings from the declaration bundling pass by default, and add a suppressWarnings option.
defineConfig enables Rolldown's checks.circularDependency, which also reports cycles between the emitted .d.ts modules. Those imports are type-only and erased at runtime, so the cycles carry none of the hazards the check exists to surface, and they're unavoidable for mutually referencing public types — in sanity-io/sanity#13753 109 of 136 cycle warnings were declaration-only, drowning out the 27 real ones. The config now sets tsdown's suppressWarnings to drop warnings whose entire cycle consists of declaration files (.d.ts/.d.mts/.d.cts); a cycle that includes even one runtime module still warns. Consumers that filtered these out themselves (like @repo/tsdown.config in sanity-io/sanity) can drop their own predicate.
The new suppressWarnings option takes tsdown's own value shapes (strings matched with includes, regular expressions matched with test, or a predicate) and is OR'd with the built-in suppression, so per-package suppressions can't silently undo it. Merging suppressWarnings over the returned config still replaces the default entirely (mergeConfig replaces functions), which is the escape hatch for restoring every warning: mergeConfig(await defineConfig(), {suppressWarnings: () => false}).
tsdown added suppressWarnings in 0.22.7, so the tsdown peer range is raised from ^0.22.5 to ^0.22.7. On 0.22.5/0.22.6 the option is silently ignored (the cycle warnings keep appearing) and the UserConfig['suppressWarnings'] indexed access in the published declarations does not resolve.
#3246c1106f1 Thanks @stipsan! - Move the tsdoc feature (API Extractor TSDoc/release-tag checking) from @sanity/pkg-utils into @sanity/tsdown-config.
In @sanity/tsdown-config the option is false by default; set tsdoc: true (or an options object) to run the check after the build via tsdown's build:done hook. The checker lives at @sanity/tsdown-config/tsdoc and is lazy-loaded from the root config, so API Extractor is not part of the default entry's module graph. @sanity/pkg-utils continues enabling it by default (tsdoc: true) when composing the config, and still runs it during pkg check via checkTsdoc from @sanity/tsdown-config/tsdoc.
#3238e19e63e Thanks @stipsan! - Default exports.enabled to true instead of 'local-only'.
Gating on CI via 'local-only'/'ci-only' surprised environments that set CI=true without meaning "don't rewrite package.json" (notably Cursor Cloud and GitHub Copilot)
#3221125080f Thanks @stipsan! - Make defineConfig a composable base for programmatic hosts (like the upcoming tsdown-powered @sanity/pkg-utils):
New cwd option: forwarded to tsdown's own cwd, and used for the package-manager detection behind the devExports default instead of process.cwd() — so builds driven programmatically for a package in another directory resolve the right defaults.
Package-manager detection only runs when it can affect the outcome: it exists solely to decide the pnpm-gated devExports: true default, so it is skipped when the userland exports value replaces the defaults (false, true, a bare CI condition) or sets devExports explicitly. Explicit configs behave identically across package managers, with no filesystem probing.
The composition contract is now documented and covered by tests: defineConfig() output is a mergeConfig-safe base — plugins append (never clobbering the React Compiler / vanilla-extract plugins this config sets up), plain objects deep-merge, and scalars/non-plugin arrays replace.
Node 20 support is dropped: engines.node is now ^22.18.0 || >=24.11.0, matching tsdown's own requirement. The previous >=20.19 <22 range was unachievable in practice — this package only executes inside tsdown's process, which already requires Node ^22.18.0.
Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.
This PR includes no changesets
When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
^0.6.0→^0.7.0^2.30.0→^2.31.1^2.1.0→^2.2.1^0.5.8→^0.31.1^24.12.2→^24.19.2^4.1.2→^4.1.12^0.44.0→^0.73.0^1.59.0→^1.88.04f9cc66→84c30a84d2d3a0→10bcd35^0.21.7→^0.23.1^0.28.18→^0.28.20^4.1.2→^4.1.12Release Notes
changesets/changesets (@changesets/changelog-github)
v0.7.0Compare Source
Minor Changes
94578cfThanks @Kauhsa! - AddeddisableThanksoptionchangesets/changesets (@changesets/cli)
v2.31.1Compare Source
Patch Changes
15cf592Thanks @ingvaldlorentzen! - Fixed already-published version detection with npm 12, which always wraps successfulnpm info --jsonoutput in an array. The unwrapped output madechangeset publishtreat every package as unpublished and fail attempting to republish existing versions.v2.31.0Compare Source
Minor Changes
#1889
96ca062Thanks @mixelburg! - Error on unsupported flags for individual CLI commands and print the matching command usage to make mistakes easier to spot.#1873
42943b7Thanks @mixelburg! - Respond to--helpon all subcommands. Previously,--helpwas only handled when it was the sole argument; passing it alongside a subcommand (e.g.changeset version --help) would silently execute the command instead. Now--helpalways exits early and prints per-command usage when a known subcommand is provided, or the general help text otherwise.Patch Changes
d2121dcThanks @Andarist! - Fix npm auth for path-based registries during publish by preserving configured registry URLs instead of normalizing them.#1888
036fdd4Thanks @mixelburg! - Fix severalchangeset versionissues with workspace protocol dependencies. Valid explicitworkspace:ranges and aliases are no longer rewritten unnecessarily, and workspace path references are handled correctly during versioning.#1903
5c4731fThanks @Andarist! - Gracefully handle stalenpm infodata leading to duplicate publish attempts.#1867
f61e716Thanks @Andarist! - Improved detection forpublishedstate of prerelease-only packages withoutlatestdist-tag on GitHub Packages registry.Updated dependencies [
036fdd4,036fdd4,036fdd4]:sanity-io/pkg-utils (@sanity/tsconfig)
v2.2.1Compare Source
Patch Changes
229154bThanks @stipsan! - fix: use a literal@instead of the percent-encoded%40in thehomepagelinks to thepackages/@sanity/*directories, so the URLs read cleanly in the npm UI (GitHub resolves both forms)v2.2.0Compare Source
Minor Changes
#2959
7a1e207Thanks @stipsan! - AddoutDir: "${configDir}/dist"to therecommendedpresetEmitting to
distis already the default in@sanity/pkg-utilsandtsdown, but every repo extending these presets had to repeat it in their own tsconfig. Since${configDir}resolves to the directory of the tsconfig that extends the preset, output now lands in thedistfolder next to yourpackage.jsonby default, and the manual declaration can be removed:{ "extends": "@sanity/tsconfig/strictest", - "compilerOptions": { - "outDir": "${configDir}/dist" - } }sanity-io/pkg-utils (@sanity/tsdown-config)
v0.31.1Compare Source
No changes in this release.
v0.31.0Compare Source
Minor Changes
#3646
95ad65aThanks @stipsan! - Addpanda.cascadeLayers, passed through to@sanity/pandacss-tsdown-plugin. It defaults totrue, so the Panda stylesheet keeps its cascade layers, as before;panda: {cascadeLayers: false}publishes it without them, so consumers can override its base styles without overriding its states. Switching the default tofalseis planned for a later release of its own, once@sanity/uiandsanityhave adopted the option.A
pandaoption the installed plugin doesn't have (cascadeLayerson a plugin before 0.2.0, say) now fails the config with the upgrade to make, instead of reaching a plugin that ignores it; the peer range still accepts every version of the plugin.v0.30.1Compare Source
Patch Changes
#3642
158b317Thanks @stipsan! - Fix how CSS targets and thepandaoption resolve:target: 'baseline-widely-available'now transforms the CSS ofvanillaExtract,pandaandcssfor the browsers tsdown expands it to, instead of the@sanity/browserslist-configfallback. A browser you name next to the alias (['chrome61', 'baseline-widely-available']) keeps the lower of the two versions.pandareads the top-leveltargetfrom the final config, so atargetyou set withmergeConfig()afterdefineConfig()decides the browsers. An explicitpanda.targetorpanda.lightningcss.targetsstill wins.pandaandvanillaExtractorcsswriting the same stylesheet is detected for./-prefixed names too, and acssoption withsplittingno longer counts as a conflict.pandawithout@sanity/pandacss-tsdown-plugininstalled explains how to install it.The target fixes apply with
@sanity/pandacss-tsdown-plugin0.1.0 as well.v0.30.0Compare Source
Minor Changes
#3639
da36413Thanks @stipsan! - Add thepandaoption for packages styled with Panda CSS. Setpanda: trueto enable@sanity/pandacss-tsdown-pluginwith the Sanity defaults, or pass an options object to customize it.By default:
dist/bundle.css./bundle.cssexport: thebrowserandstyleconditions select the CSS file,nodeanddefaulta no-op JS shim, so the import also loads in Node.jsThe CSS syntax is transformed for the configured browsers —
panda.target, falling back to the top-leveltarget. When neither names browsers (for examplenode20), the browsers of@sanity/browserslist-configare used instead.Minification is opt-in:
Setup: install
@sanity/pandacss-tsdown-pluginas a dev dependency; it is an optional peer dependency of this package.@pandacss/devis recommended — for the usual"prepare": "panda codegen"script and thepandaCLI — but not required.#3623
04ff6bdThanks @stipsan! -vanillaExtract.minifyandcss.minifyno longer default totrue. CSS is left unminified unlessminify: trueis set. The CSS syntax-loweringtargetdefault is unchanged.Patch Changes
648e64bThanks @squiggler-app! - fix(deps): update dependency rolldown to ~1.2.14648e64b]:v0.29.0Compare Source
Minor Changes
#3618
a5b59dfThanks @stipsan! - feat: add the opt-inidentifiers: 'safe'option, keeping class names apart across package releasesThe default
'short'identifiers hash only the package name and the file path, then append a counter of the identifiers generated in the file so far. So a release that reorders a file's styles reuses its class names for different rules:._2mi48t0is the Button loading overlay in@sanity/ui4.4.2 and the Button root in 4.4.4, and pages that loaded the CSS of both releases styled the new Buttons with the old overlay rule.identifiers: 'safe'is'short'with the package version in the file-scope hash:@emotion/hash(packageName + '@' + packageVersion + filePath), followed by the same base-36 counter, with the same_prefix when the name starts with a digit. The version is read from the samepackage.jsonas the package name. Every release gets its own class names, and the same release always builds the same ones. It is available in@sanity/vanilla-extract-rolldown-plugin,@sanity/vanilla-extract-tsdown-plugin,@sanity/vanilla-extract-vite-plugin(includingcreateCompiler), and thevanillaExtractoption of@sanity/tsdown-config:The defaults are unchanged.
@sanity/vanilla-extract-integrationexportsresolveIdentifierOption()and thePluginIdentifierOptiontype that implement the option, andgetPackageInfo()now also returns the packageversion.Patch Changes
a5b59df]:v0.28.8Compare Source
Patch Changes
dd545f3Thanks @squiggler-app! - fix(deps): update tsdown to ^0.23.1dd545f3]:v0.28.7Compare Source
Patch Changes
v0.28.6Compare Source
Patch Changes
#3569
5f50c99Thanks @squiggler-app! - fix(deps): update dependency @microsoft/api-extractor to ^7.59.4#3576
a7d96e4Thanks @squiggler-app! - fix(deps): update dependency rolldown to ~1.2.13Updated dependencies [
a7d96e4,d212bfa]:v0.28.5Compare Source
Patch Changes
#3559
54a7663Thanks @squiggler-app! - fix(deps): update dependency @vitejs/plugin-react to ^6.1.2#3561
809af9aThanks @squiggler-app! - fix(deps): update dependency package-manager-detector to ^1.9.0Updated dependencies []:
v0.28.4Compare Source
Patch Changes
#3534
847e9c3Thanks @squiggler-app! - fix(deps): update dependency rolldown to ~1.2.12#3541
ea9ea1cThanks @squiggler-app! - fix(deps): update dependency publint to ^0.3.25#3546
733c107Thanks @squiggler-app! - fix(deps): update dependency @microsoft/api-extractor to ^7.59.3#3547
db47390Thanks @squiggler-app! - fix(deps): update dependency @microsoft/tsdoc-config to ^0.18.3#3548
3cc7ff8Thanks @squiggler-app! - fix(deps): update dependency browserslist to ^4.29.3Updated dependencies [
847e9c3]:v0.28.3Compare Source
Patch Changes
v0.28.2Compare Source
Patch Changes
#3488
76c7488Thanks @squiggler-app! - fix(deps): update dependency @microsoft/api-extractor to ^7.59.2#3504
a709c9eThanks @squiggler-app! - fix(deps): update dependency browserslist to ^4.29.1#3513
9f1d9faThanks @squiggler-app! - fix(deps): update dependency rolldown to ~1.2.11Updated dependencies [
9f1d9fa]:v0.28.1Compare Source
Patch Changes
#3424
232d6eaThanks @squiggler-app! - fix(deps): update dependency @microsoft/api-extractor to ^7.59.1#3440
4c451e1Thanks @squiggler-app! - fix(deps): update dependency browserslist to ^4.29.0#3441
7bbcee4Thanks @squiggler-app! - fix(deps): update dependency rolldown to ~1.2.9#3449
857c2ddThanks @squiggler-app! - fix(deps): update dependency @microsoft/tsdoc-config to ^0.18.2Updated dependencies [
7bbcee4]:v0.28.0Compare Source
Minor Changes
#3406
5372ae6Thanks @stipsan! - Upgrade tsdown and@tsdown/cssto 0.23.BREAKING: the
@sanity/tsdown-configand@sanity/vanilla-extract-tsdown-plugintsdownpeer range is now^0.23.0; tsdown 0.22 is no longer supported. Node.js 25can no longer run either package or
pkg build. Use Node^22.18.0,^24.11.0, or>=26.0.0.tsdown 0.23 removes deprecated config options. Replace
dts.tsgo: trueanddts.oxc: truewithdts.generator: 'tsgo'anddts.generator: 'oxc'.Replace
dts.oxc: falsewithdts.generator: 'tsc'. Removedts.cjsReexport.Replace
dts.volarPluginswithdts.customLanguagesand rename each language'screatehook tocreateVolarPlugins.Under
deps, replaceskipNodeModulesBundle: truewithneverBundle: trueand
onlyAllowBundlewithonlyBundle.deps.resolveDepSubpath: truepreserves the old dependency-specifier behavior.pkg watchnow closes tsdown's native watch handle, including its Rolldown watchersand keyboard-shortcut resources, and sets
ignoreWatchonpackage.jsonandtsconfig.jsonso tsdown does not restart itself and orphan a watcher that abortcannot close. CSS builds now need
@tsdown/css@0.23.0, the exact version tsdown 0.23pins.
tsdown 0.23 also emits declarations with inline
export declaremodifiers instead ofa trailing export list. A
.d.tswith no export statement is an export context, so atype that the source left unexported becomes part of the published API. Export the
types you mean to publish and tag them
@public.Patch Changes
7edcb76Thanks @squiggler-app! - fix(deps): update dependency rolldown to ~1.2.77edcb76,5372ae6]:v0.27.1Compare Source
Patch Changes
#3348
4abbbe4Thanks @squiggler-app! - fix(deps): update dependency rolldown to ~1.2.6#3361
b7ca997Thanks @squiggler-app! - fix(deps): update dependency @vitejs/plugin-react to ^6.1.1Updated dependencies [
4abbbe4]:v0.27.0Compare Source
Minor Changes
8d15fe5Thanks @stipsan! - Breaking: the babel pipeline is opt-in.reactCompilerdefaults totransform: 'oxc', and@rolldown/plugin-babel+@babel/coreare optional peer dependencies instead of dependencies. To stay on babel: settransform: 'babel'andpnpm add -D @rolldown/plugin-babel @babel/core babel-plugin-react-compiler.Patch Changes
v0.26.2Compare Source
Patch Changes
#3317
dd6510fThanks @squiggler-app! - fix(deps): update dependency rolldown to ~1.2.5Updated dependencies [
dd6510f]:v0.26.1Compare Source
Patch Changes
#3332
39567eaThanks @squiggler-app! - fix(deps): update dependency @microsoft/api-extractor to ^7.58.13#3334
8aa45dfThanks @squiggler-app! - fix(deps): update dependency publint to ^0.3.24#3338
c22bbd1Thanks @squiggler-app! - fix(deps): update dependency @microsoft/api-extractor to ^7.59.0#3319
f4ce0f7Thanks @stipsan! - Installing only one of the optional React Compiler packages no longer breaksdefineConfig()'s types. The missing package's typings used to degrade toanyand collapse theReactCompilerOptionsunion, so everyreactCompilerconfig resolved to thereactServer: trueoverload (Promise<UserConfig[]>) unless consumers stubbed the missing module. Now the uninstalled branch degrades to justtransform/reactServerwhile the installed one keeps its real typings — stubs like sanity-io/ui'stypings/babel-plugin-react-compiler.d.tscan be deleted.Updated dependencies [
8aa45df]:v0.26.0Compare Source
Minor Changes
24bfc3fThanks @stipsan! - AddreactCompiler.transformto pick the React Compiler implementation:'babel'(the default, runsbabel-plugin-react-compiler) or the experimental'oxc'(runsoxc-transform-react, the Rust port — one native pass for React Compiler + TypeScript/JSX). Both compilers are optional peer dependencies.v0.25.0Compare Source
Minor Changes
#3310
171251eThanks @stipsan! - Add abundleAnalyzeroption that wires Rolldown's experimental markdown bundle analyzer.trueselectsformat: 'md'(an LLM-friendlyanalyze-data.mdinoutDir) rather than the plugin's own JSON default, so an env-gated opt-in is enough:Pass an object to customize
format/fileName. The report is not a publishable artifact — exclude it frompackage.jsonfiles(e.g."!dist/analyze-data.md").@sanity/pkg-utilsforwards the same option frompackage.config.ts.v0.24.2Compare Source
Patch Changes
#3297
5496b49Thanks @squiggler-app! - fix(deps): update dependency rolldown to ~1.2.4#3288
5bfa760Thanks @stipsan! - Stop flagging the synthesized namespace wrappers of the declaration bundler withae-missing-release-tag.Namespace re-exports (
export * as ns from './module', orimport * as ns+export {ns}) make the declaration bundling pass synthesize adeclare namespace <module>_d_exports {…}wrapper that drops the doc comment of the re-export statement, so the wrapper could never carry a release tag and there was no userland fix short of downgrading the rule for the whole package. The TSDoc check now recognizes those wrappers (the interop naming, declared as a namespace in the entry or a shared chunk, a body that only re-exports sibling declarations, and re-exported under an alias) and exempts them fromae-missing-release-tag, like API Extractor's own rollups never checked the equivalent namespace. Everything else, including user namespaces that merely resemble the interop naming, stays checked: a namespace that declares members of its own is yours to tag, even when the bundler's deconflicting hands it a wrapper-shaped name.Updated dependencies [
5496b49]:v0.24.1Compare Source
Patch Changes
#3214
23788f8Thanks @squiggler-app! - fix(deps): update dependency rolldown to ~1.2.3#3271
f489697Thanks @squiggler-app! - fix(deps): update dependency browserslist to ^4.28.8Updated dependencies [
23788f8]:v0.24.0Compare Source
Minor Changes
#3250
33e7b93Thanks @stipsan! - Move the conditional CSS export frominject.nodeCompattoexports.nodeCompat, and give@tsdown/cssoutput the same treatment.nodeCompatconfigures how the CSS file is published, not how the import is injected, so it moves to a dedicatedexportsoption.injectandexportsare now independent:injectprepends an import of the CSS to entry chunks, whileexportspublishes it as the./<fileName>export subpath (which also makes any injected import self-referential).exports: truedeclares a plain string export for browser-only packages;exports: {nodeCompat: true}declares the conditional export and emits the no-op JS shim plus its.d.ts.inject: {nodeCompat: true}keeps working, normalized to{inject: true, exports: {nodeCompat: true}}with a deprecation warning; an explicitexportswins over it.@sanity/tsdown-configgains acss.exportsoption implementing the same pattern on top of@tsdown/css(an optional peer dependency), which compiles CSS but has no node-shim concept of its own — itsinjectemits a relative import that throws in runtimes that cannot load.cssfiles.@sanity/pkg-utilsgains acssoption, and builds a.cssexport subpath that declares asource:pkg buildcompiles it todist/ui/styles.csswith the same minify and lowering settingsvanillaExtractgets, emits the shim, and fills in thetypes/browser/style/node/defaultconditions.@sanity/parse-package-jsonexposes the newparseCssExportsfor reading those subpaths, andparseExportsno longer returns them as JS entries.#3253
bc16006Thanks @stipsan! - SuppressCIRCULAR_DEPENDENCYwarnings from the declaration bundling pass by default, and add asuppressWarningsoption.defineConfigenables Rolldown'schecks.circularDependency, which also reports cycles between the emitted.d.tsmodules. Those imports are type-only and erased at runtime, so the cycles carry none of the hazards the check exists to surface, and they're unavoidable for mutually referencing public types — in sanity-io/sanity#13753 109 of 136 cycle warnings were declaration-only, drowning out the 27 real ones. The config now sets tsdown'ssuppressWarningsto drop warnings whose entire cycle consists of declaration files (.d.ts/.d.mts/.d.cts); a cycle that includes even one runtime module still warns. Consumers that filtered these out themselves (like@repo/tsdown.configinsanity-io/sanity) can drop their own predicate.The new
suppressWarningsoption takes tsdown's own value shapes (strings matched withincludes, regular expressions matched withtest, or a predicate) and is OR'd with the built-in suppression, so per-package suppressions can't silently undo it. MergingsuppressWarningsover the returned config still replaces the default entirely (mergeConfigreplaces functions), which is the escape hatch for restoring every warning:mergeConfig(await defineConfig(), {suppressWarnings: () => false}).tsdown added
suppressWarningsin0.22.7, so thetsdownpeer range is raised from^0.22.5to^0.22.7. On0.22.5/0.22.6the option is silently ignored (the cycle warnings keep appearing) and theUserConfig['suppressWarnings']indexed access in the published declarations does not resolve.#3246
c1106f1Thanks @stipsan! - Move thetsdocfeature (API Extractor TSDoc/release-tag checking) from@sanity/pkg-utilsinto@sanity/tsdown-config.In
@sanity/tsdown-configthe option isfalseby default; settsdoc: true(or an options object) to run the check after the build via tsdown'sbuild:donehook. The checker lives at@sanity/tsdown-config/tsdocand is lazy-loaded from the root config, so API Extractor is not part of the default entry's module graph.@sanity/pkg-utilscontinues enabling it by default (tsdoc: true) when composing the config, and still runs it duringpkg checkviacheckTsdocfrom@sanity/tsdown-config/tsdoc.Patch Changes
#3252
d952984Thanks @squiggler-app! - fix(deps): update dependency publint to ^0.3.23Updated dependencies [
33e7b93,d952984]:v0.23.0Compare Source
Minor Changes
#3238
e19e63eThanks @stipsan! - Defaultexports.enabledtotrueinstead of'local-only'.Gating on
CIvia'local-only'/'ci-only'surprised environments that setCI=truewithout meaning "don't rewrite package.json" (notably Cursor Cloud and GitHub Copilot)Patch Changes
v0.22.0Compare Source
Minor Changes
#3221
125080fThanks @stipsan! - MakedefineConfiga composable base for programmatic hosts (like the upcoming tsdown-powered@sanity/pkg-utils):cwdoption: forwarded to tsdown's owncwd, and used for the package-manager detection behind thedevExportsdefault instead ofprocess.cwd()— so builds driven programmatically for a package in another directory resolve the right defaults.devExports: truedefault, so it is skipped when the userlandexportsvalue replaces the defaults (false,true, a bare CI condition) or setsdevExportsexplicitly. Explicit configs behave identically across package managers, with no filesystem probing.defineConfig()output is amergeConfig-safe base —pluginsappend (never clobbering the React Compiler / vanilla-extract plugins this config sets up), plain objects deep-merge, and scalars/non-plugin arrays replace.engines.nodeis now^22.18.0 || >=24.11.0, matching tsdown's own requirement. The previous>=20.19 <22range was unachievable in practice — this package only executes inside tsdown's process, which already requires Node^22.18.0.Patch Changes
v0.21.3Compare Source
Patch Changes
6b1d707Thanks @squiggler-app! - fix(deps): update dependency @vitejs/plugin-react to ^6.0.5v0.21.2Compare Source
Patch Changes
17cfcbe]:v0.21.1Compare Source
Patch Changes
#3132
e400791Thanks @squiggler-app! - fix(deps): update dependency browserslist to ^4.28.7#3133
d60da06Thanks @squiggler-app! - fix(deps): update dependency publint to ^0.3.22#3158
eaa211fThanks @squiggler-app! - fix(deps): update dependency package-manager-detector to ^1.8.0#3154
523fb8cThanks @stipsan! - fix(deps): update dependency tsConfiguration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR has been generated by Mend Renovate using a curated preset maintained by
. View repository job log here