Merge remote-tracking branch 'origin/next' into typescript-assets

# Conflicts:
#	code/frameworks/nextjs/template/cli/ts-3-8/Introduction.mdx
#	code/frameworks/nextjs/template/cli/ts-3-8/Introduction.stories.mdx
#	code/frameworks/nextjs/template/cli/ts-legacy/Introduction.stories.mdx
This commit is contained in:
Ian VanSchooten 2023-02-13 09:29:29 -05:00
commit 84afa441e7
186 changed files with 4088 additions and 2379 deletions

View File

@ -599,23 +599,23 @@ workflows:
requires:
- build
- create-sandboxes:
parallelism: 15
parallelism: 18
requires:
- build
- build-sandboxes:
parallelism: 15
parallelism: 18
requires:
- create-sandboxes
- test-runner-sandboxes:
parallelism: 15
parallelism: 18
requires:
- build-sandboxes
- chromatic-sandboxes:
parallelism: 15
parallelism: 18
requires:
- build-sandboxes
- e2e-sandboxes:
parallelism: 15
parallelism: 18
requires:
- build-sandboxes
daily:
@ -630,25 +630,25 @@ workflows:
requires:
- build
- create-sandboxes:
parallelism: 27
parallelism: 31
requires:
- build
# - smoke-test-sandboxes: # disabled for now
# requires:
# - create-sandboxes
- build-sandboxes:
parallelism: 27
parallelism: 31
requires:
- create-sandboxes
- test-runner-sandboxes:
parallelism: 27
parallelism: 31
requires:
- build-sandboxes
- chromatic-sandboxes:
parallelism: 27
parallelism: 31
requires:
- build-sandboxes
- e2e-sandboxes:
parallelism: 27
parallelism: 31
requires:
- build-sandboxes

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

807
.yarn/releases/yarn-3.3.0.cjs generated vendored

File diff suppressed because one or more lines are too long

873
.yarn/releases/yarn-3.4.1.cjs generated vendored Executable file

File diff suppressed because one or more lines are too long

View File

@ -2,4 +2,4 @@ installStatePath: ./.yarn/root-install-state.gz
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-3.3.0.cjs
yarnPath: .yarn/releases/yarn-3.4.1.cjs

View File

@ -1,3 +1,69 @@
## 7.0.0-beta.46 (February 10, 2023)
#### Features
- CLI: Add Solid integration [#20991](https://github.com/storybooks/storybook/pull/20991)
- Viewport: Add `defaultOrientation` parameter [#21048](https://github.com/storybooks/storybook/pull/21048)
#### Bug Fixes
- CLI: Account for pnp when creating main.js in `storybook init` [#21049](https://github.com/storybooks/storybook/pull/21049)
- Core: Detect mdx2 errors and provide guidance to fix them [#20917](https://github.com/storybooks/storybook/pull/20917)
- Angular: provideHttpClient when HttpClientModule is present in the imports array [#21028](https://github.com/storybooks/storybook/pull/21028)
#### Build
- Build: Allow `stories` folder to be served by vite sandboxes [#21022](https://github.com/storybooks/storybook/pull/21022)
## 7.0.0-beta.45 (February 9, 2023)
#### Features
- UI: Menu design upgrade [#20898](https://github.com/storybooks/storybook/pull/20898)
#### Bug Fixes
- Vite: Use posix paths for glob [#21013](https://github.com/storybooks/storybook/pull/21013)
#### Maintenance
- Telemetry: Hash error messages [#20990](https://github.com/storybooks/storybook/pull/20990)
## 7.0.0-beta.44 (February 7, 2023)
#### Features
- Feature: Add woff2 support for builder-manager [#20962](https://github.com/storybooks/storybook/pull/20962)
- Feature: Add super early node version check [#20964](https://github.com/storybooks/storybook/pull/20964)
- Csf-tools: Add `satisfies` support to ConfigFile [#20936](https://github.com/storybooks/storybook/pull/20936)
#### Bug Fixes
- Angular: Fix changeDetectorRef should be defined [#20984](https://github.com/storybooks/storybook/pull/20984)
- Angular: Fix standalone components to be included in the imports array [#20983](https://github.com/storybooks/storybook/pull/20983)
- CLI: Fix Introduction MDX for Next.js and Typescript [#20798](https://github.com/storybooks/storybook/pull/20798)
- CLI: Fix detection of JS projects with type checking [#20944](https://github.com/storybooks/storybook/pull/20944)
- UI: Fix fonts missing/warnings [#20957](https://github.com/storybooks/storybook/pull/20957)
- Core: Undo AST main.js check in validateConfigFile [#20952](https://github.com/storybooks/storybook/pull/20952)
- Csf-tools: Fix error handling for storySort variable references [#20930](https://github.com/storybooks/storybook/pull/20930)
#### Maintenance
- Core: Fix missing dependency for core-server [#20989](https://github.com/storybooks/storybook/pull/20989)
- CLI: Add a default background to newly initialized storybooks [#20982](https://github.com/storybooks/storybook/pull/20982)
- Svelte/Vite: Remove `svelte-options` [#20942](https://github.com/storybooks/storybook/pull/20942)
- Vite: Correctly preserve existing vite envPrefix config [#20918](https://github.com/storybooks/storybook/pull/20918)
#### Dependencies
- Deps: Upgrade glob-promise [#20959](https://github.com/storybooks/storybook/pull/20959)
- Deps: Update glob for storyshots [#20954](https://github.com/storybooks/storybook/pull/20954)
#### Build
- Build: upgrade yarn [#20986](https://github.com/storybooks/storybook/pull/20986)
- Build: add more sandboxes to CI tests [#20892](https://github.com/storybooks/storybook/pull/20892)
## 7.0.0-beta.43 (February 4, 2023)
#### Bug Fixes

View File

@ -995,7 +995,7 @@ import * as ComponentStories from './some-component.stories';
##### ArgsTable block
The `ArgsTable` block is now deprecated, and two new blocks: `ArgsTypes` and `Controls` should be preferred.
The `ArgsTable` block is now deprecated, and two new blocks: `ArgTypes` and `Controls` should be preferred.
- `<ArgTypes of={storyExports OR metaExports OR component} />` will render a readonly table of args/props descriptions for a story, CSF file or component. If `of` ommitted and the MDX file is attached it will render the arg types defined at the CSF file level.

View File

@ -27,5 +27,5 @@ plugins:
unsafeHttpWhitelist:
- localhost
yarnPath: ../.yarn/releases/yarn-3.3.0.cjs
yarnPath: ../.yarn/releases/yarn-3.4.1.cjs
installStatePath: '../.yarn/code-install-state.gz'

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-a11y",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Test component compliance with web accessibility standards",
"keywords": [
"a11y",
@ -63,16 +63,16 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/addon-highlight": "7.0.0-beta.43",
"@storybook/channels": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/addon-highlight": "7.0.0-beta.46",
"@storybook/channels": "7.0.0-beta.46",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"axe-core": "^4.2.0",
"lodash": "^4.17.21",
"react-resize-detector": "^7.1.2"
@ -104,7 +104,7 @@
"./src/preview.tsx"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Accessibility",
"icon": "https://user-images.githubusercontent.com/263385/101991665-47042f80-3c7c-11eb-8f00-64b5a18f498a.png",

View File

@ -133,7 +133,6 @@ export const VisionSimulator = () => {
)}
<WithTooltip
placement="top"
trigger="click"
tooltip={({ onHide }) => {
const colorList = getColorList(filter, (i) => {
setFilter(i);

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-actions",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Get UI feedback when an action is performed on an interactive element",
"keywords": [
"storybook",
@ -77,14 +77,14 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
"polished": "^4.2.2",
@ -121,7 +121,7 @@
"./src/preview.ts"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Actions",
"unsupportedFrameworks": [

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-backgrounds",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Switch backgrounds to view components in different settings",
"keywords": [
"addon",
@ -76,14 +76,14 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"memoizerific": "^1.11.3",
"ts-dedent": "^2.0.0"
},
@ -112,7 +112,7 @@
"./src/preview.tsx"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Backgrounds",
"icon": "https://user-images.githubusercontent.com/263385/101991667-479cc600-3c7c-11eb-96d3-410e936252e7.png",

View File

@ -116,7 +116,6 @@ export const BackgroundSelector: FC = memo(function BackgroundSelector() {
<Fragment>
<WithTooltip
placement="top"
trigger="click"
closeOnOutsideClick
tooltip={({ onHide }) => {
return (

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-controls",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Interact with component inputs dynamically in the Storybook UI",
"keywords": [
"addon",
@ -68,15 +68,15 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/blocks": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/blocks": "7.0.0-beta.46",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"lodash": "^4.17.21",
"ts-dedent": "^2.0.0"
},
@ -102,7 +102,7 @@
],
"platform": "browser"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Controls",
"icon": "https://user-images.githubusercontent.com/263385/101991669-479cc600-3c7c-11eb-93d9-38b67e8371f2.png",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-docs",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Document component usage and properties in Markdown",
"keywords": [
"addon",
@ -103,18 +103,18 @@
"@babel/plugin-transform-react-jsx": "^7.19.0",
"@jest/transform": "^29.3.1",
"@mdx-js/react": "^2.1.5",
"@storybook/blocks": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/csf-plugin": "7.0.0-beta.43",
"@storybook/csf-tools": "7.0.0-beta.43",
"@storybook/blocks": "7.0.0-beta.46",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/csf-plugin": "7.0.0-beta.46",
"@storybook/csf-tools": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/mdx2-csf": "next",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/postinstall": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/postinstall": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"fs-extra": "^11.1.0",
"remark-external-links": "^8.0.0",
"remark-slug": "^6.0.0",
@ -147,7 +147,7 @@
"./src/shims/mdx-react-shim.ts"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Docs",
"icon": "https://user-images.githubusercontent.com/263385/101991672-48355c80-3c7c-11eb-82d9-95fa12438f64.png",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-essentials",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Curated addons to bring out the best of Storybook",
"keywords": [
"addon",
@ -119,23 +119,23 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/addon-actions": "7.0.0-beta.43",
"@storybook/addon-backgrounds": "7.0.0-beta.43",
"@storybook/addon-controls": "7.0.0-beta.43",
"@storybook/addon-docs": "7.0.0-beta.43",
"@storybook/addon-highlight": "7.0.0-beta.43",
"@storybook/addon-measure": "7.0.0-beta.43",
"@storybook/addon-outline": "7.0.0-beta.43",
"@storybook/addon-toolbars": "7.0.0-beta.43",
"@storybook/addon-viewport": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/addon-actions": "7.0.0-beta.46",
"@storybook/addon-backgrounds": "7.0.0-beta.46",
"@storybook/addon-controls": "7.0.0-beta.46",
"@storybook/addon-docs": "7.0.0-beta.46",
"@storybook/addon-highlight": "7.0.0-beta.46",
"@storybook/addon-measure": "7.0.0-beta.46",
"@storybook/addon-outline": "7.0.0-beta.46",
"@storybook/addon-toolbars": "7.0.0-beta.46",
"@storybook/addon-viewport": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"ts-dedent": "^2.0.0"
},
"devDependencies": {
"@storybook/vue": "7.0.0-beta.43",
"@storybook/vue": "7.0.0-beta.46",
"typescript": "^4.9.3"
},
"peerDependencies": {
@ -166,5 +166,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-highlight",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Highlight DOM nodes within your stories",
"keywords": [
"storybook-addons",
@ -61,9 +61,9 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/preview-api": "7.0.0-beta.43"
"@storybook/preview-api": "7.0.0-beta.46"
},
"devDependencies": {
"@types/webpack-env": "^1.16.0",
@ -78,7 +78,7 @@
"./src/preview.ts"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"sbmodern": "dist/modern/index.js",
"storybook": {
"displayName": "Highlight",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-interactions",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Automate, test and debug user interactions",
"keywords": [
"storybook-addons",
@ -72,16 +72,16 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/instrumenter": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/instrumenter": "7.0.0-beta.46",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"jest-mock": "^27.0.6",
"polished": "^4.2.2",
"ts-dedent": "^2.2.0"
@ -118,7 +118,7 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Interactions",
"unsupportedFrameworks": [

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-jest",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "React storybook addon that show component jest report",
"keywords": [
"addon",
@ -70,13 +70,13 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46",
"react-resize-detector": "^7.1.2",
"upath": "^1.2.0"
},
@ -105,7 +105,7 @@
],
"platform": "browser"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Jest",
"icon": "https://pbs.twimg.com/profile_images/821713465245102080/mMtKIMax_400x400.jpg",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-links",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Link stories together to build demos and prototypes with your UI components",
"keywords": [
"addon",
@ -80,14 +80,14 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/csf": "next",
"@storybook/global": "^5.0.0",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/router": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/router": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"prop-types": "^15.7.2",
"ts-dedent": "^2.0.0"
},
@ -119,7 +119,7 @@
],
"post": "./scripts/fix-preview-api-reference.ts"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Links",
"icon": "https://user-images.githubusercontent.com/263385/101991673-48355c80-3c7c-11eb-9b6e-b627c96a75f6.png",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-measure",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Inspect layouts by visualizing the box model",
"keywords": [
"storybook-addons",
@ -75,13 +75,13 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43"
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46"
},
"devDependencies": {
"typescript": "~4.9.3"
@ -108,7 +108,7 @@
"./src/preview.tsx"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Measure",
"unsupportedFrameworks": [

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-outline",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Outline all elements with CSS to help with layout placement and alignment",
"keywords": [
"storybook-addons",
@ -78,13 +78,13 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"ts-dedent": "^2.0.0"
},
"devDependencies": {
@ -112,7 +112,7 @@
"./src/preview.tsx"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Outline",
"unsupportedFrameworks": [

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-storyshots",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Take a code snapshot of every story automatically with Jest",
"keywords": [
"addon",
@ -37,12 +37,12 @@
"dependencies": {
"@jest/transform": "^29.3.1",
"@storybook/babel-plugin-require-context-hook": "1.0.1",
"@storybook/client-api": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/core-webpack": "7.0.0-beta.43",
"@storybook/client-api": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/core-webpack": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"@types/glob": "^7.1.3",
"@types/jest-specific-snapshot": "^0.5.6",
"glob": "^8.1.0",
@ -57,11 +57,11 @@
"@angular/core": "^13.3.6",
"@angular/platform-browser-dynamic": "^13.3.6",
"@emotion/jest": "^11.8.0",
"@storybook/addon-docs": "7.0.0-beta.43",
"@storybook/angular": "7.0.0-beta.43",
"@storybook/react": "7.0.0-beta.43",
"@storybook/vue": "7.0.0-beta.43",
"@storybook/vue3": "7.0.0-beta.43",
"@storybook/addon-docs": "7.0.0-beta.46",
"@storybook/angular": "7.0.0-beta.46",
"@storybook/react": "7.0.0-beta.46",
"@storybook/vue": "7.0.0-beta.46",
"@storybook/vue3": "7.0.0-beta.46",
"babel-loader": "^9.1.2",
"enzyme": "^3.11.0",
"enzyme-adapter-react-16": "^1.15.5",
@ -142,7 +142,7 @@
"access": "public"
},
"bundler": {},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Storyshots",
"icon": "https://user-images.githubusercontent.com/263385/101991676-48cdf300-3c7c-11eb-8aa1-944dab6ab29b.png",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-storyshots-puppeteer",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Image snapshots addition to StoryShots based on puppeteer",
"keywords": [
"addon",
@ -36,8 +36,8 @@
"dependencies": {
"@axe-core/puppeteer": "^4.2.0",
"@storybook/csf": "next",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"@types/jest-image-snapshot": "^5.1.0",
"jest-image-snapshot": "^6.0.0"
},
@ -49,7 +49,7 @@
"rimraf": "^3.0.2"
},
"peerDependencies": {
"@storybook/addon-storyshots": "7.0.0-beta.43",
"@storybook/addon-storyshots": "7.0.0-beta.46",
"puppeteer": ">=2.0.0"
},
"peerDependenciesMeta": {
@ -61,5 +61,5 @@
"access": "public"
},
"bundler": {},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-storysource",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "View a storys source code to see how it works and paste into your app",
"keywords": [
"addon",
@ -54,13 +54,13 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/router": "7.0.0-beta.43",
"@storybook/source-loader": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/router": "7.0.0-beta.46",
"@storybook/source-loader": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46",
"estraverse": "^5.2.0",
"prop-types": "^15.7.2",
"react-syntax-highlighter": "^15.5.0"
@ -92,7 +92,7 @@
"./src/preset.ts"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Storysource",
"icon": "https://user-images.githubusercontent.com/263385/101991675-48cdf300-3c7c-11eb-9400-58de5ac6daa7.png",

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-toolbars",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Create your own toolbar items that control story rendering",
"keywords": [
"addon",
@ -68,11 +68,11 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43"
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46"
},
"devDependencies": {
"typescript": "~4.9.3"
@ -99,7 +99,7 @@
],
"platform": "browser"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Toolbars",
"icon": "https://user-images.githubusercontent.com/263385/101991677-48cdf300-3c7c-11eb-93b4-19b0e3366959.png",

View File

@ -57,7 +57,6 @@ export const ToolbarMenuList: FC<ToolbarMenuListProps> = withKeyboardCycle(
return (
<WithTooltip
placement="top"
trigger="click"
tooltip={({ onHide }) => {
const links = items
// Special case handling for various "type" variants

View File

@ -1,18 +1,9 @@
import type { ReactNode } from 'react';
import React from 'react';
import type { TooltipLinkListLink } from '@storybook/components';
import { Icons } from '@storybook/components';
import type { ToolbarItem } from '../types';
interface ListItem {
id: string;
left?: ReactNode;
title?: ReactNode;
right?: ReactNode;
active?: boolean;
onClick?: () => void;
}
type ToolbarMenuListItemProps = {
export type ToolbarMenuListItemProps = {
currentValue: string;
onClick: () => void;
} & ToolbarItem;
@ -28,34 +19,18 @@ export const ToolbarMenuListItem = ({
currentValue,
}: ToolbarMenuListItemProps) => {
const Icon = icon && <Icons style={{ opacity: 1 }} icon={icon} />;
const hasContent = left || right || title;
const Item: ListItem = {
const Item: TooltipLinkListLink = {
id: value || currentValue,
active: currentValue === value,
right,
title,
left,
onClick,
};
if (left) {
Item.left = left;
}
if (right) {
Item.right = right;
}
if (title) {
Item.title = title;
}
if (icon && !hideIcon) {
if (hasContent && !right) {
Item.right = Icon;
} else if (hasContent && !left) {
Item.left = Icon;
} else if (!hasContent) {
Item.right = Icon;
}
Item.left = Icon;
}
return Item;

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addon-viewport",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Build responsive components by adjusting Storybooks viewport size and orientation",
"keywords": [
"addon",
@ -73,13 +73,13 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46",
"memoizerific": "^1.11.3",
"prop-types": "^15.7.2"
},
@ -109,7 +109,7 @@
"./src/preview.ts"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02",
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed",
"storybook": {
"displayName": "Viewport",
"icon": "https://user-images.githubusercontent.com/263385/101991678-48cdf300-3c7c-11eb-9764-f8af293c1b28.png",

View File

@ -127,12 +127,13 @@ export const ViewportTool: FC = memo(
withTheme(({ theme }: { theme: Theme }) => {
const {
viewports = MINIMAL_VIEWPORTS,
defaultOrientation = 'portrait',
defaultViewport = responsiveViewport.id,
disable,
} = useParameter<ViewportAddonParameter>(PARAM_KEY, {});
const [state, setState] = useAddonState<ViewportToolState>(ADDON_ID, {
selected: defaultViewport,
isRotated: false,
isRotated: defaultOrientation === 'landscape',
});
const list = toList(viewports);
@ -180,7 +181,6 @@ export const ViewportTool: FC = memo(
<Fragment>
<WithTooltip
placement="top"
trigger="click"
tooltip={({ onHide }) => (
<TooltipLinkList links={toLinks(list, item, setState, state, onHide)} />
)}

View File

@ -2,6 +2,7 @@ import type { ViewportMap } from './Viewport';
export interface ViewportAddonParameter {
disable?: boolean;
defaultOrientation?: 'portrait' | 'landscape';
defaultViewport?: string;
viewports?: ViewportMap;
}

View File

@ -1,3 +1,4 @@
/* eslint-disable jest/valid-title */
/* eslint-disable jest/no-disabled-tests */
/* eslint-disable no-await-in-loop */
import { test, expect } from '@playwright/test';
@ -16,7 +17,6 @@ test.describe('addon-docs', () => {
test('should provide source snippet', async ({ page }) => {
// templateName is e.g. 'Vue-CLI (Default JS)'
test.skip(
// eslint-disable-next-line jest/valid-title
/^(vue3|vue-cli|preact)/i.test(`${templateName}`),
`Skipping ${templateName}, which does not support dynamic source snippets`
);
@ -54,6 +54,12 @@ test.describe('addon-docs', () => {
});
test('should order entries correctly', async ({ page }) => {
// TODO: This is broken in SSV6 Webpack. Context: https://github.com/storybookjs/storybook/issues/20941
test.skip(
templateName.includes('ssv6-webpack'),
`${templateName} fails because of a known issue: https://github.com/storybookjs/storybook/issues/20941`
);
const sbPage = new SbPage(page);
await sbPage.navigateToStory('addons/docs/docspage/basic', 'docs');

View File

@ -8,18 +8,20 @@ const storybookUrl = process.env.STORYBOOK_URL || 'http://localhost:6006';
const templateName = process.env.STORYBOOK_TEMPLATE_NAME;
test.describe('Next.js', () => {
// TODO: improve these E2E tests given that we have more version of Next.js to test
// and this only tests nextjs/default-js
test.skip(
// eslint-disable-next-line jest/valid-title
!templateName.includes('nextjs/default-js'),
'Only run this test for the Frameworks that support next/navigation'
);
test.beforeEach(async ({ page }) => {
await page.goto(storybookUrl);
await new SbPage(page).waitUntilLoaded();
});
test.describe('next/navigation', () => {
test.skip(
// eslint-disable-next-line jest/valid-title
!templateName.includes('nextjs/default-js'),
'Only run this test for the Frameworks that support next/navigation'
);
let root: Locator;
let sbPage: SbPage;
@ -52,12 +54,6 @@ test.describe('Next.js', () => {
});
test.describe('next/router', () => {
test.skip(
// eslint-disable-next-line jest/valid-title
!templateName.includes('nextjs'),
'Only run this test for the Frameworks that support next/router'
);
let root: Locator;
let sbPage: SbPage;

View File

@ -1,7 +1,9 @@
/* eslint-disable jest/no-disabled-tests */
import { test, expect } from '@playwright/test';
import process from 'process';
const storybookUrl = process.env.STORYBOOK_URL || 'http://localhost:8001';
const templateName = process.env.STORYBOOK_TEMPLATE_NAME;
test.describe('JSON files', () => {
test.beforeEach(async ({ page }) => {
@ -9,6 +11,11 @@ test.describe('JSON files', () => {
});
test('should have index.json', async ({ page }) => {
test.skip(
// eslint-disable-next-line jest/valid-title
templateName.includes('ssv6'),
'Only run this test for Sandboxes with StoryStoreV7 enabled'
);
const json = await page.evaluate(() => fetch('/index.json').then((res) => res.json()));
expect(json).toEqual({

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/angular",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Angular: Develop Angular components in isolation with hot reloading.",
"keywords": [
"storybook",
@ -36,20 +36,20 @@
"prep": "../../../scripts/prepare/tsc.ts"
},
"dependencies": {
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/cli": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/core-client": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/core-server": "7.0.0-beta.43",
"@storybook/core-webpack": "7.0.0-beta.43",
"@storybook/docs-tools": "7.0.0-beta.43",
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/cli": "7.0.0-beta.46",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/core-client": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/core-server": "7.0.0-beta.46",
"@storybook/core-webpack": "7.0.0-beta.46",
"@storybook/docs-tools": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"@types/node": "^16.0.0",
"@types/react": "^16.14.34",
"@types/react-dom": "^16.9.14",
@ -123,5 +123,5 @@
"bundler": {
"tsConfig": "tsconfig.build.json"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -52,7 +52,7 @@ export const createStorybookWrapperComponent = (
// storyComponent was not provided.
const viewChildSelector = storyComponent ?? '__storybook-noop';
const imports = extractImports(moduleMetadata);
const imports = extractImports(moduleMetadata, storyComponent);
const declarations = extractDeclarations(moduleMetadata, storyComponent);
const providers = extractProviders(moduleMetadata);
@ -97,7 +97,7 @@ export const createStorybookWrapperComponent = (
constructor(
@Inject(STORY_PROPS) private storyProps$: Subject<ICollection | undefined>,
private changeDetectorRef: ChangeDetectorRef
@Inject(ChangeDetectorRef) private changeDetectorRef: ChangeDetectorRef
) {}
ngOnInit(): void {

View File

@ -95,9 +95,12 @@ describe('PropertyExtractor', () => {
});
it('should return standalone components', () => {
const imports = extractImports({
imports: [TestModuleWithImportsAndProviders, StandaloneTestComponent],
});
const imports = extractImports(
{
imports: [TestModuleWithImportsAndProviders],
},
StandaloneTestComponent
);
expect(imports).toEqual([CommonModule, StandaloneTestComponent]);
});

View File

@ -1,5 +1,6 @@
import { CommonModule } from '@angular/common';
import { Component, InjectionToken, NgModule, Provider } from '@angular/core';
import { HttpClientModule, provideHttpClient } from '@angular/common/http';
import { InjectionToken, NgModule, Provider } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import {
BrowserAnimationsModule,
@ -41,6 +42,13 @@ const analyzeRestricted = (ngModule: NgModule) => {
return [true, provideNoopAnimations()];
}
/**
* HttpClient has to be provided manually as a singleton
*/
if (ngModule === HttpClientModule) {
return [true, provideHttpClient()];
}
return [false];
};
@ -115,9 +123,13 @@ export const analyzeMetadata = (metadata: NgModuleMetadata) => {
* Only standalone components are imported
*
*/
export const extractImports = (metadata: NgModuleMetadata) => {
export const extractImports = (metadata: NgModuleMetadata, storyComponent?: any) => {
const { imports } = analyzeMetadata(metadata);
if (isStandaloneComponent(storyComponent)) {
imports.push(storyComponent);
}
return uniqueArray([CommonModule, imports]);
};

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/ember",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Ember: Develop Ember Component in isolation with Hot Reloading.",
"homepage": "https://github.com/storybookjs/storybook/tree/main/frameworks/ember",
"bugs": {
@ -31,12 +31,12 @@
"prep": "../../../scripts/prepare/tsc.ts"
},
"dependencies": {
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/docs-tools": "7.0.0-beta.43",
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/docs-tools": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"ts-dedent": "^2.0.0"
},
"devDependencies": {
@ -59,5 +59,5 @@
"access": "public"
},
"bundler": {},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/html-vite",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for HTML and Vite: Develop HTML in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,15 +48,15 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/addons": "7.0.0-beta.43",
"@storybook/builder-vite": "7.0.0-beta.43",
"@storybook/channel-postmessage": "7.0.0-beta.43",
"@storybook/channel-websocket": "7.0.0-beta.43",
"@storybook/client-api": "7.0.0-beta.43",
"@storybook/core-server": "7.0.0-beta.43",
"@storybook/html": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/preview-web": "7.0.0-beta.43",
"@storybook/addons": "7.0.0-beta.46",
"@storybook/builder-vite": "7.0.0-beta.46",
"@storybook/channel-postmessage": "7.0.0-beta.46",
"@storybook/channel-websocket": "7.0.0-beta.46",
"@storybook/client-api": "7.0.0-beta.46",
"@storybook/core-server": "7.0.0-beta.46",
"@storybook/html": "7.0.0-beta.46",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/preview-web": "7.0.0-beta.46",
"magic-string": "^0.27.0"
},
"devDependencies": {
@ -76,5 +76,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/html-webpack5",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for HTML: View HTML snippets in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,11 +48,11 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/html": "7.0.0-beta.43",
"@storybook/preset-html-webpack": "7.0.0-beta.43",
"@storybook/html": "7.0.0-beta.46",
"@storybook/preset-html-webpack": "7.0.0-beta.46",
"@types/node": "^16.0.0"
},
"devDependencies": {
@ -76,5 +76,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/nextjs",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Next.js",
"keywords": [
"storybook",
@ -60,13 +60,13 @@
},
"dependencies": {
"@next/font": "^13.0.7",
"@storybook/addon-actions": "7.0.0-beta.43",
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/preset-react-webpack": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/react": "7.0.0-beta.43",
"@storybook/addon-actions": "7.0.0-beta.46",
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/preset-react-webpack": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/react": "7.0.0-beta.46",
"@types/node": "^16.0.0",
"find-up": "^5.0.0",
"fs-extra": "^11.1.0",
@ -123,5 +123,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -224,5 +224,5 @@ We recommend building UIs with a [**component-driven**](https://componentdriven.
</div>
<div className="tip-wrapper">
<span className="tip">Tip</span>Edit the Markdown in <code>stories/Introduction.stories.mdx</code>
<span className="tip">Tip</span>Edit the Markdown in <code>stories/Introduction.mdx</code>
</div>

View File

@ -224,5 +224,5 @@ We recommend building UIs with a [**component-driven**](https://componentdriven.
</div>
<div className="tip-wrapper">
<span className="tip">Tip</span>Edit the Markdown in <code>stories/Introduction.stories.mdx</code>
<span className="tip">Tip</span>Edit the Markdown in <code>stories/Introduction.mdx</code>
</div>

View File

@ -0,0 +1,46 @@
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';
// More on how to set up stories at: https://storybook.js.org/docs/7.0/react/writing-stories/introduction
const meta: Meta<typeof Button> = {
title: 'Example/Button',
component: Button,
tags: ['autodocs'],
argTypes: {
backgroundColor: {
control: 'color',
},
},
};
export default meta;
type Story = StoryObj<typeof Button>;
// More on writing stories with args: https://storybook.js.org/docs/7.0/react/writing-stories/args
export const Primary: Story = {
args: {
primary: true,
label: 'Button',
},
};
export const Secondary: Story = {
args: {
label: 'Button',
},
};
export const Large: Story = {
args: {
size: 'large',
label: 'Button',
},
};
export const Small: Story = {
args: {
size: 'small',
label: 'Button',
},
};

View File

@ -0,0 +1,52 @@
import React from 'react';
import './button.css';
interface ButtonProps {
/**
* Is this the principal call to action on the page?
*/
primary?: boolean;
/**
* What background color to use
*/
backgroundColor?: string;
/**
* How large should the button be?
*/
size?: 'small' | 'medium' | 'large';
/**
* Button contents
*/
label: string;
/**
* Optional click handler
*/
onClick?: () => void;
}
/**
* Primary UI component for user interaction
*/
export const Button = ({
primary = false,
size = 'medium',
backgroundColor,
label,
...props
}: ButtonProps) => {
const mode = primary ? 'storybook-button--primary' : 'storybook-button--secondary';
return (
<button
type="button"
className={['storybook-button', `storybook-button--${size}`, mode].join(' ')}
{...props}
>
{label}
<style jsx>{`
button {
background-color: ${backgroundColor};
}
`}</style>
</button>
);
};

View File

@ -0,0 +1,26 @@
import type { Meta, StoryObj } from '@storybook/react';
import { Header } from './Header';
const meta: Meta<typeof Header> = {
title: 'Example/Header',
component: Header,
// This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/7.0/react/writing-docs/docs-page
tags: ['autodocs'],
parameters: {
// More on how to position stories at: https://storybook.js.org/docs/7.0/react/configure/story-layout
layout: 'fullscreen',
},
};
export default meta;
type Story = StoryObj<typeof Header>;
export const LoggedIn: Story = {
args: {
user: {
name: 'Jane Doe',
},
},
};
export const LoggedOut: Story = {};

View File

@ -0,0 +1,56 @@
import React from 'react';
import { Button } from './Button';
import './header.css';
type User = {
name: string;
};
interface HeaderProps {
user?: User;
onLogin: () => void;
onLogout: () => void;
onCreateAccount: () => void;
}
export const Header = ({ user, onLogin, onLogout, onCreateAccount }: HeaderProps) => (
<header>
<div className="wrapper">
<div>
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fillRule="evenodd">
<path
d="M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z"
fill="#FFF"
/>
<path
d="M5.3 10.6l10.4 6v11.1l-10.4-6v-11zm11.4-6.2l9.7 5.5-9.7 5.6V4.4z"
fill="#555AB9"
/>
<path
d="M27.2 10.6v11.2l-10.5 6V16.5l10.5-6zM15.7 4.4v11L6 10l9.7-5.5z"
fill="#91BAF8"
/>
</g>
</svg>
<h1>Acme</h1>
</div>
<div>
{user ? (
<>
<span className="welcome">
Welcome, <b>{user.name}</b>!
</span>
<Button size="small" onClick={onLogout} label="Log out" />
</>
) : (
<>
<Button size="small" onClick={onLogin} label="Log in" />
<Button primary size="small" onClick={onCreateAccount} label="Sign up" />
</>
)}
</div>
</div>
</header>
);

View File

@ -0,0 +1,228 @@
import { Meta } from '@storybook/blocks';
import Image from 'next/image';
import Code from './assets/code-brackets.svg';
import Colors from './assets/colors.svg';
import Comments from './assets/comments.svg';
import Direction from './assets/direction.svg';
import Flow from './assets/flow.svg';
import Plugin from './assets/plugin.svg';
import Repo from './assets/repo.svg';
import StackAlt from './assets/stackalt.svg';
<Meta title="Example/Introduction" />
<style>
{`
.subheading {
--mediumdark: '#999999';
font-weight: 900;
font-size: 13px;
color: #999;
letter-spacing: 6px;
line-height: 24px;
text-transform: uppercase;
margin-bottom: 12px;
margin-top: 40px;
}
.link-list {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: 1fr 1fr;
row-gap: 10px;
}
@media (min-width: 620px) {
.link-list {
row-gap: 20px;
column-gap: 20px;
grid-template-columns: 1fr 1fr;
}
}
@media all and (-ms-high-contrast:none) {
.link-list {
display: -ms-grid;
-ms-grid-columns: 1fr 1fr;
-ms-grid-rows: 1fr 1fr;
}
}
.link-item {
display: block;
padding: 20px 30px 20px 15px;
border: 1px solid #00000010;
border-radius: 5px;
transition: background 150ms ease-out, border 150ms ease-out, transform 150ms ease-out;
color: #333333;
display: flex;
align-items: flex-start;
}
.link-item:hover {
border-color: #1EA7FD50;
transform: translate3d(0, -3px, 0);
box-shadow: rgba(0, 0, 0, 0.08) 0 3px 10px 0;
}
.link-item:active {
border-color: #1EA7FD;
transform: translate3d(0, 0, 0);
}
.link-item strong {
font-weight: 700;
display: block;
margin-bottom: 2px;
}
.link-item-img-wrapper {
height: 40px;
width: 40px;
margin-right: 15px;
flex: none;
}
.link-item span {
font-size: 14px;
line-height: 20px;
}
.tip {
display: inline-block;
border-radius: 1em;
font-size: 11px;
line-height: 12px;
font-weight: 700;
background: #E7FDD8;
color: #66BF3C;
padding: 4px 12px;
margin-right: 10px;
vertical-align: top;
}
.tip-wrapper {
font-size: 13px;
line-height: 20px;
margin-top: 40px;
margin-bottom: 40px;
}
.tip-wrapper code {
font-size: 12px;
display: inline-block;
}
`}
</style>
# Welcome to Storybook
Storybook helps you build UI components in isolation from your app's business logic, data, and context.
That makes it easy to develop hard-to-reach states. Save these UI states as **stories** to revisit during development, testing, or QA.
Browse example stories now by navigating to them in the sidebar.
View their code in the `stories` directory to learn how they work.
We recommend building UIs with a [**component-driven**](https://componentdriven.org) process starting with atomic components and ending with pages.
<div className="subheading">Configure</div>
<div className="link-list">
<a
className="link-item"
href="https://storybook.js.org/docs/react/addons/addon-types"
target="_blank"
>
<div className="link-item-img-wrapper">
<Image src={Plugin} alt="plugin" />
</div>
<span>
<strong>Presets for popular tools</strong>
Easy setup for TypeScript, SCSS and more.
</span>
</a>
<a
className="link-item"
href="https://storybook.js.org/docs/react/configure/webpack"
target="_blank"
>
<div className="link-item-img-wrapper">
<Image src={StackAlt} alt="Build" />
</div>
<span>
<strong>Build configuration</strong>
How to customize webpack and Babel
</span>
</a>
<a
className="link-item"
href="https://storybook.js.org/docs/react/configure/styling-and-css"
target="_blank"
>
<div className="link-item-img-wrapper">
<Image src={Colors} alt="colors" />
</div>
<span>
<strong>Styling</strong>
How to load and configure CSS libraries
</span>
</a>
<a
className="link-item"
href="https://storybook.js.org/docs/react/get-started/setup#configure-storybook-for-your-stack"
target="_blank"
>
<div className="link-item-img-wrapper">
<Image src={Flow} alt="flow" />
</div>
<span>
<strong>Data</strong>
Providers and mocking for data libraries
</span>
</a>
</div>
<div className="subheading">Learn</div>
<div className="link-list">
<a className="link-item" href="https://storybook.js.org/docs" target="_blank">
<div className="link-item-img-wrapper">
<Image src={Repo} alt="repo" />
</div>
<span>
<strong>Storybook documentation</strong>
Configure, customize, and extend
</span>
</a>
<a className="link-item" href="https://storybook.js.org/tutorials/" target="_blank">
<div className="link-item-img-wrapper">
<Image src={Direction} alt="direction" />
</div>
<span>
<strong>In-depth guides</strong>
Best practices from leading teams
</span>
</a>
<a className="link-item" href="https://github.com/storybookjs/storybook" target="_blank">
<div className="link-item-img-wrapper">
<Image src={Code} alt="code" />
</div>
<span>
<strong>GitHub project</strong>
View the source and add issues
</span>
</a>
<a className="link-item" href="https://discord.gg/storybook" target="_blank">
<div className="link-item-img-wrapper">
<Image src={Comments} alt="comments" />
</div>
<span>
<strong>Discord chat</strong>
Chat with maintainers and the community
</span>
</a>
</div>
<div className="tip-wrapper">
<span className="tip">Tip</span>Edit the Markdown in <code>stories/Introduction.mdx</code>
</div>

View File

@ -0,0 +1,29 @@
import type { Meta, StoryObj } from '@storybook/react';
import { within, userEvent } from '@storybook/testing-library';
import { Page } from './Page';
const meta: Meta<typeof Page> = {
title: 'Example/Page',
component: Page,
parameters: {
// More on how to position stories at: https://storybook.js.org/docs/7.0/react/configure/story-layout
layout: 'fullscreen',
},
};
export default meta;
type Story = StoryObj<typeof Page>;
export const LoggedOut: Story = {};
// More on interaction testing: https://storybook.js.org/docs/7.0/react/writing-tests/interaction-testing
export const LoggedIn: Story = {
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
const loginButton = await canvas.getByRole('button', {
name: /Log in/i,
});
await userEvent.click(loginButton);
},
};

View File

@ -0,0 +1,73 @@
import React from 'react';
import { Header } from './Header';
import './page.css';
type User = {
name: string;
};
export const Page: React.FC = () => {
const [user, setUser] = React.useState<User>();
return (
<article>
<Header
user={user}
onLogin={() => setUser({ name: 'Jane Doe' })}
onLogout={() => setUser(undefined)}
onCreateAccount={() => setUser({ name: 'Jane Doe' })}
/>
<section>
<h2>Pages in Storybook</h2>
<p>
We recommend building UIs with a{' '}
<a href="https://componentdriven.org" target="_blank" rel="noopener noreferrer">
<strong>component-driven</strong>
</a>{' '}
process starting with atomic components and ending with pages.
</p>
<p>
Render pages with mock data. This makes it easy to build and review page states without
needing to navigate to them in your app. Here are some handy patterns for managing page
data in Storybook:
</p>
<ul>
<li>
Use a higher-level connected component. Storybook helps you compose such data from the
"args" of child component stories
</li>
<li>
Assemble data in the page component from your services. You can mock these services out
using Storybook.
</li>
</ul>
<p>
Get a guided tutorial on component-driven development at{' '}
<a href="https://storybook.js.org/tutorials/" target="_blank" rel="noopener noreferrer">
Storybook tutorials
</a>
. Read more in the{' '}
<a href="https://storybook.js.org/docs" target="_blank" rel="noopener noreferrer">
docs
</a>
.
</p>
<div className="tip-wrapper">
<span className="tip">Tip</span> Adjust the width of the canvas with the{' '}
<svg width="10" height="10" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fillRule="evenodd">
<path
d="M1.5 5.2h4.8c.3 0 .5.2.5.4v5.1c-.1.2-.3.3-.4.3H1.4a.5.5 0 01-.5-.4V5.7c0-.3.2-.5.5-.5zm0-2.1h6.9c.3 0 .5.2.5.4v7a.5.5 0 01-1 0V4H1.5a.5.5 0 010-1zm0-2.1h9c.3 0 .5.2.5.4v9.1a.5.5 0 01-1 0V2H1.5a.5.5 0 010-1zm4.3 5.2H2V10h3.8V6.2z"
id="a"
fill="#999"
/>
</g>
</svg>
Viewports addon in the toolbar
</div>
</section>
</article>
);
};

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preact-vite",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Preact and Vite: Develop Preact components in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,8 +48,8 @@
},
"dependencies": {
"@preact/preset-vite": "^2.0.0",
"@storybook/builder-vite": "7.0.0-beta.43",
"@storybook/preact": "7.0.0-beta.43"
"@storybook/builder-vite": "7.0.0-beta.46",
"@storybook/preact": "7.0.0-beta.46"
},
"devDependencies": {
"@types/node": "^16.0.0",
@ -73,5 +73,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/preact-webpack5",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Preact: Develop Preact Component in isolation.",
"keywords": [
"storybook"
@ -48,10 +48,10 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/preact": "7.0.0-beta.43",
"@storybook/preset-preact-webpack": "7.0.0-beta.43",
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/preact": "7.0.0-beta.46",
"@storybook/preset-preact-webpack": "7.0.0-beta.46",
"@types/node": "^16.0.0"
},
"devDependencies": {
@ -77,5 +77,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/react-vite",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for React and Vite: Develop React components in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -50,8 +50,8 @@
"dependencies": {
"@joshwooding/vite-plugin-react-docgen-typescript": "^0.2.1",
"@rollup/pluginutils": "^4.2.0",
"@storybook/builder-vite": "7.0.0-beta.43",
"@storybook/react": "7.0.0-beta.43",
"@storybook/builder-vite": "7.0.0-beta.46",
"@storybook/react": "7.0.0-beta.46",
"@vitejs/plugin-react": "^3.0.1",
"ast-types": "^0.14.2",
"magic-string": "^0.27.0",
@ -80,5 +80,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/react-webpack5",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for React: Develop React Component in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,9 +48,9 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/preset-react-webpack": "7.0.0-beta.43",
"@storybook/react": "7.0.0-beta.43",
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/preset-react-webpack": "7.0.0-beta.46",
"@storybook/react": "7.0.0-beta.46",
"@types/node": "^16.0.0"
},
"devDependencies": {
@ -83,5 +83,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/server-webpack5",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Server: View HTML snippets from a server in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,10 +48,10 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/preset-server-webpack": "7.0.0-beta.43",
"@storybook/server": "7.0.0-beta.43",
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/preset-server-webpack": "7.0.0-beta.46",
"@storybook/server": "7.0.0-beta.46",
"@types/node": "^16.0.0"
},
"devDependencies": {
@ -74,5 +74,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/svelte-vite",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Svelte and Vite: Develop Svelte components in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,9 +48,9 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-vite": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/svelte": "7.0.0-beta.43",
"@storybook/builder-vite": "7.0.0-beta.46",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/svelte": "7.0.0-beta.46",
"@sveltejs/vite-plugin-svelte": "^2.0.0",
"magic-string": "^0.27.0",
"svelte": "^3.0.0",
@ -80,5 +80,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -14,14 +14,9 @@ export const viteFinal: NonNullable<StorybookConfig['viteFinal']> = async (confi
// TODO: set up eslint import to use typescript resolver
// eslint-disable-next-line import/no-unresolved
const { svelte, loadSvelteConfig } = await import('@sveltejs/vite-plugin-svelte');
const svelteOptions: Record<string, any> = await options.presets.apply(
'svelteOptions',
{},
options
);
const svelteConfig = { ...(await loadSvelteConfig()), ...svelteOptions };
const svelteConfig = await loadSvelteConfig();
// Add svelte plugin if not present
// Add svelte plugin if the user does not have a Vite config of their own
if (!(await hasVitePlugins(plugins, ['vite-plugin-svelte']))) {
plugins.push(svelte());
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/svelte-webpack5",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Svelte: Develop Svelte Component in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,10 +48,10 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/preset-svelte-webpack": "7.0.0-beta.43",
"@storybook/svelte": "7.0.0-beta.43"
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/preset-svelte-webpack": "7.0.0-beta.46",
"@storybook/svelte": "7.0.0-beta.46"
},
"devDependencies": {
"svelte": "^3.48.0",
@ -78,5 +78,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -23,20 +23,20 @@ Check out our [Frameworks API](https://storybook.js.org/blog/framework-api/) ann
All Svelte language features are supported out of the box, as Storybook uses the Svelte compiler underneath.
However SvelteKit has some [Kit-specific modules](https://kit.svelte.dev/docs/modules) that currently aren't supported. It's on our roadmap to support most of them soon:
| **Module** | **Status** | **Note** |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`$app/environment`](https://kit.svelte.dev/docs/modules#$app-environment) | ✅ Supported | `version` is always empty in Storybook. |
| [`$app/forms`](https://kit.svelte.dev/docs/modules#$app-forms) | ⏳ Planned for 7.1 | Will use mocks so the Actions addon will display when the hooks are being called. |
| [`$app/navigation`](https://kit.svelte.dev/docs/modules#$app-navigation) | ⏳ Planned for 7.1 | Will use mocks so the Actions addon will display when the hooks are being called. |
| [`$app/paths`](https://kit.svelte.dev/docs/modules#$app-paths) | ✅ Supported | Requires SvelteKit 1.4.0 or newer |
| [`$app/stores`](https://kit.svelte.dev/docs/modules#$app-stores) | ✅ Supported | Mocks planned for 7.1, so you can set different store values per story. |
| [`$env/dynamic/private`](https://kit.svelte.dev/docs/modules#$env-dynamic-private) | ⛔ Not supported | They are meant to only be available server-side, and Storybook renders all components on the client. |
| [`$env/dynamic/public`](https://kit.svelte.dev/docs/modules#$env-dynamic-public) | 🚧 Partially supported | Only supported in development mode. Storybook is built as a static app with no server-side API so cannot dynamically serve content. |
| [`$env/static/private`](https://kit.svelte.dev/docs/modules#$env-static-private) | ⛔ Not supported | They are meant to only be available server-side, and Storybook renders all components on the client. |
| [`$env/static/public`](https://kit.svelte.dev/docs/modules#$env-static-public) | ✅ Supported | |
| [`$lib`](https://kit.svelte.dev/docs/modules#$lib) | ✅ Supported | |
| [`$service-worker`](https://kit.svelte.dev/docs/modules#$service-worker) | ⛔ Not supported | They are only meant to be used in service workers |
| [`@sveltejs/kit/*`](https://kit.svelte.dev/docs/modules#sveltejs-kit) | ✅ Supported | |
| **Module** | **Status** | **Note** |
| ---------------------------------------------------------------------------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| [`$app/environment`](https://kit.svelte.dev/docs/modules#$app-environment) | ✅ Supported | `version` is always empty in Storybook. |
| [`$app/forms`](https://kit.svelte.dev/docs/modules#$app-forms) | ⏳ Planned for 7.1 | Will use mocks. Tracked in [#20999](https://github.com/storybookjs/storybook/issues/20999) |
| [`$app/navigation`](https://kit.svelte.dev/docs/modules#$app-navigation) | ⏳ Planned for 7.1 | Will use mocks. Tracked in [#20999](https://github.com/storybookjs/storybook/issues/20999) |
| [`$app/paths`](https://kit.svelte.dev/docs/modules#$app-paths) | ✅ Supported | Requires SvelteKit 1.4.0 or newer |
| [`$app/stores`](https://kit.svelte.dev/docs/modules#$app-stores) | ✅ Supported | Mocks planned for 7.1, so you can set different store values per story. |
| [`$env/dynamic/private`](https://kit.svelte.dev/docs/modules#$env-dynamic-private) | ⛔ Not supported | They are meant to only be available server-side, and Storybook renders all components on the client. |
| [`$env/dynamic/public`](https://kit.svelte.dev/docs/modules#$env-dynamic-public) | 🚧 Partially supported | Only supported in development mode. Storybook is built as a static app with no server-side API so cannot dynamically serve content. |
| [`$env/static/private`](https://kit.svelte.dev/docs/modules#$env-static-private) | ⛔ Not supported | They are meant to only be available server-side, and Storybook renders all components on the client. |
| [`$env/static/public`](https://kit.svelte.dev/docs/modules#$env-static-public) | ✅ Supported | |
| [`$lib`](https://kit.svelte.dev/docs/modules#$lib) | ✅ Supported | |
| [`$service-worker`](https://kit.svelte.dev/docs/modules#$service-worker) | ⛔ Not supported | They are only meant to be used in service workers |
| [`@sveltejs/kit/*`](https://kit.svelte.dev/docs/modules#sveltejs-kit) | ✅ Supported | |
This is just the beginning. We're close to adding basic support for many of the SvelteKit features. Longer term we're planning on making it an even better experience to [build](https://storybook.js.org/docs/7.0/react/writing-stories/introduction), [test](https://storybook.js.org/docs/7.0/react/writing-tests/introduction) and [document](https://storybook.js.org/docs/7.0/react/writing-docs/introduction) all the SvelteKit goodies like [pages](https://kit.svelte.dev/docs/routing), [forms](https://kit.svelte.dev/docs/form-actions) and [layouts](https://kit.svelte.dev/docs/routing#layout) in Storybook, while still integrating with all the addons and workflows you know and love.

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/sveltekit",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for SvelteKit",
"keywords": [
"storybook",
@ -51,9 +51,9 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-vite": "7.0.0-beta.43",
"@storybook/svelte": "7.0.0-beta.43",
"@storybook/svelte-vite": "7.0.0-beta.43"
"@storybook/builder-vite": "7.0.0-beta.46",
"@storybook/svelte": "7.0.0-beta.46",
"@storybook/svelte-vite": "7.0.0-beta.46"
},
"devDependencies": {
"@types/node": "^16.0.0",
@ -76,5 +76,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
# Storybook for Vue and Vite
# Storybook for Vue 2 and Vite
Storybook for Vue is a UI development environment for your Vue components.
Storybook for Vue 2 is a UI development environment for your Vue 2 components.
With it, you can visualize different states of your UI components and develop them interactively.
![Storybook Screenshot](https://github.com/storybookjs/storybook/blob/main/media/storybook-intro.gif)

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/vue-vite",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Vue2 and Vite: Develop Vue2 Components in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,10 +48,10 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-vite": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/core-server": "7.0.0-beta.43",
"@storybook/vue": "7.0.0-beta.43",
"@storybook/builder-vite": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/core-server": "7.0.0-beta.46",
"@storybook/vue": "7.0.0-beta.46",
"magic-string": "^0.27.0",
"vue-docgen-api": "^4.40.0"
},
@ -79,5 +79,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
# Storybook for Vue
# Storybook for Vue 3 and Webpack
Storybook for Vue is a UI development environment for your Vue components.
Storybook for Vue 3 is a UI development environment for your Vue 3 components.
With it, you can visualize different states of your UI components and develop them interactively.
![Storybook Screenshot](https://github.com/storybookjs/storybook/blob/main/media/storybook-intro.gif)

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/vue-webpack5",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Vue: Develop Vue Component in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,10 +48,10 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/preset-vue-webpack": "7.0.0-beta.43",
"@storybook/vue": "7.0.0-beta.43",
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/preset-vue-webpack": "7.0.0-beta.46",
"@storybook/vue": "7.0.0-beta.46",
"@types/node": "^16.0.0"
},
"devDependencies": {
@ -83,5 +83,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1 +1,44 @@
# Storybook for React
# Storybook for Vue 3 and Vite
Storybook for Vue 3 is a UI development environment for your Vue 3 components.
With it, you can visualize different states of your UI components and develop them interactively.
![Storybook Screenshot](https://github.com/storybookjs/storybook/blob/main/media/storybook-intro.gif)
Storybook runs outside of your app.
So you can develop UI components in isolation without worrying about app specific dependencies and requirements.
## Getting Started
```sh
cd my-vue3-app
npx storybook init
```
For more information visit: [storybook.js.org](https://storybook.js.org)
---
Storybook also comes with a lot of [addons](https://storybook.js.org/addons) and a great API to customize as you wish.
You can also build a [static version](https://storybook.js.org/docs/vue/sharing/publish-storybook) of your Storybook and deploy it anywhere you want.
## Extending the Vue application
Storybook creates a [Vue 3 application](https://v3.vuejs.org/api/application-api.html#application-api) for your component preview.
When using global custom components (`app.component`), directives (`app.directive`), extensions (`app.use`), or other application methods, you will need to configure those in the `./storybook/preview.js` file.
Therefore, Storybook provides you with a `setup` function exported from this package, which receives as a callback your Storybook instance, which you can interact with and add your custom configuration.
```js
// .storybook/preview.js
import { setup } from '@storybook/vue3';
setup((app) => {
app.use(MyPlugin);
app.component('my-component', MyComponent);
app.mixin({
/* My mixin */
});
});
```

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/vue3-vite",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Vue3 and Vite: Develop Vue3 components in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,9 +48,9 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-vite": "7.0.0-beta.43",
"@storybook/core-server": "7.0.0-beta.43",
"@storybook/vue3": "7.0.0-beta.43",
"@storybook/builder-vite": "7.0.0-beta.46",
"@storybook/core-server": "7.0.0-beta.46",
"@storybook/vue3": "7.0.0-beta.46",
"@vitejs/plugin-vue": "^4.0.0",
"magic-string": "^0.27.0",
"vue-docgen-api": "^4.40.0"
@ -78,5 +78,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,4 +1,4 @@
# Storybook for Vue 3
# Storybook for Vue 3 and Webpack
Storybook for Vue 3 is a UI development environment for your Vue 3 components.
With it, you can visualize different states of your UI components and develop them interactively.
@ -24,20 +24,21 @@ You can also build a [static version](https://storybook.js.org/docs/vue/sharing/
## Extending the Vue application
Storybook creates a [Vue 3 application](https://v3.vuejs.org/api/application-api.html#application-api) for your component preview which can be imported as `import { app } from '@storybook/vue3'`.
Storybook creates a [Vue 3 application](https://v3.vuejs.org/api/application-api.html#application-api) for your component preview.
When using global custom components (`app.component`), directives (`app.directive`), extensions (`app.use`), or other application methods, you will need to configure those in the `./storybook/preview.js` file.
For example:
Therefore, Storybook provides you with a `setup` function exported from this package, which receives as a callback your Storybook instance, which you can interact with and add your custom configuration.
```js
// .storybook/preview.js
import { app } from '@storybook/vue3';
import { setup } from '@storybook/vue3';
app.use(MyPlugin);
app.component('my-component', MyComponent);
app.mixin({
/* My mixin */
setup((app) => {
app.use(MyPlugin);
app.component('my-component', MyComponent);
app.mixin({
/* My mixin */
});
});
```

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/vue3-webpack5",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for Vue 3: Develop Vue 3 Components in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,10 +48,10 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/preset-vue3-webpack": "7.0.0-beta.43",
"@storybook/vue3": "7.0.0-beta.43",
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/preset-vue3-webpack": "7.0.0-beta.46",
"@storybook/vue3": "7.0.0-beta.46",
"@types/node": "^16.0.0"
},
"devDependencies": {
@ -80,5 +80,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/web-components-vite",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for web-components and Vite: Develop Web Components in isolation with Hot Reloading.",
"keywords": [
"storybook"
@ -48,10 +48,10 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/builder-vite": "7.0.0-beta.43",
"@storybook/core-server": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/web-components": "7.0.0-beta.43",
"@storybook/builder-vite": "7.0.0-beta.46",
"@storybook/core-server": "7.0.0-beta.46",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/web-components": "7.0.0-beta.46",
"magic-string": "^0.27.0"
},
"devDependencies": {
@ -75,5 +75,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/web-components-webpack5",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook for web-components: View web components snippets in isolation with Hot Reloading.",
"keywords": [
"lit-html",
@ -51,10 +51,10 @@
},
"dependencies": {
"@babel/preset-env": "^7.20.2",
"@storybook/builder-webpack5": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/preset-web-components-webpack": "7.0.0-beta.43",
"@storybook/web-components": "7.0.0-beta.43",
"@storybook/builder-webpack5": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/preset-web-components-webpack": "7.0.0-beta.46",
"@storybook/web-components": "7.0.0-beta.46",
"@types/node": "^16.0.0"
},
"devDependencies": {
@ -79,5 +79,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -2,5 +2,5 @@
"npmClient": "yarn",
"useWorkspaces": true,
"registry": "https://registry.npmjs.org",
"version": "7.0.0-beta.43"
"version": "7.0.0-beta.46"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/addons",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook addons store",
"keywords": [
"storybook"
@ -44,9 +44,9 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43"
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
@ -60,5 +60,5 @@
"./src/index.ts"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/builder-manager",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook manager builder",
"keywords": [
"storybook"
@ -44,9 +44,9 @@
},
"dependencies": {
"@fal-works/esbuild-plugin-global-externals": "^2.1.2",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/manager": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/manager": "7.0.0-beta.46",
"@storybook/node-logger": "7.0.0-beta.46",
"@types/ejs": "^3.1.1",
"@types/find-cache-dir": "^3.2.1",
"@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10",
@ -73,5 +73,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/builder-vite",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "A plugin to run and build Storybooks with Vite",
"homepage": "https://github.com/storybookjs/storybook/tree/main/code/lib/builder-vite/#readme",
"bugs": {
@ -43,16 +43,16 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/channel-postmessage": "7.0.0-beta.43",
"@storybook/channel-websocket": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/csf-plugin": "7.0.0-beta.43",
"@storybook/channel-postmessage": "7.0.0-beta.46",
"@storybook/channel-websocket": "7.0.0-beta.46",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/csf-plugin": "7.0.0-beta.46",
"@storybook/mdx2-csf": "next",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/preview": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/preview": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"browser-assert": "^1.2.1",
"es-module-lexer": "^0.9.3",
"express": "^4.17.3",
@ -96,5 +96,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,4 +1,4 @@
import * as path from 'path';
import * as posixPath from 'node:path/posix'; // Glob requires forward-slashes
import { promise as glob } from 'glob-promise';
import { normalizeStories } from '@storybook/core-common';
@ -11,11 +11,14 @@ export async function listStories(options: Options) {
configDir: options.configDir,
workingDir: options.configDir,
}).map(({ directory, files }) => {
const pattern = path.join(directory, files);
const pattern = posixPath.join(directory, files);
return glob(path.isAbsolute(pattern) ? pattern : path.join(options.configDir, pattern), {
follow: true,
});
return glob(
posixPath.isAbsolute(pattern) ? pattern : posixPath.join(options.configDir, pattern),
{
follow: true,
}
);
})
)
).reduce((carry, stories) => carry.concat(stories), []);

View File

@ -0,0 +1,67 @@
import type { Options, Presets } from '@storybook/types';
import { loadConfigFromFile } from 'vite';
import { commonConfig } from './vite-config';
jest.mock('vite', () => ({
...jest.requireActual('vite'),
loadConfigFromFile: jest.fn(async () => ({})),
}));
const loadConfigFromFileMock = jest.mocked(loadConfigFromFile);
const dummyOptions: Options = {
configType: 'DEVELOPMENT',
configDir: '',
packageJson: {},
presets: {
apply: async (key: string) =>
({
framework: {
name: '',
},
addons: [],
core: {
builder: {},
},
options: {},
}[key]),
} as Presets,
presetsList: [],
};
describe('commonConfig', () => {
it('should preserve default envPrefix', async () => {
loadConfigFromFileMock.mockReturnValueOnce(
Promise.resolve({
config: {},
path: '',
dependencies: [],
})
);
const config = await commonConfig(dummyOptions, 'development');
expect(config.envPrefix).toStrictEqual(['VITE_', 'STORYBOOK_']);
});
it('should preserve custom envPrefix string', async () => {
loadConfigFromFileMock.mockReturnValueOnce(
Promise.resolve({
config: { envPrefix: 'SECRET_' },
path: '',
dependencies: [],
})
);
const config = await commonConfig(dummyOptions, 'development');
expect(config.envPrefix).toStrictEqual(['SECRET_', 'STORYBOOK_']);
});
it('should preserve custom envPrefix array', async () => {
loadConfigFromFileMock.mockReturnValueOnce(
Promise.resolve({
config: { envPrefix: ['SECRET_', 'VUE_'] },
path: '',
dependencies: [],
})
);
const config = await commonConfig(dummyOptions, 'development');
expect(config.envPrefix).toStrictEqual(['SECRET_', 'VUE_', 'STORYBOOK_']);
});
});

View File

@ -64,7 +64,7 @@ export async function commonConfig(
},
// If an envPrefix is specified in the vite config, add STORYBOOK_ to it,
// otherwise, add VITE_ and STORYBOOK_ so that vite doesn't lose its default.
envPrefix: userConfig.envPrefix ? 'STORYBOOK_' : ['VITE_', 'STORYBOOK_'],
envPrefix: userConfig.envPrefix ? ['STORYBOOK_'] : ['VITE_', 'STORYBOOK_'],
};
const config: ViteConfig = mergeConfig(userConfig, sbConfig);

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/builder-webpack5",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook framework-agnostic API",
"keywords": [
"storybook"
@ -58,25 +58,25 @@
},
"dependencies": {
"@babel/core": "^7.12.10",
"@storybook/addons": "7.0.0-beta.43",
"@storybook/api": "7.0.0-beta.43",
"@storybook/channel-postmessage": "7.0.0-beta.43",
"@storybook/channel-websocket": "7.0.0-beta.43",
"@storybook/channels": "7.0.0-beta.43",
"@storybook/client-api": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/components": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/core-webpack": "7.0.0-beta.43",
"@storybook/addons": "7.0.0-beta.46",
"@storybook/api": "7.0.0-beta.46",
"@storybook/channel-postmessage": "7.0.0-beta.46",
"@storybook/channel-websocket": "7.0.0-beta.46",
"@storybook/channels": "7.0.0-beta.46",
"@storybook/client-api": "7.0.0-beta.46",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/components": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/core-webpack": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"@storybook/manager-api": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/preview": "7.0.0-beta.43",
"@storybook/preview-api": "7.0.0-beta.43",
"@storybook/router": "7.0.0-beta.43",
"@storybook/store": "7.0.0-beta.43",
"@storybook/theming": "7.0.0-beta.43",
"@storybook/manager-api": "7.0.0-beta.46",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/preview": "7.0.0-beta.46",
"@storybook/preview-api": "7.0.0-beta.46",
"@storybook/router": "7.0.0-beta.46",
"@storybook/store": "7.0.0-beta.46",
"@storybook/theming": "7.0.0-beta.46",
"@types/node": "^16.0.0",
"@types/semver": "^7.3.4",
"babel-loader": "^9.0.0",
@ -131,5 +131,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/channel-postmessage",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "",
"keywords": [
"storybook"
@ -43,9 +43,9 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/channels": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/core-events": "7.0.0-beta.43",
"@storybook/channels": "7.0.0-beta.46",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/core-events": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"qs": "^6.10.0",
"telejson": "^7.0.3"
@ -61,5 +61,5 @@
"./src/index.ts"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/channel-websocket",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "",
"keywords": [
"storybook"
@ -43,8 +43,8 @@
"prep": "../../../scripts/prepare/bundle.ts"
},
"dependencies": {
"@storybook/channels": "7.0.0-beta.43",
"@storybook/client-logger": "7.0.0-beta.43",
"@storybook/channels": "7.0.0-beta.46",
"@storybook/client-logger": "7.0.0-beta.46",
"@storybook/global": "^5.0.0",
"telejson": "^7.0.3"
},
@ -59,5 +59,5 @@
"./src/index.ts"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/channels",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "",
"keywords": [
"storybook"
@ -53,5 +53,5 @@
"./src/index.ts"
]
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "sb",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook CLI",
"keywords": [
"storybook"
@ -21,10 +21,10 @@
"license": "MIT",
"bin": "./index.js",
"dependencies": {
"@storybook/cli": "7.0.0-beta.43"
"@storybook/cli": "7.0.0-beta.46"
},
"publishConfig": {
"access": "public"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "storybook",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook CLI",
"keywords": [
"storybook"
@ -24,10 +24,10 @@
"storybook": "./index.js"
},
"dependencies": {
"@storybook/cli": "7.0.0-beta.43"
"@storybook/cli": "7.0.0-beta.46"
},
"publishConfig": {
"access": "public"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -1,6 +1,6 @@
{
"name": "@storybook/cli",
"version": "7.0.0-beta.43",
"version": "7.0.0-beta.46",
"description": "Storybook's CLI - easiest method of adding storybook to your projects",
"keywords": [
"cli",
@ -56,13 +56,13 @@
"dependencies": {
"@babel/core": "^7.20.2",
"@babel/preset-env": "^7.20.2",
"@storybook/codemod": "7.0.0-beta.43",
"@storybook/core-common": "7.0.0-beta.43",
"@storybook/core-server": "7.0.0-beta.43",
"@storybook/csf-tools": "7.0.0-beta.43",
"@storybook/node-logger": "7.0.0-beta.43",
"@storybook/telemetry": "7.0.0-beta.43",
"@storybook/types": "7.0.0-beta.43",
"@storybook/codemod": "7.0.0-beta.46",
"@storybook/core-common": "7.0.0-beta.46",
"@storybook/core-server": "7.0.0-beta.46",
"@storybook/csf-tools": "7.0.0-beta.46",
"@storybook/node-logger": "7.0.0-beta.46",
"@storybook/telemetry": "7.0.0-beta.46",
"@storybook/types": "7.0.0-beta.46",
"@types/semver": "^7.3.4",
"boxen": "^5.1.2",
"chalk": "^4.1.0",
@ -91,7 +91,7 @@
"util-deprecate": "^1.0.2"
},
"devDependencies": {
"@storybook/client-api": "7.0.0-beta.43",
"@storybook/client-api": "7.0.0-beta.46",
"@types/cross-spawn": "^6.0.2",
"@types/prompts": "^2.0.9",
"@types/puppeteer-core": "^2.1.0",
@ -111,5 +111,5 @@
],
"platform": "node"
},
"gitHead": "b1b7c2bc998decc21eb8352fcccd3c939048df02"
"gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
}

View File

@ -0,0 +1,202 @@
/* eslint-disable no-underscore-dangle */
/// <reference types="@types/jest" />;
import type { StorybookConfig } from '@storybook/types';
import path from 'path';
import type { JsPackageManager, PackageJson } from '../../js-package-manager';
import { ansiRegex } from '../helpers/cleanLog';
import type { BareMdxStoriesGlobRunOptions } from './bare-mdx-stories-glob';
import { bareMdxStoriesGlob } from './bare-mdx-stories-glob';
// eslint-disable-next-line global-require, jest/no-mocks-import
jest.mock('fs-extra', () => require('../../../../../__mocks__/fs-extra'));
const checkBareMdxStoriesGlob = async ({
packageJson,
main,
}: {
packageJson: PackageJson;
main?: Partial<StorybookConfig>;
}) => {
if (main) {
// eslint-disable-next-line global-require
require('fs-extra').__setMockFiles({
[path.join('.storybook', 'main.js')]: `module.exports = ${JSON.stringify(main)};`,
});
} else {
// eslint-disable-next-line global-require
require('fs-extra').__setMockFiles({});
}
const packageManager = {
retrievePackageJson: () => ({ dependencies: {}, devDependencies: {}, ...packageJson }),
} as JsPackageManager;
return bareMdxStoriesGlob.check({ packageManager });
};
describe('bare-mdx fix', () => {
describe('should no-op', () => {
it('in SB < v7.0.0', async () => {
const packageJson = {
dependencies: { '@storybook/react': '^6.2.0' },
};
const main = { stories: ['../**/*.stories.mdx'] };
await expect(checkBareMdxStoriesGlob({ packageJson, main })).resolves.toBeFalsy();
});
describe('in SB >= v7.0.0', () => {
it('without main', async () => {
const packageJson = {
dependencies: { '@storybook/react': '^7.0.0' },
};
await expect(checkBareMdxStoriesGlob({ packageJson })).rejects.toThrow();
});
it('without stories field in main', async () => {
const packageJson = {
dependencies: { '@storybook/react': '^7.0.0' },
};
const main = {};
await expect(checkBareMdxStoriesGlob({ packageJson, main })).rejects.toThrow();
});
it('with variable references in stories field', async () => {
// eslint-disable-next-line global-require
require('fs-extra').__setMockFiles({
[path.join('.storybook', 'main.js')]: `
const globVar = '../**/*.stories.mdx';
module.exports = { stories: [globVar] };`,
});
const packageManager = {
retrievePackageJson: () => ({
dependencies: { '@storybook/react': '^7.0.0' },
devDependencies: {},
}),
} as unknown as JsPackageManager;
await expect(bareMdxStoriesGlob.check({ packageManager })).rejects.toThrow();
});
it('without .stories.mdx in globs', async () => {
const packageJson = {
dependencies: { '@storybook/react': '^7.0.0' },
};
const main = {
stories: [
'../src/**/*.stories.@(js|jsx|ts|tsx)',
{ directory: '../**', files: '*.stories.@(js|jsx|ts|tsx)' },
{ directory: '../**' },
],
};
await expect(checkBareMdxStoriesGlob({ packageJson, main })).resolves.toBeFalsy();
});
});
});
describe('should fix', () => {
it.each([
{
existingStoriesEntries: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
expectedStoriesEntries: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
},
{
existingStoriesEntries: ['../src/**/*.stories.*'],
expectedStoriesEntries: ['../src/**/*.@(mdx|stories.*)'],
},
{
existingStoriesEntries: ['../src/**/*.stories.@(mdx|js|jsx|ts|tsx)'],
expectedStoriesEntries: ['../src/**/*.@(mdx|stories.@(js|jsx|ts|tsx))'],
},
{
existingStoriesEntries: ['../src/**/*.stories.@(js|jsx|mdx|ts|tsx)'],
expectedStoriesEntries: ['../src/**/*.@(mdx|stories.@(js|jsx|ts|tsx))'],
},
{
existingStoriesEntries: ['../src/**/*.stories.@(js|jsx|ts|tsx|mdx)'],
expectedStoriesEntries: ['../src/**/*.@(mdx|stories.@(js|jsx|ts|tsx))'],
},
])(
'strings: $existingStoriesEntries',
async ({ existingStoriesEntries, expectedStoriesEntries }) => {
const packageJson = {
dependencies: { '@storybook/react': '^7.0.0' },
};
const main = {
stories: existingStoriesEntries,
};
await expect(checkBareMdxStoriesGlob({ packageJson, main })).resolves.toMatchObject({
existingStoriesEntries,
nextStoriesEntries: expectedStoriesEntries,
});
}
);
it.each([
{
existingStoriesEntries: [{ directory: '../src/**', files: '*.stories.mdx' }],
expectedStoriesEntries: [{ directory: '../src/**', files: '*.mdx' }],
},
{
existingStoriesEntries: [{ directory: '../src/**', files: '*.stories.*' }],
expectedStoriesEntries: [{ directory: '../src/**', files: '*.@(mdx|stories.*)' }],
},
{
existingStoriesEntries: [
{ directory: '../src/**', files: '*.stories.@(js|jsx|ts|tsx|mdx)' },
],
expectedStoriesEntries: [
{ directory: '../src/**', files: '*.@(mdx|stories.@(js|jsx|ts|tsx))' },
],
},
])(
'specifiers: $existingStoriesEntries.0.files',
async ({ existingStoriesEntries, expectedStoriesEntries }) => {
const packageJson = {
dependencies: { '@storybook/react': '^7.0.0' },
};
const main = {
stories: existingStoriesEntries,
};
await expect(checkBareMdxStoriesGlob({ packageJson, main })).resolves.toMatchObject({
existingStoriesEntries,
nextStoriesEntries: expectedStoriesEntries,
});
}
);
it('prompts', () => {
const result = bareMdxStoriesGlob.prompt({
existingStoriesEntries: [
'../src/**/*.stories.@(js|jsx|mdx|ts|tsx)',
{ directory: '../src/**', files: '*.stories.mdx' },
],
nextStoriesEntries: [
'../src/**/*.mdx',
'../src/**/*.stories.@(js|jsx|ts|tsx)',
{ directory: '../src/**', files: '*.mdx' },
],
} as BareMdxStoriesGlobRunOptions);
expect(result.replaceAll(ansiRegex(), '')).toMatchInlineSnapshot(`
"We've detected your project has one or more globs in your 'stories' config that matches .stories.mdx files:
\\"../src/**/*.stories.@(js|jsx|mdx|ts|tsx)\\"
{
\\"directory\\": \\"../src/**\\",
\\"files\\": \\"*.stories.mdx\\"
}
In Storybook 7, we have deprecated defining stories in MDX files, and consequently have changed the suffix to simply .mdx.
We can automatically migrate your 'stories' config to include any .mdx file instead of just .stories.mdx.
That would result in the following 'stories' config:
\\"../src/**/*.mdx\\"
\\"../src/**/*.stories.@(js|jsx|ts|tsx)\\"
{
\\"directory\\": \\"../src/**\\",
\\"files\\": \\"*.mdx\\"
}
To learn more about this change, see: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#mdx-docs-files"
`);
});
});
});

View File

@ -0,0 +1,150 @@
import chalk from 'chalk';
import dedent from 'ts-dedent';
import semver from 'semver';
import type { ConfigFile } from '@storybook/csf-tools';
import { readConfig, writeConfig } from '@storybook/csf-tools';
import { getStorybookInfo } from '@storybook/core-common';
import type { StoriesEntry } from 'lib/types/src';
import type { Fix } from '../types';
const logger = console;
const fixId = 'bare-mdx-stories-glob';
export interface BareMdxStoriesGlobRunOptions {
main: ConfigFile;
existingStoriesEntries: StoriesEntry[];
nextStoriesEntries: StoriesEntry[];
}
const getNextGlob = (glob: string) => {
// '../src/**/*.stories.@(mdx|js|jsx|ts|tsx)' -> '../src/**/*.@(mdx|stories.@(js|jsx|ts|tsx))'
const extGlobsRegex = new RegExp(/(.*\.)(stories\.@.*)(\|mdx|mdx\|)(.*)$/i);
if (glob.match(extGlobsRegex)) {
return glob.replace(extGlobsRegex, '$1@(mdx|$2$4)');
}
// '../src/**/*.stories.*' -> '../src/**/*.@(mdx|stories.*)'
const allStoriesExtensionsRegex = new RegExp(/(.*\.)(stories\.\*)$/i);
if (glob.match(allStoriesExtensionsRegex)) {
return glob.replace(allStoriesExtensionsRegex, '$1@(mdx|$2)');
}
// '../src/**/*.stories.mdx' -> '../src/**/*.mdx'
return glob.replaceAll('.stories.mdx', '.mdx');
};
export const bareMdxStoriesGlob: Fix<BareMdxStoriesGlobRunOptions> = {
id: fixId,
async check({ packageManager }) {
const packageJson = packageManager.retrievePackageJson();
const { mainConfig, version: storybookVersion } = getStorybookInfo(packageJson);
if (!mainConfig) {
logger.warn('Unable to find storybook main.js config, skipping');
return null;
}
const sbVersionCoerced = storybookVersion && semver.coerce(storybookVersion)?.version;
if (!sbVersionCoerced) {
throw new Error(dedent`
Unable to determine storybook version.
🤔 Are you running automigrate from your project directory?
`);
}
if (!semver.gte(sbVersionCoerced, '7.0.0')) {
return null;
}
const main = await readConfig(mainConfig);
let existingStoriesEntries;
try {
existingStoriesEntries = main.getFieldValue(['stories']) as StoriesEntry[];
} catch (e) {
// throws in next null check below
}
if (!existingStoriesEntries) {
throw new Error(dedent`
Unable to determine Storybook stories globs, skipping ${chalk.cyan(fixId)} fix.
In Storybook 7, we have deprecated defining stories in MDX files, and consequently have changed the suffix to simply .mdx.
We were unable to automatically migrate your 'stories' config to include any .mdx file instead of just .stories.mdx.
We suggest you make this change manually.
To learn more about this change, see: ${chalk.yellow(
'https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#mdx-docs-files'
)}
`);
}
const nextStoriesEntries = existingStoriesEntries.map((entry) => {
const isSpecifier = typeof entry !== 'string';
const glob = isSpecifier ? entry.files : entry;
if (!glob) {
// storySpecifier without the 'files' property. Just add the existing to the next list
return entry;
}
const nextGlob = getNextGlob(glob);
return isSpecifier ? { ...entry, files: nextGlob } : nextGlob;
});
// bails if there are no changes
if (
existingStoriesEntries.length === nextStoriesEntries.length &&
existingStoriesEntries.every((entry, index) => {
const nextEntry = nextStoriesEntries[index];
if (typeof entry === 'string') {
return entry === nextEntry;
}
if (typeof nextEntry === 'string') {
return false;
}
return entry.files === nextEntry.files;
})
) {
return null;
}
return { existingStoriesEntries, nextStoriesEntries, main };
},
prompt({ existingStoriesEntries, nextStoriesEntries }) {
const prettyExistingStoriesEntries = existingStoriesEntries
.map((entry) => JSON.stringify(entry, null, 2))
.join('\n');
const prettyNextStoriesEntries = nextStoriesEntries
.map((entry) => JSON.stringify(entry, null, 2))
.join('\n');
return dedent`
We've detected your project has one or more globs in your 'stories' config that matches .stories.mdx files:
${chalk.cyan(prettyExistingStoriesEntries)}
In Storybook 7, we have deprecated defining stories in MDX files, and consequently have changed the suffix to simply .mdx.
We can automatically migrate your 'stories' config to include any .mdx file instead of just .stories.mdx.
That would result in the following 'stories' config:
${chalk.cyan(prettyNextStoriesEntries)}
To learn more about this change, see: ${chalk.yellow(
'https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#mdx-docs-files'
)}
`;
},
async run({ dryRun, result: { nextStoriesEntries, main } }) {
logger.info(dedent`✅ Setting 'stories' config:
${JSON.stringify(nextStoriesEntries, null, 2)}`);
main.setFieldValue(['stories'], nextStoriesEntries);
if (!dryRun) {
await writeConfig(main);
}
},
};

View File

@ -18,6 +18,7 @@ import { sveltekitFramework } from './sveltekit-framework';
import { addReact } from './add-react';
import { nodeJsRequirement } from './nodejs-requirement';
import { missingBabelRc } from './missing-babelrc';
import { bareMdxStoriesGlob } from './bare-mdx-stories-glob';
export * from '../types';
@ -37,6 +38,7 @@ export const fixes: Fix[] = [
nextjsFramework,
removedGlobalClientAPIs,
mdx1to2,
bareMdxStoriesGlob,
autodocsTrue,
addReact,
missingBabelRc,

View File

@ -103,27 +103,6 @@ describe('new-frameworks fix', () => {
).resolves.toBeFalsy();
});
// TODO: once we have a @storybook/vue-vite framework, we should remove this test
it('in sb 7 with vue and vite', async () => {
const packageJson = {
dependencies: {
'@storybook/vue': '^7.0.0',
'@storybook/builder-vite': 'x.y.z',
},
};
await expect(
checkNewFrameworks({
packageJson,
main: {
framework: '@storybook/vue',
core: {
builder: '@storybook/builder-vite',
},
},
})
).resolves.toBeFalsy();
});
it('in sb 7 with vite < 3', async () => {
const packageJson = {
dependencies: {

View File

@ -28,8 +28,7 @@ const packagesMap: Record<string, { webpack5?: string; vite?: string }> = {
},
'@storybook/vue': {
webpack5: '@storybook/vue-webpack5',
// TODO: bring this back if we ever want to support vue 2 + vite. Else delete this!
// vite: '@storybook/vue-vite',
vite: '@storybook/vue-vite',
},
'@storybook/vue3': {
webpack5: '@storybook/vue3-webpack5',

View File

@ -1,10 +1,20 @@
import { EOL } from 'os';
// copied from https://github.com/chalk/ansi-regex
// the package is ESM only so not compatible with jest
export const ansiRegex = ({ onlyFirst = false } = {}) => {
const pattern = [
'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))',
].join('|');
return new RegExp(pattern, onlyFirst ? undefined : 'g');
};
export const cleanLog = (str: string) =>
str
// remove chalk ANSI colors
// eslint-disable-next-line no-control-regex
.replace(/\u001b\[.*?m/g, '')
.replace(ansiRegex(), '')
// fix boxen output
.replace(/╮│/g, '╮\n│')
.replace(/││/g, '│\n│')

View File

@ -1,4 +1,3 @@
import path from 'path';
import fs from 'fs';
import findUp from 'find-up';
import semver from 'semver';
@ -86,7 +85,7 @@ const getFrameworkPreset = (
}
if (Array.isArray(files) && files.length > 0) {
matcher.files = files.map((name) => fs.existsSync(path.join(process.cwd(), name)));
matcher.files = files.map((name) => fs.existsSync(name));
}
return matcherFunction(matcher) ? preset : null;
@ -152,7 +151,9 @@ export function isStorybookInstalled(
export function detectLanguage(packageJson?: PackageJson) {
let language = SupportedLanguage.JAVASCRIPT;
if (!packageJson) {
// TODO: we may need to also detect whether a jsconfig.json file is present
// in a monorepo root directory
if (!packageJson || fs.existsSync('jsconfig.json')) {
return language;
}

View File

@ -8,7 +8,8 @@ export function getCliDir() {
export function getRendererDir(renderer: SupportedFrameworks | SupportedRenderers) {
const externalFramework = externalFrameworks.find((framework) => framework.name === renderer);
const frameworkPackageName = externalFramework?.packageName ?? `@storybook/${renderer}`;
const frameworkPackageName =
externalFramework?.renderer || externalFramework?.packageName || `@storybook/${renderer}`;
return dirname(
require.resolve(`${frameworkPackageName}/package.json`, {
paths: [process.cwd()],

View File

@ -0,0 +1,8 @@
import { baseGenerator } from '../baseGenerator';
import type { Generator } from '../types';
const generator: Generator = async (packageManager, npmOptions, options) => {
await baseGenerator(packageManager, npmOptions, options, 'solid', {}, 'solid');
};
export default generator;

View File

@ -45,15 +45,33 @@ const getBuilderDetails = (builder: string) => {
const getExternalFramework = (framework: string) =>
externalFrameworks.find(
(exFramework) => exFramework.name === framework || exFramework.packageName === framework
(exFramework) =>
framework !== undefined &&
(exFramework.name === framework ||
exFramework.packageName === framework ||
exFramework?.frameworks?.some?.((item) => item === framework))
);
const getFrameworkPackage = (framework: string, renderer: string, builder: string) => {
const externalFramework = getExternalFramework(framework);
if (externalFramework) {
return externalFramework.packageName;
if (externalFramework === undefined) {
return framework ? `@storybook/${framework}` : `@storybook/${renderer}-${builder}`;
}
return framework ? `@storybook/${framework}` : `@storybook/${renderer}-${builder}`;
if (externalFramework.frameworks !== undefined) {
return externalFramework.frameworks.find((item) => item.match(new RegExp(`-${builder}`)));
}
return externalFramework.packageName;
};
const getRendererPackage = (framework: string, renderer: string) => {
const externalFramework = getExternalFramework(framework);
if (externalFramework !== undefined)
return externalFramework.renderer || externalFramework.packageName;
return `@storybook/${renderer}`;
};
const wrapForPnp = (packageName: string) =>
@ -76,7 +94,7 @@ const getFrameworkDetails = (
const frameworkPackagePath = pnp ? wrapForPnp(frameworkPackage) : frameworkPackage;
const rendererPackage = `@storybook/${renderer}`;
const rendererPackage = getRendererPackage(framework, renderer);
const rendererPackagePath = pnp ? wrapForPnp(rendererPackage) : rendererPackage;
const builderPackage = getBuilderDetails(builder);
@ -89,7 +107,7 @@ const getFrameworkDetails = (
if (isKnownFramework) {
return {
packages: [frameworkPackage],
packages: [rendererPackage, frameworkPackage],
framework: frameworkPackagePath,
rendererId: renderer,
type: 'framework',
@ -114,7 +132,7 @@ const getFrameworkDetails = (
const stripVersions = (addons: string[]) => addons.map((addon) => getPackageDetails(addon)[0]);
const hasInteractiveStories = (rendererId: SupportedRenderers) =>
['react', 'angular', 'preact', 'svelte', 'vue', 'vue3', 'html'].includes(rendererId);
['react', 'angular', 'preact', 'svelte', 'vue', 'vue3', 'html', 'solid'].includes(rendererId);
const hasFrameworkTemplates = (framework?: SupportedFrameworks) =>
['angular', 'nextjs'].includes(framework);
@ -241,9 +259,15 @@ export async function baseGenerator(
await configurePreview({ frameworkPreviewParts, storybookConfigFolder, language });
// FIXME: temporary workaround for https://github.com/storybookjs/storybook/issues/17516
// Vite workaround regex for internal and external frameworks as f.e:
// Internal: @storybook/xxxxx-vite
// External: storybook-xxxxx-vite
if (
frameworkPackages.find(
(pkg) => pkg.match(/^@storybook\/.*-vite$/) || pkg === '@storybook/sveltekit'
(pkg) =>
pkg.match(/^(@storybook\/|storybook).*-vite$/) ||
pkg === '@storybook/sveltekit' ||
pkg === ''
)
) {
const previewHead = dedent`

View File

@ -70,6 +70,46 @@ describe('configureMain', () => {
export default config;"
`);
});
test('should handle resolved paths in pnp', async () => {
await configureMain({
language: SupportedLanguage.JAVASCRIPT,
addons: [
"%%path.dirname(require.resolve(path.join('@storybook/addon-links', 'package.json')))%%",
"%%path.dirname(require.resolve(path.join('@storybook/addon-essentials', 'package.json')))%%",
"%%path.dirname(require.resolve(path.join('@storybook/preset-create-react-app', 'package.json')))%%",
"%%path.dirname(require.resolve(path.join('@storybook/addon-interactions', 'package.json')))%%",
],
storybookConfigFolder: '.storybook',
framework: {
name: "%%path.dirname(require.resolve(path.join('@storybook/react-webpack5', 'package.json')))%%",
},
});
const { calls } = (fse.writeFile as unknown as jest.Mock).mock;
const [mainConfigPath, mainConfigContent] = calls[0];
expect(mainConfigPath).toEqual('./.storybook/main.js');
expect(mainConfigContent).toMatchInlineSnapshot(`
"/** @type { import('@storybook/react-webpack5').StorybookConfig } */
const config = {
\\"stories\\": [
\\"../stories/**/*.mdx\\",
\\"../stories/**/*.stories.@(js|jsx|ts|tsx)\\"
],
\\"addons\\": [
path.dirname(require.resolve(path.join('@storybook/addon-links', 'package.json'))),
path.dirname(require.resolve(path.join('@storybook/addon-essentials', 'package.json'))),
path.dirname(require.resolve(path.join('@storybook/preset-create-react-app', 'package.json'))),
path.dirname(require.resolve(path.join('@storybook/addon-interactions', 'package.json')))
],
\\"framework\\": {
\\"name\\": path.dirname(require.resolve(path.join('@storybook/react-webpack5', 'package.json')))
}
};
export default config;"
`);
});
});
describe('configurePreview', () => {
@ -85,6 +125,9 @@ describe('configurePreview', () => {
expect(previewConfigPath).toEqual('./.storybook/preview.js');
expect(previewConfigContent).toMatchInlineSnapshot(`
"export const parameters = {
backgrounds: {
default: 'light',
},
actions: { argTypesRegex: \\"^on[A-Z].*\\" },
controls: {
matchers: {
@ -108,6 +151,9 @@ describe('configurePreview', () => {
expect(previewConfigPath).toEqual('./.storybook/preview.ts');
expect(previewConfigContent).toMatchInlineSnapshot(`
"export const parameters = {
backgrounds: {
default: 'light',
},
actions: { argTypesRegex: \\"^on[A-Z].*\\" },
controls: {
matchers: {
@ -150,6 +196,9 @@ describe('configurePreview', () => {
import docJson from \\"../documentation.json\\";
setCompodocJson(docJson);
export const parameters = {
backgrounds: {
default: 'light',
},
actions: { argTypesRegex: \\"^on[A-Z].*\\" },
controls: {
matchers: {

View File

@ -30,6 +30,23 @@ interface ConfigurePreviewOptions {
language: SupportedLanguage;
}
const logger = console;
/**
* We need to clean up the paths in case of pnp
* input: "path.dirname(require.resolve(path.join('@storybook/react-webpack5', 'package.json')))"
* output: "@storybook/react-webpack5"
* */
const sanitizeFramework = (framework: string) => {
// extract either @storybook/<framework> or storybook-<framework>
const matches = framework.match(/(@storybook\/\w+(?:-\w+)*)|(storybook-(\w+(?:-\w+)*))/g);
if (!matches) {
return undefined;
}
return matches[0];
};
export async function configureMain({
addons,
extensions = ['js', 'jsx', 'ts', 'tsx'],
@ -47,18 +64,27 @@ export async function configureMain({
const isTypescript =
language === SupportedLanguage.TYPESCRIPT || language === SupportedLanguage.TYPESCRIPT_LEGACY;
const mainConfigTemplate = dedent`<<import>>const config<<type>> = <<mainContents>>;
export default config;`;
let mainConfigTemplate = dedent`<<import>>const config<<type>> = <<mainContents>>;
export default config;`;
const frameworkPackage = sanitizeFramework(custom.framework?.name);
if (!frameworkPackage) {
mainConfigTemplate = mainConfigTemplate.replace('<<import>>', '').replace('<<type>>', '');
logger.warn('Could not find framework package name');
}
const mainJsContents = mainConfigTemplate
.replace(
'<<import>>',
isTypescript
? `import type { StorybookConfig } from '${custom.framework.name}';\n\n`
: `/** @type { import('${custom.framework.name}').StorybookConfig } */\n`
? `import type { StorybookConfig } from '${frameworkPackage}';\n\n`
: `/** @type { import('${frameworkPackage}').StorybookConfig } */\n`
)
.replace('<<type>>', isTypescript ? ': StorybookConfig' : '')
.replace('<<mainContents>>', JSON.stringify(config, null, 2));
.replace('<<mainContents>>', JSON.stringify(config, null, 2))
.replace(/['"]%%/g, '')
.replace(/%%['"]/g, '');
await fse.writeFile(
`./${storybookConfigFolder}/main.${isTypescript ? 'ts' : 'js'}`,
@ -83,6 +109,9 @@ export async function configurePreview(options: ConfigurePreviewOptions) {
const preview = dedent`
${prefix}
export const parameters = {
backgrounds: {
default: 'light',
},
actions: { argTypesRegex: "^on[A-Z].*" },
controls: {
matchers: {

View File

@ -29,6 +29,7 @@ import svelteGenerator from './generators/SVELTE';
import qwikGenerator from './generators/QWIK';
import svelteKitGenerator from './generators/SVELTEKIT';
import raxGenerator from './generators/RAX';
import solidGenerator from './generators/SOLID';
import serverGenerator from './generators/SERVER';
import type { JsPackageManager } from './js-package-manager';
import { JsPackageManagerFactory, useNpmWarning } from './js-package-manager';
@ -206,6 +207,11 @@ const installStorybook = <Project extends ProjectType>(
paddedLog('For more information, please see https://nx.dev/packages/storybook');
return Promise.reject();
case ProjectType.SOLID:
return solidGenerator(packageManager, npmOptions, generatorOptions).then(
commandLog('Adding Storybook support to your "SolidJS" app\n')
);
case ProjectType.UNSUPPORTED:
paddedLog(`We detected a project type that we don't support yet.`);
paddedLog(

View File

@ -16,12 +16,20 @@ function eqMajor(versionRange: string, major: number) {
}
/** A list of all frameworks that are supported, but use a package outside the storybook monorepo */
export const externalFrameworks: { name: SupportedFrameworks; packageName: string }[] = [
export type ExternalFramework = {
name: SupportedFrameworks;
packageName?: string;
frameworks?: string[];
renderer?: string;
};
export const externalFrameworks: ExternalFramework[] = [
{ name: 'qwik', packageName: 'storybook-framework-qwik' },
{ name: 'solid', frameworks: ['storybook-solidjs-vite'], renderer: 'storybook-solidjs' },
];
// Should match @storybook/<framework>
export type SupportedFrameworks = 'nextjs' | 'angular' | 'sveltekit' | 'qwik';
export type SupportedFrameworks = 'nextjs' | 'angular' | 'sveltekit' | 'qwik' | 'solid';
// Should match @storybook/<renderer>
export type SupportedRenderers =
@ -42,7 +50,8 @@ export type SupportedRenderers =
| 'aurelia'
| 'html'
| 'web-components'
| 'server';
| 'server'
| 'solid';
export const SUPPORTED_RENDERERS: SupportedRenderers[] = [
'react',
@ -60,6 +69,7 @@ export const SUPPORTED_RENDERERS: SupportedRenderers[] = [
'qwik',
'rax',
'aurelia',
'solid',
];
export enum ProjectType {
@ -90,6 +100,7 @@ export enum ProjectType {
AURELIA = 'AURELIA',
SERVER = 'SERVER',
NX = 'NX',
SOLID = 'SOLID',
}
export enum CoreBuilder {
@ -285,6 +296,13 @@ export const supportedTemplates: TemplateConfiguration[] = [
return dependencies.every(Boolean);
},
},
{
preset: ProjectType.SOLID,
dependencies: ['solid-js'],
matcherFunction: ({ dependencies }) => {
return dependencies.every(Boolean);
},
},
// DO NOT MOVE ANY TEMPLATES BELOW THIS LINE
// React is part of every Template, after Storybook is initialized once
{

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