Merge branch 'next' into next

This commit is contained in:
Yevhenii 2024-09-11 16:08:10 +03:00 committed by GitHub
commit b9e35a1741
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
113 changed files with 662 additions and 392 deletions

View File

@ -1,3 +1,9 @@
## 8.3.0-beta.5
- Portable Stories: Improve Handling of React Updates and Errors - [#29044](https://github.com/storybookjs/storybook/pull/29044), thanks @valentinpalkovic!
- Vite: Fix missing source map warning - [#28984](https://github.com/storybookjs/storybook/pull/28984), thanks @valentinpalkovic!
- Vue: Add missing prop controls when using `vue-component-meta` docgen plugin - [#28760](https://github.com/storybookjs/storybook/pull/28760), thanks @larsrickert!
## 8.3.0-beta.4
- Test: Rename vitest plugin entrypoint - [#29067](https://github.com/storybookjs/storybook/pull/29067), thanks @yannbf!

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-a11y",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Test component compliance with web accessibility standards",
"keywords": [
"a11y",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-actions",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Get UI feedback when an action is performed on an interactive element",
"keywords": [
"storybook",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-backgrounds",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Switch backgrounds to view components in different settings",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-controls",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Interact with component inputs dynamically in the Storybook UI",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-docs",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Document component usage and properties in Markdown",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-essentials",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Curated addons to bring out the best of Storybook",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-mdx-gfm",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "GitHub Flavored Markdown in Storybook",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-highlight",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Highlight DOM nodes within your stories",
"keywords": [
"storybook-addons",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-interactions",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Automate, test and debug user interactions",
"keywords": [
"storybook-addons",

View File

@ -1,6 +1,9 @@
import type { PlayFunction, StepLabel, StoryContext } from 'storybook/internal/types';
import { instrument } from '@storybook/instrumenter';
// This makes sure that storybook test loaders are always loaded when addon-interactions is used
// For 9.0 we want to merge storybook/test and addon-interactions into one addon.
import '@storybook/test';
export const { step: runStep } = instrument(
{

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-jest",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "React storybook addon that show component jest report",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-links",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Link stories together to build demos and prototypes with your UI components",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-measure",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Inspect layouts by visualizing the box model",
"keywords": [
"storybook-addons",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-onboarding",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook Addon Onboarding - Introduces a new onboarding experience",
"keywords": [
"storybook-addons",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-outline",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Outline all elements with CSS to help with layout placement and alignment",
"keywords": [
"storybook-addons",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-storysource",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "View a storys source code to see how it works and paste into your app",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/experimental-addon-test",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Integrate Vitest with Storybook",
"keywords": [
"storybook-addons",

View File

@ -114,14 +114,14 @@ export default async function postInstall(options: PostinstallOptions) {
reasons.push(
dedent`
Please check the documentation for more information about its requirements and installation:
${c.cyan`https://storybook.js.org/docs/writing-tests/test-runner-with-vitest`}
${c.cyan`https://storybook.js.org/docs/writing-tests/vitest-plugin`}
`
);
} else {
reasons.push(
dedent`
Fear not, however, you can follow the manual installation process instead at:
${c.cyan`https://storybook.js.org/docs/writing-tests/test-runner-with-vitest#manual`}
${c.cyan`https://storybook.js.org/docs/writing-tests/vitest-plugin#manual`}
`
);
}
@ -197,7 +197,7 @@ export default async function postInstall(options: PostinstallOptions) {
${colors.gray(vitestSetupFile)}
Please refer to the documentation to complete the setup manually:
${c.cyan`https://storybook.js.org/docs/writing-tests/test-runner-with-vitest#manual`}
${c.cyan`https://storybook.js.org/docs/writing-tests/vitest-plugin#manual`}
`
);
logger.line(1);
@ -240,7 +240,7 @@ export default async function postInstall(options: PostinstallOptions) {
your existing workspace file automatically, you must do it yourself. This was the last step.
Please refer to the documentation to complete the setup manually:
${c.cyan`https://storybook.js.org/docs/writing-tests/test-runner-with-vitest#manual`}
${c.cyan`https://storybook.js.org/docs/writing-tests/vitest-plugin#manual`}
`
);
logger.line(1);
@ -262,7 +262,7 @@ export default async function postInstall(options: PostinstallOptions) {
your existing workspace file automatically, you must do it yourself. This was the last step.
Please refer to the documentation to complete the setup manually:
${c.cyan`https://storybook.js.org/docs/writing-tests/test-runner-with-vitest#manual`}
${c.cyan`https://storybook.js.org/docs/writing-tests/vitest-plugin#manual`}
`
);
logger.line(1);
@ -288,13 +288,13 @@ export default async function postInstall(options: PostinstallOptions) {
import { defineWorkspace } from 'vitest/config';
import { storybookTest } from '@storybook/experimental-addon-test/vitest-plugin';${vitestInfo.frameworkPluginImport}
// More info at: https://storybook.js.org/docs/writing-tests/test-runner-with-vitest
// More info at: https://storybook.js.org/docs/writing-tests/vitest-plugin
export default defineWorkspace([
'${relative(dirname(browserWorkspaceFile), rootConfig)}',
{
extends: '${viteConfigFile ? relative(dirname(browserWorkspaceFile), viteConfigFile) : ''}',
plugins: [
// See options at: https://storybook.js.org/docs/writing-tests/test-runner-with-vitest#storybooktest
// See options at: https://storybook.js.org/docs/writing-tests/vitest-plugin#storybooktest
storybookTest(),${vitestInfo.frameworkPluginDocs + vitestInfo.frameworkPluginCall}
],
test: {
@ -327,10 +327,10 @@ export default async function postInstall(options: PostinstallOptions) {
import { defineConfig } from 'vitest/config';
import { storybookTest } from '@storybook/experimental-addon-test/vitest-plugin';${vitestInfo.frameworkPluginImport}
// More info at: https://storybook.js.org/docs/writing-tests/test-runner-with-vitest
// More info at: https://storybook.js.org/docs/writing-tests/vitest-plugin
export default defineConfig({
plugins: [
// See options at: https://storybook.js.org/docs/writing-tests/test-runner-with-vitest#storybooktest
// See options at: https://storybook.js.org/docs/writing-tests/vitest-plugin#storybooktest
storybookTest(),${vitestInfo.frameworkPluginDocs + vitestInfo.frameworkPluginCall}
],
test: {
@ -362,7 +362,7 @@ export default async function postInstall(options: PostinstallOptions) {
When using the Vitest extension in your editor, all of your stories will be shown as tests!
Check the documentation for more information about its features and options at:
${c.cyan`https://storybook.js.org/docs/writing-tests/test-runner-with-vitest`}
${c.cyan`https://storybook.js.org/docs/writing-tests/vitest-plugin`}
`
);
logger.line(1);

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-themes",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Switch between multiple themes for you components in Storybook",
"keywords": [
"css",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-toolbars",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Create your own toolbar items that control story rendering",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-viewport",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Build responsive components by adjusting Storybooks viewport size and orientation",
"keywords": [
"addon",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/builder-vite",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "A plugin to run and build Storybooks with Vite",
"homepage": "https://github.com/storybookjs/storybook/tree/next/code/builders/builder-vite/#readme",
"bugs": {

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/builder-webpack5",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook framework-agnostic API",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/core",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook framework-agnostic API",
"keywords": [
"storybook"

View File

@ -1,87 +1,87 @@
// auto generated file, do not edit
export default {
'@storybook/addon-a11y': '8.3.0-beta.4',
'@storybook/addon-actions': '8.3.0-beta.4',
'@storybook/addon-backgrounds': '8.3.0-beta.4',
'@storybook/addon-controls': '8.3.0-beta.4',
'@storybook/addon-docs': '8.3.0-beta.4',
'@storybook/addon-essentials': '8.3.0-beta.4',
'@storybook/addon-mdx-gfm': '8.3.0-beta.4',
'@storybook/addon-highlight': '8.3.0-beta.4',
'@storybook/addon-interactions': '8.3.0-beta.4',
'@storybook/addon-jest': '8.3.0-beta.4',
'@storybook/addon-links': '8.3.0-beta.4',
'@storybook/addon-measure': '8.3.0-beta.4',
'@storybook/addon-onboarding': '8.3.0-beta.4',
'@storybook/addon-outline': '8.3.0-beta.4',
'@storybook/addon-storysource': '8.3.0-beta.4',
'@storybook/experimental-addon-test': '8.3.0-beta.4',
'@storybook/addon-themes': '8.3.0-beta.4',
'@storybook/addon-toolbars': '8.3.0-beta.4',
'@storybook/addon-viewport': '8.3.0-beta.4',
'@storybook/builder-vite': '8.3.0-beta.4',
'@storybook/builder-webpack5': '8.3.0-beta.4',
'@storybook/core': '8.3.0-beta.4',
'@storybook/builder-manager': '8.3.0-beta.4',
'@storybook/channels': '8.3.0-beta.4',
'@storybook/client-logger': '8.3.0-beta.4',
'@storybook/components': '8.3.0-beta.4',
'@storybook/core-common': '8.3.0-beta.4',
'@storybook/core-events': '8.3.0-beta.4',
'@storybook/core-server': '8.3.0-beta.4',
'@storybook/csf-tools': '8.3.0-beta.4',
'@storybook/docs-tools': '8.3.0-beta.4',
'@storybook/manager': '8.3.0-beta.4',
'@storybook/manager-api': '8.3.0-beta.4',
'@storybook/node-logger': '8.3.0-beta.4',
'@storybook/preview': '8.3.0-beta.4',
'@storybook/preview-api': '8.3.0-beta.4',
'@storybook/router': '8.3.0-beta.4',
'@storybook/telemetry': '8.3.0-beta.4',
'@storybook/theming': '8.3.0-beta.4',
'@storybook/types': '8.3.0-beta.4',
'@storybook/angular': '8.3.0-beta.4',
'@storybook/ember': '8.3.0-beta.4',
'@storybook/experimental-nextjs-vite': '8.3.0-beta.4',
'@storybook/html-vite': '8.3.0-beta.4',
'@storybook/html-webpack5': '8.3.0-beta.4',
'@storybook/nextjs': '8.3.0-beta.4',
'@storybook/preact-vite': '8.3.0-beta.4',
'@storybook/preact-webpack5': '8.3.0-beta.4',
'@storybook/react-vite': '8.3.0-beta.4',
'@storybook/react-webpack5': '8.3.0-beta.4',
'@storybook/server-webpack5': '8.3.0-beta.4',
'@storybook/svelte-vite': '8.3.0-beta.4',
'@storybook/svelte-webpack5': '8.3.0-beta.4',
'@storybook/sveltekit': '8.3.0-beta.4',
'@storybook/vue3-vite': '8.3.0-beta.4',
'@storybook/vue3-webpack5': '8.3.0-beta.4',
'@storybook/web-components-vite': '8.3.0-beta.4',
'@storybook/web-components-webpack5': '8.3.0-beta.4',
'@storybook/blocks': '8.3.0-beta.4',
storybook: '8.3.0-beta.4',
sb: '8.3.0-beta.4',
'@storybook/cli': '8.3.0-beta.4',
'@storybook/codemod': '8.3.0-beta.4',
'@storybook/core-webpack': '8.3.0-beta.4',
'create-storybook': '8.3.0-beta.4',
'@storybook/csf-plugin': '8.3.0-beta.4',
'@storybook/instrumenter': '8.3.0-beta.4',
'@storybook/react-dom-shim': '8.3.0-beta.4',
'@storybook/source-loader': '8.3.0-beta.4',
'@storybook/test': '8.3.0-beta.4',
'@storybook/preset-create-react-app': '8.3.0-beta.4',
'@storybook/preset-html-webpack': '8.3.0-beta.4',
'@storybook/preset-preact-webpack': '8.3.0-beta.4',
'@storybook/preset-react-webpack': '8.3.0-beta.4',
'@storybook/preset-server-webpack': '8.3.0-beta.4',
'@storybook/preset-svelte-webpack': '8.3.0-beta.4',
'@storybook/preset-vue3-webpack': '8.3.0-beta.4',
'@storybook/html': '8.3.0-beta.4',
'@storybook/preact': '8.3.0-beta.4',
'@storybook/react': '8.3.0-beta.4',
'@storybook/server': '8.3.0-beta.4',
'@storybook/svelte': '8.3.0-beta.4',
'@storybook/vue3': '8.3.0-beta.4',
'@storybook/web-components': '8.3.0-beta.4',
'@storybook/addon-a11y': '8.3.0-beta.5',
'@storybook/addon-actions': '8.3.0-beta.5',
'@storybook/addon-backgrounds': '8.3.0-beta.5',
'@storybook/addon-controls': '8.3.0-beta.5',
'@storybook/addon-docs': '8.3.0-beta.5',
'@storybook/addon-essentials': '8.3.0-beta.5',
'@storybook/addon-mdx-gfm': '8.3.0-beta.5',
'@storybook/addon-highlight': '8.3.0-beta.5',
'@storybook/addon-interactions': '8.3.0-beta.5',
'@storybook/addon-jest': '8.3.0-beta.5',
'@storybook/addon-links': '8.3.0-beta.5',
'@storybook/addon-measure': '8.3.0-beta.5',
'@storybook/addon-onboarding': '8.3.0-beta.5',
'@storybook/addon-outline': '8.3.0-beta.5',
'@storybook/addon-storysource': '8.3.0-beta.5',
'@storybook/experimental-addon-test': '8.3.0-beta.5',
'@storybook/addon-themes': '8.3.0-beta.5',
'@storybook/addon-toolbars': '8.3.0-beta.5',
'@storybook/addon-viewport': '8.3.0-beta.5',
'@storybook/builder-vite': '8.3.0-beta.5',
'@storybook/builder-webpack5': '8.3.0-beta.5',
'@storybook/core': '8.3.0-beta.5',
'@storybook/builder-manager': '8.3.0-beta.5',
'@storybook/channels': '8.3.0-beta.5',
'@storybook/client-logger': '8.3.0-beta.5',
'@storybook/components': '8.3.0-beta.5',
'@storybook/core-common': '8.3.0-beta.5',
'@storybook/core-events': '8.3.0-beta.5',
'@storybook/core-server': '8.3.0-beta.5',
'@storybook/csf-tools': '8.3.0-beta.5',
'@storybook/docs-tools': '8.3.0-beta.5',
'@storybook/manager': '8.3.0-beta.5',
'@storybook/manager-api': '8.3.0-beta.5',
'@storybook/node-logger': '8.3.0-beta.5',
'@storybook/preview': '8.3.0-beta.5',
'@storybook/preview-api': '8.3.0-beta.5',
'@storybook/router': '8.3.0-beta.5',
'@storybook/telemetry': '8.3.0-beta.5',
'@storybook/theming': '8.3.0-beta.5',
'@storybook/types': '8.3.0-beta.5',
'@storybook/angular': '8.3.0-beta.5',
'@storybook/ember': '8.3.0-beta.5',
'@storybook/experimental-nextjs-vite': '8.3.0-beta.5',
'@storybook/html-vite': '8.3.0-beta.5',
'@storybook/html-webpack5': '8.3.0-beta.5',
'@storybook/nextjs': '8.3.0-beta.5',
'@storybook/preact-vite': '8.3.0-beta.5',
'@storybook/preact-webpack5': '8.3.0-beta.5',
'@storybook/react-vite': '8.3.0-beta.5',
'@storybook/react-webpack5': '8.3.0-beta.5',
'@storybook/server-webpack5': '8.3.0-beta.5',
'@storybook/svelte-vite': '8.3.0-beta.5',
'@storybook/svelte-webpack5': '8.3.0-beta.5',
'@storybook/sveltekit': '8.3.0-beta.5',
'@storybook/vue3-vite': '8.3.0-beta.5',
'@storybook/vue3-webpack5': '8.3.0-beta.5',
'@storybook/web-components-vite': '8.3.0-beta.5',
'@storybook/web-components-webpack5': '8.3.0-beta.5',
'@storybook/blocks': '8.3.0-beta.5',
storybook: '8.3.0-beta.5',
sb: '8.3.0-beta.5',
'@storybook/cli': '8.3.0-beta.5',
'@storybook/codemod': '8.3.0-beta.5',
'@storybook/core-webpack': '8.3.0-beta.5',
'create-storybook': '8.3.0-beta.5',
'@storybook/csf-plugin': '8.3.0-beta.5',
'@storybook/instrumenter': '8.3.0-beta.5',
'@storybook/react-dom-shim': '8.3.0-beta.5',
'@storybook/source-loader': '8.3.0-beta.5',
'@storybook/test': '8.3.0-beta.5',
'@storybook/preset-create-react-app': '8.3.0-beta.5',
'@storybook/preset-html-webpack': '8.3.0-beta.5',
'@storybook/preset-preact-webpack': '8.3.0-beta.5',
'@storybook/preset-react-webpack': '8.3.0-beta.5',
'@storybook/preset-server-webpack': '8.3.0-beta.5',
'@storybook/preset-svelte-webpack': '8.3.0-beta.5',
'@storybook/preset-vue3-webpack': '8.3.0-beta.5',
'@storybook/html': '8.3.0-beta.5',
'@storybook/preact': '8.3.0-beta.5',
'@storybook/react': '8.3.0-beta.5',
'@storybook/server': '8.3.0-beta.5',
'@storybook/svelte': '8.3.0-beta.5',
'@storybook/vue3': '8.3.0-beta.5',
'@storybook/web-components': '8.3.0-beta.5',
};

View File

@ -1 +1 @@
export const version = '8.3.0-beta.4';
export const version = '8.3.0-beta.5';

View File

@ -76,7 +76,17 @@ export function setProjectAnnotations<TRenderer extends Renderer = Renderer>(
const annotations = Array.isArray(projectAnnotations) ? projectAnnotations : [projectAnnotations];
globalThis.globalProjectAnnotations = composeConfigs(annotations.map(extractAnnotation));
return globalThis.globalProjectAnnotations;
/*
We must return the composition of default and global annotations here
To ensure that the user has the full project annotations, eg. when running
const projectAnnotations = setProjectAnnotations(...);
beforeAll(projectAnnotations.beforeAll)
*/
return composeConfigs([
globalThis.defaultProjectAnnotations ?? {},
globalThis.globalProjectAnnotations ?? {},
]);
}
const cleanups: CleanupCallback[] = [];

View File

@ -30,14 +30,14 @@ export const parameters = {
export const loaders = [async () => ({ projectValue: 2 })];
export const decorators = [
(storyFn: PartialStoryFn, context: StoryContext) => {
if (context.parameters.useProjectDecorator) {
return storyFn({ args: { ...context.args, text: `project ${context.args.text}` } });
}
return storyFn();
},
];
const testProjectDecorator = (storyFn: PartialStoryFn, context: StoryContext) => {
if (context.parameters.useProjectDecorator) {
return storyFn({ args: { ...context.args, text: `project ${context.args.text}` } });
}
return storyFn();
};
export const decorators = [testProjectDecorator];
export const initialGlobals = {
foo: 'fooValue',

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/builder-manager",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook manager builder",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/channels",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/client-logger",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/components",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Core Storybook Components",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/core-common",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook framework-agnostic API",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/core-events",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Event names used in storybook core",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/core-server",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook framework-agnostic API",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/csf-tools",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Parse and manipulate CSF and Storybook config files",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/docs-tools",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Shared utility functions for frameworks to implement docs",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/manager-api",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Core Storybook Manager API & Context",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/manager",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Core Storybook UI",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/node-logger",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preview-api",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preview",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/router",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Core Storybook Router",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/telemetry",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Telemetry logging for crash reports and usage statistics",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/theming",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Core Storybook Components",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/types",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Core Storybook TS Types",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/angular",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Angular: Develop Angular components in isolation with hot reloading.",
"keywords": [
"storybook",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/ember",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Ember: Develop Ember Component in isolation with Hot Reloading.",
"homepage": "https://github.com/storybookjs/storybook/tree/next/code/frameworks/ember",
"bugs": {

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/experimental-nextjs-vite",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Next.js and Vite",
"keywords": [
"storybook",
@ -99,7 +99,7 @@
"@storybook/react": "workspace:*",
"@storybook/test": "workspace:*",
"styled-jsx": "5.1.6",
"vite-plugin-storybook-nextjs": "^1.0.10"
"vite-plugin-storybook-nextjs": "^1.0.11"
},
"devDependencies": {
"@types/node": "^18.0.0",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/html-vite",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for HTML and Vite: Develop HTML in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/html-webpack5",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for HTML: View HTML snippets in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/nextjs",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Next.js",
"keywords": [
"storybook",

View File

@ -2,7 +2,7 @@ import type { NextConfig } from 'next';
import type { Configuration as WebpackConfig } from 'webpack';
import { DefinePlugin } from 'webpack';
import { addScopedAlias, resolveNextConfig } from '../utils';
import { addScopedAlias, resolveNextConfig, setAlias } from '../utils';
const tryResolve = (path: string) => {
try {
@ -22,12 +22,32 @@ export const configureConfig = async ({
const nextConfig = await resolveNextConfig({ nextConfigPath });
addScopedAlias(baseConfig, 'next/config');
// @ts-expect-error We know that alias is an object
if (baseConfig.resolve?.alias?.['react-dom']) {
// Removing the alias to react-dom to avoid conflicts with the alias we are setting
// because the react-dom alias is an exact match and we need to alias separate parts of react-dom
// in different places
// @ts-expect-error We know that alias is an object
delete baseConfig.resolve.alias?.['react-dom'];
}
if (tryResolve('next/dist/compiled/react')) {
addScopedAlias(baseConfig, 'react', 'next/dist/compiled/react');
}
if (tryResolve('next/dist/compiled/react-dom')) {
addScopedAlias(baseConfig, 'react-dom', 'next/dist/compiled/react-dom');
if (tryResolve('next/dist/compiled/react-dom/cjs/react-dom-test-utils.production.js')) {
setAlias(
baseConfig,
'react-dom/test-utils',
'next/dist/compiled/react-dom/cjs/react-dom-test-utils.production.js'
);
}
if (tryResolve('next/dist/compiled/react-dom')) {
setAlias(baseConfig, 'react-dom$', 'next/dist/compiled/react-dom');
setAlias(baseConfig, 'react-dom/client', 'next/dist/compiled/react-dom/client');
setAlias(baseConfig, 'react-dom/server', 'next/dist/compiled/react-dom/server');
}
setupRuntimeConfig(baseConfig, nextConfig);
return nextConfig;

View File

@ -27,23 +27,27 @@ export const resolveNextConfig = async ({
return loadConfig(PHASE_DEVELOPMENT_SERVER, dir, undefined);
};
// This is to help the addon in development
// Without it, webpack resolves packages in its node_modules instead of the example's node_modules
export const addScopedAlias = (baseConfig: WebpackConfig, name: string, alias?: string): void => {
export function setAlias(baseConfig: WebpackConfig, name: string, alias: string) {
baseConfig.resolve ??= {};
baseConfig.resolve.alias ??= {};
const aliasConfig = baseConfig.resolve.alias;
const scopedAlias = scopedResolve(`${alias ?? name}`);
if (Array.isArray(aliasConfig)) {
aliasConfig.push({
name,
alias: scopedAlias,
alias,
});
} else {
aliasConfig[name] = scopedAlias;
aliasConfig[name] = alias;
}
}
// This is to help the addon in development
// Without it, webpack resolves packages in its node_modules instead of the example's node_modules
export const addScopedAlias = (baseConfig: WebpackConfig, name: string, alias?: string): void => {
const scopedAlias = scopedResolve(`${alias ?? name}`);
setAlias(baseConfig, name, scopedAlias);
};
/**
@ -64,7 +68,7 @@ export const scopedResolve = (id: string): string => {
let scopedModulePath;
try {
// TODO: Remove in next major release (SB 8.0) and use the statement in the catch block per default instead
// TODO: Remove in next major release (SB 9.0) and use the statement in the catch block per default instead
scopedModulePath = require.resolve(id, { paths: [resolve()] });
} catch (e) {
scopedModulePath = require.resolve(id);

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preact-vite",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Preact and Vite: Develop Preact components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preact-webpack5",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Preact: Develop Preact Component in isolation.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/react-vite",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for React and Vite: Develop React components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/react-webpack5",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for React: Develop React Component in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/server-webpack5",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/svelte-vite",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Svelte and Vite: Develop Svelte components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/svelte-webpack5",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Svelte: Develop Svelte Component in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/sveltekit",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for SvelteKit",
"keywords": [
"storybook",

View File

@ -15,125 +15,125 @@ const normalizeHrefConfig = (hrefConfig: HrefConfig): NormalizedHrefConfig => {
return hrefConfig;
};
export const decorators: Decorator[] = [
(Story, ctx) => {
const svelteKitParameters: SvelteKitParameters = ctx.parameters?.sveltekit_experimental ?? {};
setPage(svelteKitParameters?.stores?.page);
setNavigating(svelteKitParameters?.stores?.navigating);
setUpdated(svelteKitParameters?.stores?.updated);
setAfterNavigateArgument(svelteKitParameters?.navigation?.afterNavigate);
const svelteKitMocksDecorator: Decorator = (Story, ctx) => {
const svelteKitParameters: SvelteKitParameters = ctx.parameters?.sveltekit_experimental ?? {};
setPage(svelteKitParameters?.stores?.page);
setNavigating(svelteKitParameters?.stores?.navigating);
setUpdated(svelteKitParameters?.stores?.updated);
setAfterNavigateArgument(svelteKitParameters?.navigation?.afterNavigate);
onMount(() => {
const globalClickListener = (e: MouseEvent) => {
// we add a global click event listener and we check if there's a link in the composedPath
const path = e.composedPath();
const element = path.findLast((el) => el instanceof HTMLElement && el.tagName === 'A');
if (element && element instanceof HTMLAnchorElement) {
// if the element is an a-tag we get the href of the element
// and compare it to the hrefs-parameter set by the user
const to = element.getAttribute('href');
if (!to) {
return;
}
e.preventDefault();
const defaultActionCallback = () => action('navigate')(to, e);
if (!svelteKitParameters.hrefs) {
defaultActionCallback();
return;
}
let callDefaultCallback = true;
// we loop over every href set by the user and check if the href matches
// if it does we call the callback provided by the user and disable the default callback
Object.entries(svelteKitParameters.hrefs).forEach(([href, hrefConfig]) => {
const { callback, asRegex } = normalizeHrefConfig(hrefConfig);
const isMatch = asRegex ? new RegExp(href).test(to) : to === href;
if (isMatch) {
callDefaultCallback = false;
callback?.(to, e);
}
});
if (callDefaultCallback) {
defaultActionCallback();
}
onMount(() => {
const globalClickListener = (e: MouseEvent) => {
// we add a global click event listener and we check if there's a link in the composedPath
const path = e.composedPath();
const element = path.findLast((el) => el instanceof HTMLElement && el.tagName === 'A');
if (element && element instanceof HTMLAnchorElement) {
// if the element is an a-tag we get the href of the element
// and compare it to the hrefs-parameter set by the user
const to = element.getAttribute('href');
if (!to) {
return;
}
e.preventDefault();
const defaultActionCallback = () => action('navigate')(to, e);
if (!svelteKitParameters.hrefs) {
defaultActionCallback();
return;
}
};
/**
* Function that create and add listeners for the event that are emitted by the mocked
* functions. The event name is based on the function name
*
* Eg. storybook:goto, storybook:invalidateAll
*
* @param baseModule The base module where the function lives (navigation|forms)
* @param functions The list of functions in that module that emit events
* @param {boolean} [defaultToAction] The list of functions in that module that emit events
* @returns A function to remove all the listener added
*/
function createListeners(
baseModule: keyof SvelteKitParameters,
functions: string[],
defaultToAction?: boolean
) {
// the array of every added listener, we can use this in the return function
// to clean them
const toRemove: Array<{
eventType: string;
listener: (event: { detail: any[] }) => void;
}> = [];
functions.forEach((func) => {
// we loop over every function and check if the user actually passed
// a function in sveltekit_experimental[baseModule][func] eg. sveltekit_experimental.navigation.goto
const hasFunction =
(svelteKitParameters as any)[baseModule]?.[func] &&
(svelteKitParameters as any)[baseModule][func] instanceof Function;
// if we default to an action we still add the listener (this will be the case for goto, invalidate, invalidateAll)
if (hasFunction || defaultToAction) {
// we create the listener that will just get the detail array from the custom element
// and call the user provided function spreading this args in...this will basically call
// the function that the user provide with the same arguments the function is invoked to
// eg. if it calls goto("/my-route") inside the component the function sveltekit_experimental.navigation.goto
// it provided to storybook will be called with "/my-route"
const listener = ({ detail = [] as any[] }) => {
const args = Array.isArray(detail) ? detail : [];
// if it has a function in the parameters we call that function
// otherwise we invoke the action
const fnToCall = hasFunction
? (svelteKitParameters as any)[baseModule][func]
: action(func);
fnToCall(...args);
};
const eventType = `storybook:${func}`;
toRemove.push({ eventType, listener });
// add the listener to window
(window.addEventListener as any)(eventType, listener);
let callDefaultCallback = true;
// we loop over every href set by the user and check if the href matches
// if it does we call the callback provided by the user and disable the default callback
Object.entries(svelteKitParameters.hrefs).forEach(([href, hrefConfig]) => {
const { callback, asRegex } = normalizeHrefConfig(hrefConfig);
const isMatch = asRegex ? new RegExp(href).test(to) : to === href;
if (isMatch) {
callDefaultCallback = false;
callback?.(to, e);
}
});
return () => {
// loop over every listener added and remove them
toRemove.forEach(({ eventType, listener }) => {
// @ts-expect-error apparently you can't remove a custom listener to the window with TS
window.removeEventListener(eventType, listener);
});
};
if (callDefaultCallback) {
defaultActionCallback();
}
}
};
const removeNavigationListeners = createListeners(
'navigation',
['goto', 'invalidate', 'invalidateAll', 'pushState', 'replaceState'],
true
);
const removeFormsListeners = createListeners('forms', ['enhance']);
window.addEventListener('click', globalClickListener);
/**
* Function that create and add listeners for the event that are emitted by the mocked
* functions. The event name is based on the function name
*
* Eg. storybook:goto, storybook:invalidateAll
*
* @param baseModule The base module where the function lives (navigation|forms)
* @param functions The list of functions in that module that emit events
* @param {boolean} [defaultToAction] The list of functions in that module that emit events
* @returns A function to remove all the listener added
*/
function createListeners(
baseModule: keyof SvelteKitParameters,
functions: string[],
defaultToAction?: boolean
) {
// the array of every added listener, we can use this in the return function
// to clean them
const toRemove: Array<{
eventType: string;
listener: (event: { detail: any[] }) => void;
}> = [];
functions.forEach((func) => {
// we loop over every function and check if the user actually passed
// a function in sveltekit_experimental[baseModule][func] eg. sveltekit_experimental.navigation.goto
const hasFunction =
(svelteKitParameters as any)[baseModule]?.[func] &&
(svelteKitParameters as any)[baseModule][func] instanceof Function;
// if we default to an action we still add the listener (this will be the case for goto, invalidate, invalidateAll)
if (hasFunction || defaultToAction) {
// we create the listener that will just get the detail array from the custom element
// and call the user provided function spreading this args in...this will basically call
// the function that the user provide with the same arguments the function is invoked to
// eg. if it calls goto("/my-route") inside the component the function sveltekit_experimental.navigation.goto
// it provided to storybook will be called with "/my-route"
const listener = ({ detail = [] as any[] }) => {
const args = Array.isArray(detail) ? detail : [];
// if it has a function in the parameters we call that function
// otherwise we invoke the action
const fnToCall = hasFunction
? (svelteKitParameters as any)[baseModule][func]
: action(func);
fnToCall(...args);
};
const eventType = `storybook:${func}`;
toRemove.push({ eventType, listener });
// add the listener to window
(window.addEventListener as any)(eventType, listener);
}
});
return () => {
window.removeEventListener('click', globalClickListener);
removeNavigationListeners();
removeFormsListeners();
// loop over every listener added and remove them
toRemove.forEach(({ eventType, listener }) => {
// @ts-expect-error apparently you can't remove a custom listener to the window with TS
window.removeEventListener(eventType, listener);
});
};
});
}
return Story();
},
];
const removeNavigationListeners = createListeners(
'navigation',
['goto', 'invalidate', 'invalidateAll', 'pushState', 'replaceState'],
true
);
const removeFormsListeners = createListeners('forms', ['enhance']);
window.addEventListener('click', globalClickListener);
return () => {
window.removeEventListener('click', globalClickListener);
removeNavigationListeners();
removeFormsListeners();
};
});
return Story();
};
export const decorators: Decorator[] = [svelteKitMocksDecorator];

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/vue3-vite",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Vue3 and Vite: Develop Vue3 components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -287,5 +287,11 @@ function removeNestedSchemas(schema: PropertyMetaSchema) {
if (typeof schema !== 'object') {
return;
}
if (schema.kind === 'enum') {
// for enum types, we do not want to remove the schemas because otherwise the controls will be missing
// instead we remove the nested schemas for the enum entries to prevent out of memory errors for types like "HTMLElement | MouseEvent"
schema.schema?.forEach((enumSchema) => removeNestedSchemas(enumSchema));
return;
}
delete schema.schema;
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/vue3-webpack5",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Vue 3: Develop Vue 3 Components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/web-components-vite",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for web-components and Vite: Develop Web Components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/web-components-webpack5",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for web-components: View web components snippets in isolation with Hot Reloading.",
"keywords": [
"lit",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/blocks",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook Doc Blocks",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "sb",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook CLI",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/cli",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook CLI",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "storybook",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook's CLI - install, dev, build, upgrade, and more",
"keywords": [
"cli",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/codemod",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "A collection of codemod scripts written with JSCodeshift",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/core-webpack",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook framework-agnostic API",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "create-storybook",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Initialize Storybook into your project",
"homepage": "https://github.com/storybookjs/storybook/tree/next/code/lib/create-storybook",
"bugs": {

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/csf-plugin",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Enrich CSF files via static analysis",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/instrumenter",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/react-dom-shim",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "",
"keywords": [
"storybook"

View File

@ -1,17 +0,0 @@
export {};
declare const globalThis: {
IS_REACT_ACT_ENVIRONMENT?: boolean;
};
// TODO(9.0): We should actually wrap all those lines in `act`, but that might be a breaking change.
// We should make that breaking change for SB 9.0
export function preventActChecks(callback: () => void): void {
const originalActEnvironment = globalThis.IS_REACT_ACT_ENVIRONMENT;
globalThis.IS_REACT_ACT_ENVIRONMENT = false;
try {
callback();
} finally {
globalThis.IS_REACT_ACT_ENVIRONMENT = originalActEnvironment;
}
}

View File

@ -2,14 +2,12 @@
import type { ReactElement } from 'react';
import * as ReactDOM from 'react-dom';
import { preventActChecks } from './preventActChecks';
export const renderElement = async (node: ReactElement, el: Element) => {
return new Promise<null>((resolve) => {
preventActChecks(() => void ReactDOM.render(node, el, () => resolve(null)));
ReactDOM.render(node, el, () => resolve(null));
});
};
export const unmountElement = (el: Element) => {
preventActChecks(() => void ReactDOM.unmountComponentAtNode(el));
ReactDOM.unmountComponentAtNode(el);
};

View File

@ -1,15 +1,21 @@
/* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */
import type { FC, ReactElement } from 'react';
import type { ReactElement } from 'react';
import * as React from 'react';
import type { Root as ReactRoot, RootOptions } from 'react-dom/client';
import * as ReactDOM from 'react-dom/client';
import { preventActChecks } from './preventActChecks';
// A map of all rendered React 18 nodes
const nodes = new Map<Element, ReactRoot>();
const WithCallback: FC<{ callback: () => void; children: ReactElement }> = ({
declare const globalThis: {
IS_REACT_ACT_ENVIRONMENT: boolean;
};
function getIsReactActEnvironment() {
return globalThis.IS_REACT_ACT_ENVIRONMENT;
}
const WithCallback: React.FC<{ callback: () => void; children: ReactElement }> = ({
callback,
children,
}) => {
@ -43,8 +49,13 @@ export const renderElement = async (node: ReactElement, el: Element, rootOptions
// Create Root Element conditionally for new React 18 Root Api
const root = await getReactRoot(el, rootOptions);
if (getIsReactActEnvironment()) {
root.render(node);
return;
}
const { promise, resolve } = Promise.withResolvers<void>();
preventActChecks(() => root.render(<WithCallback callback={resolve}>{node}</WithCallback>));
root.render(<WithCallback callback={resolve}>{node}</WithCallback>);
return promise;
};
@ -52,7 +63,7 @@ export const unmountElement = (el: Element, shouldUseNewRootApi?: boolean) => {
const root = nodes.get(el);
if (root) {
preventActChecks(() => root.unmount());
root.unmount();
nodes.delete(el);
}
};

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/source-loader",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Source loader",
"keywords": [
"lib",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/test",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/root",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"private": true,
"description": "Storybook root",
"homepage": "https://storybook.js.org/",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-create-react-app",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Create React App preset",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-html-webpack",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for HTML: View HTML snippets in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-preact-webpack",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Preact: Develop Preact Component in isolation.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-react-webpack",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for React: Develop React Component in isolation with Hot Reloading",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-server-webpack",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-svelte-webpack",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Svelte: Develop Svelte Component in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preset-vue3-webpack",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook for Vue 3: Develop Vue 3 Components in isolation with Hot Reloading.",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/html",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook HTML renderer",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preact",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook Preact renderer",
"keywords": [
"storybook"

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/react",
"version": "8.3.0-beta.4",
"version": "8.3.0-beta.5",
"description": "Storybook React renderer",
"keywords": [
"storybook"
@ -94,12 +94,16 @@
"require-from-string": "^2.0.2"
},
"peerDependencies": {
"@storybook/test": "workspace:*",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"storybook": "workspace:^",
"typescript": ">= 4.2.x"
},
"peerDependenciesMeta": {
"@storybook/test": {
"optional": true
},
"typescript": {
"optional": true
}

View File

@ -103,7 +103,6 @@ export const HooksStory: CSF3Story = {
);
},
play: async ({ canvasElement, step }) => {
console.log('start of play function');
const canvas = within(canvasElement);
await step('Step label', async () => {
const inputEl = canvas.getByTestId('input');
@ -112,8 +111,8 @@ export const HooksStory: CSF3Story = {
await userEvent.type(inputEl, 'Hello world!');
await expect(inputEl).toHaveValue('Hello world!');
await expect(buttonEl).toHaveTextContent('I am clicked');
});
console.log('end of play function');
},
};
@ -182,6 +181,12 @@ export const MountInPlayFunction: CSF3Story<{ mockFn: (val: string) => string }>
},
};
export const MountInPlayFunctionThrow: CSF3Story<{ mockFn: (val: string) => string }> = {
play: async () => {
throw new Error('Error thrown in play');
},
};
export const WithActionArg: CSF3Story<{ someActionArg: HandlerFunction }> = {
args: {
someActionArg: action('some-action-arg'),

View File

@ -0,0 +1,13 @@
import type { Meta, StoryObj } from '..';
import { ComponentWithError } from './ComponentWithError';
const meta = {
title: 'Example/ComponentWithError',
component: ComponentWithError as any,
} satisfies Meta<typeof ComponentWithError>;
export default meta;
type Story = StoryObj<typeof meta>;
export const ThrowsError: Story = {};

View File

@ -0,0 +1,4 @@
export function ComponentWithError() {
// eslint-disable-next-line local-rules/no-uncategorized-errors
throw new Error('Error in render');
}

View File

@ -147,6 +147,40 @@ exports[`Legacy Portable Stories API > Renders Modal story 1`] = `
</body>
`;
exports[`Legacy Portable Stories API > Renders MountInPlayFunction story 1`] = `
<body>
<div>
<div
data-testid="loaded-data"
>
loaded data
</div>
<div
data-testid="spy-data"
>
mockFn return value
</div>
</div>
</body>
`;
exports[`Legacy Portable Stories API > Renders MountInPlayFunctionThrow story 1`] = `
<body>
<div>
<div
data-testid="loaded-data"
>
loaded data
</div>
<div
data-testid="spy-data"
>
mockFn return value
</div>
</div>
</body>
`;
exports[`Legacy Portable Stories API > Renders WithActionArg story 1`] = `
<body>
<div>

View File

@ -200,7 +200,11 @@ describe('Legacy Portable Stories API', () => {
it.each(testCases)('Renders %s story', async (_storyName, Story) => {
cleanup();
if (_storyName === 'CSF2StoryWithLocale' || _storyName === 'MountInPlayFunction') {
if (
_storyName === 'CSF2StoryWithLocale' ||
_storyName === 'MountInPlayFunction' ||
_storyName === 'MountInPlayFunctionThrow'
) {
return;
}

Some files were not shown because too many files have changed in this diff Show More