diff --git a/.changeset/dull-impalas-vanish.md b/.changeset/dull-impalas-vanish.md
new file mode 100644
index 00000000..8fcf3c3e
--- /dev/null
+++ b/.changeset/dull-impalas-vanish.md
@@ -0,0 +1,5 @@
+---
+'@storybook/addon-mcp': patch
+---
+
+improve html bundling
diff --git a/packages/addon-mcp/src/preset.ts b/packages/addon-mcp/src/preset.ts
index 33de9209..78046b0c 100644
--- a/packages/addon-mcp/src/preset.ts
+++ b/packages/addon-mcp/src/preset.ts
@@ -3,6 +3,7 @@ import type { PresetProperty } from 'storybook/internal/types';
import { AddonOptions, type AddonOptionsInput } from './types.ts';
import * as v from 'valibot';
import { isManifestAvailable } from './tools/is-manifest-available.ts';
+import htmlTemplate from './template.html';
export const experimental_devServer: PresetProperty<
'experimental_devServer'
@@ -29,107 +30,16 @@ export const experimental_devServer: PresetProperty<
if (acceptHeader.includes('text/html')) {
// Browser request - send HTML with redirect
res.writeHead(200, { 'Content-Type': 'text/html' });
- res.end(`
-
-
-
- ${shouldRedirect ? '' : ''}
-
-
-
-
-
- Storybook MCP server successfully running via
- @storybook/addon-mcp.
-
-
- See how to connect to it from your coding agent in the addon's README.
-
- ${
- shouldRedirect
- ? `
-
- Automatically redirecting to
- component manifest
- in 10 seconds...
-
`
- : ''
- }
-
- ${
- shouldRedirect
- ? `
-
- `
- : ''
- }
-
-
- `);
+
+ const html = htmlTemplate.replace(
+ '{{REDIRECT_META}}',
+ shouldRedirect
+ ? // redirect the user to the component manifest page after 10 seconds
+ ''
+ : // ... or hide the message about redirection
+ '',
+ );
+ res.end(html);
} else {
// Non-browser request (API, curl, etc.) - send plain text
res.writeHead(200, { 'Content-Type': 'text/plain' });
diff --git a/packages/addon-mcp/src/template.html b/packages/addon-mcp/src/template.html
new file mode 100644
index 00000000..47b85814
--- /dev/null
+++ b/packages/addon-mcp/src/template.html
@@ -0,0 +1,105 @@
+
+
+
+ {{REDIRECT_META}}
+
+
+
+
+
+ Storybook MCP server successfully running via
+ @storybook/addon-mcp.
+
+
+ See how to connect to it from your coding agent in
+ the addon's README.
+
+
+ Automatically redirecting to
+ component manifest
+ in 10 seconds...
+
+
+
+
+
diff --git a/packages/addon-mcp/src/types.d.ts b/packages/addon-mcp/src/types.d.ts
index 05e05094..d580677d 100644
--- a/packages/addon-mcp/src/types.d.ts
+++ b/packages/addon-mcp/src/types.d.ts
@@ -2,3 +2,7 @@ declare module '*.md' {
const content: string;
export default content;
}
+declare module '*.html' {
+ const content: string;
+ export default content;
+}
diff --git a/packages/mcp/src/index.ts b/packages/mcp/src/index.ts
index cc17b7c2..9d7282c3 100644
--- a/packages/mcp/src/index.ts
+++ b/packages/mcp/src/index.ts
@@ -1,7 +1,7 @@
import { McpServer } from 'tmcp';
import { ValibotJsonSchemaAdapter } from '@tmcp/adapter-valibot';
import { HttpTransport } from '@tmcp/transport-http';
-import packageJson from '../package.json' with { type: 'json' };
+import pkgJson from '../package.json' with { type: 'json' };
import { addListAllComponentsTool } from './tools/list-all-components.ts';
import { addGetComponentDocumentationTool } from './tools/get-component-documentation.ts';
import type { StorybookContext } from './types.ts';
@@ -71,11 +71,9 @@ export const createStorybookMcpHandler = async (
const adapter = new ValibotJsonSchemaAdapter();
const server = new McpServer(
{
- // package.json properties are tree-shaken during build via a rolldown plugin in tsdown.config.ts
- // If we ever changed the used properties here, we would need to update that plugin as well
- name: packageJson.name,
- version: packageJson.version,
- description: packageJson.description,
+ name: pkgJson.name,
+ version: pkgJson.version,
+ description: pkgJson.description,
},
{
adapter,
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ee9d42ff..03282ae9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -31,7 +31,7 @@ catalogs:
specifier: ^1.16.0
version: 1.16.0
tsdown:
- specifier: ^0.15.9
+ specifier: ^0.15.12
version: 0.15.9
typescript:
specifier: ^5.9.3
@@ -70,7 +70,7 @@ importers:
version: 3.6.2
tsdown:
specifier: 'catalog:'
- version: 0.15.9(typescript@5.9.3)
+ version: 0.15.12(typescript@5.9.3)
turbo:
specifier: ^2.3.5
version: 2.5.8
@@ -234,6 +234,10 @@ packages:
resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
engines: {node: '>=6.9.0'}
+ '@babel/generator@7.28.5':
+ resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-compilation-targets@7.27.2':
resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
engines: {node: '>=6.9.0'}
@@ -264,6 +268,10 @@ packages:
resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-option@7.27.1':
resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
engines: {node: '>=6.9.0'}
@@ -277,6 +285,11 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
+ '@babel/parser@7.28.5':
+ resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
'@babel/plugin-transform-react-jsx-self@7.27.1':
resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
engines: {node: '>=6.9.0'}
@@ -305,6 +318,10 @@ packages:
resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==}
engines: {node: '>=6.9.0'}
+ '@babel/types@7.28.5':
+ resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
+ engines: {node: '>=6.9.0'}
+
'@bcoe/v8-coverage@1.0.2':
resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
engines: {node: '>=18'}
@@ -1133,89 +1150,175 @@ packages:
cpu: [arm64]
os: [android]
+ '@rolldown/binding-android-arm64@1.0.0-beta.45':
+ resolution: {integrity: sha512-bfgKYhFiXJALeA/riil908+2vlyWGdwa7Ju5S+JgWZYdR4jtiPOGdM6WLfso1dojCh+4ZWeiTwPeV9IKQEX+4g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
'@rolldown/binding-darwin-arm64@1.0.0-beta.44':
resolution: {integrity: sha512-PxAW1PXLPmCzfhfKIS53kwpjLGTUdIfX4Ht+l9mj05C3lYCGaGowcNsYi2rdxWH24vSTmeK+ajDNRmmmrK0M7g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
+ '@rolldown/binding-darwin-arm64@1.0.0-beta.45':
+ resolution: {integrity: sha512-xjCv4CRVsSnnIxTuyH1RDJl5OEQ1c9JYOwfDAHddjJDxCw46ZX9q80+xq7Eok7KC4bRSZudMJllkvOKv0T9SeA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
'@rolldown/binding-darwin-x64@1.0.0-beta.44':
resolution: {integrity: sha512-/CtQqs1oO9uSb5Ju60rZvsdjE7Pzn8EK2ISAdl2jedjMzeD/4neNyCbwyJOAPzU+GIQTZVyrFZJX+t7HXR1R/g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
+ '@rolldown/binding-darwin-x64@1.0.0-beta.45':
+ resolution: {integrity: sha512-ddcO9TD3D/CLUa/l8GO8LHzBOaZqWg5ClMy3jICoxwCuoz47h9dtqPsIeTiB6yR501LQTeDsjA4lIFd7u3Ljfw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
'@rolldown/binding-freebsd-x64@1.0.0-beta.44':
resolution: {integrity: sha512-V5Q5W9c4+2GJ4QabmjmVV6alY97zhC/MZBaLkDtHwGy3qwzbM4DYgXUbun/0a8AH5hGhuU27tUIlYz6ZBlvgOA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
+ '@rolldown/binding-freebsd-x64@1.0.0-beta.45':
+ resolution: {integrity: sha512-MBTWdrzW9w+UMYDUvnEuh0pQvLENkl2Sis15fHTfHVW7ClbGuez+RWopZudIDEGkpZXdeI4CkRXk+vdIIebrmg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.44':
resolution: {integrity: sha512-X6adjkHeFqKsTU0FXdNN9HY4LDozPqIfHcnXovE5RkYLWIjMWuc489mIZ6iyhrMbCqMUla9IOsh5dvXSGT9o9A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45':
+ resolution: {integrity: sha512-4YgoCFiki1HR6oSg+GxxfzfnVCesQxLF1LEnw9uXS/MpBmuog0EOO2rYfy69rWP4tFZL9IWp6KEfGZLrZ7aUog==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
'@rolldown/binding-linux-arm64-gnu@1.0.0-beta.44':
resolution: {integrity: sha512-kRRKGZI4DXWa6ANFr3dLA85aSVkwPdgXaRjfanwY84tfc3LncDiIjyWCb042e3ckPzYhHSZ3LmisO+cdOIYL6Q==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45':
+ resolution: {integrity: sha512-LE1gjAwQRrbCOorJJ7LFr10s5vqYf5a00V5Ea9wXcT2+56n5YosJkcp8eQ12FxRBv2YX8dsdQJb+ZTtYJwb6XQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.44':
resolution: {integrity: sha512-hMtiN9xX1NhxXBa2U3Up4XkVcsVp2h73yYtMDY59z9CDLEZLrik9RVLhBL5QtoX4zZKJ8HZKJtWuGYvtmkCbIQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
+ '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45':
+ resolution: {integrity: sha512-tdy8ThO/fPp40B81v0YK3QC+KODOmzJzSUOO37DinQxzlTJ026gqUSOM8tzlVixRbQJltgVDCTYF8HNPRErQTA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.44':
resolution: {integrity: sha512-rd1LzbpXQuR8MTG43JB9VyXDjG7ogSJbIkBpZEHJ8oMKzL6j47kQT5BpIXrg3b5UVygW9QCI2fpFdMocT5Kudg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
+ '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45':
+ resolution: {integrity: sha512-lS082ROBWdmOyVY/0YB3JmsiClaWoxvC+dA8/rbhyB9VLkvVEaihLEOr4CYmrMse151C4+S6hCw6oa1iewox7g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
'@rolldown/binding-linux-x64-musl@1.0.0-beta.44':
resolution: {integrity: sha512-qI2IiPqmPRW25exXkuQr3TlweCDc05YvvbSDRPCuPsWkwb70dTiSoXn8iFxT4PWqTi71wWHg1Wyta9PlVhX5VA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
+ '@rolldown/binding-linux-x64-musl@1.0.0-beta.45':
+ resolution: {integrity: sha512-Hi73aYY0cBkr1/SvNQqH8Cd+rSV6S9RB5izCv0ySBcRnd/Wfn5plguUoGYwBnhHgFbh6cPw9m2dUVBR6BG1gxA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
'@rolldown/binding-openharmony-arm64@1.0.0-beta.44':
resolution: {integrity: sha512-+vHvEc1pL5iJRFlldLC8mjm6P4Qciyfh2bh5ZI6yxDQKbYhCHRKNURaKz1mFcwxhVL5YMYsLyaqM3qizVif9MQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
+ '@rolldown/binding-openharmony-arm64@1.0.0-beta.45':
+ resolution: {integrity: sha512-fljEqbO7RHHogNDxYtTzr+GNjlfOx21RUyGmF+NrkebZ8emYYiIqzPxsaMZuRx0rgZmVmliOzEp86/CQFDKhJQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
'@rolldown/binding-wasm32-wasi@1.0.0-beta.44':
resolution: {integrity: sha512-XSgLxRrtFj6RpTeMYmmQDAwHjKseYGKUn5LPiIdW4Cq+f5SBSStL2ToBDxkbdxKPEbCZptnLPQ/nfKcAxrC8Xg==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
+ '@rolldown/binding-wasm32-wasi@1.0.0-beta.45':
+ resolution: {integrity: sha512-ZJDB7lkuZE9XUnWQSYrBObZxczut+8FZ5pdanm8nNS1DAo8zsrPuvGwn+U3fwU98WaiFsNrA4XHngesCGr8tEQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
'@rolldown/binding-win32-arm64-msvc@1.0.0-beta.44':
resolution: {integrity: sha512-cF1LJdDIX02cJrFrX3wwQ6IzFM7I74BYeKFkzdcIA4QZ0+2WA7/NsKIgjvrunupepWb1Y6PFWdRlHSaz5AW1Wg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45':
+ resolution: {integrity: sha512-zyzAjItHPUmxg6Z8SyRhLdXlJn3/D9KL5b9mObUrBHhWS/GwRH4665xCiFqeuktAhhWutqfc+rOV2LjK4VYQGQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
'@rolldown/binding-win32-ia32-msvc@1.0.0-beta.44':
resolution: {integrity: sha512-5uaJonDafhHiMn+iEh7qUp3QQ4Gihv3lEOxKfN8Vwadpy0e+5o28DWI42DpJ9YBYMrVy4JOWJ/3etB/sptpUwA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ia32]
os: [win32]
+ '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45':
+ resolution: {integrity: sha512-wODcGzlfxqS6D7BR0srkJk3drPwXYLu7jPHN27ce2c4PUnVVmJnp9mJzUQGT4LpmHmmVdMZ+P6hKvyTGBzc1CA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ia32]
+ os: [win32]
+
'@rolldown/binding-win32-x64-msvc@1.0.0-beta.44':
resolution: {integrity: sha512-vsqhWAFJkkmgfBN/lkLCWTXF1PuPhMjfnAyru48KvF7mVh2+K7WkKYHezF3Fjz4X/mPScOcIv+g6cf6wnI6eWg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
+ '@rolldown/binding-win32-x64-msvc@1.0.0-beta.45':
+ resolution: {integrity: sha512-wiU40G1nQo9rtfvF9jLbl79lUgjfaD/LTyUEw2Wg/gdF5OhjzpKMVugZQngO+RNdwYaNj+Fs+kWBWfp4VXPMHA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
'@rolldown/pluginutils@1.0.0-beta.27':
resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==}
'@rolldown/pluginutils@1.0.0-beta.44':
resolution: {integrity: sha512-g6eW7Zwnr2c5RADIoqziHoVs6b3W5QTQ4+qbpfjbkMJ9x+8Og211VW/oot2dj9dVwaK/UyC6Yo+02gV+wWQVNg==}
+ '@rolldown/pluginutils@1.0.0-beta.45':
+ resolution: {integrity: sha512-Le9ulGCrD8ggInzWw/k2J8QcbPz7eGIOWqfJ2L+1R0Opm7n6J37s2hiDWlh6LJN0Lk9L5sUzMvRHKW7UxBZsQA==}
+
'@rollup/pluginutils@5.3.0':
resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
engines: {node: '>=14.0.0'}
@@ -1804,6 +1907,10 @@ packages:
resolution: {integrity: sha512-zoKGUdu6vb2jd3YOq0nnhEDQVbPcHhco3UImJrv5dSkvxTc2pl2WjOPsjZXDwPDSl5eghIMuY3R6J9NDKF3KcQ==}
hasBin: true
+ baseline-browser-mapping@2.8.21:
+ resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==}
+ hasBin: true
+
before-after-hook@2.2.3:
resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
@@ -1833,6 +1940,11 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
+ browserslist@4.27.0:
+ resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
@@ -2080,6 +2192,9 @@ packages:
electron-to-chromium@1.5.238:
resolution: {integrity: sha512-khBdc+w/Gv+cS8e/Pbnaw/FXcBUeKrRVik9IxfXtgREOWyJhR4tj43n3amkVogJ/yeQUqzkrZcFhtIxIdqmmcQ==}
+ electron-to-chromium@1.5.243:
+ resolution: {integrity: sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==}
+
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -2517,6 +2632,9 @@ packages:
magic-string@0.30.19:
resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==}
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
magicast@0.3.5:
resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
@@ -2635,6 +2753,9 @@ packages:
node-releases@2.0.26:
resolution: {integrity: sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==}
+ node-releases@2.0.27:
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -2939,11 +3060,35 @@ packages:
vue-tsc:
optional: true
+ rolldown-plugin-dts@0.17.3:
+ resolution: {integrity: sha512-8mGnNUVNrqEdTnrlcaDxs4sAZg0No6njO+FuhQd4L56nUbJO1tHxOoKDH3mmMJg7f/BhEj/1KjU5W9kZ9zM/kQ==}
+ engines: {node: '>=20.18.0'}
+ peerDependencies:
+ '@ts-macro/tsc': ^0.3.6
+ '@typescript/native-preview': '>=7.0.0-dev.20250601.1'
+ rolldown: ^1.0.0-beta.44
+ typescript: ^5.0.0
+ vue-tsc: ~3.1.0
+ peerDependenciesMeta:
+ '@ts-macro/tsc':
+ optional: true
+ '@typescript/native-preview':
+ optional: true
+ typescript:
+ optional: true
+ vue-tsc:
+ optional: true
+
rolldown@1.0.0-beta.44:
resolution: {integrity: sha512-gcqgyCi3g93Fhr49PKvymE8PoaGS0sf6ajQrsYaQ8o5de6aUEbD6rJZiJbhOfpcqOnycgsAsUNPYri1h25NgsQ==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
+ rolldown@1.0.0-beta.45:
+ resolution: {integrity: sha512-iMmuD72XXLf26Tqrv1cryNYLX6NNPLhZ3AmNkSf8+xda0H+yijjGJ+wVT9UdBUHOpKzq9RjKtQKRCWoEKQQBZQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
rollup@4.52.5:
resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -3247,6 +3392,31 @@ packages:
resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
engines: {node: '>=6'}
+ tsdown@0.15.12:
+ resolution: {integrity: sha512-c8VLlQm8/lFrOAg5VMVeN4NAbejZyVQkzd+ErjuaQgJFI/9MhR9ivr0H/CM7UlOF1+ELlF6YaI7sU/4itgGQ8w==}
+ engines: {node: '>=20.19.0'}
+ hasBin: true
+ peerDependencies:
+ '@arethetypeswrong/core': ^0.18.1
+ publint: ^0.3.0
+ typescript: ^5.0.0
+ unplugin-lightningcss: ^0.4.0
+ unplugin-unused: ^0.5.0
+ unrun: ^0.2.1
+ peerDependenciesMeta:
+ '@arethetypeswrong/core':
+ optional: true
+ publint:
+ optional: true
+ typescript:
+ optional: true
+ unplugin-lightningcss:
+ optional: true
+ unplugin-unused:
+ optional: true
+ unrun:
+ optional: true
+
tsdown@0.15.9:
resolution: {integrity: sha512-C0EJYpXIYdlJokTumIL4lmv/wEiB20oa6iiYsXFE7Q0VKF3Ju6TQ7XAn4JQdm+2iQGEfl8cnEKcX5DB7iVR5Dw==}
engines: {node: '>=20.19.0'}
@@ -3368,6 +3538,12 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
+ update-browserslist-db@1.1.4:
+ resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -3660,6 +3836,14 @@ snapshots:
'@jridgewell/trace-mapping': 0.3.31
jsesc: 3.1.0
+ '@babel/generator@7.28.5':
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
'@babel/helper-compilation-targets@7.27.2':
dependencies:
'@babel/compat-data': 7.28.4
@@ -3692,6 +3876,8 @@ snapshots:
'@babel/helper-validator-identifier@7.27.1': {}
+ '@babel/helper-validator-identifier@7.28.5': {}
+
'@babel/helper-validator-option@7.27.1': {}
'@babel/helpers@7.28.4':
@@ -3703,6 +3889,10 @@ snapshots:
dependencies:
'@babel/types': 7.28.4
+ '@babel/parser@7.28.5':
+ dependencies:
+ '@babel/types': 7.28.5
+
'@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)':
dependencies:
'@babel/core': 7.28.4
@@ -3738,6 +3928,11 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.27.1
+ '@babel/types@7.28.5':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
'@bcoe/v8-coverage@1.0.2': {}
'@changesets/apply-release-plan@7.0.13':
@@ -4711,51 +4906,97 @@ snapshots:
'@rolldown/binding-android-arm64@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-android-arm64@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-darwin-arm64@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-darwin-arm64@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-darwin-x64@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-darwin-x64@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-freebsd-x64@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-freebsd-x64@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-linux-arm64-gnu@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-linux-x64-musl@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-linux-x64-musl@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-openharmony-arm64@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-openharmony-arm64@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-wasm32-wasi@1.0.0-beta.44':
dependencies:
'@napi-rs/wasm-runtime': 1.0.7
optional: true
+ '@rolldown/binding-wasm32-wasi@1.0.0-beta.45':
+ dependencies:
+ '@napi-rs/wasm-runtime': 1.0.7
+ optional: true
+
'@rolldown/binding-win32-arm64-msvc@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-win32-ia32-msvc@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45':
+ optional: true
+
'@rolldown/binding-win32-x64-msvc@1.0.0-beta.44':
optional: true
+ '@rolldown/binding-win32-x64-msvc@1.0.0-beta.45':
+ optional: true
+
'@rolldown/pluginutils@1.0.0-beta.27': {}
'@rolldown/pluginutils@1.0.0-beta.44': {}
+ '@rolldown/pluginutils@1.0.0-beta.45': {}
+
'@rollup/pluginutils@5.3.0(rollup@4.52.5)':
dependencies:
'@types/estree': 1.0.8
@@ -5383,6 +5624,9 @@ snapshots:
baseline-browser-mapping@2.8.19: {}
+ baseline-browser-mapping@2.8.21:
+ optional: true
+
before-after-hook@2.2.3: {}
better-path-resolve@1.0.0:
@@ -5426,6 +5670,15 @@ snapshots:
node-releases: 2.0.26
update-browserslist-db: 1.1.3(browserslist@4.26.3)
+ browserslist@4.27.0:
+ dependencies:
+ baseline-browser-mapping: 2.8.21
+ caniuse-lite: 1.0.30001751
+ electron-to-chromium: 1.5.243
+ node-releases: 2.0.27
+ update-browserslist-db: 1.1.4(browserslist@4.27.0)
+ optional: true
+
buffer-from@1.1.2:
optional: true
@@ -5623,6 +5876,9 @@ snapshots:
electron-to-chromium@1.5.238: {}
+ electron-to-chromium@1.5.243:
+ optional: true
+
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
@@ -6070,6 +6326,10 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
magicast@0.3.5:
dependencies:
'@babel/parser': 7.28.4
@@ -6164,6 +6424,9 @@ snapshots:
node-releases@2.0.26: {}
+ node-releases@2.0.27:
+ optional: true
+
object-assign@4.1.1: {}
object-inspect@1.13.4: {}
@@ -6449,6 +6712,24 @@ snapshots:
- oxc-resolver
- supports-color
+ rolldown-plugin-dts@0.17.3(rolldown@1.0.0-beta.45)(typescript@5.9.3):
+ dependencies:
+ '@babel/generator': 7.28.5
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ ast-kit: 2.1.3
+ birpc: 2.6.1
+ debug: 4.4.3
+ dts-resolver: 2.1.2
+ get-tsconfig: 4.13.0
+ magic-string: 0.30.21
+ rolldown: 1.0.0-beta.45
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - oxc-resolver
+ - supports-color
+
rolldown@1.0.0-beta.44:
dependencies:
'@oxc-project/types': 0.95.0
@@ -6469,6 +6750,26 @@ snapshots:
'@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.44
'@rolldown/binding-win32-x64-msvc': 1.0.0-beta.44
+ rolldown@1.0.0-beta.45:
+ dependencies:
+ '@oxc-project/types': 0.95.0
+ '@rolldown/pluginutils': 1.0.0-beta.45
+ optionalDependencies:
+ '@rolldown/binding-android-arm64': 1.0.0-beta.45
+ '@rolldown/binding-darwin-arm64': 1.0.0-beta.45
+ '@rolldown/binding-darwin-x64': 1.0.0-beta.45
+ '@rolldown/binding-freebsd-x64': 1.0.0-beta.45
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.45
+ '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.45
+ '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.45
+ '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.45
+ '@rolldown/binding-linux-x64-musl': 1.0.0-beta.45
+ '@rolldown/binding-openharmony-arm64': 1.0.0-beta.45
+ '@rolldown/binding-wasm32-wasi': 1.0.0-beta.45
+ '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.45
+ '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.45
+ '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.45
+
rollup@4.52.5:
dependencies:
'@types/estree': 1.0.8
@@ -6852,6 +7153,31 @@ snapshots:
minimist: 1.2.8
strip-bom: 3.0.0
+ tsdown@0.15.12(typescript@5.9.3):
+ dependencies:
+ ansis: 4.2.0
+ cac: 6.7.14
+ chokidar: 4.0.3
+ debug: 4.4.3
+ diff: 8.0.2
+ empathic: 2.0.0
+ hookable: 5.5.3
+ rolldown: 1.0.0-beta.45
+ rolldown-plugin-dts: 0.17.3(rolldown@1.0.0-beta.45)(typescript@5.9.3)
+ semver: 7.7.3
+ tinyexec: 1.0.1
+ tinyglobby: 0.2.15
+ tree-kill: 1.2.2
+ unconfig: 7.3.3
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - '@ts-macro/tsc'
+ - '@typescript/native-preview'
+ - oxc-resolver
+ - supports-color
+ - vue-tsc
+
tsdown@0.15.9(typescript@5.9.3):
dependencies:
ansis: 4.2.0
@@ -6961,6 +7287,13 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
+ update-browserslist-db@1.1.4(browserslist@4.27.0):
+ dependencies:
+ browserslist: 4.27.0
+ escalade: 3.2.0
+ picocolors: 1.1.1
+ optional: true
+
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
@@ -7068,7 +7401,7 @@ snapshots:
dependencies:
'@types/chai': 5.2.2
'@vitest/expect': 3.2.4
- '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@20.19.0)(jiti@2.6.1)(terser@5.44.0))
+ '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(terser@5.44.0))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
@@ -7171,7 +7504,7 @@ snapshots:
'@webassemblyjs/wasm-parser': 1.14.1
acorn: 8.15.0
acorn-import-phases: 1.0.4(acorn@8.15.0)
- browserslist: 4.26.3
+ browserslist: 4.27.0
chrome-trace-event: 1.0.4
enhanced-resolve: 5.18.3
es-module-lexer: 1.7.0
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index f5f319d8..b879e788 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -11,7 +11,7 @@ catalog:
'@vitest/coverage-v8': 3.2.4
storybook: 0.0.0-pr-32810-sha-6e759c7e
tmcp: ^1.16.0
- tsdown: ^0.15.9
+ tsdown: ^0.15.12
typescript: ^5.9.3
valibot: ^1.1.0
vitest: 3.2.4
diff --git a/tsdown-shared.config.ts b/tsdown-shared.config.ts
index 81d4498f..d638b145 100644
--- a/tsdown-shared.config.ts
+++ b/tsdown-shared.config.ts
@@ -1,70 +1,14 @@
import { defineConfig } from 'tsdown';
-import fs from 'node:fs/promises';
-import path from 'node:path';
import { codecovRollupPlugin } from '@codecov/rollup-plugin';
-/**
- * Plugin to tree-shake JSON file imports
- *
- * Works around a rolldown tree-shaking bug where importing JSON files includes ALL properties,
- * not just the ones used in the code. This plugin intercepts JSON file loads and returns
- * only the specified properties.
- *
- * @param options - Configuration object
- * @param options.file - Path to the JSON file (relative to project root or absolute)
- * @param options.keys - Array of property names to include in the bundle
- *
- * See: https://github.com/rolldown/rolldown/issues/6614
- */
-function jsonTreeShakePlugin(options: { fileName: string; keys: string[] }) {
- const { fileName, keys } = options;
- const fileId = path.isAbsolute(fileName)
- ? fileName
- : path.resolve(import.meta.dirname, fileName);
-
- return {
- name: 'json-tree-shake',
- load: {
- // Run this plugin BEFORE other plugins (including the built-in JSON plugin)
- // This ensures our load hook is called before the JSON plugin tries to load the file
- order: 'pre',
- async handler(id: string) {
- if (id !== fileId) {
- return null;
- }
-
- const jsonContent = JSON.parse(await fs.readFile(fileId, 'utf-8'));
-
- // Create minimal JSON object with only the specified properties
- const selectedJson: Record = {};
- for (const key of keys) {
- if (key in jsonContent) {
- selectedJson[key] = jsonContent[key];
- }
- }
-
- // The default plugin will still process this as JSON
- // So don't return JS here
- return {
- code: JSON.stringify(selectedJson, null, 2),
- moduleSideEffects: false,
- };
- },
- },
- };
-}
-
export default (pkgName: string) =>
defineConfig({
target: 'node20.19', // Minimum Node version supported by Storybook 10
loader: {
'.md': 'text',
+ '.html': 'text',
},
plugins: [
- jsonTreeShakePlugin({
- fileName: 'package.json',
- keys: ['name', 'version', 'description'],
- }),
codecovRollupPlugin({
enableBundleAnalysis: true,
bundleName: pkgName,