diff --git a/code/addons/vitest/package.json b/code/addons/vitest/package.json index ce6482ce27ab..480654bcdb2f 100644 --- a/code/addons/vitest/package.json +++ b/code/addons/vitest/package.json @@ -107,11 +107,11 @@ "vitest": "^4.1.6" }, "peerDependencies": { - "@vitest/browser": "^3.0.0 || ^4.0.0", - "@vitest/browser-playwright": "^4.0.0", - "@vitest/runner": "^3.0.0 || ^4.0.0", + "@vitest/browser": "^3.0.0 || ^4.0.0 || ^5.0.0", + "@vitest/browser-playwright": "^4.0.0 || ^5.0.0", + "@vitest/runner": "^3.0.0 || ^4.0.0 || ^5.0.0", "storybook": "workspace:^", - "vitest": "^3.0.0 || ^4.0.0" + "vitest": "^3.0.0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { "@vitest/browser": { diff --git a/code/addons/vitest/src/constants.ts b/code/addons/vitest/src/constants.ts index b1fbfdf1ece4..69d510194efb 100644 --- a/code/addons/vitest/src/constants.ts +++ b/code/addons/vitest/src/constants.ts @@ -71,6 +71,7 @@ export const STORYBOOK_TEST_PROVIDE_KEY = 'storybook/test-provided'; export const STORYBOOK_CORE_GHOST_STORIES_PROVIDE_KEY = 'storybook/core-ghost-stories'; export const STORYBOOK_CORE_RENDER_ANALYSIS_PROVIDE_KEY = 'storybook/core-render-analysis'; export const STORYBOOK_TEST_INITIAL_GLOBALS_PROVIDE_KEY = 'storybook/test-initial-globals'; +export const STORYBOOK_TEST_FEATURES_PROVIDE_KEY = 'storybook/test-features'; // Channel event names for programmatic test triggering export const TRIGGER_TEST_RUN_REQUEST = `${ADDON_ID}/trigger-test-run-request`; diff --git a/code/addons/vitest/src/vitest-plugin/index.ts b/code/addons/vitest/src/vitest-plugin/index.ts index 9d11c6cba22f..b61ef4b86ec5 100644 --- a/code/addons/vitest/src/vitest-plugin/index.ts +++ b/code/addons/vitest/src/vitest-plugin/index.ts @@ -44,6 +44,7 @@ import { withoutVitePlugins } from '../../../../builders/builder-vite/src/utils/ import { STORYBOOK_CORE_GHOST_STORIES_PROVIDE_KEY, STORYBOOK_CORE_RENDER_ANALYSIS_PROVIDE_KEY, + STORYBOOK_TEST_FEATURES_PROVIDE_KEY, STORYBOOK_TEST_INITIAL_GLOBALS_PROVIDE_KEY, } from '../constants.ts'; import type { InternalOptions, UserOptions } from './types.ts'; @@ -391,6 +392,7 @@ export const storybookTest = async (options?: UserOptions): Promise => }, provide: { + [STORYBOOK_TEST_FEATURES_PROVIDE_KEY]: features, [STORYBOOK_CORE_GHOST_STORIES_PROVIDE_KEY]: !!process.env.STORYBOOK_COMPONENT_PATHS, [STORYBOOK_CORE_RENDER_ANALYSIS_PROVIDE_KEY]: !!process.env.STORYBOOK_COMPONENT_PATHS || withinAgenticSetupSession, diff --git a/code/addons/vitest/src/vitest-plugin/setup-file.ts b/code/addons/vitest/src/vitest-plugin/setup-file.ts index d8a02e183d4c..466816172a92 100644 --- a/code/addons/vitest/src/vitest-plugin/setup-file.ts +++ b/code/addons/vitest/src/vitest-plugin/setup-file.ts @@ -1,10 +1,17 @@ -import { afterEach, beforeAll, vi } from 'vitest'; +import { afterEach, beforeAll, beforeEach, inject, vi } from 'vitest'; import type { RunnerTask } from 'vitest'; import { Channel } from 'storybook/internal/channels'; import { getChannel, setChannel } from 'storybook/internal/channels'; -import { COMPONENT_TESTING_PANEL_ID } from '../constants.ts'; +import { COMPONENT_TESTING_PANEL_ID, STORYBOOK_TEST_FEATURES_PROVIDE_KEY } from '../constants.ts'; + +// Vitest 5 replaces the Vite define without exposing it on the runtime global. +const features = inject(STORYBOOK_TEST_FEATURES_PROVIDE_KEY); +if (features) { + vi.stubGlobal('FEATURES', features); + beforeEach(() => vi.stubGlobal('FEATURES', features)); +} declare global { // eslint-disable-next-line @typescript-eslint/ban-ts-comment diff --git a/code/addons/vitest/src/vitest-provided-context.d.ts b/code/addons/vitest/src/vitest-provided-context.d.ts index 352ef54d885f..8bd9a640971f 100644 --- a/code/addons/vitest/src/vitest-provided-context.d.ts +++ b/code/addons/vitest/src/vitest-provided-context.d.ts @@ -1,14 +1,18 @@ import 'vitest'; +import type { StorybookConfigRaw } from 'storybook/internal/types'; + import type { STORYBOOK_CORE_GHOST_STORIES_PROVIDE_KEY, STORYBOOK_CORE_RENDER_ANALYSIS_PROVIDE_KEY, + STORYBOOK_TEST_FEATURES_PROVIDE_KEY, STORYBOOK_TEST_INITIAL_GLOBALS_PROVIDE_KEY, STORYBOOK_TEST_PROVIDE_KEY, } from './constants.ts'; declare module 'vitest' { interface ProvidedContext { + [STORYBOOK_TEST_FEATURES_PROVIDE_KEY]: StorybookConfigRaw['features']; [STORYBOOK_TEST_PROVIDE_KEY]: Record; [STORYBOOK_CORE_GHOST_STORIES_PROVIDE_KEY]: boolean; [STORYBOOK_CORE_RENDER_ANALYSIS_PROVIDE_KEY]: boolean; diff --git a/yarn.lock b/yarn.lock index 8d472c9e6f65..10e79bc366b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11168,11 +11168,11 @@ __metadata: typescript: "npm:^6.0.3" vitest: "npm:^4.1.6" peerDependencies: - "@vitest/browser": ^3.0.0 || ^4.0.0 - "@vitest/browser-playwright": ^4.0.0 - "@vitest/runner": ^3.0.0 || ^4.0.0 + "@vitest/browser": ^3.0.0 || ^4.0.0 || ^5.0.0 + "@vitest/browser-playwright": ^4.0.0 || ^5.0.0 + "@vitest/runner": ^3.0.0 || ^4.0.0 || ^5.0.0 storybook: "workspace:^" - vitest: ^3.0.0 || ^4.0.0 + vitest: ^3.0.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: "@vitest/browser": optional: true