mirror of
https://github.com/storybookjs/storybook.git
synced 2025-04-09 00:19:13 +08:00
Merge branch 'next' into next
This commit is contained in:
commit
b9e35a1741
@ -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!
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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(
|
||||
{
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/addon-storysource",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "View a story’s source code to see how it works and paste into your app",
|
||||
"keywords": [
|
||||
"addon",
|
||||
|
@ -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",
|
||||
|
@ -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);
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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 Storybook’s viewport size and orientation",
|
||||
"keywords": [
|
||||
"addon",
|
||||
|
@ -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": {
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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',
|
||||
};
|
||||
|
@ -1 +1 @@
|
||||
export const version = '8.3.0-beta.4';
|
||||
export const version = '8.3.0-beta.5';
|
||||
|
@ -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[] = [];
|
||||
|
@ -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',
|
||||
|
@ -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"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/channels",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/client-logger",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/node-logger",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/preview-api",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/preview",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -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": {
|
||||
|
@ -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",
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -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];
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -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"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "sb",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "Storybook CLI",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/cli",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "Storybook CLI",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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",
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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": {
|
||||
|
@ -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"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/instrumenter",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/react-dom-shim",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
@ -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",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@storybook/test",
|
||||
"version": "8.3.0-beta.4",
|
||||
"version": "8.3.0-beta.5",
|
||||
"description": "",
|
||||
"keywords": [
|
||||
"storybook"
|
||||
|
@ -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/",
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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'),
|
||||
|
@ -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 = {};
|
4
code/renderers/react/src/__test__/ComponentWithError.tsx
Normal file
4
code/renderers/react/src/__test__/ComponentWithError.tsx
Normal file
@ -0,0 +1,4 @@
|
||||
export function ComponentWithError() {
|
||||
// eslint-disable-next-line local-rules/no-uncategorized-errors
|
||||
throw new Error('Error in render');
|
||||
}
|
@ -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>
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user