From 3ad6be9431ebdfbd3acd73e8f8bdf235cce1df87 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 16 Apr 2022 15:31:35 +0800 Subject: [PATCH 01/24] HTML renderer --- app/html/package.json | 8 +-- app/html/src/client/index.ts | 17 +---- .../src/server/framework-preset-html-docs.ts | 3 +- app/html/src/server/framework-preset-html.ts | 3 +- renderers/html/README.md | 1 + renderers/html/package.json | 70 +++++++++++++++++++ .../html/src}/docs/config.ts | 0 .../html/src}/docs/prepareForInline.tsx | 0 .../html/src}/docs/sourceDecorator.test.ts | 0 .../html/src}/docs/sourceDecorator.ts | 0 renderers/html/src/index.ts | 16 +++++ .../html/src}/preview/config.ts | 0 .../html/src}/preview/globals.ts | 0 .../html/src}/preview/index.ts | 0 .../html/src}/preview/render.ts | 0 .../html/src}/preview/types-6-0.ts | 0 .../html/src}/preview/types-7-0.ts | 0 .../html/src}/preview/types.ts | 0 renderers/html/src/typings.d.ts | 4 ++ renderers/html/tsconfig.json | 9 +++ 20 files changed, 104 insertions(+), 27 deletions(-) create mode 100644 renderers/html/README.md create mode 100644 renderers/html/package.json rename {app/html/src/client => renderers/html/src}/docs/config.ts (100%) rename {app/html/src/client => renderers/html/src}/docs/prepareForInline.tsx (100%) rename {app/html/src/client => renderers/html/src}/docs/sourceDecorator.test.ts (100%) rename {app/html/src/client => renderers/html/src}/docs/sourceDecorator.ts (100%) create mode 100644 renderers/html/src/index.ts rename {app/html/src/client => renderers/html/src}/preview/config.ts (100%) rename {app/html/src/client => renderers/html/src}/preview/globals.ts (100%) rename {app/html/src/client => renderers/html/src}/preview/index.ts (100%) rename {app/html/src/client => renderers/html/src}/preview/render.ts (100%) rename {app/html/src/client => renderers/html/src}/preview/types-6-0.ts (100%) rename {app/html/src/client => renderers/html/src}/preview/types-7-0.ts (100%) rename {app/html/src/client => renderers/html/src}/preview/types.ts (100%) create mode 100644 renderers/html/src/typings.d.ts create mode 100644 renderers/html/tsconfig.json diff --git a/app/html/package.json b/app/html/package.json index 2f561c95b491..51baaf31891a 100644 --- a/app/html/package.json +++ b/app/html/package.json @@ -39,14 +39,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.63", - "@storybook/core-client": "6.5.0-alpha.63", "@storybook/core-common": "6.5.0-alpha.63", "@storybook/core-server": "6.5.0-alpha.63", - "@storybook/csf": "0.0.2--canary.7c6c115.0", "@storybook/docs-tools": "6.5.0-alpha.63", - "@storybook/preview-web": "6.5.0-alpha.63", - "@storybook/store": "6.5.0-alpha.63", + "@storybook/renderer-html": "6.5.0-alpha.63", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -54,9 +50,7 @@ "html-loader": "^1.3.2", "react": "16.14.0", "react-dom": "16.14.0", - "read-pkg-up": "^7.0.1", "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", "webpack": ">=4.0.0 <6.0.0" }, "devDependencies": { diff --git a/app/html/src/client/index.ts b/app/html/src/client/index.ts index 620f2fae5cd0..6eadd1970d34 100644 --- a/app/html/src/client/index.ts +++ b/app/html/src/client/index.ts @@ -1,16 +1 @@ -export { - storiesOf, - setAddon, - addDecorator, - addParameters, - configure, - getStorybook, - forceReRender, - raw, -} from './preview'; - -export * from './preview/types-6-0'; - -if (module && module.hot && module.hot.decline) { - module.hot.decline(); -} +export * from '@storybook/renderer-html'; diff --git a/app/html/src/server/framework-preset-html-docs.ts b/app/html/src/server/framework-preset-html-docs.ts index 2cdcc56e7cb8..082fdf9ebd16 100644 --- a/app/html/src/server/framework-preset-html-docs.ts +++ b/app/html/src/server/framework-preset-html-docs.ts @@ -1,8 +1,7 @@ import type { StorybookConfig } from '@storybook/core-common'; -import { findDistEsm } from '@storybook/core-common'; import { hasDocsOrControls } from '@storybook/docs-tools'; export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { if (!hasDocsOrControls(options)) return entry; - return [...entry, findDistEsm(__dirname, 'client/docs/config')]; + return [...entry, require.resolve('@storybook/renderer-html/dist/esm/docs/config')]; }; diff --git a/app/html/src/server/framework-preset-html.ts b/app/html/src/server/framework-preset-html.ts index 481086898273..6924e4529c30 100644 --- a/app/html/src/server/framework-preset-html.ts +++ b/app/html/src/server/framework-preset-html.ts @@ -1,4 +1,3 @@ -import { findDistEsm } from '@storybook/core-common'; import type { Configuration } from 'webpack'; import type { StorybookConfig } from '@storybook/core-common'; @@ -12,5 +11,5 @@ export function webpack(config: Configuration) { } export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, findDistEsm(__dirname, 'client/preview/config')]; + return [...entry, require.resolve('@storybook/renderer-html/dist/esm/preview/config')]; }; diff --git a/renderers/html/README.md b/renderers/html/README.md new file mode 100644 index 000000000000..9a2be24ddae0 --- /dev/null +++ b/renderers/html/README.md @@ -0,0 +1 @@ +# Storybook HTML Renderer diff --git a/renderers/html/package.json b/renderers/html/package.json new file mode 100644 index 000000000000..30cdd8620ccb --- /dev/null +++ b/renderers/html/package.json @@ -0,0 +1,70 @@ +{ + "name": "@storybook/renderer-html", + "version": "6.5.0-alpha.63", + "description": "Storybook HTML renderer", + "keywords": [ + "storybook" + ], + "homepage": "https://github.com/storybookjs/storybook/tree/main/renderers/html", + "bugs": { + "url": "https://github.com/storybookjs/storybook/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/storybookjs/storybook.git", + "directory": "renderers/html" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "license": "MIT", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/ts3.9/index.d.ts", + "typesVersions": { + "<3.8": { + "dist/ts3.9/*": [ + "dist/ts3.4/*" + ] + } + }, + "files": [ + "dist/**/*", + "README.md", + "*.js", + "*.d.ts" + ], + "scripts": { + "prepare": "node ../../scripts/prepare.js" + }, + "dependencies": { + "@storybook/addons": "6.5.0-alpha.63", + "@storybook/core-client": "6.5.0-alpha.63", + "@storybook/csf": "0.0.2--canary.7c6c115.0", + "@storybook/docs-tools": "6.5.0-alpha.63", + "@storybook/preview-web": "6.5.0-alpha.63", + "@storybook/store": "6.5.0-alpha.63", + "core-js": "^3.8.2", + "global": "^4.4.0", + "react": "16.14.0", + "react-dom": "16.14.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "webpack": ">=4.0.0 <6.0.0" + }, + "devDependencies": { + "webpack": "4" + }, + "peerDependencies": { + "@babel/core": "*" + }, + "engines": { + "node": ">=10.13.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "416f87dc715cae299c7b4f37f1c9db7f686d4d21", + "sbmodern": "dist/modern/index.js" +} diff --git a/app/html/src/client/docs/config.ts b/renderers/html/src/docs/config.ts similarity index 100% rename from app/html/src/client/docs/config.ts rename to renderers/html/src/docs/config.ts diff --git a/app/html/src/client/docs/prepareForInline.tsx b/renderers/html/src/docs/prepareForInline.tsx similarity index 100% rename from app/html/src/client/docs/prepareForInline.tsx rename to renderers/html/src/docs/prepareForInline.tsx diff --git a/app/html/src/client/docs/sourceDecorator.test.ts b/renderers/html/src/docs/sourceDecorator.test.ts similarity index 100% rename from app/html/src/client/docs/sourceDecorator.test.ts rename to renderers/html/src/docs/sourceDecorator.test.ts diff --git a/app/html/src/client/docs/sourceDecorator.ts b/renderers/html/src/docs/sourceDecorator.ts similarity index 100% rename from app/html/src/client/docs/sourceDecorator.ts rename to renderers/html/src/docs/sourceDecorator.ts diff --git a/renderers/html/src/index.ts b/renderers/html/src/index.ts new file mode 100644 index 000000000000..620f2fae5cd0 --- /dev/null +++ b/renderers/html/src/index.ts @@ -0,0 +1,16 @@ +export { + storiesOf, + setAddon, + addDecorator, + addParameters, + configure, + getStorybook, + forceReRender, + raw, +} from './preview'; + +export * from './preview/types-6-0'; + +if (module && module.hot && module.hot.decline) { + module.hot.decline(); +} diff --git a/app/html/src/client/preview/config.ts b/renderers/html/src/preview/config.ts similarity index 100% rename from app/html/src/client/preview/config.ts rename to renderers/html/src/preview/config.ts diff --git a/app/html/src/client/preview/globals.ts b/renderers/html/src/preview/globals.ts similarity index 100% rename from app/html/src/client/preview/globals.ts rename to renderers/html/src/preview/globals.ts diff --git a/app/html/src/client/preview/index.ts b/renderers/html/src/preview/index.ts similarity index 100% rename from app/html/src/client/preview/index.ts rename to renderers/html/src/preview/index.ts diff --git a/app/html/src/client/preview/render.ts b/renderers/html/src/preview/render.ts similarity index 100% rename from app/html/src/client/preview/render.ts rename to renderers/html/src/preview/render.ts diff --git a/app/html/src/client/preview/types-6-0.ts b/renderers/html/src/preview/types-6-0.ts similarity index 100% rename from app/html/src/client/preview/types-6-0.ts rename to renderers/html/src/preview/types-6-0.ts diff --git a/app/html/src/client/preview/types-7-0.ts b/renderers/html/src/preview/types-7-0.ts similarity index 100% rename from app/html/src/client/preview/types-7-0.ts rename to renderers/html/src/preview/types-7-0.ts diff --git a/app/html/src/client/preview/types.ts b/renderers/html/src/preview/types.ts similarity index 100% rename from app/html/src/client/preview/types.ts rename to renderers/html/src/preview/types.ts diff --git a/renderers/html/src/typings.d.ts b/renderers/html/src/typings.d.ts new file mode 100644 index 000000000000..d8f7c6f660ad --- /dev/null +++ b/renderers/html/src/typings.d.ts @@ -0,0 +1,4 @@ +declare module 'global'; + +// will be provided by the webpack define plugin +declare var NODE_ENV: string | undefined; diff --git a/renderers/html/tsconfig.json b/renderers/html/tsconfig.json new file mode 100644 index 000000000000..6f7bff08af6b --- /dev/null +++ b/renderers/html/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "types": [] + }, + "include": ["src/**/*"], + "exclude": ["src/**/*.test.*", "src/__tests__/**/*"] +} From fe8c942f40370a05112780fd3171361604b9d70a Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 16 Apr 2022 15:34:36 +0800 Subject: [PATCH 02/24] Preact renderer --- app/preact/package.json | 6 +- app/preact/src/client/index.ts | 13 +--- .../src/server/framework-preset-preact.ts | 3 +- renderers/preact/README.md | 1 + renderers/preact/package.json | 67 +++++++++++++++++++ renderers/preact/preset.js | 1 + renderers/preact/src/index.ts | 12 ++++ .../preact/src}/preview/config.ts | 0 .../preact/src}/preview/globals.ts | 0 .../preact/src}/preview/index.ts | 0 .../preact/src}/preview/render.tsx | 0 .../preact/src}/preview/types-6-0.ts | 0 .../preact/src}/preview/types-7-0.ts | 0 .../preact/src}/preview/types.ts | 0 renderers/preact/src/typings.d.ts | 1 + renderers/preact/tsconfig.json | 9 +++ 16 files changed, 94 insertions(+), 19 deletions(-) create mode 100644 renderers/preact/README.md create mode 100644 renderers/preact/package.json create mode 100644 renderers/preact/preset.js create mode 100644 renderers/preact/src/index.ts rename {app/preact/src/client => renderers/preact/src}/preview/config.ts (100%) rename {app/preact/src/client => renderers/preact/src}/preview/globals.ts (100%) rename {app/preact/src/client => renderers/preact/src}/preview/index.ts (100%) rename {app/preact/src/client => renderers/preact/src}/preview/render.tsx (100%) rename {app/preact/src/client => renderers/preact/src}/preview/types-6-0.ts (100%) rename {app/preact/src/client => renderers/preact/src}/preview/types-7-0.ts (100%) rename {app/preact/src/client => renderers/preact/src}/preview/types.ts (100%) create mode 100644 renderers/preact/src/typings.d.ts create mode 100644 renderers/preact/tsconfig.json diff --git a/app/preact/package.json b/app/preact/package.json index 37e490e307c4..96bc89d97d72 100644 --- a/app/preact/package.json +++ b/app/preact/package.json @@ -40,19 +40,15 @@ }, "dependencies": { "@babel/plugin-transform-react-jsx": "^7.12.12", - "@storybook/addons": "6.5.0-alpha.63", - "@storybook/core-client": "6.5.0-alpha.63", "@storybook/core-common": "6.5.0-alpha.63", "@storybook/core-server": "6.5.0-alpha.63", - "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/store": "6.5.0-alpha.63", + "@storybook/renderer-preact": "6.5.0-alpha.63", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", "react-dom": "16.14.0", - "read-pkg-up": "^7.0.1", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0", "webpack": ">=4.0.0 <6.0.0" diff --git a/app/preact/src/client/index.ts b/app/preact/src/client/index.ts index c679ef3a5670..b0374cabc336 100644 --- a/app/preact/src/client/index.ts +++ b/app/preact/src/client/index.ts @@ -1,12 +1 @@ -export { - storiesOf, - setAddon, - addDecorator, - addParameters, - configure, - getStorybook, - forceReRender, - raw, -} from './preview'; - -export * from './preview/types-6-0'; +export * from '@storybook/renderer-preact'; diff --git a/app/preact/src/server/framework-preset-preact.ts b/app/preact/src/server/framework-preset-preact.ts index 9a50492d3480..e326f74df28b 100644 --- a/app/preact/src/server/framework-preset-preact.ts +++ b/app/preact/src/server/framework-preset-preact.ts @@ -1,7 +1,6 @@ import path from 'path'; import type { TransformOptions } from '@babel/core'; import type { Configuration } from 'webpack'; -import { findDistEsm } from '@storybook/core-common'; import type { StorybookConfig } from '@storybook/core-common'; export function babelDefault(config: TransformOptions): TransformOptions { @@ -30,5 +29,5 @@ export function webpackFinal(config: Configuration): Configuration { } export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, findDistEsm(__dirname, 'client/preview/config')]; + return [...entry, require.resolve('@storybook/renderer-preact/dist/esm/preview/config')]; }; diff --git a/renderers/preact/README.md b/renderers/preact/README.md new file mode 100644 index 000000000000..406647a6dbb9 --- /dev/null +++ b/renderers/preact/README.md @@ -0,0 +1 @@ +# Storybook Preact renderer diff --git a/renderers/preact/package.json b/renderers/preact/package.json new file mode 100644 index 000000000000..1619f37af38c --- /dev/null +++ b/renderers/preact/package.json @@ -0,0 +1,67 @@ +{ + "name": "@storybook/renderer-preact", + "version": "6.5.0-alpha.63", + "description": "Storybook Preact renderer", + "keywords": [ + "storybook" + ], + "homepage": "https://github.com/storybookjs/storybook/tree/main/renderers/preact", + "bugs": { + "url": "https://github.com/storybookjs/storybook/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/storybookjs/storybook.git", + "directory": "renderers/preact" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "license": "MIT", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/ts3.9/index.d.ts", + "typesVersions": { + "<3.8": { + "dist/ts3.9/*": [ + "dist/ts3.4/*" + ] + } + }, + "files": [ + "dist/**/*", + "README.md", + "*.js", + "*.d.ts" + ], + "scripts": { + "prepare": "node ../../scripts/prepare.js" + }, + "dependencies": { + "@storybook/addons": "6.5.0-alpha.63", + "@storybook/core-client": "6.5.0-alpha.63", + "@storybook/csf": "0.0.2--canary.7c6c115.0", + "@storybook/store": "6.5.0-alpha.63", + "core-js": "^3.8.2", + "global": "^4.4.0", + "react": "16.14.0", + "react-dom": "16.14.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "devDependencies": { + "preact": "^10.5.13" + }, + "peerDependencies": { + "preact": "^8.0.0||^10.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "416f87dc715cae299c7b4f37f1c9db7f686d4d21", + "sbmodern": "dist/modern/index.js" +} diff --git a/renderers/preact/preset.js b/renderers/preact/preset.js new file mode 100644 index 000000000000..324b0db8eda2 --- /dev/null +++ b/renderers/preact/preset.js @@ -0,0 +1 @@ +module.exports = require('./dist/cjs/server/framework-preset-preact'); diff --git a/renderers/preact/src/index.ts b/renderers/preact/src/index.ts new file mode 100644 index 000000000000..c679ef3a5670 --- /dev/null +++ b/renderers/preact/src/index.ts @@ -0,0 +1,12 @@ +export { + storiesOf, + setAddon, + addDecorator, + addParameters, + configure, + getStorybook, + forceReRender, + raw, +} from './preview'; + +export * from './preview/types-6-0'; diff --git a/app/preact/src/client/preview/config.ts b/renderers/preact/src/preview/config.ts similarity index 100% rename from app/preact/src/client/preview/config.ts rename to renderers/preact/src/preview/config.ts diff --git a/app/preact/src/client/preview/globals.ts b/renderers/preact/src/preview/globals.ts similarity index 100% rename from app/preact/src/client/preview/globals.ts rename to renderers/preact/src/preview/globals.ts diff --git a/app/preact/src/client/preview/index.ts b/renderers/preact/src/preview/index.ts similarity index 100% rename from app/preact/src/client/preview/index.ts rename to renderers/preact/src/preview/index.ts diff --git a/app/preact/src/client/preview/render.tsx b/renderers/preact/src/preview/render.tsx similarity index 100% rename from app/preact/src/client/preview/render.tsx rename to renderers/preact/src/preview/render.tsx diff --git a/app/preact/src/client/preview/types-6-0.ts b/renderers/preact/src/preview/types-6-0.ts similarity index 100% rename from app/preact/src/client/preview/types-6-0.ts rename to renderers/preact/src/preview/types-6-0.ts diff --git a/app/preact/src/client/preview/types-7-0.ts b/renderers/preact/src/preview/types-7-0.ts similarity index 100% rename from app/preact/src/client/preview/types-7-0.ts rename to renderers/preact/src/preview/types-7-0.ts diff --git a/app/preact/src/client/preview/types.ts b/renderers/preact/src/preview/types.ts similarity index 100% rename from app/preact/src/client/preview/types.ts rename to renderers/preact/src/preview/types.ts diff --git a/renderers/preact/src/typings.d.ts b/renderers/preact/src/typings.d.ts new file mode 100644 index 000000000000..2f4eb9cf4fd9 --- /dev/null +++ b/renderers/preact/src/typings.d.ts @@ -0,0 +1 @@ +declare module 'global'; diff --git a/renderers/preact/tsconfig.json b/renderers/preact/tsconfig.json new file mode 100644 index 000000000000..b704f2ec95c9 --- /dev/null +++ b/renderers/preact/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "resolveJsonModule": true + }, + "include": ["src/**/*"], + "exclude": ["src/**/*.test.*"] +} From 41ae9635890809879d5daed007218718b05dcbfd Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 16 Apr 2022 15:35:56 +0800 Subject: [PATCH 03/24] React renderer --- app/react/package.json | 16 +--- app/react/src/client/index.ts | 19 +--- .../src/server/framework-preset-react-docs.ts | 3 +- app/react/src/server/preset.ts | 3 +- renderers/react/README.md | 1 + renderers/react/package.json | 88 +++++++++++++++++++ .../10017-ts-union/argTypes.snapshot | 0 .../10017-ts-union/docgen.snapshot | 0 .../__testfixtures__/10017-ts-union/input.tsx | 0 .../10017-ts-union/properties.snapshot | 0 .../argTypes.snapshot | 0 .../docgen.snapshot | 0 .../10278-ts-multiple-components/input.tsx | 0 .../properties.snapshot | 0 .../argTypes.snapshot | 0 .../8140-js-prop-types-oneof/docgen.snapshot | 0 .../8140-js-prop-types-oneof/input.js | 0 .../properties.snapshot | 0 .../8143-ts-imported-types/argTypes.snapshot | 0 .../8143-ts-imported-types/docgen.snapshot | 0 .../8143-ts-imported-types/input.tsx | 0 .../properties.snapshot | 0 .../8143-ts-imported-types/types.ts | 0 .../argTypes.snapshot | 0 .../8143-ts-react-fc-generics/docgen.snapshot | 0 .../8143-ts-react-fc-generics/input.tsx | 0 .../properties.snapshot | 0 .../8279-js-styled-docgen/argTypes.snapshot | 0 .../8279-js-styled-docgen/docgen.snapshot | 0 .../8279-js-styled-docgen/input.js | 0 .../8279-js-styled-docgen/properties.snapshot | 0 .../argTypes.snapshot | 0 .../8428-js-static-prop-types/docgen.snapshot | 0 .../8428-js-static-prop-types/input.js | 0 .../properties.snapshot | 0 .../argTypes.snapshot | 0 .../8663-js-styled-components/docgen.snapshot | 0 .../8663-js-styled-components/input.js | 0 .../properties.snapshot | 0 .../8740-ts-multi-props/argTypes.snapshot | 0 .../8740-ts-multi-props/docgen.snapshot | 0 .../8740-ts-multi-props/input.tsx | 0 .../8740-ts-multi-props/properties.snapshot | 0 .../argTypes.snapshot | 0 .../8894-9511-ts-forward-ref/docgen.snapshot | 0 .../8894-9511-ts-forward-ref/input.tsx | 0 .../properties.snapshot | 0 .../9023-js-hoc/argTypes.snapshot | 0 .../9023-js-hoc/docgen.snapshot | 0 .../__testfixtures__/9023-js-hoc/input.js | 0 .../9023-js-hoc/properties.snapshot | 0 .../9399-js-proptypes-shape/argTypes.snapshot | 0 .../9399-js-proptypes-shape/docgen.snapshot | 0 .../9399-js-proptypes-shape/input.js | 0 .../properties.snapshot | 0 .../9465-ts-type-props/argTypes.snapshot | 0 .../9465-ts-type-props/docgen.snapshot | 0 .../9465-ts-type-props/input.tsx | 0 .../9465-ts-type-props/properties.snapshot | 0 .../9493-ts-display-name/argTypes.snapshot | 0 .../9493-ts-display-name/docgen.snapshot | 0 .../9493-ts-display-name/input.tsx | 0 .../9493-ts-display-name/properties.snapshot | 0 .../argTypes.snapshot | 0 .../docgen.snapshot | 0 .../9556-ts-react-default-exports/input.tsx | 0 .../properties.snapshot | 0 .../9575-ts-camel-case/argTypes.snapshot | 0 .../9575-ts-camel-case/docgen.snapshot | 0 .../9575-ts-camel-case/input.tsx | 0 .../9575-ts-camel-case/properties.snapshot | 0 .../9586-js-react-memo/argTypes.snapshot | 0 .../9586-js-react-memo/docgen.snapshot | 0 .../9586-js-react-memo/input.js | 0 .../9586-js-react-memo/properties.snapshot | 0 .../9591-ts-import-types/Bar.tsx | 0 .../9591-ts-import-types/argTypes.snapshot | 0 .../9591-ts-import-types/docgen.snapshot | 0 .../9591-ts-import-types/input.tsx | 0 .../9591-ts-import-types/properties.snapshot | 0 .../9592-ts-styled-props/argTypes.snapshot | 0 .../9592-ts-styled-props/docgen.snapshot | 0 .../9592-ts-styled-props/input.tsx | 0 .../9592-ts-styled-props/properties.snapshot | 0 .../9626-js-default-values/argTypes.snapshot | 0 .../9626-js-default-values/docgen.snapshot | 0 .../9626-js-default-values/input.js | 0 .../properties.snapshot | 0 .../argTypes.snapshot | 0 .../docgen.snapshot | 0 .../9668-js-proptypes-no-jsdoc/input.js | 0 .../properties.snapshot | 0 .../argTypes.snapshot | 0 .../9721-ts-deprecated-jsdoc/docgen.snapshot | 0 .../9721-ts-deprecated-jsdoc/input.tsx | 0 .../properties.snapshot | 0 .../9764-ts-extend-props/argTypes.snapshot | 0 .../9764-ts-extend-props/docgen.snapshot | 0 .../9764-ts-extend-props/input.tsx | 0 .../9764-ts-extend-props/properties.snapshot | 0 .../9827-ts-default-values/argTypes.snapshot | 0 .../9827-ts-default-values/docgen.snapshot | 0 .../9827-ts-default-values/input.tsx | 0 .../properties.snapshot | 0 .../9832-ts-enum-export/argTypes.snapshot | 0 .../9832-ts-enum-export/docgen.snapshot | 0 .../9832-ts-enum-export/input.tsx | 0 .../9832-ts-enum-export/properties.snapshot | 0 .../9922-ts-component-props/argTypes.snapshot | 0 .../9922-ts-component-props/docgen.snapshot | 0 .../9922-ts-component-props/input.tsx | 0 .../properties.snapshot | 0 .../src}/docs/__testfixtures__/imported.js | 0 .../js-class-component/argTypes.snapshot | 0 .../js-class-component/docgen.snapshot | 0 .../js-class-component/input.js | 0 .../js-class-component/properties.snapshot | 0 .../argTypes.snapshot | 0 .../docgen.snapshot | 0 .../input.js | 0 .../properties.snapshot | 0 .../argTypes.snapshot | 0 .../docgen.snapshot | 0 .../input.js | 0 .../properties.snapshot | 0 .../js-function-component/argTypes.snapshot | 0 .../js-function-component/docgen.snapshot | 0 .../js-function-component/input.js | 0 .../js-function-component/properties.snapshot | 0 .../argTypes.snapshot | 0 .../docgen.snapshot | 0 .../input.tsx | 0 .../properties.snapshot | 0 .../ts-function-component/argTypes.snapshot | 0 .../ts-function-component/docgen.snapshot | 0 .../ts-function-component/input.tsx | 0 .../ts-function-component/properties.snapshot | 0 .../react/src}/docs/config.ts | 0 .../react/src}/docs/extractArgTypes.ts | 0 .../react/src}/docs/extractProps.ts | 0 .../react/src}/docs/jsxDecorator.test.tsx | 0 .../react/src}/docs/jsxDecorator.tsx | 0 .../react/src}/docs/lib/captions.ts | 0 .../react/src}/docs/lib/componentTypes.ts | 0 .../lib/defaultValues/createDefaultValue.ts | 0 .../defaultValues/createFromRawDefaultProp.ts | 0 .../docs/lib/defaultValues/generateArray.ts | 0 .../docs/lib/defaultValues/generateObject.ts | 0 .../src}/docs/lib/defaultValues/index.ts | 0 .../lib/defaultValues/prettyIdentifier.ts | 0 .../react/src}/docs/lib/generateCode.ts | 0 .../react/src}/docs/lib/index.ts | 0 .../docs/lib/inspection/acornParser.test.ts | 0 .../src}/docs/lib/inspection/acornParser.ts | 0 .../react/src}/docs/lib/inspection/index.ts | 0 .../src}/docs/lib/inspection/inspectValue.ts | 0 .../react/src}/docs/lib/inspection/types.ts | 0 .../react/src}/docs/lib/isHtmlTag.ts | 0 .../react/src}/docs/propTypes/createType.ts | 0 .../propTypes/generateFuncSignature.test.ts | 0 .../docs/propTypes/generateFuncSignature.ts | 0 .../src}/docs/propTypes/handleProp.test.tsx | 0 .../react/src}/docs/propTypes/handleProp.ts | 0 .../docs/propTypes/rawDefaultPropResolvers.ts | 0 .../react/src}/docs/propTypes/sortProps.ts | 0 .../src}/docs/react-argtypes.stories.tsx | 0 .../react/src}/docs/react-properties.test.ts | 0 .../src}/docs/typeScript/handleProp.test.tsx | 0 .../react/src}/docs/typeScript/handleProp.ts | 0 renderers/react/src/index.ts | 18 ++++ .../react/src}/preview/config.ts | 0 .../react/src}/preview/globals.ts | 0 .../react/src}/preview/index.test.ts | 0 .../react/src}/preview/index.tsx | 0 .../react/src}/preview/render.tsx | 0 .../react/src}/preview/types-6-0.ts | 0 .../react/src}/preview/types-6-3.ts | 0 .../react/src}/preview/types-7-0.ts | 0 .../react/src}/preview/types.ts | 0 .../react/src}/testing/index.ts | 0 renderers/react/src/typings.d.ts | 44 ++++++++++ renderers/react/tsconfig.json | 9 ++ 182 files changed, 164 insertions(+), 37 deletions(-) create mode 100644 renderers/react/README.md create mode 100644 renderers/react/package.json rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/10017-ts-union/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/10017-ts-union/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/10017-ts-union/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/10017-ts-union/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/10278-ts-multiple-components/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/10278-ts-multiple-components/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/10278-ts-multiple-components/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/10278-ts-multiple-components/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8140-js-prop-types-oneof/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8140-js-prop-types-oneof/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8140-js-prop-types-oneof/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8140-js-prop-types-oneof/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8143-ts-imported-types/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8143-ts-imported-types/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8143-ts-imported-types/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8143-ts-imported-types/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8143-ts-imported-types/types.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8143-ts-react-fc-generics/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8143-ts-react-fc-generics/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8143-ts-react-fc-generics/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8143-ts-react-fc-generics/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8279-js-styled-docgen/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8279-js-styled-docgen/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8279-js-styled-docgen/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8279-js-styled-docgen/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8428-js-static-prop-types/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8428-js-static-prop-types/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8428-js-static-prop-types/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8428-js-static-prop-types/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8663-js-styled-components/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8663-js-styled-components/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8663-js-styled-components/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8663-js-styled-components/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8740-ts-multi-props/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8740-ts-multi-props/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8740-ts-multi-props/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8740-ts-multi-props/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8894-9511-ts-forward-ref/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8894-9511-ts-forward-ref/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8894-9511-ts-forward-ref/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/8894-9511-ts-forward-ref/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9023-js-hoc/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9023-js-hoc/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9023-js-hoc/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9023-js-hoc/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9399-js-proptypes-shape/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9399-js-proptypes-shape/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9399-js-proptypes-shape/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9399-js-proptypes-shape/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9465-ts-type-props/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9465-ts-type-props/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9465-ts-type-props/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9465-ts-type-props/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9493-ts-display-name/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9493-ts-display-name/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9493-ts-display-name/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9493-ts-display-name/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9556-ts-react-default-exports/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9556-ts-react-default-exports/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9556-ts-react-default-exports/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9556-ts-react-default-exports/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9575-ts-camel-case/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9575-ts-camel-case/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9575-ts-camel-case/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9575-ts-camel-case/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9586-js-react-memo/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9586-js-react-memo/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9586-js-react-memo/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9586-js-react-memo/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9591-ts-import-types/Bar.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9591-ts-import-types/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9591-ts-import-types/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9591-ts-import-types/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9591-ts-import-types/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9592-ts-styled-props/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9592-ts-styled-props/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9592-ts-styled-props/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9592-ts-styled-props/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9626-js-default-values/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9626-js-default-values/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9626-js-default-values/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9626-js-default-values/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9721-ts-deprecated-jsdoc/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9721-ts-deprecated-jsdoc/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9721-ts-deprecated-jsdoc/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9721-ts-deprecated-jsdoc/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9764-ts-extend-props/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9764-ts-extend-props/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9764-ts-extend-props/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9764-ts-extend-props/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9827-ts-default-values/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9827-ts-default-values/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9827-ts-default-values/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9827-ts-default-values/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9832-ts-enum-export/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9832-ts-enum-export/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9832-ts-enum-export/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9832-ts-enum-export/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9922-ts-component-props/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9922-ts-component-props/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9922-ts-component-props/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/9922-ts-component-props/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/imported.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-class-component/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-class-component/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-class-component/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-class-component/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component-inline-defaults/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component-inline-defaults/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component-inline-defaults/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component-inline-defaults/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component/input.js (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/js-function-component/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/ts-function-component-inline-defaults/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/ts-function-component-inline-defaults/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/ts-function-component-inline-defaults/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/ts-function-component-inline-defaults/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/ts-function-component/argTypes.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/ts-function-component/docgen.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/ts-function-component/input.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/__testfixtures__/ts-function-component/properties.snapshot (100%) rename {app/react/src/client => renderers/react/src}/docs/config.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/extractArgTypes.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/extractProps.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/jsxDecorator.test.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/jsxDecorator.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/captions.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/componentTypes.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/defaultValues/createDefaultValue.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/defaultValues/createFromRawDefaultProp.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/defaultValues/generateArray.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/defaultValues/generateObject.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/defaultValues/index.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/defaultValues/prettyIdentifier.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/generateCode.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/index.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/inspection/acornParser.test.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/inspection/acornParser.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/inspection/index.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/inspection/inspectValue.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/inspection/types.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/lib/isHtmlTag.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/propTypes/createType.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/propTypes/generateFuncSignature.test.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/propTypes/generateFuncSignature.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/propTypes/handleProp.test.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/propTypes/handleProp.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/propTypes/rawDefaultPropResolvers.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/propTypes/sortProps.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/react-argtypes.stories.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/react-properties.test.ts (100%) rename {app/react/src/client => renderers/react/src}/docs/typeScript/handleProp.test.tsx (100%) rename {app/react/src/client => renderers/react/src}/docs/typeScript/handleProp.ts (100%) create mode 100644 renderers/react/src/index.ts rename {app/react/src/client => renderers/react/src}/preview/config.ts (100%) rename {app/react/src/client => renderers/react/src}/preview/globals.ts (100%) rename {app/react/src/client => renderers/react/src}/preview/index.test.ts (100%) rename {app/react/src/client => renderers/react/src}/preview/index.tsx (100%) rename {app/react/src/client => renderers/react/src}/preview/render.tsx (100%) rename {app/react/src/client => renderers/react/src}/preview/types-6-0.ts (100%) rename {app/react/src/client => renderers/react/src}/preview/types-6-3.ts (100%) rename {app/react/src/client => renderers/react/src}/preview/types-7-0.ts (100%) rename {app/react/src/client => renderers/react/src}/preview/types.ts (100%) rename {app/react/src/client => renderers/react/src}/testing/index.ts (100%) create mode 100644 renderers/react/src/typings.d.ts create mode 100644 renderers/react/tsconfig.json diff --git a/app/react/package.json b/app/react/package.json index 0bcd3f529aee..941cf7f3c1b5 100644 --- a/app/react/package.json +++ b/app/react/package.json @@ -43,35 +43,21 @@ "@babel/preset-flow": "^7.12.1", "@babel/preset-react": "^7.12.10", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@storybook/addons": "6.5.0-alpha.63", - "@storybook/client-logger": "6.5.0-alpha.63", - "@storybook/core-client": "6.5.0-alpha.63", "@storybook/core-common": "6.5.0-alpha.63", "@storybook/core-server": "6.5.0-alpha.63", - "@storybook/csf": "0.0.2--canary.7c6c115.0", "@storybook/docs-tools": "6.5.0-alpha.63", "@storybook/node-logger": "6.5.0-alpha.63", "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", + "@storybook/renderer-react": "6.5.0-alpha.63", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.0-alpha.63", - "@types/estree": "^0.0.51", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", - "acorn": "^7.4.1", - "acorn-jsx": "^5.3.1", - "acorn-walk": "^7.2.0", "babel-plugin-add-react-displayname": "^0.0.5", "babel-plugin-react-docgen": "^4.2.1", "core-js": "^3.8.2", - "escodegen": "^2.0.0", "fs-extra": "^9.0.1", "global": "^4.4.0", - "html-tags": "^3.1.0", - "lodash": "^4.17.21", - "prop-types": "^15.7.2", - "react-element-to-jsx-string": "^14.3.4", "react-refresh": "^0.11.0", - "read-pkg-up": "^7.0.1", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2", diff --git a/app/react/src/client/index.ts b/app/react/src/client/index.ts index 141f7e7f43fc..7d6e4ae9d6d7 100644 --- a/app/react/src/client/index.ts +++ b/app/react/src/client/index.ts @@ -1,18 +1 @@ -export type { DecoratorFn } from './preview'; -export { - storiesOf, - setAddon, - addDecorator, - addParameters, - configure, - getStorybook, - raw, - forceReRender, -} from './preview'; -export * from './testing'; - -export * from './preview/types-6-3'; - -if (module && module.hot && module.hot.decline) { - module.hot.decline(); -} +export * from '@storybook/renderer-react'; diff --git a/app/react/src/server/framework-preset-react-docs.ts b/app/react/src/server/framework-preset-react-docs.ts index 98f9c12145b9..9e60d52efd40 100644 --- a/app/react/src/server/framework-preset-react-docs.ts +++ b/app/react/src/server/framework-preset-react-docs.ts @@ -1,5 +1,4 @@ import type { StorybookConfig, Options, TypescriptConfig } from '@storybook/core-common'; -import { findDistEsm } from '@storybook/core-common'; import type { TransformOptions } from '@babel/core'; import type { Configuration } from 'webpack'; import ReactDocgenTypescriptPlugin from '@storybook/react-docgen-typescript-plugin'; @@ -60,5 +59,5 @@ export async function webpackFinal(config: Configuration, options: Options) { export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { if (!hasDocsOrControls(options)) return entry; - return [...entry, findDistEsm(__dirname, 'client/docs/config')]; + return [...entry, require.resolve('@storybook/renderer-react/dist/esm/docs/config')]; }; diff --git a/app/react/src/server/preset.ts b/app/react/src/server/preset.ts index 081c6073e26b..f90b49c3a615 100644 --- a/app/react/src/server/preset.ts +++ b/app/react/src/server/preset.ts @@ -1,9 +1,8 @@ -import { findDistEsm } from '@storybook/core-common'; import type { StorybookConfig } from '@storybook/core-common'; export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entries = []) => [ ...entries, - findDistEsm(__dirname, 'client/preview/config'), + require.resolve('@storybook/renderer-react/dist/esm/preview/config'), ]; export const addons: StorybookConfig['addons'] = [ diff --git a/renderers/react/README.md b/renderers/react/README.md new file mode 100644 index 000000000000..72971fe2cbc4 --- /dev/null +++ b/renderers/react/README.md @@ -0,0 +1 @@ +# Storybook React renderer diff --git a/renderers/react/package.json b/renderers/react/package.json new file mode 100644 index 000000000000..3dd332e6e771 --- /dev/null +++ b/renderers/react/package.json @@ -0,0 +1,88 @@ +{ + "name": "@storybook/renderer-react", + "version": "6.5.0-alpha.63", + "description": "Storybook React renderer", + "keywords": [ + "storybook" + ], + "homepage": "https://github.com/storybookjs/storybook/tree/main/renderers/react", + "bugs": { + "url": "https://github.com/storybookjs/storybook/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/storybookjs/storybook.git", + "directory": "renderers/react" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "license": "MIT", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/ts3.9/index.d.ts", + "typesVersions": { + "<3.8": { + "dist/ts3.9/*": [ + "dist/ts3.4/*" + ] + } + }, + "files": [ + "dist/**/*", + "types/**/*", + "README.md", + "*.js", + "*.d.ts" + ], + "scripts": { + "prepare": "node ../../scripts/prepare.js" + }, + "dependencies": { + "@storybook/addons": "6.5.0-alpha.63", + "@storybook/client-logger": "6.5.0-alpha.63", + "@storybook/core-client": "6.5.0-alpha.63", + "@storybook/csf": "0.0.2--canary.7c6c115.0", + "@storybook/docs-tools": "6.5.0-alpha.63", + "@storybook/store": "6.5.0-alpha.63", + "@types/estree": "^0.0.51", + "@types/node": "^14.14.20 || ^16.0.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "core-js": "^3.8.2", + "escodegen": "^2.0.0", + "global": "^4.4.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^14.3.4", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "devDependencies": { + "@babel/core": "^7.11.5", + "@types/util-deprecate": "^1.0.0" + }, + "peerDependencies": { + "jest-specific-snapshot": "^4.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "require-from-string": "^2.0.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + }, + "engines": { + "node": ">=10.13.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "416f87dc715cae299c7b4f37f1c9db7f686d4d21", + "sbmodern": "dist/modern/index.js" +} diff --git a/app/react/src/client/docs/__testfixtures__/10017-ts-union/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/10017-ts-union/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/10017-ts-union/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/10017-ts-union/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/10017-ts-union/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/10017-ts-union/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/10017-ts-union/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/10017-ts-union/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/10017-ts-union/input.tsx b/renderers/react/src/docs/__testfixtures__/10017-ts-union/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/10017-ts-union/input.tsx rename to renderers/react/src/docs/__testfixtures__/10017-ts-union/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/10017-ts-union/properties.snapshot b/renderers/react/src/docs/__testfixtures__/10017-ts-union/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/10017-ts-union/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/10017-ts-union/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/10278-ts-multiple-components/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/10278-ts-multiple-components/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/10278-ts-multiple-components/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/10278-ts-multiple-components/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/10278-ts-multiple-components/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/10278-ts-multiple-components/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/10278-ts-multiple-components/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/10278-ts-multiple-components/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/10278-ts-multiple-components/input.tsx b/renderers/react/src/docs/__testfixtures__/10278-ts-multiple-components/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/10278-ts-multiple-components/input.tsx rename to renderers/react/src/docs/__testfixtures__/10278-ts-multiple-components/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/10278-ts-multiple-components/properties.snapshot b/renderers/react/src/docs/__testfixtures__/10278-ts-multiple-components/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/10278-ts-multiple-components/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/10278-ts-multiple-components/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8140-js-prop-types-oneof/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/8140-js-prop-types-oneof/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8140-js-prop-types-oneof/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/8140-js-prop-types-oneof/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8140-js-prop-types-oneof/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/8140-js-prop-types-oneof/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8140-js-prop-types-oneof/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/8140-js-prop-types-oneof/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8140-js-prop-types-oneof/input.js b/renderers/react/src/docs/__testfixtures__/8140-js-prop-types-oneof/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8140-js-prop-types-oneof/input.js rename to renderers/react/src/docs/__testfixtures__/8140-js-prop-types-oneof/input.js diff --git a/app/react/src/client/docs/__testfixtures__/8140-js-prop-types-oneof/properties.snapshot b/renderers/react/src/docs/__testfixtures__/8140-js-prop-types-oneof/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8140-js-prop-types-oneof/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/8140-js-prop-types-oneof/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8143-ts-imported-types/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/8143-ts-imported-types/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8143-ts-imported-types/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/8143-ts-imported-types/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8143-ts-imported-types/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/8143-ts-imported-types/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8143-ts-imported-types/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/8143-ts-imported-types/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8143-ts-imported-types/input.tsx b/renderers/react/src/docs/__testfixtures__/8143-ts-imported-types/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8143-ts-imported-types/input.tsx rename to renderers/react/src/docs/__testfixtures__/8143-ts-imported-types/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/8143-ts-imported-types/properties.snapshot b/renderers/react/src/docs/__testfixtures__/8143-ts-imported-types/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8143-ts-imported-types/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/8143-ts-imported-types/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8143-ts-imported-types/types.ts b/renderers/react/src/docs/__testfixtures__/8143-ts-imported-types/types.ts similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8143-ts-imported-types/types.ts rename to renderers/react/src/docs/__testfixtures__/8143-ts-imported-types/types.ts diff --git a/app/react/src/client/docs/__testfixtures__/8143-ts-react-fc-generics/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/8143-ts-react-fc-generics/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8143-ts-react-fc-generics/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/8143-ts-react-fc-generics/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8143-ts-react-fc-generics/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/8143-ts-react-fc-generics/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8143-ts-react-fc-generics/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/8143-ts-react-fc-generics/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8143-ts-react-fc-generics/input.tsx b/renderers/react/src/docs/__testfixtures__/8143-ts-react-fc-generics/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8143-ts-react-fc-generics/input.tsx rename to renderers/react/src/docs/__testfixtures__/8143-ts-react-fc-generics/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/8143-ts-react-fc-generics/properties.snapshot b/renderers/react/src/docs/__testfixtures__/8143-ts-react-fc-generics/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8143-ts-react-fc-generics/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/8143-ts-react-fc-generics/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8279-js-styled-docgen/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/8279-js-styled-docgen/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8279-js-styled-docgen/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/8279-js-styled-docgen/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8279-js-styled-docgen/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/8279-js-styled-docgen/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8279-js-styled-docgen/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/8279-js-styled-docgen/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8279-js-styled-docgen/input.js b/renderers/react/src/docs/__testfixtures__/8279-js-styled-docgen/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8279-js-styled-docgen/input.js rename to renderers/react/src/docs/__testfixtures__/8279-js-styled-docgen/input.js diff --git a/app/react/src/client/docs/__testfixtures__/8279-js-styled-docgen/properties.snapshot b/renderers/react/src/docs/__testfixtures__/8279-js-styled-docgen/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8279-js-styled-docgen/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/8279-js-styled-docgen/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8428-js-static-prop-types/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/8428-js-static-prop-types/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8428-js-static-prop-types/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/8428-js-static-prop-types/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8428-js-static-prop-types/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/8428-js-static-prop-types/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8428-js-static-prop-types/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/8428-js-static-prop-types/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8428-js-static-prop-types/input.js b/renderers/react/src/docs/__testfixtures__/8428-js-static-prop-types/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8428-js-static-prop-types/input.js rename to renderers/react/src/docs/__testfixtures__/8428-js-static-prop-types/input.js diff --git a/app/react/src/client/docs/__testfixtures__/8428-js-static-prop-types/properties.snapshot b/renderers/react/src/docs/__testfixtures__/8428-js-static-prop-types/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8428-js-static-prop-types/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/8428-js-static-prop-types/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8663-js-styled-components/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/8663-js-styled-components/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8663-js-styled-components/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/8663-js-styled-components/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8663-js-styled-components/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/8663-js-styled-components/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8663-js-styled-components/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/8663-js-styled-components/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8663-js-styled-components/input.js b/renderers/react/src/docs/__testfixtures__/8663-js-styled-components/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8663-js-styled-components/input.js rename to renderers/react/src/docs/__testfixtures__/8663-js-styled-components/input.js diff --git a/app/react/src/client/docs/__testfixtures__/8663-js-styled-components/properties.snapshot b/renderers/react/src/docs/__testfixtures__/8663-js-styled-components/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8663-js-styled-components/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/8663-js-styled-components/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8740-ts-multi-props/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/8740-ts-multi-props/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8740-ts-multi-props/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/8740-ts-multi-props/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8740-ts-multi-props/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/8740-ts-multi-props/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8740-ts-multi-props/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/8740-ts-multi-props/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8740-ts-multi-props/input.tsx b/renderers/react/src/docs/__testfixtures__/8740-ts-multi-props/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8740-ts-multi-props/input.tsx rename to renderers/react/src/docs/__testfixtures__/8740-ts-multi-props/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/8740-ts-multi-props/properties.snapshot b/renderers/react/src/docs/__testfixtures__/8740-ts-multi-props/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8740-ts-multi-props/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/8740-ts-multi-props/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8894-9511-ts-forward-ref/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/8894-9511-ts-forward-ref/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8894-9511-ts-forward-ref/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/8894-9511-ts-forward-ref/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8894-9511-ts-forward-ref/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/8894-9511-ts-forward-ref/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8894-9511-ts-forward-ref/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/8894-9511-ts-forward-ref/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/8894-9511-ts-forward-ref/input.tsx b/renderers/react/src/docs/__testfixtures__/8894-9511-ts-forward-ref/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8894-9511-ts-forward-ref/input.tsx rename to renderers/react/src/docs/__testfixtures__/8894-9511-ts-forward-ref/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/8894-9511-ts-forward-ref/properties.snapshot b/renderers/react/src/docs/__testfixtures__/8894-9511-ts-forward-ref/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/8894-9511-ts-forward-ref/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/8894-9511-ts-forward-ref/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9023-js-hoc/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9023-js-hoc/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9023-js-hoc/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9023-js-hoc/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9023-js-hoc/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9023-js-hoc/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9023-js-hoc/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9023-js-hoc/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9023-js-hoc/input.js b/renderers/react/src/docs/__testfixtures__/9023-js-hoc/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9023-js-hoc/input.js rename to renderers/react/src/docs/__testfixtures__/9023-js-hoc/input.js diff --git a/app/react/src/client/docs/__testfixtures__/9023-js-hoc/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9023-js-hoc/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9023-js-hoc/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9023-js-hoc/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9399-js-proptypes-shape/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9399-js-proptypes-shape/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9399-js-proptypes-shape/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9399-js-proptypes-shape/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9399-js-proptypes-shape/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9399-js-proptypes-shape/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9399-js-proptypes-shape/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9399-js-proptypes-shape/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9399-js-proptypes-shape/input.js b/renderers/react/src/docs/__testfixtures__/9399-js-proptypes-shape/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9399-js-proptypes-shape/input.js rename to renderers/react/src/docs/__testfixtures__/9399-js-proptypes-shape/input.js diff --git a/app/react/src/client/docs/__testfixtures__/9399-js-proptypes-shape/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9399-js-proptypes-shape/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9399-js-proptypes-shape/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9399-js-proptypes-shape/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9465-ts-type-props/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9465-ts-type-props/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9465-ts-type-props/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9465-ts-type-props/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9465-ts-type-props/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9465-ts-type-props/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9465-ts-type-props/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9465-ts-type-props/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9465-ts-type-props/input.tsx b/renderers/react/src/docs/__testfixtures__/9465-ts-type-props/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9465-ts-type-props/input.tsx rename to renderers/react/src/docs/__testfixtures__/9465-ts-type-props/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9465-ts-type-props/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9465-ts-type-props/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9465-ts-type-props/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9465-ts-type-props/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9493-ts-display-name/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9493-ts-display-name/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9493-ts-display-name/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9493-ts-display-name/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9493-ts-display-name/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9493-ts-display-name/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9493-ts-display-name/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9493-ts-display-name/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9493-ts-display-name/input.tsx b/renderers/react/src/docs/__testfixtures__/9493-ts-display-name/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9493-ts-display-name/input.tsx rename to renderers/react/src/docs/__testfixtures__/9493-ts-display-name/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9493-ts-display-name/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9493-ts-display-name/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9493-ts-display-name/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9493-ts-display-name/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9556-ts-react-default-exports/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9556-ts-react-default-exports/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9556-ts-react-default-exports/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9556-ts-react-default-exports/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9556-ts-react-default-exports/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9556-ts-react-default-exports/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9556-ts-react-default-exports/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9556-ts-react-default-exports/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9556-ts-react-default-exports/input.tsx b/renderers/react/src/docs/__testfixtures__/9556-ts-react-default-exports/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9556-ts-react-default-exports/input.tsx rename to renderers/react/src/docs/__testfixtures__/9556-ts-react-default-exports/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9556-ts-react-default-exports/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9556-ts-react-default-exports/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9556-ts-react-default-exports/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9556-ts-react-default-exports/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9575-ts-camel-case/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9575-ts-camel-case/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9575-ts-camel-case/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9575-ts-camel-case/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9575-ts-camel-case/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9575-ts-camel-case/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9575-ts-camel-case/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9575-ts-camel-case/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9575-ts-camel-case/input.tsx b/renderers/react/src/docs/__testfixtures__/9575-ts-camel-case/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9575-ts-camel-case/input.tsx rename to renderers/react/src/docs/__testfixtures__/9575-ts-camel-case/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9575-ts-camel-case/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9575-ts-camel-case/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9575-ts-camel-case/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9575-ts-camel-case/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9586-js-react-memo/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9586-js-react-memo/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9586-js-react-memo/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9586-js-react-memo/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9586-js-react-memo/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9586-js-react-memo/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9586-js-react-memo/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9586-js-react-memo/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9586-js-react-memo/input.js b/renderers/react/src/docs/__testfixtures__/9586-js-react-memo/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9586-js-react-memo/input.js rename to renderers/react/src/docs/__testfixtures__/9586-js-react-memo/input.js diff --git a/app/react/src/client/docs/__testfixtures__/9586-js-react-memo/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9586-js-react-memo/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9586-js-react-memo/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9586-js-react-memo/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9591-ts-import-types/Bar.tsx b/renderers/react/src/docs/__testfixtures__/9591-ts-import-types/Bar.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9591-ts-import-types/Bar.tsx rename to renderers/react/src/docs/__testfixtures__/9591-ts-import-types/Bar.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9591-ts-import-types/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9591-ts-import-types/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9591-ts-import-types/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9591-ts-import-types/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9591-ts-import-types/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9591-ts-import-types/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9591-ts-import-types/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9591-ts-import-types/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9591-ts-import-types/input.tsx b/renderers/react/src/docs/__testfixtures__/9591-ts-import-types/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9591-ts-import-types/input.tsx rename to renderers/react/src/docs/__testfixtures__/9591-ts-import-types/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9591-ts-import-types/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9591-ts-import-types/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9591-ts-import-types/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9591-ts-import-types/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9592-ts-styled-props/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9592-ts-styled-props/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9592-ts-styled-props/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9592-ts-styled-props/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9592-ts-styled-props/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9592-ts-styled-props/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9592-ts-styled-props/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9592-ts-styled-props/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9592-ts-styled-props/input.tsx b/renderers/react/src/docs/__testfixtures__/9592-ts-styled-props/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9592-ts-styled-props/input.tsx rename to renderers/react/src/docs/__testfixtures__/9592-ts-styled-props/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9592-ts-styled-props/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9592-ts-styled-props/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9592-ts-styled-props/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9592-ts-styled-props/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9626-js-default-values/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9626-js-default-values/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9626-js-default-values/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9626-js-default-values/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9626-js-default-values/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9626-js-default-values/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9626-js-default-values/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9626-js-default-values/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9626-js-default-values/input.js b/renderers/react/src/docs/__testfixtures__/9626-js-default-values/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9626-js-default-values/input.js rename to renderers/react/src/docs/__testfixtures__/9626-js-default-values/input.js diff --git a/app/react/src/client/docs/__testfixtures__/9626-js-default-values/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9626-js-default-values/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9626-js-default-values/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9626-js-default-values/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/input.js b/renderers/react/src/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/input.js rename to renderers/react/src/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/input.js diff --git a/app/react/src/client/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9668-js-proptypes-no-jsdoc/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9721-ts-deprecated-jsdoc/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9721-ts-deprecated-jsdoc/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9721-ts-deprecated-jsdoc/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9721-ts-deprecated-jsdoc/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9721-ts-deprecated-jsdoc/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9721-ts-deprecated-jsdoc/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9721-ts-deprecated-jsdoc/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9721-ts-deprecated-jsdoc/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9721-ts-deprecated-jsdoc/input.tsx b/renderers/react/src/docs/__testfixtures__/9721-ts-deprecated-jsdoc/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9721-ts-deprecated-jsdoc/input.tsx rename to renderers/react/src/docs/__testfixtures__/9721-ts-deprecated-jsdoc/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9721-ts-deprecated-jsdoc/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9721-ts-deprecated-jsdoc/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9721-ts-deprecated-jsdoc/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9721-ts-deprecated-jsdoc/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9764-ts-extend-props/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9764-ts-extend-props/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9764-ts-extend-props/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9764-ts-extend-props/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9764-ts-extend-props/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9764-ts-extend-props/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9764-ts-extend-props/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9764-ts-extend-props/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9764-ts-extend-props/input.tsx b/renderers/react/src/docs/__testfixtures__/9764-ts-extend-props/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9764-ts-extend-props/input.tsx rename to renderers/react/src/docs/__testfixtures__/9764-ts-extend-props/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9764-ts-extend-props/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9764-ts-extend-props/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9764-ts-extend-props/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9764-ts-extend-props/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9827-ts-default-values/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9827-ts-default-values/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9827-ts-default-values/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9827-ts-default-values/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9827-ts-default-values/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9827-ts-default-values/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9827-ts-default-values/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9827-ts-default-values/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9827-ts-default-values/input.tsx b/renderers/react/src/docs/__testfixtures__/9827-ts-default-values/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9827-ts-default-values/input.tsx rename to renderers/react/src/docs/__testfixtures__/9827-ts-default-values/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9827-ts-default-values/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9827-ts-default-values/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9827-ts-default-values/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9827-ts-default-values/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9832-ts-enum-export/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9832-ts-enum-export/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9832-ts-enum-export/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9832-ts-enum-export/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9832-ts-enum-export/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9832-ts-enum-export/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9832-ts-enum-export/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9832-ts-enum-export/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9832-ts-enum-export/input.tsx b/renderers/react/src/docs/__testfixtures__/9832-ts-enum-export/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9832-ts-enum-export/input.tsx rename to renderers/react/src/docs/__testfixtures__/9832-ts-enum-export/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9832-ts-enum-export/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9832-ts-enum-export/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9832-ts-enum-export/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9832-ts-enum-export/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9922-ts-component-props/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/9922-ts-component-props/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9922-ts-component-props/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/9922-ts-component-props/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9922-ts-component-props/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/9922-ts-component-props/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9922-ts-component-props/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/9922-ts-component-props/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/9922-ts-component-props/input.tsx b/renderers/react/src/docs/__testfixtures__/9922-ts-component-props/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9922-ts-component-props/input.tsx rename to renderers/react/src/docs/__testfixtures__/9922-ts-component-props/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/9922-ts-component-props/properties.snapshot b/renderers/react/src/docs/__testfixtures__/9922-ts-component-props/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/9922-ts-component-props/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/9922-ts-component-props/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/imported.js b/renderers/react/src/docs/__testfixtures__/imported.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/imported.js rename to renderers/react/src/docs/__testfixtures__/imported.js diff --git a/app/react/src/client/docs/__testfixtures__/js-class-component/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/js-class-component/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-class-component/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/js-class-component/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-class-component/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/js-class-component/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-class-component/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/js-class-component/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-class-component/input.js b/renderers/react/src/docs/__testfixtures__/js-class-component/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-class-component/input.js rename to renderers/react/src/docs/__testfixtures__/js-class-component/input.js diff --git a/app/react/src/client/docs/__testfixtures__/js-class-component/properties.snapshot b/renderers/react/src/docs/__testfixtures__/js-class-component/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-class-component/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/js-class-component/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/input.js b/renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/input.js rename to renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/input.js diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/properties.snapshot b/renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults-no-propTypes/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults/input.js b/renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults/input.js rename to renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults/input.js diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults/properties.snapshot b/renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component-inline-defaults/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/js-function-component-inline-defaults/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/js-function-component/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/js-function-component/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/js-function-component/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/js-function-component/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component/input.js b/renderers/react/src/docs/__testfixtures__/js-function-component/input.js similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component/input.js rename to renderers/react/src/docs/__testfixtures__/js-function-component/input.js diff --git a/app/react/src/client/docs/__testfixtures__/js-function-component/properties.snapshot b/renderers/react/src/docs/__testfixtures__/js-function-component/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/js-function-component/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/js-function-component/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/ts-function-component-inline-defaults/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/ts-function-component-inline-defaults/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/ts-function-component-inline-defaults/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/ts-function-component-inline-defaults/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/ts-function-component-inline-defaults/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/ts-function-component-inline-defaults/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/ts-function-component-inline-defaults/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/ts-function-component-inline-defaults/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/ts-function-component-inline-defaults/input.tsx b/renderers/react/src/docs/__testfixtures__/ts-function-component-inline-defaults/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/ts-function-component-inline-defaults/input.tsx rename to renderers/react/src/docs/__testfixtures__/ts-function-component-inline-defaults/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/ts-function-component-inline-defaults/properties.snapshot b/renderers/react/src/docs/__testfixtures__/ts-function-component-inline-defaults/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/ts-function-component-inline-defaults/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/ts-function-component-inline-defaults/properties.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/ts-function-component/argTypes.snapshot b/renderers/react/src/docs/__testfixtures__/ts-function-component/argTypes.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/ts-function-component/argTypes.snapshot rename to renderers/react/src/docs/__testfixtures__/ts-function-component/argTypes.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/ts-function-component/docgen.snapshot b/renderers/react/src/docs/__testfixtures__/ts-function-component/docgen.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/ts-function-component/docgen.snapshot rename to renderers/react/src/docs/__testfixtures__/ts-function-component/docgen.snapshot diff --git a/app/react/src/client/docs/__testfixtures__/ts-function-component/input.tsx b/renderers/react/src/docs/__testfixtures__/ts-function-component/input.tsx similarity index 100% rename from app/react/src/client/docs/__testfixtures__/ts-function-component/input.tsx rename to renderers/react/src/docs/__testfixtures__/ts-function-component/input.tsx diff --git a/app/react/src/client/docs/__testfixtures__/ts-function-component/properties.snapshot b/renderers/react/src/docs/__testfixtures__/ts-function-component/properties.snapshot similarity index 100% rename from app/react/src/client/docs/__testfixtures__/ts-function-component/properties.snapshot rename to renderers/react/src/docs/__testfixtures__/ts-function-component/properties.snapshot diff --git a/app/react/src/client/docs/config.ts b/renderers/react/src/docs/config.ts similarity index 100% rename from app/react/src/client/docs/config.ts rename to renderers/react/src/docs/config.ts diff --git a/app/react/src/client/docs/extractArgTypes.ts b/renderers/react/src/docs/extractArgTypes.ts similarity index 100% rename from app/react/src/client/docs/extractArgTypes.ts rename to renderers/react/src/docs/extractArgTypes.ts diff --git a/app/react/src/client/docs/extractProps.ts b/renderers/react/src/docs/extractProps.ts similarity index 100% rename from app/react/src/client/docs/extractProps.ts rename to renderers/react/src/docs/extractProps.ts diff --git a/app/react/src/client/docs/jsxDecorator.test.tsx b/renderers/react/src/docs/jsxDecorator.test.tsx similarity index 100% rename from app/react/src/client/docs/jsxDecorator.test.tsx rename to renderers/react/src/docs/jsxDecorator.test.tsx diff --git a/app/react/src/client/docs/jsxDecorator.tsx b/renderers/react/src/docs/jsxDecorator.tsx similarity index 100% rename from app/react/src/client/docs/jsxDecorator.tsx rename to renderers/react/src/docs/jsxDecorator.tsx diff --git a/app/react/src/client/docs/lib/captions.ts b/renderers/react/src/docs/lib/captions.ts similarity index 100% rename from app/react/src/client/docs/lib/captions.ts rename to renderers/react/src/docs/lib/captions.ts diff --git a/app/react/src/client/docs/lib/componentTypes.ts b/renderers/react/src/docs/lib/componentTypes.ts similarity index 100% rename from app/react/src/client/docs/lib/componentTypes.ts rename to renderers/react/src/docs/lib/componentTypes.ts diff --git a/app/react/src/client/docs/lib/defaultValues/createDefaultValue.ts b/renderers/react/src/docs/lib/defaultValues/createDefaultValue.ts similarity index 100% rename from app/react/src/client/docs/lib/defaultValues/createDefaultValue.ts rename to renderers/react/src/docs/lib/defaultValues/createDefaultValue.ts diff --git a/app/react/src/client/docs/lib/defaultValues/createFromRawDefaultProp.ts b/renderers/react/src/docs/lib/defaultValues/createFromRawDefaultProp.ts similarity index 100% rename from app/react/src/client/docs/lib/defaultValues/createFromRawDefaultProp.ts rename to renderers/react/src/docs/lib/defaultValues/createFromRawDefaultProp.ts diff --git a/app/react/src/client/docs/lib/defaultValues/generateArray.ts b/renderers/react/src/docs/lib/defaultValues/generateArray.ts similarity index 100% rename from app/react/src/client/docs/lib/defaultValues/generateArray.ts rename to renderers/react/src/docs/lib/defaultValues/generateArray.ts diff --git a/app/react/src/client/docs/lib/defaultValues/generateObject.ts b/renderers/react/src/docs/lib/defaultValues/generateObject.ts similarity index 100% rename from app/react/src/client/docs/lib/defaultValues/generateObject.ts rename to renderers/react/src/docs/lib/defaultValues/generateObject.ts diff --git a/app/react/src/client/docs/lib/defaultValues/index.ts b/renderers/react/src/docs/lib/defaultValues/index.ts similarity index 100% rename from app/react/src/client/docs/lib/defaultValues/index.ts rename to renderers/react/src/docs/lib/defaultValues/index.ts diff --git a/app/react/src/client/docs/lib/defaultValues/prettyIdentifier.ts b/renderers/react/src/docs/lib/defaultValues/prettyIdentifier.ts similarity index 100% rename from app/react/src/client/docs/lib/defaultValues/prettyIdentifier.ts rename to renderers/react/src/docs/lib/defaultValues/prettyIdentifier.ts diff --git a/app/react/src/client/docs/lib/generateCode.ts b/renderers/react/src/docs/lib/generateCode.ts similarity index 100% rename from app/react/src/client/docs/lib/generateCode.ts rename to renderers/react/src/docs/lib/generateCode.ts diff --git a/app/react/src/client/docs/lib/index.ts b/renderers/react/src/docs/lib/index.ts similarity index 100% rename from app/react/src/client/docs/lib/index.ts rename to renderers/react/src/docs/lib/index.ts diff --git a/app/react/src/client/docs/lib/inspection/acornParser.test.ts b/renderers/react/src/docs/lib/inspection/acornParser.test.ts similarity index 100% rename from app/react/src/client/docs/lib/inspection/acornParser.test.ts rename to renderers/react/src/docs/lib/inspection/acornParser.test.ts diff --git a/app/react/src/client/docs/lib/inspection/acornParser.ts b/renderers/react/src/docs/lib/inspection/acornParser.ts similarity index 100% rename from app/react/src/client/docs/lib/inspection/acornParser.ts rename to renderers/react/src/docs/lib/inspection/acornParser.ts diff --git a/app/react/src/client/docs/lib/inspection/index.ts b/renderers/react/src/docs/lib/inspection/index.ts similarity index 100% rename from app/react/src/client/docs/lib/inspection/index.ts rename to renderers/react/src/docs/lib/inspection/index.ts diff --git a/app/react/src/client/docs/lib/inspection/inspectValue.ts b/renderers/react/src/docs/lib/inspection/inspectValue.ts similarity index 100% rename from app/react/src/client/docs/lib/inspection/inspectValue.ts rename to renderers/react/src/docs/lib/inspection/inspectValue.ts diff --git a/app/react/src/client/docs/lib/inspection/types.ts b/renderers/react/src/docs/lib/inspection/types.ts similarity index 100% rename from app/react/src/client/docs/lib/inspection/types.ts rename to renderers/react/src/docs/lib/inspection/types.ts diff --git a/app/react/src/client/docs/lib/isHtmlTag.ts b/renderers/react/src/docs/lib/isHtmlTag.ts similarity index 100% rename from app/react/src/client/docs/lib/isHtmlTag.ts rename to renderers/react/src/docs/lib/isHtmlTag.ts diff --git a/app/react/src/client/docs/propTypes/createType.ts b/renderers/react/src/docs/propTypes/createType.ts similarity index 100% rename from app/react/src/client/docs/propTypes/createType.ts rename to renderers/react/src/docs/propTypes/createType.ts diff --git a/app/react/src/client/docs/propTypes/generateFuncSignature.test.ts b/renderers/react/src/docs/propTypes/generateFuncSignature.test.ts similarity index 100% rename from app/react/src/client/docs/propTypes/generateFuncSignature.test.ts rename to renderers/react/src/docs/propTypes/generateFuncSignature.test.ts diff --git a/app/react/src/client/docs/propTypes/generateFuncSignature.ts b/renderers/react/src/docs/propTypes/generateFuncSignature.ts similarity index 100% rename from app/react/src/client/docs/propTypes/generateFuncSignature.ts rename to renderers/react/src/docs/propTypes/generateFuncSignature.ts diff --git a/app/react/src/client/docs/propTypes/handleProp.test.tsx b/renderers/react/src/docs/propTypes/handleProp.test.tsx similarity index 100% rename from app/react/src/client/docs/propTypes/handleProp.test.tsx rename to renderers/react/src/docs/propTypes/handleProp.test.tsx diff --git a/app/react/src/client/docs/propTypes/handleProp.ts b/renderers/react/src/docs/propTypes/handleProp.ts similarity index 100% rename from app/react/src/client/docs/propTypes/handleProp.ts rename to renderers/react/src/docs/propTypes/handleProp.ts diff --git a/app/react/src/client/docs/propTypes/rawDefaultPropResolvers.ts b/renderers/react/src/docs/propTypes/rawDefaultPropResolvers.ts similarity index 100% rename from app/react/src/client/docs/propTypes/rawDefaultPropResolvers.ts rename to renderers/react/src/docs/propTypes/rawDefaultPropResolvers.ts diff --git a/app/react/src/client/docs/propTypes/sortProps.ts b/renderers/react/src/docs/propTypes/sortProps.ts similarity index 100% rename from app/react/src/client/docs/propTypes/sortProps.ts rename to renderers/react/src/docs/propTypes/sortProps.ts diff --git a/app/react/src/client/docs/react-argtypes.stories.tsx b/renderers/react/src/docs/react-argtypes.stories.tsx similarity index 100% rename from app/react/src/client/docs/react-argtypes.stories.tsx rename to renderers/react/src/docs/react-argtypes.stories.tsx diff --git a/app/react/src/client/docs/react-properties.test.ts b/renderers/react/src/docs/react-properties.test.ts similarity index 100% rename from app/react/src/client/docs/react-properties.test.ts rename to renderers/react/src/docs/react-properties.test.ts diff --git a/app/react/src/client/docs/typeScript/handleProp.test.tsx b/renderers/react/src/docs/typeScript/handleProp.test.tsx similarity index 100% rename from app/react/src/client/docs/typeScript/handleProp.test.tsx rename to renderers/react/src/docs/typeScript/handleProp.test.tsx diff --git a/app/react/src/client/docs/typeScript/handleProp.ts b/renderers/react/src/docs/typeScript/handleProp.ts similarity index 100% rename from app/react/src/client/docs/typeScript/handleProp.ts rename to renderers/react/src/docs/typeScript/handleProp.ts diff --git a/renderers/react/src/index.ts b/renderers/react/src/index.ts new file mode 100644 index 000000000000..141f7e7f43fc --- /dev/null +++ b/renderers/react/src/index.ts @@ -0,0 +1,18 @@ +export type { DecoratorFn } from './preview'; +export { + storiesOf, + setAddon, + addDecorator, + addParameters, + configure, + getStorybook, + raw, + forceReRender, +} from './preview'; +export * from './testing'; + +export * from './preview/types-6-3'; + +if (module && module.hot && module.hot.decline) { + module.hot.decline(); +} diff --git a/app/react/src/client/preview/config.ts b/renderers/react/src/preview/config.ts similarity index 100% rename from app/react/src/client/preview/config.ts rename to renderers/react/src/preview/config.ts diff --git a/app/react/src/client/preview/globals.ts b/renderers/react/src/preview/globals.ts similarity index 100% rename from app/react/src/client/preview/globals.ts rename to renderers/react/src/preview/globals.ts diff --git a/app/react/src/client/preview/index.test.ts b/renderers/react/src/preview/index.test.ts similarity index 100% rename from app/react/src/client/preview/index.test.ts rename to renderers/react/src/preview/index.test.ts diff --git a/app/react/src/client/preview/index.tsx b/renderers/react/src/preview/index.tsx similarity index 100% rename from app/react/src/client/preview/index.tsx rename to renderers/react/src/preview/index.tsx diff --git a/app/react/src/client/preview/render.tsx b/renderers/react/src/preview/render.tsx similarity index 100% rename from app/react/src/client/preview/render.tsx rename to renderers/react/src/preview/render.tsx diff --git a/app/react/src/client/preview/types-6-0.ts b/renderers/react/src/preview/types-6-0.ts similarity index 100% rename from app/react/src/client/preview/types-6-0.ts rename to renderers/react/src/preview/types-6-0.ts diff --git a/app/react/src/client/preview/types-6-3.ts b/renderers/react/src/preview/types-6-3.ts similarity index 100% rename from app/react/src/client/preview/types-6-3.ts rename to renderers/react/src/preview/types-6-3.ts diff --git a/app/react/src/client/preview/types-7-0.ts b/renderers/react/src/preview/types-7-0.ts similarity index 100% rename from app/react/src/client/preview/types-7-0.ts rename to renderers/react/src/preview/types-7-0.ts diff --git a/app/react/src/client/preview/types.ts b/renderers/react/src/preview/types.ts similarity index 100% rename from app/react/src/client/preview/types.ts rename to renderers/react/src/preview/types.ts diff --git a/app/react/src/client/testing/index.ts b/renderers/react/src/testing/index.ts similarity index 100% rename from app/react/src/client/testing/index.ts rename to renderers/react/src/testing/index.ts diff --git a/renderers/react/src/typings.d.ts b/renderers/react/src/typings.d.ts new file mode 100644 index 000000000000..cd1929c868b2 --- /dev/null +++ b/renderers/react/src/typings.d.ts @@ -0,0 +1,44 @@ +declare module '@storybook/semver'; +declare module 'global'; + +// TODO: Replace, as soon as @types/react-dom 17.0.14 is used +// Source: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/fb0f14b7a35cde26ffaa82e7536c062e593e9ae6/types/react-dom/client.d.ts +declare module 'react-dom/client' { + +import React = require('react'); + export interface HydrationOptions { + onHydrated?(suspenseInstance: Comment): void; + onDeleted?(suspenseInstance: Comment): void; + /** + * Prefix for `useId`. + */ + identifierPrefix?: string; + onRecoverableError?: (error: unknown) => void; + } + + export interface RootOptions { + /** + * Prefix for `useId`. + */ + identifierPrefix?: string; + onRecoverableError?: (error: unknown) => void; + } + + export interface Root { + render(children: React.ReactChild | Iterable): void; + unmount(): void; + } + + /** + * Replaces `ReactDOM.render` when the `.render` method is called and enables Concurrent Mode. + * + * @see https://reactjs.org/docs/concurrent-mode-reference.html#createroot + */ + export function createRoot(container: Element | Document | DocumentFragment | Comment, options?: RootOptions): Root; + + export function hydrateRoot( + container: Element | Document | DocumentFragment | Comment, + initialChildren: React.ReactChild | Iterable, + options?: HydrationOptions, + ): Root; +} diff --git a/renderers/react/tsconfig.json b/renderers/react/tsconfig.json new file mode 100644 index 000000000000..eb2b50f62b05 --- /dev/null +++ b/renderers/react/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "resolveJsonModule": true + }, + "include": ["src/**/*"], + "exclude": ["src/**/*.test.*", "src/**/__testfixtures__/**"] +} From 5214ba5d2d7654ef1c75d43b92076201ef93e646 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 16 Apr 2022 15:36:32 +0800 Subject: [PATCH 04/24] Server renderer --- app/server/package.json | 10 +-- app/server/src/client/index.ts | 15 +---- .../src/server/framework-preset-server.ts | 3 +- renderers/server/README.md | 1 + renderers/server/package.json | 62 +++++++++++++++++++ renderers/server/src/index.ts | 14 +++++ .../server/src}/preview/config.ts | 0 .../server/src}/preview/globals.ts | 0 .../server/src}/preview/index.ts | 0 .../server/src}/preview/render.ts | 0 .../server/src}/preview/types.ts | 0 renderers/server/src/typings.d.ts | 4 ++ renderers/server/tsconfig.json | 8 +++ 13 files changed, 92 insertions(+), 25 deletions(-) create mode 100644 renderers/server/README.md create mode 100644 renderers/server/package.json create mode 100644 renderers/server/src/index.ts rename {app/server/src/client => renderers/server/src}/preview/config.ts (100%) rename {app/server/src/client => renderers/server/src}/preview/globals.ts (100%) rename {app/server/src/client => renderers/server/src}/preview/index.ts (100%) rename {app/server/src/client => renderers/server/src}/preview/render.ts (100%) rename {app/server/src/client => renderers/server/src}/preview/types.ts (100%) create mode 100644 renderers/server/src/typings.d.ts create mode 100644 renderers/server/tsconfig.json diff --git a/app/server/package.json b/app/server/package.json index 5e70a5700f35..f1fed42c27d7 100644 --- a/app/server/package.json +++ b/app/server/package.json @@ -39,23 +39,15 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.63", - "@storybook/api": "6.5.0-alpha.63", - "@storybook/client-api": "6.5.0-alpha.63", - "@storybook/core-client": "6.5.0-alpha.63", "@storybook/core-common": "6.5.0-alpha.63", "@storybook/core-server": "6.5.0-alpha.63", - "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/node-logger": "6.5.0-alpha.63", - "@storybook/preview-web": "6.5.0-alpha.63", - "@storybook/store": "6.5.0-alpha.63", + "@storybook/renderer-server": "6.5.0-alpha.63", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", "react-dom": "16.14.0", - "read-pkg-up": "^7.0.1", "regenerator-runtime": "^0.13.7", "safe-identifier": "^0.4.1", "ts-dedent": "^2.0.0", diff --git a/app/server/src/client/index.ts b/app/server/src/client/index.ts index 8034a9d6433d..16e7fdbacf12 100644 --- a/app/server/src/client/index.ts +++ b/app/server/src/client/index.ts @@ -1,14 +1 @@ -export { - storiesOf, - setAddon, - addDecorator, - addParameters, - configure, - getStorybook, - forceReRender, - raw, -} from './preview'; - -if (module && module.hot && module.hot.decline) { - module.hot.decline(); -} +export * from '@storybook/renderer-server'; diff --git a/app/server/src/server/framework-preset-server.ts b/app/server/src/server/framework-preset-server.ts index f4f552890b79..f2f790fd55d1 100644 --- a/app/server/src/server/framework-preset-server.ts +++ b/app/server/src/server/framework-preset-server.ts @@ -1,5 +1,4 @@ import path from 'path'; -import { findDistEsm } from '@storybook/core-common'; import type { StorybookConfig } from '@storybook/core-common'; import type { Configuration } from 'webpack'; @@ -20,5 +19,5 @@ export function webpack(config: Configuration) { } export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, findDistEsm(__dirname, 'client/preview/config')]; + return [...entry, require.resolve('@storybook/renderer-server/dist/esm/preview/config')]; }; diff --git a/renderers/server/README.md b/renderers/server/README.md new file mode 100644 index 000000000000..f4eb9407d8c1 --- /dev/null +++ b/renderers/server/README.md @@ -0,0 +1 @@ +# Storybook Server renderer diff --git a/renderers/server/package.json b/renderers/server/package.json new file mode 100644 index 000000000000..6d37a6968c2f --- /dev/null +++ b/renderers/server/package.json @@ -0,0 +1,62 @@ +{ + "name": "@storybook/renderer-server", + "version": "6.5.0-alpha.63", + "description": "Storybook Server renderer", + "keywords": [ + "storybook" + ], + "homepage": "https://github.com/storybookjs/storybook/tree/main/renderers/server", + "bugs": { + "url": "https://github.com/storybookjs/storybook/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/storybookjs/storybook.git", + "directory": "renderers/server" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "license": "MIT", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/ts3.9/index.d.ts", + "typesVersions": { + "<3.8": { + "dist/ts3.9/*": [ + "dist/ts3.4/*" + ] + } + }, + "files": [ + "dist/**/*", + "README.md", + "*.js", + "*.d.ts" + ], + "scripts": { + "prepare": "node ../../scripts/prepare.js" + }, + "dependencies": { + "@storybook/addons": "6.5.0-alpha.63", + "@storybook/core-client": "6.5.0-alpha.63", + "@storybook/csf": "0.0.2--canary.7c6c115.0", + "@storybook/preview-web": "6.5.0-alpha.63", + "@storybook/store": "6.5.0-alpha.63", + "core-js": "^3.8.2", + "global": "^4.4.0", + "react": "16.14.0", + "react-dom": "16.14.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "416f87dc715cae299c7b4f37f1c9db7f686d4d21", + "sbmodern": "dist/modern/index.js" +} diff --git a/renderers/server/src/index.ts b/renderers/server/src/index.ts new file mode 100644 index 000000000000..8034a9d6433d --- /dev/null +++ b/renderers/server/src/index.ts @@ -0,0 +1,14 @@ +export { + storiesOf, + setAddon, + addDecorator, + addParameters, + configure, + getStorybook, + forceReRender, + raw, +} from './preview'; + +if (module && module.hot && module.hot.decline) { + module.hot.decline(); +} diff --git a/app/server/src/client/preview/config.ts b/renderers/server/src/preview/config.ts similarity index 100% rename from app/server/src/client/preview/config.ts rename to renderers/server/src/preview/config.ts diff --git a/app/server/src/client/preview/globals.ts b/renderers/server/src/preview/globals.ts similarity index 100% rename from app/server/src/client/preview/globals.ts rename to renderers/server/src/preview/globals.ts diff --git a/app/server/src/client/preview/index.ts b/renderers/server/src/preview/index.ts similarity index 100% rename from app/server/src/client/preview/index.ts rename to renderers/server/src/preview/index.ts diff --git a/app/server/src/client/preview/render.ts b/renderers/server/src/preview/render.ts similarity index 100% rename from app/server/src/client/preview/render.ts rename to renderers/server/src/preview/render.ts diff --git a/app/server/src/client/preview/types.ts b/renderers/server/src/preview/types.ts similarity index 100% rename from app/server/src/client/preview/types.ts rename to renderers/server/src/preview/types.ts diff --git a/renderers/server/src/typings.d.ts b/renderers/server/src/typings.d.ts new file mode 100644 index 000000000000..d8f7c6f660ad --- /dev/null +++ b/renderers/server/src/typings.d.ts @@ -0,0 +1,4 @@ +declare module 'global'; + +// will be provided by the webpack define plugin +declare var NODE_ENV: string | undefined; diff --git a/renderers/server/tsconfig.json b/renderers/server/tsconfig.json new file mode 100644 index 000000000000..9b69fbfdaed4 --- /dev/null +++ b/renderers/server/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["src/__tests__/**/*"] +} From c9997c4df3b5735e392af2025e7913ed9f61ffd2 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 16 Apr 2022 15:37:20 +0800 Subject: [PATCH 05/24] Svelte renderer --- app/svelte/package.json | 8 +-- app/svelte/src/client/index.ts | 15 +--- .../server/framework-preset-svelte-docs.ts | 4 +- .../src/server/framework-preset-svelte.ts | 3 +- renderers/svelte/README.md | 1 + renderers/svelte/package.json | 71 +++++++++++++++++++ .../svelte/src}/docs/config.ts | 0 .../svelte/src}/docs/extractArgTypes.test.ts | 0 .../svelte/src}/docs/extractArgTypes.ts | 0 .../docs/extractComponentDescription.test.ts | 0 .../src}/docs/extractComponentDescription.ts | 0 .../svelte/src}/docs/prepareForInline.ts | 0 .../svelte/src}/docs/sample/MockButton.svelte | 0 .../svelte/src}/docs/sourceDecorator.test.ts | 0 .../svelte/src}/docs/sourceDecorator.ts | 0 renderers/svelte/src/index.ts | 14 ++++ .../svelte/src}/preview/config.ts | 0 .../svelte/src}/preview/decorators.ts | 0 .../svelte/src}/preview/globals.ts | 0 .../svelte/src}/preview/index.ts | 0 .../svelte/src}/preview/render.ts | 0 .../svelte/src}/preview/types.ts | 0 renderers/svelte/src/typings.d.ts | 4 ++ renderers/svelte/templates/HOC.svelte | 7 ++ .../svelte/templates/PreviewRender.svelte | 37 ++++++++++ .../svelte/templates/SlotDecorator.svelte | 30 ++++++++ renderers/svelte/tsconfig.json | 17 +++++ 27 files changed, 186 insertions(+), 25 deletions(-) create mode 100644 renderers/svelte/README.md create mode 100644 renderers/svelte/package.json rename {app/svelte/src/client => renderers/svelte/src}/docs/config.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/docs/extractArgTypes.test.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/docs/extractArgTypes.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/docs/extractComponentDescription.test.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/docs/extractComponentDescription.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/docs/prepareForInline.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/docs/sample/MockButton.svelte (100%) rename {app/svelte/src/client => renderers/svelte/src}/docs/sourceDecorator.test.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/docs/sourceDecorator.ts (100%) create mode 100644 renderers/svelte/src/index.ts rename {app/svelte/src/client => renderers/svelte/src}/preview/config.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/preview/decorators.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/preview/globals.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/preview/index.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/preview/render.ts (100%) rename {app/svelte/src/client => renderers/svelte/src}/preview/types.ts (100%) create mode 100644 renderers/svelte/src/typings.d.ts create mode 100644 renderers/svelte/templates/HOC.svelte create mode 100644 renderers/svelte/templates/PreviewRender.svelte create mode 100644 renderers/svelte/templates/SlotDecorator.svelte create mode 100644 renderers/svelte/tsconfig.json diff --git a/app/svelte/package.json b/app/svelte/package.json index 81b1481e3801..c1abbee4a41f 100644 --- a/app/svelte/package.json +++ b/app/svelte/package.json @@ -40,21 +40,15 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.63", - "@storybook/client-logger": "6.5.0-alpha.63", - "@storybook/core-client": "6.5.0-alpha.63", "@storybook/core-common": "6.5.0-alpha.63", "@storybook/core-server": "6.5.0-alpha.63", - "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/docs-tools": "6.5.0-alpha.63", "@storybook/node-logger": "6.5.0-alpha.63", - "@storybook/store": "6.5.0-alpha.63", + "@storybook/renderer-svelte": "6.5.0-alpha.63", "core-js": "^3.8.2", "global": "^4.4.0", "loader-utils": "^2.0.0", "react": "16.14.0", "react-dom": "16.14.0", - "read-pkg-up": "^7.0.1", "regenerator-runtime": "^0.13.7", "sveltedoc-parser": "4.1.0", "ts-dedent": "^2.0.0", diff --git a/app/svelte/src/client/index.ts b/app/svelte/src/client/index.ts index 8034a9d6433d..9b48813943ee 100644 --- a/app/svelte/src/client/index.ts +++ b/app/svelte/src/client/index.ts @@ -1,14 +1 @@ -export { - storiesOf, - setAddon, - addDecorator, - addParameters, - configure, - getStorybook, - forceReRender, - raw, -} from './preview'; - -if (module && module.hot && module.hot.decline) { - module.hot.decline(); -} +export * from '@storybook/renderer-svelte'; diff --git a/app/svelte/src/server/framework-preset-svelte-docs.ts b/app/svelte/src/server/framework-preset-svelte-docs.ts index 4160fc5d40db..24d7905d390e 100644 --- a/app/svelte/src/server/framework-preset-svelte-docs.ts +++ b/app/svelte/src/server/framework-preset-svelte-docs.ts @@ -1,6 +1,6 @@ import path from 'path'; -import { findDistEsm, Options, StorybookConfig } from '@storybook/core-common'; +import { Options, StorybookConfig } from '@storybook/core-common'; type Configuration = any; @@ -18,5 +18,5 @@ export async function webpackFinal(webpackConfig: Configuration, options: Option } export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, findDistEsm(__dirname, 'client/docs/config')]; + return [...entry, require.resolve('@storybook/renderer-svelte/dist/esm/docs/config')]; }; diff --git a/app/svelte/src/server/framework-preset-svelte.ts b/app/svelte/src/server/framework-preset-svelte.ts index d3e10fbf7492..2a0fc4b8ffe7 100644 --- a/app/svelte/src/server/framework-preset-svelte.ts +++ b/app/svelte/src/server/framework-preset-svelte.ts @@ -1,4 +1,3 @@ -import { findDistEsm } from '@storybook/core-common'; import type { Options, StorybookConfig } from '@storybook/core-common'; import type { Configuration } from 'webpack'; @@ -34,5 +33,5 @@ export async function webpack(config: Configuration, options: Options): Promise< } export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, findDistEsm(__dirname, 'client/preview/config')]; + return [...entry, require.resolve('@storybook/renderer-svelte/dist/esm/preview/config')]; }; diff --git a/renderers/svelte/README.md b/renderers/svelte/README.md new file mode 100644 index 000000000000..dfbcd58b9255 --- /dev/null +++ b/renderers/svelte/README.md @@ -0,0 +1 @@ +# Storybook Svelte renderer diff --git a/renderers/svelte/package.json b/renderers/svelte/package.json new file mode 100644 index 000000000000..a08bcf5bc2ca --- /dev/null +++ b/renderers/svelte/package.json @@ -0,0 +1,71 @@ +{ + "name": "@storybook/renderer-svelte", + "version": "6.5.0-alpha.63", + "description": "Storybook Svelte renderer", + "keywords": [ + "storybook" + ], + "homepage": "https://github.com/storybookjs/storybook/tree/main/renderers/svelte", + "bugs": { + "url": "https://github.com/storybookjs/storybook/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/storybookjs/storybook.git", + "directory": "renderers/svelte" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "license": "MIT", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/ts3.9/index.d.ts", + "typesVersions": { + "<3.8": { + "dist/ts3.9/*": [ + "dist/ts3.4/*" + ] + } + }, + "files": [ + "dist/**/*", + "templates/**/*", + "README.md", + "*.js", + "*.d.ts" + ], + "scripts": { + "prepare": "node ../../scripts/prepare.js" + }, + "dependencies": { + "@storybook/addons": "6.5.0-alpha.63", + "@storybook/client-logger": "6.5.0-alpha.63", + "@storybook/core-client": "6.5.0-alpha.63", + "@storybook/csf": "0.0.2--canary.7c6c115.0", + "@storybook/docs-tools": "6.5.0-alpha.63", + "@storybook/store": "6.5.0-alpha.63", + "core-js": "^3.8.2", + "global": "^4.4.0", + "react": "16.14.0", + "react-dom": "16.14.0", + "regenerator-runtime": "^0.13.7", + "sveltedoc-parser": "4.1.0" + }, + "devDependencies": { + "svelte": "^3.31.2" + }, + "peerDependencies": { + "@babel/core": "*", + "svelte": "^3.1.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "416f87dc715cae299c7b4f37f1c9db7f686d4d21", + "sbmodern": "dist/modern/index.js" +} diff --git a/app/svelte/src/client/docs/config.ts b/renderers/svelte/src/docs/config.ts similarity index 100% rename from app/svelte/src/client/docs/config.ts rename to renderers/svelte/src/docs/config.ts diff --git a/app/svelte/src/client/docs/extractArgTypes.test.ts b/renderers/svelte/src/docs/extractArgTypes.test.ts similarity index 100% rename from app/svelte/src/client/docs/extractArgTypes.test.ts rename to renderers/svelte/src/docs/extractArgTypes.test.ts diff --git a/app/svelte/src/client/docs/extractArgTypes.ts b/renderers/svelte/src/docs/extractArgTypes.ts similarity index 100% rename from app/svelte/src/client/docs/extractArgTypes.ts rename to renderers/svelte/src/docs/extractArgTypes.ts diff --git a/app/svelte/src/client/docs/extractComponentDescription.test.ts b/renderers/svelte/src/docs/extractComponentDescription.test.ts similarity index 100% rename from app/svelte/src/client/docs/extractComponentDescription.test.ts rename to renderers/svelte/src/docs/extractComponentDescription.test.ts diff --git a/app/svelte/src/client/docs/extractComponentDescription.ts b/renderers/svelte/src/docs/extractComponentDescription.ts similarity index 100% rename from app/svelte/src/client/docs/extractComponentDescription.ts rename to renderers/svelte/src/docs/extractComponentDescription.ts diff --git a/app/svelte/src/client/docs/prepareForInline.ts b/renderers/svelte/src/docs/prepareForInline.ts similarity index 100% rename from app/svelte/src/client/docs/prepareForInline.ts rename to renderers/svelte/src/docs/prepareForInline.ts diff --git a/app/svelte/src/client/docs/sample/MockButton.svelte b/renderers/svelte/src/docs/sample/MockButton.svelte similarity index 100% rename from app/svelte/src/client/docs/sample/MockButton.svelte rename to renderers/svelte/src/docs/sample/MockButton.svelte diff --git a/app/svelte/src/client/docs/sourceDecorator.test.ts b/renderers/svelte/src/docs/sourceDecorator.test.ts similarity index 100% rename from app/svelte/src/client/docs/sourceDecorator.test.ts rename to renderers/svelte/src/docs/sourceDecorator.test.ts diff --git a/app/svelte/src/client/docs/sourceDecorator.ts b/renderers/svelte/src/docs/sourceDecorator.ts similarity index 100% rename from app/svelte/src/client/docs/sourceDecorator.ts rename to renderers/svelte/src/docs/sourceDecorator.ts diff --git a/renderers/svelte/src/index.ts b/renderers/svelte/src/index.ts new file mode 100644 index 000000000000..8034a9d6433d --- /dev/null +++ b/renderers/svelte/src/index.ts @@ -0,0 +1,14 @@ +export { + storiesOf, + setAddon, + addDecorator, + addParameters, + configure, + getStorybook, + forceReRender, + raw, +} from './preview'; + +if (module && module.hot && module.hot.decline) { + module.hot.decline(); +} diff --git a/app/svelte/src/client/preview/config.ts b/renderers/svelte/src/preview/config.ts similarity index 100% rename from app/svelte/src/client/preview/config.ts rename to renderers/svelte/src/preview/config.ts diff --git a/app/svelte/src/client/preview/decorators.ts b/renderers/svelte/src/preview/decorators.ts similarity index 100% rename from app/svelte/src/client/preview/decorators.ts rename to renderers/svelte/src/preview/decorators.ts diff --git a/app/svelte/src/client/preview/globals.ts b/renderers/svelte/src/preview/globals.ts similarity index 100% rename from app/svelte/src/client/preview/globals.ts rename to renderers/svelte/src/preview/globals.ts diff --git a/app/svelte/src/client/preview/index.ts b/renderers/svelte/src/preview/index.ts similarity index 100% rename from app/svelte/src/client/preview/index.ts rename to renderers/svelte/src/preview/index.ts diff --git a/app/svelte/src/client/preview/render.ts b/renderers/svelte/src/preview/render.ts similarity index 100% rename from app/svelte/src/client/preview/render.ts rename to renderers/svelte/src/preview/render.ts diff --git a/app/svelte/src/client/preview/types.ts b/renderers/svelte/src/preview/types.ts similarity index 100% rename from app/svelte/src/client/preview/types.ts rename to renderers/svelte/src/preview/types.ts diff --git a/renderers/svelte/src/typings.d.ts b/renderers/svelte/src/typings.d.ts new file mode 100644 index 000000000000..153074abe8ca --- /dev/null +++ b/renderers/svelte/src/typings.d.ts @@ -0,0 +1,4 @@ +declare module 'global'; +declare module '@storybook/svelte/templates/SlotDecorator.svelte'; +declare module '@storybook/svelte/templates/PreviewRender.svelte'; +declare module '@storybook/svelte/templates/HOC.svelte'; diff --git a/renderers/svelte/templates/HOC.svelte b/renderers/svelte/templates/HOC.svelte new file mode 100644 index 000000000000..0b6c3618701e --- /dev/null +++ b/renderers/svelte/templates/HOC.svelte @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/renderers/svelte/templates/PreviewRender.svelte b/renderers/svelte/templates/PreviewRender.svelte new file mode 100644 index 000000000000..40c027d6c803 --- /dev/null +++ b/renderers/svelte/templates/PreviewRender.svelte @@ -0,0 +1,37 @@ + + \ No newline at end of file diff --git a/renderers/svelte/templates/SlotDecorator.svelte b/renderers/svelte/templates/SlotDecorator.svelte new file mode 100644 index 000000000000..bd51e06f4271 --- /dev/null +++ b/renderers/svelte/templates/SlotDecorator.svelte @@ -0,0 +1,30 @@ + +{#if decorator} + + + +{:else} + +{/if} \ No newline at end of file diff --git a/renderers/svelte/tsconfig.json b/renderers/svelte/tsconfig.json new file mode 100644 index 000000000000..ea47a78eb476 --- /dev/null +++ b/renderers/svelte/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "types": [ + "webpack-env", + "node" + ], + "resolveJsonModule": true + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "src/**/*.test.*" + ] +} \ No newline at end of file From cf12b7867ed2fc2a391c71108d42bdebf3681fa6 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 16 Apr 2022 15:37:53 +0800 Subject: [PATCH 06/24] Vue renderer --- app/vue/package.json | 7 +- app/vue/src/client/index.ts | 17 +---- .../src/server/framework-preset-vue-docs.ts | 4 +- app/vue/src/server/framework-preset-vue.ts | 3 +- renderers/vue/README.md | 1 + renderers/vue/package.json | 72 +++++++++++++++++++ .../vue/src}/docs/config.ts | 0 .../vue/src}/docs/extractArgTypes.ts | 0 .../vue/src}/docs/prepareForInline.ts | 0 .../vue/src}/docs/sourceDecorator.test.ts | 0 .../vue/src}/docs/sourceDecorator.ts | 0 renderers/vue/src/index.ts | 16 +++++ .../vue/src}/preview/config.ts | 0 .../vue/src}/preview/decorateStory.ts | 0 .../vue/src}/preview/globals.ts | 0 .../vue/src}/preview/index.ts | 0 .../vue/src}/preview/render.ts | 0 .../vue/src}/preview/types-6-0.ts | 0 .../vue/src}/preview/types-7-0.ts | 0 .../vue/src}/preview/types.ts | 0 .../vue/src}/preview/util.ts | 0 renderers/vue/src/typings.d.ts | 1 + renderers/vue/tsconfig.json | 9 +++ 23 files changed, 104 insertions(+), 26 deletions(-) create mode 100644 renderers/vue/README.md create mode 100644 renderers/vue/package.json rename {app/vue/src/client => renderers/vue/src}/docs/config.ts (100%) rename {app/vue/src/client => renderers/vue/src}/docs/extractArgTypes.ts (100%) rename {app/vue/src/client => renderers/vue/src}/docs/prepareForInline.ts (100%) rename {app/vue/src/client => renderers/vue/src}/docs/sourceDecorator.test.ts (100%) rename {app/vue/src/client => renderers/vue/src}/docs/sourceDecorator.ts (100%) create mode 100644 renderers/vue/src/index.ts rename {app/vue/src/client => renderers/vue/src}/preview/config.ts (100%) rename {app/vue/src/client => renderers/vue/src}/preview/decorateStory.ts (100%) rename {app/vue/src/client => renderers/vue/src}/preview/globals.ts (100%) rename {app/vue/src/client => renderers/vue/src}/preview/index.ts (100%) rename {app/vue/src/client => renderers/vue/src}/preview/render.ts (100%) rename {app/vue/src/client => renderers/vue/src}/preview/types-6-0.ts (100%) rename {app/vue/src/client => renderers/vue/src}/preview/types-7-0.ts (100%) rename {app/vue/src/client => renderers/vue/src}/preview/types.ts (100%) rename {app/vue/src/client => renderers/vue/src}/preview/util.ts (100%) create mode 100644 renderers/vue/src/typings.d.ts create mode 100644 renderers/vue/tsconfig.json diff --git a/app/vue/package.json b/app/vue/package.json index e26b1c7f52af..9ce52a8a747e 100644 --- a/app/vue/package.json +++ b/app/vue/package.json @@ -39,21 +39,16 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.63", - "@storybook/client-logger": "6.5.0-alpha.63", - "@storybook/core-client": "6.5.0-alpha.63", "@storybook/core-common": "6.5.0-alpha.63", "@storybook/core-server": "6.5.0-alpha.63", - "@storybook/csf": "0.0.2--canary.7c6c115.0", "@storybook/docs-tools": "6.5.0-alpha.63", - "@storybook/store": "6.5.0-alpha.63", + "@storybook/renderer-vue": "6.5.0-alpha.63", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", "react-dom": "16.14.0", - "read-pkg-up": "^7.0.1", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0", "ts-loader": "^8.0.14", diff --git a/app/vue/src/client/index.ts b/app/vue/src/client/index.ts index 620f2fae5cd0..281c0a2af520 100644 --- a/app/vue/src/client/index.ts +++ b/app/vue/src/client/index.ts @@ -1,16 +1 @@ -export { - storiesOf, - setAddon, - addDecorator, - addParameters, - configure, - getStorybook, - forceReRender, - raw, -} from './preview'; - -export * from './preview/types-6-0'; - -if (module && module.hot && module.hot.decline) { - module.hot.decline(); -} +export * from '@storybook/renderer-vue'; diff --git a/app/vue/src/server/framework-preset-vue-docs.ts b/app/vue/src/server/framework-preset-vue-docs.ts index 984fa07c49c5..efdc2b17ae98 100644 --- a/app/vue/src/server/framework-preset-vue-docs.ts +++ b/app/vue/src/server/framework-preset-vue-docs.ts @@ -1,4 +1,4 @@ -import { findDistEsm, Options, StorybookConfig } from '@storybook/core-common'; +import { Options, StorybookConfig } from '@storybook/core-common'; import { hasDocsOrControls } from '@storybook/docs-tools'; export function webpackFinal(webpackConfig: any = {}, options: Options) { @@ -32,5 +32,5 @@ export function webpackFinal(webpackConfig: any = {}, options: Options) { export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { if (!hasDocsOrControls(options)) return entry; - return [...entry, findDistEsm(__dirname, 'client/docs/config')]; + return [...entry, require.resolve('@storybook/renderer-vue/dist/esm/docs/config')]; }; diff --git a/app/vue/src/server/framework-preset-vue.ts b/app/vue/src/server/framework-preset-vue.ts index 8656d8d35060..29d4b41484a0 100644 --- a/app/vue/src/server/framework-preset-vue.ts +++ b/app/vue/src/server/framework-preset-vue.ts @@ -1,6 +1,5 @@ /* eslint-disable no-param-reassign */ import { VueLoaderPlugin } from 'vue-loader'; -import { findDistEsm } from '@storybook/core-common'; import type { Configuration } from 'webpack'; import type { Options, TypescriptConfig, StorybookConfig } from '@storybook/core-common'; @@ -46,5 +45,5 @@ export async function webpack(config: Configuration, { presets }: Options) { } export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, findDistEsm(__dirname, 'client/preview/config')]; + return [...entry, require.resolve('@storybook/renderer-vue/dist/esm/preview/config')]; }; diff --git a/renderers/vue/README.md b/renderers/vue/README.md new file mode 100644 index 000000000000..af07be8486f4 --- /dev/null +++ b/renderers/vue/README.md @@ -0,0 +1 @@ +# Storybook Vue renderer diff --git a/renderers/vue/package.json b/renderers/vue/package.json new file mode 100644 index 000000000000..13b5ba27de1a --- /dev/null +++ b/renderers/vue/package.json @@ -0,0 +1,72 @@ +{ + "name": "@storybook/renderer-vue", + "version": "6.5.0-alpha.63", + "description": "Storybook Vue renderer", + "keywords": [ + "storybook" + ], + "homepage": "https://github.com/storybookjs/storybook/tree/main/renderers/vue", + "bugs": { + "url": "https://github.com/storybookjs/storybook/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/storybookjs/storybook.git", + "directory": "renderers/vue" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "license": "MIT", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/ts3.9/index.d.ts", + "typesVersions": { + "<3.8": { + "dist/ts3.9/*": [ + "dist/ts3.4/*" + ] + } + }, + "files": [ + "dist/**/*", + "README.md", + "*.js", + "*.d.ts" + ], + "scripts": { + "prepare": "node ../../scripts/prepare.js" + }, + "dependencies": { + "@storybook/addons": "6.5.0-alpha.63", + "@storybook/client-logger": "6.5.0-alpha.63", + "@storybook/core-client": "6.5.0-alpha.63", + "@storybook/csf": "0.0.2--canary.7c6c115.0", + "@storybook/docs-tools": "6.5.0-alpha.63", + "@storybook/store": "6.5.0-alpha.63", + "core-js": "^3.8.2", + "global": "^4.4.0", + "react": "16.14.0", + "react-dom": "16.14.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "devDependencies": { + "vue": "^2.6.12" + }, + "peerDependencies": { + "@babel/core": "*", + "babel-loader": "^7.0.0 || ^8.0.0", + "css-loader": "*", + "vue": "^2.6.8" + }, + "engines": { + "node": ">=10.13.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "416f87dc715cae299c7b4f37f1c9db7f686d4d21", + "sbmodern": "dist/modern/index.js" +} diff --git a/app/vue/src/client/docs/config.ts b/renderers/vue/src/docs/config.ts similarity index 100% rename from app/vue/src/client/docs/config.ts rename to renderers/vue/src/docs/config.ts diff --git a/app/vue/src/client/docs/extractArgTypes.ts b/renderers/vue/src/docs/extractArgTypes.ts similarity index 100% rename from app/vue/src/client/docs/extractArgTypes.ts rename to renderers/vue/src/docs/extractArgTypes.ts diff --git a/app/vue/src/client/docs/prepareForInline.ts b/renderers/vue/src/docs/prepareForInline.ts similarity index 100% rename from app/vue/src/client/docs/prepareForInline.ts rename to renderers/vue/src/docs/prepareForInline.ts diff --git a/app/vue/src/client/docs/sourceDecorator.test.ts b/renderers/vue/src/docs/sourceDecorator.test.ts similarity index 100% rename from app/vue/src/client/docs/sourceDecorator.test.ts rename to renderers/vue/src/docs/sourceDecorator.test.ts diff --git a/app/vue/src/client/docs/sourceDecorator.ts b/renderers/vue/src/docs/sourceDecorator.ts similarity index 100% rename from app/vue/src/client/docs/sourceDecorator.ts rename to renderers/vue/src/docs/sourceDecorator.ts diff --git a/renderers/vue/src/index.ts b/renderers/vue/src/index.ts new file mode 100644 index 000000000000..620f2fae5cd0 --- /dev/null +++ b/renderers/vue/src/index.ts @@ -0,0 +1,16 @@ +export { + storiesOf, + setAddon, + addDecorator, + addParameters, + configure, + getStorybook, + forceReRender, + raw, +} from './preview'; + +export * from './preview/types-6-0'; + +if (module && module.hot && module.hot.decline) { + module.hot.decline(); +} diff --git a/app/vue/src/client/preview/config.ts b/renderers/vue/src/preview/config.ts similarity index 100% rename from app/vue/src/client/preview/config.ts rename to renderers/vue/src/preview/config.ts diff --git a/app/vue/src/client/preview/decorateStory.ts b/renderers/vue/src/preview/decorateStory.ts similarity index 100% rename from app/vue/src/client/preview/decorateStory.ts rename to renderers/vue/src/preview/decorateStory.ts diff --git a/app/vue/src/client/preview/globals.ts b/renderers/vue/src/preview/globals.ts similarity index 100% rename from app/vue/src/client/preview/globals.ts rename to renderers/vue/src/preview/globals.ts diff --git a/app/vue/src/client/preview/index.ts b/renderers/vue/src/preview/index.ts similarity index 100% rename from app/vue/src/client/preview/index.ts rename to renderers/vue/src/preview/index.ts diff --git a/app/vue/src/client/preview/render.ts b/renderers/vue/src/preview/render.ts similarity index 100% rename from app/vue/src/client/preview/render.ts rename to renderers/vue/src/preview/render.ts diff --git a/app/vue/src/client/preview/types-6-0.ts b/renderers/vue/src/preview/types-6-0.ts similarity index 100% rename from app/vue/src/client/preview/types-6-0.ts rename to renderers/vue/src/preview/types-6-0.ts diff --git a/app/vue/src/client/preview/types-7-0.ts b/renderers/vue/src/preview/types-7-0.ts similarity index 100% rename from app/vue/src/client/preview/types-7-0.ts rename to renderers/vue/src/preview/types-7-0.ts diff --git a/app/vue/src/client/preview/types.ts b/renderers/vue/src/preview/types.ts similarity index 100% rename from app/vue/src/client/preview/types.ts rename to renderers/vue/src/preview/types.ts diff --git a/app/vue/src/client/preview/util.ts b/renderers/vue/src/preview/util.ts similarity index 100% rename from app/vue/src/client/preview/util.ts rename to renderers/vue/src/preview/util.ts diff --git a/renderers/vue/src/typings.d.ts b/renderers/vue/src/typings.d.ts new file mode 100644 index 000000000000..2f4eb9cf4fd9 --- /dev/null +++ b/renderers/vue/src/typings.d.ts @@ -0,0 +1 @@ +declare module 'global'; diff --git a/renderers/vue/tsconfig.json b/renderers/vue/tsconfig.json new file mode 100644 index 000000000000..b704f2ec95c9 --- /dev/null +++ b/renderers/vue/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "resolveJsonModule": true + }, + "include": ["src/**/*"], + "exclude": ["src/**/*.test.*"] +} From 83d13b2c92ce5d379ae89e7f6f0934db6deae710 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 16 Apr 2022 15:38:25 +0800 Subject: [PATCH 07/24] Vue3 renderer --- app/vue3/package.json | 6 +- app/vue3/src/client/index.ts | 19 +---- .../src/server/framework-preset-vue3-docs.ts | 3 +- app/vue3/src/server/framework-preset-vue3.ts | 3 +- renderers/vue3/README.md | 1 + renderers/vue3/package.json | 71 +++++++++++++++++++ .../vue3/src}/docs/config.ts | 0 .../vue3/src}/docs/extractArgTypes.ts | 0 .../vue3/src}/docs/prepareForInline.ts | 0 renderers/vue3/src/index.ts | 18 +++++ .../vue3/src}/preview/config.ts | 0 .../vue3/src}/preview/decorateStory.ts | 0 .../vue3/src}/preview/globals.ts | 0 .../vue3/src}/preview/index.ts | 0 .../vue3/src}/preview/render.ts | 0 .../vue3/src}/preview/types-6-0.ts | 0 .../vue3/src}/preview/types-7-0.ts | 0 .../vue3/src}/preview/types.ts | 0 renderers/vue3/src/typings.d.ts | 5 ++ renderers/vue3/tsconfig.json | 10 +++ 20 files changed, 109 insertions(+), 27 deletions(-) create mode 100644 renderers/vue3/README.md create mode 100644 renderers/vue3/package.json rename {app/vue3/src/client => renderers/vue3/src}/docs/config.ts (100%) rename {app/vue3/src/client => renderers/vue3/src}/docs/extractArgTypes.ts (100%) rename {app/vue3/src/client => renderers/vue3/src}/docs/prepareForInline.ts (100%) create mode 100644 renderers/vue3/src/index.ts rename {app/vue3/src/client => renderers/vue3/src}/preview/config.ts (100%) rename {app/vue3/src/client => renderers/vue3/src}/preview/decorateStory.ts (100%) rename {app/vue3/src/client => renderers/vue3/src}/preview/globals.ts (100%) rename {app/vue3/src/client => renderers/vue3/src}/preview/index.ts (100%) rename {app/vue3/src/client => renderers/vue3/src}/preview/render.ts (100%) rename {app/vue3/src/client => renderers/vue3/src}/preview/types-6-0.ts (100%) rename {app/vue3/src/client => renderers/vue3/src}/preview/types-7-0.ts (100%) rename {app/vue3/src/client => renderers/vue3/src}/preview/types.ts (100%) create mode 100644 renderers/vue3/src/typings.d.ts create mode 100644 renderers/vue3/tsconfig.json diff --git a/app/vue3/package.json b/app/vue3/package.json index a0a2401b5889..47fe070dffef 100644 --- a/app/vue3/package.json +++ b/app/vue3/package.json @@ -40,20 +40,16 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.63", - "@storybook/core-client": "6.5.0-alpha.63", "@storybook/core-common": "6.5.0-alpha.63", "@storybook/core-server": "6.5.0-alpha.63", - "@storybook/csf": "0.0.2--canary.7c6c115.0", "@storybook/docs-tools": "6.5.0-alpha.63", - "@storybook/store": "6.5.0-alpha.63", + "@storybook/renderer-vue3": "6.5.0-alpha.63", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", "react-dom": "16.14.0", - "read-pkg-up": "^7.0.1", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0", "ts-loader": "^8.0.14", diff --git a/app/vue3/src/client/index.ts b/app/vue3/src/client/index.ts index de13a1bc49ff..2d687b57f660 100644 --- a/app/vue3/src/client/index.ts +++ b/app/vue3/src/client/index.ts @@ -1,18 +1 @@ -export { - storiesOf, - setAddon, - addDecorator, - addParameters, - configure, - getStorybook, - forceReRender, - raw, - app, - activeStoryComponent, -} from './preview'; - -export * from './preview/types-6-0'; - -if (module && module.hot && module.hot.decline) { - module.hot.decline(); -} +export * from '@storybook/renderer-vue3'; diff --git a/app/vue3/src/server/framework-preset-vue3-docs.ts b/app/vue3/src/server/framework-preset-vue3-docs.ts index b97af76f15ff..57e52125351a 100644 --- a/app/vue3/src/server/framework-preset-vue3-docs.ts +++ b/app/vue3/src/server/framework-preset-vue3-docs.ts @@ -1,5 +1,4 @@ import type { Options, StorybookConfig } from '@storybook/core-common'; -import { findDistEsm } from '@storybook/core-common'; import { hasDocsOrControls } from '@storybook/docs-tools'; export function webpackFinal(webpackConfig: any = {}, options: Options) { @@ -33,5 +32,5 @@ export function webpackFinal(webpackConfig: any = {}, options: Options) { export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { if (!hasDocsOrControls(options)) return entry; - return [...entry, findDistEsm(__dirname, 'client/docs/config')]; + return [...entry, require.resolve('@storybook/renderer-vue3/dist/esm/docs/config')]; }; diff --git a/app/vue3/src/server/framework-preset-vue3.ts b/app/vue3/src/server/framework-preset-vue3.ts index fb4dc76a2886..5d875db5f2bf 100644 --- a/app/vue3/src/server/framework-preset-vue3.ts +++ b/app/vue3/src/server/framework-preset-vue3.ts @@ -1,6 +1,5 @@ import { VueLoaderPlugin } from 'vue-loader'; import { Configuration, DefinePlugin } from 'webpack'; -import { findDistEsm } from '@storybook/core-common'; import type { StorybookConfig } from '@storybook/core-common'; export function webpack(config: Configuration): Configuration { @@ -49,5 +48,5 @@ export function webpack(config: Configuration): Configuration { } export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, findDistEsm(__dirname, 'client/preview/config')]; + return [...entry, require.resolve('@storybook/renderer-vue3/dist/esm/preview/config')]; }; diff --git a/renderers/vue3/README.md b/renderers/vue3/README.md new file mode 100644 index 000000000000..231d7cb27e13 --- /dev/null +++ b/renderers/vue3/README.md @@ -0,0 +1 @@ +# Storybook Vue3 renderer diff --git a/renderers/vue3/package.json b/renderers/vue3/package.json new file mode 100644 index 000000000000..dfcea049ac23 --- /dev/null +++ b/renderers/vue3/package.json @@ -0,0 +1,71 @@ +{ + "name": "@storybook/renderer-vue3", + "version": "6.5.0-alpha.63", + "description": "Storybook Vue 3 renderer", + "keywords": [ + "storybook" + ], + "homepage": "https://github.com/storybookjs/storybook/tree/main/renderers/vue3", + "bugs": { + "url": "https://github.com/storybookjs/storybook/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/storybookjs/storybook.git", + "directory": "renderers/vue3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "license": "MIT", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/ts3.9/index.d.ts", + "typesVersions": { + "<3.8": { + "dist/ts3.9/*": [ + "dist/ts3.4/*" + ] + } + }, + "files": [ + "bin/**/*", + "dist/**/*", + "README.md", + "*.js", + "*.d.ts" + ], + "scripts": { + "prepare": "node ../../scripts/prepare.js" + }, + "dependencies": { + "@storybook/addons": "6.5.0-alpha.63", + "@storybook/core-client": "6.5.0-alpha.63", + "@storybook/csf": "0.0.2--canary.7c6c115.0", + "@storybook/docs-tools": "6.5.0-alpha.63", + "@storybook/store": "6.5.0-alpha.63", + "core-js": "^3.8.2", + "global": "^4.4.0", + "react": "16.14.0", + "react-dom": "16.14.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "devDependencies": { + "vue": "3.0.0" + }, + "peerDependencies": { + "@babel/core": "*", + "babel-loader": "^7.0.0 || ^8.0.0", + "vue": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "416f87dc715cae299c7b4f37f1c9db7f686d4d21", + "sbmodern": "dist/modern/index.js" +} diff --git a/app/vue3/src/client/docs/config.ts b/renderers/vue3/src/docs/config.ts similarity index 100% rename from app/vue3/src/client/docs/config.ts rename to renderers/vue3/src/docs/config.ts diff --git a/app/vue3/src/client/docs/extractArgTypes.ts b/renderers/vue3/src/docs/extractArgTypes.ts similarity index 100% rename from app/vue3/src/client/docs/extractArgTypes.ts rename to renderers/vue3/src/docs/extractArgTypes.ts diff --git a/app/vue3/src/client/docs/prepareForInline.ts b/renderers/vue3/src/docs/prepareForInline.ts similarity index 100% rename from app/vue3/src/client/docs/prepareForInline.ts rename to renderers/vue3/src/docs/prepareForInline.ts diff --git a/renderers/vue3/src/index.ts b/renderers/vue3/src/index.ts new file mode 100644 index 000000000000..de13a1bc49ff --- /dev/null +++ b/renderers/vue3/src/index.ts @@ -0,0 +1,18 @@ +export { + storiesOf, + setAddon, + addDecorator, + addParameters, + configure, + getStorybook, + forceReRender, + raw, + app, + activeStoryComponent, +} from './preview'; + +export * from './preview/types-6-0'; + +if (module && module.hot && module.hot.decline) { + module.hot.decline(); +} diff --git a/app/vue3/src/client/preview/config.ts b/renderers/vue3/src/preview/config.ts similarity index 100% rename from app/vue3/src/client/preview/config.ts rename to renderers/vue3/src/preview/config.ts diff --git a/app/vue3/src/client/preview/decorateStory.ts b/renderers/vue3/src/preview/decorateStory.ts similarity index 100% rename from app/vue3/src/client/preview/decorateStory.ts rename to renderers/vue3/src/preview/decorateStory.ts diff --git a/app/vue3/src/client/preview/globals.ts b/renderers/vue3/src/preview/globals.ts similarity index 100% rename from app/vue3/src/client/preview/globals.ts rename to renderers/vue3/src/preview/globals.ts diff --git a/app/vue3/src/client/preview/index.ts b/renderers/vue3/src/preview/index.ts similarity index 100% rename from app/vue3/src/client/preview/index.ts rename to renderers/vue3/src/preview/index.ts diff --git a/app/vue3/src/client/preview/render.ts b/renderers/vue3/src/preview/render.ts similarity index 100% rename from app/vue3/src/client/preview/render.ts rename to renderers/vue3/src/preview/render.ts diff --git a/app/vue3/src/client/preview/types-6-0.ts b/renderers/vue3/src/preview/types-6-0.ts similarity index 100% rename from app/vue3/src/client/preview/types-6-0.ts rename to renderers/vue3/src/preview/types-6-0.ts diff --git a/app/vue3/src/client/preview/types-7-0.ts b/renderers/vue3/src/preview/types-7-0.ts similarity index 100% rename from app/vue3/src/client/preview/types-7-0.ts rename to renderers/vue3/src/preview/types-7-0.ts diff --git a/app/vue3/src/client/preview/types.ts b/renderers/vue3/src/preview/types.ts similarity index 100% rename from app/vue3/src/client/preview/types.ts rename to renderers/vue3/src/preview/types.ts diff --git a/renderers/vue3/src/typings.d.ts b/renderers/vue3/src/typings.d.ts new file mode 100644 index 000000000000..4dd567187328 --- /dev/null +++ b/renderers/vue3/src/typings.d.ts @@ -0,0 +1,5 @@ +declare module 'global'; + +declare module 'vue-loader' { + export const VueLoaderPlugin: any +} diff --git a/renderers/vue3/tsconfig.json b/renderers/vue3/tsconfig.json new file mode 100644 index 000000000000..fa8810ab78ad --- /dev/null +++ b/renderers/vue3/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "resolveJsonModule": true, + "skipLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["src/**/*.test.*"] +} From 76c1925c15a47a0e8fe9b2fa6c167b6d4d25d654 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 16 Apr 2022 15:39:05 +0800 Subject: [PATCH 08/24] Web components renderer --- app/web-components/package.json | 9 +-- app/web-components/src/client/index.ts | 44 +---------- .../framework-preset-web-components-docs.ts | 4 +- .../server/framework-preset-web-components.ts | 4 +- .../web-components-kitchen-sink/package.json | 1 + .../web-components-kitchen-sink/yarn.lock | 32 ++++++-- renderers/web-components/README.md | 1 + renderers/web-components/package.json | 73 +++++++++++++++++++ .../web-components/src}/customElements.ts | 0 .../__testfixtures__/custom-elements.json | 0 .../custom-elements.snapshot | 0 .../lit-element-demo-card/input.js | 0 .../lit-element-demo-card/properties.snapshot | 0 .../lit-html-welcome/custom-elements.snapshot | 0 .../lit-html-welcome/input.js | 0 .../lit-html-welcome/properties.snapshot | 0 .../web-components/src}/docs/config.ts | 0 .../src}/docs/custom-elements.test.ts | 0 .../src}/docs/custom-elements.ts | 0 .../src}/docs/prepareForInline.ts | 0 .../src}/docs/sourceDecorator.test.ts | 0 .../src}/docs/sourceDecorator.ts | 0 .../docs/web-components-properties.test.ts | 0 renderers/web-components/src/index.ts | 43 +++++++++++ .../web-components/src}/preview/config.ts | 0 .../web-components/src}/preview/globals.ts | 0 .../web-components/src}/preview/index.ts | 0 .../web-components/src}/preview/render.ts | 0 .../web-components/src}/preview/types-6-0.ts | 0 .../web-components/src}/preview/types-7-0.ts | 0 .../web-components/src}/preview/types.ts | 0 renderers/web-components/src/typings.d.ts | 4 + renderers/web-components/tsconfig.json | 8 ++ 33 files changed, 159 insertions(+), 64 deletions(-) create mode 100644 renderers/web-components/README.md create mode 100644 renderers/web-components/package.json rename {app/web-components/src/client => renderers/web-components/src}/customElements.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/__testfixtures__/custom-elements.json (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/__testfixtures__/lit-element-demo-card/custom-elements.snapshot (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/__testfixtures__/lit-element-demo-card/input.js (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/__testfixtures__/lit-element-demo-card/properties.snapshot (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/__testfixtures__/lit-html-welcome/custom-elements.snapshot (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/__testfixtures__/lit-html-welcome/input.js (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/__testfixtures__/lit-html-welcome/properties.snapshot (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/config.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/custom-elements.test.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/custom-elements.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/prepareForInline.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/sourceDecorator.test.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/sourceDecorator.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/docs/web-components-properties.test.ts (100%) create mode 100644 renderers/web-components/src/index.ts rename {app/web-components/src/client => renderers/web-components/src}/preview/config.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/preview/globals.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/preview/index.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/preview/render.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/preview/types-6-0.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/preview/types-7-0.ts (100%) rename {app/web-components/src/client => renderers/web-components/src}/preview/types.ts (100%) create mode 100644 renderers/web-components/src/typings.d.ts create mode 100644 renderers/web-components/tsconfig.json diff --git a/app/web-components/package.json b/app/web-components/package.json index db0717b923c1..64bd77378f66 100644 --- a/app/web-components/package.json +++ b/app/web-components/package.json @@ -44,16 +44,10 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/preset-env": "^7.12.11", - "@storybook/addons": "6.5.0-alpha.63", - "@storybook/client-api": "6.5.0-alpha.63", - "@storybook/client-logger": "6.5.0-alpha.63", - "@storybook/core-client": "6.5.0-alpha.63", "@storybook/core-common": "6.5.0-alpha.63", "@storybook/core-server": "6.5.0-alpha.63", - "@storybook/csf": "0.0.2--canary.7c6c115.0", "@storybook/docs-tools": "6.5.0-alpha.63", - "@storybook/preview-web": "6.5.0-alpha.63", - "@storybook/store": "6.5.0-alpha.63", + "@storybook/renderer-web-components": "6.5.0-alpha.63", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "babel-plugin-bundled-import-meta": "^0.3.1", @@ -61,7 +55,6 @@ "global": "^4.4.0", "react": "16.14.0", "react-dom": "16.14.0", - "read-pkg-up": "^7.0.1", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0" }, diff --git a/app/web-components/src/client/index.ts b/app/web-components/src/client/index.ts index d43a49b2fa31..c90b9d19c452 100644 --- a/app/web-components/src/client/index.ts +++ b/app/web-components/src/client/index.ts @@ -1,43 +1 @@ -import global from 'global'; - -const { window, EventSource } = global; - -export { - storiesOf, - setAddon, - addDecorator, - addParameters, - configure, - getStorybook, - forceReRender, - raw, -} from './preview'; - -export { - getCustomElements, - setCustomElements, - setCustomElementsManifest, - isValidComponent, - isValidMetaData, -} from './customElements'; - -export * from './preview/types-6-0'; - -// TODO: disable HMR and do full page loads because of customElements.define -if (module && module.hot && module.hot.decline) { - module.hot.decline(); - - // forcing full reloads for customElements as elements can only be defined once per page - const hmr = new EventSource('__webpack_hmr'); - hmr.addEventListener('message', function fullPageReload(event: { data: string }) { - try { - // Only care for built events. Heartbeats are not parsable so we ignore those - const { action } = JSON.parse(event.data); - if (action === 'built') { - window.location.reload(); - } - } catch (error) { - // Most part we only get here from the data in the server-sent event not being parsable which is ok - } - }); -} +export * from '@storybook/renderer-web-components'; diff --git a/app/web-components/src/server/framework-preset-web-components-docs.ts b/app/web-components/src/server/framework-preset-web-components-docs.ts index 31ccb922f3f1..db6b053b71e3 100644 --- a/app/web-components/src/server/framework-preset-web-components-docs.ts +++ b/app/web-components/src/server/framework-preset-web-components-docs.ts @@ -1,7 +1,7 @@ -import { findDistEsm, StorybookConfig } from '@storybook/core-common'; +import { StorybookConfig } from '@storybook/core-common'; import { hasDocsOrControls } from '@storybook/docs-tools'; export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { if (!hasDocsOrControls(options)) return entry; - return [...entry, findDistEsm(__dirname, 'client/docs/config')]; + return [...entry, require.resolve('@storybook/renderer-web-components/dist/esm/docs/config')]; }; diff --git a/app/web-components/src/server/framework-preset-web-components.ts b/app/web-components/src/server/framework-preset-web-components.ts index 19c537420947..c8434cab4d5a 100644 --- a/app/web-components/src/server/framework-preset-web-components.ts +++ b/app/web-components/src/server/framework-preset-web-components.ts @@ -1,5 +1,3 @@ -import { findDistEsm } from '@storybook/core-common'; - import type { Options, StorybookConfig } from '@storybook/core-common'; import type { Configuration } from 'webpack'; @@ -42,5 +40,5 @@ export function webpack(config: Configuration, options: Options) { } export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, findDistEsm(__dirname, 'client/preview/config')]; + return [...entry, require.resolve('@storybook/renderer-web-components/dist/esm/preview/config')]; }; diff --git a/examples/web-components-kitchen-sink/package.json b/examples/web-components-kitchen-sink/package.json index b4a79b278fea..a856755f1b64 100644 --- a/examples/web-components-kitchen-sink/package.json +++ b/examples/web-components-kitchen-sink/package.json @@ -47,6 +47,7 @@ "@storybook/node-logger": "portal:../../lib/node-logger", "@storybook/postinstall": "portal:../../lib/postinstall", "@storybook/preview-web": "portal:../../lib/preview-web", + "@storybook/renderer-web-components": "portal:../../renderers/web-components", "@storybook/router": "portal:../../lib/router", "@storybook/source-loader": "portal:../../lib/source-loader", "@storybook/store": "portal:../../lib/store", diff --git a/examples/web-components-kitchen-sink/yarn.lock b/examples/web-components-kitchen-sink/yarn.lock index 57e791e38af7..fb5cbc88fb98 100644 --- a/examples/web-components-kitchen-sink/yarn.lock +++ b/examples/web-components-kitchen-sink/yarn.lock @@ -3001,6 +3001,29 @@ __metadata: languageName: node linkType: soft +"@storybook/renderer-web-components@portal:../../renderers/web-components::locator=web-components-kitchen-sink%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@storybook/renderer-web-components@portal:../../renderers/web-components::locator=web-components-kitchen-sink%40workspace%3A." + dependencies: + "@storybook/addons": 6.5.0-alpha.63 + "@storybook/api": 6.5.0-alpha.63 + "@storybook/client-logger": 6.5.0-alpha.63 + "@storybook/core-client": 6.5.0-alpha.63 + "@storybook/csf": 0.0.2--canary.7c6c115.0 + "@storybook/docs-tools": 6.5.0-alpha.63 + "@storybook/preview-web": 6.5.0-alpha.63 + "@storybook/store": 6.5.0-alpha.63 + core-js: ^3.8.2 + global: ^4.4.0 + react: 16.14.0 + react-dom: 16.14.0 + regenerator-runtime: ^0.13.7 + ts-dedent: ^2.0.0 + peerDependencies: + lit-html: ^1.4.1 || ^2.0.0 + languageName: node + linkType: soft + "@storybook/router@portal:../../lib/router::locator=web-components-kitchen-sink%40workspace%3A.": version: 0.0.0-use.local resolution: "@storybook/router@portal:../../lib/router::locator=web-components-kitchen-sink%40workspace%3A." @@ -3113,16 +3136,10 @@ __metadata: "@babel/plugin-syntax-dynamic-import": ^7.8.3 "@babel/plugin-syntax-import-meta": ^7.10.4 "@babel/preset-env": ^7.12.11 - "@storybook/addons": 6.5.0-alpha.63 - "@storybook/client-api": 6.5.0-alpha.63 - "@storybook/client-logger": 6.5.0-alpha.63 - "@storybook/core-client": 6.5.0-alpha.63 "@storybook/core-common": 6.5.0-alpha.63 "@storybook/core-server": 6.5.0-alpha.63 - "@storybook/csf": 0.0.2--canary.7c6c115.0 "@storybook/docs-tools": 6.5.0-alpha.63 - "@storybook/preview-web": 6.5.0-alpha.63 - "@storybook/store": 6.5.0-alpha.63 + "@storybook/renderer-web-components": 6.5.0-alpha.63 "@types/node": ^14.14.20 || ^16.0.0 "@types/webpack-env": ^1.16.0 babel-plugin-bundled-import-meta: ^0.3.1 @@ -3130,7 +3147,6 @@ __metadata: global: ^4.4.0 react: 16.14.0 react-dom: 16.14.0 - read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 ts-dedent: ^2.0.0 peerDependencies: diff --git a/renderers/web-components/README.md b/renderers/web-components/README.md new file mode 100644 index 000000000000..3bf7e926ac59 --- /dev/null +++ b/renderers/web-components/README.md @@ -0,0 +1 @@ +# Storybook web-components renderer diff --git a/renderers/web-components/package.json b/renderers/web-components/package.json new file mode 100644 index 000000000000..ee869f5c23d2 --- /dev/null +++ b/renderers/web-components/package.json @@ -0,0 +1,73 @@ +{ + "name": "@storybook/renderer-web-components", + "version": "6.5.0-alpha.63", + "description": "Storybook web-components renderer", + "keywords": [ + "lit-html", + "storybook", + "web-components" + ], + "homepage": "https://github.com/storybookjs/storybook/tree/main/renderers/web-components", + "bugs": { + "url": "https://github.com/storybookjs/storybook/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/storybookjs/storybook.git", + "directory": "renderers/web-components" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "license": "MIT", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/ts3.9/index.d.ts", + "typesVersions": { + "<3.8": { + "dist/ts3.9/*": [ + "dist/ts3.4/*" + ] + } + }, + "files": [ + "dist/**/*", + "README.md", + "*.js", + "*.d.ts" + ], + "scripts": { + "prepare": "node ../../scripts/prepare.js" + }, + "dependencies": { + "@storybook/addons": "6.5.0-alpha.63", + "@storybook/api": "6.5.0-alpha.63", + "@storybook/client-logger": "6.5.0-alpha.63", + "@storybook/core-client": "6.5.0-alpha.63", + "@storybook/csf": "0.0.2--canary.7c6c115.0", + "@storybook/docs-tools": "6.5.0-alpha.63", + "@storybook/preview-web": "6.5.0-alpha.63", + "@storybook/store": "6.5.0-alpha.63", + "core-js": "^3.8.2", + "global": "^4.4.0", + "react": "16.14.0", + "react-dom": "16.14.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "devDependencies": { + "lit-html": "2.0.2" + }, + "peerDependencies": { + "lit-html": "^1.4.1 || ^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "publishConfig": { + "access": "public" + }, + "gitHead": "416f87dc715cae299c7b4f37f1c9db7f686d4d21", + "sbmodern": "dist/modern/index.js" +} diff --git a/app/web-components/src/client/customElements.ts b/renderers/web-components/src/customElements.ts similarity index 100% rename from app/web-components/src/client/customElements.ts rename to renderers/web-components/src/customElements.ts diff --git a/app/web-components/src/client/docs/__testfixtures__/custom-elements.json b/renderers/web-components/src/docs/__testfixtures__/custom-elements.json similarity index 100% rename from app/web-components/src/client/docs/__testfixtures__/custom-elements.json rename to renderers/web-components/src/docs/__testfixtures__/custom-elements.json diff --git a/app/web-components/src/client/docs/__testfixtures__/lit-element-demo-card/custom-elements.snapshot b/renderers/web-components/src/docs/__testfixtures__/lit-element-demo-card/custom-elements.snapshot similarity index 100% rename from app/web-components/src/client/docs/__testfixtures__/lit-element-demo-card/custom-elements.snapshot rename to renderers/web-components/src/docs/__testfixtures__/lit-element-demo-card/custom-elements.snapshot diff --git a/app/web-components/src/client/docs/__testfixtures__/lit-element-demo-card/input.js b/renderers/web-components/src/docs/__testfixtures__/lit-element-demo-card/input.js similarity index 100% rename from app/web-components/src/client/docs/__testfixtures__/lit-element-demo-card/input.js rename to renderers/web-components/src/docs/__testfixtures__/lit-element-demo-card/input.js diff --git a/app/web-components/src/client/docs/__testfixtures__/lit-element-demo-card/properties.snapshot b/renderers/web-components/src/docs/__testfixtures__/lit-element-demo-card/properties.snapshot similarity index 100% rename from app/web-components/src/client/docs/__testfixtures__/lit-element-demo-card/properties.snapshot rename to renderers/web-components/src/docs/__testfixtures__/lit-element-demo-card/properties.snapshot diff --git a/app/web-components/src/client/docs/__testfixtures__/lit-html-welcome/custom-elements.snapshot b/renderers/web-components/src/docs/__testfixtures__/lit-html-welcome/custom-elements.snapshot similarity index 100% rename from app/web-components/src/client/docs/__testfixtures__/lit-html-welcome/custom-elements.snapshot rename to renderers/web-components/src/docs/__testfixtures__/lit-html-welcome/custom-elements.snapshot diff --git a/app/web-components/src/client/docs/__testfixtures__/lit-html-welcome/input.js b/renderers/web-components/src/docs/__testfixtures__/lit-html-welcome/input.js similarity index 100% rename from app/web-components/src/client/docs/__testfixtures__/lit-html-welcome/input.js rename to renderers/web-components/src/docs/__testfixtures__/lit-html-welcome/input.js diff --git a/app/web-components/src/client/docs/__testfixtures__/lit-html-welcome/properties.snapshot b/renderers/web-components/src/docs/__testfixtures__/lit-html-welcome/properties.snapshot similarity index 100% rename from app/web-components/src/client/docs/__testfixtures__/lit-html-welcome/properties.snapshot rename to renderers/web-components/src/docs/__testfixtures__/lit-html-welcome/properties.snapshot diff --git a/app/web-components/src/client/docs/config.ts b/renderers/web-components/src/docs/config.ts similarity index 100% rename from app/web-components/src/client/docs/config.ts rename to renderers/web-components/src/docs/config.ts diff --git a/app/web-components/src/client/docs/custom-elements.test.ts b/renderers/web-components/src/docs/custom-elements.test.ts similarity index 100% rename from app/web-components/src/client/docs/custom-elements.test.ts rename to renderers/web-components/src/docs/custom-elements.test.ts diff --git a/app/web-components/src/client/docs/custom-elements.ts b/renderers/web-components/src/docs/custom-elements.ts similarity index 100% rename from app/web-components/src/client/docs/custom-elements.ts rename to renderers/web-components/src/docs/custom-elements.ts diff --git a/app/web-components/src/client/docs/prepareForInline.ts b/renderers/web-components/src/docs/prepareForInline.ts similarity index 100% rename from app/web-components/src/client/docs/prepareForInline.ts rename to renderers/web-components/src/docs/prepareForInline.ts diff --git a/app/web-components/src/client/docs/sourceDecorator.test.ts b/renderers/web-components/src/docs/sourceDecorator.test.ts similarity index 100% rename from app/web-components/src/client/docs/sourceDecorator.test.ts rename to renderers/web-components/src/docs/sourceDecorator.test.ts diff --git a/app/web-components/src/client/docs/sourceDecorator.ts b/renderers/web-components/src/docs/sourceDecorator.ts similarity index 100% rename from app/web-components/src/client/docs/sourceDecorator.ts rename to renderers/web-components/src/docs/sourceDecorator.ts diff --git a/app/web-components/src/client/docs/web-components-properties.test.ts b/renderers/web-components/src/docs/web-components-properties.test.ts similarity index 100% rename from app/web-components/src/client/docs/web-components-properties.test.ts rename to renderers/web-components/src/docs/web-components-properties.test.ts diff --git a/renderers/web-components/src/index.ts b/renderers/web-components/src/index.ts new file mode 100644 index 000000000000..d43a49b2fa31 --- /dev/null +++ b/renderers/web-components/src/index.ts @@ -0,0 +1,43 @@ +import global from 'global'; + +const { window, EventSource } = global; + +export { + storiesOf, + setAddon, + addDecorator, + addParameters, + configure, + getStorybook, + forceReRender, + raw, +} from './preview'; + +export { + getCustomElements, + setCustomElements, + setCustomElementsManifest, + isValidComponent, + isValidMetaData, +} from './customElements'; + +export * from './preview/types-6-0'; + +// TODO: disable HMR and do full page loads because of customElements.define +if (module && module.hot && module.hot.decline) { + module.hot.decline(); + + // forcing full reloads for customElements as elements can only be defined once per page + const hmr = new EventSource('__webpack_hmr'); + hmr.addEventListener('message', function fullPageReload(event: { data: string }) { + try { + // Only care for built events. Heartbeats are not parsable so we ignore those + const { action } = JSON.parse(event.data); + if (action === 'built') { + window.location.reload(); + } + } catch (error) { + // Most part we only get here from the data in the server-sent event not being parsable which is ok + } + }); +} diff --git a/app/web-components/src/client/preview/config.ts b/renderers/web-components/src/preview/config.ts similarity index 100% rename from app/web-components/src/client/preview/config.ts rename to renderers/web-components/src/preview/config.ts diff --git a/app/web-components/src/client/preview/globals.ts b/renderers/web-components/src/preview/globals.ts similarity index 100% rename from app/web-components/src/client/preview/globals.ts rename to renderers/web-components/src/preview/globals.ts diff --git a/app/web-components/src/client/preview/index.ts b/renderers/web-components/src/preview/index.ts similarity index 100% rename from app/web-components/src/client/preview/index.ts rename to renderers/web-components/src/preview/index.ts diff --git a/app/web-components/src/client/preview/render.ts b/renderers/web-components/src/preview/render.ts similarity index 100% rename from app/web-components/src/client/preview/render.ts rename to renderers/web-components/src/preview/render.ts diff --git a/app/web-components/src/client/preview/types-6-0.ts b/renderers/web-components/src/preview/types-6-0.ts similarity index 100% rename from app/web-components/src/client/preview/types-6-0.ts rename to renderers/web-components/src/preview/types-6-0.ts diff --git a/app/web-components/src/client/preview/types-7-0.ts b/renderers/web-components/src/preview/types-7-0.ts similarity index 100% rename from app/web-components/src/client/preview/types-7-0.ts rename to renderers/web-components/src/preview/types-7-0.ts diff --git a/app/web-components/src/client/preview/types.ts b/renderers/web-components/src/preview/types.ts similarity index 100% rename from app/web-components/src/client/preview/types.ts rename to renderers/web-components/src/preview/types.ts diff --git a/renderers/web-components/src/typings.d.ts b/renderers/web-components/src/typings.d.ts new file mode 100644 index 000000000000..d8f7c6f660ad --- /dev/null +++ b/renderers/web-components/src/typings.d.ts @@ -0,0 +1,4 @@ +declare module 'global'; + +// will be provided by the webpack define plugin +declare var NODE_ENV: string | undefined; diff --git a/renderers/web-components/tsconfig.json b/renderers/web-components/tsconfig.json new file mode 100644 index 000000000000..c4b475a389fc --- /dev/null +++ b/renderers/web-components/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["src/**/*.test.*", "src/__tests__/**/*"] +} From b834fafaa476f972736db0070760adc87c5d5794 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 16 Apr 2022 15:39:45 +0800 Subject: [PATCH 09/24] Add renderers to workspace --- nx.json | 25 ++- package.json | 9 ++ workspace.json | 32 ++++ yarn.lock | 408 +++++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 411 insertions(+), 63 deletions(-) diff --git a/nx.json b/nx.json index 01c2cf39ed1f..e9aa14a9ff0d 100644 --- a/nx.json +++ b/nx.json @@ -88,6 +88,30 @@ "@storybook/preact": { "implicitDependencies": [] }, + "@storybook/renderer-html": { + "implicitDependencies": [] + }, + "@storybook/renderer-preact": { + "implicitDependencies": [] + }, + "@storybook/renderer-react": { + "implicitDependencies": [] + }, + "@storybook/renderer-server": { + "implicitDependencies": [] + }, + "@storybook/renderer-svelte": { + "implicitDependencies": [] + }, + "@storybook/renderer-vue": { + "implicitDependencies": [] + }, + "@storybook/renderer-vue3": { + "implicitDependencies": [] + }, + "@storybook/renderer-web-components": { + "implicitDependencies": [] + }, "@storybook/react": { "implicitDependencies": [] }, @@ -142,7 +166,6 @@ "@storybook/external-docs": { "implicitDependencies": [] }, - "server-kitchen-sink": { "implicitDependencies": [] }, diff --git a/package.json b/package.json index 798b67d9f35a..001ff75616ef 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "addons/*", "addons/storyshots/*", "app/*", + "renderers/*", "examples-native/*", "examples/*", "!examples/web-components-kitchen-sink", @@ -176,6 +177,14 @@ "@storybook/preact": "workspace:*", "@storybook/preview-web": "workspace:*", "@storybook/react": "workspace:*", + "@storybook/renderer-html": "workspace:*", + "@storybook/renderer-preact": "workspace:*", + "@storybook/renderer-react": "workspace:*", + "@storybook/renderer-server": "workspace:*", + "@storybook/renderer-svelte": "workspace:*", + "@storybook/renderer-vue": "workspace:*", + "@storybook/renderer-vue3": "workspace:*", + "@storybook/renderer-web-components": "workspace:*", "@storybook/router": "workspace:*", "@storybook/semver": "^7.3.2", "@storybook/server": "workspace:*", diff --git a/workspace.json b/workspace.json index 9de09d99dea1..92578ebb77f4 100644 --- a/workspace.json +++ b/workspace.json @@ -304,6 +304,38 @@ "@storybook/preview-web": { "root": "lib/preview-web", "type": "library" + }, + "@storybook/renderer-html": { + "root": "renderers/html", + "type": "library" + }, + "@storybook/renderer-preact": { + "root": "renderers/preact", + "type": "library" + }, + "@storybook/renderer-react": { + "root": "renderers/react", + "type": "library" + }, + "@storybook/renderer-server": { + "root": "renderers/server", + "type": "library" + }, + "@storybook/renderer-svelte": { + "root": "renderers/svelte", + "type": "library" + }, + "@storybook/renderer-vue": { + "root": "renderers/vue", + "type": "library" + }, + "@storybook/renderer-vue3": { + "root": "renderers/vue3", + "type": "library" + }, + "@storybook/renderer-web-components": { + "root": "renderers/web-components", + "type": "library" } } } diff --git a/yarn.lock b/yarn.lock index 01acbf37d18c..7635d4acf5e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -457,6 +457,13 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.17.7": + version: 7.17.7 + resolution: "@babel/compat-data@npm:7.17.7" + checksum: 34c2e7ae3d1dc75c03976b035ba47cf9fd888bc881517911ee4b8f4de8c864c9f969a44ca8e41495d05d6c546100efadb3b28b5759deaa78d68126202bf25a17 + languageName: node + linkType: hard + "@babel/core@npm:7.12.10": version: 7.12.10 resolution: "@babel/core@npm:7.12.10" @@ -598,6 +605,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.11.5": + version: 7.17.9 + resolution: "@babel/core@npm:7.17.9" + dependencies: + "@ampproject/remapping": ^2.1.0 + "@babel/code-frame": ^7.16.7 + "@babel/generator": ^7.17.9 + "@babel/helper-compilation-targets": ^7.17.7 + "@babel/helper-module-transforms": ^7.17.7 + "@babel/helpers": ^7.17.9 + "@babel/parser": ^7.17.9 + "@babel/template": ^7.16.7 + "@babel/traverse": ^7.17.9 + "@babel/types": ^7.17.0 + convert-source-map: ^1.7.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.1 + semver: ^6.3.0 + checksum: db9938ebb7194ae916c3316d82be846b69b3a61152265b1b4e02a1cde25f151a9e3e97719de78b04586dded6e8277239666e4698133de4b3813472c1a15b699f + languageName: node + linkType: hard + "@babel/generator@npm:7.12.11": version: 7.12.11 resolution: "@babel/generator@npm:7.12.11" @@ -620,6 +650,17 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.17.9": + version: 7.17.9 + resolution: "@babel/generator@npm:7.17.9" + dependencies: + "@babel/types": ^7.17.0 + jsesc: ^2.5.1 + source-map: ^0.5.0 + checksum: 795fdf08ff34d8887bbeeb10cd7fe1f4dee4f764c2754873bb3029e9ca3e06d32cd296009394c95c1b3498033f5ec650260bb21a6401d3209c40a34b8a2977d3 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.16.0, @babel/helper-annotate-as-pure@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-annotate-as-pure@npm:7.16.7" @@ -653,6 +694,20 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.17.7": + version: 7.17.7 + resolution: "@babel/helper-compilation-targets@npm:7.17.7" + dependencies: + "@babel/compat-data": ^7.17.7 + "@babel/helper-validator-option": ^7.16.7 + browserslist: ^4.17.5 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: dd8324c962f5142e18f3a7d2835e45db06ca72adfa3b9a6b5eb542ece4cac52cb118b6062d985dd3d15da8865622e249a9b0a1a2296abef5177179126ca067c9 + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.16.10, @babel/helper-create-class-features-plugin@npm:^7.16.7, @babel/helper-create-class-features-plugin@npm:^7.17.1, @babel/helper-create-class-features-plugin@npm:^7.17.6, @babel/helper-create-class-features-plugin@npm:^7.8.3": version: 7.17.6 resolution: "@babel/helper-create-class-features-plugin@npm:7.17.6" @@ -747,6 +802,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-function-name@npm:^7.17.9": + version: 7.17.9 + resolution: "@babel/helper-function-name@npm:7.17.9" + dependencies: + "@babel/template": ^7.16.7 + "@babel/types": ^7.17.0 + checksum: 88a8690a88703bacff5e1be492d8e54f38415db82d403d071256f7dc9b6b02da3ecece2ca113911b6b9e6cdba1b1571d6a78c7d086195b0318dc8a87200971e5 + languageName: node + linkType: hard + "@babel/helper-get-function-arity@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-get-function-arity@npm:7.16.7" @@ -799,6 +864,22 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.17.7": + version: 7.17.7 + resolution: "@babel/helper-module-transforms@npm:7.17.7" + dependencies: + "@babel/helper-environment-visitor": ^7.16.7 + "@babel/helper-module-imports": ^7.16.7 + "@babel/helper-simple-access": ^7.17.7 + "@babel/helper-split-export-declaration": ^7.16.7 + "@babel/helper-validator-identifier": ^7.16.7 + "@babel/template": ^7.16.7 + "@babel/traverse": ^7.17.3 + "@babel/types": ^7.17.0 + checksum: 9a2864f7f5f951f3406090d552071950d91de4a40184b758c3f0b152c46a990b5a363475cec865902b0e97c0230e17d89e18715a622b0b9e20a38426a6e502e7 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.16.7": version: 7.16.7 resolution: "@babel/helper-optimise-call-expression@npm:7.16.7" @@ -855,6 +936,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-simple-access@npm:^7.17.7": + version: 7.17.7 + resolution: "@babel/helper-simple-access@npm:7.17.7" + dependencies: + "@babel/types": ^7.17.0 + checksum: 86b50d308771c23484bbccbb78c2e6729a90359da3e3d80f0aa7679d03ceb391857e48fc0ad7b7823f9ee5af7fc96bc4ff29fc6ed63da075665408d991cbf3f5 + languageName: node + linkType: hard + "@babel/helper-skip-transparent-expression-wrappers@npm:^7.16.0": version: 7.16.0 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.16.0" @@ -910,6 +1000,17 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.17.9": + version: 7.17.9 + resolution: "@babel/helpers@npm:7.17.9" + dependencies: + "@babel/template": ^7.16.7 + "@babel/traverse": ^7.17.9 + "@babel/types": ^7.17.0 + checksum: dc6c289d1f5226004f7b421a505f5aeaaa38b80afb4756efa5d78ce97a3d7e35becc1d880a55527ff2f813cf938aa0a911b970e4c43267610f7b8ba56314096b + languageName: node + linkType: hard + "@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.16.7, @babel/highlight@npm:^7.8.3": version: 7.16.10 resolution: "@babel/highlight@npm:7.16.10" @@ -930,6 +1031,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.17.9": + version: 7.17.9 + resolution: "@babel/parser@npm:7.17.9" + bin: + parser: ./bin/babel-parser.js + checksum: a520c33deb47ec95edabecc12a5bf10a5619421bf1324e6762e4031ce11f52613a8617a341ee44a51361bad9bdc6fe140b5fd568594fe1120588d9f084298803 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.16.7" @@ -2518,6 +2628,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.17.9": + version: 7.17.9 + resolution: "@babel/traverse@npm:7.17.9" + dependencies: + "@babel/code-frame": ^7.16.7 + "@babel/generator": ^7.17.9 + "@babel/helper-environment-visitor": ^7.16.7 + "@babel/helper-function-name": ^7.17.9 + "@babel/helper-hoist-variables": ^7.16.7 + "@babel/helper-split-export-declaration": ^7.16.7 + "@babel/parser": ^7.17.9 + "@babel/types": ^7.17.0 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: adef927603bd4af2cb143dbf0868366de3b35eedb49b49e2b211fb466146935bc77dc8aebb83c764fd85d5872d34cdb549cedf6b9c6fa877b628520f5fa15966 + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.11.5, @babel/types@npm:^7.12.1, @babel/types@npm:^7.12.10, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.12.7, @babel/types@npm:^7.13.12, @babel/types@npm:^7.16.0, @babel/types@npm:^7.16.7, @babel/types@npm:^7.16.8, @babel/types@npm:^7.17.0, @babel/types@npm:^7.2.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.6.1, @babel/types@npm:^7.7.0, @babel/types@npm:^7.7.2, @babel/types@npm:^7.8.3, @babel/types@npm:^7.8.6, @babel/types@npm:^7.8.7, @babel/types@npm:^7.9.0, @babel/types@npm:^7.9.6": version: 7.17.0 resolution: "@babel/types@npm:7.17.0" @@ -7845,14 +7973,10 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/html@workspace:app/html" dependencies: - "@storybook/addons": 6.5.0-alpha.63 - "@storybook/core-client": 6.5.0-alpha.63 "@storybook/core-common": 6.5.0-alpha.63 "@storybook/core-server": 6.5.0-alpha.63 - "@storybook/csf": 0.0.2--canary.7c6c115.0 "@storybook/docs-tools": 6.5.0-alpha.63 - "@storybook/preview-web": 6.5.0-alpha.63 - "@storybook/store": 6.5.0-alpha.63 + "@storybook/renderer-html": 6.5.0-alpha.63 "@types/node": ^14.14.20 || ^16.0.0 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 @@ -7860,9 +7984,7 @@ __metadata: html-loader: ^1.3.2 react: 16.14.0 react-dom: 16.14.0 - read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 - ts-dedent: ^2.0.0 webpack: 4 peerDependencies: "@babel/core": "*" @@ -8110,12 +8232,9 @@ __metadata: resolution: "@storybook/preact@workspace:app/preact" dependencies: "@babel/plugin-transform-react-jsx": ^7.12.12 - "@storybook/addons": 6.5.0-alpha.63 - "@storybook/core-client": 6.5.0-alpha.63 "@storybook/core-common": 6.5.0-alpha.63 "@storybook/core-server": 6.5.0-alpha.63 - "@storybook/csf": 0.0.2--canary.7c6c115.0 - "@storybook/store": 6.5.0-alpha.63 + "@storybook/renderer-preact": 6.5.0-alpha.63 "@types/node": ^14.14.20 || ^16.0.0 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 @@ -8123,7 +8242,6 @@ __metadata: preact: ^10.5.13 react: 16.14.0 react-dom: 16.14.0 - read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 ts-dedent: ^2.0.0 webpack: 4 @@ -8215,36 +8333,22 @@ __metadata: "@babel/preset-flow": ^7.12.1 "@babel/preset-react": ^7.12.10 "@pmmmwh/react-refresh-webpack-plugin": ^0.5.3 - "@storybook/addons": 6.5.0-alpha.63 - "@storybook/client-logger": 6.5.0-alpha.63 - "@storybook/core-client": 6.5.0-alpha.63 "@storybook/core-common": 6.5.0-alpha.63 "@storybook/core-server": 6.5.0-alpha.63 - "@storybook/csf": 0.0.2--canary.7c6c115.0 "@storybook/docs-tools": 6.5.0-alpha.63 "@storybook/node-logger": 6.5.0-alpha.63 "@storybook/react-docgen-typescript-plugin": 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0 + "@storybook/renderer-react": 6.5.0-alpha.63 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.0-alpha.63 - "@types/estree": ^0.0.51 "@types/node": ^14.14.20 || ^16.0.0 "@types/util-deprecate": ^1.0.0 "@types/webpack-env": ^1.16.0 - acorn: ^7.4.1 - acorn-jsx: ^5.3.1 - acorn-walk: ^7.2.0 babel-plugin-add-react-displayname: ^0.0.5 babel-plugin-react-docgen: ^4.2.1 core-js: ^3.8.2 - escodegen: ^2.0.0 fs-extra: ^9.0.1 global: ^4.4.0 - html-tags: ^3.1.0 - lodash: ^4.17.21 - prop-types: ^15.7.2 - react-element-to-jsx-string: ^14.3.4 react-refresh: ^0.11.0 - read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 ts-dedent: ^2.0.0 util-deprecate: ^1.0.2 @@ -8271,6 +8375,199 @@ __metadata: languageName: unknown linkType: soft +"@storybook/renderer-html@6.5.0-alpha.63, @storybook/renderer-html@workspace:*, @storybook/renderer-html@workspace:renderers/html": + version: 0.0.0-use.local + resolution: "@storybook/renderer-html@workspace:renderers/html" + dependencies: + "@storybook/addons": 6.5.0-alpha.63 + "@storybook/core-client": 6.5.0-alpha.63 + "@storybook/csf": 0.0.2--canary.7c6c115.0 + "@storybook/docs-tools": 6.5.0-alpha.63 + "@storybook/preview-web": 6.5.0-alpha.63 + "@storybook/store": 6.5.0-alpha.63 + core-js: ^3.8.2 + global: ^4.4.0 + react: 16.14.0 + react-dom: 16.14.0 + regenerator-runtime: ^0.13.7 + ts-dedent: ^2.0.0 + webpack: 4 + peerDependencies: + "@babel/core": "*" + languageName: unknown + linkType: soft + +"@storybook/renderer-preact@6.5.0-alpha.63, @storybook/renderer-preact@workspace:*, @storybook/renderer-preact@workspace:renderers/preact": + version: 0.0.0-use.local + resolution: "@storybook/renderer-preact@workspace:renderers/preact" + dependencies: + "@storybook/addons": 6.5.0-alpha.63 + "@storybook/core-client": 6.5.0-alpha.63 + "@storybook/csf": 0.0.2--canary.7c6c115.0 + "@storybook/store": 6.5.0-alpha.63 + core-js: ^3.8.2 + global: ^4.4.0 + preact: ^10.5.13 + react: 16.14.0 + react-dom: 16.14.0 + regenerator-runtime: ^0.13.7 + ts-dedent: ^2.0.0 + peerDependencies: + preact: ^8.0.0||^10.0.0 + languageName: unknown + linkType: soft + +"@storybook/renderer-react@6.5.0-alpha.63, @storybook/renderer-react@workspace:*, @storybook/renderer-react@workspace:renderers/react": + version: 0.0.0-use.local + resolution: "@storybook/renderer-react@workspace:renderers/react" + dependencies: + "@babel/core": ^7.11.5 + "@storybook/addons": 6.5.0-alpha.63 + "@storybook/client-logger": 6.5.0-alpha.63 + "@storybook/core-client": 6.5.0-alpha.63 + "@storybook/csf": 0.0.2--canary.7c6c115.0 + "@storybook/docs-tools": 6.5.0-alpha.63 + "@storybook/store": 6.5.0-alpha.63 + "@types/estree": ^0.0.51 + "@types/node": ^14.14.20 || ^16.0.0 + "@types/util-deprecate": ^1.0.0 + acorn: ^7.4.1 + acorn-jsx: ^5.3.1 + acorn-walk: ^7.2.0 + core-js: ^3.8.2 + escodegen: ^2.0.0 + global: ^4.4.0 + html-tags: ^3.1.0 + lodash: ^4.17.21 + prop-types: ^15.7.2 + react-element-to-jsx-string: ^14.3.4 + regenerator-runtime: ^0.13.7 + ts-dedent: ^2.0.0 + util-deprecate: ^1.0.2 + peerDependencies: + jest-specific-snapshot: ^4.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + require-from-string: ^2.0.2 + peerDependenciesMeta: + typescript: + optional: true + languageName: unknown + linkType: soft + +"@storybook/renderer-server@6.5.0-alpha.63, @storybook/renderer-server@workspace:*, @storybook/renderer-server@workspace:renderers/server": + version: 0.0.0-use.local + resolution: "@storybook/renderer-server@workspace:renderers/server" + dependencies: + "@storybook/addons": 6.5.0-alpha.63 + "@storybook/core-client": 6.5.0-alpha.63 + "@storybook/csf": 0.0.2--canary.7c6c115.0 + "@storybook/preview-web": 6.5.0-alpha.63 + "@storybook/store": 6.5.0-alpha.63 + core-js: ^3.8.2 + global: ^4.4.0 + react: 16.14.0 + react-dom: 16.14.0 + regenerator-runtime: ^0.13.7 + ts-dedent: ^2.0.0 + languageName: unknown + linkType: soft + +"@storybook/renderer-svelte@6.5.0-alpha.63, @storybook/renderer-svelte@workspace:*, @storybook/renderer-svelte@workspace:renderers/svelte": + version: 0.0.0-use.local + resolution: "@storybook/renderer-svelte@workspace:renderers/svelte" + dependencies: + "@storybook/addons": 6.5.0-alpha.63 + "@storybook/client-logger": 6.5.0-alpha.63 + "@storybook/core-client": 6.5.0-alpha.63 + "@storybook/csf": 0.0.2--canary.7c6c115.0 + "@storybook/docs-tools": 6.5.0-alpha.63 + "@storybook/store": 6.5.0-alpha.63 + core-js: ^3.8.2 + global: ^4.4.0 + react: 16.14.0 + react-dom: 16.14.0 + regenerator-runtime: ^0.13.7 + svelte: ^3.31.2 + sveltedoc-parser: 4.1.0 + peerDependencies: + "@babel/core": "*" + svelte: ^3.1.0 + languageName: unknown + linkType: soft + +"@storybook/renderer-vue3@6.5.0-alpha.63, @storybook/renderer-vue3@workspace:*, @storybook/renderer-vue3@workspace:renderers/vue3": + version: 0.0.0-use.local + resolution: "@storybook/renderer-vue3@workspace:renderers/vue3" + dependencies: + "@storybook/addons": 6.5.0-alpha.63 + "@storybook/core-client": 6.5.0-alpha.63 + "@storybook/csf": 0.0.2--canary.7c6c115.0 + "@storybook/docs-tools": 6.5.0-alpha.63 + "@storybook/store": 6.5.0-alpha.63 + core-js: ^3.8.2 + global: ^4.4.0 + react: 16.14.0 + react-dom: 16.14.0 + regenerator-runtime: ^0.13.7 + ts-dedent: ^2.0.0 + vue: 3.0.0 + peerDependencies: + "@babel/core": "*" + babel-loader: ^7.0.0 || ^8.0.0 + vue: ^3.0.0 + languageName: unknown + linkType: soft + +"@storybook/renderer-vue@6.5.0-alpha.63, @storybook/renderer-vue@workspace:*, @storybook/renderer-vue@workspace:renderers/vue": + version: 0.0.0-use.local + resolution: "@storybook/renderer-vue@workspace:renderers/vue" + dependencies: + "@storybook/addons": 6.5.0-alpha.63 + "@storybook/client-logger": 6.5.0-alpha.63 + "@storybook/core-client": 6.5.0-alpha.63 + "@storybook/csf": 0.0.2--canary.7c6c115.0 + "@storybook/docs-tools": 6.5.0-alpha.63 + "@storybook/store": 6.5.0-alpha.63 + core-js: ^3.8.2 + global: ^4.4.0 + react: 16.14.0 + react-dom: 16.14.0 + regenerator-runtime: ^0.13.7 + ts-dedent: ^2.0.0 + vue: ^2.6.12 + peerDependencies: + "@babel/core": "*" + babel-loader: ^7.0.0 || ^8.0.0 + css-loader: "*" + vue: ^2.6.8 + languageName: unknown + linkType: soft + +"@storybook/renderer-web-components@6.5.0-alpha.63, @storybook/renderer-web-components@workspace:*, @storybook/renderer-web-components@workspace:renderers/web-components": + version: 0.0.0-use.local + resolution: "@storybook/renderer-web-components@workspace:renderers/web-components" + dependencies: + "@storybook/addons": 6.5.0-alpha.63 + "@storybook/api": 6.5.0-alpha.63 + "@storybook/client-logger": 6.5.0-alpha.63 + "@storybook/core-client": 6.5.0-alpha.63 + "@storybook/csf": 0.0.2--canary.7c6c115.0 + "@storybook/docs-tools": 6.5.0-alpha.63 + "@storybook/preview-web": 6.5.0-alpha.63 + "@storybook/store": 6.5.0-alpha.63 + core-js: ^3.8.2 + global: ^4.4.0 + lit-html: 2.0.2 + react: 16.14.0 + react-dom: 16.14.0 + regenerator-runtime: ^0.13.7 + ts-dedent: ^2.0.0 + peerDependencies: + lit-html: ^1.4.1 || ^2.0.0 + languageName: unknown + linkType: soft + "@storybook/root@workspace:.": version: 0.0.0-use.local resolution: "@storybook/root@workspace:." @@ -8350,6 +8647,14 @@ __metadata: "@storybook/preact": "workspace:*" "@storybook/preview-web": "workspace:*" "@storybook/react": "workspace:*" + "@storybook/renderer-html": "workspace:*" + "@storybook/renderer-preact": "workspace:*" + "@storybook/renderer-react": "workspace:*" + "@storybook/renderer-server": "workspace:*" + "@storybook/renderer-svelte": "workspace:*" + "@storybook/renderer-vue": "workspace:*" + "@storybook/renderer-vue3": "workspace:*" + "@storybook/renderer-web-components": "workspace:*" "@storybook/router": "workspace:*" "@storybook/semver": ^7.3.2 "@storybook/server": "workspace:*" @@ -8579,16 +8884,9 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/server@workspace:app/server" dependencies: - "@storybook/addons": 6.5.0-alpha.63 - "@storybook/api": 6.5.0-alpha.63 - "@storybook/client-api": 6.5.0-alpha.63 - "@storybook/core-client": 6.5.0-alpha.63 "@storybook/core-common": 6.5.0-alpha.63 "@storybook/core-server": 6.5.0-alpha.63 - "@storybook/csf": 0.0.2--canary.7c6c115.0 - "@storybook/node-logger": 6.5.0-alpha.63 - "@storybook/preview-web": 6.5.0-alpha.63 - "@storybook/store": 6.5.0-alpha.63 + "@storybook/renderer-server": 6.5.0-alpha.63 "@types/node": ^14.14.20 || ^16.0.0 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 @@ -8596,7 +8894,6 @@ __metadata: global: ^4.4.0 react: 16.14.0 react-dom: 16.14.0 - read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 safe-identifier: ^0.4.1 ts-dedent: ^2.0.0 @@ -8654,15 +8951,10 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/svelte@workspace:app/svelte" dependencies: - "@storybook/addons": 6.5.0-alpha.63 - "@storybook/client-logger": 6.5.0-alpha.63 - "@storybook/core-client": 6.5.0-alpha.63 "@storybook/core-common": 6.5.0-alpha.63 "@storybook/core-server": 6.5.0-alpha.63 - "@storybook/csf": 0.0.2--canary.7c6c115.0 - "@storybook/docs-tools": 6.5.0-alpha.63 "@storybook/node-logger": 6.5.0-alpha.63 - "@storybook/store": 6.5.0-alpha.63 + "@storybook/renderer-svelte": 6.5.0-alpha.63 "@types/loader-utils": ^2.0.0 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 @@ -8670,7 +8962,6 @@ __metadata: loader-utils: ^2.0.0 react: 16.14.0 react-dom: 16.14.0 - read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 svelte: ^3.31.2 svelte-loader: ^3.0.0 @@ -8803,13 +9094,10 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/vue3@workspace:app/vue3" dependencies: - "@storybook/addons": 6.5.0-alpha.63 - "@storybook/core-client": 6.5.0-alpha.63 "@storybook/core-common": 6.5.0-alpha.63 "@storybook/core-server": 6.5.0-alpha.63 - "@storybook/csf": 0.0.2--canary.7c6c115.0 "@storybook/docs-tools": 6.5.0-alpha.63 - "@storybook/store": 6.5.0-alpha.63 + "@storybook/renderer-vue3": 6.5.0-alpha.63 "@types/node": ^14.14.20 || ^16.0.0 "@types/webpack-env": ^1.16.0 "@vue/compiler-sfc": 3.0.0 @@ -8817,7 +9105,6 @@ __metadata: global: ^4.4.0 react: 16.14.0 react-dom: 16.14.0 - read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 ts-dedent: ^2.0.0 ts-loader: ^8.0.14 @@ -8838,21 +9125,16 @@ __metadata: version: 0.0.0-use.local resolution: "@storybook/vue@workspace:app/vue" dependencies: - "@storybook/addons": 6.5.0-alpha.63 - "@storybook/client-logger": 6.5.0-alpha.63 - "@storybook/core-client": 6.5.0-alpha.63 "@storybook/core-common": 6.5.0-alpha.63 "@storybook/core-server": 6.5.0-alpha.63 - "@storybook/csf": 0.0.2--canary.7c6c115.0 "@storybook/docs-tools": 6.5.0-alpha.63 - "@storybook/store": 6.5.0-alpha.63 + "@storybook/renderer-vue": 6.5.0-alpha.63 "@types/node": ^14.14.20 || ^16.0.0 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 global: ^4.4.0 react: 16.14.0 react-dom: 16.14.0 - read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 ts-dedent: ^2.0.0 ts-loader: ^8.0.14 @@ -8879,16 +9161,10 @@ __metadata: "@babel/plugin-syntax-dynamic-import": ^7.8.3 "@babel/plugin-syntax-import-meta": ^7.10.4 "@babel/preset-env": ^7.12.11 - "@storybook/addons": 6.5.0-alpha.63 - "@storybook/client-api": 6.5.0-alpha.63 - "@storybook/client-logger": 6.5.0-alpha.63 - "@storybook/core-client": 6.5.0-alpha.63 "@storybook/core-common": 6.5.0-alpha.63 "@storybook/core-server": 6.5.0-alpha.63 - "@storybook/csf": 0.0.2--canary.7c6c115.0 "@storybook/docs-tools": 6.5.0-alpha.63 - "@storybook/preview-web": 6.5.0-alpha.63 - "@storybook/store": 6.5.0-alpha.63 + "@storybook/renderer-web-components": 6.5.0-alpha.63 "@types/node": ^14.14.20 || ^16.0.0 "@types/webpack-env": ^1.16.0 babel-plugin-bundled-import-meta: ^0.3.1 @@ -8897,7 +9173,6 @@ __metadata: lit-html: 2.0.2 react: 16.14.0 react-dom: 16.14.0 - read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 ts-dedent: ^2.0.0 peerDependencies: @@ -29137,6 +29412,15 @@ __metadata: languageName: node linkType: hard +"json5@npm:^2.2.1": + version: 2.2.1 + resolution: "json5@npm:2.2.1" + bin: + json5: lib/cli.js + checksum: a7174bc4e146613750a04a8a7fe2bc4ab6f4cad20486f8d7026cc4546b3ee1dc3762fc5e7377557ae99414745aac782486e409f31c363084a455e05cb495ce7a + languageName: node + linkType: hard + "jsonc-parser@npm:3.0.0, jsonc-parser@npm:^3.0.0": version: 3.0.0 resolution: "jsonc-parser@npm:3.0.0" From 4d4c11a8e5ddd3a1e875a50abcf31b2c70157c3c Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sun, 17 Apr 2022 15:58:43 +0800 Subject: [PATCH 10/24] Update snapshots --- .../src/__snapshots__/cra-ts-essentials_preview-dev-posix | 4 ++-- .../src/__snapshots__/cra-ts-essentials_preview-prod-posix | 4 ++-- .../src/__snapshots__/html-kitchen-sink_preview-dev-posix | 4 ++-- .../src/__snapshots__/html-kitchen-sink_preview-prod-posix | 4 ++-- lib/core-server/src/__snapshots__/vue-3-cli_preview-dev-posix | 4 ++-- .../src/__snapshots__/vue-3-cli_preview-prod-posix | 4 ++-- .../web-components-kitchen-sink_preview-dev-posix | 4 ++-- .../web-components-kitchen-sink_preview-prod-posix | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-dev-posix b/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-dev-posix index 45f3199dcaa1..68bbfc0a7481 100644 --- a/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-dev-posix +++ b/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-dev-posix @@ -8,8 +8,8 @@ Object { "NODE_MODULES/webpack-hot-middleware/client.js?reload=true&quiet=false&noInfo=undefined", "NODE_MODULES/@storybook/addon-ie11/dist/event-source-polyfill.js", "ROOT/storybook-init-framework-entry.js", - "ROOT/app/react/dist/esm/client/docs/config-generated-config-entry.js", - "ROOT/app/react/dist/esm/client/preview/config-generated-config-entry.js", + "ROOT/renderers/react/dist/esm/docs/config.js-generated-config-entry.js", + "ROOT/renderers/react/dist/esm/preview/config.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", "ROOT/addons/backgrounds/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-prod-posix b/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-prod-posix index 9eecd1ba125f..aec54988b539 100644 --- a/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-prod-posix +++ b/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-prod-posix @@ -7,8 +7,8 @@ Object { "ROOT/lib/core-client/dist/esm/globals/globals.js", "NODE_MODULES/@storybook/addon-ie11/dist/event-source-polyfill.js", "ROOT/storybook-init-framework-entry.js", - "ROOT/app/react/dist/esm/client/docs/config-generated-config-entry.js", - "ROOT/app/react/dist/esm/client/preview/config-generated-config-entry.js", + "ROOT/renderers/react/dist/esm/docs/config.js-generated-config-entry.js", + "ROOT/renderers/react/dist/esm/preview/config.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", "ROOT/addons/backgrounds/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-dev-posix b/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-dev-posix index fef4e5b1e09b..339012752b7f 100644 --- a/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-dev-posix +++ b/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-dev-posix @@ -7,8 +7,8 @@ Object { "ROOT/lib/core-client/dist/esm/globals/globals.js", "NODE_MODULES/webpack-hot-middleware/client.js?reload=true&quiet=false&noInfo=undefined", "ROOT/storybook-init-framework-entry.js", - "ROOT/app/html/dist/esm/client/preview/config-generated-config-entry.js", - "ROOT/app/html/dist/esm/client/docs/config-generated-config-entry.js", + "ROOT/renderers/html/dist/esm/preview/config.js-generated-config-entry.js", + "ROOT/renderers/html/dist/esm/docs/config.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/a11y/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-prod-posix b/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-prod-posix index d1c67aacb001..04f4ef4b1cde 100644 --- a/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-prod-posix +++ b/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-prod-posix @@ -6,8 +6,8 @@ Object { "ROOT/lib/core-client/dist/esm/globals/polyfills.js", "ROOT/lib/core-client/dist/esm/globals/globals.js", "ROOT/storybook-init-framework-entry.js", - "ROOT/app/html/dist/esm/client/preview/config-generated-config-entry.js", - "ROOT/app/html/dist/esm/client/docs/config-generated-config-entry.js", + "ROOT/renderers/html/dist/esm/preview/config.js-generated-config-entry.js", + "ROOT/renderers/html/dist/esm/docs/config.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/a11y/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/vue-3-cli_preview-dev-posix b/lib/core-server/src/__snapshots__/vue-3-cli_preview-dev-posix index 64e4d88c7a94..447d4041c29b 100644 --- a/lib/core-server/src/__snapshots__/vue-3-cli_preview-dev-posix +++ b/lib/core-server/src/__snapshots__/vue-3-cli_preview-dev-posix @@ -7,8 +7,8 @@ Object { "ROOT/lib/core-client/dist/esm/globals/globals.js", "NODE_MODULES/webpack-hot-middleware/client.js?reload=true&quiet=false&noInfo=undefined", "ROOT/storybook-init-framework-entry.js", - "ROOT/app/vue3/dist/esm/client/preview/config-generated-config-entry.js", - "ROOT/app/vue3/dist/esm/client/docs/config-generated-config-entry.js", + "ROOT/renderers/vue3/dist/esm/preview/config.js-generated-config-entry.js", + "ROOT/renderers/vue3/dist/esm/docs/config.js-generated-config-entry.js", "ROOT/addons/links/preview.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/vue-3-cli_preview-prod-posix b/lib/core-server/src/__snapshots__/vue-3-cli_preview-prod-posix index 9f1c9872be90..eb2deeb84377 100644 --- a/lib/core-server/src/__snapshots__/vue-3-cli_preview-prod-posix +++ b/lib/core-server/src/__snapshots__/vue-3-cli_preview-prod-posix @@ -6,8 +6,8 @@ Object { "ROOT/lib/core-client/dist/esm/globals/polyfills.js", "ROOT/lib/core-client/dist/esm/globals/globals.js", "ROOT/storybook-init-framework-entry.js", - "ROOT/app/vue3/dist/esm/client/preview/config-generated-config-entry.js", - "ROOT/app/vue3/dist/esm/client/docs/config-generated-config-entry.js", + "ROOT/renderers/vue3/dist/esm/preview/config.js-generated-config-entry.js", + "ROOT/renderers/vue3/dist/esm/docs/config.js-generated-config-entry.js", "ROOT/addons/links/preview.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-dev-posix b/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-dev-posix index 12efbe2571e2..8c67ac73c428 100644 --- a/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-dev-posix +++ b/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-dev-posix @@ -7,8 +7,8 @@ Object { "ROOT/lib/core-client/dist/esm/globals/globals.js", "NODE_MODULES/webpack-hot-middleware/client.js?reload=true&quiet=false&noInfo=undefined", "ROOT/storybook-init-framework-entry.js", - "ROOT/app/web-components/dist/esm/client/preview/config-generated-config-entry.js", - "ROOT/app/web-components/dist/esm/client/docs/config-generated-config-entry.js", + "ROOT/renderers/web-components/dist/esm/preview/config.js-generated-config-entry.js", + "ROOT/renderers/web-components/dist/esm/docs/config.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/a11y/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-prod-posix b/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-prod-posix index 0a9453609940..9387fee74874 100644 --- a/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-prod-posix +++ b/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-prod-posix @@ -6,8 +6,8 @@ Object { "ROOT/lib/core-client/dist/esm/globals/polyfills.js", "ROOT/lib/core-client/dist/esm/globals/globals.js", "ROOT/storybook-init-framework-entry.js", - "ROOT/app/web-components/dist/esm/client/preview/config-generated-config-entry.js", - "ROOT/app/web-components/dist/esm/client/docs/config-generated-config-entry.js", + "ROOT/renderers/web-components/dist/esm/preview/config.js-generated-config-entry.js", + "ROOT/renderers/web-components/dist/esm/docs/config.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/a11y/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", From af72d6e8b680cdd30e4e70195149632080ceac84 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sun, 17 Apr 2022 17:18:56 +0800 Subject: [PATCH 11/24] Fix react-dom/client hack for renderer --- app/react/src/server/framework-preset-react-dom-hack.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/react/src/server/framework-preset-react-dom-hack.ts b/app/react/src/server/framework-preset-react-dom-hack.ts index f9893d37c85a..a00646202f00 100644 --- a/app/react/src/server/framework-preset-react-dom-hack.ts +++ b/app/react/src/server/framework-preset-react-dom-hack.ts @@ -15,7 +15,8 @@ export async function webpackFinal(config: Configuration) { ? null : new IgnorePlugin({ resourceRegExp: /react-dom\/client$/, - contextRegExp: /(app\/react|app\\react|@storybook\/react|@storybook\\react)/, // TODO this needs to work for both in our MONOREPO and in the user's NODE_MODULES + contextRegExp: + /(renderers\/react|renderers\\react|@storybook\/renderer-react|@storybook\\renderer-react)/, // TODO this needs to work for both in our MONOREPO and in the user's NODE_MODULES }), ].filter(Boolean), }; From 5ea9053dd258f0545ecfeee2591aa35ac81ca388 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Wed, 20 Apr 2022 00:51:54 +0800 Subject: [PATCH 12/24] Delete extra renderer preset --- renderers/preact/preset.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 renderers/preact/preset.js diff --git a/renderers/preact/preset.js b/renderers/preact/preset.js deleted file mode 100644 index 324b0db8eda2..000000000000 --- a/renderers/preact/preset.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/cjs/server/framework-preset-preact'); From 05e7f5679a5c6f43157a03b4f29691e1ac045761 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Wed, 20 Apr 2022 00:52:31 +0800 Subject: [PATCH 13/24] Make renderers presets --- app/html/src/server/framework-preset-html-docs.ts | 7 ------- app/html/src/server/framework-preset-html.ts | 15 --------------- app/html/src/server/preset.ts | 15 +++++++++++---- app/preact/src/server/framework-preset-preact.ts | 4 +--- .../src/server/framework-preset-react-docs.ts | 5 ----- app/react/src/server/preset.ts | 6 +----- app/server/src/server/framework-preset-server.ts | 4 +--- .../src/server/framework-preset-svelte-docs.ts | 6 +----- app/svelte/src/server/framework-preset-svelte.ts | 6 +----- app/svelte/src/server/preset.ts | 1 + app/vue/src/server/framework-preset-vue-docs.ts | 7 +------ app/vue/src/server/framework-preset-vue.ts | 4 ---- app/vue/src/server/preset.ts | 1 + app/vue3/src/server/framework-preset-vue3-docs.ts | 7 +------ app/vue3/src/server/framework-preset-vue3.ts | 5 ----- app/vue3/src/server/preset.ts | 1 + .../framework-preset-web-components-docs.ts | 7 ------- .../src/server/framework-preset-web-components.ts | 6 +----- app/web-components/src/server/preset.ts | 1 + renderers/html/preview.js | 5 +++++ renderers/preact/preview.js | 1 + renderers/react/preview.js | 5 +++++ renderers/server/preview.js | 1 + renderers/svelte/preview.js | 5 +++++ renderers/vue/preview.js | 5 +++++ renderers/vue3/preview.js | 5 +++++ renderers/web-components/preview.js | 5 +++++ 27 files changed, 55 insertions(+), 85 deletions(-) delete mode 100644 app/html/src/server/framework-preset-html-docs.ts delete mode 100644 app/html/src/server/framework-preset-html.ts delete mode 100644 app/web-components/src/server/framework-preset-web-components-docs.ts create mode 100644 renderers/html/preview.js create mode 100644 renderers/preact/preview.js create mode 100644 renderers/react/preview.js create mode 100644 renderers/server/preview.js create mode 100644 renderers/svelte/preview.js create mode 100644 renderers/vue/preview.js create mode 100644 renderers/vue3/preview.js create mode 100644 renderers/web-components/preview.js diff --git a/app/html/src/server/framework-preset-html-docs.ts b/app/html/src/server/framework-preset-html-docs.ts deleted file mode 100644 index 082fdf9ebd16..000000000000 --- a/app/html/src/server/framework-preset-html-docs.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { StorybookConfig } from '@storybook/core-common'; -import { hasDocsOrControls } from '@storybook/docs-tools'; - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { - if (!hasDocsOrControls(options)) return entry; - return [...entry, require.resolve('@storybook/renderer-html/dist/esm/docs/config')]; -}; diff --git a/app/html/src/server/framework-preset-html.ts b/app/html/src/server/framework-preset-html.ts deleted file mode 100644 index 6924e4529c30..000000000000 --- a/app/html/src/server/framework-preset-html.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Configuration } from 'webpack'; -import type { StorybookConfig } from '@storybook/core-common'; - -export function webpack(config: Configuration) { - config.module.rules.push({ - test: /\.html$/, - use: require.resolve('html-loader') as string, - }); - - return config; -} - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, require.resolve('@storybook/renderer-html/dist/esm/preview/config')]; -}; diff --git a/app/html/src/server/preset.ts b/app/html/src/server/preset.ts index 62a020699371..5ad201fb77b2 100644 --- a/app/html/src/server/preset.ts +++ b/app/html/src/server/preset.ts @@ -1,6 +1,13 @@ +import type { Configuration } from 'webpack'; import type { StorybookConfig } from '@storybook/core-common'; -export const addons: StorybookConfig['addons'] = [ - require.resolve('./framework-preset-html'), - require.resolve('./framework-preset-html-docs'), -]; +export function webpack(config: Configuration) { + config.module.rules.push({ + test: /\.html$/, + use: require.resolve('html-loader') as string, + }); + + return config; +} + +export const addons: StorybookConfig['addons'] = ['@storybook/renderer-html']; diff --git a/app/preact/src/server/framework-preset-preact.ts b/app/preact/src/server/framework-preset-preact.ts index e326f74df28b..eb5c75188be9 100644 --- a/app/preact/src/server/framework-preset-preact.ts +++ b/app/preact/src/server/framework-preset-preact.ts @@ -28,6 +28,4 @@ export function webpackFinal(config: Configuration): Configuration { }; } -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, require.resolve('@storybook/renderer-preact/dist/esm/preview/config')]; -}; +export const addons: StorybookConfig['addons'] = ['@storybook/renderer-preact']; diff --git a/app/react/src/server/framework-preset-react-docs.ts b/app/react/src/server/framework-preset-react-docs.ts index 9e60d52efd40..6db076a167d4 100644 --- a/app/react/src/server/framework-preset-react-docs.ts +++ b/app/react/src/server/framework-preset-react-docs.ts @@ -56,8 +56,3 @@ export async function webpackFinal(config: Configuration, options: Options) { ], }; } - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { - if (!hasDocsOrControls(options)) return entry; - return [...entry, require.resolve('@storybook/renderer-react/dist/esm/docs/config')]; -}; diff --git a/app/react/src/server/preset.ts b/app/react/src/server/preset.ts index f90b49c3a615..1df8fc3cc348 100644 --- a/app/react/src/server/preset.ts +++ b/app/react/src/server/preset.ts @@ -1,11 +1,7 @@ import type { StorybookConfig } from '@storybook/core-common'; -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entries = []) => [ - ...entries, - require.resolve('@storybook/renderer-react/dist/esm/preview/config'), -]; - export const addons: StorybookConfig['addons'] = [ + '@storybook/renderer-react', require.resolve('./framework-preset-react'), require.resolve('./framework-preset-react-dom-hack'), require.resolve('./framework-preset-cra'), diff --git a/app/server/src/server/framework-preset-server.ts b/app/server/src/server/framework-preset-server.ts index f2f790fd55d1..fdad4774bca3 100644 --- a/app/server/src/server/framework-preset-server.ts +++ b/app/server/src/server/framework-preset-server.ts @@ -18,6 +18,4 @@ export function webpack(config: Configuration) { return config; } -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, require.resolve('@storybook/renderer-server/dist/esm/preview/config')]; -}; +export const addons: StorybookConfig['addons'] = ['@storybook/renderer-server']; diff --git a/app/svelte/src/server/framework-preset-svelte-docs.ts b/app/svelte/src/server/framework-preset-svelte-docs.ts index 24d7905d390e..2ae6af697652 100644 --- a/app/svelte/src/server/framework-preset-svelte-docs.ts +++ b/app/svelte/src/server/framework-preset-svelte-docs.ts @@ -1,6 +1,6 @@ import path from 'path'; -import { Options, StorybookConfig } from '@storybook/core-common'; +import { Options } from '@storybook/core-common'; type Configuration = any; @@ -16,7 +16,3 @@ export async function webpackFinal(webpackConfig: Configuration, options: Option return webpackConfig; } - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, require.resolve('@storybook/renderer-svelte/dist/esm/docs/config')]; -}; diff --git a/app/svelte/src/server/framework-preset-svelte.ts b/app/svelte/src/server/framework-preset-svelte.ts index 2a0fc4b8ffe7..9d22de269eeb 100644 --- a/app/svelte/src/server/framework-preset-svelte.ts +++ b/app/svelte/src/server/framework-preset-svelte.ts @@ -1,4 +1,4 @@ -import type { Options, StorybookConfig } from '@storybook/core-common'; +import type { Options } from '@storybook/core-common'; import type { Configuration } from 'webpack'; export async function webpack(config: Configuration, options: Options): Promise { @@ -31,7 +31,3 @@ export async function webpack(config: Configuration, options: Options): Promise< }, }; } - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, require.resolve('@storybook/renderer-svelte/dist/esm/preview/config')]; -}; diff --git a/app/svelte/src/server/preset.ts b/app/svelte/src/server/preset.ts index 5746855d89a0..7ff04fa37512 100644 --- a/app/svelte/src/server/preset.ts +++ b/app/svelte/src/server/preset.ts @@ -1,6 +1,7 @@ import type { StorybookConfig } from '@storybook/core-common'; export const addons: StorybookConfig['addons'] = [ + '@storybook/renderer-svelte', require.resolve('./framework-preset-svelte'), require.resolve('./framework-preset-svelte-docs'), ]; diff --git a/app/vue/src/server/framework-preset-vue-docs.ts b/app/vue/src/server/framework-preset-vue-docs.ts index efdc2b17ae98..4afc344e6bb6 100644 --- a/app/vue/src/server/framework-preset-vue-docs.ts +++ b/app/vue/src/server/framework-preset-vue-docs.ts @@ -1,4 +1,4 @@ -import { Options, StorybookConfig } from '@storybook/core-common'; +import { Options } from '@storybook/core-common'; import { hasDocsOrControls } from '@storybook/docs-tools'; export function webpackFinal(webpackConfig: any = {}, options: Options) { @@ -29,8 +29,3 @@ export function webpackFinal(webpackConfig: any = {}, options: Options) { }); return webpackConfig; } - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { - if (!hasDocsOrControls(options)) return entry; - return [...entry, require.resolve('@storybook/renderer-vue/dist/esm/docs/config')]; -}; diff --git a/app/vue/src/server/framework-preset-vue.ts b/app/vue/src/server/framework-preset-vue.ts index 29d4b41484a0..3af8418722bb 100644 --- a/app/vue/src/server/framework-preset-vue.ts +++ b/app/vue/src/server/framework-preset-vue.ts @@ -43,7 +43,3 @@ export async function webpack(config: Configuration, { presets }: Options) { return config; } - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, require.resolve('@storybook/renderer-vue/dist/esm/preview/config')]; -}; diff --git a/app/vue/src/server/preset.ts b/app/vue/src/server/preset.ts index 89288293223c..e90a0c007d41 100644 --- a/app/vue/src/server/preset.ts +++ b/app/vue/src/server/preset.ts @@ -1,6 +1,7 @@ import type { StorybookConfig } from '@storybook/core-common'; export const addons: StorybookConfig['addons'] = [ + '@storybook/renderer-vue', require.resolve('./framework-preset-vue'), require.resolve('./framework-preset-vue-docs'), ]; diff --git a/app/vue3/src/server/framework-preset-vue3-docs.ts b/app/vue3/src/server/framework-preset-vue3-docs.ts index 57e52125351a..07340bb3e5fe 100644 --- a/app/vue3/src/server/framework-preset-vue3-docs.ts +++ b/app/vue3/src/server/framework-preset-vue3-docs.ts @@ -1,4 +1,4 @@ -import type { Options, StorybookConfig } from '@storybook/core-common'; +import type { Options } from '@storybook/core-common'; import { hasDocsOrControls } from '@storybook/docs-tools'; export function webpackFinal(webpackConfig: any = {}, options: Options) { @@ -29,8 +29,3 @@ export function webpackFinal(webpackConfig: any = {}, options: Options) { }); return webpackConfig; } - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { - if (!hasDocsOrControls(options)) return entry; - return [...entry, require.resolve('@storybook/renderer-vue3/dist/esm/docs/config')]; -}; diff --git a/app/vue3/src/server/framework-preset-vue3.ts b/app/vue3/src/server/framework-preset-vue3.ts index 5d875db5f2bf..5061efe35be2 100644 --- a/app/vue3/src/server/framework-preset-vue3.ts +++ b/app/vue3/src/server/framework-preset-vue3.ts @@ -1,6 +1,5 @@ import { VueLoaderPlugin } from 'vue-loader'; import { Configuration, DefinePlugin } from 'webpack'; -import type { StorybookConfig } from '@storybook/core-common'; export function webpack(config: Configuration): Configuration { return { @@ -46,7 +45,3 @@ export function webpack(config: Configuration): Configuration { }, }; } - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, require.resolve('@storybook/renderer-vue3/dist/esm/preview/config')]; -}; diff --git a/app/vue3/src/server/preset.ts b/app/vue3/src/server/preset.ts index 16c9fbcfde38..b910b14ad4fb 100644 --- a/app/vue3/src/server/preset.ts +++ b/app/vue3/src/server/preset.ts @@ -1,6 +1,7 @@ import type { StorybookConfig } from '@storybook/core-common'; export const addons: StorybookConfig['addons'] = [ + '@storybook/renderer-vue3', require.resolve('./framework-preset-vue3'), require.resolve('./framework-preset-vue3-docs'), ]; diff --git a/app/web-components/src/server/framework-preset-web-components-docs.ts b/app/web-components/src/server/framework-preset-web-components-docs.ts deleted file mode 100644 index db6b053b71e3..000000000000 --- a/app/web-components/src/server/framework-preset-web-components-docs.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { StorybookConfig } from '@storybook/core-common'; -import { hasDocsOrControls } from '@storybook/docs-tools'; - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = [], options) => { - if (!hasDocsOrControls(options)) return entry; - return [...entry, require.resolve('@storybook/renderer-web-components/dist/esm/docs/config')]; -}; diff --git a/app/web-components/src/server/framework-preset-web-components.ts b/app/web-components/src/server/framework-preset-web-components.ts index c8434cab4d5a..aebad703a66e 100644 --- a/app/web-components/src/server/framework-preset-web-components.ts +++ b/app/web-components/src/server/framework-preset-web-components.ts @@ -1,4 +1,4 @@ -import type { Options, StorybookConfig } from '@storybook/core-common'; +import type { Options } from '@storybook/core-common'; import type { Configuration } from 'webpack'; export function webpack(config: Configuration, options: Options) { @@ -38,7 +38,3 @@ export function webpack(config: Configuration, options: Options) { return config; } - -export const previewAnnotations: StorybookConfig['previewAnnotations'] = (entry = []) => { - return [...entry, require.resolve('@storybook/renderer-web-components/dist/esm/preview/config')]; -}; diff --git a/app/web-components/src/server/preset.ts b/app/web-components/src/server/preset.ts index 2b8b5f434f7c..2db7b98d25d2 100644 --- a/app/web-components/src/server/preset.ts +++ b/app/web-components/src/server/preset.ts @@ -1,6 +1,7 @@ import type { StorybookConfig } from '@storybook/core-common'; export const addons: StorybookConfig['addons'] = [ + '@storybook/renderer-web-components', require.resolve('./framework-preset-web-components'), require.resolve('./framework-preset-web-components-docs'), ]; diff --git a/renderers/html/preview.js b/renderers/html/preview.js new file mode 100644 index 000000000000..617c1a1c44e6 --- /dev/null +++ b/renderers/html/preview.js @@ -0,0 +1,5 @@ +import { parameters as previewParams } from './dist/esm/preview/config'; +import { parameters as docsParams } from './dist/esm/docs/config'; + +export const parameters = { ...previewParams, ...docsParams }; +export { decorators } from './dist/esm/docs/config'; diff --git a/renderers/preact/preview.js b/renderers/preact/preview.js new file mode 100644 index 000000000000..ccd5ae5ae416 --- /dev/null +++ b/renderers/preact/preview.js @@ -0,0 +1 @@ +export * from './dist/esm/preview/config'; diff --git a/renderers/react/preview.js b/renderers/react/preview.js new file mode 100644 index 000000000000..fce6ed85c8b3 --- /dev/null +++ b/renderers/react/preview.js @@ -0,0 +1,5 @@ +import { parameters as previewParams } from './dist/esm/preview/config'; +import { parameters as docsParams } from './dist/esm/docs/config'; + +export const parameters = { ...previewParams, ...docsParams }; +export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; diff --git a/renderers/server/preview.js b/renderers/server/preview.js new file mode 100644 index 000000000000..ccd5ae5ae416 --- /dev/null +++ b/renderers/server/preview.js @@ -0,0 +1 @@ +export * from './dist/esm/preview/config'; diff --git a/renderers/svelte/preview.js b/renderers/svelte/preview.js new file mode 100644 index 000000000000..fce6ed85c8b3 --- /dev/null +++ b/renderers/svelte/preview.js @@ -0,0 +1,5 @@ +import { parameters as previewParams } from './dist/esm/preview/config'; +import { parameters as docsParams } from './dist/esm/docs/config'; + +export const parameters = { ...previewParams, ...docsParams }; +export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; diff --git a/renderers/vue/preview.js b/renderers/vue/preview.js new file mode 100644 index 000000000000..fce6ed85c8b3 --- /dev/null +++ b/renderers/vue/preview.js @@ -0,0 +1,5 @@ +import { parameters as previewParams } from './dist/esm/preview/config'; +import { parameters as docsParams } from './dist/esm/docs/config'; + +export const parameters = { ...previewParams, ...docsParams }; +export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; diff --git a/renderers/vue3/preview.js b/renderers/vue3/preview.js new file mode 100644 index 000000000000..9529d8ec79ad --- /dev/null +++ b/renderers/vue3/preview.js @@ -0,0 +1,5 @@ +import { parameters as previewParams } from './dist/esm/preview/config'; +import { parameters as docsParams } from './dist/esm/docs/config'; + +export const parameters = { ...previewParams, ...docsParams }; +export { argTypesEnhancers } from './dist/esm/docs/config'; diff --git a/renderers/web-components/preview.js b/renderers/web-components/preview.js new file mode 100644 index 000000000000..fce6ed85c8b3 --- /dev/null +++ b/renderers/web-components/preview.js @@ -0,0 +1,5 @@ +import { parameters as previewParams } from './dist/esm/preview/config'; +import { parameters as docsParams } from './dist/esm/docs/config'; + +export const parameters = { ...previewParams, ...docsParams }; +export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; From 379a42daa51b09f13b2630efaf1c286056d4f2a9 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Wed, 20 Apr 2022 01:20:04 +0800 Subject: [PATCH 14/24] Update preset.ts --- app/web-components/src/server/preset.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/web-components/src/server/preset.ts b/app/web-components/src/server/preset.ts index 2db7b98d25d2..1d220c4d4efb 100644 --- a/app/web-components/src/server/preset.ts +++ b/app/web-components/src/server/preset.ts @@ -3,5 +3,4 @@ import type { StorybookConfig } from '@storybook/core-common'; export const addons: StorybookConfig['addons'] = [ '@storybook/renderer-web-components', require.resolve('./framework-preset-web-components'), - require.resolve('./framework-preset-web-components-docs'), ]; From 76aac133adc53d784d076d45d3495dec3c24aa87 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Wed, 20 Apr 2022 19:47:07 +0800 Subject: [PATCH 15/24] Fix renderer presets to export renderToDOM etc --- renderers/html/preview.js | 4 ++-- renderers/html/src/preview/config.ts | 2 -- renderers/react/preview.js | 4 ++-- renderers/react/src/preview/config.ts | 2 -- renderers/svelte/preview.js | 4 ++-- renderers/svelte/src/preview/config.ts | 2 -- renderers/vue/preview.js | 4 ++-- renderers/vue/src/preview/config.ts | 2 -- renderers/vue3/preview.js | 4 ++-- renderers/vue3/src/preview/config.ts | 2 -- renderers/web-components/preview.js | 4 ++-- renderers/web-components/src/preview/config.ts | 2 -- 12 files changed, 12 insertions(+), 24 deletions(-) diff --git a/renderers/html/preview.js b/renderers/html/preview.js index 617c1a1c44e6..b3bbddd1cb3b 100644 --- a/renderers/html/preview.js +++ b/renderers/html/preview.js @@ -1,5 +1,5 @@ -import { parameters as previewParams } from './dist/esm/preview/config'; import { parameters as docsParams } from './dist/esm/docs/config'; -export const parameters = { ...previewParams, ...docsParams }; +export const parameters = { framework: 'html', ...docsParams }; export { decorators } from './dist/esm/docs/config'; +export * from './dist/esm/preview/config'; diff --git a/renderers/html/src/preview/config.ts b/renderers/html/src/preview/config.ts index 981ec886773a..060cf504b4fe 100644 --- a/renderers/html/src/preview/config.ts +++ b/renderers/html/src/preview/config.ts @@ -1,3 +1 @@ export { renderToDOM } from './render'; - -export const parameters = { framework: 'html' }; diff --git a/renderers/react/preview.js b/renderers/react/preview.js index fce6ed85c8b3..c2ec328c149c 100644 --- a/renderers/react/preview.js +++ b/renderers/react/preview.js @@ -1,5 +1,5 @@ -import { parameters as previewParams } from './dist/esm/preview/config'; import { parameters as docsParams } from './dist/esm/docs/config'; -export const parameters = { ...previewParams, ...docsParams }; +export const parameters = { framework: 'react', ...docsParams }; export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; +export * from './dist/esm/preview/config'; diff --git a/renderers/react/src/preview/config.ts b/renderers/react/src/preview/config.ts index decd470c6d0f..990959477289 100644 --- a/renderers/react/src/preview/config.ts +++ b/renderers/react/src/preview/config.ts @@ -1,3 +1 @@ export { render, renderToDOM } from './render'; - -export const parameters = { framework: 'react' }; diff --git a/renderers/svelte/preview.js b/renderers/svelte/preview.js index fce6ed85c8b3..779112166104 100644 --- a/renderers/svelte/preview.js +++ b/renderers/svelte/preview.js @@ -1,5 +1,5 @@ -import { parameters as previewParams } from './dist/esm/preview/config'; import { parameters as docsParams } from './dist/esm/docs/config'; -export const parameters = { ...previewParams, ...docsParams }; +export const parameters = { framework: 'svelte', ...docsParams }; export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; +export * from './dist/esm/preview/config'; diff --git a/renderers/svelte/src/preview/config.ts b/renderers/svelte/src/preview/config.ts index 88c2fe7b5a53..669c6e97f649 100644 --- a/renderers/svelte/src/preview/config.ts +++ b/renderers/svelte/src/preview/config.ts @@ -1,4 +1,2 @@ export { render, renderToDOM } from './render'; export { decorateStory } from './decorators'; - -export const parameters = { framework: 'svelte' }; diff --git a/renderers/vue/preview.js b/renderers/vue/preview.js index fce6ed85c8b3..4d27179aa3d6 100644 --- a/renderers/vue/preview.js +++ b/renderers/vue/preview.js @@ -1,5 +1,5 @@ -import { parameters as previewParams } from './dist/esm/preview/config'; import { parameters as docsParams } from './dist/esm/docs/config'; -export const parameters = { ...previewParams, ...docsParams }; +export const parameters = { framework: 'vue', ...docsParams }; export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; +export * from './dist/esm/preview/config'; diff --git a/renderers/vue/src/preview/config.ts b/renderers/vue/src/preview/config.ts index 964f711b2d7c..b52570d5d8c5 100644 --- a/renderers/vue/src/preview/config.ts +++ b/renderers/vue/src/preview/config.ts @@ -1,4 +1,2 @@ export { renderToDOM } from './render'; export { decorateStory } from './decorateStory'; - -export const parameters = { framework: 'vue' }; diff --git a/renderers/vue3/preview.js b/renderers/vue3/preview.js index 9529d8ec79ad..71ec3972f314 100644 --- a/renderers/vue3/preview.js +++ b/renderers/vue3/preview.js @@ -1,5 +1,5 @@ -import { parameters as previewParams } from './dist/esm/preview/config'; import { parameters as docsParams } from './dist/esm/docs/config'; -export const parameters = { ...previewParams, ...docsParams }; +export const parameters = { framework: 'vue3', ...docsParams }; export { argTypesEnhancers } from './dist/esm/docs/config'; +export * from './dist/esm/preview/config'; diff --git a/renderers/vue3/src/preview/config.ts b/renderers/vue3/src/preview/config.ts index 3baf26e63d03..b52570d5d8c5 100644 --- a/renderers/vue3/src/preview/config.ts +++ b/renderers/vue3/src/preview/config.ts @@ -1,4 +1,2 @@ export { renderToDOM } from './render'; export { decorateStory } from './decorateStory'; - -export const parameters = { framework: 'vue3' }; diff --git a/renderers/web-components/preview.js b/renderers/web-components/preview.js index fce6ed85c8b3..86eaef1f15c3 100644 --- a/renderers/web-components/preview.js +++ b/renderers/web-components/preview.js @@ -1,5 +1,5 @@ -import { parameters as previewParams } from './dist/esm/preview/config'; import { parameters as docsParams } from './dist/esm/docs/config'; -export const parameters = { ...previewParams, ...docsParams }; +export const parameters = { framework: 'web-components', ...docsParams }; export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; +export * from './dist/esm/preview/config'; diff --git a/renderers/web-components/src/preview/config.ts b/renderers/web-components/src/preview/config.ts index a8f16dae7703..060cf504b4fe 100644 --- a/renderers/web-components/src/preview/config.ts +++ b/renderers/web-components/src/preview/config.ts @@ -1,3 +1 @@ export { renderToDOM } from './render'; - -export const parameters = { framework: 'web-components' }; From eb8fdb8e706cac2c1a70e8cba8336fb6aacf6a89 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Wed, 20 Apr 2022 21:05:01 +0800 Subject: [PATCH 16/24] Persist renderers to workspace --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index d8e80c3533aa..e5261ea469ad 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -106,6 +106,7 @@ jobs: - addons - app - lib + - renderers chromatic: executor: sb_node_14_browsers parallelism: 4 From ddefe6aa8d526af0e11312240593e3baed8c7028 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Wed, 20 Apr 2022 21:29:29 +0800 Subject: [PATCH 17/24] Update snapshots --- .../src/__snapshots__/cra-ts-essentials_preview-dev-posix | 3 +-- .../src/__snapshots__/cra-ts-essentials_preview-prod-posix | 3 +-- .../src/__snapshots__/html-kitchen-sink_preview-dev-posix | 3 +-- .../src/__snapshots__/html-kitchen-sink_preview-prod-posix | 3 +-- lib/core-server/src/__snapshots__/vue-3-cli_preview-dev-posix | 3 +-- lib/core-server/src/__snapshots__/vue-3-cli_preview-prod-posix | 3 +-- .../web-components-kitchen-sink_preview-dev-posix | 3 +-- .../web-components-kitchen-sink_preview-prod-posix | 3 +-- 8 files changed, 8 insertions(+), 16 deletions(-) diff --git a/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-dev-posix b/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-dev-posix index 68bbfc0a7481..4c3aadc03154 100644 --- a/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-dev-posix +++ b/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-dev-posix @@ -8,8 +8,7 @@ Object { "NODE_MODULES/webpack-hot-middleware/client.js?reload=true&quiet=false&noInfo=undefined", "NODE_MODULES/@storybook/addon-ie11/dist/event-source-polyfill.js", "ROOT/storybook-init-framework-entry.js", - "ROOT/renderers/react/dist/esm/docs/config.js-generated-config-entry.js", - "ROOT/renderers/react/dist/esm/preview/config.js-generated-config-entry.js", + "ROOT/renderers/react/preview.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", "ROOT/addons/backgrounds/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-prod-posix b/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-prod-posix index aec54988b539..75828e64cd71 100644 --- a/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-prod-posix +++ b/lib/core-server/src/__snapshots__/cra-ts-essentials_preview-prod-posix @@ -7,8 +7,7 @@ Object { "ROOT/lib/core-client/dist/esm/globals/globals.js", "NODE_MODULES/@storybook/addon-ie11/dist/event-source-polyfill.js", "ROOT/storybook-init-framework-entry.js", - "ROOT/renderers/react/dist/esm/docs/config.js-generated-config-entry.js", - "ROOT/renderers/react/dist/esm/preview/config.js-generated-config-entry.js", + "ROOT/renderers/react/preview.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", "ROOT/addons/backgrounds/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-dev-posix b/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-dev-posix index 339012752b7f..bddd0ee7043f 100644 --- a/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-dev-posix +++ b/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-dev-posix @@ -7,8 +7,7 @@ Object { "ROOT/lib/core-client/dist/esm/globals/globals.js", "NODE_MODULES/webpack-hot-middleware/client.js?reload=true&quiet=false&noInfo=undefined", "ROOT/storybook-init-framework-entry.js", - "ROOT/renderers/html/dist/esm/preview/config.js-generated-config-entry.js", - "ROOT/renderers/html/dist/esm/docs/config.js-generated-config-entry.js", + "ROOT/renderers/html/preview.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/a11y/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-prod-posix b/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-prod-posix index 04f4ef4b1cde..8ea9e556d889 100644 --- a/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-prod-posix +++ b/lib/core-server/src/__snapshots__/html-kitchen-sink_preview-prod-posix @@ -6,8 +6,7 @@ Object { "ROOT/lib/core-client/dist/esm/globals/polyfills.js", "ROOT/lib/core-client/dist/esm/globals/globals.js", "ROOT/storybook-init-framework-entry.js", - "ROOT/renderers/html/dist/esm/preview/config.js-generated-config-entry.js", - "ROOT/renderers/html/dist/esm/docs/config.js-generated-config-entry.js", + "ROOT/renderers/html/preview.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/a11y/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/vue-3-cli_preview-dev-posix b/lib/core-server/src/__snapshots__/vue-3-cli_preview-dev-posix index 447d4041c29b..20307f882cd3 100644 --- a/lib/core-server/src/__snapshots__/vue-3-cli_preview-dev-posix +++ b/lib/core-server/src/__snapshots__/vue-3-cli_preview-dev-posix @@ -7,8 +7,7 @@ Object { "ROOT/lib/core-client/dist/esm/globals/globals.js", "NODE_MODULES/webpack-hot-middleware/client.js?reload=true&quiet=false&noInfo=undefined", "ROOT/storybook-init-framework-entry.js", - "ROOT/renderers/vue3/dist/esm/preview/config.js-generated-config-entry.js", - "ROOT/renderers/vue3/dist/esm/docs/config.js-generated-config-entry.js", + "ROOT/renderers/vue3/preview.js-generated-config-entry.js", "ROOT/addons/links/preview.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/vue-3-cli_preview-prod-posix b/lib/core-server/src/__snapshots__/vue-3-cli_preview-prod-posix index eb2deeb84377..f5937f58be8a 100644 --- a/lib/core-server/src/__snapshots__/vue-3-cli_preview-prod-posix +++ b/lib/core-server/src/__snapshots__/vue-3-cli_preview-prod-posix @@ -6,8 +6,7 @@ Object { "ROOT/lib/core-client/dist/esm/globals/polyfills.js", "ROOT/lib/core-client/dist/esm/globals/globals.js", "ROOT/storybook-init-framework-entry.js", - "ROOT/renderers/vue3/dist/esm/preview/config.js-generated-config-entry.js", - "ROOT/renderers/vue3/dist/esm/docs/config.js-generated-config-entry.js", + "ROOT/renderers/vue3/preview.js-generated-config-entry.js", "ROOT/addons/links/preview.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-dev-posix b/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-dev-posix index 8c67ac73c428..f6c306ddc0a9 100644 --- a/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-dev-posix +++ b/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-dev-posix @@ -7,8 +7,7 @@ Object { "ROOT/lib/core-client/dist/esm/globals/globals.js", "NODE_MODULES/webpack-hot-middleware/client.js?reload=true&quiet=false&noInfo=undefined", "ROOT/storybook-init-framework-entry.js", - "ROOT/renderers/web-components/dist/esm/preview/config.js-generated-config-entry.js", - "ROOT/renderers/web-components/dist/esm/docs/config.js-generated-config-entry.js", + "ROOT/renderers/web-components/preview.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/a11y/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", diff --git a/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-prod-posix b/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-prod-posix index 9387fee74874..7496e3545bb0 100644 --- a/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-prod-posix +++ b/lib/core-server/src/__snapshots__/web-components-kitchen-sink_preview-prod-posix @@ -6,8 +6,7 @@ Object { "ROOT/lib/core-client/dist/esm/globals/polyfills.js", "ROOT/lib/core-client/dist/esm/globals/globals.js", "ROOT/storybook-init-framework-entry.js", - "ROOT/renderers/web-components/dist/esm/preview/config.js-generated-config-entry.js", - "ROOT/renderers/web-components/dist/esm/docs/config.js-generated-config-entry.js", + "ROOT/renderers/web-components/preview.js-generated-config-entry.js", "ROOT/addons/docs/preview.js-generated-config-entry.js", "ROOT/addons/a11y/preview.js-generated-config-entry.js", "ROOT/addons/actions/preview.js-generated-config-entry.js", From 5d7d7d672399fc28744f9bc958f6b3c01dd6a489 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Wed, 20 Apr 2022 21:05:01 +0800 Subject: [PATCH 18/24] Persist renderers to workspace --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index d8e80c3533aa..e5261ea469ad 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -106,6 +106,7 @@ jobs: - addons - app - lib + - renderers chromatic: executor: sb_node_14_browsers parallelism: 4 From eb15607f9945c42ea5668365bcddfba6d7889e12 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Wed, 20 Apr 2022 21:57:00 +0800 Subject: [PATCH 19/24] Run `sb build` instead of `build-storybook` --- scripts/run-e2e.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run-e2e.ts b/scripts/run-e2e.ts index 4516e2cd6c07..59d193e8c760 100644 --- a/scripts/run-e2e.ts +++ b/scripts/run-e2e.ts @@ -54,7 +54,7 @@ const overrideMainConfig = async ({ cwd, mainOverrides }: Options) => { const buildStorybook = async ({ cwd }: Options) => { await exec( - `yarn build-storybook --quiet`, + `npx sb build --quiet`, { cwd }, { startMessage: `👷 Building Storybook`, errorMessage: `🚨 Storybook build failed` } ); From 69eabda7964b6c5277d9ce7c81916a83b83618ba Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 21 Apr 2022 11:16:19 +0800 Subject: [PATCH 20/24] Renderer-react: Fix IE11 support --- renderers/react/preview.js | 6 +----- renderers/react/src/config.ts | 5 +++++ 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 renderers/react/src/config.ts diff --git a/renderers/react/preview.js b/renderers/react/preview.js index c2ec328c149c..0d73a0b695f1 100644 --- a/renderers/react/preview.js +++ b/renderers/react/preview.js @@ -1,5 +1 @@ -import { parameters as docsParams } from './dist/esm/docs/config'; - -export const parameters = { framework: 'react', ...docsParams }; -export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; -export * from './dist/esm/preview/config'; +export * from './dist/esm/config'; diff --git a/renderers/react/src/config.ts b/renderers/react/src/config.ts new file mode 100644 index 000000000000..6a2fe62ad226 --- /dev/null +++ b/renderers/react/src/config.ts @@ -0,0 +1,5 @@ +import { parameters as docsParams } from './docs/config'; + +export const parameters = { framework: 'react', ...docsParams }; +export { decorators, argTypesEnhancers } from './docs/config'; +export * from './preview/config'; From b41f0b2f905255a648f14e782be39b3364efc296 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 21 Apr 2022 11:31:59 +0800 Subject: [PATCH 21/24] Fix IE11 in renderers --- renderers/html/preview.js | 6 +----- renderers/html/src/config.ts | 5 +++++ renderers/svelte/preview.js | 6 +----- renderers/svelte/src/config.ts | 5 +++++ renderers/vue/preview.js | 6 +----- renderers/vue/src/config.ts | 5 +++++ renderers/vue3/preview.js | 6 +----- renderers/vue3/src/config.ts | 5 +++++ renderers/web-components/preview.js | 6 +----- renderers/web-components/src/config.ts | 5 +++++ 10 files changed, 30 insertions(+), 25 deletions(-) create mode 100644 renderers/html/src/config.ts create mode 100644 renderers/svelte/src/config.ts create mode 100644 renderers/vue/src/config.ts create mode 100644 renderers/vue3/src/config.ts create mode 100644 renderers/web-components/src/config.ts diff --git a/renderers/html/preview.js b/renderers/html/preview.js index b3bbddd1cb3b..0d73a0b695f1 100644 --- a/renderers/html/preview.js +++ b/renderers/html/preview.js @@ -1,5 +1 @@ -import { parameters as docsParams } from './dist/esm/docs/config'; - -export const parameters = { framework: 'html', ...docsParams }; -export { decorators } from './dist/esm/docs/config'; -export * from './dist/esm/preview/config'; +export * from './dist/esm/config'; diff --git a/renderers/html/src/config.ts b/renderers/html/src/config.ts new file mode 100644 index 000000000000..678ce5de5d38 --- /dev/null +++ b/renderers/html/src/config.ts @@ -0,0 +1,5 @@ +import { parameters as docsParams } from './docs/config'; + +export const parameters = { framework: 'html', ...docsParams }; +export { decorators } from './docs/config'; +export * from './preview/config'; diff --git a/renderers/svelte/preview.js b/renderers/svelte/preview.js index 779112166104..0d73a0b695f1 100644 --- a/renderers/svelte/preview.js +++ b/renderers/svelte/preview.js @@ -1,5 +1 @@ -import { parameters as docsParams } from './dist/esm/docs/config'; - -export const parameters = { framework: 'svelte', ...docsParams }; -export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; -export * from './dist/esm/preview/config'; +export * from './dist/esm/config'; diff --git a/renderers/svelte/src/config.ts b/renderers/svelte/src/config.ts new file mode 100644 index 000000000000..a31cdced623a --- /dev/null +++ b/renderers/svelte/src/config.ts @@ -0,0 +1,5 @@ +import { parameters as docsParams } from './docs/config'; + +export const parameters = { framework: 'svelte', ...docsParams }; +export { decorators, argTypesEnhancers } from './docs/config'; +export * from './preview/config'; diff --git a/renderers/vue/preview.js b/renderers/vue/preview.js index 4d27179aa3d6..0d73a0b695f1 100644 --- a/renderers/vue/preview.js +++ b/renderers/vue/preview.js @@ -1,5 +1 @@ -import { parameters as docsParams } from './dist/esm/docs/config'; - -export const parameters = { framework: 'vue', ...docsParams }; -export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; -export * from './dist/esm/preview/config'; +export * from './dist/esm/config'; diff --git a/renderers/vue/src/config.ts b/renderers/vue/src/config.ts new file mode 100644 index 000000000000..e96a09ba2452 --- /dev/null +++ b/renderers/vue/src/config.ts @@ -0,0 +1,5 @@ +import { parameters as docsParams } from './docs/config'; + +export const parameters = { framework: 'vue', ...docsParams }; +export { decorators, argTypesEnhancers } from './docs/config'; +export * from './preview/config'; diff --git a/renderers/vue3/preview.js b/renderers/vue3/preview.js index 71ec3972f314..0d73a0b695f1 100644 --- a/renderers/vue3/preview.js +++ b/renderers/vue3/preview.js @@ -1,5 +1 @@ -import { parameters as docsParams } from './dist/esm/docs/config'; - -export const parameters = { framework: 'vue3', ...docsParams }; -export { argTypesEnhancers } from './dist/esm/docs/config'; -export * from './dist/esm/preview/config'; +export * from './dist/esm/config'; diff --git a/renderers/vue3/src/config.ts b/renderers/vue3/src/config.ts new file mode 100644 index 000000000000..a70c17e19b52 --- /dev/null +++ b/renderers/vue3/src/config.ts @@ -0,0 +1,5 @@ +import { parameters as docsParams } from './docs/config'; + +export const parameters = { framework: 'vue3', ...docsParams }; +export { argTypesEnhancers } from './docs/config'; +export * from './preview/config'; diff --git a/renderers/web-components/preview.js b/renderers/web-components/preview.js index 86eaef1f15c3..0d73a0b695f1 100644 --- a/renderers/web-components/preview.js +++ b/renderers/web-components/preview.js @@ -1,5 +1 @@ -import { parameters as docsParams } from './dist/esm/docs/config'; - -export const parameters = { framework: 'web-components', ...docsParams }; -export { decorators, argTypesEnhancers } from './dist/esm/docs/config'; -export * from './dist/esm/preview/config'; +export * from './dist/esm/config'; diff --git a/renderers/web-components/src/config.ts b/renderers/web-components/src/config.ts new file mode 100644 index 000000000000..c670320afefb --- /dev/null +++ b/renderers/web-components/src/config.ts @@ -0,0 +1,5 @@ +import { parameters as docsParams } from './docs/config'; + +export const parameters = { framework: 'web-components', ...docsParams }; +export { decorators, argTypesEnhancers } from './docs/config'; +export * from './preview/config'; From 7cd57719df9ec621ea7d8fb9ceaf04b795075d52 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sun, 24 Apr 2022 14:39:06 +0800 Subject: [PATCH 22/24] Fix versions --- renderers/html/package.json | 12 ++++++------ renderers/preact/package.json | 8 ++++---- renderers/react/package.json | 12 ++++++------ renderers/server/package.json | 10 +++++----- renderers/svelte/package.json | 12 ++++++------ renderers/vue/package.json | 12 ++++++------ renderers/vue3/package.json | 10 +++++----- renderers/web-components/package.json | 16 ++++++++-------- 8 files changed, 46 insertions(+), 46 deletions(-) diff --git a/renderers/html/package.json b/renderers/html/package.json index b6e1fb3e1202..3ebdcc03fb57 100644 --- a/renderers/html/package.json +++ b/renderers/html/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/renderer-html", - "version": "6.5.0-alpha.64", + "version": "6.5.0-beta.0", "description": "Storybook HTML renderer", "keywords": [ "storybook" @@ -39,12 +39,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.64", - "@storybook/core-client": "6.5.0-alpha.64", + "@storybook/addons": "6.5.0-beta.0", + "@storybook/core-client": "6.5.0-beta.0", "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/docs-tools": "6.5.0-alpha.64", - "@storybook/preview-web": "6.5.0-alpha.64", - "@storybook/store": "6.5.0-alpha.64", + "@storybook/docs-tools": "6.5.0-beta.0", + "@storybook/preview-web": "6.5.0-beta.0", + "@storybook/store": "6.5.0-beta.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", diff --git a/renderers/preact/package.json b/renderers/preact/package.json index 063fb4884857..75548f5a138b 100644 --- a/renderers/preact/package.json +++ b/renderers/preact/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/renderer-preact", - "version": "6.5.0-alpha.64", + "version": "6.5.0-beta.0", "description": "Storybook Preact renderer", "keywords": [ "storybook" @@ -39,10 +39,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.64", - "@storybook/core-client": "6.5.0-alpha.64", + "@storybook/addons": "6.5.0-beta.0", + "@storybook/core-client": "6.5.0-beta.0", "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/store": "6.5.0-alpha.64", + "@storybook/store": "6.5.0-beta.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", diff --git a/renderers/react/package.json b/renderers/react/package.json index 882fead2f20a..9f887cb0f1b1 100644 --- a/renderers/react/package.json +++ b/renderers/react/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/renderer-react", - "version": "6.5.0-alpha.64", + "version": "6.5.0-beta.0", "description": "Storybook React renderer", "keywords": [ "storybook" @@ -40,12 +40,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.64", - "@storybook/client-logger": "6.5.0-alpha.64", - "@storybook/core-client": "6.5.0-alpha.64", + "@storybook/addons": "6.5.0-beta.0", + "@storybook/client-logger": "6.5.0-beta.0", + "@storybook/core-client": "6.5.0-beta.0", "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/docs-tools": "6.5.0-alpha.64", - "@storybook/store": "6.5.0-alpha.64", + "@storybook/docs-tools": "6.5.0-beta.0", + "@storybook/store": "6.5.0-beta.0", "@types/estree": "^0.0.51", "@types/node": "^14.14.20 || ^16.0.0", "acorn": "^7.4.1", diff --git a/renderers/server/package.json b/renderers/server/package.json index 20420be74205..42919c1f75f5 100644 --- a/renderers/server/package.json +++ b/renderers/server/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/renderer-server", - "version": "6.5.0-alpha.64", + "version": "6.5.0-beta.0", "description": "Storybook Server renderer", "keywords": [ "storybook" @@ -39,11 +39,11 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.64", - "@storybook/core-client": "6.5.0-alpha.64", + "@storybook/addons": "6.5.0-beta.0", + "@storybook/core-client": "6.5.0-beta.0", "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/preview-web": "6.5.0-alpha.64", - "@storybook/store": "6.5.0-alpha.64", + "@storybook/preview-web": "6.5.0-beta.0", + "@storybook/store": "6.5.0-beta.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", diff --git a/renderers/svelte/package.json b/renderers/svelte/package.json index ca3e4e886f6c..abffab3dc395 100644 --- a/renderers/svelte/package.json +++ b/renderers/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/renderer-svelte", - "version": "6.5.0-alpha.64", + "version": "6.5.0-beta.0", "description": "Storybook Svelte renderer", "keywords": [ "storybook" @@ -40,12 +40,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.64", - "@storybook/client-logger": "6.5.0-alpha.64", - "@storybook/core-client": "6.5.0-alpha.64", + "@storybook/addons": "6.5.0-beta.0", + "@storybook/client-logger": "6.5.0-beta.0", + "@storybook/core-client": "6.5.0-beta.0", "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/docs-tools": "6.5.0-alpha.64", - "@storybook/store": "6.5.0-alpha.64", + "@storybook/docs-tools": "6.5.0-beta.0", + "@storybook/store": "6.5.0-beta.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", diff --git a/renderers/vue/package.json b/renderers/vue/package.json index 26e4a2e0ad9e..5c1ea10c46c1 100644 --- a/renderers/vue/package.json +++ b/renderers/vue/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/renderer-vue", - "version": "6.5.0-alpha.64", + "version": "6.5.0-beta.0", "description": "Storybook Vue renderer", "keywords": [ "storybook" @@ -39,12 +39,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.64", - "@storybook/client-logger": "6.5.0-alpha.64", - "@storybook/core-client": "6.5.0-alpha.64", + "@storybook/addons": "6.5.0-beta.0", + "@storybook/client-logger": "6.5.0-beta.0", + "@storybook/core-client": "6.5.0-beta.0", "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/docs-tools": "6.5.0-alpha.64", - "@storybook/store": "6.5.0-alpha.64", + "@storybook/docs-tools": "6.5.0-beta.0", + "@storybook/store": "6.5.0-beta.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", diff --git a/renderers/vue3/package.json b/renderers/vue3/package.json index 340eff2417d3..0a1f441d8180 100644 --- a/renderers/vue3/package.json +++ b/renderers/vue3/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/renderer-vue3", - "version": "6.5.0-alpha.64", + "version": "6.5.0-beta.0", "description": "Storybook Vue 3 renderer", "keywords": [ "storybook" @@ -40,11 +40,11 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.64", - "@storybook/core-client": "6.5.0-alpha.64", + "@storybook/addons": "6.5.0-beta.0", + "@storybook/core-client": "6.5.0-beta.0", "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/docs-tools": "6.5.0-alpha.64", - "@storybook/store": "6.5.0-alpha.64", + "@storybook/docs-tools": "6.5.0-beta.0", + "@storybook/store": "6.5.0-beta.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", diff --git a/renderers/web-components/package.json b/renderers/web-components/package.json index 63d1b439e35b..8db6c95c473f 100644 --- a/renderers/web-components/package.json +++ b/renderers/web-components/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/renderer-web-components", - "version": "6.5.0-alpha.64", + "version": "6.5.0-beta.0", "description": "Storybook web-components renderer", "keywords": [ "lit-html", @@ -41,14 +41,14 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-alpha.64", - "@storybook/api": "6.5.0-alpha.64", - "@storybook/client-logger": "6.5.0-alpha.64", - "@storybook/core-client": "6.5.0-alpha.64", + "@storybook/addons": "6.5.0-beta.0", + "@storybook/api": "6.5.0-beta.0", + "@storybook/client-logger": "6.5.0-beta.0", + "@storybook/core-client": "6.5.0-beta.0", "@storybook/csf": "0.0.2--canary.7c6c115.0", - "@storybook/docs-tools": "6.5.0-alpha.64", - "@storybook/preview-web": "6.5.0-alpha.64", - "@storybook/store": "6.5.0-alpha.64", + "@storybook/docs-tools": "6.5.0-beta.0", + "@storybook/preview-web": "6.5.0-beta.0", + "@storybook/store": "6.5.0-beta.0", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", From 29dec7872f0e4fc68269474049ca3fbc757f6dd9 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Tue, 26 Apr 2022 17:41:50 +0800 Subject: [PATCH 23/24] Fix formatting --- app/react/src/typings.d.ts | 42 ++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/app/react/src/typings.d.ts b/app/react/src/typings.d.ts index cd1929c868b2..f21e29cca314 100644 --- a/app/react/src/typings.d.ts +++ b/app/react/src/typings.d.ts @@ -4,29 +4,28 @@ declare module 'global'; // TODO: Replace, as soon as @types/react-dom 17.0.14 is used // Source: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/fb0f14b7a35cde26ffaa82e7536c062e593e9ae6/types/react-dom/client.d.ts declare module 'react-dom/client' { - -import React = require('react'); + import React = require('react'); export interface HydrationOptions { - onHydrated?(suspenseInstance: Comment): void; - onDeleted?(suspenseInstance: Comment): void; - /** - * Prefix for `useId`. - */ - identifierPrefix?: string; - onRecoverableError?: (error: unknown) => void; + onHydrated?(suspenseInstance: Comment): void; + onDeleted?(suspenseInstance: Comment): void; + /** + * Prefix for `useId`. + */ + identifierPrefix?: string; + onRecoverableError?: (error: unknown) => void; } export interface RootOptions { - /** - * Prefix for `useId`. - */ - identifierPrefix?: string; - onRecoverableError?: (error: unknown) => void; + /** + * Prefix for `useId`. + */ + identifierPrefix?: string; + onRecoverableError?: (error: unknown) => void; } export interface Root { - render(children: React.ReactChild | Iterable): void; - unmount(): void; + render(children: React.ReactChild | Iterable): void; + unmount(): void; } /** @@ -34,11 +33,14 @@ import React = require('react'); * * @see https://reactjs.org/docs/concurrent-mode-reference.html#createroot */ - export function createRoot(container: Element | Document | DocumentFragment | Comment, options?: RootOptions): Root; + export function createRoot( + container: Element | Document | DocumentFragment | Comment, + options?: RootOptions + ): Root; export function hydrateRoot( - container: Element | Document | DocumentFragment | Comment, - initialChildren: React.ReactChild | Iterable, - options?: HydrationOptions, + container: Element | Document | DocumentFragment | Comment, + initialChildren: React.ReactChild | Iterable, + options?: HydrationOptions ): Root; } From 70647a13815aa2915c79cf5ad18037edcec84c43 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sun, 29 May 2022 18:56:46 +0800 Subject: [PATCH 24/24] Merge branch 'future/base' into future/add-renderers --- .../workflows/markdown-link-check-config.json | 21 +- CHANGELOG.md | 78 + MAINTAINERS.md | 4 +- MIGRATION.md | 83 +- README.md | 6 +- RELEASES.md | 5 +- addons/a11y/package.json | 18 +- .../src/components/VisionSimulator.test.tsx | 69 + .../a11y/src/components/VisionSimulator.tsx | 90 +- addons/actions/package.json | 18 +- addons/backgrounds/package.json | 16 +- addons/controls/package.json | 20 +- addons/docs/package.json | 34 +- addons/essentials/package.json | 30 +- addons/interactions/package.json | 20 +- addons/jest/package.json | 16 +- addons/links/package.json | 12 +- addons/measure/package.json | 14 +- addons/outline/package.json | 14 +- addons/storyshots/storyshots-core/README.md | 4 +- .../storyshots/storyshots-core/package.json | 22 +- .../storyshots-puppeteer/package.json | 8 +- addons/storysource/package.json | 18 +- addons/toolbars/package.json | 14 +- addons/viewport/package.json | 16 +- app/angular/package.json | 26 +- app/angular/setup-jest.ts | 2 +- .../builders/build-storybook/index.spec.ts | 2 +- .../builders/start-storybook/index.spec.ts | 2 +- .../angular-beta/RendererFactory.test.ts | 1 + .../projects/pattern-lib/tsconfig.lib.json | 1 + .../projects/pattern-lib/tsconfig.lib.json | 1 + app/ember/package.json | 14 +- app/html/package.json | 12 +- app/preact/package.json | 10 +- app/react/package.json | 14 +- .../src/server/framework-preset-react-docs.ts | 1 + app/server/package.json | 10 +- app/svelte/package.json | 12 +- app/vue/package.json | 12 +- app/vue3/package.json | 12 +- app/vue3/src/server/framework-preset-vue3.ts | 15 +- app/web-components/package.json | 12 +- docs/addons/addons-api.md | 2 +- docs/addons/install-addons.md | 2 +- docs/addons/introduction.md | 2 +- docs/addons/writing-presets.md | 16 +- docs/api/cli-options.md | 6 + docs/builders/builder-api.md | 163 ++ docs/builders/overview.md | 24 + docs/builders/storybook-builder-workflow.png | Bin 0 -> 182393 bytes docs/builders/storybook-builders.png | Bin 0 -> 85962 bytes docs/builders/vite.md | 122 ++ docs/builders/webpack.md | 203 +++ .../configure/css-troubleshooting/angular.mdx | 38 +- docs/configure/features-and-behavior.md | 2 +- docs/configure/overview.md | 11 +- docs/configure/sidebar-and-urls.md | 62 +- docs/configure/telemetry.md | 9 +- docs/configure/upgrading.md | 10 +- docs/essentials/introduction.md | 2 +- docs/faq.md | 119 +- docs/get-started/install.md | 8 +- .../installation-command-section/angular.mdx | 2 +- .../installation-command-section/ember.mdx | 2 +- .../installation-command-section/html.mdx | 2 +- .../installation-command-section/preact.mdx | 2 +- .../installation-command-section/react.mdx | 2 +- .../installation-command-section/svelte.mdx | 2 +- .../installation-command-section/vue.mdx | 2 +- .../web-components.mdx | 2 +- docs/get-started/setup.md | 8 +- docs/sharing/design-integrations.md | 2 +- docs/sharing/storybook-composition.md | 2 +- ...mponent-story-auto-title.csf3-story.js.mdx | 16 + .../common/component-story-auto-title.js.mdx | 4 - .../component-story-configuration.js.mdx | 6 - .../common/mdx-changelog-stories.mdx.mdx | 12 + .../storybook-builder-api-build-server.ts.mdx | 36 + ...k-builder-api-configuration-options.ts.mdx | 36 + .../storybook-builder-api-dev-server.ts.mdx | 22 + .../storybook-builder-api-interface.ts.mdx | 22 + .../common/storybook-builder-api-mdx.ts.mdx | 20 + ...orybook-builder-api-preview-exports.ts.mdx | 82 + ...orybook-builder-api-shutdown-server.ts.mdx | 24 + .../common/storybook-config-layout.js.mdx | 14 +- ...torybook-csf-3-auto-title-redundant.js.mdx | 17 + .../storybook-main-auto-title-custom.js.mdx | 15 + ...-main-configuration-src-dir.main-js.js.mdx | 15 + .../common/storybook-main-enable-mdx2.js.mdx | 11 + ...book-main-enable-transcludemarkdown.js.mdx | 22 + ...orybook-main-with-single-static-dir.js.mdx | 6 +- ...rybook-manager-render-label-stories.js.mdx | 13 + .../common/storybook-mdx2-install.npm.js.mdx | 3 + .../common/storybook-mdx2-install.yarn.js.mdx | 3 + .../common/storybook-msw-generate.msw.js.mdx | 3 + .../common/storybook-msw-install.npm.js.mdx | 3 + .../common/storybook-msw-install.yarn.js.mdx | 3 + ...torybook-preview-register-msw-addon.js.mdx | 25 + ...ook-storyloading-with-custom-object.js.mdx | 2 +- .../storybook-test-runner-install.npm.js.mdx | 2 +- .../storybook-test-runner-install.yarn.js.mdx | 2 +- .../storybook-vite-builder-aliasing.js.mdx | 24 + .../storybook-vite-builder-config-env.js.mdx | 24 + .../storybook-vite-builder-install.npm.js.mdx | 3 + ...storybook-vite-builder-install.yarn.js.mdx | 3 + ...storybook-vite-builder-react-docgen.js.mdx | 14 + .../storybook-vite-builder-register.js.mdx | 11 + ...torybook-vite-builder-svelte-plugin.js.mdx | 24 + ...storybook-vite-builder-ts-configure.ts.mdx | 19 + docs/toc.js | 32 +- docs/versions/next.json | 2 +- ...og-mdx-md-transcludemarkdown-optimized.png | Bin 0 -> 38411 bytes docs/writing-docs/doc-block-source.md | 4 +- docs/writing-docs/docs-page.md | 2 +- docs/writing-docs/mdx.md | 60 +- .../build-pages-with-storybook.md | 62 +- docs/writing-tests/test-runner.md | 2 +- examples/README.md | 18 +- examples/angular-cli/.storybook/main.js | 1 + examples/angular-cli/jest-config/setup.ts | 2 +- examples/angular-cli/jest.config.js | 8 +- examples/angular-cli/package.json | 32 +- .../component-with-on-destroy.stories.ts | 2 +- examples/cra-kitchen-sink/.storybook/main.js | 2 +- examples/cra-kitchen-sink/package.json | 28 +- examples/cra-react15/.storybook/main.js | 1 + examples/cra-react15/package.json | 16 +- examples/cra-ts-essentials/.storybook/main.ts | 1 + examples/cra-ts-essentials/package.json | 16 +- .../testing-react/components/AccountForm.tsx | 2 +- .../cra-ts-kitchen-sink/.storybook/main.ts | 1 + examples/cra-ts-kitchen-sink/package.json | 18 +- .../stories/docgen-tests/types/prop-types.js | 2 +- examples/ember-cli/.storybook/main.js | 1 + examples/ember-cli/package.json | 26 +- examples/external-docs/README.md | 2 +- examples/external-docs/package.json | 16 +- .../src/components/AccountForm.tsx | 2 +- examples/html-kitchen-sink/.storybook/main.js | 1 + examples/html-kitchen-sink/package.json | 34 +- examples/official-storybook/main.ts | 5 + examples/official-storybook/package.json | 48 +- .../stories/core/args.stories.js | 20 + .../stories/title/AutoTitle.stories.js | 12 + .../stories/title/CustomTitle.stories.js | 11 + .../preact-kitchen-sink/.storybook/main.js | 1 + examples/preact-kitchen-sink/package.json | 24 +- examples/react-ts/.storybook/main.ts | 9 + examples/react-ts/package.json | 20 +- examples/react-ts/src/AccountForm.tsx | 2 +- .../src/__snapshots__/storyshots.test.ts.snap | 214 ++- .../react-ts/src/title/AutoTitle.stories.js | 12 + .../react-ts/src/title/CustomTitle.stories.js | 11 + examples/server-kitchen-sink/package.json | 18 +- examples/standalone-preview/package.json | 10 +- .../svelte-kitchen-sink/.storybook/main.js | 1 + examples/svelte-kitchen-sink/package.json | 30 +- examples/vue-3-cli/.storybook/main.js | 1 + examples/vue-3-cli/package.json | 16 +- examples/vue-cli/.storybook/main.js | 1 + examples/vue-cli/package.json | 12 +- examples/vue-cli/src/button/Button.stories.ts | 7 + examples/vue-cli/src/button/Button.vue | 9 +- examples/vue-kitchen-sink/.storybook/main.js | 1 + examples/vue-kitchen-sink/package.json | 30 +- .../.storybook/main.js | 1 + .../web-components-kitchen-sink/package.json | 2 +- lerna.json | 2 +- lib/addons/package.json | 16 +- lib/api/package.json | 16 +- lib/api/src/index.tsx | 2 +- lib/api/src/modules/layout.ts | 23 +- lib/api/src/modules/refs.ts | 6 +- lib/api/src/tests/layout.test.js | 2 +- lib/api/src/tests/refs.test.js | 79 + lib/api/src/version.ts | 2 +- lib/builder-webpack4/package.json | 34 +- lib/builder-webpack5/package.json | 32 +- .../src/presets/preview-preset.ts | 15 +- lib/channel-postmessage/package.json | 12 +- lib/channel-postmessage/src/index.ts | 3 +- lib/channel-websocket/package.json | 10 +- lib/channels/package.json | 4 +- lib/cli-sb/package.json | 6 +- lib/cli-storybook/package.json | 6 +- lib/cli/package.json | 21 +- .../src/automigrate/fixes/angular12.test.ts | 20 +- lib/cli/src/automigrate/fixes/index.ts | 11 +- lib/cli/src/automigrate/fixes/vue3.test.ts | 139 ++ lib/cli/src/automigrate/fixes/vue3.ts | 60 + lib/cli/src/automigrate/fixes/webpack5.ts | 2 +- lib/cli/src/automigrate/index.ts | 42 +- lib/cli/src/detect-nextjs.test.ts | 53 + lib/cli/src/detect-nextjs.ts | 30 + lib/cli/src/detect-webpack.ts | 32 + lib/cli/src/detect.ts | 32 +- .../common/Introduction.stories.mdx | 202 +-- lib/cli/src/initiate.ts | 183 ++- lib/cli/src/repro-generators/configs.ts | 2 +- lib/cli/src/versions.ts | 114 +- lib/client-api/package.json | 16 +- lib/client-api/src/StoryStoreFacade.ts | 22 +- lib/client-logger/package.json | 4 +- lib/codemod/package.json | 8 +- lib/codemod/src/transforms/csf-2-to-3.ts | 5 +- lib/components/package.json | 16 +- .../src/blocks/ArgsTable/ArgsTable.tsx | 19 +- .../src/blocks/DocsPageExampleCaption.md | 12 +- .../syntaxhighlighter/syntaxhighlighter.tsx | 16 +- lib/core-client/package.json | 22 +- lib/core-client/src/preview/start.test.ts | 3 +- lib/core-common/package.json | 8 +- .../src/utils/get-storybook-info.ts | 3 +- lib/core-events/package.json | 4 +- lib/core-server/package.json | 28 +- .../__snapshots__/vue-3-cli_preview-dev-posix | 16 +- .../vue-3-cli_preview-prod-posix | 16 +- .../src/utils/StoryIndexGenerator.ts | 8 +- lib/core-server/src/utils/open-in-browser.ts | 2 +- lib/core-server/src/utils/update-check.ts | 2 +- lib/csf-tools/package.json | 10 +- lib/csf-tools/src/CsfFile.test.ts | 12 +- lib/csf-tools/src/CsfFile.ts | 12 +- lib/docs-tools/package.json | 6 +- lib/instrumenter/package.json | 10 +- lib/manager-webpack4/package.json | 18 +- lib/manager-webpack5/package.json | 18 +- lib/node-logger/package.json | 4 +- lib/postinstall/package.json | 4 +- lib/preview-web/package.json | 14 +- lib/preview-web/src/Preview.tsx | 8 +- lib/preview-web/src/PreviewWeb.test.ts | 98 +- lib/router/package.json | 6 +- lib/source-loader/package.json | 8 +- lib/store/package.json | 10 +- lib/store/src/args.test.ts | 5 + lib/store/src/args.ts | 16 +- lib/store/src/autoTitle.test.ts | 341 +++-- lib/store/src/autoTitle.ts | 51 +- lib/telemetry/package.json | 8 +- lib/telemetry/src/anonymous-id.ts | 8 +- lib/telemetry/src/get-monorepo-type.ts | 2 + lib/telemetry/src/storybook-metadata.ts | 6 +- lib/theming/package.json | 6 +- lib/ui/package.json | 20 +- lib/ui/src/app.stories.tsx | 4 +- lib/ui/src/components/layout/app.mockdata.tsx | 4 +- lib/ui/src/components/layout/container.tsx | 8 +- lib/ui/src/components/layout/mobile.tsx | 4 +- .../components/preview/preview.mockdata.tsx | 2 +- lib/ui/src/components/preview/preview.tsx | 6 +- lib/ui/src/components/preview/utils/types.tsx | 2 +- lib/ui/src/containers/menu.tsx | 6 +- lib/ui/src/containers/sidebar.tsx | 4 +- package.json | 4 +- renderers/html/package.json | 12 +- renderers/preact/package.json | 8 +- renderers/react/package.json | 12 +- .../docs/lib/inspection/acornParser.test.ts | 2 +- renderers/server/package.json | 10 +- renderers/svelte/package.json | 12 +- renderers/vue/package.json | 12 +- renderers/vue/src/preview/config.ts | 2 +- renderers/vue/src/preview/render.ts | 4 +- renderers/vue3/package.json | 10 +- renderers/vue3/src/preview/config.ts | 2 +- renderers/web-components/package.json | 16 +- .../src/docs/sourceDecorator.test.ts | 49 +- .../src/docs/sourceDecorator.ts | 8 +- scripts/bootstrap.js | 13 +- scripts/build-package.js | 4 +- scripts/bundle-package.ts | 10 +- scripts/reset.js | 4 +- yarn.lock | 1344 +++++++++-------- 275 files changed, 4825 insertions(+), 2020 deletions(-) create mode 100644 addons/a11y/src/components/VisionSimulator.test.tsx create mode 100644 docs/builders/builder-api.md create mode 100644 docs/builders/overview.md create mode 100644 docs/builders/storybook-builder-workflow.png create mode 100644 docs/builders/storybook-builders.png create mode 100644 docs/builders/vite.md create mode 100644 docs/builders/webpack.md create mode 100644 docs/snippets/common/component-story-auto-title.csf3-story.js.mdx delete mode 100644 docs/snippets/common/component-story-auto-title.js.mdx delete mode 100644 docs/snippets/common/component-story-configuration.js.mdx create mode 100644 docs/snippets/common/mdx-changelog-stories.mdx.mdx create mode 100644 docs/snippets/common/storybook-builder-api-build-server.ts.mdx create mode 100644 docs/snippets/common/storybook-builder-api-configuration-options.ts.mdx create mode 100644 docs/snippets/common/storybook-builder-api-dev-server.ts.mdx create mode 100644 docs/snippets/common/storybook-builder-api-interface.ts.mdx create mode 100644 docs/snippets/common/storybook-builder-api-mdx.ts.mdx create mode 100644 docs/snippets/common/storybook-builder-api-preview-exports.ts.mdx create mode 100644 docs/snippets/common/storybook-builder-api-shutdown-server.ts.mdx create mode 100644 docs/snippets/common/storybook-csf-3-auto-title-redundant.js.mdx create mode 100644 docs/snippets/common/storybook-main-auto-title-custom.js.mdx create mode 100644 docs/snippets/common/storybook-main-configuration-src-dir.main-js.js.mdx create mode 100644 docs/snippets/common/storybook-main-enable-mdx2.js.mdx create mode 100644 docs/snippets/common/storybook-main-enable-transcludemarkdown.js.mdx create mode 100644 docs/snippets/common/storybook-manager-render-label-stories.js.mdx create mode 100644 docs/snippets/common/storybook-mdx2-install.npm.js.mdx create mode 100644 docs/snippets/common/storybook-mdx2-install.yarn.js.mdx create mode 100644 docs/snippets/common/storybook-msw-generate.msw.js.mdx create mode 100644 docs/snippets/common/storybook-msw-install.npm.js.mdx create mode 100644 docs/snippets/common/storybook-msw-install.yarn.js.mdx create mode 100644 docs/snippets/common/storybook-preview-register-msw-addon.js.mdx create mode 100644 docs/snippets/common/storybook-vite-builder-aliasing.js.mdx create mode 100644 docs/snippets/common/storybook-vite-builder-config-env.js.mdx create mode 100644 docs/snippets/common/storybook-vite-builder-install.npm.js.mdx create mode 100644 docs/snippets/common/storybook-vite-builder-install.yarn.js.mdx create mode 100644 docs/snippets/common/storybook-vite-builder-react-docgen.js.mdx create mode 100644 docs/snippets/common/storybook-vite-builder-register.js.mdx create mode 100644 docs/snippets/common/storybook-vite-builder-svelte-plugin.js.mdx create mode 100644 docs/snippets/common/storybook-vite-builder-ts-configure.ts.mdx create mode 100644 docs/writing-docs/changelog-mdx-md-transcludemarkdown-optimized.png create mode 100644 examples/official-storybook/stories/title/AutoTitle.stories.js create mode 100644 examples/official-storybook/stories/title/CustomTitle.stories.js create mode 100644 examples/react-ts/src/title/AutoTitle.stories.js create mode 100644 examples/react-ts/src/title/CustomTitle.stories.js create mode 100644 lib/cli/src/automigrate/fixes/vue3.test.ts create mode 100644 lib/cli/src/automigrate/fixes/vue3.ts create mode 100644 lib/cli/src/detect-nextjs.test.ts create mode 100644 lib/cli/src/detect-nextjs.ts create mode 100644 lib/cli/src/detect-webpack.ts diff --git a/.github/workflows/markdown-link-check-config.json b/.github/workflows/markdown-link-check-config.json index df6db06fff2e..8ae064afbbe4 100644 --- a/.github/workflows/markdown-link-check-config.json +++ b/.github/workflows/markdown-link-check-config.json @@ -14,6 +14,25 @@ }, { "pattern": "https://stackblitz.com/*" + }, + { + "pattern": "https://*.chromatic.com" + }, + { + "pattern": "https://www.chromatic.com/build?*" + }, + { + "pattern": "http://*.nodeca.com" + }, + { + "pattern": "http://definitelytyped.org/*" + }, + { + "pattern": "https://yoursite.com/*" + }, + { + "pattern": "https://my-specific-domain.com" } - ] + ], + "aliveStatusCodes": [429, 200] } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c184c6ed4b2b..f8f01a839ea2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,81 @@ +## 6.5.0-rc.1 (May 18, 2022) + +### Bug Fixes + +- CLI: Improve webpack version and add detection of nextjs ([#18220](https://github.com/storybookjs/storybook/pull/18220)) +- ArgsTable: Gracefully handle conditional args failures ([#18248](https://github.com/storybookjs/storybook/pull/18248)) +- Controls: Fix reset button broken for !undefined URL values ([#18231](https://github.com/storybookjs/storybook/pull/18231)) +- Vue3: Add support for TSX in single file components ([#18038](https://github.com/storybookjs/storybook/pull/18038)) + +## 6.5.0-rc.0 (May 17, 2022) + +### Features + +- Addon-a11y: Show % of users in toolbar menu ([#18003](https://github.com/storybookjs/storybook/pull/18003)) + +### Bug Fixes + +- Web-components: Clean Lit Expression comments in story source ([#18108](https://github.com/storybookjs/storybook/pull/18108)) +- Vue: Map args correctly in CSF3 implicit render function ([#18209](https://github.com/storybookjs/storybook/pull/18209)) +- Vue3: Fix CSF3 implicit render function when storyStoreV7 is enabled ([#18208](https://github.com/storybookjs/storybook/pull/182) + +### Maintenance + +- CLI: Don't throw is Ctrl + C was pressed when selecting a package in the build command ([#18195](https://github.com/storybookjs/storybook/pull/18195)) +- Build: Cleanup noise from unit tests ([#18196](https://github.com/storybookjs/storybook/pull/18196)) + +### Dependency Upgrades + +- Fixed PnP compatibility for bundled components package ([#18015](https://github.com/storybookjs/storybook/pull/18015)) + +## 6.5.0-beta.8 (May 11, 2022) + +### Bug Fixes + +- Composition: Fix metadata.json incorrectly overriding main.js refs versions ([#18185](https://github.com/storybookjs/storybook/pull/18185)) + +### Maintenance + +- Examples: Set channelOptions to disallow function serialization ([#18071](https://github.com/storybookjs/storybook/pull/18071)) + +### Dependency Upgrades + +- Upgrade to telejson 6 ([#18164](https://github.com/storybookjs/storybook/pull/18164)) + +## 6.5.0-beta.7 (May 9, 2022) + +### Features + +- CSF3: Add title prefix support for stories with custom titles ([#17724](https://github.com/storybookjs/storybook/pull/17724)) + +### Bug Fixes + +- Components: Fix race conditions in SyntaxHighlighter ([#18158](https://github.com/storybookjs/storybook/pull/18158)) + +### Maintenance + +- API: Deprecate isToolshown, rename to showToolbar ([#18131](https://github.com/storybookjs/storybook/pull/18131)) + +## 6.5.0-beta.6 (May 6, 2022) + +### Bug Fixes + +- Controls: Fix undefined args handling ([#18135](https://github.com/storybookjs/storybook/pull/18135)) + +### Maintenance + +- CLI: Update Introduction.stories.mdx template to be MDX2-friendly ([#18141](https://github.com/storybookjs/storybook/pull/18141)) + +### Dependency Upgrades + +- Remove jest from cli peerDependencies ([#18149](https://github.com/storybookjs/storybook/pull/18149)) + +## 6.5.0-beta.5 (May 4, 2022) + +### Bug Fixes + +- Core: Fix anonymous ID generation ([#18133](https://github.com/storybookjs/storybook/pull/18133)) + ## 6.5.0-beta.4 (May 4, 2022) ### Features diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 6ff77fef4875..28c946793682 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -15,7 +15,7 @@ This document outlines some of the processes that the maintainers should adhere | api:(name) | Issue, bug, or pull request related to Storybook's API (e.g.,[makeDecorator](/docs/addons/addons-api.md#makeDecorator-API)) | | args | Issue, bug, or pull request related to Storybook's [args](/docs/writing-stories/args.md) | | babel/webpack | Issue, bug, or pull request related to Storybook's build system (e.g., Webpack or Babel), for Webpack 5 issues see below | -| block:(name) | Issue or bug within a certain surface are of Storybook (e.g., [argsTable](/docs/writing-docs/doc-blocks.md#argstable)) | +| block:(name) | Issue or bug within a certain surface are of Storybook (e.g., [argsTable](/docs/writing-docs/doc-block-argstable.md)) | | BREAKING CHANGE | Issue or pull request that introduces a breaking change within Storybook's ecosystem. | | BREAKING PRERELASE | Breaking, but only for prerelease users (not relative to the stable release) | | build-storybook | Issue, bug, or pull request related to Storybook's production build | @@ -24,7 +24,7 @@ This document outlines some of the processes that the maintainers should adhere | cli | Issue, bug, or pull request that affects the Storybook's CLI | | compatibility with other tools | Issue, bug, or pull request between Storybook and other tools (e.g., [Nuxt](https://nuxtjs.org/)) | | components | Issue, bug, or pull request related to Storybook's internal components | -| composition | Issue, bug, or pull request related to Storybook [Composition](/docs/workflows/storybook-composition.md) | +| composition | Issue, bug, or pull request related to Storybook [Composition](/docs/sharing/storybook-composition.md) | | configuration | Issue, bug, or pull request related to Storybook [configuration](/docs/configure/overview.md) | | core | Issue, bug, or pull request related to Storybook's Core | | cra | Issue, bug, or pull request that affects Storybook's compatibility with Create React APP ([CRA](https://create-react-app.dev/docs/getting-started/))| diff --git a/MIGRATION.md b/MIGRATION.md index 418a698b4ece..2d5886acb151 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -5,7 +5,9 @@ - [Framework field mandatory](#framework-field-mandatory) - [frameworkOptions renamed](#frameworkoptions-renamed) - [From version 6.4.x to 6.5.0](#from-version-64x-to-650) + - [Vue 3 upgrade](#vue-3-upgrade) - [React18 new root API](#react18-new-root-api) + - [Renamed isToolshown to showToolbar](#renamed-istoolshown-to-showtoolbar) - [Deprecated register.js](#deprecated-registerjs) - [Dropped support for addon-actions addDecorators](#dropped-support-for-addon-actions-adddecorators) - [Vite builder renamed](#vite-builder-renamed) @@ -14,6 +16,7 @@ - [CSF3 auto-title improvements](#csf3-auto-title-improvements) - [Auto-title filename case](#auto-title-filename-case) - [Auto-title redundant filename](#auto-title-redundant-filename) + - [Auto-title always prefixes](#auto-title-always-prefixes) - [From version 6.3.x to 6.4.0](#from-version-63x-to-640) - [Automigrate](#automigrate) - [CRA5 upgrade](#cra5-upgrade) @@ -225,6 +228,10 @@ module.exports = { ## From version 6.4.x to 6.5.0 +### Vue 3 upgrade + +Storybook 6.5 supports Vue 3 out of the box when you install it fresh. However, if you're upgrading your project from a previous version, you'll need to [follow the steps for opting-in to webpack 5](#webpack-5). + ### React18 new root API React 18 introduces a [new root API](https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html#updates-to-client-rendering-apis). Starting in 6.5, Storybook for React will auto-detect your react version and use the new root API automatically if you're on React18. @@ -237,6 +244,21 @@ module.exports = { }; ``` +### Renamed isToolshown to showToolbar + +Storybook's [manager API](docs/addons/addons-api.md) has deprecated the `isToolshown` option (to show/hide the toolbar) and renamed it to `showToolbar` for consistency with other similar UI options. + +Example: + +```js +// .storybook/manager.js +import { addons } from '@storybook/addons'; + +addons.setConfig({ + showToolbar: false, +}); +``` + ### Deprecated register.js In ancient versions of Storybook, addons were registered by referring to `addon-name/register.js`. This is going away in SB7.0. Instead you should just add `addon-name` to the `addons` array in `.storybook/main.js`. @@ -339,6 +361,36 @@ Since CSF3 is experimental, we are introducing this technically breaking change export default { title: 'Atoms/Button/Button' }; ``` +#### Auto-title always prefixes + +When the user provides a `prefix` in their `main.js` `stories` field, it now prefixes all titles to matching stories, whereas in 6.4 and earlier it only prefixed auto-titles. + +Consider the following example: + +```js +// main.js +module.exports = { + stories: [{ directory: '../src', titlePrefix: 'Custom' }] +} + +// ../src/NoTitle.stories.js +export default { component: Foo }; + +// ../src/Title.stories.js +export default { component: Bar, title: 'Bar' } +``` + +In 6.4, the final titles would be: + +- `NoTitle.stories.js` => `Custom/NoTitle` +- `Title.stories.js` => `Bar` + +In 6.5, the final titles would be: + +- `NoTitle.stories.js` => `Custom/NoTitle` +- `Title.stories.js` => `Custom/Bar` + + ## From version 6.3.x to 6.4.0 ### Automigrate @@ -352,7 +404,9 @@ For example, if you're in a webpack5 project but still use Storybook's default w You can run the existing suite of automigrations to see which ones apply to your project. This won't update any files unless you accept the changes: ``` + npx sb@next automigrate + ``` The automigration suite also runs when you create a new project (`sb init`) or when you update storybook (`sb upgrade`). @@ -362,7 +416,9 @@ The automigration suite also runs when you create a new project (`sb init`) or w Storybook 6.3 supports CRA5 out of the box when you install it fresh. However, if you're upgrading your project from a previous version, you'll need to upgrade the configuration. You can do this automatically by running: ``` + npx sb@next automigrate + ``` Or you can do the following steps manually to force Storybook to use webpack 5 for building your project: @@ -723,7 +779,29 @@ The `--static-dir` flag has been deprecated and will be removed in Storybook 7.0 ### Webpack 5 -Storybook 6.3 brings opt-in support for building both your project and the manager UI with webpack 5. To do so: +Storybook 6.3 brings opt-in support for building both your project and the manager UI with webpack 5. To do so, there are two ways: + +1 - Upgrade command + +If you're upgrading your Storybook version, run this command, which will both upgrade your dependencies but also detect whether you should migrate to webpack5 builders and apply the changes automatically: + +```shell +npx sb upgrade +``` + +2 - Automigrate command + +If you don't want to change your Storybook version but want Storybook to detect whether you should migrate to webpack5 builders and apply the changes automatically: + +```shell +npx sb automigrate +``` + +3 - Manually + +If either methods did not work or you just want to proceed manually, do the following steps: + +Install the dependencies: ```shell yarn add @storybook/builder-webpack5 @storybook/manager-webpack5 --dev @@ -2191,7 +2269,7 @@ Theming has been rewritten in v5. If you used theming in v4, please consult the ### Story hierarchy defaults -Storybook's UI contains a hierarchical tree of stories that can be configured by `hierarchySeparator` and `hierarchyRootSeparator` [options](./addons/options/README.md). +Storybook's UI contains a hierarchical tree of stories that can be configured by `hierarchySeparator` and `hierarchyRootSeparator` [options](https://github.com/storybookjs/deprecated-addons/blob/master/MIGRATION.md#options-addon-deprecated). In Storybook 4.x the values defaulted to `null` for both of these options, so that there would be no hierarchy by default. @@ -2856,3 +2934,4 @@ If you **are** using these addons, it takes two steps to migrate: import { action } from '@storybook/addon-actions'; import { linkTo } from '@storybook/addon-links'; ``` + \ No newline at end of file diff --git a/README.md b/README.md index e4eefb52ce8a..0472ab5a1acf 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ Documentation can be found [Storybook's docs site](https://storybook.js.org/docs ### Examples -Here are some featured examples that you can reference to see how Storybook works: +Here are some featured examples that you can reference to see how Storybook works: Storybook comes with a lot of [addons](https://storybook.js.org/docs/react/configure/storybook-addons) for component design, documentation, testing, interactivity, and so on. Storybook's API makes it possible to configure and extend in various ways. It has even been extended to support React Native, Android, iOS, and Flutter development for mobile. @@ -98,12 +98,12 @@ For additional help, join us in the [Storybook Discord](https://discord.gg/story | [Vue](app/vue) | [v6.4.x](https://storybookjs.netlify.com/vue-kitchen-sink/) | [![Vue](https://img.shields.io/npm/dm/@storybook/vue.svg)](app/vue) | | [Angular](app/angular) | [v6.4.x](https://storybookjs.netlify.com/angular-cli/) | [![Angular](https://img.shields.io/npm/dm/@storybook/angular.svg)](app/angular) | | [Web components](app/web-components) | [v6.4.x](https://storybookjs.netlify.com/web-components-kitchen-sink/) | [![Svelte](https://img.shields.io/npm/dm/@storybook/web-components.svg)](app/web-components) | -| [React Native](https://github.com/storybookjs/react-native) | - | [![React Native](https://img.shields.io/npm/dm/@storybook/react-native.svg)](app/react-native) | +| [React Native](https://github.com/storybookjs/react-native) | - | [![React Native](https://img.shields.io/npm/dm/@storybook/react-native.svg)](https://github.com/storybookjs/react-native) | | [HTML](app/html) | [v6.4.x](https://storybookjs.netlify.com/html-kitchen-sink/) | [![HTML](https://img.shields.io/npm/dm/@storybook/html.svg)](app/html) | | [Ember](app/ember) | [v6.4.x](https://storybookjs.netlify.com/ember-cli/) | [![Ember](https://img.shields.io/npm/dm/@storybook/ember.svg)](app/ember) | | [Svelte](app/svelte) | [v6.4.x](https://storybookjs.netlify.com/svelte-kitchen-sink/) | [![Svelte](https://img.shields.io/npm/dm/@storybook/svelte.svg)](app/svelte) | | [Preact](app/preact) | [v6.4.x](https://storybookjs.netlify.com/preact-kitchen-sink/) | [![Preact](https://img.shields.io/npm/dm/@storybook/preact.svg)](app/preact) | -| [Marionette.js](https://github.com/storybookjs/marionette) | - | [![Marionette.js](https://img.shields.io/npm/dm/@storybook/marionette.svg)](app/marionette) | +| [Marionette.js](https://github.com/storybookjs/marionette) | - | [![Marionette.js](https://img.shields.io/npm/dm/@storybook/marionette.svg)](https://github.com/storybookjs/marionette) | | [Android, iOS, Flutter](https://github.com/storybookjs/native) | [v6.4.x](https://storybookjs.github.io/native/@storybook/native-flutter-example/index.html) | [![Native](https://img.shields.io/npm/dm/@storybook/native.svg)](https://github.com/storybookjs/native) | ### Sub Projects diff --git a/RELEASES.md b/RELEASES.md index 0d98bf5f8736..88557cf2fbeb 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -81,12 +81,11 @@ there gathering upvotes and "me too" comments. We need a way to make sure that these bugs get addressed. For every non-PATCH release, we nominate a small number of bugs that must be -addressed before a release can go out by adding them to the milestone. For example, here's a list of blocking bugs [for the 3.2 milestone](https://github.com/storybookjs/storybook/milestone/3). +addressed before a release can go out by adding them to the milestone. For example, here's a list of blocking bugs [for the 6.5 milestone](https://github.com/storybookjs/storybook/milestone/75). Adding bugs to the milestone helps people looking for good ways to contribute, or to understand what is blocking the release so they can actually do something -about it. Discussion about which bugs are critical happens in the `#maintenance` -channel [in our Slack](https://now-examples-slackin-rrirkqohko.now.sh/) [![Storybook Slack](https://now-examples-slackin-rrirkqohko.now.sh/badge.svg)](https://now-examples-slackin-rrirkqohko.now.sh/) +about it. Discussion about which bugs are critical happens in the [`#maintenance` channel](https://discord.com/channels/486522875931656193/490070912448724992) in our Discord Server If you're experiencing a bug, the best way to make sure that it gets attention is to upvote it by adding a "thumbs-up" reaction in Github. This way important diff --git a/addons/a11y/package.json b/addons/a11y/package.json index 2f7ea67e4c89..0bf05819540a 100644 --- a/addons/a11y/package.json +++ b/addons/a11y/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-a11y", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Test component compliance with web accessibility standards", "keywords": [ "a11y", @@ -45,14 +45,14 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/channels": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/channels": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/theming": "6.5.0-rc.1", "axe-core": "^4.2.0", "core-js": "^3.8.2", "global": "^4.4.0", @@ -81,7 +81,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js", "storybook": { "displayName": "Accessibility", diff --git a/addons/a11y/src/components/VisionSimulator.test.tsx b/addons/a11y/src/components/VisionSimulator.test.tsx new file mode 100644 index 000000000000..51b41cdba5ca --- /dev/null +++ b/addons/a11y/src/components/VisionSimulator.test.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { render, fireEvent, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { ThemeProvider, themes, convert } from '@storybook/theming'; +import { VisionSimulator, baseList } from './VisionSimulator'; + +const getOptionByNameAndPercentage = (option: string, percentage: number) => + screen.getByText( + (content, element) => + content !== '' && + element.textContent === option && + (percentage === undefined || element.nextSibling.textContent === `${percentage}% of users`) + ); + +function ThemedVisionSimulator() { + return ( + + + + ); +} + +describe('Vision Simulator', () => { + it('should render tool button', async () => { + // when + render(); + + // then + // waitFor because WithTooltip is a lazy component + await waitFor(() => expect(screen.getByTitle('Vision simulator')).toBeInTheDocument()); + }); + + it('should display tooltip on click', async () => { + // given + render(); + await waitFor(() => expect(screen.getByTitle('Vision simulator')).toBeInTheDocument()); + + // when + userEvent.click(screen.getByRole('button', { name: 'Vision simulator' })); + + // then + await waitFor(() => expect(screen.getByText('blurred vision')).toBeInTheDocument()); + baseList.forEach(({ name, percentage }) => + expect(getOptionByNameAndPercentage(name, percentage)).toBeInTheDocument() + ); + }); + + it('should set filter', async () => { + // given + render(); + await waitFor(() => expect(screen.getByTitle('Vision simulator')).toBeInTheDocument()); + userEvent.click(screen.getByRole('button', { name: 'Vision simulator' })); + await waitFor(() => expect(screen.getByText('blurred vision')).toBeInTheDocument()); + + // when + fireEvent.click(screen.getByText('blurred vision')); + + // then + // eslint-disable-next-line no-undef + const rule = Object.values(document.styleSheets) + .filter(({ cssRules }) => cssRules) + .map(({ cssRules }) => Object.values(cssRules)) + .flat() + .find((cssRule: CSSRule) => cssRule.selectorText === '#storybook-preview-iframe'); + + expect(rule).toBeDefined(); + expect(rule.style.filter).toBe('blur(2px)'); + }); +}); diff --git a/addons/a11y/src/components/VisionSimulator.tsx b/addons/a11y/src/components/VisionSimulator.tsx index f4fb24cafc18..050c9392ecaa 100644 --- a/addons/a11y/src/components/VisionSimulator.tsx +++ b/addons/a11y/src/components/VisionSimulator.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, ReactNode, useState } from 'react'; +import React, { ReactNode, useState } from 'react'; import { Global, styled } from '@storybook/theming'; import { Icons, IconButton, WithTooltip, TooltipLinkList } from '@storybook/components'; @@ -6,32 +6,37 @@ import { Filters } from './ColorFilters'; const iframeId = 'storybook-preview-iframe'; -const baseList = [ - 'blurred vision', - 'deuteranomaly', - 'deuteranopia', - 'protanomaly', - 'protanopia', - 'tritanomaly', - 'tritanopia', - 'achromatomaly', - 'achromatopsia', - 'grayscale', -] as const; +interface Option { + name: string; + percentage?: number; +} + +export const baseList = [ + { name: 'blurred vision', percentage: 22.9 }, + { name: 'deuteranomaly', percentage: 2.7 }, + { name: 'deuteranopia', percentage: 0.56 }, + { name: 'protanomaly', percentage: 0.66 }, + { name: 'protanopia', percentage: 0.59 }, + { name: 'tritanomaly', percentage: 0.01 }, + { name: 'tritanopia', percentage: 0.016 }, + { name: 'achromatomaly', percentage: 0.00001 }, + { name: 'achromatopsia', percentage: 0.0001 }, + { name: 'grayscale' }, +] as Option[]; -type Filter = typeof baseList[number] | null; +type Filter = Option | null; -const getFilter = (filter: Filter) => { - if (!filter) { +const getFilter = (filterName: string) => { + if (!filterName) { return 'none'; } - if (filter === 'blurred vision') { + if (filterName === 'blurred vision') { return 'blur(2px)'; } - if (filter === 'grayscale') { + if (filterName === 'grayscale') { return 'grayscale(100%)'; } - return `url('#${filter}')`; + return `url('#${filterName}')`; }; const Hidden = styled.div(() => ({ @@ -42,7 +47,7 @@ const Hidden = styled.div(() => ({ }, })); -const ColorIcon = styled.span<{ filter: Filter }>( +const ColorIcon = styled.span<{ filter: string }>( { background: 'linear-gradient(to right, #F44336, #FF9800, #FFEB3B, #8BC34A, #2196F3, #9C27B0)', borderRadius: '1rem', @@ -66,6 +71,20 @@ export interface Link { onClick: () => void; } +const Column = styled.span({ + display: 'flex', + flexDirection: 'column', +}); + +const Title = styled.span({ + textTransform: 'capitalize', +}); + +const Description = styled.span(({ theme }) => ({ + fontSize: 11, + color: theme.textMutedColor, +})); + const getColorList = (active: Filter, set: (i: Filter) => void): Link[] => [ ...(active !== null ? [ @@ -80,27 +99,34 @@ const getColorList = (active: Filter, set: (i: Filter) => void): Link[] => [ }, ] : []), - ...baseList.map((i) => ({ - id: i, - title: i.charAt(0).toUpperCase() + i.slice(1), - onClick: () => { - set(i); - }, - right: , - active: active === i, - })), + ...baseList.map((i) => { + const description = i.percentage !== undefined ? `${i.percentage}% of users` : undefined; + return { + id: i.name, + title: ( + + {i.name} + {description && {description}} + + ), + onClick: () => { + set(i); + }, + right: , + active: active === i, + }; + }), ]; -export const VisionSimulator: FunctionComponent = () => { +export const VisionSimulator = () => { const [filter, setFilter] = useState(null); - return ( <> {filter && ( diff --git a/addons/actions/package.json b/addons/actions/package.json index 7805c3104878..a3e8624c7287 100644 --- a/addons/actions/package.json +++ b/addons/actions/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-actions", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Get UI feedback when an action is performed on an interactive element", "keywords": [ "storybook", @@ -41,13 +41,13 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/theming": "6.5.0-rc.1", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -56,7 +56,7 @@ "prop-types": "^15.7.2", "react-inspector": "^5.1.0", "regenerator-runtime": "^0.13.7", - "telejson": "^5.3.3", + "telejson": "^6.0.8", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2", "uuid-browser": "^3.1.0" @@ -80,7 +80,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js", "storybook": { "displayName": "Actions", diff --git a/addons/backgrounds/package.json b/addons/backgrounds/package.json index 257e8d005b5f..d4c6bb11b66d 100644 --- a/addons/backgrounds/package.json +++ b/addons/backgrounds/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-backgrounds", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Switch backgrounds to view components in different settings", "keywords": [ "addon", @@ -45,13 +45,13 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/theming": "6.5.0-rc.1", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", @@ -77,7 +77,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js", "storybook": { "displayName": "Backgrounds", diff --git a/addons/controls/package.json b/addons/controls/package.json index 9de789d6b5d2..e6446c0a5307 100644 --- a/addons/controls/package.json +++ b/addons/controls/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-controls", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Interact with component inputs dynamically in the Storybook UI", "keywords": [ "addon", @@ -45,15 +45,15 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-common": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-common": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/node-logger": "6.5.0-beta.4", - "@storybook/store": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/node-logger": "6.5.0-rc.1", + "@storybook/store": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", "core-js": "^3.8.2", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" @@ -73,7 +73,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/manager.js", "storybook": { "displayName": "Controls", diff --git a/addons/docs/package.json b/addons/docs/package.json index b4d648e55ab5..e974e4ac8048 100644 --- a/addons/docs/package.json +++ b/addons/docs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-docs", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Document component usage and properties in Markdown", "keywords": [ "addon", @@ -59,20 +59,20 @@ "@babel/preset-env": "^7.12.11", "@jest/transform": "^26.6.2", "@mdx-js/react": "^1.6.22", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/docs-tools": "6.5.0-beta.4", - "@storybook/mdx1-csf": "canary", - "@storybook/node-logger": "6.5.0-beta.4", - "@storybook/postinstall": "6.5.0-beta.4", - "@storybook/preview-web": "6.5.0-beta.4", - "@storybook/source-loader": "6.5.0-beta.4", - "@storybook/store": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/docs-tools": "6.5.0-rc.1", + "@storybook/mdx1-csf": "^0.0.1", + "@storybook/node-logger": "6.5.0-rc.1", + "@storybook/postinstall": "6.5.0-rc.1", + "@storybook/preview-web": "6.5.0-rc.1", + "@storybook/source-loader": "6.5.0-rc.1", + "@storybook/store": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", "babel-loader": "^8.0.0", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", @@ -86,11 +86,11 @@ }, "devDependencies": { "@babel/core": "^7.12.10", - "@storybook/mdx2-csf": "canary", + "@storybook/mdx2-csf": "^0.0.3", "@types/util-deprecate": "^1.0.0" }, "peerDependencies": { - "@storybook/mdx2-csf": "*", + "@storybook/mdx2-csf": "^0.0.3", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" }, @@ -108,7 +108,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js", "storybook": { "displayName": "Docs", diff --git a/addons/essentials/package.json b/addons/essentials/package.json index f6af1ec2a392..c56311c67ffc 100644 --- a/addons/essentials/package.json +++ b/addons/essentials/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-essentials", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Curated addons to bring out the best of Storybook", "keywords": [ "addon", @@ -39,25 +39,25 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addon-actions": "6.5.0-beta.4", - "@storybook/addon-backgrounds": "6.5.0-beta.4", - "@storybook/addon-controls": "6.5.0-beta.4", - "@storybook/addon-docs": "6.5.0-beta.4", - "@storybook/addon-measure": "6.5.0-beta.4", - "@storybook/addon-outline": "6.5.0-beta.4", - "@storybook/addon-toolbars": "6.5.0-beta.4", - "@storybook/addon-viewport": "6.5.0-beta.4", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/node-logger": "6.5.0-beta.4", + "@storybook/addon-actions": "6.5.0-rc.1", + "@storybook/addon-backgrounds": "6.5.0-rc.1", + "@storybook/addon-controls": "6.5.0-rc.1", + "@storybook/addon-docs": "6.5.0-rc.1", + "@storybook/addon-measure": "6.5.0-rc.1", + "@storybook/addon-outline": "6.5.0-rc.1", + "@storybook/addon-toolbars": "6.5.0-rc.1", + "@storybook/addon-viewport": "6.5.0-rc.1", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/node-logger": "6.5.0-rc.1", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0" }, "devDependencies": { "@babel/core": "^7.12.10", - "@storybook/vue": "6.5.0-beta.4", + "@storybook/vue": "6.5.0-rc.1", "@types/jest": "^26.0.16", "@types/webpack-env": "^1.16.0" }, @@ -120,6 +120,6 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js" } diff --git a/addons/interactions/package.json b/addons/interactions/package.json index a466e8aba301..d86a5ae3e0f2 100644 --- a/addons/interactions/package.json +++ b/addons/interactions/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-interactions", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Automate, test and debug user interactions", "keywords": [ "storybook-addons", @@ -42,15 +42,15 @@ }, "dependencies": { "@devtools-ds/object-inspector": "^1.1.2", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/instrumenter": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/instrumenter": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", "core-js": "^3.8.2", "global": "^4.4.0", "jest-mock": "^27.0.6", @@ -77,7 +77,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js", "storybook": { "displayName": "Interactions", diff --git a/addons/jest/package.json b/addons/jest/package.json index 95e6591c34ee..74d3c12556cc 100644 --- a/addons/jest/package.json +++ b/addons/jest/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-jest", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "React storybook addon that show component jest report", "keywords": [ "addon", @@ -47,12 +47,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", "core-js": "^3.8.2", "global": "^4.4.0", "react-sizeme": "^3.0.1", @@ -77,7 +77,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js", "storybook": { "displayName": "Jest", diff --git a/addons/links/package.json b/addons/links/package.json index ebfce723ce96..007075fb728f 100644 --- a/addons/links/package.json +++ b/addons/links/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-links", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Link stories together to build demos and prototypes with your UI components", "keywords": [ "addon", @@ -41,11 +41,11 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.0-beta.4", + "@storybook/router": "6.5.0-rc.1", "@types/qs": "^6.9.5", "core-js": "^3.8.2", "global": "^4.4.0", @@ -72,7 +72,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js", "storybook": { "displayName": "Links", diff --git a/addons/measure/package.json b/addons/measure/package.json index e9a5c9fc6efd..9333fad133dd 100644 --- a/addons/measure/package.json +++ b/addons/measure/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-measure", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Inspect layouts by visualizing the box model", "keywords": [ "storybook-addons", @@ -44,11 +44,11 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", "core-js": "^3.8.2", "global": "^4.4.0" @@ -71,7 +71,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js", "storybook": { "displayName": "Measure", diff --git a/addons/outline/package.json b/addons/outline/package.json index 8d0311919c00..b61963e6224b 100644 --- a/addons/outline/package.json +++ b/addons/outline/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-outline", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Outline all elements with CSS to help with layout placement and alignment", "keywords": [ "storybook-addons", @@ -47,11 +47,11 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", "core-js": "^3.8.2", "global": "^4.4.0", @@ -76,7 +76,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js", "storybook": { "displayName": "Outline", diff --git a/addons/storyshots/storyshots-core/README.md b/addons/storyshots/storyshots-core/README.md index 30404b8b2f8a..c9a18ae8bb99 100644 --- a/addons/storyshots/storyshots-core/README.md +++ b/addons/storyshots/storyshots-core/README.md @@ -470,7 +470,7 @@ Whenever you change your data requirements by adding (and rendering) or (acciden ## Using a custom directory -Depending on your project's needs, you can configure the `@storybook/addon-storyshots` to use a custom directory for the snapshots. You can read more about it in the [official docs](https://storybook.js.org/docs/react/workflows/snapshot-testing). +Depending on your project's needs, you can configure the `@storybook/addon-storyshots` to use a custom directory for the snapshots. You can read more about it in the [official docs](https://storybook.js.org/docs/react/writing-tests/snapshot-testing). ## Options @@ -654,7 +654,7 @@ This option needs to be set if either: ### `serializer` (deprecated) -Pass a custom serializer (such as enzyme-to-json) to serialize components to snapshot-comparable data. The functionality of this option is completely covered by [snapshotSerializers](`snapshotSerializers`) which should be used instead. +Pass a custom serializer (such as enzyme-to-json) to serialize components to snapshot-comparable data. The functionality of this option is completely covered by [snapshotSerializers](#snapshotserializers) which should be used instead. ```js import initStoryshots from '@storybook/addon-storyshots'; diff --git a/addons/storyshots/storyshots-core/package.json b/addons/storyshots/storyshots-core/package.json index 036d22872f2c..7702a64e8e14 100644 --- a/addons/storyshots/storyshots-core/package.json +++ b/addons/storyshots/storyshots-core/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-storyshots", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Take a code snapshot of every story automatically with Jest", "keywords": [ "addon", @@ -45,11 +45,11 @@ }, "dependencies": { "@jest/transform": "^26.6.2", - "@storybook/addons": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", "@storybook/babel-plugin-require-context-hook": "1.0.1", - "@storybook/client-api": "6.5.0-beta.4", - "@storybook/core-client": "6.5.0-beta.4", - "@storybook/core-common": "6.5.0-beta.4", + "@storybook/client-api": "6.5.0-rc.1", + "@storybook/core-client": "6.5.0-rc.1", + "@storybook/core-common": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", "@types/glob": "^7.1.3", "@types/jest": "^26.0.16", @@ -69,11 +69,11 @@ "@angular/core": "^11.2.0", "@angular/platform-browser-dynamic": "^11.2.0", "@emotion/jest": "^11.8.0", - "@storybook/addon-docs": "6.5.0-beta.4", - "@storybook/angular": "6.5.0-beta.4", - "@storybook/react": "6.5.0-beta.4", - "@storybook/vue": "6.5.0-beta.4", - "@storybook/vue3": "6.5.0-beta.4", + "@storybook/addon-docs": "6.5.0-rc.1", + "@storybook/angular": "6.5.0-rc.1", + "@storybook/react": "6.5.0-rc.1", + "@storybook/vue": "6.5.0-rc.1", + "@storybook/vue3": "6.5.0-rc.1", "babel-loader": "^8.0.0", "enzyme": "^3.11.0", "enzyme-to-json": "^3.6.1", @@ -150,7 +150,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "storybook": { "displayName": "Storyshots", "icon": "https://user-images.githubusercontent.com/263385/101991676-48cdf300-3c7c-11eb-8aa1-944dab6ab29b.png", diff --git a/addons/storyshots/storyshots-puppeteer/package.json b/addons/storyshots/storyshots-puppeteer/package.json index ccad56dc2a82..40ec2bc4fbf6 100644 --- a/addons/storyshots/storyshots-puppeteer/package.json +++ b/addons/storyshots/storyshots-puppeteer/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-storyshots-puppeteer", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Image snapshots addition to StoryShots based on puppeteer", "keywords": [ "addon", @@ -42,7 +42,7 @@ "dependencies": { "@axe-core/puppeteer": "^4.2.0", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/node-logger": "6.5.0-beta.4", + "@storybook/node-logger": "6.5.0-rc.1", "@types/jest-image-snapshot": "^4.1.3", "core-js": "^3.8.2", "jest-image-snapshot": "^4.3.0", @@ -53,7 +53,7 @@ "@types/puppeteer": "^5.4.0" }, "peerDependencies": { - "@storybook/addon-storyshots": "6.5.0-beta.4", + "@storybook/addon-storyshots": "6.5.0-rc.1", "puppeteer": "^2.0.0 || ^3.0.0" }, "peerDependenciesMeta": { @@ -64,5 +64,5 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04" + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401" } diff --git a/addons/storysource/package.json b/addons/storysource/package.json index 6d794d4c21c0..086b25b779f9 100644 --- a/addons/storysource/package.json +++ b/addons/storysource/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-storysource", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "View a story’s source code to see how it works and paste into your app", "keywords": [ "addon", @@ -41,13 +41,13 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/router": "6.5.0-beta.4", - "@storybook/source-loader": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/router": "6.5.0-rc.1", + "@storybook/source-loader": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", "core-js": "^3.8.2", "estraverse": "^5.2.0", "loader-utils": "^2.0.0", @@ -74,7 +74,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/index.js", "storybook": { "displayName": "Storysource", diff --git a/addons/toolbars/package.json b/addons/toolbars/package.json index accd192cf490..b8b305d57249 100644 --- a/addons/toolbars/package.json +++ b/addons/toolbars/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-toolbars", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Create your own toolbar items that control story rendering", "keywords": [ "addon", @@ -45,11 +45,11 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7" }, @@ -68,7 +68,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/manager.js", "storybook": { "displayName": "Toolbars", diff --git a/addons/viewport/package.json b/addons/viewport/package.json index f92052436b2f..5016cf623961 100644 --- a/addons/viewport/package.json +++ b/addons/viewport/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-viewport", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Build responsive components by adjusting Storybook’s viewport size and orientation", "keywords": [ "addon", @@ -42,12 +42,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", @@ -69,7 +69,7 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/preview.js", "storybook": { "displayName": "Viewport", diff --git a/app/angular/package.json b/app/angular/package.json index 6a189816c1df..f51c746aaff4 100644 --- a/app/angular/package.json +++ b/app/angular/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/angular", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Storybook for Angular: Develop Angular Components in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -39,18 +39,18 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "6.5.0-beta.4", - "@storybook/api": "6.5.0-beta.4", - "@storybook/client-logger": "6.5.0-beta.4", - "@storybook/core-client": "6.5.0-beta.4", - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", - "@storybook/core-server": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/api": "6.5.0-rc.1", + "@storybook/client-logger": "6.5.0-rc.1", + "@storybook/core-client": "6.5.0-rc.1", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", + "@storybook/core-server": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/docs-tools": "6.5.0-beta.4", - "@storybook/node-logger": "6.5.0-beta.4", + "@storybook/docs-tools": "6.5.0-rc.1", + "@storybook/node-logger": "6.5.0-rc.1", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.5.0-beta.4", + "@storybook/store": "6.5.0-rc.1", "@types/node": "^14.14.20 || ^16.0.0", "@types/react": "^16.14.23", "@types/react-dom": "^16.9.14", @@ -70,7 +70,7 @@ "read-pkg-up": "^7.0.1", "regenerator-runtime": "^0.13.7", "sass-loader": "^10.1.0", - "telejson": "^5.3.3", + "telejson": "^6.0.8", "ts-dedent": "^2.0.0", "ts-loader": "^8.0.14", "tsconfig-paths-webpack-plugin": "^3.3.0", @@ -132,5 +132,5 @@ "access": "public" }, "builders": "dist/ts3.9/builders/builders.json", - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04" + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401" } diff --git a/app/angular/setup-jest.ts b/app/angular/setup-jest.ts index 3e05aa930bb9..3caa91649606 100644 --- a/app/angular/setup-jest.ts +++ b/app/angular/setup-jest.ts @@ -1,4 +1,4 @@ // eslint-disable-next-line import/no-extraneous-dependencies -import 'jest-preset-angular'; +import 'jest-preset-angular/setup-jest'; global.EventSource = class {} as any; diff --git a/app/angular/src/builders/build-storybook/index.spec.ts b/app/angular/src/builders/build-storybook/index.spec.ts index c396c9cc6d9c..40b12a8b8804 100644 --- a/app/angular/src/builders/build-storybook/index.spec.ts +++ b/app/angular/src/builders/build-storybook/index.spec.ts @@ -142,7 +142,7 @@ describe('Build Storybook Builder', () => { }); it('should throw error', async () => { - buildStandaloneMock.mockRejectedValue(new Error()); + buildStandaloneMock.mockRejectedValue(true); const run = await architect.scheduleBuilder('@storybook/angular:start-storybook', { browserTarget: 'angular-cli:build-2', diff --git a/app/angular/src/builders/start-storybook/index.spec.ts b/app/angular/src/builders/start-storybook/index.spec.ts index 657087f4839e..1430ea25e5ba 100644 --- a/app/angular/src/builders/start-storybook/index.spec.ts +++ b/app/angular/src/builders/start-storybook/index.spec.ts @@ -124,7 +124,7 @@ describe('Start Storybook Builder', () => { }); it('should throw error', async () => { - buildStandaloneMock.mockRejectedValue(new Error()); + buildStandaloneMock.mockRejectedValue(true); const run = await architect.scheduleBuilder('@storybook/angular:start-storybook', { browserTarget: 'angular-cli:build-2', diff --git a/app/angular/src/client/preview/angular-beta/RendererFactory.test.ts b/app/angular/src/client/preview/angular-beta/RendererFactory.test.ts index d9976268d77d..3d57c6c9ef2e 100644 --- a/app/angular/src/client/preview/angular-beta/RendererFactory.test.ts +++ b/app/angular/src/client/preview/angular-beta/RendererFactory.test.ts @@ -22,6 +22,7 @@ describe('RendererFactory', () => { rootTargetDOMNode = global.document.getElementById('root'); rootDocstargetDOMNode = global.document.getElementById('root-docs'); (platformBrowserDynamic as any).mockImplementation(platformBrowserDynamicTesting); + jest.spyOn(console, 'log').mockImplementation(() => {}); }); afterEach(() => { diff --git a/app/angular/src/server/__mocks-ng-workspace__/with-lib/projects/pattern-lib/tsconfig.lib.json b/app/angular/src/server/__mocks-ng-workspace__/with-lib/projects/pattern-lib/tsconfig.lib.json index 6e06ad542ed3..557265aa5b56 100644 --- a/app/angular/src/server/__mocks-ng-workspace__/with-lib/projects/pattern-lib/tsconfig.lib.json +++ b/app/angular/src/server/__mocks-ng-workspace__/with-lib/projects/pattern-lib/tsconfig.lib.json @@ -2,6 +2,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", "outDir": "../../out-tsc/lib", "target": "es2015", "declaration": true, diff --git a/app/angular/src/server/__mocks-ng-workspace__/without-projects-entry/projects/pattern-lib/tsconfig.lib.json b/app/angular/src/server/__mocks-ng-workspace__/without-projects-entry/projects/pattern-lib/tsconfig.lib.json index 6e06ad542ed3..557265aa5b56 100644 --- a/app/angular/src/server/__mocks-ng-workspace__/without-projects-entry/projects/pattern-lib/tsconfig.lib.json +++ b/app/angular/src/server/__mocks-ng-workspace__/without-projects-entry/projects/pattern-lib/tsconfig.lib.json @@ -2,6 +2,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "baseUrl": ".", "outDir": "../../out-tsc/lib", "target": "es2015", "declaration": true, diff --git a/app/ember/package.json b/app/ember/package.json index 3a09ed6d8aed..f370cada8f00 100644 --- a/app/ember/package.json +++ b/app/ember/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/ember", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Storybook for Ember: Develop Ember Component in isolation with Hot Reloading.", "homepage": "https://github.com/storybookjs/storybook/tree/main/app/ember", "bugs": { @@ -36,11 +36,11 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/core-client": "6.5.0-beta.4", - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-server": "6.5.0-beta.4", - "@storybook/docs-tools": "6.5.0-beta.4", - "@storybook/store": "6.5.0-beta.4", + "@storybook/core-client": "6.5.0-rc.1", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-server": "6.5.0-rc.1", + "@storybook/docs-tools": "6.5.0-rc.1", + "@storybook/store": "6.5.0-rc.1", "core-js": "^3.8.2", "global": "^4.4.0", "react": "16.14.0", @@ -61,6 +61,6 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/client/index.js" } diff --git a/app/html/package.json b/app/html/package.json index a759b4c23a61..5667439bf947 100644 --- a/app/html/package.json +++ b/app/html/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/html", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Storybook for HTML: View HTML snippets in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -39,10 +39,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-server": "6.5.0-beta.4", - "@storybook/docs-tools": "6.5.0-beta.4", - "@storybook/renderer-html": "6.5.0-beta.4", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-server": "6.5.0-rc.1", + "@storybook/docs-tools": "6.5.0-rc.1", + "@storybook/renderer-html": "6.5.0-rc.1", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -65,6 +65,6 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/client/index.js" } diff --git a/app/preact/package.json b/app/preact/package.json index 76c5a297883b..ccc57a536eb3 100644 --- a/app/preact/package.json +++ b/app/preact/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preact", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Storybook for Preact: Develop Preact Component in isolation.", "keywords": [ "storybook" @@ -40,9 +40,9 @@ }, "dependencies": { "@babel/plugin-transform-react-jsx": "^7.12.12", - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-server": "6.5.0-beta.4", - "@storybook/renderer-preact": "6.5.0-beta.4", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-server": "6.5.0-rc.1", + "@storybook/renderer-preact": "6.5.0-rc.1", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -67,6 +67,6 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/client/index.js" } diff --git a/app/react/package.json b/app/react/package.json index 13cf7a96b297..bfb327b3d2ec 100644 --- a/app/react/package.json +++ b/app/react/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Storybook for React: Develop React Component in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -43,12 +43,12 @@ "@babel/preset-flow": "^7.12.1", "@babel/preset-react": "^7.12.10", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-server": "6.5.0-beta.4", - "@storybook/docs-tools": "6.5.0-beta.4", - "@storybook/node-logger": "6.5.0-beta.4", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-server": "6.5.0-rc.1", + "@storybook/docs-tools": "6.5.0-rc.1", + "@storybook/node-logger": "6.5.0-rc.1", "@storybook/react-docgen-typescript-plugin": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0", - "@storybook/renderer-react": "6.5.0-beta.4", + "@storybook/renderer-react": "6.5.0-rc.1", "@storybook/semver": "^7.3.2", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", @@ -100,6 +100,6 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/client/index.js" } diff --git a/app/react/src/server/framework-preset-react-docs.ts b/app/react/src/server/framework-preset-react-docs.ts index 6db076a167d4..8ed67d08e04a 100644 --- a/app/react/src/server/framework-preset-react-docs.ts +++ b/app/react/src/server/framework-preset-react-docs.ts @@ -18,6 +18,7 @@ export async function babel(config: TransformOptions, options: Options) { return { ...config, overrides: [ + ...(config?.overrides || []), { test: reactDocgen === 'react-docgen' ? /\.(mjs|tsx?|jsx?)$/ : /\.(mjs|jsx?)$/, plugins: [ diff --git a/app/server/package.json b/app/server/package.json index 63cfa120d227..966ef9526c3c 100644 --- a/app/server/package.json +++ b/app/server/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/server", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -39,9 +39,9 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-server": "6.5.0-beta.4", - "@storybook/renderer-server": "6.5.0-beta.4", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-server": "6.5.0-rc.1", + "@storybook/renderer-server": "6.5.0-rc.1", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -63,6 +63,6 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/client/index.js" } diff --git a/app/svelte/package.json b/app/svelte/package.json index 1553d5e23500..a87ae4e9f764 100644 --- a/app/svelte/package.json +++ b/app/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/svelte", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Storybook for Svelte: Develop Svelte Component in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -40,10 +40,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-server": "6.5.0-beta.4", - "@storybook/node-logger": "6.5.0-beta.4", - "@storybook/renderer-svelte": "6.5.0-beta.4", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-server": "6.5.0-rc.1", + "@storybook/node-logger": "6.5.0-rc.1", + "@storybook/renderer-svelte": "6.5.0-rc.1", "core-js": "^3.8.2", "global": "^4.4.0", "loader-utils": "^2.0.0", @@ -72,6 +72,6 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/client/index.js" } diff --git a/app/vue/package.json b/app/vue/package.json index e8fb8f776d62..a98cc348f8f3 100644 --- a/app/vue/package.json +++ b/app/vue/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Storybook for Vue: Develop Vue Component in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -39,10 +39,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-server": "6.5.0-beta.4", - "@storybook/docs-tools": "6.5.0-beta.4", - "@storybook/renderer-vue": "6.5.0-beta.4", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-server": "6.5.0-rc.1", + "@storybook/docs-tools": "6.5.0-rc.1", + "@storybook/renderer-vue": "6.5.0-rc.1", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -76,6 +76,6 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/client/index.js" } diff --git a/app/vue3/package.json b/app/vue3/package.json index 700a247e4e4b..3c4c6e19302d 100644 --- a/app/vue3/package.json +++ b/app/vue3/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue3", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Storybook for Vue 3: Develop Vue 3 Components in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -39,10 +39,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-server": "6.5.0-beta.4", - "@storybook/docs-tools": "6.5.0-beta.4", - "@storybook/renderer-vue3": "6.5.0-beta.4", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-server": "6.5.0-rc.1", + "@storybook/docs-tools": "6.5.0-rc.1", + "@storybook/renderer-vue3": "6.5.0-rc.1", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -74,6 +74,6 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/client/index.js" } diff --git a/app/vue3/src/server/framework-preset-vue3.ts b/app/vue3/src/server/framework-preset-vue3.ts index 5061efe35be2..892fd1560fff 100644 --- a/app/vue3/src/server/framework-preset-vue3.ts +++ b/app/vue3/src/server/framework-preset-vue3.ts @@ -22,7 +22,7 @@ export function webpack(config: Configuration): Configuration { options: {}, }, { - test: /\.tsx?$/, + test: /\.ts$/, use: [ { loader: require.resolve('ts-loader'), @@ -33,6 +33,19 @@ export function webpack(config: Configuration): Configuration { }, ], }, + { + test: /\.tsx$/, + use: [ + { + loader: require.resolve('ts-loader'), + options: { + transpileOnly: true, + // Note this is different from the `appendTsSuffixTo` above! + appendTsxSuffixTo: [/\.vue$/], + }, + }, + ], + }, ], }, resolve: { diff --git a/app/web-components/package.json b/app/web-components/package.json index 05b2eb3797e6..e3e57e5958ae 100644 --- a/app/web-components/package.json +++ b/app/web-components/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/web-components", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "description": "Storybook for web-components: View web components snippets in isolation with Hot Reloading.", "keywords": [ "lit-html", @@ -44,10 +44,10 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/preset-env": "^7.12.11", - "@storybook/core-common": "6.5.0-beta.4", - "@storybook/core-server": "6.5.0-beta.4", - "@storybook/docs-tools": "6.5.0-beta.4", - "@storybook/renderer-web-components": "6.5.0-beta.4", + "@storybook/core-common": "6.5.0-rc.1", + "@storybook/core-server": "6.5.0-rc.1", + "@storybook/docs-tools": "6.5.0-rc.1", + "@storybook/renderer-web-components": "6.5.0-rc.1", "@types/node": "^14.14.20 || ^16.0.0", "@types/webpack-env": "^1.16.0", "babel-plugin-bundled-import-meta": "^0.3.1", @@ -70,6 +70,6 @@ "publishConfig": { "access": "public" }, - "gitHead": "55247a8e36da7061bfced80c588a539d3fda3f04", + "gitHead": "3f09d4e6b0c655a092dc812488ef2c7ed3808401", "sbmodern": "dist/modern/client/index.js" } diff --git a/docs/addons/addons-api.md b/docs/addons/addons-api.md index 26decd0e386b..5c0e5b2a6463 100644 --- a/docs/addons/addons-api.md +++ b/docs/addons/addons-api.md @@ -362,7 +362,7 @@ The following table details how to use the API values: | **showPanel** | Boolean | Display panel that shows addon configurations | `true` | | **panelPosition** | String/Object | Where to show the addon panel | `bottom` or `right` | | **enableShortcuts** | Boolean | Enable/disable shortcuts | `true` | -| **isToolshown** | Boolean | Show/hide tool bar | `true` | +| **showToolbar** | Boolean | Show/hide tool bar | `true` | | **theme** | Object | Storybook Theme, see next section | `undefined` | | **selectedPanel** | String | Id to select an addon panel | `storybook/actions/panel` | | **initialActive** | String | Select the default active tab on Mobile | `sidebar` or `canvas` or `addons` | diff --git a/docs/addons/install-addons.md b/docs/addons/install-addons.md index c110299f640e..c12482c7a1d2 100644 --- a/docs/addons/install-addons.md +++ b/docs/addons/install-addons.md @@ -2,7 +2,7 @@ title: Install addons --- -Storybook has [hundreds of reusable addons](/addons) that are packaged as NPM modules. Let's walk through how to extend Storybook by installing and registering addons. +Storybook has [hundreds of reusable addons](https://storybook.js.org/addons) that are packaged as NPM modules. Let's walk through how to extend Storybook by installing and registering addons. ### Using addons diff --git a/docs/addons/introduction.md b/docs/addons/introduction.md index 3ec5dbf1ae93..7558e16786b4 100644 --- a/docs/addons/introduction.md +++ b/docs/addons/introduction.md @@ -5,7 +5,7 @@ title: 'Introduction to addons' Addons extend Storybook with features and integrations that are not built into the core. Most Storybook features are implemented as addons. For instance: [documentation](../writing-docs/introduction.md), [accessibility testing](https://github.com/storybookjs/storybook/tree/master/addons/a11y), [interactive controls](../essentials/controls.md), among others. The [addon API](./addons-api.md) makes it easy for you to configure and customize Storybook in new ways. There are countless addons made by the community that unlock time-saving workflows. -Browse our [addon catalog](/addons) to install an existing addon or as inspiration for your own addon. +Browse our [addon catalog](https://storybook.js.org/addons) to install an existing addon or as inspiration for your own addon. ## Storybook basics diff --git a/docs/addons/writing-presets.md b/docs/addons/writing-presets.md index c74ae7b2a1db..c8215c390354 100644 --- a/docs/addons/writing-presets.md +++ b/docs/addons/writing-presets.md @@ -2,7 +2,7 @@ title: 'Write a preset addon' --- -[Storybook preset addons](./addon-types.md#preset-addons) are grouped collections of `babel`, `webpack`, and `addons` configurations that support specific use cases in Storybook, such as typescript or MDX support. +[Storybook preset addons](./addon-types.md#preset-addons) are grouped collections of `babel`, `webpack`, and `addons` configurations that support specific use cases in Storybook, such as TypeScript or MDX support. This doc covers the [presets API](#presets-api) and how to use the presets mechanism for [advanced configuration](#advanced-configuration). @@ -10,7 +10,7 @@ This doc covers the [presets API](#presets-api) and how to use the presets mecha A preset is a set of hooks that is called by Storybook on initialization and can override configurations for `babel`, `webpack`, `addons`, and `entries`. -Each configuration has a similar signature, accepting a base configuration object and options, as in this webpack example: +Each configuration has a similar signature, accepting a base configuration object and options, as in this Webpack example: @@ -46,7 +46,7 @@ For example, Storybook's Mihtril support uses plugins internally and here's how ### Webpack -The webpack functions `webpack`, `webpackFinal`, and `managerWebpack` configure webpack. +The Webpack functions `webpack`, `webpackFinal`, and `managerWebpack` configure Webpack. All functions take a [webpack4 configuration object](https://webpack.js.org/configuration/). @@ -62,11 +62,11 @@ For example, here is how Storybook automatically adopts `create-react-app`'s con -- `webpack` is applied to the preview config after it has been initialized by storybook +- `webpack` is applied to the preview config after it has been initialized by Storybook - `webpackFinal` is applied to the preview config after all user presets have been applied - `managerWebpack` is applied to the manager config -As of Storybook 6.3, Storybook can run with either `webpack4` or `webpack5` builder. If your addon needs to know which version of Webpack it's running inside, the version and the actual webpack instance itself are both available inside your preset: +As of Storybook 6.3, Storybook can run with either `webpack4` or `webpack5` builder. If your addon needs to know which version of Webpack it's running inside, the version and the actual Webpack instance itself are both available inside your preset: @@ -81,7 +81,7 @@ As of Storybook 6.3, Storybook can run with either `webpack4` or `webpack5` buil ### Manager entries -The addon config `managerEntries` allows you to add addons to Storybook from within a preset. For addons that require custom webpack/babel configuration, it is easier to install the preset, and it will take care of everything. +The addon config `managerEntries` allows you to add addons to Storybook from within a preset. For addons that require custom Webpack/Babel configuration, it is easier to install the preset, and it will take care of everything. For example, the Storysource preset contains the following code: @@ -176,9 +176,9 @@ Entries are the place to register entry points for the preview. For example it c ## Advanced Configuration -The presets API is also more powerful than the [standard configuration options](../configure/webpack.md#extending-storybooks-webpack-config) available in Storybook, so it's also possible to use presets for more advanced configuration without actually publishing a preset yourself. +The presets API is also more powerful than the [standard configuration options](../builders/webpack.md#extending-storybooks-webpack-config) available in Storybook, so it's also possible to use presets for more advanced configuration without actually publishing a preset yourself. -For example, some users want to configure the webpack for Storybook's UI and addons ([issue](https://github.com/storybookjs/storybook/issues/4995)), but this is not possible using [standard webpack configuration](../configure/webpack.md#default-configuration) (it used to be possible before SB4.1). However, you can achieve this with a private preset. +For example, some users want to configure the Webpack for Storybook's UI and addons ([issue](https://github.com/storybookjs/storybook/issues/4995)), but this is not possible using [standard Webpack configuration](../builders/webpack.md#default-configuration) (it used to be possible before SB4.1). However, you can achieve this with a private preset. If it doesn't exist yet, create a file `.storybook/main.js`: diff --git a/docs/api/cli-options.md b/docs/api/cli-options.md index f8606d47cb69..6ca92991ce99 100644 --- a/docs/api/cli-options.md +++ b/docs/api/cli-options.md @@ -4,6 +4,12 @@ title: 'CLI options' Storybook comes with two CLI utilities: `start-storybook` and `build-storybook`. +
+ +Storybook collects completely anonymous data to help us improve user experience. Participation is optional, and you may [opt-out](../configure/telemetry.md#how-to-opt-out) if you'd not like to share any information. + +
+ Pass these commands the following options to alter Storybook's behavior. ## start-storybook diff --git a/docs/builders/builder-api.md b/docs/builders/builder-api.md new file mode 100644 index 000000000000..1ac4563f86a8 --- /dev/null +++ b/docs/builders/builder-api.md @@ -0,0 +1,163 @@ +--- +title: 'Builder API' +--- + +Storybook is architected to support multiple builders, including [Webpack](https://webpack.js.org/), [Vite](https://vitejs.dev/), and [ESBuild](https://esbuild.github.io/). The builder API is the set of interfaces you can use to add a new builder to Storybook. + +![Storybook builders](./storybook-builders.png) + +## How do builders work? + +In Storybook, a builder is responsible for compiling your components and stories into JS bundles that run in the browser. A builder also provides a development server for interactive development and a production mode for optimized bundles. + +To opt into a builder, the user must add it as a dependency and then edit their configuration file (`.storybook/main.js`) to enable it. For example, with the Vite builder: + + + + + + + + + + + + + +## Builder API + +In Storybook, every builder must implement the following [API](https://github.com/storybookjs/storybook/blob/next/lib/core-common/src/types.ts#L170-L189), exposing the following configuration options and entry points: + + + + + + + +In development mode, the `start` API call is responsible for initializing the development server to monitor the file system for changes (for example, components and stories) then execute a hot module reload in the browser. +It also provides a **bail** function to allow the running process to end gracefully, either via user input or error. + +In production, the `build` API call is responsible for generating a static Storybook build, storing it by default in the `storybook-static` directory if no additional configuration is provided. The generated output should contain everything the user needs to view its Storybook by opening either the `index.html` or `iframe.html` in a browser with no other processes running. + +## Implementation + +Under the hood, a builder is responsible for serving/building the preview `iframe`, which has its own set of requirements. To fully support Storybook, including the [Essential addons](../writing-stories/introduction.md) that ship with Storybook, it must consider the following. + +### Import stories + +The `stories` configuration field enables story loading in Storybook. It defines an array of file globs containing the physical location of the component's stories. The builder must be able to load those files and monitor them for changes and update the UI accordingly. + +### Provide configuration options + +By default, Storybook's configuration is handled in a dedicated file (`storybook/main.js|ts`), giving the user the option to customize it to suit its needs. The builder should also provide its own configuration support through additional fields or some other builder-appropriate mechanism. For example: + + + + + + + +### Handle preview.js exports + +The [`preview.js`](../configure/overview.md#configure-story-rendering) configuration file allows users to control how the story renders in the UI. This is provided via the [decorators](../writing-stories/decorators.md) named export. When Storybook starts, it converts these named exports into internal API calls via virtual module entry, for example, `addDecorator()`. The builder must also provide a similar implementation. For example: + + + + + + + +### MDX support + +[Storybook's Docs](../writing-docs/introduction.md) includes the ability to author stories/documentation in MDX using a Webpack loader. The builder must also know how to interpret MDX and invoke Storybook's special extensions. For example: + + + + + + + +### Generate source code snippets + +Storybook annotates components and stories with additional metadata related to their inputs to automatically generate interactive controls and documentation. Currently, this is provided via Webpack loaders/plugins. The builder must re-implement this to support those features. + +### Generate a static build + +One of Storybook's core features it's the ability to generate a static build that can be [published](../sharing/publish-storybook.md) to a web hosting service. The builder must also be able to provide a similar mechanism. For example: + + + + + + + +### Development server integration + +By default, when Storybook starts in development mode, it relies on its internal development server. The builder needs to be able to integrate with it. For example: + + + + + + + +### Shutdown the development server + +The builder must provide a way to stop the development server once the process terminates; this can be via user input or error. For example: + + + + + + + +### HMR support + +While running in development mode, the builder's development server must be able to reload the page once a change happens, either in a story, component, or helper function. + +### More information + +This area is under rapid development, so the documented is still in progress and subject to change. If you are interested in writing your builder, we encourage you to check [webpack](https://github.com/storybookjs/storybook/tree/next/lib/builder-webpack4), [Vite](https://github.com/storybookjs/builder-vite), and Modern Web's [dev-server-storybook](https://github.com/modernweb-dev/web/blob/master/packages/dev-server-storybook/src/serve/storybookPlugin.ts) source code. In addition, we have a wonderful contributor community on [Storybook Discord](https://discord.gg/storybook) if you have questions. Ping us in the [#contributing](https://discord.com/channels/486522875931656193/839297503446695956) channel. + +#### Learn more about builders + +- [Vite builder](./vite.md) for bundling with Vite +- [Webpack builder](./webpack.md) for bundling with Webpack +- Builder API for building a Storybook builder \ No newline at end of file diff --git a/docs/builders/overview.md b/docs/builders/overview.md new file mode 100644 index 000000000000..f7395953f7e4 --- /dev/null +++ b/docs/builders/overview.md @@ -0,0 +1,24 @@ +--- +title: 'Builders' +--- + +Storybook, at its core, is powered by builders such as Webpack and Vite. These builders spin up a development environment, compile your code—Javascript, CSS, and MDX—into an executable bundle and update the browser in real-time. + +![Storybook builder overview](./storybook-builder-workflow.png) + +## CLI basics + +Before diving into setting up Storybook's builders, let's look at how the CLI configures them. When you initialize Storybook (via `npx sb init`), the CLI automatically detects which builder to use based on your application. For example, if you're working with Vite, it will install the Vite builder. If you're working with Webpack, it installs the Webpack builder based on your current version. + +Additionally, you can also provide a flag to Storybook's CLI and specify the builder you want to use: + +```shell +npx sb init --builder +``` + +## Manual setup + +Storybook uses the Webpack 4 builder by default if you don't specify one. If you want to use a different builder in your application, these docs detail how you can set up Storybook's supported builders. + +- [**Vite builder**](./vite.md) for bundling your stories with Vite with near-instant HMR. +- [**Webpack**](./webpack.md) for bundling your stories with Webpack with improved performance \ No newline at end of file diff --git a/docs/builders/storybook-builder-workflow.png b/docs/builders/storybook-builder-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..7cfceb815bea4f52ae656c3c50f9fe7c1ea61aa2 GIT binary patch literal 182393 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�OkAxtX~ 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

szLP8uRY@< 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 + + + + + +Update your Storybook configuration (in `.storybook/main.js|ts`) to include the builder. + + + + + + + +## Configuration + +Out of the box, Storybook's Vite builder includes a set of configuration defaults for the supported frameworks. You can also fine-tune them or override them to match your existing configuration as, by default, the builder does not read your `vite.config.js` file. For example, if you need to set up aliasing, you can adjust your Storybook configuration file (`.storybook/main.js|ts`) and provide the following: + + + + + + + +The asynchronous function`viteFinal` receives a `config` object with the default builder configuration and returns the updated configuration with the defined alias. + +You can also override the builder's configuration based on the environment. For instance, if you need to provide a custom configuration for development purposes and another for production, you can extend the default configuration as follows: + + + + + + + +### Svelte configuration + +If you're working with Svelte's Vite plugin ([`vite-plugin-svelte`](https://github.com/sveltejs/vite-plugin-svelte/tree/main/packages/vite-plugin-svelte)), you can extend your existing configuration and include an additional `SvelteOptions` object to customize it. For example: + + + + + + + +### TypeScript + +If you need, you can also configure Storybook's Vite builder using TypeScript. Rename your `.storybook/main.js` to `.storybook/main.ts` and adjust it as follows: + + + + + + + +--- + +## Troubleshooting + +### Working directory not being detected + +By default, the Vite builder enables Vite's [`server.fs.strict`](https://vitejs.dev/config/#server-fs-strict) option for increased security, defining the project's `root` to Storybook's configuration directory +If you need to override it, you can use the `viteFinal` function and adjust it. + +### ArgTypes are not generated automatically + +Currently, [automatic argType inference](../api/argtypes.md#automatic-argtype-inference) is only available for React and Vue3. With React, the Vite builder defaults to `react-docgen-typescript` if TypeScript is listed as a dependency. If you run into any issues, you can revert to `react-docgen` by updating your Storybook configuration file as follows: + + + + + + + +#### Learn more about builders + +- Vite builder for bundling with Vite +- [Webpack builder](./webpack.md) for bundling with Webpack +- [Builder API](./builder-api.md) for building a Storybook builder diff --git a/docs/builders/webpack.md b/docs/builders/webpack.md new file mode 100644 index 000000000000..768b4ab2ee9d --- /dev/null +++ b/docs/builders/webpack.md @@ -0,0 +1,203 @@ +--- +title: 'Webpack' +--- + +Storybook displays your components in a custom web application built using [Webpack](https://webpack.js.org/). Webpack is a complex tool, but our default configuration is intended to cover most use cases. [Addons](https://storybook.js.org/addons/) are also available that extend the configuration for other everyday use cases. + +You can customize Storybook's Webpack setup by providing a `webpackFinal` field in [`.storybook/main.js`](../configure/overview.md#configure-your-storybook-project) file. + +The value should be an async function that receives a Webpack config and eventually returns a Webpack config. + +### Default configuration + +By default, Storybook's Webpack configuration will allow you to: + +#### Import images and other static files + +You can import images and other local files and have them built into the Storybook: + + + + + + + +#### Import JSON as JavaScript + +You can import `.json` files and have them expanded to a JavaScript object: + + + + + + + +If you want to know the exact details of the Webpack config, the best way is to run either of the following: + +```shell + +## Development mode +yarn start-storybook --debug-webpack + +## Production mode +yarn build-storybook --debug-webpack +``` + +### Code splitting + +Starting with Storybook 6.4, [code splitting](https://v4.webpack.js.org/guides/code-splitting/) is supported through a configuration flag. Update your Storybook configuration and add the `storyStoreV7` flag: + + + + + + + +When you start your Storybook, you'll see an improvement in loading times. Read more about it in the [announcement post](https://storybook.js.org/blog/storybook-on-demand-architecture/) and the [configuration documentation](../configure/overview.md#configure-your-storybook-project). + +### Webpack 5 + +Storybook builds your project with Webpack 4 by default. If your project uses Webpack 5, you can opt into the Webpack 5 builder by installing the required dependencies (i.e., `@storybook/builder-webpack5`, `@storybook/manager-webpack5`) and update your Storybook configuration as follows: + + + + + + + +Once you are using Webpack 5, you can further opt into some features to optimize your build: + +#### Lazy Compilation + +Storybook supports Webpack's experimental [lazy compilation](https://webpack.js.org/configuration/experiments/#experimentslazycompilation) feature, via the `lazyCompilation` builder flag: + + + + + + + +This feature applies in development mode, and will mean your Storybook will start up faster, at the cost of slightly slower browsing time when you change stories. + +#### Filesystem Caching + +Storybook supports Webpack's [filesystem caching](https://webpack.js.org/configuration/cache/#cachetype) feature, via the `fsCache` builder flag: + + + + + + + +This feature will mean build output is cached between runs of Storybook, speeding up subsequent startup times. + +### Extending Storybook’s Webpack config + +To extend the above configuration, use the `webpackFinal` field of [`.storybook/main.js`](../configure/overview.md#configure-your-storybook-project). + +The value should export a `function`, which will receive the default config as its first argument. The second argument is an options object from Storybook, and this will have information about where config came from, whether we're in production or development mode, etc. + +For example, if you wanted to add [Sass](https://sass-lang.com/) support, you can adjust your configuration as such: + + + + + + + +Storybook uses the config returned from the above function to render your components in Storybook's "preview" iframe. Note that Storybook has an entirely separate Webpack config for its UI (also referred to as the "manager"), so the customizations you make only apply to the rendering of your stories, i.e., you can completely replace `config.module.rules` if you want. + +Nevertheless, edit `config` with care. Make sure to preserve the following config options: + +- **entry** +- **output** + +Furthermore, `config` requires the `HtmlWebpackplugin` to generate the preview page, so rather than overwriting `config.plugins` you should probably append to it (or overwrite it with care), see [the following issue](https://github.com/storybookjs/storybook/issues/6020) for examples on how to handle this: + + + + + + + +Finally, if your custom Webpack config uses a loader that does not explicitly include specific file extensions via the `test` property, in that case, it is necessary to `exclude` the `.ejs` file extension from that loader. + +If you're using a non-standard Storybook config directory, you should put `main.js` there instead of `.storybook` and update the `include` path to ensure it resolves to your project root. + +### Using your existing config + +Suppose you have an existing Webpack config for your project and want to reuse this app's configuration. In that case, you can import your main Webpack config into Storybook's [`.storybook/main.js`](../configure/overview.md#configure-your-storybook-project) and merge both: + +The following code snippet shows how you can replace the loaders from Storybook with the ones from your app's `webpack.config.js`: + + + + + + + +

+ +### TypeScript Module Resolution + +When working with TypeScript projects, the default Webpack configuration may fail to resolve module aliases defined in your [`tsconfig` file](https://www.typescriptlang.org/tsconfig). To work around this issue you may use [`tsconfig-paths-webpack-plugin`](https://github.com/dividab/tsconfig-paths-webpack-plugin#tsconfig-paths-webpack-plugin) while [extending Storybook's Webpack config](#extending-storybooks-webpack-config) like: + + + + + + + + + +#### Learn more about builders + +- [Vite builder](./vite.md) for bundling with Vite +- [Webpack builder](./webpack.md) for bundling with Webpack +- [Builder API](./builder-api.md) for building a Storybook builder diff --git a/docs/configure/css-troubleshooting/angular.mdx b/docs/configure/css-troubleshooting/angular.mdx index ab6674b7547e..d9c6c7a81dd2 100644 --- a/docs/configure/css-troubleshooting/angular.mdx +++ b/docs/configure/css-troubleshooting/angular.mdx @@ -42,7 +42,11 @@ Additionally, if you need Storybook specific styles that are separate from your ``` ### Nx with Angular 13 -If you're working with Storybook and [NX libraries](https://nx.dev/structure/library-types), you can extend your project's configuration (i.e., `project.json`) and provide the application's styles. For example: + +If you're working with Storybook and [Nx libraries](https://nx.dev/structure/library-types), +you can extend your project's configuration (i.e., `project.json`) and provide the application's styles. + +For earlier Nx versions (prior to `14.1.8`), your configuration would look like this: ```json "build-storybook": { @@ -56,11 +60,35 @@ If you're working with Storybook and [NX libraries](https://nx.dev/structure/lib }, "projectBuildConfig": "example-lib:build-storybook", "styles": ["apps/example-app/src/styles.scss"] + } + } +``` + +Starting with version `14.1.8`, Nx uses the Storybook builder directly, which means any configuration supplied to the builder also applies to the NX setup. If you're working with a library, you'll need to configure the styling options ( e.g., preprocessors) inside the `build-storybook` `options` configuration object. For example: + +```json + "storybook": { + "executor": "@storybook/angular:start-storybook", + "options": { + "configDir": "apps/example-lib/.storybook", + "browserTarget": "example-lib:build-storybook", + }, }, - "configurations": { - "ci": { - "quiet": true + "build-storybook": { + "executor": "@storybook/angular:build-storybook", + "outputs": ["{options.outputPath}"], + "options": { + "outputDir": "dist/storybook/example-lib", + "configDir": "apps/example-lib/.storybook", + "browserTarget": "example-lib:build-storybook", + "styles": [".storybook/custom-styles.scss"], + "stylePreprocessorOptions": { + "includePaths": [ + "libs/design-system/src/lib" + ] + } } } - } ``` + +When Nx runs, it will load Storybook's configuration and styling based on the `storybook`'s [`browserTarget`](https://nx.dev/storybook/extra-topics-for-angular-projects#setting-up-browsertarget). diff --git a/docs/configure/features-and-behavior.md b/docs/configure/features-and-behavior.md index 7bd4b8d7ba31..d936e062d962 100644 --- a/docs/configure/features-and-behavior.md +++ b/docs/configure/features-and-behavior.md @@ -23,7 +23,7 @@ The following table details how to use the API values: | **showPanel** | Boolean | Display panel that shows addon configurations | `true` | | **panelPosition** | String/Object | Where to show the addon panel | `bottom` or `right` | | **enableShortcuts** | Boolean | Enable/disable shortcuts | `true` | -| **isToolshown** | Boolean | Show/hide tool bar | `true` | +| **showToolbar** | Boolean | Show/hide tool bar | `true` | | **theme** | Object | Storybook Theme, see next section | `undefined` | | **selectedPanel** | String | Id to select an addon panel | `storybook/actions/panel` | | **initialActive** | String | Select the default active tab on Mobile | `sidebar` or `canvas` or `addons` | diff --git a/docs/configure/overview.md b/docs/configure/overview.md index 462d88bc3cd6..83eed8505c43 100644 --- a/docs/configure/overview.md +++ b/docs/configure/overview.md @@ -45,11 +45,12 @@ Additionally, you can also provide additional feature flags to your Storybook co | Configuration element | Description | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `storyStoreV7` | Configures Storybook to load stories [on demand](#on-demand-story-loading), rather than during boot up.
`features: { storyStoreV7: true }` | -| `buildStoriesJson` | Generates a `stories.json` file to help story loading with the on demand mode.
`features: { buildStoriesJson: true }` | +| `buildStoriesJson` | Generates a `stories.json` file to help story loading with the on demand mode.
`features: { buildStoriesJson: true }` | | `emotionAlias` | Provides backwards compatibility for Emotion. See the [migration documentation](https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#emotion11-quasi-compatibility) for context.
`features: { emotionAlias: false }` | | `babelModeV7` | Enables the new [Babel configuration](./babel.md#v7-mode) mode for Storybook.
`features: { babelModeV7: true }` | | `postcss` | Disables the implicit PostCSS warning. See the [migration documentation](https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#deprecated-implicit-postcss-loader) for context.
`features: { postcss: false }` | | `modernInlineRender` | Enables Storybook's modern inline rendering mode.
`features: { modernInlineRender: false }` | +| `previewMdx2` | Enables experimental support for [MDX 2](../writing-docs/mdx.md#mdx-2).
`features: { previewMdx2: true }` | ## Configure story loading @@ -177,13 +178,13 @@ You can also use Storybook's API to configure your project with TypeScript. Unde | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `stories` | The array of globs that indicates the [location of your story files](#configure-story-loading), relative to `main.ts` | | `staticDirs` | Sets a list of directories of [static files](./images-and-assets.md#serving-static-files-via-storybook-configuration) to be loaded by Storybook
`staticDirs:['../public']` | -| `addons` | Sets the list of [addons](/addons) loaded by Storybook
`addons:['@storybook/addon-essentials']` | +| `addons` | Sets the list of [addons](https://storybook.js.org/addons/) loaded by Storybook
`addons:['@storybook/addon-essentials']` | | `typescript` | Configures how Storybook handles [TypeScript files](./typescript.md)
`typescript: { check: false, checkOptions: {} }` | | `framework` | Configures Storybook based on a set of framework-specific settings
`framework:'@storybook/svelte'` | -| `core` | Sets Storybook's Webpack configuration
`core:{ builder: 'webpack5'}` | -| `features` | Enables Storybook's additional features
. See table below for a list of available features `features: { storyStoreV7: true }` | +| `core` | Configures Storybook's internal features.
`core: { builder: 'webpack5' }` | +| `features` | Enables Storybook's additional features.
See table below for a list of available features `features: { storyStoreV7: true }` | | `refs` | Configures [Storybook composition](../sharing/storybook-composition.md)
`refs:{ example: { title: 'ExampleStorybook', url:'https://your-url.com' } }` | -| `logLevel` | Configures Storybook's logs in the browser terminal. Useful for debugging
`logLevel: 'debug'` | +| `logLevel` | Configures Storybook's logs in the browser terminal. Useful for debugging
`logLevel: 'debug'` | | `webpackFinal` | Customize Storybook's [Webpack](./webpack.md) setup
`webpackFinal: async (config:any) => { return config; }` | ## Configure story rendering diff --git a/docs/configure/sidebar-and-urls.md b/docs/configure/sidebar-and-urls.md index f49f7a3c66ba..1e301206e38f 100644 --- a/docs/configure/sidebar-and-urls.md +++ b/docs/configure/sidebar-and-urls.md @@ -2,11 +2,11 @@ title: 'Sidebar & URLS' --- -Storybook’s sidebar lists all your stories grouped by component. When you have many components, you may also wish to group those components. To do so, you can add the `/` separator to the `title` of your CSF file and Storybook will group the stories into groups based on common prefixes: +Storybook’s sidebar lists all your stories grouped by component. When you have many components, you may also wish to group those components. To do so, you can add the `/` separator to the `title` of your CSF file, and Storybook will group the stories into groups based on common prefixes: ![Storybook sidebar anatomy](./sidebar-anatomy.jpg) -We recommend using a nesting scheme that mirrors the filesystem path of the components. For example, if you have a file `components/modals/Alert.js` name the CSF file `components/modals/Alert.stories.js` and title it `Components/Modals/Alert`. +We recommend using a nesting scheme that mirrors the filesystem path of the components. For example, if you have a file `components/modals/Alert.js`, name the CSF file `components/modals/Alert.stories.js` and title it `Components/Modals/Alert`. ## Roots @@ -26,76 +26,100 @@ If you’d prefer to show top-level nodes as folders rather than roots, you can -## Automatically generate titles +## Permalink to stories -With CSF 3.0 files, you can choose to leave out a title and let it be inferred from the story's path on disk instead: +By default, Storybook generates an `id` for each story based on the component title and the story name. This `id` in particular is used in the URL for each story, and that URL can serve as a permalink (primarily when you [publish](../sharing/publish-storybook.md) your Storybook). + +Consider the following story: -This is controlled by the way your stories are configured: +Storybook's ID-generation logic will give this the `id` `foo-bar--baz`, so the link would be `?path=/story/foo-bar--baz`. + +It is possible to manually set the story's id, which is helpful if you want to rename stories without breaking permalinks. Suppose you want to change the position in the hierarchy to `OtherFoo/Bar` and the story name to `Moo`. Here's how to do that: -Given this configuration, the stories file `../src/components/MyComponent.stories.tsx` will get the title `components/MyComponent`. +Storybook will prioritize the `id` over the title for ID generation if provided and prioritize the `story.name` over the export key for display. -You can further customize the generated title by modifying the stories configuration. +## CSF 3.0 auto-titles + +Storybook 6.4 introduced [CSF 3.0](https://storybook.js.org/blog/component-story-format-3-0/) as an experimental feature, allowing you to write stories more compactly. Suppose you're already using this format to write your stories. In that case, you can omit the `title` element from the default export and allow Storybook automatically infer it based on the file's physical location. For example, given the following configuration and story: -This configuration would match a custom file pattern, and add a custom prefix of Foo to each generated title. +When Storybook loads, the story can show up in the sidebar as `components/My Component`. -## Permalinking to stories +### Auto-title filename case -By default, Storybook generates an `id` for each story based on the component title and the story name. This `id` in particular is used in the URL for each story, and that URL can serve as a permalink (primarily when you [publish](../sharing/publish-storybook.md) your Storybook). +Starting with Storybook 6.5, story titles generated automatically no longer rely on Lodash's [startCase](https://lodash.com/docs/#startCase). +Instead, the file name casing is preserved, allowing additional control over the story title. For example, `components/My Component` will be defined as `components/MyComponent`. -Consider the following story: +If you need, you can revert to the previous pattern by adding the following configuration: -Storybook's ID-generation logic will give this the `id` `foo-bar--baz`, so the link would be `?path=/story/foo-bar--baz`. +### Auto-title redundant filenames + +In addition to improvements to the story file name casing, a new heuristic was introduced, removing redundant names in case the filename has the same name as the directory name, or if it's called `index.stories.js|ts`. For example, before `components/MyComponent/MyComponent.stories.js` was defined as `Components/MyComponent/MyComponent` in the sidebar. Now it will be defined as `Components/MyComponent`. -It is possible to manually set the id of a story, which is helpful if you want to rename stories without breaking permalinks. Suppose you want to change the position in the hierarchy to `OtherFoo/Bar` and the story name to `Moo`. Here's how to do that: +If you need to preserve the naming scheme, you can add the `title` element to the default export. For example: + + + +### Auto-title prefixes + +Additionally, if you customize your Storybook to load your stories based on a [configuration object](./overview.md#with-a-configuration-object), including a `titlePrefix`, Storybook automatically prefixes all titles to matching stories. For example, assuming you have the following configuration: + + + + -Storybook will prioritize the `id` over the title for ID generation if provided and prioritize the `story.name` over the export key for display. \ No newline at end of file +When Storybook generates the titles for all matching stories, they'll retain the `Custom` prefix. diff --git a/docs/configure/telemetry.md b/docs/configure/telemetry.md index 72c66d0b8aed..3a4ad9b2003f 100644 --- a/docs/configure/telemetry.md +++ b/docs/configure/telemetry.md @@ -34,8 +34,10 @@ Specifically, we track the following information in our telemetry events: - Supported view layers (e.g., React, Vue, Angular, Svelte). - Builder (e.g., Webpack4, Webpack5, Vite). - Meta framework (e.g., [Next](https://nextjs.org/), [Gatsby](https://www.gatsbyjs.com/), [CRA](https://create-react-app.dev/)). - - [Addons](/addons) (e.g., [Essentials](../essentials/introduction), [Accessibility](https://storybook.js.org/addons/@storybook/addon-a11y/)). + - [Addons](https://storybook.js.org/addons/) (e.g., [Essentials](../essentials/introduction.md), [Accessibility](https://storybook.js.org/addons/@storybook/addon-a11y/)). - [Feature flags](./overview.md#feature-flags) (e.g., `buildStoriesJson`). +- Package manager information (e.g., `npm`, `yarn`). +- Monorepo information (e.g., [NX](https://nx.dev/), [Turborepo](https://turborepo.org/)). - Whether the command was invoked on CI or not. Access to the raw data is highly controlled, limited to select members of Storybook's core team who maintain the telemetry. We cannot identify individual users from the dataset: it is anonymized and untraceable back to the user. @@ -83,6 +85,11 @@ Will generate the following output: "packageName": "react-scripts", "version": "4.0.3" }, + "packageManager": { + "name": "yarn", + "version": "3.1.1", + }, + "monorepo": "Nx", "features": { "buildStoriesJson": true }, diff --git a/docs/configure/upgrading.md b/docs/configure/upgrading.md index 4cc4322328e4..d4f93edb3312 100644 --- a/docs/configure/upgrading.md +++ b/docs/configure/upgrading.md @@ -6,7 +6,7 @@ The frontend ecosystem is a fast-moving place. Regular dependency upgrades are a ## Upgrade script -The most common upgrade is Storybook itself. [Storybook releases](/releases) follow [Semantic Versioning](https://semver.org/). We publish patch releases with bug fixes continuously, minor versions of Storybook with new features every few months, and major versions of Storybook with breaking changes roughly once per year. +The most common upgrade is Storybook itself. [Storybook releases](https://storybook.js.org/releases) follow [Semantic Versioning](https://semver.org/). We publish patch releases with bug fixes continuously, minor versions of Storybook with new features every few months, and major versions of Storybook with breaking changes roughly once per year. To help ease the pain of keeping Storybook up-to-date, we provide a command-line script: @@ -18,7 +18,7 @@ This upgrades all of the Storybook packages in your project to the latest stable
-In addition to running the command, we also recommend checking the [MIGRATION.md file](https://github.com/storybookjs/storybook/blob/next/MIGRATION.md), for the detailed log of relevant changes and deprecations that might affect your upgrade. +In addition to running the command, we also recommend checking the [MIGRATION.md file](https://github.com/storybookjs/storybook/blob/next/MIGRATION.md), for the detailed log of relevant changes and deprecations that might affect your upgrade.
@@ -42,4 +42,8 @@ To upgrade to the latest pre-release: npx sb@next upgrade --prerelease ``` -If you'd like to downgrade to a stable version, manually edit the package version numbers in your `package.json` and re-install. \ No newline at end of file +If you'd like to downgrade to a stable version, manually edit the package version numbers in your `package.json` and re-install. + +
+Storybook collects completely anonymous data to help us improve user experience. Participation is optional, and you may [opt-out](../configure/telemetry.md#how-to-opt-out) if you'd not like to share any information. +
diff --git a/docs/essentials/introduction.md b/docs/essentials/introduction.md index 4d84463a8e9e..ea508ccb5411 100644 --- a/docs/essentials/introduction.md +++ b/docs/essentials/introduction.md @@ -2,7 +2,7 @@ title: 'Essential addons' --- -A major strength of Storybook are [addons](/addons/) that extend Storybook’s UI and behavior. Storybook ships by default with a set of “essential” addons that add to the initial user experience. There are many third-party addons as well as “official” addons developed by the Storybook core team. +A major strength of Storybook are [addons](https://storybook.js.org/addons) that extend Storybook’s UI and behavior. Storybook ships by default with a set of “essential” addons that add to the initial user experience. There are many third-party addons as well as “official” addons developed by the Storybook core team. - [Docs](../writing-docs/introduction.md) - [Controls](./controls.md) diff --git a/docs/faq.md b/docs/faq.md index 980141c27a2c..64fb17bd8905 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -154,12 +154,12 @@ We're only covering versions 5.3 and 5.0 as they were important milestones for S | Section | Page | Current Location | Version 5.3 location | Version 5.0 location | | ---------------- | ----------------------------------------- | --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | Get started | Install | [See current documentation](./get-started/install.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/guides/quick-start-guide) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/guides/quick-start-guide) | -| | What's a story | [See current documentation](./get-started/whats-a-story.md) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/blob/release/5.3/docs/src/pages/guides) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/blob/release/5.0/docs/src/pages/guides) | -| | Browse Stories | [See current documentation](./get-started/browse-stories.md) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/blob/release/5.3/docs/src/pages/guides) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/blob/release/5.0/docs/src/pages/guides) | -| | Setup | [See current documentation](./get-started/setup.md) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/blob/release/5.3/docs/src/pages/guides) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/blob/release/5.0/docs/src/pages/guides) | +| | What's a story | [See current documentation](./get-started/whats-a-story.md) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/guides) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/guides) | +| | Browse Stories | [See current documentation](./get-started/browse-stories.md) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/guides) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/blob/release/5.0/docs/src/pages/guides) | +| | Setup | [See current documentation](./get-started/setup.md) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/guides) | [See versioned documentation for your framework](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/guides) | | Write stories | Introduction | [See current documentation](./writing-stories/introduction.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/writing-stories) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/basics/writing-stories) | -| | Parameters | [See current documentation](./writing-stories/parameters.md) | See versioned documentation here | Non existing feature or undocumented | -| | Decorators | [See current documentation](./writing-stories/decorators.md) | See versioned documentation here | See versioned documentation here | +| | Parameters | [See current documentation](./writing-stories/parameters.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/writing-stories/index.md#parameters) | Non existing feature or undocumented | +| | Decorators | [See current documentation](./writing-stories/decorators.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/writing-stories/index.md#decorators) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/basics/writing-stories/index.md#using-decorators) | | | Naming components and hierarchy | [See current documentation](./writing-stories/naming-components-and-hierarchy.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/writing-stories) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/basics/writing-stories) | | | Build pages and screens | [See current documentation](./writing-stories/build-pages-with-storybook.md) | Non existing feature or undocumented | Non existing feature or undocumented | | | Stories for multiple components | [See current documentation](./writing-stories/stories-for-multiple-components.md) | Non existing feature or undocumented | Non existing feature or undocumented | @@ -188,8 +188,7 @@ We're only covering versions 5.3 and 5.0 as they were important milestones for S | | Viewport | [See current documentation](./essentials/viewport.md) | [See addon versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/addons/viewport) | [See addon versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/addons/viewport) | | | Backgrounds | [See current documentation](./essentials/backgrounds.md) | [See addon versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/addons/backgrounds) | [See addon versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/addons/backgrounds) | | | Toolbars and globals | [See current documentation](./essentials/toolbars-and-globals.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/basics/toolbar-guide) | Non existing feature or undocumented | -| Configure | Overview | [See current documentation](./configure/overview.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/overview) | [See versioned documentation](https://github.com/storybookjs/storybook/blob/release/5.0/docs/src/pages/basics/writing-stories) | -| | Integration/Webpack | [See current documentation](./configure/webpack.md) | See versioned documentation | See versioned documentation | +| Configure | Overview | [See current documentation](./configure/overview.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/overview) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/basics/writing-stories) | | | Integration/Babel | [See current documentation](./configure/babel.md) | See versioned documentation here and [here](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/custom-babel-config) | See versioned documentation here and [here](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/custom-babel-config) | | | Integration/Typescript | [See current documentation](./configure/typescript.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/typescript-config) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/typescript-config) | | | Integration/Styling and CSS | [See current documentation](./configure/styling-and-css.md) | See versioned documentation | See versioned documentation | @@ -200,8 +199,12 @@ We're only covering versions 5.3 and 5.0 as they were important milestones for S | | User Interface/Theming | [See current documentation](./configure/theming.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/theming) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/theming) | | | User Interface/Sidebar & URLS | [See current documentation](./configure/sidebar-and-urls.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/options-parameter) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/options-parameter) | | | Environment variables | [See current documentation](./configure/environment-variables.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/env-vars) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/env-vars) | +| Builders | Introduction | [See current documentation](./builders/overview.md) | Non existing feature or undocumented | Non existing feature or undocumented | +| | Vite | [See current documentation](./builders/vite.md) | Non existing feature or undocumented | Non existing feature or undocumented | +| | Webpack | [See current documentation](./builders/webpack.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/configurations/custom-webpack-config/index.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/configurations/custom-webpack-config/index.md) | +| | Builder API | [See current documentation](./builders/builder-api.md) | Non existing feature or undocumented | Non existing feature or undocumented | | Addons | Introduction | [See current documentation](./addons/introduction.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/addons/writing-addons) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/addons/writing-addons) | -| | Install addons | [See current documentation](./addons/install-addons.md) | [See versioned documentation](https://github.com/storybookjs/storybook/blob/release/5.3/docs/src/pages/addons/using-addons/) | [See versioned documentation](https://github.com/storybookjs/storybook/blob/release/5.0/docs/src/pages/addons/using-addons/) | +| | Install addons | [See current documentation](./addons/install-addons.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/addons/using-addons/) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/addons/using-addons/) | | | Writing Addons | [See current documentation](./addons/writing-addons.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/addons/writing-addons) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/addons/writing-addons) | | | Writing Presets | [See current documentation](./addons/writing-presets.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/presets/writing-presets) | Non existing feature or undocumented | | | Addons Knowledge Base | [See current documentation](./addons/addon-knowledge-base.md) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.3/docs/src/pages/addons/writing-addons) | [See versioned documentation](https://github.com/storybookjs/storybook/tree/release/5.0/docs/src/pages/addons/writing-addons) | @@ -280,12 +283,84 @@ Yes, with the release of version 6.2, the [`Storyshots addon`](https://www.npmjs If you run into a situation where this is not the case, you can adjust the `config` object and manually specify the framework (e.g., `vue3`). -See our documentation on how to customize the [Storyshots configuration](./snapshot-testing.md). +See our documentation on how to customize the [Storyshots configuration](./writing-tests/snapshot-testing.md). ### Why are my MDX stories not working in IE11? Currently there's an issue when using MDX stories with IE11. This issue does not apply to [DocsPage](./writing-docs/docs-page.md). If you're interested in helping us fix this issue, read our Contribution guidelines and submit a pull request. + +### Why aren't my code blocks highlighted with Storybook MDX + +Out of the box, Storybook provides syntax highlighting for a set of languages (e.g., Javascript, Markdown, CSS, HTML, Typescript, GraphQL) that you can use with your code blocks. If you're writing your custom code blocks with MDX, you'll need to import the syntax highlighter manually. For example, if you're adding a code block for SCSS, adjust your story to the following: + + + + + + + +
+💡 Check react-syntax-highlighter's documentation for a list of available languages. +
+ +Applying this small change will enable you to add syntax highlight for SCSS or any other language available. + +### Why aren't my MDX 2 stories working in Storybook? + +MDX 2 introduced some changes to how the code is rendered. For example, if you enabled it in your Storybook and you have the following code block: + +``` + + +``` + +You'll need to update it to make it compatible with MDX 2. + +``` + +``` + +See the following [issue](https://github.com/mdx-js/mdx/issues/1945) for more information. + + +### Why can't I import my own stories into MDX 2? + +This is a known issue with MDX 2. We're working to fix it. For now you can apply the following workaround: + +```md + + +import { Story } from '@storybook/addon-docs'; + +import * as stories from './Button.stories.jsx'; + + +``` + + ### Why are my mocked GraphQL queries failing with Storybook's MSW addon? If you're working with Vue 3, you'll need to install [`@vue/apollo-composable`](https://www.npmjs.com/package/@vue/apollo-composable). With Svelte, you'll need to install [`@rollup/plugin-replace`](https://www.npmjs.com/package/@rollup/plugin-replace) and update your `rollup.config` file to the following: @@ -311,7 +386,7 @@ export default { plugins: [ // Other plugins - // Configures the replace plugin to allow Grapqhl Queries to work properly + // Configures the replace plugin to allow GraphQL Queries to work properly replace({ 'process.env.NODE_ENV': JSON.stringify('development'), }), @@ -328,25 +403,7 @@ Yes, check the [addon's examples](https://github.com/mswjs/msw-storybook-addon/t No, currently, the MSW addon only has support for GraphQL queries. If you're interested in including this feature, open an issue in the [MSW addon repository](https://github.com/mswjs/msw-storybook-addon) and follow up with the maintainer. -### Why aren't my code blocks highlighted with Storybook MDX - -Out of the box, Storybook provides syntax highlighting for a set of languages (e.g., Javascript, Markdown, CSS, HTML, Typescript, GraphQL) that you can use with your code blocks. If you're writing your custom code blocks with MDX, you'll need to import the syntax highlighter manually. For example, if you're adding a code block for SCSS, adjust your story to the following: - - - - - - -
-💡 Check react-syntax-highlighter's documentation for a list of available languages. -
- -Applying this small change will enable you to add syntax highlight for SCSS or any other language available. ### How can my code detect if it is running in Storybook? @@ -382,7 +439,7 @@ Although valid, it introduces additional boilerplate code to the story definitio ## Why is Storybook's source loader returning undefined with curried functions? -This is a known issue with Storybook. If you're interested in getting it fixed, open an issue with a [working reproduction](./contribute/how-to-reproduce) so that it can be triaged and fixed in future releases. +This is a known issue with Storybook. If you're interested in getting it fixed, open an issue with a [working reproduction](./contribute/how-to-reproduce.md) so that it can be triaged and fixed in future releases. ## Why are my args no longer displaying the default values? @@ -419,3 +476,7 @@ export default { }, }; ``` + +### Why isn't Storybook's test runner working? + +There's an issue with Storybook's test runner and the latest version of Jest (i.e., version 28), which prevents it from running effectively. As a workaround, you can downgrade Jest to the previous stable version (i.e., version 27), and you'll be able to run it. See the following [issue](https://github.com/storybookjs/test-runner/issues/99) for more information. \ No newline at end of file diff --git a/docs/get-started/install.md b/docs/get-started/install.md index cada685c43da..be09b6b2a85f 100644 --- a/docs/get-started/install.md +++ b/docs/get-started/install.md @@ -21,7 +21,7 @@ title: 'Install Storybook'
-sb init is not made for empty projects +storybook init is not made for empty projects Storybook needs to be installed into a project that is already set up with a framework. It will not work on an empty project. There are many ways to bootstrap an app in a given framework, including: @@ -89,8 +89,12 @@ Below are some of the most common installation issues and instructions on how to +
+Storybook collects completely anonymous data to help us improve user experience. Participation is optional, and you may [opt-out](../configure/telemetry.md#how-to-opt-out) if you'd not like to share any information. +
+ If all else fails, try asking for [help](https://storybook.js.org/support)
-Now that you installed Storybook successfully, let’s take a look at a story that was written for us. \ No newline at end of file +Now that you installed Storybook successfully, let’s take a look at a story that was written for us. diff --git a/docs/get-started/installation-command-section/angular.mdx b/docs/get-started/installation-command-section/angular.mdx index 5d79b9f6544f..33024a1d6619 100644 --- a/docs/get-started/installation-command-section/angular.mdx +++ b/docs/get-started/installation-command-section/angular.mdx @@ -2,7 +2,7 @@ ```shell # Add Storybook: -npx sb init +npx storybook init ``` - Update your `angular.json` file to include Storybook's custom builder: diff --git a/docs/get-started/installation-command-section/ember.mdx b/docs/get-started/installation-command-section/ember.mdx index 4a5dc26f3c7f..6ddc1d135c44 100644 --- a/docs/get-started/installation-command-section/ember.mdx +++ b/docs/get-started/installation-command-section/ember.mdx @@ -2,7 +2,7 @@ Use the Storybook CLI to install it with a couple of commands. Run this inside y ```shell # Add Storybook: -npx sb init +npx storybook init # Add Ember storybook adapter ember install @storybook/ember-cli-storybook diff --git a/docs/get-started/installation-command-section/html.mdx b/docs/get-started/installation-command-section/html.mdx index 3575943e26df..1062b008a7ff 100644 --- a/docs/get-started/installation-command-section/html.mdx +++ b/docs/get-started/installation-command-section/html.mdx @@ -2,7 +2,7 @@ Use the Storybook CLI to install it in a single command. Run this inside your _e ```shell # Add Storybook: -npx sb init --type html +npx storybook init --type html ``` If you run into issues with the installation, check the [Troubleshooting section](#troubleshooting) below for guidance on how to solve it. diff --git a/docs/get-started/installation-command-section/preact.mdx b/docs/get-started/installation-command-section/preact.mdx index 7dab36ebede0..5e7193f11630 100644 --- a/docs/get-started/installation-command-section/preact.mdx +++ b/docs/get-started/installation-command-section/preact.mdx @@ -2,7 +2,7 @@ Use the Storybook CLI to install it in a single command. Run this inside your _e ```shell # Add Storybook: -npx sb init +npx storybook init ``` If you run into issues with the installation, check the [Troubleshooting section](#troubleshooting) below for guidance on how to solve it. diff --git a/docs/get-started/installation-command-section/react.mdx b/docs/get-started/installation-command-section/react.mdx index 7dab36ebede0..5e7193f11630 100644 --- a/docs/get-started/installation-command-section/react.mdx +++ b/docs/get-started/installation-command-section/react.mdx @@ -2,7 +2,7 @@ Use the Storybook CLI to install it in a single command. Run this inside your _e ```shell # Add Storybook: -npx sb init +npx storybook init ``` If you run into issues with the installation, check the [Troubleshooting section](#troubleshooting) below for guidance on how to solve it. diff --git a/docs/get-started/installation-command-section/svelte.mdx b/docs/get-started/installation-command-section/svelte.mdx index 7dab36ebede0..5e7193f11630 100644 --- a/docs/get-started/installation-command-section/svelte.mdx +++ b/docs/get-started/installation-command-section/svelte.mdx @@ -2,7 +2,7 @@ Use the Storybook CLI to install it in a single command. Run this inside your _e ```shell # Add Storybook: -npx sb init +npx storybook init ``` If you run into issues with the installation, check the [Troubleshooting section](#troubleshooting) below for guidance on how to solve it. diff --git a/docs/get-started/installation-command-section/vue.mdx b/docs/get-started/installation-command-section/vue.mdx index 7dab36ebede0..5e7193f11630 100644 --- a/docs/get-started/installation-command-section/vue.mdx +++ b/docs/get-started/installation-command-section/vue.mdx @@ -2,7 +2,7 @@ Use the Storybook CLI to install it in a single command. Run this inside your _e ```shell # Add Storybook: -npx sb init +npx storybook init ``` If you run into issues with the installation, check the [Troubleshooting section](#troubleshooting) below for guidance on how to solve it. diff --git a/docs/get-started/installation-command-section/web-components.mdx b/docs/get-started/installation-command-section/web-components.mdx index 7dab36ebede0..5e7193f11630 100644 --- a/docs/get-started/installation-command-section/web-components.mdx +++ b/docs/get-started/installation-command-section/web-components.mdx @@ -2,7 +2,7 @@ Use the Storybook CLI to install it in a single command. Run this inside your _e ```shell # Add Storybook: -npx sb init +npx storybook init ``` If you run into issues with the installation, check the [Troubleshooting section](#troubleshooting) below for guidance on how to solve it. diff --git a/docs/get-started/setup.md b/docs/get-started/setup.md index e6cd39d8b027..2959e5685ddd 100644 --- a/docs/get-started/setup.md +++ b/docs/get-started/setup.md @@ -42,20 +42,20 @@ Storybook comes with a permissive [default configuration](../configure/overview. Your project may have additional requirements before components can be rendered in isolation. This warrants customizing configuration further. There are three broad categories of configuration you might need.
-Build configuration like webpack and Babel +Build configuration like Webpack and Babel If you see errors on the CLI when you run the `yarn storybook` command, you likely need to make changes to Storybook’s build configuration. Here are some things to try: - [Presets](../addons/addon-types.md) bundle common configurations for various technologies into Storybook. In particular, presets exist for Create React App, SCSS and Ant Design. - Specify a custom [Babel configuration](../configure/babel.md#custom-babel-config) for Storybook. Storybook automatically tries to use your project’s config if it can. -- Adjust the [webpack configuration](../configure/webpack.md) that Storybook uses. Try patching in your own configuration if needed. +- Adjust the [Webpack configuration](../builders/webpack.md) that Storybook uses. Try patching in your own configuration if needed.
Runtime configuration -If Storybook builds but you see an error immediately when connecting to it in the browser, in that case, chances are one of your input files is not compiling/transpiling correctly to be interpreted by the browser. Storybook supports modern browsers and IE11, but you may need to check the Babel and webpack settings (see above) to ensure your component code works correctly. +If Storybook builds but you see an error immediately when connecting to it in the browser, in that case, chances are one of your input files is not compiling/transpiling correctly to be interpreted by the browser. Storybook supports modern browsers and IE11, but you may need to check the Babel and Webpack settings (see above) to ensure your component code works correctly.
@@ -104,7 +104,7 @@ If you are using CSS-in-JS, chances are your styles are working because they’r
@import CSS into components -Storybook allows you to import CSS files in your components directly. But in some cases you may need to [tweak its webpack configuration](../configure/webpack.md#extendingstorybooks-webpack-config). Angular components require [a special import](../configure/styling-and-css.md#importing-css-files). +Storybook allows you to import CSS files in your components directly. But in some cases you may need to [tweak its Webpack configuration](../builders/webpack.md#extendingstorybooks-webpack-config). Angular components require [a special import](../configure/styling-and-css.md#importing-css-files).
diff --git a/docs/sharing/design-integrations.md b/docs/sharing/design-integrations.md index 48f87006987a..58c5a88e7dfd 100644 --- a/docs/sharing/design-integrations.md +++ b/docs/sharing/design-integrations.md @@ -123,7 +123,7 @@ Click the "Design" tab in the addon panel to view the embedded Figma design. ## Zeplin -[Zeplin](https://zeplin.io/) is a design tool that generates styleguides from [Sketch](https://www.sketch.com/), [Figma](https://www.figma.com/), and [Adobe XD](https://www.adobe.com/en/products/xd.html). +[Zeplin](https://zeplin.io/) is a design tool that generates styleguides from [Sketch](https://www.sketch.com/), [Figma](https://www.figma.com/), and [Adobe XD](https://www.adobe.com/products/xd.html). Use the [Zeplin addon](https://storybook.js.org/addons/storybook-zeplin) to connect Storybook. The addon displays designs from Zeplin alongside the currently selected story. It includes convenient tooling to overlay the design image atop the live component. diff --git a/docs/sharing/storybook-composition.md b/docs/sharing/storybook-composition.md index 88284c846a0b..ba12b5276a9c 100644 --- a/docs/sharing/storybook-composition.md +++ b/docs/sharing/storybook-composition.md @@ -65,7 +65,7 @@ You can also compose Storybooks based on the current development environment (e.
-💡 Similar to the other fields available in Storybook’s configuration file, the `refs` field can also be a function that accepts a config parameter containing Storybook’s configuration object. Check the [webpack documentation](../configure/webpack.md#extending-storybooks-webpack-config) to learn more about it. +💡 Similar to the other fields available in Storybook’s configuration file, the `refs` field can also be a function that accepts a config parameter containing Storybook’s configuration object. Check the [Webpack documentation](../builders/webpack.md#extending-storybooks-webpack-config) to learn more about it.
diff --git a/docs/snippets/common/component-story-auto-title.csf3-story.js.mdx b/docs/snippets/common/component-story-auto-title.csf3-story.js.mdx new file mode 100644 index 000000000000..74c50e85077b --- /dev/null +++ b/docs/snippets/common/component-story-auto-title.csf3-story.js.mdx @@ -0,0 +1,16 @@ +```js +// src/components/MyComponent.stories.js|jsx + +import { MyComponent } from './MyComponent'; + +/** + * Story written in CSF 3.0 with auto title generation + * See https://storybook.js.org/docs/7.0/react/api/csf + * to learn more about it. + */ +export default { component: MyComponent }; + +export const Default = { + args: { message: 'Hello world!' }, +}; +``` \ No newline at end of file diff --git a/docs/snippets/common/component-story-auto-title.js.mdx b/docs/snippets/common/component-story-auto-title.js.mdx deleted file mode 100644 index 33b7a49872bc..000000000000 --- a/docs/snippets/common/component-story-auto-title.js.mdx +++ /dev/null @@ -1,4 +0,0 @@ -```js -// CSF 3.0 - MyComponent.stories.js|jsx|ts|tsx -export default { component: MyComponent } -``` \ No newline at end of file diff --git a/docs/snippets/common/component-story-configuration.js.mdx b/docs/snippets/common/component-story-configuration.js.mdx deleted file mode 100644 index 05df51e2c8a5..000000000000 --- a/docs/snippets/common/component-story-configuration.js.mdx +++ /dev/null @@ -1,6 +0,0 @@ -```js -// ./storybook/main.js -module.exports = { - stories: ['../src'] -}; -``` \ No newline at end of file diff --git a/docs/snippets/common/mdx-changelog-stories.mdx.mdx b/docs/snippets/common/mdx-changelog-stories.mdx.mdx new file mode 100644 index 000000000000..502faa40e3a2 --- /dev/null +++ b/docs/snippets/common/mdx-changelog-stories.mdx.mdx @@ -0,0 +1,12 @@ +```md + + + +import { Meta } from "@storybook/addon-docs"; + +import Changelog from "../CHANGELOG.md"; + + + + +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-builder-api-build-server.ts.mdx b/docs/snippets/common/storybook-builder-api-build-server.ts.mdx new file mode 100644 index 000000000000..28f40b3d394f --- /dev/null +++ b/docs/snippets/common/storybook-builder-api-build-server.ts.mdx @@ -0,0 +1,36 @@ +```ts +// build.ts + +import { build as viteBuild } from 'vite'; +import { stringifyProcessEnvs } from './envs'; +import { commonConfig } from './vite-config'; + +import type { EnvsRaw, ExtendedOptions } from './types'; + +export async function build(options: ExtendedOptions) { + const { presets } = options; + + const baseConfig = await commonConfig(options, 'build'); + const config = { + ...baseConfig, + build: { + outDir: options.outputDir, + emptyOutDir: false, + sourcemap: true, + }, + }; + + const finalConfig = await presets.apply('viteFinal', config, options); + + const envsRaw = await presets.apply>('env'); + // Stringify env variables after getting `envPrefix` from the final config + const envs = stringifyProcessEnvs(envsRaw, finalConfig.envPrefix); + // Update `define` + finalConfig.define = { + ...finalConfig.define, + ...envs, + }; + + await viteBuild(finalConfig); +} +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-builder-api-configuration-options.ts.mdx b/docs/snippets/common/storybook-builder-api-configuration-options.ts.mdx new file mode 100644 index 000000000000..6e802781ee3a --- /dev/null +++ b/docs/snippets/common/storybook-builder-api-configuration-options.ts.mdx @@ -0,0 +1,36 @@ +```ts +// vite-server.ts + +import { stringifyProcessEnvs } from './envs'; +import { getOptimizeDeps } from './optimizeDeps'; +import { commonConfig } from './vite-config'; + +import type { EnvsRaw, ExtendedOptions } from './types'; + +export async function createViteServer(options: ExtendedOptions, devServer: Server) { + const { port, presets } = options; + + // Defines the baseline config. + const baseConfig = await commonConfig(options, 'development'); + const defaultConfig = { + ...baseConfig, + server: { + middlewareMode: true, + hmr: { + port, + server: devServer, + }, + fs: { + strict: true, + }, + }, + optimizeDeps: await getOptimizeDeps(baseConfig, options), + }; + + const finalConfig = await presets.apply('viteFinal', defaultConfig, options); + + const envsRaw = await presets.apply>('env'); + + // Remainder implementation +} +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-builder-api-dev-server.ts.mdx b/docs/snippets/common/storybook-builder-api-dev-server.ts.mdx new file mode 100644 index 000000000000..4f37414bf9fa --- /dev/null +++ b/docs/snippets/common/storybook-builder-api-dev-server.ts.mdx @@ -0,0 +1,22 @@ +```ts +// server.ts + +import { createServer } from 'vite'; + +export async function createViteServer(options: ExtendedOptions, devServer: Server) { + const { port } = options; + // Remainder server configuration + + // Creates the server. + return createServer({ + // The server configuration goes here + server: { + middlewareMode: true, + hmr: { + port, + server: devServer, + }, + }, + }); +} +``` diff --git a/docs/snippets/common/storybook-builder-api-interface.ts.mdx b/docs/snippets/common/storybook-builder-api-interface.ts.mdx new file mode 100644 index 000000000000..d8cbd038c15b --- /dev/null +++ b/docs/snippets/common/storybook-builder-api-interface.ts.mdx @@ -0,0 +1,22 @@ +```ts +export interface Builder { + start: (args: { + options: Options; + startTime: ReturnType; + router: Router; + server: Server; + }) => Promise; + bail: (e?: Error) => Promise; + }>; + build: (arg: { + options: Options; + startTime: ReturnType; + }) => Promise; + bail: (e?: Error) => Promise; + getConfig: (options: Options) => Promise; + corePresets?: string[]; + overridePresets?: string[]; +} +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-builder-api-mdx.ts.mdx b/docs/snippets/common/storybook-builder-api-mdx.ts.mdx new file mode 100644 index 000000000000..e9591db2ad4f --- /dev/null +++ b/docs/snippets/common/storybook-builder-api-mdx.ts.mdx @@ -0,0 +1,20 @@ +```ts +// mdx-plugin.ts + +import mdx from 'vite-plugin-mdx'; + +import { createCompiler } from '@storybook/csf-tools/mdx'; + +export function mdxPlugin() { + return mdx((filename) => { + const compilers = []; + + if (filename.endsWith('stories.mdx') || filename.endsWith('story.mdx')) { + compilers.push(createCompiler({})); + } + return { + compilers, + }; + }); +} +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-builder-api-preview-exports.ts.mdx b/docs/snippets/common/storybook-builder-api-preview-exports.ts.mdx new file mode 100644 index 000000000000..0fd6743bacd1 --- /dev/null +++ b/docs/snippets/common/storybook-builder-api-preview-exports.ts.mdx @@ -0,0 +1,82 @@ +```ts +// codegen-iframe-script.ts + +import { virtualPreviewFile, virtualStoriesFile } from './virtual-file-names'; +import { transformAbsPath } from './utils/transform-abs-path'; +import type { ExtendedOptions } from './types'; + +export async function generateIframeScriptCode(options: ExtendedOptions) { + const { presets, frameworkPath, framework } = options; + const frameworkImportPath = frameworkPath || `@storybook/${framework}`; + + const presetEntries = await presets.apply('config', [], options); + const configEntries = [...presetEntries].filter(Boolean); + + const absoluteFilesToImport = (files: string[], name: string) => + files + .map((el, i) => `import ${name ? `* as ${name}_${i} from ` : ''}'${transformAbsPath(el)}'`) + .join('\n'); + + const importArray = (name: string, length: number) => + new Array(length).fill(0).map((_, i) => `${name}_${i}`); + + const code = ` + // Ensure that the client API is initialized by the framework before any other iframe code + // is loaded. That way our client-apis can assume the existence of the API+store + import { configure } from '${frameworkImportPath}'; + + import { + addDecorator, + addParameters, + addArgTypesEnhancer, + addArgsEnhancer, + setGlobalRender + } from '@storybook/client-api'; + import { logger } from '@storybook/client-logger'; + ${absoluteFilesToImport(configEntries, 'config')} + import * as preview from '${virtualPreviewFile}'; + import { configStories } from '${virtualStoriesFile}'; + + const configs = [${importArray('config', configEntries.length) + .concat('preview.default') + .join(',')}].filter(Boolean) + + configs.forEach(config => { + Object.keys(config).forEach((key) => { + const value = config[key]; + switch (key) { + case 'args': + case 'argTypes': { + return logger.warn('Invalid args/argTypes in config, ignoring.', JSON.stringify(value)); + } + case 'decorators': { + return value.forEach((decorator) => addDecorator(decorator, false)); + } + case 'parameters': { + return addParameters({ ...value }, false); + } + case 'render': { + return setGlobalRender(value) + } + case 'globals': + case 'globalTypes': { + const v = {}; + v[key] = value; + return addParameters(v, false); + } + case 'decorateStory': + case 'renderToDOM': { + return null; + } + default: { + // eslint-disable-next-line prefer-template + return console.log(key + ' was not supported :( !'); + } + } + }); + }) + configStories(configure); + `.trim(); + return code; +} +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-builder-api-shutdown-server.ts.mdx b/docs/snippets/common/storybook-builder-api-shutdown-server.ts.mdx new file mode 100644 index 000000000000..03144c66ca7d --- /dev/null +++ b/docs/snippets/common/storybook-builder-api-shutdown-server.ts.mdx @@ -0,0 +1,24 @@ +```ts +// index.ts + +import { createViteServer } from './vite-server'; + +export const start: ViteBuilder['start'] = async ({ options, server: devServer }) => { + // Remainder implementation goes here + + const server = await createViteServer(options as ExtendedOptions, devServer); + async function bail(e?: Error): Promise { + try { + return await server.close(); + } catch (err) { + console.warn('unable to close the server'); + } + throw e; + } + + return { + bail, + totalTime: process.hrtime(startTime), + }; +}; +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-config-layout.js.mdx b/docs/snippets/common/storybook-config-layout.js.mdx index 550254d31dd3..c36446aebea2 100644 --- a/docs/snippets/common/storybook-config-layout.js.mdx +++ b/docs/snippets/common/storybook-config-layout.js.mdx @@ -9,7 +9,7 @@ addons.setConfig({ showPanel: true, panelPosition: 'bottom', enableShortcuts: true, - isToolshown: true, + showToolbar: true, theme: undefined, selectedPanel: undefined, initialActive: 'sidebar', @@ -18,11 +18,11 @@ addons.setConfig({ collapsedRoots: ['other'], }, toolbar: { - title: { hidden: false, }, - zoom: { hidden: false, }, - eject: { hidden: false, }, - copy: { hidden: false, }, - fullscreen: { hidden: false, }, + title: { hidden: false }, + zoom: { hidden: false }, + eject: { hidden: false }, + copy: { hidden: false }, + fullscreen: { hidden: false }, }, }); -``` \ No newline at end of file +``` diff --git a/docs/snippets/common/storybook-csf-3-auto-title-redundant.js.mdx b/docs/snippets/common/storybook-csf-3-auto-title-redundant.js.mdx new file mode 100644 index 000000000000..26c9d0997b57 --- /dev/null +++ b/docs/snippets/common/storybook-csf-3-auto-title-redundant.js.mdx @@ -0,0 +1,17 @@ +```js +// components/MyComponent/MyComponent.stories.js|jsx|ts|tsx + +import { MyComponent } from './MyComponent.js' + +export default { + component: MyComponent, + title: 'components/MyComponent/MyComponent', +}; + +export const Default = { + args: { + something: 'Something else', + }, +}; + +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-main-auto-title-custom.js.mdx b/docs/snippets/common/storybook-main-auto-title-custom.js.mdx new file mode 100644 index 000000000000..96b6e0408971 --- /dev/null +++ b/docs/snippets/common/storybook-main-auto-title-custom.js.mdx @@ -0,0 +1,15 @@ +```js +// .storybook/main.js + +module.exports = { + stories: [{ directory: '../src', titlePrefix: 'Custom' }], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + ], + core: { + builder: 'webpack5', + }, +}; +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-main-configuration-src-dir.main-js.js.mdx b/docs/snippets/common/storybook-main-configuration-src-dir.main-js.js.mdx new file mode 100644 index 000000000000..f7933dbf6e67 --- /dev/null +++ b/docs/snippets/common/storybook-main-configuration-src-dir.main-js.js.mdx @@ -0,0 +1,15 @@ +```js +// ./storybook/main.js + +module.exports = { + stories: ['../src'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + ], + core: { + builder: 'webpack5' + }, +}; +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-main-enable-mdx2.js.mdx b/docs/snippets/common/storybook-main-enable-mdx2.js.mdx new file mode 100644 index 000000000000..fe80c1d4c8b7 --- /dev/null +++ b/docs/snippets/common/storybook-main-enable-mdx2.js.mdx @@ -0,0 +1,11 @@ +```js +// .storybook/main.js|ts + +module.exports = { + stories: ['../stories/**/*.stories.mdx', '../stories/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-links', '@storybook/addon-essentials'], + features: { + previewMdx2: true, // 👈 MDX 2 enabled here + }, +}; +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-main-enable-transcludemarkdown.js.mdx b/docs/snippets/common/storybook-main-enable-transcludemarkdown.js.mdx new file mode 100644 index 000000000000..cb07d5763454 --- /dev/null +++ b/docs/snippets/common/storybook-main-enable-transcludemarkdown.js.mdx @@ -0,0 +1,22 @@ +```js +// .storybook/main.js|ts + +module.exports = { + stories: [ + //👇 Changes the load order of our stories. First loads the Changelog page + '../src/Changelog.stories.mdx', + '../stories/**/*.stories.mdx', + '../stories/**/*.stories.@(js|jsx|ts|tsx)' + ], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + { + name: '@storybook/addon-docs', + options: { + transcludeMarkdown: true, //👈 Set transcludeMarkdown to true + }, + }, + ], +}; +``` diff --git a/docs/snippets/common/storybook-main-with-single-static-dir.js.mdx b/docs/snippets/common/storybook-main-with-single-static-dir.js.mdx index 51f72b251d8f..12ca0636ba6b 100644 --- a/docs/snippets/common/storybook-main-with-single-static-dir.js.mdx +++ b/docs/snippets/common/storybook-main-with-single-static-dir.js.mdx @@ -2,8 +2,8 @@ // .storybook/main.js module.exports = { - stories: [], - addons: [], - staticDirs: ['../public'], + stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-links', '@storybook/addon-essentials'], + staticDirs: ['../public'], //👈 Configures the static asset folder in Storybook }; ``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-manager-render-label-stories.js.mdx b/docs/snippets/common/storybook-manager-render-label-stories.js.mdx new file mode 100644 index 000000000000..a40abfbadc97 --- /dev/null +++ b/docs/snippets/common/storybook-manager-render-label-stories.js.mdx @@ -0,0 +1,13 @@ +```js +// .storybook/manager.js + +import { addons } from '@storybook/addons'; + +import startCase from 'lodash/startCase'; + +addons.setConfig({ + sidebar: { + renderLabel: ({ name, type }) => (type === 'story' ? name : startCase(name)), + }, +}); +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-mdx2-install.npm.js.mdx b/docs/snippets/common/storybook-mdx2-install.npm.js.mdx new file mode 100644 index 000000000000..6f6b5f63daad --- /dev/null +++ b/docs/snippets/common/storybook-mdx2-install.npm.js.mdx @@ -0,0 +1,3 @@ +```shell +npm install @storybook/mdx2-csf --save-dev +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-mdx2-install.yarn.js.mdx b/docs/snippets/common/storybook-mdx2-install.yarn.js.mdx new file mode 100644 index 000000000000..6c80c7bba428 --- /dev/null +++ b/docs/snippets/common/storybook-mdx2-install.yarn.js.mdx @@ -0,0 +1,3 @@ +```shell +yarn add --dev @storybook/mdx2-csf +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-msw-generate.msw.js.mdx b/docs/snippets/common/storybook-msw-generate.msw.js.mdx new file mode 100644 index 000000000000..413d5bf267e2 --- /dev/null +++ b/docs/snippets/common/storybook-msw-generate.msw.js.mdx @@ -0,0 +1,3 @@ +```shell +npx msw init public/ +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-msw-install.npm.js.mdx b/docs/snippets/common/storybook-msw-install.npm.js.mdx new file mode 100644 index 000000000000..2a8608ebb293 --- /dev/null +++ b/docs/snippets/common/storybook-msw-install.npm.js.mdx @@ -0,0 +1,3 @@ +```shell +npm install msw msw-storybook-addon --save-dev +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-msw-install.yarn.js.mdx b/docs/snippets/common/storybook-msw-install.yarn.js.mdx new file mode 100644 index 000000000000..ff285f0d7176 --- /dev/null +++ b/docs/snippets/common/storybook-msw-install.yarn.js.mdx @@ -0,0 +1,3 @@ +```shell +yarn add --dev msw msw-storybook-addon +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-preview-register-msw-addon.js.mdx b/docs/snippets/common/storybook-preview-register-msw-addon.js.mdx new file mode 100644 index 000000000000..d1b97095311a --- /dev/null +++ b/docs/snippets/common/storybook-preview-register-msw-addon.js.mdx @@ -0,0 +1,25 @@ +```js +// .storybook/preview.js + +import { initialize, mswDecorator } from 'msw-storybook-addon'; + +/* + * Initializes MSW + * See https://github.com/mswjs/msw-storybook-addon#configuring-msw + * to learn how to customize it + */ +initialize(); + +export const parameters = { + actions: { argTypesRegex: '^on[A-Z].*' }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, +}; + +// Provide the MSW addon decorator globally +export const decorators = [mswDecorator]; +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-storyloading-with-custom-object.js.mdx b/docs/snippets/common/storybook-storyloading-with-custom-object.js.mdx index 7b05042aafe1..3859a7c4ae34 100644 --- a/docs/snippets/common/storybook-storyloading-with-custom-object.js.mdx +++ b/docs/snippets/common/storybook-storyloading-with-custom-object.js.mdx @@ -8,7 +8,7 @@ module.exports = { directory: '../packages/stories', // 👇 The titlePrefix field will generate automatic titles for your stories titlePrefix: 'MyComponents', - // 👇 Storybook will load all files that contain the stories extensio + // 👇 Storybook will load all files that contain the stories extension files: '*.stories.*', }, ], diff --git a/docs/snippets/common/storybook-test-runner-install.npm.js.mdx b/docs/snippets/common/storybook-test-runner-install.npm.js.mdx index 90f046c3ec62..50b39891c2b2 100644 --- a/docs/snippets/common/storybook-test-runner-install.npm.js.mdx +++ b/docs/snippets/common/storybook-test-runner-install.npm.js.mdx @@ -1,3 +1,3 @@ ```shell -npm install @storybook/test-runner jest --save-dev +npm install @storybook/test-runner jest@27 --save-dev ``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-test-runner-install.yarn.js.mdx b/docs/snippets/common/storybook-test-runner-install.yarn.js.mdx index 3221e525779e..79840bb5b1b7 100644 --- a/docs/snippets/common/storybook-test-runner-install.yarn.js.mdx +++ b/docs/snippets/common/storybook-test-runner-install.yarn.js.mdx @@ -1,3 +1,3 @@ ```shell -yarn add --dev @storybook/test-runner jest +yarn add --dev @storybook/test-runner jest@27 ``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-vite-builder-aliasing.js.mdx b/docs/snippets/common/storybook-vite-builder-aliasing.js.mdx new file mode 100644 index 000000000000..223d5bb2a4a1 --- /dev/null +++ b/docs/snippets/common/storybook-vite-builder-aliasing.js.mdx @@ -0,0 +1,24 @@ +```js +// .storybook/main.js|cjs|ts + +const { mergeConfig } = require('vite'); + +module.exports = { + stories: ['../stories/**/*.stories.mdx', '../stories/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-links', '@storybook/addon-essentials'], + core: { + builder: '@storybook/builder-vite', + }, + async viteFinal(config) { + // Merge custom configuration into the default config + return mergeConfig(config, { + // Use the same "resolve" configuration as your app + resolve: (await import('../vite.config.js')).default.resolve, + // Add dependencies to pre-optimization + optimizeDeps: { + include: ['storybook-dark-mode'], + }, + }); + }, +}; +``` diff --git a/docs/snippets/common/storybook-vite-builder-config-env.js.mdx b/docs/snippets/common/storybook-vite-builder-config-env.js.mdx new file mode 100644 index 000000000000..a3dbee8895aa --- /dev/null +++ b/docs/snippets/common/storybook-vite-builder-config-env.js.mdx @@ -0,0 +1,24 @@ +```js +// .storybook/main.js|ts + +const { mergeConfig } = require('vite'); + +module.exports = { + stories: ['../stories/**/*.stories.mdx', '../stories/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-links', '@storybook/addon-essentials'], + core: { + builder: '@storybook/builder-vite', + }, + async viteFinal(config, { configType }) { + if (configType === 'DEVELOPMENT') { + // Your development configuration goes here + } + if (configType === 'PRODUCTION') { + // Your production configuration goes here. + } + return mergeConfig(config, { + // Your environment configuration here + }); + }, +}; +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-vite-builder-install.npm.js.mdx b/docs/snippets/common/storybook-vite-builder-install.npm.js.mdx new file mode 100644 index 000000000000..e4d64958fb9a --- /dev/null +++ b/docs/snippets/common/storybook-vite-builder-install.npm.js.mdx @@ -0,0 +1,3 @@ +```shell +npm install @storybook/builder-vite --save-dev +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-vite-builder-install.yarn.js.mdx b/docs/snippets/common/storybook-vite-builder-install.yarn.js.mdx new file mode 100644 index 000000000000..ff51b902c057 --- /dev/null +++ b/docs/snippets/common/storybook-vite-builder-install.yarn.js.mdx @@ -0,0 +1,3 @@ +```shell +yarn add --dev @storybook/builder-vite +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-vite-builder-react-docgen.js.mdx b/docs/snippets/common/storybook-vite-builder-react-docgen.js.mdx new file mode 100644 index 000000000000..7d422a056a04 --- /dev/null +++ b/docs/snippets/common/storybook-vite-builder-react-docgen.js.mdx @@ -0,0 +1,14 @@ +```js +// .storybook/main.js + +module.exports = { + stories: ['../stories/**/*.stories.mdx', '../stories/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-links', '@storybook/addon-essentials'], + core: { + builder: '@storybook/builder-vite', + }, + typescript: { + reactDocgen: 'react-docgen', // 👈 react-docgen configured here. + }, +}; +``` diff --git a/docs/snippets/common/storybook-vite-builder-register.js.mdx b/docs/snippets/common/storybook-vite-builder-register.js.mdx new file mode 100644 index 000000000000..6ae400a96a42 --- /dev/null +++ b/docs/snippets/common/storybook-vite-builder-register.js.mdx @@ -0,0 +1,11 @@ +```js +// .storybook/main.js|ts + +module.exports = { + stories: ['../stories/**/*.stories.mdx', '../stories/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-links', '@storybook/addon-essentials'], + core: { + builder: '@storybook/builder-vite', // 👈 The builder enabled here. + }, +}; +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-vite-builder-svelte-plugin.js.mdx b/docs/snippets/common/storybook-vite-builder-svelte-plugin.js.mdx new file mode 100644 index 000000000000..3ec43e4e035e --- /dev/null +++ b/docs/snippets/common/storybook-vite-builder-svelte-plugin.js.mdx @@ -0,0 +1,24 @@ +```js +// .storybook/main.js|ts + +const preprocess = require('svelte-preprocess'); + +module.exports = { + stories: ['../stories/**/*.stories.mdx', '../stories/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-links', '@storybook/addon-essentials'], + core: { + builder: '@storybook/builder-vite', + }, + async viteFinal(config, { configType }) { + // Customize the Vite config here + return config; + }, + svelteOptions: { + preprocess: preprocess({ + typescript: true, + postcss: true, + sourceMap: true, + }), + }, +}; +``` \ No newline at end of file diff --git a/docs/snippets/common/storybook-vite-builder-ts-configure.ts.mdx b/docs/snippets/common/storybook-vite-builder-ts-configure.ts.mdx new file mode 100644 index 000000000000..3948e084d949 --- /dev/null +++ b/docs/snippets/common/storybook-vite-builder-ts-configure.ts.mdx @@ -0,0 +1,19 @@ +```ts +// .storybook/main.ts + +import type { StorybookViteConfig } from '@storybook/builder-vite'; + +const config: StorybookViteConfig = { + stories: ['../stories/**/*.stories.mdx', '../stories/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-links', '@storybook/addon-essentials'], + core: { + builder: '@storybook/builder-vite', + }, + async viteFinal(config, options) { + // Add your configuration here + return config; + }, +}; + +export default config; +``` \ No newline at end of file diff --git a/docs/toc.js b/docs/toc.js index 62fdb9954f33..ba45d3bffc4f 100644 --- a/docs/toc.js +++ b/docs/toc.js @@ -367,11 +367,6 @@ module.exports = { title: 'Integration', type: 'menu', children: [ - { - pathSegment: 'webpack', - title: 'Webpack', - type: 'link', - }, { pathSegment: 'babel', title: 'Babel', @@ -438,6 +433,33 @@ module.exports = { }, ], }, + { + title: '🧰 Builders', + pathSegment: 'builders', + type: 'menu', + children: [ + { + pathSegment: 'overview', + title: 'Introduction', + type: 'link', + }, + { + pathSegment: 'vite', + title: 'Vite', + type: 'link', + }, + { + pathSegment: 'webpack', + title: 'Webpack', + type: 'link', + }, + { + pathSegment: 'builder-api', + title: 'API', + type: 'link', + }, + ], + }, { title: '🔌 API', pathSegment: 'api', diff --git a/docs/versions/next.json b/docs/versions/next.json index 8c58251c83ac..96d4c2977f9e 100644 --- a/docs/versions/next.json +++ b/docs/versions/next.json @@ -1 +1 @@ -{"version":"6.5.0-beta.4","info":{"plain":"### Features\n\n- UI: Add a parent level toolbar exclusion key for tabs ([#18106](https://github.com/storybookjs/storybook/pull/18106))\n- Addon-a11y: Display a11y issues number in addon tab title ([#17983](https://github.com/storybookjs/storybook/pull/17983))\n\n### Bug Fixes\n\n- Addon-docs: Fix Canvas block CURRENT_SELECTION handling ([#18130](https://github.com/storybookjs/storybook/pull/18130))\n- Telemetry: Add safecheck for crash reports ([#18129](https://github.com/storybookjs/storybook/pull/18129))\n- Addon-a11y: Fix a11y params > element use ([#17989](https://github.com/storybookjs/storybook/pull/17989))"}} \ No newline at end of file +{"version":"6.5.0-rc.1","info":{"plain":"### Bug Fixes\n\n- CLI: Improve webpack version and add detection of nextjs ([#18220](https://github.com/storybookjs/storybook/pull/18220))\n- ArgsTable: Gracefully handle conditional args failures ([#18248](https://github.com/storybookjs/storybook/pull/18248))\n- Controls: Fix reset button broken for !undefined URL values ([#18231](https://github.com/storybookjs/storybook/pull/18231))\n- Vue3: Add support for TSX in single file components ([#18038](https://github.com/storybookjs/storybook/pull/18038))"}} \ No newline at end of file diff --git a/docs/writing-docs/changelog-mdx-md-transcludemarkdown-optimized.png b/docs/writing-docs/changelog-mdx-md-transcludemarkdown-optimized.png new file mode 100644 index 0000000000000000000000000000000000000000..fe83633f16d1acbc3820b22f0c8e7d8c08582f5c GIT binary patch literal 38411 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 literal 0 HcmV?d00001 diff --git a/docs/writing-docs/doc-block-source.md b/docs/writing-docs/doc-block-source.md index 66e9c92f7743..c12be813dbfe 100644 --- a/docs/writing-docs/doc-block-source.md +++ b/docs/writing-docs/doc-block-source.md @@ -23,7 +23,7 @@ It includes additional customization via parameters. Below is a condensed exampl
-💡 The pattern demonstrated here applies only to the story. If you need, you can it this to all the component stories, introducing a [component parameter](../writing-stories/parameters.md#component-parameters). +💡 The pattern demonstrated here applies only to the story. If you need, you can apply this to all the component stories, introducing a [component parameter](../writing-stories/parameters.md#component-parameters).
@@ -54,4 +54,4 @@ If you need, you can also include the `Source` Doc Block in your MDX stories. It ]} /> - \ No newline at end of file + diff --git a/docs/writing-docs/docs-page.md b/docs/writing-docs/docs-page.md index 36c590e65462..23676acae59c 100644 --- a/docs/writing-docs/docs-page.md +++ b/docs/writing-docs/docs-page.md @@ -156,7 +156,7 @@ In addition, you can interleave your own components to customize the auto-genera ## Story file names -Unless you use a custom [webpack configuration](../configure/webpack.md#extending-storybooks-webpack-config), all of your story files should have the suffix `*.stories.@(j|t)sx?`. For example, "Badge.stories.js" or "Badge.stories.tsx". This tells Storybook and its docs preset to display the docs based on the file contents. +Unless you use a custom [Webpack configuration](../builders/webpack.md#extending-storybooks-webpack-config), all of your story files should have the suffix `*.stories.@(j|t)sx?`. For example, "Badge.stories.js" or "Badge.stories.tsx". This tells Storybook and its docs preset to display the docs based on the file contents. ## Inline stories vs. iframe stories diff --git a/docs/writing-docs/mdx.md b/docs/writing-docs/mdx.md index a5924a4ebfba..e7b8458293df 100644 --- a/docs/writing-docs/mdx.md +++ b/docs/writing-docs/mdx.md @@ -211,6 +211,35 @@ Write your documentation as you usually would, and your existing SCSS code block +### Creating a Changelog story + +One common use case for MDX-only docs stories is importing a project's `CHANGELOG.md` into an MDX story, so that users can easily refer to the CHANGELOG via a documentation node in Storybook. + +First, ensure that `transcludeMarkdown` is set to `true` in `main.js`: + + + + + + + +Then, import the markdown and treat the imported file as a component in the MDX file: + +```mdx +import { Meta } from "@storybook/addon-docs"; + +import Changelog from "../CHANGELOG.md"; + + + + +``` +![Changelog markdown in an MDX story](./changelog-mdx-md-transcludemarkdown-optimized.png) + ## Linking to other stories and pages When writing MDX, you may want to provide links to other stories or documentation pages and sections. You can use the `path` query string. @@ -241,10 +270,39 @@ You can also use anchors to target a specific section of a page: ## MDX file names -Unless you use a custom [webpack configuration](../configure/webpack.md#extending-storybooks-webpack-config), all of your MDX files should have the suffix `*.stories.mdx`. This tells Storybook to apply its special processing to the `` and `` elements in the file. +Unless you use a custom [Webpack configuration](../builders/webpack.md#extending-storybooks-webpack-config), all of your MDX files should have the suffix `*.stories.mdx`. This tells Storybook to apply its special processing to the `` and `` elements in the file.
Be sure to update [.storybook/main.js](../configure/overview.md#configure-story-rendering) file to load `.stories.mdx` stories, as per the addon-docs installation instructions.
+ +## MDX 2 + +Starting with Storybook 6.5, [MDX 2](https://mdxjs.com/blog/v2/) is introduced as an experimental opt-in feature. To enable it, you'll need to take additional steps. Documented below is our recommendation. + +Run the following command to add the necessary dependency. + + + + + + + +Update your Storybook configuration (in `.storybook/main.js|ts`) and add the `previewMdx2` feature flag as follows: + + + + + + diff --git a/docs/writing-stories/build-pages-with-storybook.md b/docs/writing-stories/build-pages-with-storybook.md index 9ebd55d0e8e5..9bced0a9b45c 100644 --- a/docs/writing-stories/build-pages-with-storybook.md +++ b/docs/writing-stories/build-pages-with-storybook.md @@ -2,7 +2,7 @@ title: 'Building pages with Storybook' --- -Storybook helps you build any component, from small “atomic” components to composed pages. But as you move up the component hierarchy toward the level of pages, you end up dealing with more complexity. +Storybook helps you build any component, from small “atomic” components to composed pages. But as you move up the component hierarchy toward the page level, you deal with more complexity. There are many ways to build pages in Storybook. Here are common patterns and solutions. @@ -47,7 +47,7 @@ When you are building screens in this way, it is typical that the inputs of a co -In such cases it is natural to use [args composition](./args.md#args-composition) to build the stories for the page based on the stories of the sub-components: +In such cases, it is natural to use [args composition](./args.md#args-composition) to build the stories for the page based on the stories of the sub-components: @@ -72,13 +72,57 @@ If you need to render a connected component in Storybook, you can mock the netwo ### Mocking providers -If you are using a provider that supplies data via the context, you can wrap your story in a decorator that provides a mocked version of that provider. For example, in the [Screens](https://storybook.js.org/tutorials/intro-to-storybook/react/en/screen/) chapter of the Intro to Storybook tutorial, we mock a Redux provider with mock data. +Suppose you are using a provider that supplies data via the context. In that case, you can wrap your story in a decorator that provides a mocked version of that provider. For example, in the [Screens](https://storybook.js.org/tutorials/intro-to-storybook/react/en/screen/) chapter of the Intro to Storybook tutorial, we mock a Redux provider with mock data. ### Mocking API Services -Connected applications such as Twitter, Instagram, amongst others, are everywhere, consuming data either from REST or GraphQL endpoints. If you're working in an application that relies on either of these data providers, you can add Mock Service Worker (MSW) via [Storybook's MSW addon](https://storybook.js.org/addons/msw-storybook-addon) to mock data alongside your app and stories. +Connected applications such as Twitter, Instagram, amongst others, are everywhere, consuming data from REST or GraphQL endpoints. Suppose you're working in an application that relies on either of these data providers. In that case, you can add Mock Service Worker (MSW) via [Storybook's MSW addon](https://storybook.js.org/addons/msw-storybook-addon) to mock data alongside your app and stories. -[Mock Service Worker](https://mswjs.io/) is an API mocking library. It relies on service workers to capture network requests and provides mocked data in response. The MSW addon adds this functionality into Storybook, allowing you to mock API requests in your stories. +[Mock Service Worker](https://mswjs.io/) is an API mocking library. It relies on service workers to capture network requests and provides mocked data in response. The MSW addon adds this functionality into Storybook, allowing you to mock API requests in your stories. Below is an overview of how to set up and use the addon. + +Run the following commands to install MSW, the addon, and generate a mock service worker. + + + + + + + +
+ +💡 If you're working with Angular, you'll need to adjust the command to save the mock service worker file in a different directory (e.g., `src`). + +
+ +Update your `.storybook/preview.js` file and enable the addon via a [global decorator](./decorators.md#global-decorators). + + + + + + + +Finally, update your [`.storybook/main.js|ts`](../configure/overview.md#using-storybook-api) to allow Storybook to load the generated mock service worker file as follows: + + + + + + #### Mocking REST requests with MSW addon @@ -157,7 +201,7 @@ To test your screen with the GraphQL mocked data, you could write the following It is also possible to mock imports directly, as you might in a unit test, using Webpack’s aliasing. It's advantageous if your component makes network requests directly with third-party libraries. -We're going to use [isomorphic-fetch](https://www.npmjs.com/package/isomorphic-fetch) as an example. +We'll use [isomorphic-fetch](https://www.npmjs.com/package/isomorphic-fetch) as an example. Inside a directory called `__mocks__`, create a new file called `isomorphic-fetch.js` with the following code: @@ -223,7 +267,7 @@ Like the [import mocking](##mocking-imports) above, once you have a mock, you’ It's possible to avoid mocking the dependencies of connected "container" components entirely by passing them around via props or React context. However, it requires a strict split of the container and presentational component logic. For example, if you have a component responsible for data fetching logic and rendering DOM, it will need to be mocked as previously described. -It’s common to import and embed container components amongst presentational components. However, as we discovered earlier, to render them within Storybook, we’ll likely have to mock their dependencies or the imports themselves. +It’s common to import and embed container components amongst presentational components. However, as we discovered earlier, we’ll likely have to mock their dependencies or the imports to render them within Storybook. Not only can this quickly grow to become a tedious task, but it’s also challenging to mock container components that use local states. So, instead of importing containers directly, a solution to this problem is to create a React context that provides the container components. It allows you to freely embed container components as usual, at any level in the component hierarchy without worrying about subsequently mocking their dependencies; since we can swap out the containers themselves with their mocked presentational counterpart. @@ -238,7 +282,7 @@ ProfilePageContext.js
-It’s also often helpful to set up a “global” container context (perhaps named `GlobalContainerContext`) for container components that may be rendered on every page of your app and adding them to the top level of your application. While it’s possible to place every container within this global context, it should only provide globally required containers. +It’s also often helpful to set up a “global” container context (perhaps named `GlobalContainerContext`) for container components that may be rendered on every page of your app and add them to the top level of your application. While it’s possible to place every container within this global context, it should only provide globally required containers.
@@ -284,7 +328,7 @@ In the context of Storybook, instead of providing container components through c
-If the same context applies to all `ProfilePage` stories, we can also use a [decorator](./decorators.md). +If the same context applies to all `ProfilePage` stories, we can use a [decorator](./decorators.md).
diff --git a/docs/writing-tests/test-runner.md b/docs/writing-tests/test-runner.md index f7727f5a40b7..5502adfbcd15 100644 --- a/docs/writing-tests/test-runner.md +++ b/docs/writing-tests/test-runner.md @@ -178,7 +178,7 @@ However, you might want to pair the test runner and Chromatic in some cases. ### Test hook API (experimental) -The test-runner renders a story and executes its [play function](writing-stories/play-function.md) if one exists. However, certain behaviors are impossible to achieve via the play function, which executes in the browser. For example, if you want the test-runner to take visual snapshots for you, this is possible via Playwright/Jest but must be executed in Node. +The test-runner renders a story and executes its [play function](../writing-stories/play-function.md) if one exists. However, certain behaviors are impossible to achieve via the play function, which executes in the browser. For example, if you want the test-runner to take visual snapshots for you, this is possible via Playwright/Jest but must be executed in Node. The test-runner exports test hooks that can be overridden globally to enable use cases like visual or DOM snapshots. These hooks give you access to the test lifecycle _before_ and _after_ the story is rendered. Listed below are the available hooks and an overview of how to use them. diff --git a/examples/README.md b/examples/README.md index aa9276df9c64..70c3ddc681bd 100644 --- a/examples/README.md +++ b/examples/README.md @@ -20,20 +20,4 @@ Live examples of these: - [HTML](https://storybookjs.netlify.com/html-kitchen-sink/) - [Svelte](https://storybookjs.netlify.com/svelte-kitchen-sink/) - [Ember](https://storybookjs.netlify.com/ember-cli/) -- [Preact](https://storybookjs.netlify.com/preact-kitchen-sink/) - -### 5.0 - -- [React Official](https://release-5-0--storybooks-official.netlify.com/) -- [Vue](https://release-5-0--storybooks-vue.netlify.com/) -- [Angular](https://release-5-0--storybooks-angular.netlify.com/) -- [HTML](https://release-5-0--storybooks-html.netlify.com/) -- [Svelte](https://release-5-0--storybooks-svelte.netlify.com/) -- [Ember](https://release-5-0--storybooks-ember.netlify.com/) -- [Preact](https://release-5-0--storybooks-preact.netlify.com/) - -### 3.4 - -- [React Official](https://release-3-4--storybooks-official.netlify.com) -- [Vue](https://release-3-4--storybooks-vue.netlify.com/) -- [Angular](https://release-3-4--storybooks-angular.netlify.com/) +- [Preact](https://storybookjs.netlify.com/preact-kitchen-sink/) \ No newline at end of file diff --git a/examples/angular-cli/.storybook/main.js b/examples/angular-cli/.storybook/main.js index 2847cf86e224..e5e02dcd9f59 100644 --- a/examples/angular-cli/.storybook/main.js +++ b/examples/angular-cli/.storybook/main.js @@ -16,6 +16,7 @@ module.exports = { ], core: { builder: 'webpack4', + channelOptions: { allowFunction: false, maxDepth: 10 }, disableTelemetry: true, }, // These are just here to test composition. They could be added to any storybook example project diff --git a/examples/angular-cli/jest-config/setup.ts b/examples/angular-cli/jest-config/setup.ts index b3714757f35c..276aba67d769 100644 --- a/examples/angular-cli/jest-config/setup.ts +++ b/examples/angular-cli/jest-config/setup.ts @@ -1,4 +1,4 @@ -import 'jest-preset-angular'; +import 'jest-preset-angular/setup-jest'; import './globalMocks'; require('@storybook/babel-plugin-require-context-hook/register')(); diff --git a/examples/angular-cli/jest.config.js b/examples/angular-cli/jest.config.js index 422ede7df832..d64bd077b51d 100644 --- a/examples/angular-cli/jest.config.js +++ b/examples/angular-cli/jest.config.js @@ -7,7 +7,7 @@ module.exports = { preset: 'jest-preset-angular', globals: { 'ts-jest': { - tsConfig: path.join(__dirname, 'src/tsconfig.spec.json'), + tsconfig: path.join(__dirname, 'src/tsconfig.spec.json'), stringifyContentPathRegex: '\\.html$', astTransformers: { before: [ @@ -26,9 +26,9 @@ module.exports = { }, moduleFileExtensions: [...config.moduleFileExtensions, 'html'], snapshotSerializers: [ - 'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js', - 'jest-preset-angular/build/AngularSnapshotSerializer.js', - 'jest-preset-angular/build/HTMLCommentSerializer.js', + 'jest-preset-angular/build/serializers/html-comment', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/no-ng-attributes', ], setupFilesAfterEnv: ['./jest-config/setup.ts'], testPathIgnorePatterns: ['app.component.spec.ts'], diff --git a/examples/angular-cli/package.json b/examples/angular-cli/package.json index 7a8f8b5e802b..39b85eb99dee 100644 --- a/examples/angular-cli/package.json +++ b/examples/angular-cli/package.json @@ -1,6 +1,6 @@ { "name": "angular-cli", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "private": true, "license": "MIT", "scripts": { @@ -29,7 +29,7 @@ "core-js": "^3.8.2", "rxjs": "^6.6.3", "sass": "^1.43.4", - "telejson": "^5.3.3", + "telejson": "^6.0.8", "zone.js": "^0.11.3" }, "devDependencies": { @@ -39,21 +39,21 @@ "@angular/compiler-cli": "^11.2.14", "@angular/elements": "^11.2.14", "@compodoc/compodoc": "^1.1.18", - "@storybook/addon-a11y": "6.5.0-beta.4", - "@storybook/addon-actions": "6.5.0-beta.4", - "@storybook/addon-backgrounds": "6.5.0-beta.4", - "@storybook/addon-controls": "6.5.0-beta.4", - "@storybook/addon-docs": "6.5.0-beta.4", - "@storybook/addon-interactions": "6.5.0-beta.4", - "@storybook/addon-jest": "6.5.0-beta.4", - "@storybook/addon-links": "6.5.0-beta.4", - "@storybook/addon-storyshots": "6.5.0-beta.4", - "@storybook/addon-storysource": "6.5.0-beta.4", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/angular": "6.5.0-beta.4", + "@storybook/addon-a11y": "6.5.0-rc.1", + "@storybook/addon-actions": "6.5.0-rc.1", + "@storybook/addon-backgrounds": "6.5.0-rc.1", + "@storybook/addon-controls": "6.5.0-rc.1", + "@storybook/addon-docs": "6.5.0-rc.1", + "@storybook/addon-interactions": "6.5.0-rc.1", + "@storybook/addon-jest": "6.5.0-rc.1", + "@storybook/addon-links": "6.5.0-rc.1", + "@storybook/addon-storyshots": "6.5.0-rc.1", + "@storybook/addon-storysource": "6.5.0-rc.1", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/angular": "6.5.0-rc.1", "@storybook/babel-plugin-require-context-hook": "1.0.1", "@storybook/jest": "^0.0.5", - "@storybook/source-loader": "6.5.0-beta.4", + "@storybook/source-loader": "6.5.0-rc.1", "@storybook/testing-library": "^0.0.7", "@types/core-js": "^2.5.4", "@types/jest": "^26.0.16", @@ -67,7 +67,7 @@ "jest": "^26.6.3", "jest-preset-angular": "^8.3.2", "protractor": "~7.0.0", - "sb": "6.5.0-beta.4", + "sb": "6.5.0-rc.1", "storybook-addon-angular-ivy": "^0.0.1", "ts-jest": "^26.4.4", "ts-node": "^9.1.0", diff --git a/examples/angular-cli/src/stories/basics/component-with-ng-on-destroy/component-with-on-destroy.stories.ts b/examples/angular-cli/src/stories/basics/component-with-ng-on-destroy/component-with-on-destroy.stories.ts index a66d9209ef3c..d883d872b973 100644 --- a/examples/angular-cli/src/stories/basics/component-with-ng-on-destroy/component-with-on-destroy.stories.ts +++ b/examples/angular-cli/src/stories/basics/component-with-ng-on-destroy/component-with-on-destroy.stories.ts @@ -4,7 +4,7 @@ import { Story, Meta } from '@storybook/angular'; @Component({ selector: 'on-destroy', template: `Current time: {{ time }}
- 📝 The current time in console should no longer display after a change of stroy`, + 📝 The current time in console should no longer display after a change of story`, }) class OnDestroyComponent implements OnInit, OnDestroy { time: string; diff --git a/examples/cra-kitchen-sink/.storybook/main.js b/examples/cra-kitchen-sink/.storybook/main.js index f4bc80a1b0b3..7bb866f3670c 100644 --- a/examples/cra-kitchen-sink/.storybook/main.js +++ b/examples/cra-kitchen-sink/.storybook/main.js @@ -29,7 +29,7 @@ module.exports = { }, core: { builder: 'webpack4', - disableTelemetry: true, + channelOptions: { allowFunction: false, maxDepth: 10 }, }, staticDirs: ['../public'], features: { diff --git a/examples/cra-kitchen-sink/package.json b/examples/cra-kitchen-sink/package.json index 7c1b0c088bcc..eba6a1d3e5b3 100644 --- a/examples/cra-kitchen-sink/package.json +++ b/examples/cra-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "cra-kitchen-sink", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "private": true, "scripts": { "build": "react-scripts build", @@ -11,7 +11,7 @@ "test": "react-scripts test --env=jsdom" }, "dependencies": { - "@storybook/client-logger": "6.5.0-beta.4", + "@storybook/client-logger": "6.5.0-rc.1", "global": "^4.4.0", "prop-types": "^15.7.2", "react": "16.14.0", @@ -21,20 +21,20 @@ }, "devDependencies": { "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@storybook/addon-a11y": "6.5.0-beta.4", - "@storybook/addon-actions": "6.5.0-beta.4", - "@storybook/addon-backgrounds": "6.5.0-beta.4", - "@storybook/addon-docs": "6.5.0-beta.4", + "@storybook/addon-a11y": "6.5.0-rc.1", + "@storybook/addon-actions": "6.5.0-rc.1", + "@storybook/addon-backgrounds": "6.5.0-rc.1", + "@storybook/addon-docs": "6.5.0-rc.1", "@storybook/addon-ie11": "0.0.7--canary.5e87b64.0", - "@storybook/addon-jest": "6.5.0-beta.4", - "@storybook/addon-links": "6.5.0-beta.4", - "@storybook/addon-storyshots": "6.5.0-beta.4", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/builder-webpack4": "6.5.0-beta.4", + "@storybook/addon-jest": "6.5.0-rc.1", + "@storybook/addon-links": "6.5.0-rc.1", + "@storybook/addon-storyshots": "6.5.0-rc.1", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/builder-webpack4": "6.5.0-rc.1", "@storybook/preset-create-react-app": "^3.1.6", - "@storybook/react": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", - "sb": "6.5.0-beta.4", + "@storybook/react": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", + "sb": "6.5.0-rc.1", "webpack": "4" }, "storybook": { diff --git a/examples/cra-react15/.storybook/main.js b/examples/cra-react15/.storybook/main.js index cea0ab29511e..dd99404e0d4a 100644 --- a/examples/cra-react15/.storybook/main.js +++ b/examples/cra-react15/.storybook/main.js @@ -20,6 +20,7 @@ module.exports = { }, core: { builder: 'webpack4', + channelOptions: { allowFunction: false, maxDepth: 10 }, disableTelemetry: true, }, staticDirs: ['../public'], diff --git a/examples/cra-react15/package.json b/examples/cra-react15/package.json index fed7357ee7db..546742555348 100644 --- a/examples/cra-react15/package.json +++ b/examples/cra-react15/package.json @@ -1,6 +1,6 @@ { "name": "cra-react15", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "private": true, "scripts": { "build": "react-scripts build", @@ -19,17 +19,17 @@ "react-scripts": "3.4.4" }, "devDependencies": { - "@storybook/addon-actions": "6.5.0-beta.4", + "@storybook/addon-actions": "6.5.0-rc.1", "@storybook/addon-ie11": "0.0.7--canary.5e87b64.0", - "@storybook/addon-links": "6.5.0-beta.4", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/builder-webpack4": "6.5.0-beta.4", + "@storybook/addon-links": "6.5.0-rc.1", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/builder-webpack4": "6.5.0-rc.1", "@storybook/preset-create-react-app": "^3.1.6", - "@storybook/react": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/react": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", "babel-core": "6", "babel-runtime": "6", - "sb": "6.5.0-beta.4", + "sb": "6.5.0-rc.1", "webpack": "4" }, "storybook": { diff --git a/examples/cra-ts-essentials/.storybook/main.ts b/examples/cra-ts-essentials/.storybook/main.ts index 5a45b686bf09..98ad3b01b049 100644 --- a/examples/cra-ts-essentials/.storybook/main.ts +++ b/examples/cra-ts-essentials/.storybook/main.ts @@ -26,6 +26,7 @@ const mainConfig: StorybookConfig = { }, core: { builder: 'webpack4', + channelOptions: { allowFunction: false, maxDepth: 10 }, disableTelemetry: true, }, staticDirs: ['../public'], diff --git a/examples/cra-ts-essentials/package.json b/examples/cra-ts-essentials/package.json index 7a87b51d4db7..3d1771a21256 100644 --- a/examples/cra-ts-essentials/package.json +++ b/examples/cra-ts-essentials/package.json @@ -1,6 +1,6 @@ { "name": "cra-ts-essentials", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "private": true, "scripts": { "build": "react-scripts build", @@ -23,8 +23,8 @@ ] }, "dependencies": { - "@storybook/components": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/components": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", "@types/jest": "^26.0.16", "@types/node": "^14.14.20 || ^16.0.0", "@types/react": "^16.14.23", @@ -37,14 +37,14 @@ "typescript": "^3.9.7" }, "devDependencies": { - "@storybook/addon-essentials": "6.5.0-beta.4", + "@storybook/addon-essentials": "6.5.0-rc.1", "@storybook/addon-ie11": "0.0.7--canary.5e87b64.0", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/builder-webpack4": "6.5.0-beta.4", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/builder-webpack4": "6.5.0-rc.1", "@storybook/preset-create-react-app": "^3.1.6", - "@storybook/react": "6.5.0-beta.4", + "@storybook/react": "6.5.0-rc.1", "@storybook/testing-library": "^0.0.9", - "sb": "6.5.0-beta.4", + "sb": "6.5.0-rc.1", "webpack": "4" }, "storybook": { diff --git a/examples/cra-ts-essentials/src/stories/testing-react/components/AccountForm.tsx b/examples/cra-ts-essentials/src/stories/testing-react/components/AccountForm.tsx index b646a174143b..22da93de5488 100644 --- a/examples/cra-ts-essentials/src/stories/testing-react/components/AccountForm.tsx +++ b/examples/cra-ts-essentials/src/stories/testing-react/components/AccountForm.tsx @@ -25,7 +25,7 @@ const errorMap = { password: { required: { normal: 'Please enter a password', - tooltip: 'A password is requried to create an account', + tooltip: 'A password is required to create an account', }, length: { normal: 'Please enter a password of minimum 6 characters', diff --git a/examples/cra-ts-kitchen-sink/.storybook/main.ts b/examples/cra-ts-kitchen-sink/.storybook/main.ts index b06621959dee..15539c982ae0 100644 --- a/examples/cra-ts-kitchen-sink/.storybook/main.ts +++ b/examples/cra-ts-kitchen-sink/.storybook/main.ts @@ -28,6 +28,7 @@ module.exports = { }, core: { builder: 'webpack4', + channelOptions: { allowFunction: false, maxDepth: 10 }, disableTelemetry: true, }, staticDirs: ['../public'], diff --git a/examples/cra-ts-kitchen-sink/package.json b/examples/cra-ts-kitchen-sink/package.json index c85fea94238d..8f01092b3b6d 100644 --- a/examples/cra-ts-kitchen-sink/package.json +++ b/examples/cra-ts-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "cra-ts-kitchen-sink", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "private": true, "scripts": { "build": "react-scripts build", @@ -34,22 +34,22 @@ "typescript": "^3.9.7" }, "devDependencies": { - "@storybook/addon-a11y": "6.5.0-beta.4", - "@storybook/addon-actions": "6.5.0-beta.4", - "@storybook/addon-docs": "6.5.0-beta.4", + "@storybook/addon-a11y": "6.5.0-rc.1", + "@storybook/addon-actions": "6.5.0-rc.1", + "@storybook/addon-docs": "6.5.0-rc.1", "@storybook/addon-ie11": "0.0.7--canary.5e87b64.0", - "@storybook/addon-links": "6.5.0-beta.4", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/builder-webpack4": "6.5.0-beta.4", + "@storybook/addon-links": "6.5.0-rc.1", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/builder-webpack4": "6.5.0-rc.1", "@storybook/preset-create-react-app": "^3.1.6", - "@storybook/react": "6.5.0-beta.4", + "@storybook/react": "6.5.0-rc.1", "@types/enzyme": "^3.10.8", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.9.1", "enzyme-to-json": "^3.6.1", "fork-ts-checker-webpack-plugin": "^6.0.4", "react-moment-proptypes": "^1.7.0", - "sb": "6.5.0-beta.4", + "sb": "6.5.0-rc.1", "ts-node": "^9.1.0", "webpack": "4" }, diff --git a/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/prop-types.js b/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/prop-types.js index 193a37ac82a2..ffc88c53c5ab 100644 --- a/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/prop-types.js +++ b/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/prop-types.js @@ -215,7 +215,7 @@ PropTypesProps.propTypes = { oneOfComponents: PropTypes.oneOf([FunctionalComponent, ClassComponent]), oneOfEval: PropTypes.oneOf((() => ['News', 'Photos'])()), oneOfVar: PropTypes.oneOf(POSITIONS), - oneOfNested: PropTypes.oneOf(['News', ['bottom-left', 'botton-center', 'bottom-right']]), + oneOfNested: PropTypes.oneOf(['News', ['bottom-left', 'bottom-center', 'bottom-right']]), oneOfNestedSimpleInlineObject: PropTypes.oneOf(['News', [{ foo: PropTypes.string }]]), oneOfNestedComplexInlineObject: PropTypes.oneOf([ 'News', diff --git a/examples/ember-cli/.storybook/main.js b/examples/ember-cli/.storybook/main.js index 2a05b1eb5a14..93dbb7a5ad12 100644 --- a/examples/ember-cli/.storybook/main.js +++ b/examples/ember-cli/.storybook/main.js @@ -29,6 +29,7 @@ module.exports = { }, core: { builder: 'webpack4', + channelOptions: { allowFunction: false, maxDepth: 10 }, disableTelemetry: true, }, staticDirs: ['../ember-output'], diff --git a/examples/ember-cli/package.json b/examples/ember-cli/package.json index 9e1339e19fcd..099c5eb248d6 100644 --- a/examples/ember-cli/package.json +++ b/examples/ember-cli/package.json @@ -1,6 +1,6 @@ { "name": "ember-example", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "private": true, "scripts": { "build": "ember build --output-path ember-output", @@ -17,18 +17,18 @@ "devDependencies": { "@babel/core": "^7.12.10", "@ember/optional-features": "^2.0.0", - "@storybook/addon-a11y": "6.5.0-beta.4", - "@storybook/addon-actions": "6.5.0-beta.4", - "@storybook/addon-backgrounds": "6.5.0-beta.4", - "@storybook/addon-controls": "6.5.0-beta.4", - "@storybook/addon-docs": "6.5.0-beta.4", - "@storybook/addon-links": "6.5.0-beta.4", - "@storybook/addon-storysource": "6.5.0-beta.4", - "@storybook/addon-viewport": "6.5.0-beta.4", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/ember": "6.5.0-beta.4", + "@storybook/addon-a11y": "6.5.0-rc.1", + "@storybook/addon-actions": "6.5.0-rc.1", + "@storybook/addon-backgrounds": "6.5.0-rc.1", + "@storybook/addon-controls": "6.5.0-rc.1", + "@storybook/addon-docs": "6.5.0-rc.1", + "@storybook/addon-links": "6.5.0-rc.1", + "@storybook/addon-storysource": "6.5.0-rc.1", + "@storybook/addon-viewport": "6.5.0-rc.1", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/ember": "6.5.0-rc.1", "@storybook/ember-cli-storybook": "^0.2.1", - "@storybook/source-loader": "6.5.0-beta.4", + "@storybook/source-loader": "6.5.0-rc.1", "babel-loader": "^8.0.0", "broccoli-asset-rev": "^3.0.0", "cross-env": "^7.0.3", @@ -45,7 +45,7 @@ "ember-resolver": "^7.0.0", "ember-source": "~3.24.0", "loader.js": "^4.7.0", - "sb": "6.5.0-beta.4", + "sb": "6.5.0-rc.1", "shx": "^0.3.2", "webpack": "4", "webpack-cli": "^4.2.0" diff --git a/examples/external-docs/README.md b/examples/external-docs/README.md index 5fe025e663f0..3c5d68643a72 100644 --- a/examples/external-docs/README.md +++ b/examples/external-docs/README.md @@ -1,3 +1,3 @@ # Storybook External Docs Example -This example demostrates using Stories in an app built outside of SB's build process. +This example demonstrates using Stories in an app built outside of SB's build process. diff --git a/examples/external-docs/package.json b/examples/external-docs/package.json index fc0c112c83f1..c713762a75ca 100644 --- a/examples/external-docs/package.json +++ b/examples/external-docs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/external-docs", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "private": true, "scripts": { "build-storybook": "cross-env STORYBOOK_DISPLAY_WARNING=true DISPLAY_WARNING=true sb build -c ./src/.storybook", @@ -9,13 +9,13 @@ "storybook": "cross-env STORYBOOK_DISPLAY_WARNING=true DISPLAY_WARNING=true sb dev -p 9011 --no-manager-cache -c ./src/.storybook" }, "dependencies": { - "@storybook/addon-essentials": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", + "@storybook/addon-essentials": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/preview-web": "6.5.0-beta.4", - "@storybook/react": "6.5.0-beta.4", - "@storybook/store": "6.5.0-beta.4", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/preview-web": "6.5.0-rc.1", + "@storybook/react": "6.5.0-rc.1", + "@storybook/store": "6.5.0-rc.1", + "@storybook/theming": "6.5.0-rc.1", "formik": "^2.2.9", "prop-types": "15.7.2", "react": "16.14.0", @@ -32,7 +32,7 @@ "@types/react": "^16.14.23", "@types/react-dom": "^16.9.14", "cross-env": "^7.0.3", - "sb": "6.5.0-beta.4", + "sb": "6.5.0-rc.1", "typescript": "^3.9.7", "webpack": "4" } diff --git a/examples/external-docs/src/components/AccountForm.tsx b/examples/external-docs/src/components/AccountForm.tsx index d5e612931ac7..7872ce2e44d6 100644 --- a/examples/external-docs/src/components/AccountForm.tsx +++ b/examples/external-docs/src/components/AccountForm.tsx @@ -25,7 +25,7 @@ const errorMap = { password: { required: { normal: 'Please enter a password', - tooltip: 'A password is requried to create an account', + tooltip: 'A password is required to create an account', }, length: { normal: 'Please enter a password of minimum 6 characters', diff --git a/examples/html-kitchen-sink/.storybook/main.js b/examples/html-kitchen-sink/.storybook/main.js index d61a39d10997..7d314405352d 100644 --- a/examples/html-kitchen-sink/.storybook/main.js +++ b/examples/html-kitchen-sink/.storybook/main.js @@ -23,6 +23,7 @@ module.exports = { ], core: { builder: 'webpack4', + channelOptions: { allowFunction: false, maxDepth: 10 }, disableTelemetry: true, }, features: { diff --git a/examples/html-kitchen-sink/package.json b/examples/html-kitchen-sink/package.json index 9f740f221992..11702b0da3f8 100644 --- a/examples/html-kitchen-sink/package.json +++ b/examples/html-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "html-kitchen-sink", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "private": true, "description": "", "keywords": [], @@ -13,29 +13,29 @@ "storybook": "sb dev -p 9006 --no-manager-cache" }, "devDependencies": { - "@storybook/addon-a11y": "6.5.0-beta.4", - "@storybook/addon-actions": "6.5.0-beta.4", - "@storybook/addon-backgrounds": "6.5.0-beta.4", - "@storybook/addon-controls": "6.5.0-beta.4", - "@storybook/addon-docs": "6.5.0-beta.4", - "@storybook/addon-jest": "6.5.0-beta.4", - "@storybook/addon-links": "6.5.0-beta.4", + "@storybook/addon-a11y": "6.5.0-rc.1", + "@storybook/addon-actions": "6.5.0-rc.1", + "@storybook/addon-backgrounds": "6.5.0-rc.1", + "@storybook/addon-controls": "6.5.0-rc.1", + "@storybook/addon-docs": "6.5.0-rc.1", + "@storybook/addon-jest": "6.5.0-rc.1", + "@storybook/addon-links": "6.5.0-rc.1", "@storybook/addon-postcss": "^2.0.0", - "@storybook/addon-storyshots": "6.5.0-beta.4", - "@storybook/addon-storysource": "6.5.0-beta.4", - "@storybook/addon-viewport": "6.5.0-beta.4", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/client-api": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", - "@storybook/html": "6.5.0-beta.4", - "@storybook/source-loader": "6.5.0-beta.4", + "@storybook/addon-storyshots": "6.5.0-rc.1", + "@storybook/addon-storysource": "6.5.0-rc.1", + "@storybook/addon-viewport": "6.5.0-rc.1", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/client-api": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", + "@storybook/html": "6.5.0-rc.1", + "@storybook/source-loader": "6.5.0-rc.1", "autoprefixer": "^10.0.1", "eventemitter3": "^4.0.7", "format-json": "^1.0.3", "global": "^4.4.0", "postcss": "^8.2.4", "postcss-color-rebeccapurple": "^6.0.0", - "sb": "6.5.0-beta.4" + "sb": "6.5.0-rc.1" }, "storybook": { "chromatic": { diff --git a/examples/official-storybook/main.ts b/examples/official-storybook/main.ts index 9f3cb8898af7..d2ab3f9bae7c 100644 --- a/examples/official-storybook/main.ts +++ b/examples/official-storybook/main.ts @@ -3,6 +3,10 @@ import type { StorybookConfig } from '@storybook/react/types'; const config: StorybookConfig = { stories: [ + { + directory: './stories/title', + titlePrefix: 'Custom Prefix', + }, // FIXME: Breaks e2e tests './intro.stories.mdx', '../../lib/ui/src/**/*.stories.@(js|tsx|mdx)', '../../lib/components/src/**/*.stories.@(js|tsx|mdx)', @@ -29,6 +33,7 @@ const config: StorybookConfig = { ], core: { builder: 'webpack4', + channelOptions: { allowFunction: false, maxDepth: 10 }, disableTelemetry: true, }, logLevel: 'debug', diff --git a/examples/official-storybook/package.json b/examples/official-storybook/package.json index b344eae36af8..433a7eb481d6 100644 --- a/examples/official-storybook/package.json +++ b/examples/official-storybook/package.json @@ -1,6 +1,6 @@ { "name": "official-storybook", - "version": "6.5.0-beta.4", + "version": "6.5.0-rc.1", "private": true, "scripts": { "build-storybook": "cross-env STORYBOOK_DISPLAY_WARNING=true DISPLAY_WARNING=true sb build -c ./", @@ -13,31 +13,31 @@ "devDependencies": { "@emotion/jest": "^11.8.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@storybook/addon-a11y": "6.5.0-beta.4", - "@storybook/addon-actions": "6.5.0-beta.4", - "@storybook/addon-backgrounds": "6.5.0-beta.4", - "@storybook/addon-controls": "6.5.0-beta.4", - "@storybook/addon-docs": "6.5.0-beta.4", - "@storybook/addon-interactions": "6.5.0-beta.4", - "@storybook/addon-jest": "6.5.0-beta.4", - "@storybook/addon-links": "6.5.0-beta.4", - "@storybook/addon-storyshots": "6.5.0-beta.4", - "@storybook/addon-storyshots-puppeteer": "6.5.0-beta.4", - "@storybook/addon-storysource": "6.5.0-beta.4", - "@storybook/addon-toolbars": "6.5.0-beta.4", - "@storybook/addon-viewport": "6.5.0-beta.4", - "@storybook/addons": "6.5.0-beta.4", - "@storybook/cli": "6.5.0-beta.4", - "@storybook/components": "6.5.0-beta.4", - "@storybook/core-events": "6.5.0-beta.4", + "@storybook/addon-a11y": "6.5.0-rc.1", + "@storybook/addon-actions": "6.5.0-rc.1", + "@storybook/addon-backgrounds": "6.5.0-rc.1", + "@storybook/addon-controls": "6.5.0-rc.1", + "@storybook/addon-docs": "6.5.0-rc.1", + "@storybook/addon-interactions": "6.5.0-rc.1", + "@storybook/addon-jest": "6.5.0-rc.1", + "@storybook/addon-links": "6.5.0-rc.1", + "@storybook/addon-storyshots": "6.5.0-rc.1", + "@storybook/addon-storyshots-puppeteer": "6.5.0-rc.1", + "@storybook/addon-storysource": "6.5.0-rc.1", + "@storybook/addon-toolbars": "6.5.0-rc.1", + "@storybook/addon-viewport": "6.5.0-rc.1", + "@storybook/addons": "6.5.0-rc.1", + "@storybook/cli": "6.5.0-rc.1", + "@storybook/components": "6.5.0-rc.1", + "@storybook/core-events": "6.5.0-rc.1", "@storybook/design-system": "^5.4.7", "@storybook/jest": "^0.0.5", - "@storybook/node-logger": "6.5.0-beta.4", - "@storybook/react": "6.5.0-beta.4", - "@storybook/router": "6.5.0-beta.4", - "@storybook/source-loader": "6.5.0-beta.4", + "@storybook/node-logger": "6.5.0-rc.1", + "@storybook/react": "6.5.0-rc.1", + "@storybook/router": "6.5.0-rc.1", + "@storybook/source-loader": "6.5.0-rc.1", "@storybook/testing-library": "^0.0.7", - "@storybook/theming": "6.5.0-beta.4", + "@storybook/theming": "6.5.0-rc.1", "@testing-library/dom": "^7.31.2", "@testing-library/user-event": "^13.1.9", "chromatic": "^6.0.2", @@ -53,7 +53,7 @@ "prop-types": "^15.7.2", "react": "16.14.0", "react-dom": "16.14.0", - "sb": "6.5.0-beta.4", + "sb": "6.5.0-rc.1", "terser-webpack-plugin": "^5.0.3", "uuid-browser": "^3.1.0", "webpack": "4" diff --git a/examples/official-storybook/stories/core/args.stories.js b/examples/official-storybook/stories/core/args.stories.js index 1a1bb9ee72a1..4ee37b44f996 100644 --- a/examples/official-storybook/stories/core/args.stories.js +++ b/examples/official-storybook/stories/core/args.stories.js @@ -64,3 +64,23 @@ DifferentSet.args = { foo: 'bar', bar: 2, }; + +export const TestUndefinedArgs = Template.bind({}); +TestUndefinedArgs.args = { + first: 'Bob', + last: 'Miller', + foo: 'bar', +}; +TestUndefinedArgs.argTypes = { + first: { + control: { type: 'select' }, + options: ['Bob', 'Alice'], + }, + last: { + control: { type: 'select' }, + options: ['Miller', 'Meyer'], + }, + foo: { + control: { type: 'text' }, + }, +}; diff --git a/examples/official-storybook/stories/title/AutoTitle.stories.js b/examples/official-storybook/stories/title/AutoTitle.stories.js new file mode 100644 index 000000000000..125c1157c1c1 --- /dev/null +++ b/examples/official-storybook/stories/title/AutoTitle.stories.js @@ -0,0 +1,12 @@ +import React from 'react'; +import { Form } from '@storybook/components'; + +const { Button } = Form; + +export default { + // Title not needed due to CSF3 auto-title + // title: 'AutoTitle', + component: Button, +}; + +export const Basic = () => `; -exports[`Storyshots Docs/ButtonMdx Controls 1`] = ` +exports[`Storyshots Demo/Examples / Button CSF 2 Story With Play 1`] = ` `; -exports[`Storyshots Examples / Button Basic 1`] = ` +exports[`Storyshots Demo/Examples / Button Process Env 1`] = ` `; -exports[`Storyshots Examples / Button CSF 2 Story With Play 1`] = ` +exports[`Storyshots Demo/Examples / Button Story No Render 1`] = ` `; -exports[`Storyshots Examples / Button Process Env 1`] = ` +exports[`Storyshots Demo/Examples / Button Story Object 1`] = `"hahaha"`; + +exports[`Storyshots Demo/Examples / Button Story With Play 1`] = ` `; -exports[`Storyshots Examples / Button Story No Render 1`] = ` +exports[`Storyshots Demo/Examples / Button With Args 1`] = ` `; -exports[`Storyshots Examples / Button Story Object 1`] = `"hahaha"`; - -exports[`Storyshots Examples / Button Story With Play 1`] = ` +exports[`Storyshots Demo/Examples / Emoji Button Basic 1`] = ` `; -exports[`Storyshots Examples / Button With Args 1`] = ` +exports[`Storyshots Demo/Examples / Emoji Button With Args 1`] = ` `; -exports[`Storyshots Examples / Emoji Button Basic 1`] = ` +exports[`Storyshots Docs/ButtonMdx Basic 1`] = ` `; -exports[`Storyshots Examples / Emoji Button With Args 1`] = ` +exports[`Storyshots Docs/ButtonMdx Controls 1`] = ` `; diff --git a/examples/react-ts/src/title/AutoTitle.stories.js b/examples/react-ts/src/title/AutoTitle.stories.js new file mode 100644 index 000000000000..125c1157c1c1 --- /dev/null +++ b/examples/react-ts/src/title/AutoTitle.stories.js @@ -0,0 +1,12 @@ +import React from 'react'; +import { Form } from '@storybook/components'; + +const { Button } = Form; + +export default { + // Title not needed due to CSF3 auto-title + // title: 'AutoTitle', + component: Button, +}; + +export const Basic = () =>