From 95e76380873c07645d7c3e77f5bb2061ffa1dadf Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Wed, 21 Jan 2026 14:19:26 +0000 Subject: [PATCH 01/71] Update ./docs/versions/next.json for v10.3.0-alpha.0 --- docs/versions/next.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/versions/next.json b/docs/versions/next.json index e9a84f0afc54..af62afd31177 100644 --- a/docs/versions/next.json +++ b/docs/versions/next.json @@ -1 +1 @@ -{"version":"10.2.0-beta.5","info":{"plain":"- Addon A11y: Lock vision filter dropdown for stories with `vision` global - [#33599](https://github.com/storybookjs/storybook/pull/33599), thanks @ghengeveld!"}} \ No newline at end of file +{"version":"10.3.0-alpha.0","info":{"plain":"- CLI: Fix onboarding not opening - [#33609](https://github.com/storybookjs/storybook/pull/33609), thanks @ndelangen!"}} \ No newline at end of file From 912784a576bb791081ddcc80cb3ce38a832b9776 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 22 Jan 2026 09:50:22 +0100 Subject: [PATCH 02/71] Merge pull request #33315 from storybookjs/valentin/fix-vitest-mocker-resolution Builder-Webpack5: Fix @vitest/mocker resolution issue (cherry picked from commit abd4b011ac1a337bfccfcd5713219a1c14fa2b90) --- code/builders/builder-vite/package.json | 1 - .../src/plugins/vite-inject-mocker/plugin.ts | 74 ++++--------------- .../src/plugins/vite-mock/plugin.ts | 2 +- code/builders/builder-webpack5/package.json | 1 - .../src/plugins/webpack-mock-plugin.ts | 2 +- code/core/build-config.ts | 10 +++ code/core/package.json | 2 + code/core/src/mocking-utils/index.ts | 1 + .../mocking-utils/mocker-runtime.js} | 0 code/core/src/mocking-utils/redirect.ts | 3 + code/core/src/mocking-utils/runtime.ts | 39 +++------- scripts/build/utils/entry-utils.ts | 1 + scripts/build/utils/generate-bundle.ts | 8 +- yarn.lock | 3 +- 14 files changed, 55 insertions(+), 92 deletions(-) rename code/core/{assets/server/mocker-runtime.template.js => src/mocking-utils/mocker-runtime.js} (100%) create mode 100644 code/core/src/mocking-utils/redirect.ts diff --git a/code/builders/builder-vite/package.json b/code/builders/builder-vite/package.json index f7abbd29ef07..4e47b1d290f9 100644 --- a/code/builders/builder-vite/package.json +++ b/code/builders/builder-vite/package.json @@ -47,7 +47,6 @@ ], "dependencies": { "@storybook/csf-plugin": "workspace:*", - "@vitest/mocker": "3.2.4", "ts-dedent": "^2.0.0" }, "devDependencies": { diff --git a/code/builders/builder-vite/src/plugins/vite-inject-mocker/plugin.ts b/code/builders/builder-vite/src/plugins/vite-inject-mocker/plugin.ts index 8937c9a33bce..d8cc28d6b2b1 100644 --- a/code/builders/builder-vite/src/plugins/vite-inject-mocker/plugin.ts +++ b/code/builders/builder-vite/src/plugins/vite-inject-mocker/plugin.ts @@ -1,63 +1,35 @@ -import { readFileSync } from 'node:fs'; -import { join } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { resolvePackageDir } from 'storybook/internal/common'; +import type { ResolvedConfig } from 'vite'; -import { exactRegex } from '@rolldown/pluginutils'; -import { dedent } from 'ts-dedent'; -import type { ResolvedConfig, ViteDevServer } from 'vite'; - -const entryPath = '/vite-inject-mocker-entry.js'; - -const entryCode = dedent` - - `; - -let server: ViteDevServer; +const ENTRY_PATH = '/vite-inject-mocker-entry.js'; export const viteInjectMockerRuntime = (options: { previewConfigPath?: string | null; }): import('vite').Plugin => { + // Get the actual file path so Vite can resolve relative imports + const mockerRuntimePath = fileURLToPath( + import.meta.resolve('storybook/internal/mocking-utils/mocker-runtime') + ); + let viteConfig: ResolvedConfig; return { name: 'vite:storybook-inject-mocker-runtime', + enforce: 'pre', buildStart() { if (viteConfig.command === 'build') { this.emitFile({ type: 'chunk', - id: join( - resolvePackageDir('storybook'), - 'assets', - 'server', - 'mocker-runtime.template.js' - ), - fileName: entryPath.slice(1), + id: mockerRuntimePath, + fileName: ENTRY_PATH.slice(1), }); } }, - config() { - return { - optimizeDeps: { - include: ['@vitest/mocker', '@vitest/mocker/browser'], - }, - resolve: { - // Aliasing necessary for package managers like pnpm, since resolving modules from a virtual module - // leads to errors, if the imported module is not a dependency of the project. - // By resolving the module to the real path, we can avoid this issue. - alias: { - '@vitest/mocker/browser': fileURLToPath(import.meta.resolve('@vitest/mocker/browser')), - '@vitest/mocker': fileURLToPath(import.meta.resolve('@vitest/mocker')), - }, - }, - }; - }, configResolved(config) { viteConfig = config; }, - configureServer(server_) { - server = server_; + configureServer(server) { if (options.previewConfigPath) { server.watcher.on('change', (file) => { if (file === options.previewConfigPath) { @@ -69,31 +41,17 @@ export const viteInjectMockerRuntime = (options: { }); } }, - resolveId: { - filter: { - id: [exactRegex(entryPath)], - }, - handler(id) { - if (exactRegex(id).test(entryPath)) { - return id; - } - return null; - }, - }, - async load(id) { - if (exactRegex(id).test(entryPath)) { - return readFileSync( - join(resolvePackageDir('storybook'), 'assets', 'server', 'mocker-runtime.template.js'), - 'utf-8' - ); + resolveId(source) { + if (source === ENTRY_PATH) { + return mockerRuntimePath; } - - return null; + return undefined; }, transformIndexHtml(html: string) { const headTag = html.match(/]*>/); if (headTag) { + const entryCode = ``; const headTagIndex = html.indexOf(headTag[0]); const newHtml = html.slice(0, headTagIndex + headTag[0].length) + diff --git a/code/builders/builder-vite/src/plugins/vite-mock/plugin.ts b/code/builders/builder-vite/src/plugins/vite-mock/plugin.ts index 23861a121259..5f60995c05b0 100644 --- a/code/builders/builder-vite/src/plugins/vite-mock/plugin.ts +++ b/code/builders/builder-vite/src/plugins/vite-mock/plugin.ts @@ -3,6 +3,7 @@ import { readFileSync } from 'node:fs'; import { babelParser, extractMockCalls, + findMockRedirect, getAutomockCode, getRealPath, rewriteSbMockImportCalls, @@ -10,7 +11,6 @@ import { import { logger } from 'storybook/internal/node-logger'; import type { CoreConfig } from 'storybook/internal/types'; -import { findMockRedirect } from '@vitest/mocker/redirect'; import { normalize } from 'pathe'; import type { Plugin, ResolvedConfig } from 'vite'; diff --git a/code/builders/builder-webpack5/package.json b/code/builders/builder-webpack5/package.json index a5b5e95d2743..9b88c3067048 100644 --- a/code/builders/builder-webpack5/package.json +++ b/code/builders/builder-webpack5/package.json @@ -52,7 +52,6 @@ ], "dependencies": { "@storybook/core-webpack": "workspace:*", - "@vitest/mocker": "3.2.4", "case-sensitive-paths-webpack-plugin": "^2.4.0", "cjs-module-lexer": "^1.2.3", "css-loader": "^7.1.2", diff --git a/code/builders/builder-webpack5/src/plugins/webpack-mock-plugin.ts b/code/builders/builder-webpack5/src/plugins/webpack-mock-plugin.ts index 7a3f4b8f2dfe..dd53310fd231 100644 --- a/code/builders/builder-webpack5/src/plugins/webpack-mock-plugin.ts +++ b/code/builders/builder-webpack5/src/plugins/webpack-mock-plugin.ts @@ -4,12 +4,12 @@ import { fileURLToPath } from 'node:url'; import { babelParser, extractMockCalls, + findMockRedirect, getIsExternal, resolveExternalModule, resolveWithExtensions, } from 'storybook/internal/mocking-utils'; -import { findMockRedirect } from '@vitest/mocker/redirect'; import type { Compiler } from 'webpack'; // --- Type Definitions --- diff --git a/code/core/build-config.ts b/code/core/build-config.ts index ee417c6603aa..3c72209d7694 100644 --- a/code/core/build-config.ts +++ b/code/core/build-config.ts @@ -190,6 +190,16 @@ const config: BuildEntries = { entryPoint: './src/manager/globals-runtime.ts', dts: false, }, + /** + * It is required to be a runtime entry point, because it is used to inject the mocker runtime + * into the preview iframe in builder-vite and builder-webpack5. To guarantee that the mocker + * runtime is transpiled correctly, code splitting needs to be disabled for this entry point. + */ + { + exportEntries: ['./internal/mocking-utils/mocker-runtime'], + entryPoint: './src/mocking-utils/mocker-runtime.js', + dts: false, + }, ], globalizedRuntime: [ { diff --git a/code/core/package.json b/code/core/package.json index 82bf0dbb653e..1284baba566d 100644 --- a/code/core/package.json +++ b/code/core/package.json @@ -126,6 +126,7 @@ "types": "./dist/mocking-utils/index.d.ts", "default": "./dist/mocking-utils/index.js" }, + "./internal/mocking-utils/mocker-runtime": "./dist/mocking-utils/mocker-runtime.js", "./internal/node-logger": { "types": "./dist/node-logger/index.d.ts", "default": "./dist/node-logger/index.js" @@ -255,6 +256,7 @@ "@types/react-syntax-highlighter": "11.0.5", "@types/semver": "^7.7.1", "@types/ws": "^8", + "@vitest/mocker": "3.2.4", "@vitest/utils": "^3.2.4", "@yarnpkg/fslib": "2.10.3", "@yarnpkg/libzip": "2.3.0", diff --git a/code/core/src/mocking-utils/index.ts b/code/core/src/mocking-utils/index.ts index 5d418381446e..f6ef78ec4af5 100644 --- a/code/core/src/mocking-utils/index.ts +++ b/code/core/src/mocking-utils/index.ts @@ -3,3 +3,4 @@ export * from './extract'; export * from './resolve'; export * from './esmWalker'; export * from './runtime'; +export * from './redirect'; diff --git a/code/core/assets/server/mocker-runtime.template.js b/code/core/src/mocking-utils/mocker-runtime.js similarity index 100% rename from code/core/assets/server/mocker-runtime.template.js rename to code/core/src/mocking-utils/mocker-runtime.js diff --git a/code/core/src/mocking-utils/redirect.ts b/code/core/src/mocking-utils/redirect.ts new file mode 100644 index 000000000000..fdeef615419c --- /dev/null +++ b/code/core/src/mocking-utils/redirect.ts @@ -0,0 +1,3 @@ +// Re-export findMockRedirect from @vitest/mocker/redirect +// This allows builders to use it without depending on @vitest/mocker directly +export { findMockRedirect } from '@vitest/mocker/redirect'; diff --git a/code/core/src/mocking-utils/runtime.ts b/code/core/src/mocking-utils/runtime.ts index eca3c51629f4..be8b131ba6f0 100644 --- a/code/core/src/mocking-utils/runtime.ts +++ b/code/core/src/mocking-utils/runtime.ts @@ -1,28 +1,13 @@ -import { resolvePackageDir } from 'storybook/internal/common'; - -import { buildSync } from 'esbuild'; -import { join } from 'pathe'; - -const runtimeTemplatePath = join( - resolvePackageDir('storybook'), - 'assets', - 'server', - 'mocker-runtime.template.js' -); - -export function getMockerRuntime() { - // Use esbuild to bundle the runtime script and its dependencies (`@vitest/mocker`, etc.) - // into a single, self-contained string of code. - const bundleResult = buildSync({ - entryPoints: [runtimeTemplatePath], - bundle: true, - write: false, // Return the result in memory instead of writing to disk - format: 'esm', - target: 'es2020', - external: ['msw/browser', 'msw/core/http'], - }); - - const runtimeScriptContent = bundleResult.outputFiles[0].text; - - return runtimeScriptContent; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; + +/** + * Returns the bundled mocker runtime script content. This is used by builders (webpack5, vite, + * etc.) to inject the mocker runtime into the preview iframe. + */ +export function getMockerRuntime(): string { + return readFileSync( + fileURLToPath(import.meta.resolve('storybook/internal/mocking-utils/mocker-runtime')), + 'utf-8' + ); } diff --git a/scripts/build/utils/entry-utils.ts b/scripts/build/utils/entry-utils.ts index c99a8143ff77..ada551bc5403 100644 --- a/scripts/build/utils/entry-utils.ts +++ b/scripts/build/utils/entry-utils.ts @@ -78,6 +78,7 @@ export const getExternal = async (cwd: string) => { '@testing-library/user-event', 'chai', '@vitest/expect', + '@vitest/mocker', '@vitest/spy', '@vitest/utils', ]; diff --git a/scripts/build/utils/generate-bundle.ts b/scripts/build/utils/generate-bundle.ts index e438ef0286e8..5d9c30470fcb 100644 --- a/scripts/build/utils/generate-bundle.ts +++ b/scripts/build/utils/generate-bundle.ts @@ -124,7 +124,13 @@ export async function generateBundle({ target: BROWSER_TARGETS, supported: SUPPORTED_FEATURES, splitting: false, - external: [], // don't externalize anything, we're using aliases to bundle everything into the runtimes + external: [ + // The following modules are conditionally called inside of @vitest/mocker + // The actual function which calls these modules is not imported + // and therefore we can externalize them. + 'msw/browser', + 'msw/core/http', + ], // Prefer `alias` over `external` because we're using aliases to bundle everything into the runtimes alias: { // The following aliases ensures that the runtimes bundles in the actual sources of these modules // instead of attempting to resolve them to the dist files, because the dist files are not available yet. diff --git a/yarn.lock b/yarn.lock index c75af0f03f45..c007770a0eb0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7830,7 +7830,6 @@ __metadata: dependencies: "@storybook/csf-plugin": "workspace:*" "@types/node": "npm:^22.19.1" - "@vitest/mocker": "npm:3.2.4" empathic: "npm:^2.0.0" es-module-lexer: "npm:^1.5.0" glob: "npm:^10.5.0" @@ -7854,7 +7853,6 @@ __metadata: "@types/node": "npm:^22.19.1" "@types/pretty-hrtime": "npm:^1.0.0" "@types/webpack-hot-middleware": "npm:^2.25.6" - "@vitest/mocker": "npm:3.2.4" case-sensitive-paths-webpack-plugin: "npm:^2.4.0" cjs-module-lexer: "npm:^1.2.3" css-loader: "npm:^7.1.2" @@ -28448,6 +28446,7 @@ __metadata: "@types/semver": "npm:^7.7.1" "@types/ws": "npm:^8" "@vitest/expect": "npm:3.2.4" + "@vitest/mocker": "npm:3.2.4" "@vitest/spy": "npm:3.2.4" "@vitest/utils": "npm:^3.2.4" "@yarnpkg/fslib": "npm:2.10.3" From 9dd8d5f0067e0436ba85631a45686929e34f51bc Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Fri, 23 Jan 2026 10:44:54 +0800 Subject: [PATCH 03/71] Merge pull request #33603 from storybookjs/shilman/add-cli-init-telemetry CLI: Add init telemetry for CLI integrations (cherry picked from commit 94f79bf0d016f5bf75b0a936e57aed9954d43640) --- .../src/services/VersionService.test.ts | 51 +++++++++++++++++++ .../src/services/VersionService.ts | 20 ++++++-- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/code/lib/create-storybook/src/services/VersionService.test.ts b/code/lib/create-storybook/src/services/VersionService.test.ts index 1927fef28334..4f7d06f4e156 100644 --- a/code/lib/create-storybook/src/services/VersionService.test.ts +++ b/code/lib/create-storybook/src/services/VersionService.test.ts @@ -131,6 +131,57 @@ describe('VersionService', () => { expect(integration).toBeUndefined(); }); + + it('should detect create-rsbuild command', () => { + const ancestry = [{ command: 'npx create-rsbuild' }, { command: 'node /usr/local/bin/npm' }]; + + const integration = versionService.getCliIntegrationFromAncestry(ancestry as any); + + expect(integration).toBe('create-rsbuild'); + }); + + it('should detect create rsbuild with version specifier', () => { + const ancestry = [{ command: 'npx create-rsbuild@1.0.0 init' }]; + + const integration = versionService.getCliIntegrationFromAncestry(ancestry as any); + + expect(integration).toBe('create-rsbuild'); + }); + + it('should detect "create rsbuild" with space instead of dash', () => { + const ancestry = [{ command: 'npm create rsbuild -- my-app' }]; + + const integration = versionService.getCliIntegrationFromAncestry(ancestry as any); + + expect(integration).toBe('create-rsbuild'); + }); + + it('should NOT detect creatersbuild without separator', () => { + const ancestry = [{ command: 'npx creatersbuild' }]; + + const integration = versionService.getCliIntegrationFromAncestry(ancestry as any); + + expect(integration).toBeUndefined(); + }); + + it('should detect @tanstack/start command', () => { + const ancestry = [{ command: 'npx @tanstack/start@latest create my-app' }]; + + const integration = versionService.getCliIntegrationFromAncestry(ancestry as any); + + expect(integration).toBe('@tanstack/start'); + }); + + it('should detect @tanstack/start in middle of command chain', () => { + const ancestry = [ + { command: 'pnpm @tanstack/start init' }, + { command: 'node /usr/local/bin/pnpm' }, + ]; + + const integration = versionService.getCliIntegrationFromAncestry(ancestry as any); + + expect(integration).toBe('@tanstack/start'); + }); }); describe('getVersionInfo', () => { diff --git a/code/lib/create-storybook/src/services/VersionService.ts b/code/lib/create-storybook/src/services/VersionService.ts index 019911ecebda..5a5cef89c58e 100644 --- a/code/lib/create-storybook/src/services/VersionService.ts +++ b/code/lib/create-storybook/src/services/VersionService.ts @@ -43,16 +43,26 @@ export class VersionService { } /** - * Extract CLI integration from process ancestry Detects if Storybook was invoked via sv create or - * sv add commands + * Extract CLI integration from process ancestry Detects if Storybook was invoked via sv create, + * sv add, create-rsbuild, or @tanstack/start commands */ getCliIntegrationFromAncestry( ancestry: ReturnType ): string | undefined { for (const ancestor of ancestry.toReversed()) { - const match = ancestor.command?.match(/(?:^|\s)(sv(?:@[^ ]+)? (?:create|add))/i); - if (match) { - return match[1].toLowerCase().includes('add') ? 'sv add' : 'sv create'; + // Check for sv create/add + const svMatch = ancestor.command?.match(/(?:^|\s)(sv(?:@[^ ]+)? (?:create|add))/i); + if (svMatch) { + return svMatch[1].toLowerCase().includes('add') ? 'sv add' : 'sv create'; + } + // Check for create-rsbuild or create rsbuild + const rsbuildMatch = ancestor.command?.match(/(?:^|\s)create[\s\-]rsbuild/i); + if (rsbuildMatch) { + return 'create-rsbuild'; + } + // Check for @tanstack/start + if (ancestor.command?.includes('@tanstack/start')) { + return '@tanstack/start'; } } return undefined; From 94ed900b65e52f000aa74b131d5cb2a783b92610 Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Mon, 26 Jan 2026 09:58:33 +0000 Subject: [PATCH 04/71] Write changelog for 10.2.1 [skip ci] --- CHANGELOG.md | 5 +++++ code/package.json | 3 ++- docs/versions/latest.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b54804527df..61fb14255fc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 10.2.1 + +- Builder-Webpack5: Fix @vitest/mocker resolution issue - [#33315](https://github.com/storybookjs/storybook/pull/33315), thanks @valentinpalkovic! +- CLI: Add init telemetry for CLI integrations - [#33603](https://github.com/storybookjs/storybook/pull/33603), thanks @shilman! + ## 10.2.0 > Improved UI and story authoring ergonomics diff --git a/code/package.json b/code/package.json index fd4233e74566..7fd3b79e9dce 100644 --- a/code/package.json +++ b/code/package.json @@ -220,5 +220,6 @@ "Dependency Upgrades" ] ] - } + }, + "deferredNextVersion": "10.2.1" } diff --git a/docs/versions/latest.json b/docs/versions/latest.json index 6abb03c19141..ef165e7e5aed 100644 --- a/docs/versions/latest.json +++ b/docs/versions/latest.json @@ -1 +1 @@ -{"version":"10.2.0","info":{"plain":""}} \ No newline at end of file +{"version":"10.2.1","info":{"plain":"- Builder-Webpack5: Fix @vitest/mocker resolution issue - [#33315](https://github.com/storybookjs/storybook/pull/33315), thanks @valentinpalkovic!\n- CLI: Add init telemetry for CLI integrations - [#33603](https://github.com/storybookjs/storybook/pull/33603), thanks @shilman!"}} \ No newline at end of file From c003cb15a7bd5c025b46b375411abf249b55a72c Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 26 Jan 2026 12:29:49 +0100 Subject: [PATCH 05/71] debugging CI problems --- code/lib/cli-storybook/src/bin/run.ts | 7 +++++-- code/lib/cli-storybook/src/sandbox.ts | 22 ++++++++++++---------- scripts/ci/main.ts | 2 +- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/code/lib/cli-storybook/src/bin/run.ts b/code/lib/cli-storybook/src/bin/run.ts index cab65aa2eedf..db04e21eb2b1 100644 --- a/code/lib/cli-storybook/src/bin/run.ts +++ b/code/lib/cli-storybook/src/bin/run.ts @@ -39,7 +39,10 @@ const handleCommandFailure = try { const logFile = await logTracker.writeToFile(logFilePath); logger.log(`Debug logs are written to: ${logFile}`); - } catch {} + } catch (e) { + logger.error('Error writing debug logs to file'); + logger.error(String(e)); + } logger.outro(''); process.exit(1); }; @@ -247,7 +250,7 @@ command('sandbox [filterValue]') .action((filterValue, options) => { logger.intro(`Creating a Storybook sandbox...`); sandbox({ filterValue, ...options }) - .catch(handleCommandFailure) + .catch(handleCommandFailure(options.logfile)) .finally(() => { logger.outro('Done!'); }); diff --git a/code/lib/cli-storybook/src/sandbox.ts b/code/lib/cli-storybook/src/sandbox.ts index 5bfcc854048f..ad3546e8e9b7 100644 --- a/code/lib/cli-storybook/src/sandbox.ts +++ b/code/lib/cli-storybook/src/sandbox.ts @@ -71,16 +71,18 @@ export const sandbox = async ({ prerelease: picocolors.yellow('This is a pre-release version.'), }; - logger.logBox( - [messages.welcome] - .concat(isOutdated && !isPrerelease ? [messages.notLatest] : []) - .concat(init && (isOutdated || isPrerelease) ? [messages.longInitTime] : []) - .concat(isPrerelease ? [messages.prerelease] : []) - .join('\n'), - { - rounded: true, - } - ); + try { + logger.logBox( + [messages.welcome] + .concat(isOutdated && !isPrerelease ? [messages.notLatest] : []) + .concat(init && (isOutdated || isPrerelease) ? [messages.longInitTime] : []) + .concat(isPrerelease ? [messages.prerelease] : []) + .join('\n'), + { + rounded: true, + } + ); + } catch {} if (!selectedConfig) { const filterRegex = new RegExp(`^${filterValue || ''}`, 'i'); diff --git a/scripts/ci/main.ts b/scripts/ci/main.ts index ee479158b032..f86219534c8a 100644 --- a/scripts/ci/main.ts +++ b/scripts/ci/main.ts @@ -91,7 +91,7 @@ function generateConfig(workflow: Workflow) { * const filteredTodos = todos.filter((job) => !!job.id.includes('qwik')); * ``` */ - const filteredJobs = jobs.filter((job) => !!job); + const filteredJobs = jobs.filter((job) => !!job.id.startsWith('lit-latest--vite---javascript')); const isDebugging = filteredJobs.length !== jobs.length; From f001002a3968ae65d678a812320482636023fedb Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 26 Jan 2026 12:45:04 +0100 Subject: [PATCH 06/71] debugging CI problems --- code/lib/cli-storybook/src/sandbox.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/code/lib/cli-storybook/src/sandbox.ts b/code/lib/cli-storybook/src/sandbox.ts index ad3546e8e9b7..ce49b1140498 100644 --- a/code/lib/cli-storybook/src/sandbox.ts +++ b/code/lib/cli-storybook/src/sandbox.ts @@ -48,7 +48,16 @@ export const sandbox = async ({ force: pkgMgr, }); const latestVersion = (await packageManager.latestVersion('storybook'))!; - const nextVersion = (await packageManager.latestVersion('storybook@next')) ?? '0.0.0'; + let nextVersion = '0.0.0'; + try { + nextVersion = (await packageManager.latestVersion('storybook@next')) ?? '0.0.0'; + } catch { + nextVersion = '0.0.0'; + } + + logger.debug(`latestVersion: ${latestVersion}`); + logger.debug(`nextVersion: ${nextVersion}`); + const currentVersion = versions.storybook; const isPrerelease = prerelease(currentVersion); const isOutdated = lt(currentVersion, isPrerelease ? nextVersion : latestVersion); @@ -56,6 +65,11 @@ export const sandbox = async ({ const downloadType = !isOutdated && init ? 'after-storybook' : 'before-storybook'; const branch = isPrerelease ? 'next' : 'main'; + logger.debug(`isPrerelease: ${isPrerelease}`); + logger.debug(`isOutdated: ${isOutdated}`); + logger.debug(`downloadType: ${downloadType}`); + logger.debug(`branch: ${branch}`); + const messages = { welcome: `Creating a Storybook ${picocolors.bold(currentVersion)} sandbox..`, notLatest: picocolors.red(dedent` From 09770325e25c45fa709baa36118a79ab577c8088 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 26 Jan 2026 12:57:33 +0100 Subject: [PATCH 07/71] debugging CI problems --- code/lib/cli-storybook/src/sandbox.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/lib/cli-storybook/src/sandbox.ts b/code/lib/cli-storybook/src/sandbox.ts index ce49b1140498..d92662803ebf 100644 --- a/code/lib/cli-storybook/src/sandbox.ts +++ b/code/lib/cli-storybook/src/sandbox.ts @@ -47,7 +47,7 @@ export const sandbox = async ({ const packageManager = JsPackageManagerFactory.getPackageManager({ force: pkgMgr, }); - const latestVersion = (await packageManager.latestVersion('storybook'))!; + const latestVersion = (await packageManager.latestVersion('storybook@latest')) ?? '0.0.0'; let nextVersion = '0.0.0'; try { nextVersion = (await packageManager.latestVersion('storybook@next')) ?? '0.0.0'; From 03d02992b3eca37046ffae592a0c8a038c3c44f1 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 26 Jan 2026 13:24:23 +0100 Subject: [PATCH 08/71] debugging CI problems --- code/lib/cli-storybook/src/sandbox.ts | 9 ++------- scripts/ci/main.ts | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/code/lib/cli-storybook/src/sandbox.ts b/code/lib/cli-storybook/src/sandbox.ts index d92662803ebf..232f67fb728f 100644 --- a/code/lib/cli-storybook/src/sandbox.ts +++ b/code/lib/cli-storybook/src/sandbox.ts @@ -47,13 +47,8 @@ export const sandbox = async ({ const packageManager = JsPackageManagerFactory.getPackageManager({ force: pkgMgr, }); - const latestVersion = (await packageManager.latestVersion('storybook@latest')) ?? '0.0.0'; - let nextVersion = '0.0.0'; - try { - nextVersion = (await packageManager.latestVersion('storybook@next')) ?? '0.0.0'; - } catch { - nextVersion = '0.0.0'; - } + const latestVersion = (await packageManager.latestVersion('storybook')) ?? '0.0.0'; + const nextVersion = (await packageManager.latestVersion('storybook@next')) ?? '0.0.0'; logger.debug(`latestVersion: ${latestVersion}`); logger.debug(`nextVersion: ${nextVersion}`); diff --git a/scripts/ci/main.ts b/scripts/ci/main.ts index f86219534c8a..ee479158b032 100644 --- a/scripts/ci/main.ts +++ b/scripts/ci/main.ts @@ -91,7 +91,7 @@ function generateConfig(workflow: Workflow) { * const filteredTodos = todos.filter((job) => !!job.id.includes('qwik')); * ``` */ - const filteredJobs = jobs.filter((job) => !!job.id.startsWith('lit-latest--vite---javascript')); + const filteredJobs = jobs.filter((job) => !!job); const isDebugging = filteredJobs.length !== jobs.length; From acf2b4484c8160ee091873aeea6109c6bbbe2d4c Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Tue, 27 Jan 2026 13:55:47 +0000 Subject: [PATCH 09/71] Bump version from "10.2.0" to "10.2.1" [skip ci] --- code/addons/a11y/package.json | 2 +- code/addons/docs/package.json | 2 +- code/addons/links/package.json | 2 +- code/addons/onboarding/package.json | 2 +- code/addons/pseudo-states/package.json | 2 +- code/addons/themes/package.json | 2 +- code/addons/vitest/package.json | 2 +- code/builders/builder-vite/package.json | 2 +- code/builders/builder-webpack5/package.json | 2 +- code/core/package.json | 2 +- code/core/src/common/versions.ts | 84 +++++++++---------- code/core/src/manager-api/version.ts | 2 +- code/frameworks/angular/package.json | 2 +- code/frameworks/ember/package.json | 2 +- code/frameworks/html-vite/package.json | 2 +- code/frameworks/nextjs-vite/package.json | 2 +- code/frameworks/nextjs/package.json | 2 +- code/frameworks/preact-vite/package.json | 2 +- .../react-native-web-vite/package.json | 2 +- code/frameworks/react-vite/package.json | 2 +- code/frameworks/react-webpack5/package.json | 2 +- code/frameworks/server-webpack5/package.json | 2 +- code/frameworks/svelte-vite/package.json | 2 +- code/frameworks/sveltekit/package.json | 2 +- code/frameworks/vue3-vite/package.json | 2 +- .../web-components-vite/package.json | 2 +- code/lib/cli-sb/package.json | 2 +- code/lib/cli-storybook/package.json | 2 +- code/lib/codemod/package.json | 2 +- code/lib/core-webpack/package.json | 2 +- code/lib/create-storybook/package.json | 2 +- code/lib/csf-plugin/package.json | 2 +- code/lib/eslint-plugin/package.json | 2 +- code/lib/react-dom-shim/package.json | 2 +- code/package.json | 5 +- code/presets/create-react-app/package.json | 2 +- code/presets/react-webpack/package.json | 2 +- code/presets/server-webpack/package.json | 2 +- code/renderers/html/package.json | 2 +- code/renderers/preact/package.json | 2 +- code/renderers/react/package.json | 2 +- code/renderers/server/package.json | 2 +- code/renderers/svelte/package.json | 2 +- code/renderers/vue3/package.json | 2 +- code/renderers/web-components/package.json | 2 +- 45 files changed, 87 insertions(+), 88 deletions(-) diff --git a/code/addons/a11y/package.json b/code/addons/a11y/package.json index 850f3d759aa6..7db065870ef2 100644 --- a/code/addons/a11y/package.json +++ b/code/addons/a11y/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-a11y", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Addon A11y: Test UI component compliance with WCAG web accessibility standards", "keywords": [ "a11y", diff --git a/code/addons/docs/package.json b/code/addons/docs/package.json index 0818372188a1..7bb6e96867b7 100644 --- a/code/addons/docs/package.json +++ b/code/addons/docs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-docs", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Docs: Document UI components automatically with stories and MDX", "keywords": [ "docs", diff --git a/code/addons/links/package.json b/code/addons/links/package.json index b8d023b100ea..98a698f54c22 100644 --- a/code/addons/links/package.json +++ b/code/addons/links/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-links", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Links: Link stories together to build demos and prototypes with your UI components", "keywords": [ "storybook", diff --git a/code/addons/onboarding/package.json b/code/addons/onboarding/package.json index 797f98cdd6d0..6b93e1ea03b9 100644 --- a/code/addons/onboarding/package.json +++ b/code/addons/onboarding/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-onboarding", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Onboarding: Help new users learn how to write stories", "keywords": [ "storybook", diff --git a/code/addons/pseudo-states/package.json b/code/addons/pseudo-states/package.json index c747cee8f487..6b192f32c3e3 100644 --- a/code/addons/pseudo-states/package.json +++ b/code/addons/pseudo-states/package.json @@ -1,6 +1,6 @@ { "name": "storybook-addon-pseudo-states", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Pseudo-states addon: Manipulate CSS pseudo states", "keywords": [ "storybook", diff --git a/code/addons/themes/package.json b/code/addons/themes/package.json index c3b6006dc47a..da85457d4ec9 100644 --- a/code/addons/themes/package.json +++ b/code/addons/themes/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-themes", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Themes addon: Switch between themes from the toolbar", "keywords": [ "css", diff --git a/code/addons/vitest/package.json b/code/addons/vitest/package.json index 9ab222e6188d..e0c4ba951a13 100644 --- a/code/addons/vitest/package.json +++ b/code/addons/vitest/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-vitest", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Vitest addon: Blazing fast component testing using stories", "keywords": [ "storybook", diff --git a/code/builders/builder-vite/package.json b/code/builders/builder-vite/package.json index 4e47b1d290f9..b295d09f7a64 100644 --- a/code/builders/builder-vite/package.json +++ b/code/builders/builder-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/builder-vite", - "version": "10.2.0", + "version": "10.2.1", "description": "A Storybook builder to dev and build with Vite", "keywords": [ "storybook", diff --git a/code/builders/builder-webpack5/package.json b/code/builders/builder-webpack5/package.json index 9b88c3067048..9e0ff6c07fc3 100644 --- a/code/builders/builder-webpack5/package.json +++ b/code/builders/builder-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/builder-webpack5", - "version": "10.2.0", + "version": "10.2.1", "description": "A Storybook builder to dev and build with Webpack", "keywords": [ "storybook", diff --git a/code/core/package.json b/code/core/package.json index 1284baba566d..3c61bc160a8c 100644 --- a/code/core/package.json +++ b/code/core/package.json @@ -1,6 +1,6 @@ { "name": "storybook", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/core/src/common/versions.ts b/code/core/src/common/versions.ts index 4d6ff4d49c6e..67377ab40048 100644 --- a/code/core/src/common/versions.ts +++ b/code/core/src/common/versions.ts @@ -1,45 +1,45 @@ // auto generated file, do not edit export default { - '@storybook/addon-a11y': '10.2.0', - '@storybook/addon-docs': '10.2.0', - '@storybook/addon-links': '10.2.0', - '@storybook/addon-onboarding': '10.2.0', - 'storybook-addon-pseudo-states': '10.2.0', - '@storybook/addon-themes': '10.2.0', - '@storybook/addon-vitest': '10.2.0', - '@storybook/builder-vite': '10.2.0', - '@storybook/builder-webpack5': '10.2.0', - storybook: '10.2.0', - '@storybook/angular': '10.2.0', - '@storybook/ember': '10.2.0', - '@storybook/html-vite': '10.2.0', - '@storybook/nextjs': '10.2.0', - '@storybook/nextjs-vite': '10.2.0', - '@storybook/preact-vite': '10.2.0', - '@storybook/react-native-web-vite': '10.2.0', - '@storybook/react-vite': '10.2.0', - '@storybook/react-webpack5': '10.2.0', - '@storybook/server-webpack5': '10.2.0', - '@storybook/svelte-vite': '10.2.0', - '@storybook/sveltekit': '10.2.0', - '@storybook/vue3-vite': '10.2.0', - '@storybook/web-components-vite': '10.2.0', - sb: '10.2.0', - '@storybook/cli': '10.2.0', - '@storybook/codemod': '10.2.0', - '@storybook/core-webpack': '10.2.0', - 'create-storybook': '10.2.0', - '@storybook/csf-plugin': '10.2.0', - 'eslint-plugin-storybook': '10.2.0', - '@storybook/react-dom-shim': '10.2.0', - '@storybook/preset-create-react-app': '10.2.0', - '@storybook/preset-react-webpack': '10.2.0', - '@storybook/preset-server-webpack': '10.2.0', - '@storybook/html': '10.2.0', - '@storybook/preact': '10.2.0', - '@storybook/react': '10.2.0', - '@storybook/server': '10.2.0', - '@storybook/svelte': '10.2.0', - '@storybook/vue3': '10.2.0', - '@storybook/web-components': '10.2.0', + '@storybook/addon-a11y': '10.2.1', + '@storybook/addon-docs': '10.2.1', + '@storybook/addon-links': '10.2.1', + '@storybook/addon-onboarding': '10.2.1', + 'storybook-addon-pseudo-states': '10.2.1', + '@storybook/addon-themes': '10.2.1', + '@storybook/addon-vitest': '10.2.1', + '@storybook/builder-vite': '10.2.1', + '@storybook/builder-webpack5': '10.2.1', + storybook: '10.2.1', + '@storybook/angular': '10.2.1', + '@storybook/ember': '10.2.1', + '@storybook/html-vite': '10.2.1', + '@storybook/nextjs': '10.2.1', + '@storybook/nextjs-vite': '10.2.1', + '@storybook/preact-vite': '10.2.1', + '@storybook/react-native-web-vite': '10.2.1', + '@storybook/react-vite': '10.2.1', + '@storybook/react-webpack5': '10.2.1', + '@storybook/server-webpack5': '10.2.1', + '@storybook/svelte-vite': '10.2.1', + '@storybook/sveltekit': '10.2.1', + '@storybook/vue3-vite': '10.2.1', + '@storybook/web-components-vite': '10.2.1', + sb: '10.2.1', + '@storybook/cli': '10.2.1', + '@storybook/codemod': '10.2.1', + '@storybook/core-webpack': '10.2.1', + 'create-storybook': '10.2.1', + '@storybook/csf-plugin': '10.2.1', + 'eslint-plugin-storybook': '10.2.1', + '@storybook/react-dom-shim': '10.2.1', + '@storybook/preset-create-react-app': '10.2.1', + '@storybook/preset-react-webpack': '10.2.1', + '@storybook/preset-server-webpack': '10.2.1', + '@storybook/html': '10.2.1', + '@storybook/preact': '10.2.1', + '@storybook/react': '10.2.1', + '@storybook/server': '10.2.1', + '@storybook/svelte': '10.2.1', + '@storybook/vue3': '10.2.1', + '@storybook/web-components': '10.2.1', }; diff --git a/code/core/src/manager-api/version.ts b/code/core/src/manager-api/version.ts index 80ce536b3c01..9692c5c6c6dd 100644 --- a/code/core/src/manager-api/version.ts +++ b/code/core/src/manager-api/version.ts @@ -1 +1 @@ -export const version = '10.2.0'; +export const version = '10.2.1'; diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 9e4907e68c7d..741757550880 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/angular", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Angular: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/ember/package.json b/code/frameworks/ember/package.json index b9b2e2ddee24..0bf2c61e2dfd 100644 --- a/code/frameworks/ember/package.json +++ b/code/frameworks/ember/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/ember", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Ember: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/html-vite/package.json b/code/frameworks/html-vite/package.json index 09715319177b..fa2467ba1ee1 100644 --- a/code/frameworks/html-vite/package.json +++ b/code/frameworks/html-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/html-vite", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for HTML and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/nextjs-vite/package.json b/code/frameworks/nextjs-vite/package.json index e7e1b96b226c..40b1bfa5fbb1 100644 --- a/code/frameworks/nextjs-vite/package.json +++ b/code/frameworks/nextjs-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/nextjs-vite", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Next.js and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/nextjs/package.json b/code/frameworks/nextjs/package.json index a46df7f02c95..c067c705a354 100644 --- a/code/frameworks/nextjs/package.json +++ b/code/frameworks/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/nextjs", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Next.js: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/preact-vite/package.json b/code/frameworks/preact-vite/package.json index b65e269808ff..4bc28b25865a 100644 --- a/code/frameworks/preact-vite/package.json +++ b/code/frameworks/preact-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preact-vite", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Preact and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-native-web-vite/package.json b/code/frameworks/react-native-web-vite/package.json index 7f6c726a79d9..ceaafaa19d0a 100644 --- a/code/frameworks/react-native-web-vite/package.json +++ b/code/frameworks/react-native-web-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-native-web-vite", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for React Native Web and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-vite/package.json b/code/frameworks/react-vite/package.json index 1718e5fd7283..d71027edd2b3 100644 --- a/code/frameworks/react-vite/package.json +++ b/code/frameworks/react-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-vite", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for React and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-webpack5/package.json b/code/frameworks/react-webpack5/package.json index ddc03f0e3fed..c1494ee9aece 100644 --- a/code/frameworks/react-webpack5/package.json +++ b/code/frameworks/react-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-webpack5", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for React and Webpack: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/server-webpack5/package.json b/code/frameworks/server-webpack5/package.json index cf4bfd641b26..29410a99cf4f 100644 --- a/code/frameworks/server-webpack5/package.json +++ b/code/frameworks/server-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/server-webpack5", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.", "keywords": [ "storybook", diff --git a/code/frameworks/svelte-vite/package.json b/code/frameworks/svelte-vite/package.json index fed7ea380e74..e689c86661cd 100644 --- a/code/frameworks/svelte-vite/package.json +++ b/code/frameworks/svelte-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/svelte-vite", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Svelte and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/sveltekit/package.json b/code/frameworks/sveltekit/package.json index 6cbf8a7393db..0099af6ff9c3 100644 --- a/code/frameworks/sveltekit/package.json +++ b/code/frameworks/sveltekit/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/sveltekit", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for SvelteKit: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/vue3-vite/package.json b/code/frameworks/vue3-vite/package.json index a930c11d906f..a05851421834 100644 --- a/code/frameworks/vue3-vite/package.json +++ b/code/frameworks/vue3-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue3-vite", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Vue3 and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/web-components-vite/package.json b/code/frameworks/web-components-vite/package.json index db8975a8ef7b..9eb46d2b4063 100644 --- a/code/frameworks/web-components-vite/package.json +++ b/code/frameworks/web-components-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/web-components-vite", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Web Components and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/cli-sb/package.json b/code/lib/cli-sb/package.json index ea29e5c21cc2..a0df3e7df2dc 100644 --- a/code/lib/cli-sb/package.json +++ b/code/lib/cli-sb/package.json @@ -1,6 +1,6 @@ { "name": "sb", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook CLI: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/cli-storybook/package.json b/code/lib/cli-storybook/package.json index 69e8abcb9f49..1c2ba493c222 100644 --- a/code/lib/cli-storybook/package.json +++ b/code/lib/cli-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/cli", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook CLI: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/codemod/package.json b/code/lib/codemod/package.json index 43266541115d..bec2f46f7407 100644 --- a/code/lib/codemod/package.json +++ b/code/lib/codemod/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/codemod", - "version": "10.2.0", + "version": "10.2.1", "description": "A collection of codemod scripts written with JSCodeshift", "keywords": [ "storybook" diff --git a/code/lib/core-webpack/package.json b/code/lib/core-webpack/package.json index 861884940aa2..1eeeda3a592c 100644 --- a/code/lib/core-webpack/package.json +++ b/code/lib/core-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/core-webpack", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook framework-agnostic API", "keywords": [ "storybook" diff --git a/code/lib/create-storybook/package.json b/code/lib/create-storybook/package.json index 683366ab449f..2cde3e8391de 100644 --- a/code/lib/create-storybook/package.json +++ b/code/lib/create-storybook/package.json @@ -1,6 +1,6 @@ { "name": "create-storybook", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook installer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/csf-plugin/package.json b/code/lib/csf-plugin/package.json index cb9c3289ae27..7f0bde119d31 100644 --- a/code/lib/csf-plugin/package.json +++ b/code/lib/csf-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/csf-plugin", - "version": "10.2.0", + "version": "10.2.1", "description": "Enrich CSF files via static analysis", "keywords": [ "storybook" diff --git a/code/lib/eslint-plugin/package.json b/code/lib/eslint-plugin/package.json index 1616c6a3d92e..d08a876c1374 100644 --- a/code/lib/eslint-plugin/package.json +++ b/code/lib/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-storybook", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook ESLint Plugin: Best practice rules for writing stories", "keywords": [ "eslint", diff --git a/code/lib/react-dom-shim/package.json b/code/lib/react-dom-shim/package.json index faa2570b9f48..faeec5187248 100644 --- a/code/lib/react-dom-shim/package.json +++ b/code/lib/react-dom-shim/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-dom-shim", - "version": "10.2.0", + "version": "10.2.1", "description": "", "keywords": [ "storybook" diff --git a/code/package.json b/code/package.json index 7fd3b79e9dce..7adc79989f9c 100644 --- a/code/package.json +++ b/code/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/code", - "version": "10.2.0", + "version": "10.2.1", "private": true, "description": "Storybook root", "homepage": "https://storybook.js.org/", @@ -220,6 +220,5 @@ "Dependency Upgrades" ] ] - }, - "deferredNextVersion": "10.2.1" + } } diff --git a/code/presets/create-react-app/package.json b/code/presets/create-react-app/package.json index 72dbfc805416..a9e419988b35 100644 --- a/code/presets/create-react-app/package.json +++ b/code/presets/create-react-app/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-create-react-app", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Create React App preset", "keywords": [ "storybook" diff --git a/code/presets/react-webpack/package.json b/code/presets/react-webpack/package.json index 9e2b2fef0cf5..fafadb35ff4b 100644 --- a/code/presets/react-webpack/package.json +++ b/code/presets/react-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-react-webpack", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for React: Develop React Component in isolation with Hot Reloading", "keywords": [ "storybook" diff --git a/code/presets/server-webpack/package.json b/code/presets/server-webpack/package.json index 77bf38ef5b5a..8609dad21fc3 100644 --- a/code/presets/server-webpack/package.json +++ b/code/presets/server-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-server-webpack", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.", "keywords": [ "storybook" diff --git a/code/renderers/html/package.json b/code/renderers/html/package.json index 719ae8b43071..27071ba088ca 100644 --- a/code/renderers/html/package.json +++ b/code/renderers/html/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/html", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook HTML renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/preact/package.json b/code/renderers/preact/package.json index 78da624a2a53..3d078239ee91 100644 --- a/code/renderers/preact/package.json +++ b/code/renderers/preact/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preact", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Preact renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/react/package.json b/code/renderers/react/package.json index 0e78ffe01261..f722de139524 100644 --- a/code/renderers/react/package.json +++ b/code/renderers/react/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook React renderer", "keywords": [ "storybook" diff --git a/code/renderers/server/package.json b/code/renderers/server/package.json index 13e4216b53c5..0dba38dfac60 100644 --- a/code/renderers/server/package.json +++ b/code/renderers/server/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/server", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Server renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/svelte/package.json b/code/renderers/svelte/package.json index aed8c5b62754..b656149fe0a1 100644 --- a/code/renderers/svelte/package.json +++ b/code/renderers/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/svelte", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Svelte renderer: Develop, document, and test UI components in isolation.", "keywords": [ "storybook", diff --git a/code/renderers/vue3/package.json b/code/renderers/vue3/package.json index 3d1abb3cc2db..e61e3b08640d 100644 --- a/code/renderers/vue3/package.json +++ b/code/renderers/vue3/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue3", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Vue 3 renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/web-components/package.json b/code/renderers/web-components/package.json index 4e51ba94262e..7f5049fb2da9 100644 --- a/code/renderers/web-components/package.json +++ b/code/renderers/web-components/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/web-components", - "version": "10.2.0", + "version": "10.2.1", "description": "Storybook Web Components renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", From 285866d08bec3837a3adc7ff79d69f1d97871fbb Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Wed, 28 Jan 2026 08:35:32 +0000 Subject: [PATCH 10/71] Update ./docs/versions/next.json for v10.3.0-alpha.1 --- docs/versions/next.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/versions/next.json b/docs/versions/next.json index af62afd31177..3bf2ff42bd48 100644 --- a/docs/versions/next.json +++ b/docs/versions/next.json @@ -1 +1 @@ -{"version":"10.3.0-alpha.0","info":{"plain":"- CLI: Fix onboarding not opening - [#33609](https://github.com/storybookjs/storybook/pull/33609), thanks @ndelangen!"}} \ No newline at end of file +{"version":"10.3.0-alpha.1","info":{"plain":"- Builder-Webpack5: Fix @vitest/mocker resolution issue - [#33315](https://github.com/storybookjs/storybook/pull/33315), thanks @valentinpalkovic!\n- CLI: Add init telemetry for CLI integrations - [#33603](https://github.com/storybookjs/storybook/pull/33603), thanks @shilman!\n- Core: Fix `previewHref` when current path does not end with a slash - [#33647](https://github.com/storybookjs/storybook/pull/33647), thanks @ghengeveld!\n- Core: Fix rendering of View Transitions in Firefox - [#33651](https://github.com/storybookjs/storybook/pull/33651), thanks @ghengeveld!\n- Manifest: Add docs entries to debugger - [#33607](https://github.com/storybookjs/storybook/pull/33607), thanks @JReinhold!\n- Theming: Export interface declaration for `ThemesGlobals` - [#33343](https://github.com/storybookjs/storybook/pull/33343), thanks @icopp!\n- UI: Avoid large animation for reduced motion users - [#33530](https://github.com/storybookjs/storybook/pull/33530), thanks @Sidnioulz!"}} \ No newline at end of file From d9288e251bf67cf1e0c7ffa1f5d1b469dadf6a20 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 28 Jan 2026 12:39:55 +0100 Subject: [PATCH 11/71] Merge pull request #33675 from storybookjs/valentin/implement-agent-detection-telemetry Telemetry: Add agent detection (cherry picked from commit 945a876fd6d8399e3cfda4cd5f2c933053751e2e) --- code/core/src/telemetry/detect-agent.test.ts | 95 ++++++++++++++++++++ code/core/src/telemetry/detect-agent.ts | 90 +++++++++++++++++++ code/core/src/telemetry/telemetry.ts | 6 +- code/core/src/telemetry/types.ts | 3 + 4 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 code/core/src/telemetry/detect-agent.test.ts create mode 100644 code/core/src/telemetry/detect-agent.ts diff --git a/code/core/src/telemetry/detect-agent.test.ts b/code/core/src/telemetry/detect-agent.test.ts new file mode 100644 index 000000000000..077ef55c23b2 --- /dev/null +++ b/code/core/src/telemetry/detect-agent.test.ts @@ -0,0 +1,95 @@ +import { describe, expect, it } from 'vitest'; + +import { detectAgent } from './detect-agent'; + +describe('detectAgent', () => { + it('detects amp via AGENT=amp (highest precedence)', () => { + expect( + detectAgent({ + stdoutIsTTY: true, + env: { + AGENT: 'amp', + CLAUDECODE: '1', + GEMINI_CLI: '1', + CODEX_SANDBOX: '1', + CURSOR_AGENT: '1', + }, + }) + ).toEqual({ name: 'amp' }); + + expect( + detectAgent({ + stdoutIsTTY: true, + env: { + CLAUDECODE: '1', + GEMINI_CLI: '1', + CODEX_SANDBOX: '1', + CURSOR_AGENT: '1', + AGENT: 'something', + }, + }) + ).toEqual({ name: 'claude-code' }); + }); + + it('detects Gemini CLI via GEMINI_CLI', () => { + expect(detectAgent({ stdoutIsTTY: true, env: { GEMINI_CLI: '1' } })).toEqual({ + name: 'gemini-cli', + }); + }); + + it('detects OpenAI Codex via CODEX_SANDBOX', () => { + expect(detectAgent({ stdoutIsTTY: true, env: { CODEX_SANDBOX: '1' } })).toEqual({ + name: 'codex', + }); + }); + + it('detects Cursor Agent via CURSOR_AGENT (even if AGENT is also set)', () => { + expect( + detectAgent({ stdoutIsTTY: true, env: { CURSOR_AGENT: '1', AGENT: 'something' } }) + ).toEqual({ + name: 'cursor', + }); + }); + + it('treats generic AGENT as unknown', () => { + expect(detectAgent({ stdoutIsTTY: true, env: { AGENT: 'some-agent' } })).toEqual({ + name: 'unknown', + }); + }); + + it('does not use heuristics when stdout is a TTY', () => { + expect(detectAgent({ stdoutIsTTY: true, env: { TERM: 'dumb' } })).toEqual(undefined); + expect(detectAgent({ stdoutIsTTY: true, env: { GIT_PAGER: 'cat' } })).toEqual(undefined); + }); + + it('detects unknown agent via TERM=dumb when stdout is not a TTY', () => { + expect(detectAgent({ stdoutIsTTY: false, env: { TERM: 'dumb' } })).toEqual({ + name: 'unknown', + }); + }); + + it('detects unknown agent via GIT_PAGER=cat when stdout is not a TTY', () => { + expect(detectAgent({ stdoutIsTTY: false, env: { GIT_PAGER: 'cat' } })).toEqual({ + name: 'unknown', + }); + }); + + it('returns isAgent=false when there are no signals', () => { + expect(detectAgent({ stdoutIsTTY: false, env: {} })).toEqual(undefined); + }); + + it('applies heuristics even when CI is set (no CI special-casing)', () => { + expect( + detectAgent({ + stdoutIsTTY: false, + env: { CI: 'true', TERM: 'dumb' }, + }) + ).toEqual({ name: 'unknown' }); + }); + + it('still detects explicit agents in CI', () => { + expect(detectAgent({ stdoutIsTTY: false, env: { CI: 'true', CODEX_SANDBOX: '1' } })).toEqual({ + name: 'codex', + }); + }); +}); diff --git a/code/core/src/telemetry/detect-agent.ts b/code/core/src/telemetry/detect-agent.ts new file mode 100644 index 000000000000..f4cd4d11d4e4 --- /dev/null +++ b/code/core/src/telemetry/detect-agent.ts @@ -0,0 +1,90 @@ +export type KnownAgentName = + | 'claude-code' + | 'gemini-cli' + | 'cursor' + | 'codex' + | 'opencode' + | 'amp' + | 'unknown'; + +export type AgentInfo = { + name: KnownAgentName; +}; + +export type AgentDetection = AgentInfo | undefined; + +type DetectAgentOptions = { + stdoutIsTTY: boolean; + env: NodeJS.ProcessEnv; +}; + +function detectExplicitAgent(env: NodeJS.ProcessEnv): AgentInfo | undefined { + // Amp + if (env.AGENT === 'amp') { + return { + name: 'amp', + }; + } + + // Claude Code + if (env.CLAUDECODE) { + return { + name: 'claude-code', + }; + } + + // Gemini CLI + if (env.GEMINI_CLI) { + return { + name: 'gemini-cli', + }; + } + + // OpenAI Codex + if (env.CODEX_SANDBOX) { + return { + name: 'codex', + }; + } + + // Cursor Agent (proposed / best-effort; Cursor often sets VSCode env vars too) + if (env.CURSOR_AGENT) { + return { + name: 'cursor', + }; + } + + // Generic "AGENT" marker (unknown implementation) + if (env.AGENT) { + return { name: 'unknown' }; + } + + return undefined; +} + +/** Detect whether Storybook CLI is likely being invoked by an AI agent. */ +export const detectAgent = (options: DetectAgentOptions): AgentDetection => { + const env = options.env; + + // 1) Explicit agent variables (strong signal; allow even in CI/TTY) + const explicit = detectExplicitAgent(env); + if (explicit) { + return explicit; + } + + const stdoutIsTTY = options.stdoutIsTTY; + + // 2) Behavioral / fingerprint heuristics (exclude CI to reduce false positives) + if (stdoutIsTTY) { + return undefined; + } + + const isDumbTerm = env.TERM === 'dumb'; + const hasAgentPager = env.GIT_PAGER === 'cat'; + + if (isDumbTerm || hasAgentPager) { + return { name: 'unknown' }; + } + + return undefined; +}; diff --git a/code/core/src/telemetry/telemetry.ts b/code/core/src/telemetry/telemetry.ts index 064596a84a75..b84ae26b47ac 100644 --- a/code/core/src/telemetry/telemetry.ts +++ b/code/core/src/telemetry/telemetry.ts @@ -11,6 +11,7 @@ import { nanoid } from 'nanoid'; import { version } from '../../package.json'; import { resolvePackageDir } from '../shared/utils/module'; import { getAnonymousProjectId } from './anonymous-id'; +import { detectAgent } from './detect-agent'; import { set as saveToCache } from './event-cache'; import { fetch } from './fetch'; import { getSessionId } from './session-id'; @@ -49,9 +50,12 @@ const getOperatingSystem = (): 'Windows' | 'macOS' | 'Linux' | `Other: ${string} // context info sent with all events, provided // by the app. currently: // - cliVersion +const inCI = isCI(); +const agentDetection = detectAgent({ stdoutIsTTY: process.stdout.isTTY, env: process.env }); const globalContext = { - inCI: isCI(), + inCI, isTTY: process.stdout.isTTY, + agent: agentDetection, platform: getOperatingSystem(), nodeVersion: process.versions.node, storybookVersion: getVersionNumber(), diff --git a/code/core/src/telemetry/types.ts b/code/core/src/telemetry/types.ts index 8569b8bacbc4..a86917ee5386 100644 --- a/code/core/src/telemetry/types.ts +++ b/code/core/src/telemetry/types.ts @@ -2,6 +2,7 @@ import type { StorybookConfig, TypescriptOptions } from 'storybook/internal/type import type { DetectResult } from 'package-manager-detector'; +import type { AgentInfo } from './detect-agent'; import type { KnownPackagesList } from './get-known-packages'; import type { MonorepoType } from './get-monorepo-type'; @@ -56,6 +57,8 @@ export type StorybookMetadata = { storybookVersionSpecifier: string; generatedAt?: number; userSince?: number; + /** If we can identify the agent, report it; otherwise `unknown` when detected heuristically. */ + agent?: AgentInfo; language: 'typescript' | 'javascript'; framework?: { name?: string; From e8ebfd0f14579dd470cca21697ae709898bd2f9b Mon Sep 17 00:00:00 2001 From: Kyle Gach Date: Wed, 28 Jan 2026 13:50:06 -0700 Subject: [PATCH 12/71] Merge pull request #33696 from storybookjs/kasper/docs-csf-factories-monorepo Docs: Add FAQ about sharing config in monorepos for CSF Next (cherry picked from commit 90b7abb10ddf0507cc479bf31124f1cc512d7382) --- ...-factories-automigrate-with-config-directory.md | 14 ++++++++++++++ docs/api/csf/csf-next.mdx | 6 ++++++ 2 files changed, 20 insertions(+) create mode 100644 docs/_snippets/csf-factories-automigrate-with-config-directory.md diff --git a/docs/_snippets/csf-factories-automigrate-with-config-directory.md b/docs/_snippets/csf-factories-automigrate-with-config-directory.md new file mode 100644 index 000000000000..8bea18c989e6 --- /dev/null +++ b/docs/_snippets/csf-factories-automigrate-with-config-directory.md @@ -0,0 +1,14 @@ +```shell renderer="common" language="js" packageManager="npm" +npx storybook automigrate csf-factories -c apps/admin/.storybook +npx storybook automigrate csf-factories -c apps/website/.storybook +``` + +```shell renderer="common" language="js" packageManager="pnpm" +pnpm dlx storybook automigrate csf-factories -c apps/admin/.storybook +pnpm dlx storybook automigrate csf-factories -c apps/website/.storybook +``` + +```shell renderer="common" language="js" packageManager="yarn" +yarn dlx storybook automigrate csf-factories -c apps/admin/.storybook +yarn dlx storybook automigrate csf-factories -c apps/website/.storybook +``` diff --git a/docs/api/csf/csf-next.mdx b/docs/api/csf/csf-next.mdx index 3e4331615fe8..2c64dc702b3b 100644 --- a/docs/api/csf/csf-next.mdx +++ b/docs/api/csf/csf-next.mdx @@ -290,6 +290,12 @@ You can automatically upgrade all of your project's stories from CSF 3 to CSF Ne +#### Monorepos + +If your project has multiple Storybook configurations, run the command with the `-c` flag pointing to each config directory: + + + It will run through each of the manual upgrade steps below on all of your story files.
From 8fe805089cb6465323df022fcb332f1b362c7196 Mon Sep 17 00:00:00 2001 From: Kasper Peulen Date: Thu, 29 Jan 2026 17:01:31 +0700 Subject: [PATCH 13/71] Merge pull request #33705 from storybookjs/kasper/refs-401-loginurl Composition: Handle 401 responses with loginUrl from Chromatic (cherry picked from commit afdf02afc7f96225a9c465bb4e4dda9373ba3fc6) --- .../common/utils/get-storybook-refs.test.ts | 35 +++++++++++++ .../src/common/utils/get-storybook-refs.ts | 2 +- code/core/src/manager-api/modules/refs.ts | 11 ++++ code/core/src/manager-api/tests/refs.test.ts | 50 ++++++++++++++++++- 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 code/core/src/common/utils/get-storybook-refs.test.ts diff --git a/code/core/src/common/utils/get-storybook-refs.test.ts b/code/core/src/common/utils/get-storybook-refs.test.ts new file mode 100644 index 000000000000..9c1c4f540945 --- /dev/null +++ b/code/core/src/common/utils/get-storybook-refs.test.ts @@ -0,0 +1,35 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import { checkRef } from './get-storybook-refs'; + +describe('checkRef', () => { + afterEach(() => vi.restoreAllMocks()); + + it('returns true when fetch returns 200', async () => { + vi.spyOn(global, 'fetch').mockResolvedValue({ + ok: true, + status: 200, + json: async () => ({}), + } as Response); + expect(await checkRef('https://chromatic.com')).toBe(true); + }); + + it('returns false when fetch returns 401', async () => { + vi.spyOn(global, 'fetch').mockResolvedValue({ ok: false, status: 401 } as Response); + expect(await checkRef('https://chromatic.com')).toBe(false); + }); + + it('returns false when fetch returns 200 with loginUrl', async () => { + vi.spyOn(global, 'fetch').mockResolvedValue({ + ok: true, + status: 200, + json: async () => ({ loginUrl: 'https://chromatic.com/login' }), + } as Response); + expect(await checkRef('https://chromatic.com')).toBe(false); + }); + + it('returns false when fetch fails', async () => { + vi.spyOn(global, 'fetch').mockRejectedValue(new Error('Network error')); + expect(await checkRef('https://chromatic.com')).toBe(false); + }); +}); diff --git a/code/core/src/common/utils/get-storybook-refs.ts b/code/core/src/common/utils/get-storybook-refs.ts index 457025541997..c6e1d10d1427 100644 --- a/code/core/src/common/utils/get-storybook-refs.ts +++ b/code/core/src/common/utils/get-storybook-refs.ts @@ -58,7 +58,7 @@ export const getAutoRefs = async (options: Options): Promise ); }; -const checkRef = (url: string) => +export const checkRef = (url: string) => fetch(`${url}/iframe.html`).then( async ({ ok, status }) => { if (ok) { diff --git a/code/core/src/manager-api/modules/refs.ts b/code/core/src/manager-api/modules/refs.ts index 586453443c05..151003529eed 100644 --- a/code/core/src/manager-api/modules/refs.ts +++ b/code/core/src/manager-api/modules/refs.ts @@ -118,6 +118,17 @@ async function handleRequest( throw new Error('Unexpected boolean response'); } if (!response.ok) { + // Check for 401 responses that may contain loginUrl + if (response.status === 401) { + try { + const json = await response.json(); + if (json.loginUrl) { + return { loginUrl: json.loginUrl }; + } + } catch { + // Fall through to error handling if JSON parsing fails + } + } throw new Error(`Unexpected response not OK: ${response.statusText}`); } diff --git a/code/core/src/manager-api/tests/refs.test.ts b/code/core/src/manager-api/tests/refs.test.ts index bc337d3a7497..d3ec49e7cf7b 100644 --- a/code/core/src/manager-api/tests/refs.test.ts +++ b/code/core/src/manager-api/tests/refs.test.ts @@ -73,6 +73,7 @@ function createMockStore(initialState: Partial = {}) { interface ResponseResult { ok?: boolean; + status?: number; err?: Error; response?: () => never | object | Promise; } @@ -86,13 +87,14 @@ type ResponseKeys = | 'metadata'; function respond(result: ResponseResult): Promise { - const { err, ok, response } = result; + const { err, ok, status, response } = result; if (err) { return Promise.reject(err); } return Promise.resolve({ ok: ok ?? !!response, + status: status ?? (ok ? 200 : 500), json: response, } as Response); } @@ -784,6 +786,52 @@ describe('Refs API', () => { `); }); + it('checks refs (auth with 401)', async () => { + // given + const { api } = initRefs({ provider, store } as any, { runCheck: false }); + + setupResponses({ + indexPrivate: { + ok: false, + status: 401, + response: async () => ({ loginUrl: 'https://example.com/login' }), + }, + storiesPrivate: { + ok: false, + status: 401, + response: async () => ({ loginUrl: 'https://example.com/login' }), + }, + metadata: { + ok: false, + status: 401, + response: async () => ({ loginUrl: 'https://example.com/login' }), + }, + }); + + await api.checkRef({ + id: 'fake', + url: 'https://example.com', + title: 'Fake', + }); + + expect(store.setState.mock.calls[0][0]).toMatchInlineSnapshot(` + { + "refs": { + "fake": { + "filteredIndex": undefined, + "id": "fake", + "index": undefined, + "internal_index": undefined, + "loginUrl": "https://example.com/login", + "title": "Fake", + "type": "auto-inject", + "url": "https://example.com", + }, + }, + } + `); + }); + it('checks refs (basic-auth)', async () => { // given const { api } = initRefs({ provider, store } as any, { runCheck: false }); From 02dd879ea1cc1f31335f9380066a68a7cd533d72 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 29 Jan 2026 17:09:00 +0100 Subject: [PATCH 14/71] Merge pull request #33708 from storybookjs/valentin/addon-vitest-prevent-double-nesting Addon-Vitest: Append Storybook project to existing test.projects array without double nesting (cherry picked from commit 5bbb91529e263e3f543a02f0e8062d63d009ddb5) --- .../vitest/src/updateVitestFile.test.ts | 89 +++++++++++++++++++ code/addons/vitest/src/updateVitestFile.ts | 60 ++++++++++++- 2 files changed, 147 insertions(+), 2 deletions(-) diff --git a/code/addons/vitest/src/updateVitestFile.test.ts b/code/addons/vitest/src/updateVitestFile.test.ts index 6e08aa611eef..c316e0f281e2 100644 --- a/code/addons/vitest/src/updateVitestFile.test.ts +++ b/code/addons/vitest/src/updateVitestFile.test.ts @@ -854,6 +854,95 @@ describe('updateConfigFile', () => { `); }); + it('appends storybook project to existing test.projects array (no double nesting)', async () => { + const source = babel.babelParse( + await loadTemplate('vitest.config.3.2.template.ts', { + CONFIG_DIR: '.storybook', + BROWSER_CONFIG: "{ provider: 'playwright' }", + SETUP_FILE: '../.storybook/vitest.setup.ts', + }) + ); + const target = babel.babelParse(` + import { mergeConfig, defineConfig } from 'vitest/config' + import viteConfig from './vite.config' + + export default mergeConfig( + viteConfig, + defineConfig({ + test: { + expect: { requireAssertions: true }, + projects: [ + { + extends: "./vite.config.ts", + test: { name: "client" }, + }, + { + extends: "./vite.config.ts", + test: { name: "server" }, + }, + ], + }, + }) + ) + `); + + const before = babel.generate(target).code; + const updated = updateConfigFile(source, target); + expect(updated).toBe(true); + + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly (storybook project appended to existing projects, no double nesting) + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " import { mergeConfig, defineConfig } from 'vitest/config'; + import viteConfig from './vite.config'; + + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + + export default mergeConfig(viteConfig, defineConfig({ + test: { + expect: { + requireAssertions: true + ... + test: { + name: "server" + } + + + }, { + + extends: true, + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + + }] + } + }));" + `); + }); + it('extracts coverage config and keeps it at top level when using workspace', async () => { const source = babel.babelParse( await loadTemplate('vitest.config.template.ts', { diff --git a/code/addons/vitest/src/updateVitestFile.ts b/code/addons/vitest/src/updateVitestFile.ts index 0f544dde3482..567df3de2114 100644 --- a/code/addons/vitest/src/updateVitestFile.ts +++ b/code/addons/vitest/src/updateVitestFile.ts @@ -232,8 +232,64 @@ export const updateConfigFile = (source: BabelFile['ast'], target: BabelFile['as p.type === 'ObjectProperty' && p.key.type === 'Identifier' && p.key.name === 'test' ) as t.ObjectProperty | undefined; - if (templateTestProp && templateTestProp.value.type === 'ObjectExpression') { - // Find the workspace/projects array in the template + const hasProjectsProp = ( + p: t.ObjectMethod | t.ObjectProperty | t.SpreadElement + ): p is t.ObjectProperty => + p.type === 'ObjectProperty' && + p.key.type === 'Identifier' && + p.key.name === 'projects' && + p.value.type === 'ArrayExpression'; + + // Check if the existing config already uses a projects array (multi-project setup). + // If so, we must append the storybook project to that array instead of wrapping + // the entire test config as a single project (which would cause double nesting). + const existingProjectsProp = existingTestProp.value.properties.find(hasProjectsProp); + + if (existingProjectsProp) { + // Existing config already has test.projects: append storybook project(s) to it + if (templateTestProp && templateTestProp.value.type === 'ObjectExpression') { + const templateProjectsProp = + templateTestProp.value.properties.find(hasProjectsProp); + if (templateProjectsProp && templateProjectsProp.value.type === 'ArrayExpression') { + const templateElements = (templateProjectsProp.value as t.ArrayExpression) + .elements; + (existingProjectsProp.value as t.ArrayExpression).elements.push( + ...templateElements + ); + } + // Merge other test-level options from template (e.g. coverage) into existing test + for (const templateProp of templateTestProp.value.properties) { + if ( + templateProp.type === 'ObjectProperty' && + templateProp.key.type === 'Identifier' && + (templateProp.key as t.Identifier).name !== 'projects' + ) { + const existingProp = existingTestProp.value.properties.find( + (p) => + p.type === 'ObjectProperty' && + p.key.type === 'Identifier' && + (p.key as t.Identifier).name === (templateProp.key as t.Identifier).name + ); + if (!existingProp && templateProp.type === 'ObjectProperty') { + existingTestProp.value.properties.push(templateProp); + } + } + } + } + // Merge only non-test properties from template to avoid re-adding storybook project + const otherTemplateProps = properties.filter( + (p) => + !( + p.type === 'ObjectProperty' && + p.key.type === 'Identifier' && + p.key.name === 'test' + ) + ); + if (otherTemplateProps.length > 0) { + mergeProperties(otherTemplateProps, targetConfigObject.properties); + } + } else if (templateTestProp && templateTestProp.value.type === 'ObjectExpression') { + // Existing test has no projects array: wrap entire test config as one project const workspaceOrProjectsProp = templateTestProp.value.properties.find( (p) => p.type === 'ObjectProperty' && From 4ae4460e972fd2a0a5c1c941ac40d2aa94f3b493 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 29 Jan 2026 17:09:53 +0100 Subject: [PATCH 15/71] Merge pull request #33694 from storybookjs/valentin/addon-vitest-support-simple-workspace-config Addon Vitest: Support simple vite.config without defineConfig helper (cherry picked from commit 751f18f3d120d4a5a92630b230e06e15c7628f09) --- code/core/src/cli/AddonVitestService.test.ts | 43 ++++++++++++++++++ code/core/src/cli/AddonVitestService.ts | 46 ++++++++++++-------- 2 files changed, 72 insertions(+), 17 deletions(-) diff --git a/code/core/src/cli/AddonVitestService.test.ts b/code/core/src/cli/AddonVitestService.test.ts index f457886880ba..6c2f9fa19d2a 100644 --- a/code/core/src/cli/AddonVitestService.test.ts +++ b/code/core/src/cli/AddonVitestService.test.ts @@ -601,5 +601,48 @@ describe('AddonVitestService', () => { expect(result.reasons).toBeDefined(); expect(result.reasons!.length).toBe(2); }); + + it('should validate mergeConfig with plain object literal', async () => { + vi.mocked(find.any) + .mockReturnValueOnce(undefined) // workspace + .mockReturnValueOnce('vitest.config.ts'); // config + vi.mocked(fs.readFile).mockResolvedValue( + 'export default mergeConfig(viteConfig, { test: { name: "node" } })' + ); + const result = await service.validateConfigFiles('.storybook'); + expect(result.compatible).toBe(true); + }); + + it('should validate mergeConfig with defineConfig call', async () => { + vi.mocked(find.any) + .mockReturnValueOnce(undefined) // workspace + .mockReturnValueOnce('vitest.config.ts'); // config + vi.mocked(fs.readFile).mockResolvedValue( + 'export default mergeConfig(viteConfig, defineConfig({ test: { name: "node" } }))' + ); + const result = await service.validateConfigFiles('.storybook'); + expect(result.compatible).toBe(true); + }); + + it('should validate mergeConfig with multiple plain objects', async () => { + vi.mocked(find.any) + .mockReturnValueOnce(undefined) // workspace + .mockReturnValueOnce('vitest.config.ts'); // config + vi.mocked(fs.readFile).mockResolvedValue( + 'export default mergeConfig({ test: {} }, { plugins: [] })' + ); + const result = await service.validateConfigFiles('.storybook'); + expect(result.compatible).toBe(true); + }); + + it('should reject mergeConfig with invalid object (non-object argument)', async () => { + vi.mocked(find.any) + .mockReturnValueOnce(undefined) // workspace + .mockReturnValueOnce('vitest.config.ts'); // config + vi.mocked(fs.readFile).mockResolvedValue('export default mergeConfig(viteConfig, "string")'); + const result = await service.validateConfigFiles('.storybook'); + expect(result.compatible).toBe(false); + expect(result.reasons!.some((r) => r.includes('invalid Vitest config'))).toBe(true); + }); }); }); diff --git a/code/core/src/cli/AddonVitestService.ts b/code/core/src/cli/AddonVitestService.ts index a8375d0fa5f0..a9771ca53438 100644 --- a/code/core/src/cli/AddonVitestService.ts +++ b/code/core/src/cli/AddonVitestService.ts @@ -326,9 +326,7 @@ export class AddonVitestService { babel.traverse(parsedConfig, { ExportDefaultDeclaration: (path: any) => { if (this.isDefineConfigExpression(path.node.declaration)) { - isValidVitestConfig = this.isSafeToExtendWorkspace( - path.node.declaration as CallExpression - ); + isValidVitestConfig = this.isSafeToExtendWorkspace(path.node.declaration); } else if (this.isMergeConfigExpression(path.node.declaration)) { // the config could be anywhere in the mergeConfig call, so we need to check each argument const mergeCall = path.node.declaration as CallExpression; @@ -372,20 +370,34 @@ export class AddonVitestService { return babel.types.isCallExpression(path) && (path.callee as any)?.name === 'mergeConfig'; } - private isSafeToExtendWorkspace(node: CallExpression): boolean { - return ( - babel.types.isCallExpression(node) && - node.arguments.length > 0 && - babel.types.isObjectExpression(node.arguments?.[0]) && - node.arguments[0]?.properties.every( - (p: any) => - p.key?.name !== 'test' || - (babel.types.isObjectExpression(p.value) && - p.value.properties.every( - ({ key, value }: any) => - key?.name !== 'workspace' || babel.types.isArrayExpression(value) - )) - ) + private isSafeToExtendWorkspace(node: babel.types.Node): boolean { + // Extract the object expression to validate + let objectToValidate: babel.types.ObjectExpression | null = null; + + if (babel.types.isCallExpression(node)) { + // Handle function calls like defineConfig({...}) + if (node.arguments.length > 0 && babel.types.isObjectExpression(node.arguments[0])) { + objectToValidate = node.arguments[0]; + } + } else if (babel.types.isObjectExpression(node)) { + // Handle plain object literals like {...} + objectToValidate = node; + } + + // If we couldn't extract a valid object, it's not safe + if (!objectToValidate) { + return false; + } + + // Check that the object doesn't have problematic test.workspace properties + return objectToValidate.properties.every( + (p: any) => + p.key?.name !== 'test' || + (babel.types.isObjectExpression(p.value) && + p.value.properties.every( + ({ key, value }: any) => + key?.name !== 'workspace' || babel.types.isArrayExpression(value) + )) ); } } From 389cecf1960fb4aa66eb08ae962ba8c64af7af46 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 28 Jan 2026 11:26:08 +0100 Subject: [PATCH 16/71] Merge pull request #33682 from storybookjs/valentin/fix-package-benchmarking Build: Fix package benchmarking (cherry picked from commit 48cecdad0de932069df5e31172ee1724be7e4ebb) --- scripts/bench/bench-packages.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/bench/bench-packages.ts b/scripts/bench/bench-packages.ts index 6298a52df9b5..687920be9174 100644 --- a/scripts/bench/bench-packages.ts +++ b/scripts/bench/bench-packages.ts @@ -404,11 +404,11 @@ const uploadToGithub = async ({ const run = async () => { program .option( - '-b, --base-branch ', + '-b, --base-branch [branchName]', 'The base branch to compare the results with. Requires GCP_CREDENTIALS env var' ) .option( - '-p, --pull-request ', + '-p, --pull-request [pullRequestNumber]', 'The PR number to add compare results to. Only used together with --baseBranch', function parseInt(value) { const parsedValue = Number.parseInt(value); @@ -443,7 +443,7 @@ const run = async () => { ) as PackageName[]; const options = program.opts<{ pullRequest?: number; baseBranch?: string; upload?: boolean }>(); - if (options.upload || options.baseBranch) { + if (options.upload === true || typeof options.baseBranch === 'string') { if (!GCP_CREDENTIALS.project_id) { throw new Error( 'GCP_CREDENTIALS env var is required to upload to BigQuery or compare against a base branch' @@ -498,7 +498,7 @@ const run = async () => { if (options.baseBranch) { const comparisonResults = await compareResults({ results, baseBranch: options.baseBranch }); const resultsAboveThreshold = filterResultsByThresholds(comparisonResults); - if (options.pullRequest) { + if (typeof options.pullRequest === 'number') { await uploadToGithub({ results: resultsAboveThreshold, pullRequest: options.pullRequest, From aeba4bf458447b1fcdcb7eb8dfe1a92cee2afcd5 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 28 Jan 2026 12:14:40 +0100 Subject: [PATCH 17/71] Merge pull request #33683 from storybookjs/valentin/fix-test-flake E2E: Fix flakey test (cherry picked from commit ac039aa67c16b1066bd9df5bce502a296c823ed2) --- code/e2e-tests/preview-api.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/e2e-tests/preview-api.spec.ts b/code/e2e-tests/preview-api.spec.ts index 5022f3e003b4..befdd6bab7a8 100644 --- a/code/e2e-tests/preview-api.spec.ts +++ b/code/e2e-tests/preview-api.spec.ts @@ -68,7 +68,7 @@ test.describe('preview-api', () => { await expect(labelControl).toBeVisible(); await labelControl.fill(''); - await labelControl.type('Changed arg', { delay: 50 }); + await labelControl.pressSequentially('Changed arg', { delay: 50 }); await labelControl.blur(); await expect(root.getByText('Loaded. Changed arg')).toBeVisible(); From 8c841e6e67592568b3c838874275b43813d283af Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 28 Jan 2026 15:38:57 +0100 Subject: [PATCH 18/71] Merge pull request #33693 from storybookjs/valentin/addon-vitest-requireassertions Addon-Vitest: Update Vitest plugin configuration to disable requireAssertions for expect (cherry picked from commit b18d12ed2bfc73753d56fe090b03880ebd2cdd3b) --- code/addons/vitest/src/vitest-plugin/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/code/addons/vitest/src/vitest-plugin/index.ts b/code/addons/vitest/src/vitest-plugin/index.ts index 9dc01100b2bd..b07edb2bfd00 100644 --- a/code/addons/vitest/src/vitest-plugin/index.ts +++ b/code/addons/vitest/src/vitest-plugin/index.ts @@ -297,6 +297,7 @@ export const storybookTest = async (options?: UserOptions): Promise => const baseConfig: Omit = { cacheDir: resolvePathInStorybookCache('sb-vitest', projectId), test: { + expect: { requireAssertions: false }, setupFiles: [ fileURLToPath(import.meta.resolve('@storybook/addon-vitest/internal/setup-file')), // if the existing setupFiles is a string, we have to include it otherwise we're overwriting it From bde74ae2b7d0b70a2de63e6d437d4bf2d047a6fa Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Fri, 30 Jan 2026 07:32:24 +0000 Subject: [PATCH 19/71] Write changelog for 10.2.2 [skip ci] --- CHANGELOG.md | 8 ++++++++ code/package.json | 3 ++- docs/versions/latest.json | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61fb14255fc3..55cbd250828e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 10.2.2 + +- Addon Vitest: Support simple vite.config without defineConfig helper - [#33694](https://github.com/storybookjs/storybook/pull/33694), thanks @valentinpalkovic! +- Addon-Vitest: Append Storybook project to existing test.projects array without double nesting - [#33708](https://github.com/storybookjs/storybook/pull/33708), thanks @valentinpalkovic! +- Addon-Vitest: Update Vitest plugin configuration to disable requireAssertions for expect - [#33693](https://github.com/storybookjs/storybook/pull/33693), thanks @valentinpalkovic! +- Composition: Handle 401 responses with loginUrl from Chromatic - [#33705](https://github.com/storybookjs/storybook/pull/33705), thanks @kasperpeulen! +- Telemetry: Add agent detection - [#33675](https://github.com/storybookjs/storybook/pull/33675), thanks @valentinpalkovic! + ## 10.2.1 - Builder-Webpack5: Fix @vitest/mocker resolution issue - [#33315](https://github.com/storybookjs/storybook/pull/33315), thanks @valentinpalkovic! diff --git a/code/package.json b/code/package.json index 7adc79989f9c..a2ea5827037b 100644 --- a/code/package.json +++ b/code/package.json @@ -220,5 +220,6 @@ "Dependency Upgrades" ] ] - } + }, + "deferredNextVersion": "10.2.2" } diff --git a/docs/versions/latest.json b/docs/versions/latest.json index ef165e7e5aed..de67f2eb604e 100644 --- a/docs/versions/latest.json +++ b/docs/versions/latest.json @@ -1 +1 @@ -{"version":"10.2.1","info":{"plain":"- Builder-Webpack5: Fix @vitest/mocker resolution issue - [#33315](https://github.com/storybookjs/storybook/pull/33315), thanks @valentinpalkovic!\n- CLI: Add init telemetry for CLI integrations - [#33603](https://github.com/storybookjs/storybook/pull/33603), thanks @shilman!"}} \ No newline at end of file +{"version":"10.2.2","info":{"plain":"- Addon Vitest: Support simple vite.config without defineConfig helper - [#33694](https://github.com/storybookjs/storybook/pull/33694), thanks @valentinpalkovic!\n- Addon-Vitest: Append Storybook project to existing test.projects array without double nesting - [#33708](https://github.com/storybookjs/storybook/pull/33708), thanks @valentinpalkovic!\n- Addon-Vitest: Update Vitest plugin configuration to disable requireAssertions for expect - [#33693](https://github.com/storybookjs/storybook/pull/33693), thanks @valentinpalkovic!\n- Composition: Handle 401 responses with loginUrl from Chromatic - [#33705](https://github.com/storybookjs/storybook/pull/33705), thanks @kasperpeulen!\n- Telemetry: Add agent detection - [#33675](https://github.com/storybookjs/storybook/pull/33675), thanks @valentinpalkovic!"}} \ No newline at end of file From e3673333f465d581633b3f3a5874b77dfa97ded1 Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Fri, 30 Jan 2026 08:35:30 +0000 Subject: [PATCH 20/71] Bump version from "10.2.1" to "10.2.2" [skip ci] --- code/addons/a11y/package.json | 2 +- code/addons/docs/package.json | 2 +- code/addons/links/package.json | 2 +- code/addons/onboarding/package.json | 2 +- code/addons/pseudo-states/package.json | 2 +- code/addons/themes/package.json | 2 +- code/addons/vitest/package.json | 2 +- code/builders/builder-vite/package.json | 2 +- code/builders/builder-webpack5/package.json | 2 +- code/core/package.json | 2 +- code/core/src/common/versions.ts | 84 +++++++++---------- code/core/src/manager-api/version.ts | 2 +- code/frameworks/angular/package.json | 2 +- code/frameworks/ember/package.json | 2 +- code/frameworks/html-vite/package.json | 2 +- code/frameworks/nextjs-vite/package.json | 2 +- code/frameworks/nextjs/package.json | 2 +- code/frameworks/preact-vite/package.json | 2 +- .../react-native-web-vite/package.json | 2 +- code/frameworks/react-vite/package.json | 2 +- code/frameworks/react-webpack5/package.json | 2 +- code/frameworks/server-webpack5/package.json | 2 +- code/frameworks/svelte-vite/package.json | 2 +- code/frameworks/sveltekit/package.json | 2 +- code/frameworks/vue3-vite/package.json | 2 +- .../web-components-vite/package.json | 2 +- code/lib/cli-sb/package.json | 2 +- code/lib/cli-storybook/package.json | 2 +- code/lib/codemod/package.json | 2 +- code/lib/core-webpack/package.json | 2 +- code/lib/create-storybook/package.json | 2 +- code/lib/csf-plugin/package.json | 2 +- code/lib/eslint-plugin/package.json | 2 +- code/lib/react-dom-shim/package.json | 2 +- code/package.json | 5 +- code/presets/create-react-app/package.json | 2 +- code/presets/react-webpack/package.json | 2 +- code/presets/server-webpack/package.json | 2 +- code/renderers/html/package.json | 2 +- code/renderers/preact/package.json | 2 +- code/renderers/react/package.json | 2 +- code/renderers/server/package.json | 2 +- code/renderers/svelte/package.json | 2 +- code/renderers/vue3/package.json | 2 +- code/renderers/web-components/package.json | 2 +- 45 files changed, 87 insertions(+), 88 deletions(-) diff --git a/code/addons/a11y/package.json b/code/addons/a11y/package.json index 7db065870ef2..8045273d90b1 100644 --- a/code/addons/a11y/package.json +++ b/code/addons/a11y/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-a11y", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Addon A11y: Test UI component compliance with WCAG web accessibility standards", "keywords": [ "a11y", diff --git a/code/addons/docs/package.json b/code/addons/docs/package.json index 7bb6e96867b7..0888f724c231 100644 --- a/code/addons/docs/package.json +++ b/code/addons/docs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-docs", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Docs: Document UI components automatically with stories and MDX", "keywords": [ "docs", diff --git a/code/addons/links/package.json b/code/addons/links/package.json index 98a698f54c22..cb587b0403c1 100644 --- a/code/addons/links/package.json +++ b/code/addons/links/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-links", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Links: Link stories together to build demos and prototypes with your UI components", "keywords": [ "storybook", diff --git a/code/addons/onboarding/package.json b/code/addons/onboarding/package.json index 6b93e1ea03b9..6427c6bde8f5 100644 --- a/code/addons/onboarding/package.json +++ b/code/addons/onboarding/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-onboarding", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Onboarding: Help new users learn how to write stories", "keywords": [ "storybook", diff --git a/code/addons/pseudo-states/package.json b/code/addons/pseudo-states/package.json index 6b192f32c3e3..9f26ddda7f60 100644 --- a/code/addons/pseudo-states/package.json +++ b/code/addons/pseudo-states/package.json @@ -1,6 +1,6 @@ { "name": "storybook-addon-pseudo-states", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Pseudo-states addon: Manipulate CSS pseudo states", "keywords": [ "storybook", diff --git a/code/addons/themes/package.json b/code/addons/themes/package.json index da85457d4ec9..370f3bfc3a9c 100644 --- a/code/addons/themes/package.json +++ b/code/addons/themes/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-themes", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Themes addon: Switch between themes from the toolbar", "keywords": [ "css", diff --git a/code/addons/vitest/package.json b/code/addons/vitest/package.json index e0c4ba951a13..52281508a159 100644 --- a/code/addons/vitest/package.json +++ b/code/addons/vitest/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-vitest", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Vitest addon: Blazing fast component testing using stories", "keywords": [ "storybook", diff --git a/code/builders/builder-vite/package.json b/code/builders/builder-vite/package.json index b295d09f7a64..f8d90d072049 100644 --- a/code/builders/builder-vite/package.json +++ b/code/builders/builder-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/builder-vite", - "version": "10.2.1", + "version": "10.2.2", "description": "A Storybook builder to dev and build with Vite", "keywords": [ "storybook", diff --git a/code/builders/builder-webpack5/package.json b/code/builders/builder-webpack5/package.json index 9e0ff6c07fc3..8f4279da1f88 100644 --- a/code/builders/builder-webpack5/package.json +++ b/code/builders/builder-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/builder-webpack5", - "version": "10.2.1", + "version": "10.2.2", "description": "A Storybook builder to dev and build with Webpack", "keywords": [ "storybook", diff --git a/code/core/package.json b/code/core/package.json index 3c61bc160a8c..9067de5bbf8c 100644 --- a/code/core/package.json +++ b/code/core/package.json @@ -1,6 +1,6 @@ { "name": "storybook", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/core/src/common/versions.ts b/code/core/src/common/versions.ts index 67377ab40048..4a8470b376e2 100644 --- a/code/core/src/common/versions.ts +++ b/code/core/src/common/versions.ts @@ -1,45 +1,45 @@ // auto generated file, do not edit export default { - '@storybook/addon-a11y': '10.2.1', - '@storybook/addon-docs': '10.2.1', - '@storybook/addon-links': '10.2.1', - '@storybook/addon-onboarding': '10.2.1', - 'storybook-addon-pseudo-states': '10.2.1', - '@storybook/addon-themes': '10.2.1', - '@storybook/addon-vitest': '10.2.1', - '@storybook/builder-vite': '10.2.1', - '@storybook/builder-webpack5': '10.2.1', - storybook: '10.2.1', - '@storybook/angular': '10.2.1', - '@storybook/ember': '10.2.1', - '@storybook/html-vite': '10.2.1', - '@storybook/nextjs': '10.2.1', - '@storybook/nextjs-vite': '10.2.1', - '@storybook/preact-vite': '10.2.1', - '@storybook/react-native-web-vite': '10.2.1', - '@storybook/react-vite': '10.2.1', - '@storybook/react-webpack5': '10.2.1', - '@storybook/server-webpack5': '10.2.1', - '@storybook/svelte-vite': '10.2.1', - '@storybook/sveltekit': '10.2.1', - '@storybook/vue3-vite': '10.2.1', - '@storybook/web-components-vite': '10.2.1', - sb: '10.2.1', - '@storybook/cli': '10.2.1', - '@storybook/codemod': '10.2.1', - '@storybook/core-webpack': '10.2.1', - 'create-storybook': '10.2.1', - '@storybook/csf-plugin': '10.2.1', - 'eslint-plugin-storybook': '10.2.1', - '@storybook/react-dom-shim': '10.2.1', - '@storybook/preset-create-react-app': '10.2.1', - '@storybook/preset-react-webpack': '10.2.1', - '@storybook/preset-server-webpack': '10.2.1', - '@storybook/html': '10.2.1', - '@storybook/preact': '10.2.1', - '@storybook/react': '10.2.1', - '@storybook/server': '10.2.1', - '@storybook/svelte': '10.2.1', - '@storybook/vue3': '10.2.1', - '@storybook/web-components': '10.2.1', + '@storybook/addon-a11y': '10.2.2', + '@storybook/addon-docs': '10.2.2', + '@storybook/addon-links': '10.2.2', + '@storybook/addon-onboarding': '10.2.2', + 'storybook-addon-pseudo-states': '10.2.2', + '@storybook/addon-themes': '10.2.2', + '@storybook/addon-vitest': '10.2.2', + '@storybook/builder-vite': '10.2.2', + '@storybook/builder-webpack5': '10.2.2', + storybook: '10.2.2', + '@storybook/angular': '10.2.2', + '@storybook/ember': '10.2.2', + '@storybook/html-vite': '10.2.2', + '@storybook/nextjs': '10.2.2', + '@storybook/nextjs-vite': '10.2.2', + '@storybook/preact-vite': '10.2.2', + '@storybook/react-native-web-vite': '10.2.2', + '@storybook/react-vite': '10.2.2', + '@storybook/react-webpack5': '10.2.2', + '@storybook/server-webpack5': '10.2.2', + '@storybook/svelte-vite': '10.2.2', + '@storybook/sveltekit': '10.2.2', + '@storybook/vue3-vite': '10.2.2', + '@storybook/web-components-vite': '10.2.2', + sb: '10.2.2', + '@storybook/cli': '10.2.2', + '@storybook/codemod': '10.2.2', + '@storybook/core-webpack': '10.2.2', + 'create-storybook': '10.2.2', + '@storybook/csf-plugin': '10.2.2', + 'eslint-plugin-storybook': '10.2.2', + '@storybook/react-dom-shim': '10.2.2', + '@storybook/preset-create-react-app': '10.2.2', + '@storybook/preset-react-webpack': '10.2.2', + '@storybook/preset-server-webpack': '10.2.2', + '@storybook/html': '10.2.2', + '@storybook/preact': '10.2.2', + '@storybook/react': '10.2.2', + '@storybook/server': '10.2.2', + '@storybook/svelte': '10.2.2', + '@storybook/vue3': '10.2.2', + '@storybook/web-components': '10.2.2', }; diff --git a/code/core/src/manager-api/version.ts b/code/core/src/manager-api/version.ts index 9692c5c6c6dd..b94a11a2599e 100644 --- a/code/core/src/manager-api/version.ts +++ b/code/core/src/manager-api/version.ts @@ -1 +1 @@ -export const version = '10.2.1'; +export const version = '10.2.2'; diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 741757550880..16fb26bc9006 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/angular", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Angular: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/ember/package.json b/code/frameworks/ember/package.json index 0bf2c61e2dfd..5e00085118da 100644 --- a/code/frameworks/ember/package.json +++ b/code/frameworks/ember/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/ember", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Ember: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/html-vite/package.json b/code/frameworks/html-vite/package.json index fa2467ba1ee1..d994c868a24d 100644 --- a/code/frameworks/html-vite/package.json +++ b/code/frameworks/html-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/html-vite", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for HTML and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/nextjs-vite/package.json b/code/frameworks/nextjs-vite/package.json index 40b1bfa5fbb1..47df75186a24 100644 --- a/code/frameworks/nextjs-vite/package.json +++ b/code/frameworks/nextjs-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/nextjs-vite", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Next.js and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/nextjs/package.json b/code/frameworks/nextjs/package.json index c067c705a354..e05fb7ae7ac5 100644 --- a/code/frameworks/nextjs/package.json +++ b/code/frameworks/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/nextjs", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Next.js: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/preact-vite/package.json b/code/frameworks/preact-vite/package.json index 4bc28b25865a..60dbf8bf6db1 100644 --- a/code/frameworks/preact-vite/package.json +++ b/code/frameworks/preact-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preact-vite", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Preact and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-native-web-vite/package.json b/code/frameworks/react-native-web-vite/package.json index ceaafaa19d0a..ac7466d5656c 100644 --- a/code/frameworks/react-native-web-vite/package.json +++ b/code/frameworks/react-native-web-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-native-web-vite", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for React Native Web and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-vite/package.json b/code/frameworks/react-vite/package.json index d71027edd2b3..b4544bcc1337 100644 --- a/code/frameworks/react-vite/package.json +++ b/code/frameworks/react-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-vite", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for React and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-webpack5/package.json b/code/frameworks/react-webpack5/package.json index c1494ee9aece..7dda5803f5f8 100644 --- a/code/frameworks/react-webpack5/package.json +++ b/code/frameworks/react-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-webpack5", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for React and Webpack: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/server-webpack5/package.json b/code/frameworks/server-webpack5/package.json index 29410a99cf4f..5242831ed271 100644 --- a/code/frameworks/server-webpack5/package.json +++ b/code/frameworks/server-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/server-webpack5", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.", "keywords": [ "storybook", diff --git a/code/frameworks/svelte-vite/package.json b/code/frameworks/svelte-vite/package.json index e689c86661cd..843e9923fb94 100644 --- a/code/frameworks/svelte-vite/package.json +++ b/code/frameworks/svelte-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/svelte-vite", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Svelte and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/sveltekit/package.json b/code/frameworks/sveltekit/package.json index 0099af6ff9c3..606e133d5b40 100644 --- a/code/frameworks/sveltekit/package.json +++ b/code/frameworks/sveltekit/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/sveltekit", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for SvelteKit: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/vue3-vite/package.json b/code/frameworks/vue3-vite/package.json index a05851421834..522d92843b9c 100644 --- a/code/frameworks/vue3-vite/package.json +++ b/code/frameworks/vue3-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue3-vite", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Vue3 and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/web-components-vite/package.json b/code/frameworks/web-components-vite/package.json index 9eb46d2b4063..807daa9bf376 100644 --- a/code/frameworks/web-components-vite/package.json +++ b/code/frameworks/web-components-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/web-components-vite", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Web Components and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/cli-sb/package.json b/code/lib/cli-sb/package.json index a0df3e7df2dc..b8f07dbbf18a 100644 --- a/code/lib/cli-sb/package.json +++ b/code/lib/cli-sb/package.json @@ -1,6 +1,6 @@ { "name": "sb", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook CLI: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/cli-storybook/package.json b/code/lib/cli-storybook/package.json index 1c2ba493c222..3de873c052eb 100644 --- a/code/lib/cli-storybook/package.json +++ b/code/lib/cli-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/cli", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook CLI: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/codemod/package.json b/code/lib/codemod/package.json index bec2f46f7407..8b7ec9b9bf84 100644 --- a/code/lib/codemod/package.json +++ b/code/lib/codemod/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/codemod", - "version": "10.2.1", + "version": "10.2.2", "description": "A collection of codemod scripts written with JSCodeshift", "keywords": [ "storybook" diff --git a/code/lib/core-webpack/package.json b/code/lib/core-webpack/package.json index 1eeeda3a592c..5a72857485ca 100644 --- a/code/lib/core-webpack/package.json +++ b/code/lib/core-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/core-webpack", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook framework-agnostic API", "keywords": [ "storybook" diff --git a/code/lib/create-storybook/package.json b/code/lib/create-storybook/package.json index 2cde3e8391de..65b01e757f30 100644 --- a/code/lib/create-storybook/package.json +++ b/code/lib/create-storybook/package.json @@ -1,6 +1,6 @@ { "name": "create-storybook", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook installer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/csf-plugin/package.json b/code/lib/csf-plugin/package.json index 7f0bde119d31..2838b33452e7 100644 --- a/code/lib/csf-plugin/package.json +++ b/code/lib/csf-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/csf-plugin", - "version": "10.2.1", + "version": "10.2.2", "description": "Enrich CSF files via static analysis", "keywords": [ "storybook" diff --git a/code/lib/eslint-plugin/package.json b/code/lib/eslint-plugin/package.json index d08a876c1374..6e222db85cdb 100644 --- a/code/lib/eslint-plugin/package.json +++ b/code/lib/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-storybook", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook ESLint Plugin: Best practice rules for writing stories", "keywords": [ "eslint", diff --git a/code/lib/react-dom-shim/package.json b/code/lib/react-dom-shim/package.json index faeec5187248..d7f5cf87b2a8 100644 --- a/code/lib/react-dom-shim/package.json +++ b/code/lib/react-dom-shim/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-dom-shim", - "version": "10.2.1", + "version": "10.2.2", "description": "", "keywords": [ "storybook" diff --git a/code/package.json b/code/package.json index a2ea5827037b..7093a5d20551 100644 --- a/code/package.json +++ b/code/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/code", - "version": "10.2.1", + "version": "10.2.2", "private": true, "description": "Storybook root", "homepage": "https://storybook.js.org/", @@ -220,6 +220,5 @@ "Dependency Upgrades" ] ] - }, - "deferredNextVersion": "10.2.2" + } } diff --git a/code/presets/create-react-app/package.json b/code/presets/create-react-app/package.json index a9e419988b35..19f52124073a 100644 --- a/code/presets/create-react-app/package.json +++ b/code/presets/create-react-app/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-create-react-app", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Create React App preset", "keywords": [ "storybook" diff --git a/code/presets/react-webpack/package.json b/code/presets/react-webpack/package.json index fafadb35ff4b..037b38c054ab 100644 --- a/code/presets/react-webpack/package.json +++ b/code/presets/react-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-react-webpack", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for React: Develop React Component in isolation with Hot Reloading", "keywords": [ "storybook" diff --git a/code/presets/server-webpack/package.json b/code/presets/server-webpack/package.json index 8609dad21fc3..1fcfee2e9643 100644 --- a/code/presets/server-webpack/package.json +++ b/code/presets/server-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-server-webpack", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.", "keywords": [ "storybook" diff --git a/code/renderers/html/package.json b/code/renderers/html/package.json index 27071ba088ca..93d0aa1e3fea 100644 --- a/code/renderers/html/package.json +++ b/code/renderers/html/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/html", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook HTML renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/preact/package.json b/code/renderers/preact/package.json index 3d078239ee91..ca0e26b2e93d 100644 --- a/code/renderers/preact/package.json +++ b/code/renderers/preact/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preact", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Preact renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/react/package.json b/code/renderers/react/package.json index f722de139524..a9ad262056ed 100644 --- a/code/renderers/react/package.json +++ b/code/renderers/react/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook React renderer", "keywords": [ "storybook" diff --git a/code/renderers/server/package.json b/code/renderers/server/package.json index 0dba38dfac60..ea528e3923ab 100644 --- a/code/renderers/server/package.json +++ b/code/renderers/server/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/server", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Server renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/svelte/package.json b/code/renderers/svelte/package.json index b656149fe0a1..64b74139f6c5 100644 --- a/code/renderers/svelte/package.json +++ b/code/renderers/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/svelte", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Svelte renderer: Develop, document, and test UI components in isolation.", "keywords": [ "storybook", diff --git a/code/renderers/vue3/package.json b/code/renderers/vue3/package.json index e61e3b08640d..f689a0aa8688 100644 --- a/code/renderers/vue3/package.json +++ b/code/renderers/vue3/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue3", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Vue 3 renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/web-components/package.json b/code/renderers/web-components/package.json index 7f5049fb2da9..576771bfc9fc 100644 --- a/code/renderers/web-components/package.json +++ b/code/renderers/web-components/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/web-components", - "version": "10.2.1", + "version": "10.2.2", "description": "Storybook Web Components renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", From 4ef05ef7fb4cfc875d5f6ddf74584fd1859b080a Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Mon, 26 Jan 2026 14:15:22 +0100 Subject: [PATCH 21/71] Merge pull request #33647 from storybookjs/fix-iframe-href Core: Fix `previewHref` when current path does not end with a slash (cherry picked from commit 00f506c3e353e03961ad81434ff056ba529e511f) --- code/core/src/manager-api/modules/url.ts | 7 ++++--- code/core/src/manager-api/tests/url.test.js | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/code/core/src/manager-api/modules/url.ts b/code/core/src/manager-api/modules/url.ts index 83633a00de4e..b7f37e179e59 100644 --- a/code/core/src/manager-api/modules/url.ts +++ b/code/core/src/manager-api/modules/url.ts @@ -247,13 +247,14 @@ export const init: ModuleFn = (moduleArgs) => { throw new Error(`Invalid refId: ${refId}`); } - const originAddress = global.window.location.origin + location.pathname; + const pathname = location.pathname || '/'; + const originAddress = global.window.location.origin + pathname; const networkAddress = global.STORYBOOK_NETWORK_ADDRESS ?? originAddress; const managerBase = - base === 'origin' ? originAddress : base === 'network' ? networkAddress : location.pathname; + base === 'origin' ? originAddress : base === 'network' ? networkAddress : pathname; const previewBase = refId ? refs[refId].url + '/iframe.html' - : global.PREVIEW_URL || `${managerBase}iframe.html`; + : global.PREVIEW_URL || `${managerBase.replace(/\/[^/]*$/, '/')}iframe.html`; const refParam = refId ? `&refId=${encodeURIComponent(refId)}` : ''; const { args = '', globals = '', ...otherParams } = queryParams; diff --git a/code/core/src/manager-api/tests/url.test.js b/code/core/src/manager-api/tests/url.test.js index a32e062cbd31..aedbc591d13e 100644 --- a/code/core/src/manager-api/tests/url.test.js +++ b/code/core/src/manager-api/tests/url.test.js @@ -469,5 +469,21 @@ describe('getStoryHrefs', () => { const { managerHref, previewHref } = api.getStoryHrefs('test--story'); expect(managerHref).toEqual('/?path=/story/test--story'); expect(previewHref).toEqual('https://custom.preview.url/?id=test--story&viewMode=story'); + delete global.PREVIEW_URL; + }); + + it('correctly links from /index.html', () => { + const { api, state } = initURL({ + store, + provider: { channel: new EventEmitter() }, + state: { location: { pathname: '/index.html', search: '' } }, + navigate: vi.fn(), + fullAPI: { getCurrentStoryData: () => ({ id: 'test--story' }) }, + }); + store.setState(state); + + const { managerHref, previewHref } = api.getStoryHrefs('test--story'); + expect(managerHref).toEqual('/index.html?path=/story/test--story'); + expect(previewHref).toEqual('/iframe.html?id=test--story&viewMode=story'); }); }); From 841eb65ba05eacc0ee78da85dd97a693495a2424 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 30 Jan 2026 10:42:40 +0100 Subject: [PATCH 22/71] Merge pull request #33340 from tanujbhaud/fix/windows-paths-addon-vitest-31768 Addon-Vitest: Normalize Windows paths in addon-vitest automigration (cherry picked from commit 3802b16031a3678d9e7d6bc7a462a5494500abe2) --- .../vitest/src/updateVitestFile.test.ts | 33 +++++++++++++++++-- code/addons/vitest/src/updateVitestFile.ts | 7 ++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/code/addons/vitest/src/updateVitestFile.test.ts b/code/addons/vitest/src/updateVitestFile.test.ts index c316e0f281e2..89cfe368a6c1 100644 --- a/code/addons/vitest/src/updateVitestFile.test.ts +++ b/code/addons/vitest/src/updateVitestFile.test.ts @@ -1176,7 +1176,7 @@ describe('updateWorkspaceFile', () => { + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + export default ['packages/*', 'ROOT_CONFIG', { - + extends: '', + + extends: '.', + plugins: [ + // The plugin will run tests for the stories defined in your Storybook config + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest @@ -1235,7 +1235,7 @@ describe('updateWorkspaceFile', () => { + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + export default defineWorkspace(['packages/*', 'ROOT_CONFIG', { - + extends: '', + + extends: '.', + plugins: [ + // The plugin will run tests for the stories defined in your Storybook config + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest @@ -1258,3 +1258,32 @@ describe('updateWorkspaceFile', () => { `); }); }); + +describe('loadTemplate', () => { + it('normalizes Windows paths to forward slashes', async () => { + // Windows-style path with backslashes (need to escape them in JS strings) + const windowsPath = '.\\apps\\frontend-storybook\\.storybook'; + + const result = await loadTemplate('vitest.config.template.ts', { + CONFIG_DIR: windowsPath, + SETUP_FILE: '.\\apps\\frontend-storybook\\.storybook\\vitest.setup.ts', + }); + + // Should contain forward slashes, not backslashes + expect(result).toContain('apps/frontend-storybook/.storybook'); + expect(result).not.toContain('\\apps\\'); + }); + + it('preserves forward slashes in paths', async () => { + // Unix-style path with forward slashes + const unixPath = './apps/frontend-storybook/.storybook'; + + const result = await loadTemplate('vitest.config.template.ts', { + CONFIG_DIR: unixPath, + SETUP_FILE: './apps/frontend-storybook/.storybook/vitest.setup.ts', + }); + + // Should still contain forward slashes + expect(result).toContain('apps/frontend-storybook/.storybook'); + }); +}); diff --git a/code/addons/vitest/src/updateVitestFile.ts b/code/addons/vitest/src/updateVitestFile.ts index 567df3de2114..46661c099849 100644 --- a/code/addons/vitest/src/updateVitestFile.ts +++ b/code/addons/vitest/src/updateVitestFile.ts @@ -2,7 +2,7 @@ import * as fs from 'node:fs/promises'; import type { BabelFile, types as t } from 'storybook/internal/babel'; -import { join } from 'pathe'; +import { join, normalize } from 'pathe'; import { resolvePackageDir } from '../../../core/src/shared/utils/module'; @@ -11,7 +11,10 @@ export const loadTemplate = async (name: string, replacements: Record (template = template.replace(key, value))); + // Normalize Windows paths (backslashes) to forward slashes for JavaScript string compatibility + Object.entries(replacements).forEach( + ([key, value]) => (template = template.replace(key, normalize(value))) + ); return template; }; From 98cc4b5cc8ed5dc50839a03edb20edb5a4a9bdfc Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Fri, 30 Jan 2026 09:45:43 +0000 Subject: [PATCH 23/71] Write changelog for 10.2.3 [skip ci] --- CHANGELOG.md | 5 +++++ code/package.json | 3 ++- docs/versions/latest.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55cbd250828e..13751f6c92f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 10.2.3 + +- Addon-Vitest: Normalize Windows paths in addon-vitest automigration - [#33340](https://github.com/storybookjs/storybook/pull/33340), thanks @tanujbhaud! +- Core: Fix `previewHref` when current path does not end with a slash - [#33647](https://github.com/storybookjs/storybook/pull/33647), thanks @ghengeveld! + ## 10.2.2 - Addon Vitest: Support simple vite.config without defineConfig helper - [#33694](https://github.com/storybookjs/storybook/pull/33694), thanks @valentinpalkovic! diff --git a/code/package.json b/code/package.json index 7093a5d20551..1c58cff91205 100644 --- a/code/package.json +++ b/code/package.json @@ -220,5 +220,6 @@ "Dependency Upgrades" ] ] - } + }, + "deferredNextVersion": "10.2.3" } diff --git a/docs/versions/latest.json b/docs/versions/latest.json index de67f2eb604e..1ee94b9180e2 100644 --- a/docs/versions/latest.json +++ b/docs/versions/latest.json @@ -1 +1 @@ -{"version":"10.2.2","info":{"plain":"- Addon Vitest: Support simple vite.config without defineConfig helper - [#33694](https://github.com/storybookjs/storybook/pull/33694), thanks @valentinpalkovic!\n- Addon-Vitest: Append Storybook project to existing test.projects array without double nesting - [#33708](https://github.com/storybookjs/storybook/pull/33708), thanks @valentinpalkovic!\n- Addon-Vitest: Update Vitest plugin configuration to disable requireAssertions for expect - [#33693](https://github.com/storybookjs/storybook/pull/33693), thanks @valentinpalkovic!\n- Composition: Handle 401 responses with loginUrl from Chromatic - [#33705](https://github.com/storybookjs/storybook/pull/33705), thanks @kasperpeulen!\n- Telemetry: Add agent detection - [#33675](https://github.com/storybookjs/storybook/pull/33675), thanks @valentinpalkovic!"}} \ No newline at end of file +{"version":"10.2.3","info":{"plain":"- Addon-Vitest: Normalize Windows paths in addon-vitest automigration - [#33340](https://github.com/storybookjs/storybook/pull/33340), thanks @tanujbhaud!\n- Core: Fix `previewHref` when current path does not end with a slash - [#33647](https://github.com/storybookjs/storybook/pull/33647), thanks @ghengeveld!"}} \ No newline at end of file From d959d6c8f0ad5c7bf6467d38b40f1cacdd3c80ad Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Fri, 30 Jan 2026 12:53:51 +0000 Subject: [PATCH 24/71] Bump version from "10.2.2" to "10.2.3" [skip ci] --- code/addons/a11y/package.json | 2 +- code/addons/docs/package.json | 2 +- code/addons/links/package.json | 2 +- code/addons/onboarding/package.json | 2 +- code/addons/pseudo-states/package.json | 2 +- code/addons/themes/package.json | 2 +- code/addons/vitest/package.json | 2 +- code/builders/builder-vite/package.json | 2 +- code/builders/builder-webpack5/package.json | 2 +- code/core/package.json | 2 +- code/core/src/common/versions.ts | 84 +++++++++---------- code/core/src/manager-api/version.ts | 2 +- code/frameworks/angular/package.json | 2 +- code/frameworks/ember/package.json | 2 +- code/frameworks/html-vite/package.json | 2 +- code/frameworks/nextjs-vite/package.json | 2 +- code/frameworks/nextjs/package.json | 2 +- code/frameworks/preact-vite/package.json | 2 +- .../react-native-web-vite/package.json | 2 +- code/frameworks/react-vite/package.json | 2 +- code/frameworks/react-webpack5/package.json | 2 +- code/frameworks/server-webpack5/package.json | 2 +- code/frameworks/svelte-vite/package.json | 2 +- code/frameworks/sveltekit/package.json | 2 +- code/frameworks/vue3-vite/package.json | 2 +- .../web-components-vite/package.json | 2 +- code/lib/cli-sb/package.json | 2 +- code/lib/cli-storybook/package.json | 2 +- code/lib/codemod/package.json | 2 +- code/lib/core-webpack/package.json | 2 +- code/lib/create-storybook/package.json | 2 +- code/lib/csf-plugin/package.json | 2 +- code/lib/eslint-plugin/package.json | 2 +- code/lib/react-dom-shim/package.json | 2 +- code/package.json | 5 +- code/presets/create-react-app/package.json | 2 +- code/presets/react-webpack/package.json | 2 +- code/presets/server-webpack/package.json | 2 +- code/renderers/html/package.json | 2 +- code/renderers/preact/package.json | 2 +- code/renderers/react/package.json | 2 +- code/renderers/server/package.json | 2 +- code/renderers/svelte/package.json | 2 +- code/renderers/vue3/package.json | 2 +- code/renderers/web-components/package.json | 2 +- 45 files changed, 87 insertions(+), 88 deletions(-) diff --git a/code/addons/a11y/package.json b/code/addons/a11y/package.json index 8045273d90b1..ea20ce57808d 100644 --- a/code/addons/a11y/package.json +++ b/code/addons/a11y/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-a11y", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Addon A11y: Test UI component compliance with WCAG web accessibility standards", "keywords": [ "a11y", diff --git a/code/addons/docs/package.json b/code/addons/docs/package.json index 0888f724c231..67b707a87395 100644 --- a/code/addons/docs/package.json +++ b/code/addons/docs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-docs", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Docs: Document UI components automatically with stories and MDX", "keywords": [ "docs", diff --git a/code/addons/links/package.json b/code/addons/links/package.json index cb587b0403c1..fdd54ff04003 100644 --- a/code/addons/links/package.json +++ b/code/addons/links/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-links", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Links: Link stories together to build demos and prototypes with your UI components", "keywords": [ "storybook", diff --git a/code/addons/onboarding/package.json b/code/addons/onboarding/package.json index 6427c6bde8f5..3163c879cf9c 100644 --- a/code/addons/onboarding/package.json +++ b/code/addons/onboarding/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-onboarding", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Onboarding: Help new users learn how to write stories", "keywords": [ "storybook", diff --git a/code/addons/pseudo-states/package.json b/code/addons/pseudo-states/package.json index 9f26ddda7f60..f9fb167d35a5 100644 --- a/code/addons/pseudo-states/package.json +++ b/code/addons/pseudo-states/package.json @@ -1,6 +1,6 @@ { "name": "storybook-addon-pseudo-states", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Pseudo-states addon: Manipulate CSS pseudo states", "keywords": [ "storybook", diff --git a/code/addons/themes/package.json b/code/addons/themes/package.json index 370f3bfc3a9c..180ca9bad27a 100644 --- a/code/addons/themes/package.json +++ b/code/addons/themes/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-themes", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Themes addon: Switch between themes from the toolbar", "keywords": [ "css", diff --git a/code/addons/vitest/package.json b/code/addons/vitest/package.json index 52281508a159..5bad64e998df 100644 --- a/code/addons/vitest/package.json +++ b/code/addons/vitest/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-vitest", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Vitest addon: Blazing fast component testing using stories", "keywords": [ "storybook", diff --git a/code/builders/builder-vite/package.json b/code/builders/builder-vite/package.json index f8d90d072049..141fe39aaa99 100644 --- a/code/builders/builder-vite/package.json +++ b/code/builders/builder-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/builder-vite", - "version": "10.2.2", + "version": "10.2.3", "description": "A Storybook builder to dev and build with Vite", "keywords": [ "storybook", diff --git a/code/builders/builder-webpack5/package.json b/code/builders/builder-webpack5/package.json index 8f4279da1f88..75980684d4fe 100644 --- a/code/builders/builder-webpack5/package.json +++ b/code/builders/builder-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/builder-webpack5", - "version": "10.2.2", + "version": "10.2.3", "description": "A Storybook builder to dev and build with Webpack", "keywords": [ "storybook", diff --git a/code/core/package.json b/code/core/package.json index 9067de5bbf8c..9bbfaca08be9 100644 --- a/code/core/package.json +++ b/code/core/package.json @@ -1,6 +1,6 @@ { "name": "storybook", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/core/src/common/versions.ts b/code/core/src/common/versions.ts index 4a8470b376e2..e35a856e9261 100644 --- a/code/core/src/common/versions.ts +++ b/code/core/src/common/versions.ts @@ -1,45 +1,45 @@ // auto generated file, do not edit export default { - '@storybook/addon-a11y': '10.2.2', - '@storybook/addon-docs': '10.2.2', - '@storybook/addon-links': '10.2.2', - '@storybook/addon-onboarding': '10.2.2', - 'storybook-addon-pseudo-states': '10.2.2', - '@storybook/addon-themes': '10.2.2', - '@storybook/addon-vitest': '10.2.2', - '@storybook/builder-vite': '10.2.2', - '@storybook/builder-webpack5': '10.2.2', - storybook: '10.2.2', - '@storybook/angular': '10.2.2', - '@storybook/ember': '10.2.2', - '@storybook/html-vite': '10.2.2', - '@storybook/nextjs': '10.2.2', - '@storybook/nextjs-vite': '10.2.2', - '@storybook/preact-vite': '10.2.2', - '@storybook/react-native-web-vite': '10.2.2', - '@storybook/react-vite': '10.2.2', - '@storybook/react-webpack5': '10.2.2', - '@storybook/server-webpack5': '10.2.2', - '@storybook/svelte-vite': '10.2.2', - '@storybook/sveltekit': '10.2.2', - '@storybook/vue3-vite': '10.2.2', - '@storybook/web-components-vite': '10.2.2', - sb: '10.2.2', - '@storybook/cli': '10.2.2', - '@storybook/codemod': '10.2.2', - '@storybook/core-webpack': '10.2.2', - 'create-storybook': '10.2.2', - '@storybook/csf-plugin': '10.2.2', - 'eslint-plugin-storybook': '10.2.2', - '@storybook/react-dom-shim': '10.2.2', - '@storybook/preset-create-react-app': '10.2.2', - '@storybook/preset-react-webpack': '10.2.2', - '@storybook/preset-server-webpack': '10.2.2', - '@storybook/html': '10.2.2', - '@storybook/preact': '10.2.2', - '@storybook/react': '10.2.2', - '@storybook/server': '10.2.2', - '@storybook/svelte': '10.2.2', - '@storybook/vue3': '10.2.2', - '@storybook/web-components': '10.2.2', + '@storybook/addon-a11y': '10.2.3', + '@storybook/addon-docs': '10.2.3', + '@storybook/addon-links': '10.2.3', + '@storybook/addon-onboarding': '10.2.3', + 'storybook-addon-pseudo-states': '10.2.3', + '@storybook/addon-themes': '10.2.3', + '@storybook/addon-vitest': '10.2.3', + '@storybook/builder-vite': '10.2.3', + '@storybook/builder-webpack5': '10.2.3', + storybook: '10.2.3', + '@storybook/angular': '10.2.3', + '@storybook/ember': '10.2.3', + '@storybook/html-vite': '10.2.3', + '@storybook/nextjs': '10.2.3', + '@storybook/nextjs-vite': '10.2.3', + '@storybook/preact-vite': '10.2.3', + '@storybook/react-native-web-vite': '10.2.3', + '@storybook/react-vite': '10.2.3', + '@storybook/react-webpack5': '10.2.3', + '@storybook/server-webpack5': '10.2.3', + '@storybook/svelte-vite': '10.2.3', + '@storybook/sveltekit': '10.2.3', + '@storybook/vue3-vite': '10.2.3', + '@storybook/web-components-vite': '10.2.3', + sb: '10.2.3', + '@storybook/cli': '10.2.3', + '@storybook/codemod': '10.2.3', + '@storybook/core-webpack': '10.2.3', + 'create-storybook': '10.2.3', + '@storybook/csf-plugin': '10.2.3', + 'eslint-plugin-storybook': '10.2.3', + '@storybook/react-dom-shim': '10.2.3', + '@storybook/preset-create-react-app': '10.2.3', + '@storybook/preset-react-webpack': '10.2.3', + '@storybook/preset-server-webpack': '10.2.3', + '@storybook/html': '10.2.3', + '@storybook/preact': '10.2.3', + '@storybook/react': '10.2.3', + '@storybook/server': '10.2.3', + '@storybook/svelte': '10.2.3', + '@storybook/vue3': '10.2.3', + '@storybook/web-components': '10.2.3', }; diff --git a/code/core/src/manager-api/version.ts b/code/core/src/manager-api/version.ts index b94a11a2599e..9477ebcf3d42 100644 --- a/code/core/src/manager-api/version.ts +++ b/code/core/src/manager-api/version.ts @@ -1 +1 @@ -export const version = '10.2.2'; +export const version = '10.2.3'; diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 16fb26bc9006..010ed4fb480a 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/angular", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Angular: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/ember/package.json b/code/frameworks/ember/package.json index 5e00085118da..13ebefd818c0 100644 --- a/code/frameworks/ember/package.json +++ b/code/frameworks/ember/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/ember", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Ember: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/html-vite/package.json b/code/frameworks/html-vite/package.json index d994c868a24d..f19ac9f3d348 100644 --- a/code/frameworks/html-vite/package.json +++ b/code/frameworks/html-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/html-vite", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for HTML and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/nextjs-vite/package.json b/code/frameworks/nextjs-vite/package.json index 47df75186a24..67ab0df89b73 100644 --- a/code/frameworks/nextjs-vite/package.json +++ b/code/frameworks/nextjs-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/nextjs-vite", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Next.js and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/nextjs/package.json b/code/frameworks/nextjs/package.json index e05fb7ae7ac5..f5f0a0602c6e 100644 --- a/code/frameworks/nextjs/package.json +++ b/code/frameworks/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/nextjs", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Next.js: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/preact-vite/package.json b/code/frameworks/preact-vite/package.json index 60dbf8bf6db1..3513a52bdcbe 100644 --- a/code/frameworks/preact-vite/package.json +++ b/code/frameworks/preact-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preact-vite", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Preact and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-native-web-vite/package.json b/code/frameworks/react-native-web-vite/package.json index ac7466d5656c..39be2f2dc2bd 100644 --- a/code/frameworks/react-native-web-vite/package.json +++ b/code/frameworks/react-native-web-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-native-web-vite", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for React Native Web and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-vite/package.json b/code/frameworks/react-vite/package.json index b4544bcc1337..e7aff0ccef37 100644 --- a/code/frameworks/react-vite/package.json +++ b/code/frameworks/react-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-vite", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for React and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-webpack5/package.json b/code/frameworks/react-webpack5/package.json index 7dda5803f5f8..6c8ce6fc62a0 100644 --- a/code/frameworks/react-webpack5/package.json +++ b/code/frameworks/react-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-webpack5", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for React and Webpack: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/server-webpack5/package.json b/code/frameworks/server-webpack5/package.json index 5242831ed271..41b658994ffd 100644 --- a/code/frameworks/server-webpack5/package.json +++ b/code/frameworks/server-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/server-webpack5", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.", "keywords": [ "storybook", diff --git a/code/frameworks/svelte-vite/package.json b/code/frameworks/svelte-vite/package.json index 843e9923fb94..0ca788d04b91 100644 --- a/code/frameworks/svelte-vite/package.json +++ b/code/frameworks/svelte-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/svelte-vite", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Svelte and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/sveltekit/package.json b/code/frameworks/sveltekit/package.json index 606e133d5b40..6d4527367b2f 100644 --- a/code/frameworks/sveltekit/package.json +++ b/code/frameworks/sveltekit/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/sveltekit", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for SvelteKit: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/vue3-vite/package.json b/code/frameworks/vue3-vite/package.json index 522d92843b9c..4cac397cd96e 100644 --- a/code/frameworks/vue3-vite/package.json +++ b/code/frameworks/vue3-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue3-vite", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Vue3 and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/web-components-vite/package.json b/code/frameworks/web-components-vite/package.json index 807daa9bf376..c99fbc255c25 100644 --- a/code/frameworks/web-components-vite/package.json +++ b/code/frameworks/web-components-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/web-components-vite", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Web Components and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/cli-sb/package.json b/code/lib/cli-sb/package.json index b8f07dbbf18a..0ebf4d05ffb0 100644 --- a/code/lib/cli-sb/package.json +++ b/code/lib/cli-sb/package.json @@ -1,6 +1,6 @@ { "name": "sb", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook CLI: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/cli-storybook/package.json b/code/lib/cli-storybook/package.json index 3de873c052eb..d9f0f817a8eb 100644 --- a/code/lib/cli-storybook/package.json +++ b/code/lib/cli-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/cli", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook CLI: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/codemod/package.json b/code/lib/codemod/package.json index 8b7ec9b9bf84..c99242dcf82b 100644 --- a/code/lib/codemod/package.json +++ b/code/lib/codemod/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/codemod", - "version": "10.2.2", + "version": "10.2.3", "description": "A collection of codemod scripts written with JSCodeshift", "keywords": [ "storybook" diff --git a/code/lib/core-webpack/package.json b/code/lib/core-webpack/package.json index 5a72857485ca..2748c62b53e5 100644 --- a/code/lib/core-webpack/package.json +++ b/code/lib/core-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/core-webpack", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook framework-agnostic API", "keywords": [ "storybook" diff --git a/code/lib/create-storybook/package.json b/code/lib/create-storybook/package.json index 65b01e757f30..40bb8322ad8f 100644 --- a/code/lib/create-storybook/package.json +++ b/code/lib/create-storybook/package.json @@ -1,6 +1,6 @@ { "name": "create-storybook", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook installer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/csf-plugin/package.json b/code/lib/csf-plugin/package.json index 2838b33452e7..cce101d122d7 100644 --- a/code/lib/csf-plugin/package.json +++ b/code/lib/csf-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/csf-plugin", - "version": "10.2.2", + "version": "10.2.3", "description": "Enrich CSF files via static analysis", "keywords": [ "storybook" diff --git a/code/lib/eslint-plugin/package.json b/code/lib/eslint-plugin/package.json index 6e222db85cdb..c587d96c2ea6 100644 --- a/code/lib/eslint-plugin/package.json +++ b/code/lib/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-storybook", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook ESLint Plugin: Best practice rules for writing stories", "keywords": [ "eslint", diff --git a/code/lib/react-dom-shim/package.json b/code/lib/react-dom-shim/package.json index d7f5cf87b2a8..b20e63e68e5b 100644 --- a/code/lib/react-dom-shim/package.json +++ b/code/lib/react-dom-shim/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-dom-shim", - "version": "10.2.2", + "version": "10.2.3", "description": "", "keywords": [ "storybook" diff --git a/code/package.json b/code/package.json index 1c58cff91205..c13ea3a972ee 100644 --- a/code/package.json +++ b/code/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/code", - "version": "10.2.2", + "version": "10.2.3", "private": true, "description": "Storybook root", "homepage": "https://storybook.js.org/", @@ -220,6 +220,5 @@ "Dependency Upgrades" ] ] - }, - "deferredNextVersion": "10.2.3" + } } diff --git a/code/presets/create-react-app/package.json b/code/presets/create-react-app/package.json index 19f52124073a..4536b04d6ed4 100644 --- a/code/presets/create-react-app/package.json +++ b/code/presets/create-react-app/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-create-react-app", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Create React App preset", "keywords": [ "storybook" diff --git a/code/presets/react-webpack/package.json b/code/presets/react-webpack/package.json index 037b38c054ab..1d1fdc112627 100644 --- a/code/presets/react-webpack/package.json +++ b/code/presets/react-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-react-webpack", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for React: Develop React Component in isolation with Hot Reloading", "keywords": [ "storybook" diff --git a/code/presets/server-webpack/package.json b/code/presets/server-webpack/package.json index 1fcfee2e9643..d872077c002e 100644 --- a/code/presets/server-webpack/package.json +++ b/code/presets/server-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-server-webpack", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.", "keywords": [ "storybook" diff --git a/code/renderers/html/package.json b/code/renderers/html/package.json index 93d0aa1e3fea..5ab932432ddd 100644 --- a/code/renderers/html/package.json +++ b/code/renderers/html/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/html", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook HTML renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/preact/package.json b/code/renderers/preact/package.json index ca0e26b2e93d..2dd1c400baa7 100644 --- a/code/renderers/preact/package.json +++ b/code/renderers/preact/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preact", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Preact renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/react/package.json b/code/renderers/react/package.json index a9ad262056ed..f8a3a0cf7755 100644 --- a/code/renderers/react/package.json +++ b/code/renderers/react/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook React renderer", "keywords": [ "storybook" diff --git a/code/renderers/server/package.json b/code/renderers/server/package.json index ea528e3923ab..8c59afd15952 100644 --- a/code/renderers/server/package.json +++ b/code/renderers/server/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/server", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Server renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/svelte/package.json b/code/renderers/svelte/package.json index 64b74139f6c5..738c8541dfe9 100644 --- a/code/renderers/svelte/package.json +++ b/code/renderers/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/svelte", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Svelte renderer: Develop, document, and test UI components in isolation.", "keywords": [ "storybook", diff --git a/code/renderers/vue3/package.json b/code/renderers/vue3/package.json index f689a0aa8688..f26464bf7c64 100644 --- a/code/renderers/vue3/package.json +++ b/code/renderers/vue3/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue3", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Vue 3 renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/web-components/package.json b/code/renderers/web-components/package.json index 576771bfc9fc..bbd934d0b260 100644 --- a/code/renderers/web-components/package.json +++ b/code/renderers/web-components/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/web-components", - "version": "10.2.2", + "version": "10.2.3", "description": "Storybook Web Components renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", From 70ac26366dfe1e55ab8f197950c579671d729bb4 Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Fri, 30 Jan 2026 13:11:34 +0000 Subject: [PATCH 25/71] Update ./docs/versions/next.json for v10.3.0-alpha.2 --- docs/versions/next.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/versions/next.json b/docs/versions/next.json index 3bf2ff42bd48..0303d19f6a1b 100644 --- a/docs/versions/next.json +++ b/docs/versions/next.json @@ -1 +1 @@ -{"version":"10.3.0-alpha.1","info":{"plain":"- Builder-Webpack5: Fix @vitest/mocker resolution issue - [#33315](https://github.com/storybookjs/storybook/pull/33315), thanks @valentinpalkovic!\n- CLI: Add init telemetry for CLI integrations - [#33603](https://github.com/storybookjs/storybook/pull/33603), thanks @shilman!\n- Core: Fix `previewHref` when current path does not end with a slash - [#33647](https://github.com/storybookjs/storybook/pull/33647), thanks @ghengeveld!\n- Core: Fix rendering of View Transitions in Firefox - [#33651](https://github.com/storybookjs/storybook/pull/33651), thanks @ghengeveld!\n- Manifest: Add docs entries to debugger - [#33607](https://github.com/storybookjs/storybook/pull/33607), thanks @JReinhold!\n- Theming: Export interface declaration for `ThemesGlobals` - [#33343](https://github.com/storybookjs/storybook/pull/33343), thanks @icopp!\n- UI: Avoid large animation for reduced motion users - [#33530](https://github.com/storybookjs/storybook/pull/33530), thanks @Sidnioulz!"}} \ No newline at end of file +{"version":"10.3.0-alpha.2","info":{"plain":"- Addon Vitest: Support simple vite.config without defineConfig helper - [#33694](https://github.com/storybookjs/storybook/pull/33694), thanks @valentinpalkovic!\n- Addon-Docs: Add support for `sourceState: 'none'` to canvas block parameters - [#33627](https://github.com/storybookjs/storybook/pull/33627), thanks @quisido!\n- Addon-Vitest: Append Storybook project to existing test.projects array without double nesting - [#33708](https://github.com/storybookjs/storybook/pull/33708), thanks @valentinpalkovic!\n- Addon-Vitest: Normalize Windows paths in addon-vitest automigration - [#33340](https://github.com/storybookjs/storybook/pull/33340), thanks @tanujbhaud!\n- Addon-Vitest: Skip postinstall setup when configured - [#33712](https://github.com/storybookjs/storybook/pull/33712), thanks @valentinpalkovic!\n- Addon-Vitest: Update Vitest plugin configuration to disable requireAssertions for expect - [#33693](https://github.com/storybookjs/storybook/pull/33693), thanks @valentinpalkovic!\n- CSF-Factories: Fix codemod for preview files without exports - [#33673](https://github.com/storybookjs/storybook/pull/33673), thanks @kasperpeulen!\n- CSF: Fix false positive detection of Zod v4 .meta() as CSF Factory - [#33666](https://github.com/storybookjs/storybook/pull/33666), thanks @kasperpeulen!\n- CSFFactories: Add non-interactive mode and --glob flag - [#33648](https://github.com/storybookjs/storybook/pull/33648), thanks @kasperpeulen!\n- CSFFactories: Preserve leading comments when adding imports - [#33645](https://github.com/storybookjs/storybook/pull/33645), thanks @kasperpeulen!\n- Cli: Use npm for registry URL in PNPMProxy to avoid workspace errors - [#33571](https://github.com/storybookjs/storybook/pull/33571), thanks @ia319!\n- Codemod: Fix csf-2-to-3 failing due to quoted filenames - [#33646](https://github.com/storybookjs/storybook/pull/33646), thanks @kasperpeulen!\n- Codemod: Fix glob pattern handling on Windows - [#33714](https://github.com/storybookjs/storybook/pull/33714), thanks @kasperpeulen!\n- Composition: Handle 401 responses with loginUrl from Chromatic - [#33705](https://github.com/storybookjs/storybook/pull/33705), thanks @kasperpeulen!\n- Core: Fix false-positive CJS warning when 'exports' appears in strings or comments - [#33572](https://github.com/storybookjs/storybook/pull/33572), thanks @reeseo3o!\n- Telemetry: Add agent detection - [#33675](https://github.com/storybookjs/storybook/pull/33675), thanks @valentinpalkovic!"}} \ No newline at end of file From 8ead8f89f3ea0fce50489a330a414291fae0f427 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 30 Jan 2026 11:09:59 +0100 Subject: [PATCH 26/71] Merge pull request #33714 from storybookjs/kasper/fix-codemod-windows Codemod: Fix glob pattern handling on Windows (cherry picked from commit 4d07f578f4bc7981ad6ca4786a84e8be175ee207) --- code/lib/codemod/src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/lib/codemod/src/index.ts b/code/lib/codemod/src/index.ts index 0455f7aeb5f7..f20f770bb267 100644 --- a/code/lib/codemod/src/index.ts +++ b/code/lib/codemod/src/index.ts @@ -6,6 +6,7 @@ import { extname, join } from 'node:path'; import { resolvePackageDir } from 'storybook/internal/common'; import { sync as spawnSync } from 'cross-spawn'; +import { normalize } from 'pathe'; import { glob as tinyglobby } from 'tinyglobby'; import { jscodeshiftToPrettierParser } from './lib/utils'; @@ -60,7 +61,8 @@ export async function runCodemod( } } - const files = await tinyglobby([glob, '!**/node_modules', '!**/dist']); + // Normalize the glob pattern to use forward slashes (required for glob patterns on Windows) + const files = await tinyglobby([normalize(glob), '!**/node_modules', '!**/dist']); const extensions = new Set(files.map((file) => extname(file).slice(1))); const commaSeparatedExtensions = Array.from(extensions).join(','); From fe31daf5c98d0d1b8f59346828ce0080ae47d368 Mon Sep 17 00:00:00 2001 From: Kasper Peulen Date: Wed, 28 Jan 2026 16:10:02 +0700 Subject: [PATCH 27/71] Merge pull request #33648 from storybookjs/kasper/csf-factories-non-interactive-mode CSFFactories: Add non-interactive mode and --glob flag (cherry picked from commit e9c8a87d221154f5681af330f4d28171cadd11d5) --- .../cli-storybook/src/automigrate/index.ts | 4 +++ .../src/automigrate/multi-project.ts | 3 +- .../cli-storybook/src/automigrate/types.ts | 6 ++++ code/lib/cli-storybook/src/bin/run.ts | 1 + .../src/codemod/csf-factories.ts | 36 ++++++++++++++----- 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/code/lib/cli-storybook/src/automigrate/index.ts b/code/lib/cli-storybook/src/automigrate/index.ts index 040f427ba5ec..c7a2a5b21a12 100644 --- a/code/lib/cli-storybook/src/automigrate/index.ts +++ b/code/lib/cli-storybook/src/automigrate/index.ts @@ -122,6 +122,7 @@ export const automigrate = async ({ isLatest, storiesPaths, hasCsfFactoryPreview, + glob, }: AutofixOptions): Promise<{ fixResults: Record; preCheckFailure?: PreCheckFailure; @@ -146,6 +147,8 @@ export const automigrate = async ({ result: null, storybookVersion, storiesPaths, + yes, + glob, }); return null; @@ -380,6 +383,7 @@ export async function runFixes({ skipInstall, storybookVersion, storiesPaths, + yes, }); logger.log(`✅ ran ${picocolors.cyan(f.id)} migration`); diff --git a/code/lib/cli-storybook/src/automigrate/multi-project.ts b/code/lib/cli-storybook/src/automigrate/multi-project.ts index 59543089404c..7c331348c63d 100644 --- a/code/lib/cli-storybook/src/automigrate/multi-project.ts +++ b/code/lib/cli-storybook/src/automigrate/multi-project.ts @@ -264,7 +264,7 @@ export async function runAutomigrationsForProjects( selectedAutomigrations: AutomigrationCheckResult[], options: MultiProjectRunAutomigrationOptions ): Promise> { - const { dryRun, skipInstall, automigrations } = options; + const { dryRun, skipInstall, automigrations, yes } = options; const projectResults: Record = {}; const applicableAutomigrations = selectedAutomigrations.filter((am) => @@ -378,6 +378,7 @@ export async function runAutomigrationsForProjects( skipInstall, storybookVersion: project.storybookVersion, storiesPaths: project.storiesPaths, + yes, }; await fix.run(runOptions); diff --git a/code/lib/cli-storybook/src/automigrate/types.ts b/code/lib/cli-storybook/src/automigrate/types.ts index 1856e53c4211..28e4dcc1d183 100644 --- a/code/lib/cli-storybook/src/automigrate/types.ts +++ b/code/lib/cli-storybook/src/automigrate/types.ts @@ -24,6 +24,10 @@ export interface RunOptions { skipInstall?: boolean; storybookVersion: string; storiesPaths: string[]; + /** Skip prompts and use defaults (from --yes flag) */ + yes?: boolean; + /** Glob pattern for story files (for csf-factories codemod) */ + glob?: string; } /** @@ -97,6 +101,8 @@ export interface AutofixOptionsFromCLI { skipInstall?: boolean; hideMigrationSummary?: boolean; skipDoctor?: boolean; + /** Glob pattern for story files (for csf-factories codemod) */ + glob?: string; } export enum FixStatus { diff --git a/code/lib/cli-storybook/src/bin/run.ts b/code/lib/cli-storybook/src/bin/run.ts index db04e21eb2b1..031c540a27c6 100644 --- a/code/lib/cli-storybook/src/bin/run.ts +++ b/code/lib/cli-storybook/src/bin/run.ts @@ -281,6 +281,7 @@ command('automigrate [fixId]') 'The renderer package for the framework Storybook is using.' ) .option('--skip-doctor', 'Skip doctor check') + .option('--glob ', 'Glob pattern for story files (for csf-factories codemod)') .action(async (fixId, options) => { withTelemetry('automigrate', { cliOptions: options }, async () => { logger.intro(fixId ? `Running ${fixId} automigration` : 'Running automigrations'); diff --git a/code/lib/cli-storybook/src/codemod/csf-factories.ts b/code/lib/cli-storybook/src/codemod/csf-factories.ts index 35e0e1a4ecea..0aad19f84efa 100644 --- a/code/lib/cli-storybook/src/codemod/csf-factories.ts +++ b/code/lib/cli-storybook/src/codemod/csf-factories.ts @@ -19,15 +19,22 @@ async function runStoriesCodemod(options: { packageManager: JsPackageManager; useSubPathImports: boolean; previewConfigPath: string; + yes: boolean | undefined; + glob: string | undefined; }) { - const { dryRun, packageManager, ...codemodOptions } = options; + const { dryRun, packageManager, yes, glob, ...codemodOptions } = options; try { - let globString = '{stories,src}/**/{Button,Header,Page,button,header,page}.stories.*'; - if (!optionalEnvToBoolean(process.env.IN_STORYBOOK_SANDBOX)) { + const inSandbox = optionalEnvToBoolean(process.env.IN_STORYBOOK_SANDBOX) ?? false; + let globString = glob ?? '**/*.{stories,story}.{js,jsx,ts,tsx,mjs,mjsx,mts,mtsx}'; + + if (!glob && inSandbox) { + // Sandbox uses limited glob for faster testing (unless glob explicitly provided) + globString = '{stories,src}/**/{Button,Header,Page,button,header,page}.stories.*'; + } else if (!glob && !yes) { logger.log('Please enter the glob for your stories to migrate'); globString = await prompt.text({ message: 'glob', - initialValue: '**/*.{stories,story}.{js,jsx,ts,tsx,mjs,mjsx,mts,mtsx}', + initialValue: globString, }); } @@ -52,10 +59,21 @@ async function runStoriesCodemod(options: { export const csfFactories: CommandFix = { id: 'csf-factories', promptType: 'command', - async run({ dryRun, mainConfig, mainConfigPath, previewConfigPath, packageManager, configDir }) { - let useSubPathImports = true; - - if (!optionalEnvToBoolean(process.env.IN_STORYBOOK_SANDBOX)) { + async run({ + dryRun, + mainConfig, + mainConfigPath, + previewConfigPath, + packageManager, + configDir, + yes, + glob, + }) { + const inSandbox = optionalEnvToBoolean(process.env.IN_STORYBOOK_SANDBOX) ?? false; + // Defaults to false for users and true in sandbox + let useSubPathImports = inSandbox; + + if (!yes && !inSandbox) { // prompt whether the user wants to use imports map logger.logBox(dedent` The CSF Factories format can benefit from using absolute imports of your ${picocolors.cyan(previewConfigPath)} file. We can configure that for you, using subpath imports (a node standard), by adjusting the imports property of your package.json. @@ -96,6 +114,8 @@ export const csfFactories: CommandFix = { packageManager, useSubPathImports, previewConfigPath: previewConfigPath!, + yes, + glob, }); logger.step('Applying codemod on your main config...'); From c40089391e544766cc4292002c4890cace1b67c1 Mon Sep 17 00:00:00 2001 From: Kasper Peulen Date: Wed, 28 Jan 2026 16:08:12 +0700 Subject: [PATCH 28/71] Merge pull request #33666 from storybookjs/fix-zod-meta-false-positive CSF: Fix false positive detection of Zod v4 .meta() as CSF Factory (cherry picked from commit 32ee24ef707508db4f40057281adf73c35fa8aa5) --- code/core/src/csf-tools/CsfFile.test.ts | 61 ++++++++++++++++++++++++- code/core/src/csf-tools/CsfFile.ts | 5 +- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/code/core/src/csf-tools/CsfFile.test.ts b/code/core/src/csf-tools/CsfFile.test.ts index b6fec897d9b9..ab2ea4236bc2 100644 --- a/code/core/src/csf-tools/CsfFile.test.ts +++ b/code/core/src/csf-tools/CsfFile.test.ts @@ -2970,11 +2970,13 @@ describe('CsfFile', () => { }); it('bad preview import', () => { + // Only throws when the variable is named "preview" to avoid false positives + // from libraries like Zod that have their own .meta() methods expect(() => parse( dedent` - import { config } from '#.storybook/bad-preview' - const meta = config.meta({ component: 'foo' }); + import { preview } from '#.storybook/bad-preview' + const meta = preview.meta({ component: 'foo' }); export const A = meta.story({}) ` ) @@ -3047,6 +3049,61 @@ describe('CsfFile', () => { More info: https://storybook.js.org/docs/writing-stories?ref=error#default-export] `); }); + + it('ignores unrelated .meta() calls on imported variables (e.g., Zod v4)', () => { + // This should NOT throw - mySchema.meta() is not a CSF Factory call + // See: https://github.com/storybookjs/storybook/issues/33654 + const parsed = loadCsf( + dedent` + import { mySchema } from './schemas'; + + const validatedSchema = mySchema.meta({ description: 'Value' }); + + export default { + title: 'Example', + component: () => null, + }; + + export const Default = {}; + `, + { makeTitle } + ).parse(); + + expect(parsed._meta).toMatchInlineSnapshot(` + title: Example + component: () => null + `); + expect(Object.keys(parsed._stories)).toEqual(['Default']); + }); + + it('ignores chained .meta() calls from libraries like Zod', () => { + // More complex Zod-like patterns should also work + const parsed = loadCsf( + dedent` + import { z } from 'zod'; + import { mySchema } from './schemas'; + + const workingSchema = z.object({ + name: z.string().meta({ description: 'Name' }), + }); + + const failingSchema = z.object({ + value: mySchema.meta({ description: 'Value' }), + }); + + export default { + title: 'Example', + component: () => null, + }; + + export const Default = {}; + `, + { makeTitle } + ).parse(); + + expect(parsed._meta?.title).toBe('Example'); + expect(Object.keys(parsed._stories)).toEqual(['Default']); + }); }); }); }); diff --git a/code/core/src/csf-tools/CsfFile.ts b/code/core/src/csf-tools/CsfFile.ts index dbff965d8070..4ecbdbd72c35 100644 --- a/code/core/src/csf-tools/CsfFile.ts +++ b/code/core/src/csf-tools/CsfFile.ts @@ -858,7 +858,10 @@ export class CsfFile { : callee.property.name; const metaNode = node.arguments[0] as t.ObjectExpression; self._parseMeta(metaNode, self._ast.program); - } else { + } else if (rootObject.name === 'preview') { + // Only throw if the variable is named "preview" - this indicates + // the user is trying to use CSF Factories but with a wrong import path. + // Other .meta() calls (e.g., Zod v4's .meta()) are silently ignored. throw new BadMetaError( 'meta() factory must be imported from .storybook/preview configuration', configParent, From 92ce460bf8d92631bd5de4da443f98ea952e3f89 Mon Sep 17 00:00:00 2001 From: Kasper Peulen Date: Wed, 28 Jan 2026 16:10:12 +0700 Subject: [PATCH 29/71] Merge pull request #33645 from storybookjs/fix-csf-import-comments CSFFactories: Preserve leading comments when adding imports (cherry picked from commit 0cfa3a8d6c1523a4321d9ed44237ed6c64c41935) --- .../helpers/config-to-csf-factory.test.ts | 22 ++++++++++++++++ .../codemod/helpers/config-to-csf-factory.ts | 3 ++- .../codemod/helpers/csf-factories-utils.ts | 26 +++++++++++++++++++ .../helpers/story-to-csf-factory.test.ts | 22 ++++++++++++++++ .../codemod/helpers/story-to-csf-factory.ts | 4 +-- 5 files changed, 74 insertions(+), 3 deletions(-) diff --git a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts index 48aa77ccff9b..eb20715486f5 100644 --- a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts +++ b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts @@ -58,6 +58,28 @@ describe('main/preview codemod: general parsing functionality', () => { }); `); }); + + it('should preserve leading comments when adding import', async () => { + await expect( + transform(dedent` + // @ts-check + /** @license MIT */ + export default { + stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], + framework: '@storybook/react-vite', + }; + `) + ).resolves.toMatchInlineSnapshot(` + // @ts-check + /** @license MIT */ + import { defineMain } from '@storybook/react-vite/node'; + + export default defineMain({ + stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], + framework: '@storybook/react-vite', + }); + `); + }); it('should wrap defineMain call from const declared default export with different type annotations', async () => { const typedVariants = [ 'export default config;', diff --git a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts index 42b6c1787e51..631e7677abfb 100644 --- a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts +++ b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts @@ -7,6 +7,7 @@ import picocolors from 'picocolors'; import type { FileInfo } from '../../automigrate/codemod'; import { + addImportToTop, cleanupTypeImports, getConfigProperties, removeExportDeclarations, @@ -197,7 +198,7 @@ export async function configToCsfFactory( } } else { // if not, add import { defineMain } from '@storybook/framework' - programNode.body.unshift(configImport); + addImportToTop(programNode, configImport); } // Remove type imports – now inferred – from @storybook/* packages diff --git a/code/lib/cli-storybook/src/codemod/helpers/csf-factories-utils.ts b/code/lib/cli-storybook/src/codemod/helpers/csf-factories-utils.ts index 0b23e670d09e..46864f464091 100644 --- a/code/lib/cli-storybook/src/codemod/helpers/csf-factories-utils.ts +++ b/code/lib/cli-storybook/src/codemod/helpers/csf-factories-utils.ts @@ -119,3 +119,29 @@ export function getConfigProperties( // error TS4058: Return type of exported function has or is using name 'ObjectProperty' from external module "/tmp/storybook/code/core/dist/babel/index" but cannot be named. return properties as any; } + +/** + * Adds an import declaration to the beginning of the program while preserving any leading comments + * (like license headers or @ts-check directives). + * + * When using `programNode.body.unshift()`, the import would be placed before any leading comments + * attached to the first node. This function transfers those comments to the new import so they + * remain at the top of the file. + * + * Note: We use the `comments` property (used by recast for printing) rather than `leadingComments` + * (used by babel internally) to ensure proper output formatting. + */ +export function addImportToTop(programNode: t.Program, importDecl: t.ImportDeclaration): void { + const firstNode = programNode.body[0] as t.Node & { comments?: t.Comment[] }; + + if (firstNode && firstNode.leadingComments && firstNode.leadingComments.length > 0) { + // Transfer leading comments from the first node to the import using 'comments' property + // which is what recast uses for printing (not 'leadingComments') + (importDecl as t.Node & { comments?: t.Comment[] }).comments = firstNode.leadingComments; + // Clear comments from the original first node to avoid duplication + firstNode.leadingComments = []; + firstNode.comments = []; + } + + programNode.body.unshift(importDecl); +} diff --git a/code/lib/cli-storybook/src/codemod/helpers/story-to-csf-factory.test.ts b/code/lib/cli-storybook/src/codemod/helpers/story-to-csf-factory.test.ts index 814d69522eb6..a621f15f6d34 100644 --- a/code/lib/cli-storybook/src/codemod/helpers/story-to-csf-factory.test.ts +++ b/code/lib/cli-storybook/src/codemod/helpers/story-to-csf-factory.test.ts @@ -45,6 +45,28 @@ describe('stories codemod', () => { `); }); + it('should preserve leading comments when adding import', async () => { + await expect( + transform(dedent` + // @ts-check + /** + * @license MIT + * Copyright 2024 + */ + const meta = { title: 'Component' }; + export default meta; + export const A = {}; + `) + ).resolves.toMatchInlineSnapshot(` + // @ts-check + /** @license MIT Copyright 2024 */ + import preview from '#.storybook/preview'; + + const meta = preview.meta({ title: 'Component' }); + export const A = meta.story(); + `); + }); + it('should transform and wrap inline default exported meta', async () => { await expect( transform(dedent` diff --git a/code/lib/cli-storybook/src/codemod/helpers/story-to-csf-factory.ts b/code/lib/cli-storybook/src/codemod/helpers/story-to-csf-factory.ts index 07d9f27ab195..8e4a23c3d44a 100644 --- a/code/lib/cli-storybook/src/codemod/helpers/story-to-csf-factory.ts +++ b/code/lib/cli-storybook/src/codemod/helpers/story-to-csf-factory.ts @@ -5,7 +5,7 @@ import { logger } from 'storybook/internal/node-logger'; import path from 'path'; import type { FileInfo } from '../../automigrate/codemod'; -import { cleanupTypeImports } from './csf-factories-utils'; +import { addImportToTop, cleanupTypeImports } from './csf-factories-utils'; import { removeUnusedTypes } from './remove-unused-types'; const typesDisallowList = [ @@ -324,7 +324,7 @@ export async function storyToCsfFactory( [t.importDefaultSpecifier(t.identifier(sbConfigImportName))], t.stringLiteral(previewPath) ); - programNode.body.unshift(configImport); + addImportToTop(programNode, configImport); } removeUnusedTypes(programNode, csf._ast); From ee7ef005ab6b494817f056ffb9414785194da283 Mon Sep 17 00:00:00 2001 From: Kasper Peulen Date: Wed, 28 Jan 2026 16:10:26 +0700 Subject: [PATCH 30/71] Merge pull request #33646 from storybookjs/kasper/fix-csf-factories-codemod-33639 Codemod: Fix csf-2-to-3 failing due to quoted filenames (cherry picked from commit acf98b324d0667ca500b0350082b75f5acdad432) --- code/lib/codemod/src/index.test.ts | 119 +++++++++++++++++++++++++++++ code/lib/codemod/src/index.ts | 2 +- 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 code/lib/codemod/src/index.test.ts diff --git a/code/lib/codemod/src/index.test.ts b/code/lib/codemod/src/index.test.ts new file mode 100644 index 000000000000..482bc947b963 --- /dev/null +++ b/code/lib/codemod/src/index.test.ts @@ -0,0 +1,119 @@ +import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; + +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +import { runCodemod } from './index'; + +const logger = { + step: vi.fn(), + log: vi.fn(), +}; + +const csf2Source = `import { Meta, Story } from '@storybook/react-vite' + +import { Chart, ChartProps } from './chart' + +export default { + component: Chart, + title: 'Chart', +} as Meta + +const Template: Story = (args) => + +export const SimpleBar = Template.bind({}) +SimpleBar.args = { name: 'test' } +`; + +describe('runCodemod', () => { + const tempDir = join(tmpdir(), 'storybook-codemod-test'); + + beforeEach(() => { + mkdirSync(tempDir, { recursive: true }); + vi.clearAllMocks(); + }); + + afterEach(() => { + rmSync(tempDir, { recursive: true, force: true }); + }); + + /** + * https://github.com/storybookjs/storybook/issues/33639 + * + * Reproduces the bug where csf-2-to-3 silently fails because filenames are incorrectly quoted + * when passed to spawnSync. + * + * Test file from: + * https://github.com/seb-oss/green/blob/b634df24d2dae157300f73b711e569d1755eb138/libs/react-charts/src/lib/chart.stories.tsx + */ + it('should transform CSF2 Template.bind({}) files with csf-2-to-3', async () => { + const storyFile = join(tempDir, 'chart.stories.tsx'); + writeFileSync(storyFile, csf2Source); + + await runCodemod('csf-2-to-3', { + glob: storyFile, + logger, + }); + + const result = readFileSync(storyFile, 'utf-8'); + + // csf-2-to-3 should transform Template.bind({}) to CSF3 object + expect(result).not.toContain('Template.bind({})'); + expect(result).toContain('export const SimpleBar = {'); + }); + + it('should handle filenames with spaces', async () => { + const storyFile = join(tempDir, 'my component.stories.tsx'); + writeFileSync(storyFile, csf2Source); + + await runCodemod('csf-2-to-3', { + glob: storyFile, + logger, + }); + + const result = readFileSync(storyFile, 'utf-8'); + + expect(result).not.toContain('Template.bind({})'); + expect(result).toContain('export const SimpleBar = {'); + }); + + it('should handle glob patterns', async () => { + const storyFile1 = join(tempDir, 'chart.stories.tsx'); + const storyFile2 = join(tempDir, 'button.stories.tsx'); + writeFileSync(storyFile1, csf2Source); + writeFileSync(storyFile2, csf2Source); + + await runCodemod('csf-2-to-3', { + glob: join(tempDir, '*.stories.tsx'), + logger, + }); + + const result1 = readFileSync(storyFile1, 'utf-8'); + const result2 = readFileSync(storyFile2, 'utf-8'); + + expect(result1).not.toContain('Template.bind({})'); + expect(result2).not.toContain('Template.bind({})'); + }); + + it('should handle recursive glob patterns', async () => { + const nestedDir = join(tempDir, 'components', 'charts'); + mkdirSync(nestedDir, { recursive: true }); + + const storyFile1 = join(tempDir, 'root.stories.tsx'); + const storyFile2 = join(nestedDir, 'nested.stories.tsx'); + writeFileSync(storyFile1, csf2Source); + writeFileSync(storyFile2, csf2Source); + + await runCodemod('csf-2-to-3', { + glob: join(tempDir, '**/*.stories.tsx'), + logger, + }); + + const result1 = readFileSync(storyFile1, 'utf-8'); + const result2 = readFileSync(storyFile2, 'utf-8'); + + expect(result1).not.toContain('Template.bind({})'); + expect(result2).not.toContain('Template.bind({})'); + }); +}); diff --git a/code/lib/codemod/src/index.ts b/code/lib/codemod/src/index.ts index f20f770bb267..22e453c26e75 100644 --- a/code/lib/codemod/src/index.ts +++ b/code/lib/codemod/src/index.ts @@ -88,7 +88,7 @@ export async function runCodemod( '-t', `${TRANSFORM_DIR}/${codemod}.js`, ...parserArgs, - ...files.map((file) => `"${file}"`), + ...files, ], { stdio: 'inherit', From 1f194b1cc2af8dc2693e985a560c57ab8aac19c0 Mon Sep 17 00:00:00 2001 From: Kasper Peulen Date: Wed, 28 Jan 2026 20:53:34 +0700 Subject: [PATCH 31/71] Merge pull request #33673 from storybookjs/fix-csf-factory-preview-no-exports CSF-Factories: Fix codemod for preview files without exports (cherry picked from commit 0d867e479591e3b7f73ced4be9dbe15e82ea5864) --- .../helpers/config-to-csf-factory.test.ts | 40 ++++++++++++++++++- .../codemod/helpers/config-to-csf-factory.ts | 15 +++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts index eb20715486f5..8c22d4fbba96 100644 --- a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts +++ b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts @@ -347,7 +347,7 @@ describe('preview specific functionality', () => { import { type Preview } from '@storybook/react-vite'; export const decorators = [] const preview = { - + parameters: { options: {} } @@ -368,4 +368,42 @@ describe('preview specific functionality', () => { }); `); }); + + it('should add default export when preview only has side-effect imports', async () => { + await expect( + transform(dedent` + import './preview.scss' + `) + ).resolves.toMatchInlineSnapshot(` + import { definePreview } from '@storybook/react-vite'; + + import './preview.scss'; + + export default definePreview({}); + `); + }); + + it('should add default export when preview file is empty', async () => { + await expect(transform('')).resolves.toMatchInlineSnapshot(` + import { definePreview } from '@storybook/react-vite'; + + export default definePreview({}); + `); + }); + + it('should add default export when preview only has multiple side-effect imports', async () => { + await expect( + transform(dedent` + import './preview.scss' + import './global.css' + `) + ).resolves.toMatchInlineSnapshot(` + import { definePreview } from '@storybook/react-vite'; + + import './global.css'; + import './preview.scss'; + + export default definePreview({}); + `); + }); }); diff --git a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts index 631e7677abfb..c289c247ff51 100644 --- a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts +++ b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts @@ -166,6 +166,21 @@ export async function configToCsfFactory( // Add the new export default declaration programNode.body.push(t.exportDefaultDeclaration(defineConfigCall)); + } else if (configType === 'preview') { + /** + * Scenario 4: No exports (empty file or only side-effect imports) + * + * ``` + * import './preview.scss'; + * ``` + * + * Transform into: `import './preview.scss'; export default definePreview({})` + * + * This is needed because story files using CSF factories import from preview, so the preview + * file must have a default export. + */ + const defineConfigCall = t.callExpression(t.identifier(methodName), [t.objectExpression([])]); + programNode.body.push(t.exportDefaultDeclaration(defineConfigCall)); } const configImport = t.importDeclaration( From 8d21731e5d42e638cff4b1f888abb01deec1b8e5 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 30 Jan 2026 15:23:25 +0100 Subject: [PATCH 32/71] Merge pull request #33419 from pallaprolus/fix/30390-nextjs-link-context Next.js: Alias AppRouterContext to shared runtime to fix Link navigation (cherry picked from commit 045142734288ce2bd0fe9c66d4db725a6cc6e0bb) --- code/frameworks/nextjs/src/aliases/webpack.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/frameworks/nextjs/src/aliases/webpack.ts b/code/frameworks/nextjs/src/aliases/webpack.ts index 879b28e0d483..a9453814b7be 100644 --- a/code/frameworks/nextjs/src/aliases/webpack.ts +++ b/code/frameworks/nextjs/src/aliases/webpack.ts @@ -14,6 +14,10 @@ export const configureAliases = (baseConfig: WebpackConfig): void => { ...(baseConfig.resolve?.alias ?? {}), '@opentelemetry/api': 'next/dist/compiled/@opentelemetry/api', next: resolvePackageDir('next'), + 'next/dist/shared/lib/app-router-context.shared-runtime': + 'next/dist/shared/lib/app-router-context.shared-runtime', + 'next/dist/shared/lib/app-router-context': + 'next/dist/shared/lib/app-router-context.shared-runtime', }, }; From c947cc86e20bab66fb5ce315b8de789533ff1bb0 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 30 Jan 2026 15:22:03 +0100 Subject: [PATCH 33/71] Merge pull request #33697 from yatishgoel/fix/33689-zoom-button-active-prop Manager: Remove deprecated `active` prop warning in ZoomButton (cherry picked from commit faab9239628e112b1f57b08d26492c998345d6cc) --- .../src/manager/components/preview/tools/zoom.stories.tsx | 2 +- code/core/src/manager/components/preview/tools/zoom.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/core/src/manager/components/preview/tools/zoom.stories.tsx b/code/core/src/manager/components/preview/tools/zoom.stories.tsx index 4c4309a6ab68..75a5eec411ca 100644 --- a/code/core/src/manager/components/preview/tools/zoom.stories.tsx +++ b/code/core/src/manager/components/preview/tools/zoom.stories.tsx @@ -8,7 +8,7 @@ import preview from '../../../../../../.storybook/preview'; import { Zoom } from './zoom'; const openDialog = async (context: StoryContext) => { - const zoom = await context.canvas.findByRole('button', { name: 'Change zoom level' }); + const zoom = await context.canvas.findByRole('switch', { name: 'Change zoom level' }); await context.userEvent.click(zoom); return screen.findByRole('dialog'); }; diff --git a/code/core/src/manager/components/preview/tools/zoom.tsx b/code/core/src/manager/components/preview/tools/zoom.tsx index d6dfc5307929..8ae440d7f092 100644 --- a/code/core/src/manager/components/preview/tools/zoom.tsx +++ b/code/core/src/manager/components/preview/tools/zoom.tsx @@ -1,7 +1,7 @@ import type { PropsWithChildren } from 'react'; import React, { Component, createContext, memo, useCallback, useEffect, useRef } from 'react'; -import { ActionList, Button, PopoverProvider } from 'storybook/internal/components'; +import { ActionList, PopoverProvider, ToggleButton } from 'storybook/internal/components'; import type { Addon_BaseType } from 'storybook/internal/types'; import { UndoIcon, ZoomIcon } from '@storybook/icons'; @@ -15,7 +15,7 @@ import { NumericInput } from '../NumericInput'; const ZOOM_LEVELS = [0.25, 0.5, 0.75, 0.9, 1, 1.1, 1.25, 1.5, 2, 3, 4, 8] as const; const INITIAL_ZOOM_LEVEL = 1; -const ZoomButton = styled(Button)({ +const ZoomButton = styled(ToggleButton)({ minWidth: 48, }); @@ -148,7 +148,7 @@ export const Zoom = memo<{ padding="small" variant="ghost" ariaLabel="Change zoom level" - active={value !== INITIAL_ZOOM_LEVEL} + pressed={value !== INITIAL_ZOOM_LEVEL} > {Math.round(value * 100)}% From 9d9bceb488d6dce9d13978f2dd969d9b71e38ea2 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Mon, 2 Feb 2026 14:14:21 +0100 Subject: [PATCH 34/71] Merge pull request #33687 from storybookjs/kasper/docs-csf-next-generic-vue Docs: Add FAQ about generic Vue components in CSF Next (cherry picked from commit 72d12b40ca07d0a7553d73be8f3cd59f5dbafcbc) --- docs/writing-stories/typescript.mdx | 65 ++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/docs/writing-stories/typescript.mdx b/docs/writing-stories/typescript.mdx index 220e985c6b20..a78660f8b960 100644 --- a/docs/writing-stories/typescript.mdx +++ b/docs/writing-stories/typescript.mdx @@ -69,32 +69,57 @@ Sometimes stories need to define args that aren’t included in the component's {/* prettier-ignore-end */} - ## Vue specific tips - Vue has excellent support for TypeScript, and we have done our utmost to take advantage of that in the stories files. For example, consider the following strongly typed Vue 3 single file component (SFC): +## Vue specific tips - ```html - +```html + + + +``` + +You can type check SFC files with `vue-tsc` and get editor support in VSCode by installing the official [Vue extension](https://marketplace.visualstudio.com/items?itemName=Vue.volar). + +This setup will add type support for `*.vue` imports to your `*.stories.ts` files, providing the same type safety and autocomplete features. + +[CSF Next](../api/csf/csf-next.mdx) adds support for [Generic Vue components](https://vuejs.org/api/sfc-script-setup.html#generics) (using `', + '' + ); + expect(cleaned).toBe(html); + }); +}); diff --git a/code/builders/builder-vite/src/plugins/vite-inject-mocker/plugin.ts b/code/builders/builder-vite/src/plugins/vite-inject-mocker/plugin.ts index d8cc28d6b2b1..79dfaa64410f 100644 --- a/code/builders/builder-vite/src/plugins/vite-inject-mocker/plugin.ts +++ b/code/builders/builder-vite/src/plugins/vite-inject-mocker/plugin.ts @@ -51,7 +51,12 @@ export const viteInjectMockerRuntime = (options: { const headTag = html.match(/]*>/); if (headTag) { - const entryCode = ``; + // Use a relative path for production builds so the script loads + // correctly when artifacts are hosted at non-root paths (e.g., + // GitHub Pages subdirectories). In dev mode, the absolute path + // is required so Vite's dev server can match it in resolveId. + const src = viteConfig.command === 'build' ? `.${ENTRY_PATH}` : ENTRY_PATH; + const entryCode = ``; const headTagIndex = html.indexOf(headTag[0]); const newHtml = html.slice(0, headTagIndex + headTag[0].length) + From eb607d3d67196626437853adb1ae79b8f97079ef Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 11 Feb 2026 12:51:42 +0100 Subject: [PATCH 65/71] Merge pull request #33810 from storybookjs/valentin/fix-sec-issue Builder-Vite: Update dependencies react-vite framework (cherry picked from commit dd088b30c47a33ebc117a703835c5963909c9022) --- code/frameworks/react-vite/package.json | 2 +- yarn.lock | 67 ++++++++----------------- 2 files changed, 22 insertions(+), 47 deletions(-) diff --git a/code/frameworks/react-vite/package.json b/code/frameworks/react-vite/package.json index 502fb53af315..7786208ff1da 100644 --- a/code/frameworks/react-vite/package.json +++ b/code/frameworks/react-vite/package.json @@ -49,7 +49,7 @@ "!src/**/*" ], "dependencies": { - "@joshwooding/vite-plugin-react-docgen-typescript": "^0.6.3", + "@joshwooding/vite-plugin-react-docgen-typescript": "^0.6.4", "@rollup/pluginutils": "^5.0.2", "@storybook/builder-vite": "workspace:*", "@storybook/react": "workspace:*", diff --git a/yarn.lock b/yarn.lock index 7c29f8e7bba5..ab9fa385dbad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3301,12 +3301,12 @@ __metadata: languageName: node linkType: hard -"@isaacs/brace-expansion@npm:^5.0.0": - version: 5.0.0 - resolution: "@isaacs/brace-expansion@npm:5.0.0" +"@isaacs/brace-expansion@npm:^5.0.1": + version: 5.0.1 + resolution: "@isaacs/brace-expansion@npm:5.0.1" dependencies: "@isaacs/balanced-match": "npm:^4.0.1" - checksum: 10c0/b4d4812f4be53afc2c5b6c545001ff7a4659af68d4484804e9d514e183d20269bb81def8682c01a22b17c4d6aed14292c8494f7d2ac664e547101c1a905aa977 + checksum: 10c0/e5d67c7bbf1f17b88132a35bc638af306d48acbb72810d48fa6e6edd8ab375854773108e8bf70f021f7ef6a8273455a6d1f0c3b5aa2aff06ce7894049ab77fb8 languageName: node linkType: hard @@ -3395,11 +3395,11 @@ __metadata: languageName: node linkType: hard -"@joshwooding/vite-plugin-react-docgen-typescript@npm:^0.6.3": - version: 0.6.3 - resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.3" +"@joshwooding/vite-plugin-react-docgen-typescript@npm:^0.6.4": + version: 0.6.4 + resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.4" dependencies: - glob: "npm:^11.1.0" + glob: "npm:^13.0.1" react-docgen-typescript: "npm:^2.2.2" peerDependencies: typescript: ">= 4.3.x" @@ -3407,7 +3407,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/e68d2884235b8290673c17a13bc303a088feba6ce0a275ab0778b50e90b967f5dffdcf71ed3197e9cdf07607594a9cb2a86e3ea6e4eb8962b50d61078107bac3 + checksum: 10c0/73149b2d41d5b8eff7dfe4d037a6903fe4123ae46f3928d88535020539f44159c4ea1b342e6a77d4c14219f2f743fea0ef96e81279cce8b6d247dc4d582e27ed languageName: node linkType: hard @@ -8371,7 +8371,7 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/react-vite@workspace:code/frameworks/react-vite" dependencies: - "@joshwooding/vite-plugin-react-docgen-typescript": "npm:^0.6.3" + "@joshwooding/vite-plugin-react-docgen-typescript": "npm:^0.6.4" "@rollup/pluginutils": "npm:^5.0.2" "@storybook/builder-vite": "workspace:*" "@storybook/react": "workspace:*" @@ -17605,7 +17605,7 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.1": +"foreground-child@npm:^3.1.0": version: 3.3.1 resolution: "foreground-child@npm:3.3.1" dependencies: @@ -18215,30 +18215,14 @@ __metadata: languageName: node linkType: hard -"glob@npm:^11.1.0": - version: 11.1.0 - resolution: "glob@npm:11.1.0" +"glob@npm:^13.0.0, glob@npm:^13.0.1": + version: 13.0.1 + resolution: "glob@npm:13.0.1" dependencies: - foreground-child: "npm:^3.3.1" - jackspeak: "npm:^4.1.1" - minimatch: "npm:^10.1.1" + minimatch: "npm:^10.1.2" minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" path-scurry: "npm:^2.0.0" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/1ceae07f23e316a6fa74581d9a74be6e8c2e590d2f7205034dd5c0435c53f5f7b712c2be00c3b65bf0a49294a1c6f4b98cd84c7637e29453b5aa13b79f1763a2 - languageName: node - linkType: hard - -"glob@npm:^13.0.0": - version: 13.0.0 - resolution: "glob@npm:13.0.0" - dependencies: - minimatch: "npm:^10.1.1" - minipass: "npm:^7.1.2" - path-scurry: "npm:^2.0.0" - checksum: 10c0/8e2f5821f3f7c312dd102e23a15b80c79e0837a9872784293ba2e15ec73b3f3749a49a42a31bfcb4e52c84820a474e92331c2eebf18819d20308f5c33876630a + checksum: 10c0/af7b863dec8dff74f61d7d6e53104e1f6bbdd482157a196cade8ed857481e876ec35181b38a059b2a7b93ea3b08248f4ff0792fef6dc91814fd5097a716f48e4 languageName: node linkType: hard @@ -20249,15 +20233,6 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^4.1.1": - version: 4.1.1 - resolution: "jackspeak@npm:4.1.1" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - checksum: 10c0/84ec4f8e21d6514db24737d9caf65361511f75e5e424980eebca4199f400874f45e562ac20fa8aeb1dd20ca2f3f81f0788b6e9c3e64d216a5794fd6f30e0e042 - languageName: node - linkType: hard - "jake@npm:^10.8.5": version: 10.8.7 resolution: "jake@npm:10.8.7" @@ -22457,12 +22432,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.0.1, minimatch@npm:^10.1.1, minimatch@npm:^9.0.3 || ^10.0.1": - version: 10.1.1 - resolution: "minimatch@npm:10.1.1" +"minimatch@npm:^10.0.1, minimatch@npm:^10.1.2, minimatch@npm:^9.0.3 || ^10.0.1": + version: 10.1.2 + resolution: "minimatch@npm:10.1.2" dependencies: - "@isaacs/brace-expansion": "npm:^5.0.0" - checksum: 10c0/c85d44821c71973d636091fddbfbffe62370f5ee3caf0241c5b60c18cd289e916200acb2361b7e987558cd06896d153e25d505db9fc1e43e6b4b6752e2702902 + "@isaacs/brace-expansion": "npm:^5.0.1" + checksum: 10c0/0cccef3622201703de6ecf9d772c0be1d5513dcc038ed9feb866c20cf798243e678ac35605dac3f1a054650c28037486713fe9e9a34b184b9097959114daf086 languageName: node linkType: hard From ca176a0913413697f24c8c5dd28bfd2c5d2d19ec Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 11 Feb 2026 15:23:25 +0100 Subject: [PATCH 66/71] Merge pull request #31251 from yatishgoel/fix/nextjs15-link-component-override Next.js: Fix Link component override in appDirectory configuration (cherry picked from commit 40e556abc3292427209418929d8b0f334e69139f) --- code/frameworks/nextjs/build-config.ts | 4 ++ code/frameworks/nextjs/package.json | 5 +++ .../nextjs/src/export-mocks/link/index.tsx | 45 +++++++++++++++++++ .../nextjs/src/export-mocks/webpack.ts | 1 + 4 files changed, 55 insertions(+) create mode 100644 code/frameworks/nextjs/src/export-mocks/link/index.tsx diff --git a/code/frameworks/nextjs/build-config.ts b/code/frameworks/nextjs/build-config.ts index e7c8f55e43c4..bcc08973d6d9 100644 --- a/code/frameworks/nextjs/build-config.ts +++ b/code/frameworks/nextjs/build-config.ts @@ -28,6 +28,10 @@ const config: BuildEntries = { exportEntries: ['./navigation.mock'], entryPoint: './src/export-mocks/navigation/index.ts', }, + { + exportEntries: ['./link.mock'], + entryPoint: './src/export-mocks/link/index.tsx', + }, { exportEntries: ['./router.mock'], entryPoint: './src/export-mocks/router/index.ts', diff --git a/code/frameworks/nextjs/package.json b/code/frameworks/nextjs/package.json index b82cbdd9643f..097ca497c51a 100644 --- a/code/frameworks/nextjs/package.json +++ b/code/frameworks/nextjs/package.json @@ -44,6 +44,11 @@ "./image-context": "./dist/image-context.js", "./images/next-image": "./dist/images/next-image.js", "./images/next-legacy-image": "./dist/images/next-legacy-image.js", + "./link.mock": { + "types": "./dist/export-mocks/link/index.d.ts", + "code": "./src/export-mocks/link/index.tsx", + "default": "./dist/export-mocks/link/index.js" + }, "./navigation.mock": { "types": "./dist/export-mocks/navigation/index.d.ts", "default": "./dist/export-mocks/navigation/index.js" diff --git a/code/frameworks/nextjs/src/export-mocks/link/index.tsx b/code/frameworks/nextjs/src/export-mocks/link/index.tsx new file mode 100644 index 000000000000..2237a67f7cc6 --- /dev/null +++ b/code/frameworks/nextjs/src/export-mocks/link/index.tsx @@ -0,0 +1,45 @@ +import React from 'react'; + +import { fn } from 'storybook/test'; + +const linkAction = fn().mockName('next/link::Link'); + +const MockLink = React.forwardRef(function MockLink( + { + href, + as: _as, + replace, + scroll, + shallow, + prefetch, + passHref, + legacyBehavior, + locale, + onClick, + children, + ...rest + }, + ref +) { + const hrefString = + typeof href === 'object' + ? `${href.pathname || ''}${href.query ? '?' + new URLSearchParams(href.query).toString() : ''}${href.hash || ''}` + : href; + + const handleClick = (e: React.MouseEvent) => { + e.preventDefault(); + onClick?.(e); + linkAction(hrefString, { replace, scroll, shallow, prefetch, locale }); + }; + + return ( + + {children} + + ); +}); + +MockLink.displayName = 'NextLink'; + +export default MockLink; +export { MockLink as Link }; diff --git a/code/frameworks/nextjs/src/export-mocks/webpack.ts b/code/frameworks/nextjs/src/export-mocks/webpack.ts index b5a813535737..9daaecee3a76 100644 --- a/code/frameworks/nextjs/src/export-mocks/webpack.ts +++ b/code/frameworks/nextjs/src/export-mocks/webpack.ts @@ -7,6 +7,7 @@ const mapping = { 'next/navigation': '@storybook/nextjs/navigation.mock', 'next/router': '@storybook/nextjs/router.mock', 'next/cache': '@storybook/nextjs/cache.mock', + 'next/link': '@storybook/nextjs/link.mock', ...getCompatibilityAliases(), }; From b119439439522e399c2c9aaaeaa4254c877e6ee6 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Thu, 12 Feb 2026 11:51:08 +0100 Subject: [PATCH 67/71] Merge pull request #33814 from storybookjs/valentin/improve-config-file-detection Addon-Vitest: Improve config file detection in monorepos (cherry picked from commit d7c87fa8550c834e530e8683883ac6581e7a4afc) --- code/addons/vitest/src/node/vitest-manager.ts | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/code/addons/vitest/src/node/vitest-manager.ts b/code/addons/vitest/src/node/vitest-manager.ts index 8cf3e0f15e7e..f787556ed4b4 100644 --- a/code/addons/vitest/src/node/vitest-manager.ts +++ b/code/addons/vitest/src/node/vitest-manager.ts @@ -1,4 +1,4 @@ -import { existsSync } from 'node:fs'; +import { existsSync, readFileSync } from 'node:fs'; import type { CoverageOptions, @@ -13,7 +13,8 @@ import { Tag } from 'storybook/internal/core-server'; import type { StoryId, StoryIndex, StoryIndexEntry } from 'storybook/internal/types'; import * as find from 'empathic/find'; -import path, { dirname, join, normalize } from 'pathe'; +import * as walk from 'empathic/walk'; +import path, { dirname, join, normalize, resolve } from 'pathe'; // eslint-disable-next-line depend/ban-dependencies import slash from 'slash'; @@ -75,19 +76,53 @@ export class VitestManager { : { enabled: false } ) as CoverageOptions; - const vitestWorkspaceConfig = find.any( - [ - ...VITEST_WORKSPACE_FILE_EXTENSION.map((ext) => `vitest.workspace.${ext}`), - ...VITEST_CONFIG_FILE_EXTENSIONS.map((ext) => `vitest.config.${ext}`), - ], - { last: getProjectRoot() } - ); + // In monorepos, the Storybook configDir (e.g. packages/web-app/.storybook) identifies + // the sub-package. We start the Vitest config search from its parent (the package root) + // and traverse upward to the project root, so configs in both sub-packages and the + // monorepo root are found. Without this, find.any defaults to process.cwd() which may + // be the monorepo root and would miss sub-package configs entirely. + const configDir = this.testManager.storybookOptions.configDir; + const packageRoot = configDir ? dirname(resolve(configDir)) : undefined; + + const configFiles = [ + ...VITEST_WORKSPACE_FILE_EXTENSION.map((ext) => `vitest.workspace.${ext}`), + ...VITEST_CONFIG_FILE_EXTENSIONS.flatMap((ext) => [ + `vitest.config.${ext}`, + `vite.config.${ext}`, + ]), + ]; + + const potentialConfigFileLocations = walk.up(packageRoot || process.cwd(), { + last: getProjectRoot(), + }); + + let vitestWorkspaceConfig: string | undefined; + let firstVitestConfig: string | undefined; + + for (const location of potentialConfigFileLocations) { + for (const file of configFiles) { + const maybe = find.any([file], { cwd: location, last: getProjectRoot() }); + if (maybe && existsSync(maybe)) { + firstVitestConfig ??= maybe; + const content = readFileSync(maybe, 'utf8'); + if (content.includes('storybookTest') || content.includes('@storybook/addon-vitest')) { + vitestWorkspaceConfig = dirname(maybe); + break; + } + } + } + if (vitestWorkspaceConfig) { + break; + } + } const projectName = 'storybook:' + process.env.STORYBOOK_CONFIG_DIR; + const vitestConfigFallbackLocation = firstVitestConfig || packageRoot || process.cwd(); + try { this.vitest = await createVitest('test', { - root: vitestWorkspaceConfig ? dirname(vitestWorkspaceConfig) : process.cwd(), + root: vitestWorkspaceConfig ?? vitestConfigFallbackLocation, watch: true, passWithNoTests: false, project: [projectName], From f3ccdd9839bb454dd267a375462331bc6318fc1b Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Thu, 12 Feb 2026 13:49:36 +0000 Subject: [PATCH 68/71] Write changelog for 10.2.9 [skip ci] --- CHANGELOG.md | 7 +++++++ code/package.json | 3 ++- docs/versions/latest.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b67cbecc489b..e70321271c32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 10.2.9 + +- Addon-Vitest: Improve config file detection in monorepos - [#33814](https://github.com/storybookjs/storybook/pull/33814), thanks @valentinpalkovic! +- Builder-Vite: Update dependencies react-vite framework - [#33810](https://github.com/storybookjs/storybook/pull/33810), thanks @valentinpalkovic! +- Builder-Vite: Use relative path for mocker entry in production builds - [#33792](https://github.com/storybookjs/storybook/pull/33792), thanks @DukeDeSouth! +- Next.js: Fix Link component override in appDirectory configuration - [#31251](https://github.com/storybookjs/storybook/pull/31251), thanks @yatishgoel! + ## 10.2.8 - Telemetry: Add Expo metaframework - [#33783](https://github.com/storybookjs/storybook/pull/33783), thanks @copilot-swe-agent! diff --git a/code/package.json b/code/package.json index fdd17d8f1533..b6c86fa8fca7 100644 --- a/code/package.json +++ b/code/package.json @@ -220,5 +220,6 @@ "Dependency Upgrades" ] ] - } + }, + "deferredNextVersion": "10.2.9" } diff --git a/docs/versions/latest.json b/docs/versions/latest.json index 0d89c0607c81..8492f9efa12c 100644 --- a/docs/versions/latest.json +++ b/docs/versions/latest.json @@ -1 +1 @@ -{"version":"10.2.8","info":{"plain":"- Telemetry: Add Expo metaframework - [#33783](https://github.com/storybookjs/storybook/pull/33783), thanks @copilot-swe-agent!\n- Telemetry: Add init exit event - [#33773](https://github.com/storybookjs/storybook/pull/33773), thanks @valentinpalkovic!\n- Telemetry: Add share events - [#33766](https://github.com/storybookjs/storybook/pull/33766), thanks @ndelangen!\n- Test: Update event creation logic in user-event package - [#33787](https://github.com/storybookjs/storybook/pull/33787), thanks @valentinpalkovic!"}} \ No newline at end of file +{"version":"10.2.9","info":{"plain":"- Addon-Vitest: Improve config file detection in monorepos - [#33814](https://github.com/storybookjs/storybook/pull/33814), thanks @valentinpalkovic!\n- Builder-Vite: Update dependencies react-vite framework - [#33810](https://github.com/storybookjs/storybook/pull/33810), thanks @valentinpalkovic!\n- Builder-Vite: Use relative path for mocker entry in production builds - [#33792](https://github.com/storybookjs/storybook/pull/33792), thanks @DukeDeSouth!\n- Next.js: Fix Link component override in appDirectory configuration - [#31251](https://github.com/storybookjs/storybook/pull/31251), thanks @yatishgoel!"}} \ No newline at end of file From ec2587d1a3f249717bf48b3139fdeb33d80cd3b3 Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Mon, 16 Feb 2026 13:27:35 +0000 Subject: [PATCH 69/71] Update ./docs/versions/next.json for v10.3.0-alpha.6 --- docs/versions/next.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/versions/next.json b/docs/versions/next.json index 5e3e56283303..ab12a3d18ed7 100644 --- a/docs/versions/next.json +++ b/docs/versions/next.json @@ -1 +1 @@ -{"version":"10.3.0-alpha.5","info":{"plain":"- Builder-Vite: Use relative path for mocker entry in production builds - [#33792](https://github.com/storybookjs/storybook/pull/33792), thanks @DukeDeSouth!\n- CLI: Support addon-vitest setup when --skip-install is passed - [#33718](https://github.com/storybookjs/storybook/pull/33718), thanks @valentinpalkovic!\n- CSF: Fix cross-file story imports in csf-factories codemod - [#33723](https://github.com/storybookjs/storybook/pull/33723), thanks @yatishgoel!\n- Compile: reduce VCPUs for CI check task from 4 to 3 - [#33822](https://github.com/storybookjs/storybook/pull/33822), thanks @valentinpalkovic!\n- Core: Ignore empty files when indexing - [#33782](https://github.com/storybookjs/storybook/pull/33782), thanks @JReinhold!\n- Globals: Repair dynamicTitle: false for user-defined tools - [#33284](https://github.com/storybookjs/storybook/pull/33284), thanks @ia319!\n- Logger: Honor --loglevel for npmlog output - [#33776](https://github.com/storybookjs/storybook/pull/33776), thanks @LouisLau-art!\n- Telemetry: Add Expo metaframework - [#33783](https://github.com/storybookjs/storybook/pull/33783), thanks @copilot-swe-agent!\n- Telemetry: Add init exit event - [#33773](https://github.com/storybookjs/storybook/pull/33773), thanks @valentinpalkovic!\n- Telemetry: Add share events - [#33766](https://github.com/storybookjs/storybook/pull/33766), thanks @ndelangen!\n- Test: Update event creation logic in user-event package - [#33787](https://github.com/storybookjs/storybook/pull/33787), thanks @valentinpalkovic!\n- Viewport: Skip viewport validation before parameters load - [#33794](https://github.com/storybookjs/storybook/pull/33794), thanks @ia319!"}} +{"version":"10.3.0-alpha.6","info":{"plain":"- Addon-Vitest: Improve config file detection in monorepos - [#33814](https://github.com/storybookjs/storybook/pull/33814), thanks @valentinpalkovic!\n- Addon-Vitest: Support Vitest canaries - [#33833](https://github.com/storybookjs/storybook/pull/33833), thanks @valentinpalkovic!\n- Builder-Vite: Update dependencies react-vite framework - [#33810](https://github.com/storybookjs/storybook/pull/33810), thanks @valentinpalkovic!\n- Next.js: Fix Link component override in appDirectory configuration - [#31251](https://github.com/storybookjs/storybook/pull/31251), thanks @yatishgoel!"}} \ No newline at end of file From 4cdde82a0756e5b63da5b0672bcdfd926049e25c Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Tue, 17 Feb 2026 08:05:21 +0000 Subject: [PATCH 70/71] Bump version from "10.2.8" to "10.2.9" [skip ci] --- code/addons/a11y/package.json | 2 +- code/addons/docs/package.json | 2 +- code/addons/links/package.json | 2 +- code/addons/onboarding/package.json | 2 +- code/addons/pseudo-states/package.json | 2 +- code/addons/themes/package.json | 2 +- code/addons/vitest/package.json | 2 +- code/builders/builder-vite/package.json | 2 +- code/builders/builder-webpack5/package.json | 2 +- code/core/package.json | 2 +- code/core/src/common/versions.ts | 84 +++++++++---------- code/core/src/manager-api/version.ts | 2 +- code/frameworks/angular/package.json | 2 +- code/frameworks/ember/package.json | 2 +- code/frameworks/html-vite/package.json | 2 +- code/frameworks/nextjs-vite/package.json | 2 +- code/frameworks/nextjs/package.json | 2 +- code/frameworks/preact-vite/package.json | 2 +- .../react-native-web-vite/package.json | 2 +- code/frameworks/react-vite/package.json | 2 +- code/frameworks/react-webpack5/package.json | 2 +- code/frameworks/server-webpack5/package.json | 2 +- code/frameworks/svelte-vite/package.json | 2 +- code/frameworks/sveltekit/package.json | 2 +- code/frameworks/vue3-vite/package.json | 2 +- .../web-components-vite/package.json | 2 +- code/lib/cli-sb/package.json | 2 +- code/lib/cli-storybook/package.json | 2 +- code/lib/codemod/package.json | 2 +- code/lib/core-webpack/package.json | 2 +- code/lib/create-storybook/package.json | 2 +- code/lib/csf-plugin/package.json | 2 +- code/lib/eslint-plugin/package.json | 2 +- code/lib/react-dom-shim/package.json | 2 +- code/package.json | 5 +- code/presets/create-react-app/package.json | 2 +- code/presets/react-webpack/package.json | 2 +- code/presets/server-webpack/package.json | 2 +- code/renderers/html/package.json | 2 +- code/renderers/preact/package.json | 2 +- code/renderers/react/package.json | 2 +- code/renderers/server/package.json | 2 +- code/renderers/svelte/package.json | 2 +- code/renderers/vue3/package.json | 2 +- code/renderers/web-components/package.json | 2 +- 45 files changed, 87 insertions(+), 88 deletions(-) diff --git a/code/addons/a11y/package.json b/code/addons/a11y/package.json index 71b3bf8c7a22..65e1133fc4d1 100644 --- a/code/addons/a11y/package.json +++ b/code/addons/a11y/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-a11y", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Addon A11y: Test UI component compliance with WCAG web accessibility standards", "keywords": [ "a11y", diff --git a/code/addons/docs/package.json b/code/addons/docs/package.json index 2ef5abc274e0..48236adef6bb 100644 --- a/code/addons/docs/package.json +++ b/code/addons/docs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-docs", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Docs: Document UI components automatically with stories and MDX", "keywords": [ "docs", diff --git a/code/addons/links/package.json b/code/addons/links/package.json index 6d88895a5beb..f394a3b20a86 100644 --- a/code/addons/links/package.json +++ b/code/addons/links/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-links", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Links: Link stories together to build demos and prototypes with your UI components", "keywords": [ "storybook", diff --git a/code/addons/onboarding/package.json b/code/addons/onboarding/package.json index d1eaff631009..4d95466f1d16 100644 --- a/code/addons/onboarding/package.json +++ b/code/addons/onboarding/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-onboarding", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Onboarding: Help new users learn how to write stories", "keywords": [ "storybook", diff --git a/code/addons/pseudo-states/package.json b/code/addons/pseudo-states/package.json index 87a4ecddf752..ff8f9fbbea96 100644 --- a/code/addons/pseudo-states/package.json +++ b/code/addons/pseudo-states/package.json @@ -1,6 +1,6 @@ { "name": "storybook-addon-pseudo-states", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Pseudo-states addon: Manipulate CSS pseudo states", "keywords": [ "storybook", diff --git a/code/addons/themes/package.json b/code/addons/themes/package.json index 316b2b698328..ce9509c3aadf 100644 --- a/code/addons/themes/package.json +++ b/code/addons/themes/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-themes", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Themes addon: Switch between themes from the toolbar", "keywords": [ "css", diff --git a/code/addons/vitest/package.json b/code/addons/vitest/package.json index 90c92514e001..2642c0afa288 100644 --- a/code/addons/vitest/package.json +++ b/code/addons/vitest/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-vitest", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Vitest addon: Blazing fast component testing using stories", "keywords": [ "storybook", diff --git a/code/builders/builder-vite/package.json b/code/builders/builder-vite/package.json index e73509982b8f..0ad06232d6a9 100644 --- a/code/builders/builder-vite/package.json +++ b/code/builders/builder-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/builder-vite", - "version": "10.2.8", + "version": "10.2.9", "description": "A Storybook builder to dev and build with Vite", "keywords": [ "storybook", diff --git a/code/builders/builder-webpack5/package.json b/code/builders/builder-webpack5/package.json index 9e3b2aa6a95c..9bebe0f0b4b1 100644 --- a/code/builders/builder-webpack5/package.json +++ b/code/builders/builder-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/builder-webpack5", - "version": "10.2.8", + "version": "10.2.9", "description": "A Storybook builder to dev and build with Webpack", "keywords": [ "storybook", diff --git a/code/core/package.json b/code/core/package.json index 8709261dc2ce..bbfabcd60555 100644 --- a/code/core/package.json +++ b/code/core/package.json @@ -1,6 +1,6 @@ { "name": "storybook", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/core/src/common/versions.ts b/code/core/src/common/versions.ts index 70effd7da638..ff7c2b707d97 100644 --- a/code/core/src/common/versions.ts +++ b/code/core/src/common/versions.ts @@ -1,45 +1,45 @@ // auto generated file, do not edit export default { - '@storybook/addon-a11y': '10.2.8', - '@storybook/addon-docs': '10.2.8', - '@storybook/addon-links': '10.2.8', - '@storybook/addon-onboarding': '10.2.8', - 'storybook-addon-pseudo-states': '10.2.8', - '@storybook/addon-themes': '10.2.8', - '@storybook/addon-vitest': '10.2.8', - '@storybook/builder-vite': '10.2.8', - '@storybook/builder-webpack5': '10.2.8', - storybook: '10.2.8', - '@storybook/angular': '10.2.8', - '@storybook/ember': '10.2.8', - '@storybook/html-vite': '10.2.8', - '@storybook/nextjs': '10.2.8', - '@storybook/nextjs-vite': '10.2.8', - '@storybook/preact-vite': '10.2.8', - '@storybook/react-native-web-vite': '10.2.8', - '@storybook/react-vite': '10.2.8', - '@storybook/react-webpack5': '10.2.8', - '@storybook/server-webpack5': '10.2.8', - '@storybook/svelte-vite': '10.2.8', - '@storybook/sveltekit': '10.2.8', - '@storybook/vue3-vite': '10.2.8', - '@storybook/web-components-vite': '10.2.8', - sb: '10.2.8', - '@storybook/cli': '10.2.8', - '@storybook/codemod': '10.2.8', - '@storybook/core-webpack': '10.2.8', - 'create-storybook': '10.2.8', - '@storybook/csf-plugin': '10.2.8', - 'eslint-plugin-storybook': '10.2.8', - '@storybook/react-dom-shim': '10.2.8', - '@storybook/preset-create-react-app': '10.2.8', - '@storybook/preset-react-webpack': '10.2.8', - '@storybook/preset-server-webpack': '10.2.8', - '@storybook/html': '10.2.8', - '@storybook/preact': '10.2.8', - '@storybook/react': '10.2.8', - '@storybook/server': '10.2.8', - '@storybook/svelte': '10.2.8', - '@storybook/vue3': '10.2.8', - '@storybook/web-components': '10.2.8', + '@storybook/addon-a11y': '10.2.9', + '@storybook/addon-docs': '10.2.9', + '@storybook/addon-links': '10.2.9', + '@storybook/addon-onboarding': '10.2.9', + 'storybook-addon-pseudo-states': '10.2.9', + '@storybook/addon-themes': '10.2.9', + '@storybook/addon-vitest': '10.2.9', + '@storybook/builder-vite': '10.2.9', + '@storybook/builder-webpack5': '10.2.9', + storybook: '10.2.9', + '@storybook/angular': '10.2.9', + '@storybook/ember': '10.2.9', + '@storybook/html-vite': '10.2.9', + '@storybook/nextjs': '10.2.9', + '@storybook/nextjs-vite': '10.2.9', + '@storybook/preact-vite': '10.2.9', + '@storybook/react-native-web-vite': '10.2.9', + '@storybook/react-vite': '10.2.9', + '@storybook/react-webpack5': '10.2.9', + '@storybook/server-webpack5': '10.2.9', + '@storybook/svelte-vite': '10.2.9', + '@storybook/sveltekit': '10.2.9', + '@storybook/vue3-vite': '10.2.9', + '@storybook/web-components-vite': '10.2.9', + sb: '10.2.9', + '@storybook/cli': '10.2.9', + '@storybook/codemod': '10.2.9', + '@storybook/core-webpack': '10.2.9', + 'create-storybook': '10.2.9', + '@storybook/csf-plugin': '10.2.9', + 'eslint-plugin-storybook': '10.2.9', + '@storybook/react-dom-shim': '10.2.9', + '@storybook/preset-create-react-app': '10.2.9', + '@storybook/preset-react-webpack': '10.2.9', + '@storybook/preset-server-webpack': '10.2.9', + '@storybook/html': '10.2.9', + '@storybook/preact': '10.2.9', + '@storybook/react': '10.2.9', + '@storybook/server': '10.2.9', + '@storybook/svelte': '10.2.9', + '@storybook/vue3': '10.2.9', + '@storybook/web-components': '10.2.9', }; diff --git a/code/core/src/manager-api/version.ts b/code/core/src/manager-api/version.ts index 01e97d2e961e..abc11654b05e 100644 --- a/code/core/src/manager-api/version.ts +++ b/code/core/src/manager-api/version.ts @@ -1 +1 @@ -export const version = '10.2.8'; +export const version = '10.2.9'; diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 9aee50e7f23c..553d48330840 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/angular", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Angular: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/ember/package.json b/code/frameworks/ember/package.json index b18c88aef503..cc45300e57aa 100644 --- a/code/frameworks/ember/package.json +++ b/code/frameworks/ember/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/ember", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Ember: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/html-vite/package.json b/code/frameworks/html-vite/package.json index e83a076b06c7..5c63c844874b 100644 --- a/code/frameworks/html-vite/package.json +++ b/code/frameworks/html-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/html-vite", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for HTML and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/nextjs-vite/package.json b/code/frameworks/nextjs-vite/package.json index ccfe9306f96b..95c8668bee72 100644 --- a/code/frameworks/nextjs-vite/package.json +++ b/code/frameworks/nextjs-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/nextjs-vite", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Next.js and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/nextjs/package.json b/code/frameworks/nextjs/package.json index 097ca497c51a..53824380995a 100644 --- a/code/frameworks/nextjs/package.json +++ b/code/frameworks/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/nextjs", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Next.js: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/preact-vite/package.json b/code/frameworks/preact-vite/package.json index 5aaae84ec03f..2a21537dfd56 100644 --- a/code/frameworks/preact-vite/package.json +++ b/code/frameworks/preact-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preact-vite", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Preact and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-native-web-vite/package.json b/code/frameworks/react-native-web-vite/package.json index 2c1e914bab21..d57aa70e1263 100644 --- a/code/frameworks/react-native-web-vite/package.json +++ b/code/frameworks/react-native-web-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-native-web-vite", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for React Native Web and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-vite/package.json b/code/frameworks/react-vite/package.json index 7786208ff1da..6e031cb10076 100644 --- a/code/frameworks/react-vite/package.json +++ b/code/frameworks/react-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-vite", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for React and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/react-webpack5/package.json b/code/frameworks/react-webpack5/package.json index 322e72ac5063..47f2e524e611 100644 --- a/code/frameworks/react-webpack5/package.json +++ b/code/frameworks/react-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-webpack5", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for React and Webpack: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/server-webpack5/package.json b/code/frameworks/server-webpack5/package.json index d0d8182f5dbd..e87b24786131 100644 --- a/code/frameworks/server-webpack5/package.json +++ b/code/frameworks/server-webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/server-webpack5", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.", "keywords": [ "storybook", diff --git a/code/frameworks/svelte-vite/package.json b/code/frameworks/svelte-vite/package.json index af2546cf2c8f..d6aaa6b49d20 100644 --- a/code/frameworks/svelte-vite/package.json +++ b/code/frameworks/svelte-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/svelte-vite", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Svelte and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/sveltekit/package.json b/code/frameworks/sveltekit/package.json index c00efbee3ccc..241ec268c50e 100644 --- a/code/frameworks/sveltekit/package.json +++ b/code/frameworks/sveltekit/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/sveltekit", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for SvelteKit: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/vue3-vite/package.json b/code/frameworks/vue3-vite/package.json index d737296cdef4..17664e1d0116 100644 --- a/code/frameworks/vue3-vite/package.json +++ b/code/frameworks/vue3-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue3-vite", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Vue3 and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/frameworks/web-components-vite/package.json b/code/frameworks/web-components-vite/package.json index 0dd44159d3c0..6d17d653bdc1 100644 --- a/code/frameworks/web-components-vite/package.json +++ b/code/frameworks/web-components-vite/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/web-components-vite", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Web Components and Vite: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/cli-sb/package.json b/code/lib/cli-sb/package.json index b6756bbfeda6..ee7c352d35cf 100644 --- a/code/lib/cli-sb/package.json +++ b/code/lib/cli-sb/package.json @@ -1,6 +1,6 @@ { "name": "sb", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook CLI: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/cli-storybook/package.json b/code/lib/cli-storybook/package.json index 106ad2096ea1..f6b4b175c1df 100644 --- a/code/lib/cli-storybook/package.json +++ b/code/lib/cli-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/cli", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook CLI: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/codemod/package.json b/code/lib/codemod/package.json index 7fc8611cab1f..a6c5fa32931b 100644 --- a/code/lib/codemod/package.json +++ b/code/lib/codemod/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/codemod", - "version": "10.2.8", + "version": "10.2.9", "description": "A collection of codemod scripts written with JSCodeshift", "keywords": [ "storybook" diff --git a/code/lib/core-webpack/package.json b/code/lib/core-webpack/package.json index 89186b743548..2cb1c07bbdb3 100644 --- a/code/lib/core-webpack/package.json +++ b/code/lib/core-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/core-webpack", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook framework-agnostic API", "keywords": [ "storybook" diff --git a/code/lib/create-storybook/package.json b/code/lib/create-storybook/package.json index 54c13b6e7c09..d991c5eb489e 100644 --- a/code/lib/create-storybook/package.json +++ b/code/lib/create-storybook/package.json @@ -1,6 +1,6 @@ { "name": "create-storybook", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook installer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/lib/csf-plugin/package.json b/code/lib/csf-plugin/package.json index a95ba3ccdd55..0d216729c705 100644 --- a/code/lib/csf-plugin/package.json +++ b/code/lib/csf-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/csf-plugin", - "version": "10.2.8", + "version": "10.2.9", "description": "Enrich CSF files via static analysis", "keywords": [ "storybook" diff --git a/code/lib/eslint-plugin/package.json b/code/lib/eslint-plugin/package.json index bb7fe2dbca3b..f07c5e75c946 100644 --- a/code/lib/eslint-plugin/package.json +++ b/code/lib/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-storybook", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook ESLint Plugin: Best practice rules for writing stories", "keywords": [ "eslint", diff --git a/code/lib/react-dom-shim/package.json b/code/lib/react-dom-shim/package.json index 33f6128e27d4..f1b12d2d64d2 100644 --- a/code/lib/react-dom-shim/package.json +++ b/code/lib/react-dom-shim/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-dom-shim", - "version": "10.2.8", + "version": "10.2.9", "description": "", "keywords": [ "storybook" diff --git a/code/package.json b/code/package.json index b6c86fa8fca7..a9f9025ff273 100644 --- a/code/package.json +++ b/code/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/code", - "version": "10.2.8", + "version": "10.2.9", "private": true, "description": "Storybook root", "homepage": "https://storybook.js.org/", @@ -220,6 +220,5 @@ "Dependency Upgrades" ] ] - }, - "deferredNextVersion": "10.2.9" + } } diff --git a/code/presets/create-react-app/package.json b/code/presets/create-react-app/package.json index 43c4e4f45b4e..539501b66da3 100644 --- a/code/presets/create-react-app/package.json +++ b/code/presets/create-react-app/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-create-react-app", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Create React App preset", "keywords": [ "storybook" diff --git a/code/presets/react-webpack/package.json b/code/presets/react-webpack/package.json index 031bddac4336..a69f977069a6 100644 --- a/code/presets/react-webpack/package.json +++ b/code/presets/react-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-react-webpack", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for React: Develop React Component in isolation with Hot Reloading", "keywords": [ "storybook" diff --git a/code/presets/server-webpack/package.json b/code/presets/server-webpack/package.json index 3887f40b83a4..19ba97c85aee 100644 --- a/code/presets/server-webpack/package.json +++ b/code/presets/server-webpack/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preset-server-webpack", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.", "keywords": [ "storybook" diff --git a/code/renderers/html/package.json b/code/renderers/html/package.json index 401bb308810c..93fc15b56e1a 100644 --- a/code/renderers/html/package.json +++ b/code/renderers/html/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/html", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook HTML renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/preact/package.json b/code/renderers/preact/package.json index b70cc687e134..b0c929fa1cef 100644 --- a/code/renderers/preact/package.json +++ b/code/renderers/preact/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preact", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Preact renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/react/package.json b/code/renderers/react/package.json index cec25cc080cf..88fe2633fd18 100644 --- a/code/renderers/react/package.json +++ b/code/renderers/react/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook React renderer", "keywords": [ "storybook" diff --git a/code/renderers/server/package.json b/code/renderers/server/package.json index 6efc0b486bd0..b3109b5f4998 100644 --- a/code/renderers/server/package.json +++ b/code/renderers/server/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/server", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Server renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/svelte/package.json b/code/renderers/svelte/package.json index bd52ce6d2cb1..7e49dd8729db 100644 --- a/code/renderers/svelte/package.json +++ b/code/renderers/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/svelte", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Svelte renderer: Develop, document, and test UI components in isolation.", "keywords": [ "storybook", diff --git a/code/renderers/vue3/package.json b/code/renderers/vue3/package.json index d80366043b69..c60776a7997e 100644 --- a/code/renderers/vue3/package.json +++ b/code/renderers/vue3/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue3", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Vue 3 renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", diff --git a/code/renderers/web-components/package.json b/code/renderers/web-components/package.json index a66ad16890f2..6b804e101889 100644 --- a/code/renderers/web-components/package.json +++ b/code/renderers/web-components/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/web-components", - "version": "10.2.8", + "version": "10.2.9", "description": "Storybook Web Components renderer: Develop, document, and test UI components in isolation", "keywords": [ "storybook", From e22f6a06600cbc0a99768604c2f94f822ffd16d2 Mon Sep 17 00:00:00 2001 From: Maks Pikov Date: Wed, 1 Apr 2026 22:16:00 +0000 Subject: [PATCH 71/71] fix(checklist): respect disableTelemetry config in initializeChecklist --- code/core/src/core-server/presets/common-preset.ts | 2 +- code/core/src/core-server/utils/checklist.ts | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/code/core/src/core-server/presets/common-preset.ts b/code/core/src/core-server/presets/common-preset.ts index 422b45c1e2fa..072266501fc2 100644 --- a/code/core/src/core-server/presets/common-preset.ts +++ b/code/core/src/core-server/presets/common-preset.ts @@ -256,7 +256,7 @@ export const experimental_serverChannel = async ( ) => { const coreOptions = await options.presets.apply('core'); - initializeChecklist(); + initializeChecklist(coreOptions?.disableTelemetry); initializeWhatsNew(channel, options, coreOptions); initializeSaveStory(channel, options, coreOptions); diff --git a/code/core/src/core-server/utils/checklist.ts b/code/core/src/core-server/utils/checklist.ts index 44049e9d6cc2..8463f21e9da6 100644 --- a/code/core/src/core-server/utils/checklist.ts +++ b/code/core/src/core-server/utils/checklist.ts @@ -15,7 +15,7 @@ import { UNIVERSAL_CHECKLIST_STORE_OPTIONS, } from '../../shared/checklist-store'; -export async function initializeChecklist() { +export async function initializeChecklist(disableTelemetry = false) { try { const store = experimental_UniversalStore.create({ ...UNIVERSAL_CHECKLIST_STORE_OPTIONS, @@ -85,6 +85,15 @@ export async function initializeChecklist() { saveProjectState({ items: projectValues as StoreState['items'] }); saveUserState({ items: userValues, widget: state.widget }); + if (disableTelemetry) { + return; + } + + // Skip telemetry when loading from persistence (first transition to loaded: true) + if (!previousState.loaded) { + return; + } + // Gather items that have changed state const { mutedItems, statusItems } = entries.reduce( (acc, [item, { mutedAt, status }]) => {