diff --git a/CHANGELOG.md b/CHANGELOG.md index 12fb86f2054..7c1b043d781 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,38 @@ +## 5.3.0-beta.3 (November 21, 2019) + +### Features + +* Addon-docs: Rich props table UI ([#8887](https://github.com/storybookjs/storybook/pull/8887)) +* Addon-docs: Improve basic support for Flow props ([#8890](https://github.com/storybookjs/storybook/pull/8890)) +* CLI: Avoid id changes after `storiesof-to-csf` migration ([#8856](https://github.com/storybookjs/storybook/pull/8856)) + +### Bug Fixes + +* Addon-docs: Fix props table for sections props ([#8904](https://github.com/storybookjs/storybook/pull/8904)) +* Addon-docs: Fix Description block when no component provided ([#8902](https://github.com/storybookjs/storybook/pull/8902)) +* Angular: Fix project without `architect.build` option ([#6737](https://github.com/storybookjs/storybook/pull/6737)) + +### Maintenance + +* Addon-docs: Docgen lib maintenance ([#8896](https://github.com/storybookjs/storybook/pull/8896)) +* Examples: Fix stories glob in official-storybook ([#8888](https://github.com/storybookjs/storybook/pull/8888)) + +## 5.3.0-beta.2 (November 19, 2019) + +### Features + +* Addon-docs: Customizable DocPage doc blocks ([#8855](https://github.com/storybookjs/storybook/pull/8855)) + +### Bug Fixes + +* Addon-docs: Add back Props "exclude" support ([#8868](https://github.com/storybookjs/storybook/pull/8868)) +* Addon-docs: Fix MDX component permalinking ([#8872](https://github.com/storybookjs/storybook/pull/8872)) +* Addon-docs: Fix regression to @ignore in Props ([#8867](https://github.com/storybookjs/storybook/pull/8867)) + +### Maintenance + +* Addon-docs: Add tests for prop types default value ([#8869](https://github.com/storybookjs/storybook/pull/8869)) + ## 5.3.0-beta.1 (November 18, 2019) ### Features diff --git a/MIGRATION.md b/MIGRATION.md index ffec720be0e..93f7f54e39a 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -7,7 +7,7 @@ - [React Native Async Storage](#react-native-async-storage) - [Deprecate displayName parameter](#deprecate-displayname-parameter) - [Unified docs preset](#unified-docs-preset) - - [Simplified hierarchy separators](#simplified-heirarchy-separators) + - [Simplified hierarchy separators](#simplified-hierarchy-separators) - [From version 5.1.x to 5.2.x](#from-version-51x-to-52x) - [Source-loader](#source-loader) - [Default viewports](#default-viewports) @@ -125,15 +125,19 @@ Addon-docs configuration gets simpler in 5.3. In 5.2, each framework had its own We've deprecated the ability to specify the hierarchy separators (how you control the grouping of story kinds in the sidebar). From Storybook 6.0 we will have a single separator `/`, which cannot be configured. -If you are currently using using custom separators, we encourage you to migrate to using `/` as the sole separator. If you are using `|` or `.` as a separator currently, (we will soon provide) a codemod that can be used to rename all your components. +If you are currently using using custom separators, we encourage you to migrate to using `/` as the sole separator. If you are using `|` or `.` as a separator currently, we provide a codemod, [`upgrade-hierarchy-separators`](https://github.com/storybookjs/storybook/blob/next/lib/codemod/README.md#upgrade-hierarchy-separators), that can be used to rename all your components. -If you were using `|` and wish to keep the "root" behaviour, use the `showRoots: true` option to re-enable roots: +``` +yarn sb migrate upgrade-hierarchy-separators --glob="*.stories.js" +``` + +If you were using `|` and wish to keep the "root" behavior, use the `showRoots: true` option to re-enable roots: ```js addParameters({ options: { showRoots: true } }); ``` -NOTE: it is no longer possible to have some stories with roots and others without. If you want to keep the old behaviour, simply add a root called "Others" to all your previously unrooted stories. +NOTE: it is no longer possible to have some stories with roots and others without. If you want to keep the old behavior, simply add a root called "Others" to all your previously unrooted stories. ## From version 5.1.x to 5.2.x diff --git a/addons/a11y/package.json b/addons/a11y/package.json index 41851e7aaba..5cb29ea637f 100644 --- a/addons/a11y/package.json +++ b/addons/a11y/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-a11y", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "a11y addon for storybook", "keywords": [ "a11y", @@ -33,12 +33,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "axe-core": "^3.3.2", "core-js": "^3.0.1", "global": "^4.3.2", diff --git a/addons/actions/package.json b/addons/actions/package.json index c600786ad8c..9e8126099b0 100644 --- a/addons/actions/package.json +++ b/addons/actions/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-actions", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Action Logger addon for storybook", "keywords": [ "storybook" @@ -28,12 +28,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-api": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-api": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "fast-deep-equal": "^2.0.1", "global": "^4.3.2", diff --git a/addons/backgrounds/package.json b/addons/backgrounds/package.json index d1d825f7062..eedae0c4f1a 100644 --- a/addons/backgrounds/package.json +++ b/addons/backgrounds/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-backgrounds", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "A storybook addon to show different backgrounds for your preview", "keywords": [ "addon", @@ -32,12 +32,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "memoizerific": "^1.11.3", "react": "^16.8.3", diff --git a/addons/centered/package.json b/addons/centered/package.json index d126aded4e7..40664e345a6 100644 --- a/addons/centered/package.json +++ b/addons/centered/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-centered", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook decorator to center components", "keywords": [ "addon", @@ -29,7 +29,7 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "util-deprecate": "^1.0.2" diff --git a/addons/contexts/package.json b/addons/contexts/package.json index c3c21e15e4f..dfa34b63be2 100644 --- a/addons/contexts/package.json +++ b/addons/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-contexts", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook Addon Contexts", "keywords": [ "preact", @@ -27,10 +27,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "qs": "^6.6.0" diff --git a/addons/cssresources/package.json b/addons/cssresources/package.json index 1c908335c99..60848876673 100644 --- a/addons/cssresources/package.json +++ b/addons/cssresources/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-cssresources", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "A storybook addon to switch between css resources at runtime for your story", "keywords": [ "addon", @@ -32,10 +32,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "react": "^16.8.3" diff --git a/addons/design-assets/package.json b/addons/design-assets/package.json index c95800fcc1f..a24dc1d80da 100644 --- a/addons/design-assets/package.json +++ b/addons/design-assets/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-design-assets", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Design asset preview for storybook", "keywords": [ "addon", @@ -34,12 +34,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "react": "^16.8.3", diff --git a/addons/docs/docs/docspage.md b/addons/docs/docs/docspage.md index 5e286be9ee4..63026cafc48 100644 --- a/addons/docs/docs/docspage.md +++ b/addons/docs/docs/docspage.md @@ -8,6 +8,7 @@ When you install [Storybook Docs](../README.md), `DocsPage` is the zero-config d - [Motivation](#motivation) - [Component parameter](#component-parameter) +- [Subcomponents parameter](#subcomponents-parameter) - [DocsPage slots](#docspage-slots) - [Replacing DocsPage](#replacing-docspage) - [Story file names](#story-file-names) @@ -54,6 +55,26 @@ storiesOf('Path/to/Badge', module).addParameters({ component: Badge }); If you're coming from the `storiesOf` format, there's [a codemod that adds it for you](https://github.com/storybookjs/storybook/blob/next/lib/codemod/README.md#add-component-parameters). +## Subcomponents parameter + +Sometimes it's useful to document multiple components on the same page. For example, suppose your component library contains `List` and `ListItem` components that don't make sense without one another. `DocsPage` has the concept of a "primary" component with the [`component` parameter](#component-parameter), and can also accept one or more "subcomponents": + +```js +import { List, ListHeading, ListItem } from './List'; + +export default { + title: 'Path/to/List', + component: List, + subcomponents: { ListHeading, ListItem }, +}; +``` + +Subcomponent prop tables will show up in a tabbed interface along with the primary component, and the tab titles will correspond to the keys of the `subcomponents` object. + + + +If you want organize your documentation differently for groups of components, we recommend trying [MDX](./mdx.md) which is completely flexible to support any configuration. + ## DocsPage slots `DocsPage` is organized into a series of "slots" including Title, Subtitle, Description, Props, and Story. Each of these slots pulls information from your project and formats it for the screen. diff --git a/addons/docs/docs/media/docspage-subcomponents.png b/addons/docs/docs/media/docspage-subcomponents.png new file mode 100644 index 00000000000..86d001556ff Binary files /dev/null and b/addons/docs/docs/media/docspage-subcomponents.png differ diff --git a/addons/docs/docs/multiframework.md b/addons/docs/docs/multiframework.md index e5994b7c14a..26d2f7da670 100644 --- a/addons/docs/docs/multiframework.md +++ b/addons/docs/docs/multiframework.md @@ -1,45 +1,36 @@ # Storybook Docs framework dev guide -Storybook Docs [provides basic support for all non-RN Storybook view layers](../README.md#framework-support) out of the box. However, some frameworks have been docs-optimized, adding features like automatic props table generation and inline story rendering. This document is a dev guide for how to set up a new framework in docs. +Storybook Docs [provides basic support for all non-RN Storybook view layers](../README.md#framework-support) out of the box. However, some frameworks have been docs-optimized, adding features like automatic props table generation and inline story rendering. This document is a dev guide for how to optimize a new framework in docs. -- [Adding a preset](#adding-a-preset) +- [Framework-specific configuration](#framework-specific-configuration) - [Props tables](#props-tables) - [Component descriptions](#component-descriptions) - [Inline story rendering](#inline-story-rendering) -## Adding a preset +## Framework-specific configuration -To get basic support, you need to add a [preset](https://storybook.js.org/docs/presets/introduction). By default this doesn't need to do much. +Your framework might need framework-specific configuration. This could include adding extra webpack loaders or global decorators/story parameters. -Here's a basic preset for `@storybook/html` in `addons/docs/html/preset.js`: +Addon-docs handles this kind of customization by file naming convention. Its [common preset](https://github.com/storybookjs/storybook/blob/next/addons/docs/src/frameworks/common/preset.ts) does this by looking for files `..//{preset,config}.[tj]sx?`, where `` is the framework identifier, e.g. `vue`, `angular`, `react`, etc. -```js -module.exports = require('../dist/frameworks/common/makePreset').default('html'); +For example, consider Storybook Docs for Vue, which needs `vue-docgen-loader` in its webpack config, and also has custom extraction functions for [props tables](#props-tables) and [component descriptions](#component-descriptions). + +For webpack configuration, Docs for Vue defines [preset.ts](https://github.com/storybookjs/storybook/blob/next/addons/docs/src/frameworks/vue/preset.ts), which follows the [preset](https://storybook.js.org/docs/presets/introduction) file structure: + +``` +export function webpack(webpackConfig: any = {}, options: any = {}) { + webpackConfig.module.rules.push({ + test: /\.vue$/, + loader: 'vue-docgen-loader', + enforce: 'post', + }); + return webpackConfig; +} ``` -This automatically adds [DocsPage](./docspage.md) for each story, as well as webpack/babel settings for MDX support. +This appends `vue-docgen-loader` to the existing configuration, which at this point will also include modifications made by the common preset. -There is also a little hoop-jumping that will hopefully be unnecessary soon. - -`addons/docs/src/frameworks/html/config.js` - -```js -import { addParameters } from '@storybook/html'; -import { DocsPage, DocsContainer } from '@storybook/addon-docs/blocks'; - -addParameters({ - docs: { - container: DocsContainer, - page: DocsPage, - }, -}); -``` - -`addons/docs/html/config.js` - -```js -module.exports = require('../dist/frameworks/html/config'); -``` +For props tables and descriptions, both of which are described in more detail below, it defines a file [config.tsx](https://github.com/storybookjs/storybook/blob/next/addons/docs/src/frameworks/vue/config.tsx). ## Props tables diff --git a/addons/docs/package.json b/addons/docs/package.json index 65c5e9dee0b..41764c77950 100644 --- a/addons/docs/package.json +++ b/addons/docs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-docs", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Superior documentation for your components", "keywords": [ "addon", @@ -45,13 +45,13 @@ "@mdx-js/loader": "^1.1.0", "@mdx-js/mdx": "^1.1.0", "@mdx-js/react": "^1.0.27", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/postinstall": "5.3.0-beta.1", - "@storybook/router": "5.3.0-beta.1", - "@storybook/source-loader": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/postinstall": "5.3.0-beta.3", + "@storybook/router": "5.3.0-beta.3", + "@storybook/source-loader": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "acorn": "^7.1.0", "acorn-jsx": "^5.1.0", "acorn-walk": "^7.0.0", diff --git a/addons/docs/src/blocks/Description.tsx b/addons/docs/src/blocks/Description.tsx index c242d4327d8..ce34756634c 100644 --- a/addons/docs/src/blocks/Description.tsx +++ b/addons/docs/src/blocks/Description.tsx @@ -1,8 +1,8 @@ -import React, { FunctionComponent } from 'react'; +import React, { FunctionComponent, useContext } from 'react'; import { Description, DescriptionProps as PureDescriptionProps } from '@storybook/components'; import { DocsContext, DocsContextProps } from './DocsContext'; -import { Component, CURRENT_SELECTION } from './shared'; -import { str } from '../lib/docgen/utils'; +import { Component, CURRENT_SELECTION, DescriptionSlot } from './shared'; +import { str } from '../lib/docgen'; export enum DescriptionType { INFO = 'info', @@ -16,9 +16,11 @@ type Notes = string | any; type Info = string | any; interface DescriptionProps { + slot?: DescriptionSlot; of?: '.' | Component; type?: DescriptionType; markdown?: string; + children?: string; } const getNotes = (notes?: Notes) => @@ -29,11 +31,11 @@ const getInfo = (info?: Info) => info && (typeof info === 'string' ? info : str( const noDescription = (component?: Component): string | null => null; export const getDescriptionProps = ( - { of, type, markdown }: DescriptionProps, + { of, type, markdown, children }: DescriptionProps, { parameters }: DocsContextProps ): PureDescriptionProps => { - if (markdown) { - return { markdown }; + if (children || markdown) { + return { markdown: children || markdown }; } const { component, notes, info, docs } = parameters; const { extractComponentDescription = noDescription } = docs || {}; @@ -59,13 +61,19 @@ ${extractComponentDescription(target) || ''} } }; -const DescriptionContainer: FunctionComponent = props => ( - - {context => { - const { markdown } = getDescriptionProps(props, context); - return markdown && ; - }} - -); +const DescriptionContainer: FunctionComponent = props => { + const context = useContext(DocsContext); + const { slot } = props; + let { markdown } = getDescriptionProps(props, context); + if (slot) { + markdown = slot(markdown, context); + } + return markdown ? : null; +}; + +// since we are in the docs blocks, assume default description if for primary component story +DescriptionContainer.defaultProps = { + of: '.', +}; export { DescriptionContainer as Description }; diff --git a/addons/docs/src/blocks/DocsPage.test.ts b/addons/docs/src/blocks/DocsPage.test.ts index af743cf4e15..11294b76bb7 100644 --- a/addons/docs/src/blocks/DocsPage.test.ts +++ b/addons/docs/src/blocks/DocsPage.test.ts @@ -1,4 +1,4 @@ -import { defaultTitleSlot } from './DocsPage'; +import { defaultTitleSlot } from './Title'; describe('defaultTitleSlot', () => { it('showRoots', () => { diff --git a/addons/docs/src/blocks/DocsPage.tsx b/addons/docs/src/blocks/DocsPage.tsx index 63ad8749954..a19a7038867 100644 --- a/addons/docs/src/blocks/DocsPage.tsx +++ b/addons/docs/src/blocks/DocsPage.tsx @@ -1,153 +1,26 @@ import React, { FunctionComponent } from 'react'; - -import { parseKind } from '@storybook/router'; -import { DocsPage as PureDocsPage, PropsTable, PropsTableProps } from '@storybook/components'; -import { H2, H3 } from '@storybook/components/html'; -import { DocsContext } from './DocsContext'; +import { DocsPageProps } from './shared'; +import { Title } from './Title'; +import { Subtitle } from './Subtitle'; import { Description } from './Description'; -import { Story } from './Story'; -import { Preview } from './Preview'; -import { Anchor } from './Anchor'; -import { getPropsTableProps } from './Props'; - -export interface SlotContext { - id?: string; - selectedKind?: string; - selectedStory?: string; - parameters?: any; - storyStore?: any; -} - -export type StringSlot = (context: SlotContext) => string | void; -export type PropsSlot = (context: SlotContext) => PropsTableProps | void; -export type StorySlot = (stories: StoryData[], context: SlotContext) => DocsStoryProps | void; -export type StoriesSlot = (stories: StoryData[], context: SlotContext) => DocsStoryProps[] | void; - -export interface DocsPageProps { - titleSlot: StringSlot; - subtitleSlot: StringSlot; - descriptionSlot: StringSlot; - primarySlot: StorySlot; - propsSlot: PropsSlot; - storiesSlot: StoriesSlot; -} - -interface DocsStoryProps { - id: string; - name: string; - expanded?: boolean; - withToolbar?: boolean; - parameters?: any; -} - -interface StoryData { - id: string; - kind: string; - name: string; - parameters?: any; -} - -export const defaultTitleSlot: StringSlot = ({ selectedKind, parameters }) => { - const { - showRoots, - hierarchyRootSeparator: rootSeparator, - hierarchySeparator: groupSeparator, - } = (parameters && parameters.options) || { - showRoots: undefined, - hierarchyRootSeparator: '|', - hierarchySeparator: /\/|\./, - }; - - let groups; - if (typeof showRoots !== 'undefined') { - groups = selectedKind.split('/'); - } else { - // This covers off all the remaining cases: - // - If the separators were set above, we should use them - // - If they weren't set, we should only should use the old defaults if the kind contains '.' or '|', - // which for this particular splitting is the only case in which it actually matters. - ({ groups } = parseKind(selectedKind, { rootSeparator, groupSeparator })); - } - - return (groups && groups[groups.length - 1]) || selectedKind; -}; - -const defaultSubtitleSlot: StringSlot = ({ parameters }) => - parameters && parameters.componentSubtitle; - -const defaultPropsSlot: PropsSlot = context => getPropsTableProps({ of: '.' }, context); - -const defaultDescriptionSlot: StringSlot = ({ parameters }) => { - const { component, docs } = parameters; - if (!component) { - return null; - } - const { extractComponentDescription } = docs || {}; - return extractComponentDescription && extractComponentDescription(component, parameters); -}; - -const defaultPrimarySlot: StorySlot = stories => stories && stories[0]; -const defaultStoriesSlot: StoriesSlot = stories => { - if (stories && stories.length > 1) { - const [first, ...rest] = stories; - return rest; - } - return null; -}; - -const StoriesHeading = H2; -const StoryHeading = H3; - -const DocsStory: FunctionComponent = ({ - id, - name, - expanded = true, - withToolbar = false, - parameters, -}) => ( - - {expanded && {name}} - {expanded && parameters && parameters.docs && parameters.docs.storyDescription && ( - - )} - - - - -); +import { Primary } from './Primary'; +import { Props } from './Props'; +import { Stories } from './Stories'; export const DocsPage: FunctionComponent = ({ - titleSlot = defaultTitleSlot, - subtitleSlot = defaultSubtitleSlot, - descriptionSlot = defaultDescriptionSlot, - primarySlot = defaultPrimarySlot, - propsSlot = defaultPropsSlot, - storiesSlot = defaultStoriesSlot, + titleSlot, + subtitleSlot, + descriptionSlot, + primarySlot, + propsSlot, + storiesSlot, }) => ( - - {context => { - const title = titleSlot(context) || ''; - const subtitle = subtitleSlot(context) || ''; - const description = descriptionSlot(context) || ''; - const propsTableProps = propsSlot(context); - - const { selectedKind, storyStore } = context; - const componentStories = storyStore - .getStoriesForKind(selectedKind) - .filter((s: any) => !(s.parameters && s.parameters.docs && s.parameters.docs.disable)); - const primary = primarySlot(componentStories, context); - const stories = storiesSlot(componentStories, context); - - return ( - - - {primary && } - {propsTableProps && } - {stories && stories.length > 0 && Stories} - {stories && - stories.map(story => story && )} - - ); - }} - + <> + + <Subtitle slot={subtitleSlot} /> + <Description slot={descriptionSlot} /> + <Primary slot={primarySlot} /> + <Props slot={propsSlot} /> + <Stories slot={storiesSlot} /> + </> ); diff --git a/addons/docs/src/blocks/DocsStory.tsx b/addons/docs/src/blocks/DocsStory.tsx new file mode 100644 index 00000000000..ca6640ad183 --- /dev/null +++ b/addons/docs/src/blocks/DocsStory.tsx @@ -0,0 +1,25 @@ +import React, { FunctionComponent } from 'react'; +import { Subheading } from './Subheading'; +import { DocsStoryProps } from './shared'; +import { Anchor } from './Anchor'; +import { Description } from './Description'; +import { Story } from './Story'; +import { Preview } from './Preview'; + +export const DocsStory: FunctionComponent<DocsStoryProps> = ({ + id, + name, + expanded = true, + withToolbar = false, + parameters, +}) => ( + <Anchor storyId={id}> + {expanded && <Subheading>{name}</Subheading>} + {expanded && parameters && parameters.docs && parameters.docs.storyDescription && ( + <Description markdown={parameters.docs.storyDescription} /> + )} + <Preview withToolbar={withToolbar}> + <Story id={id} /> + </Preview> + </Anchor> +); diff --git a/addons/docs/src/blocks/Heading.tsx b/addons/docs/src/blocks/Heading.tsx new file mode 100644 index 00000000000..13aefc91fe6 --- /dev/null +++ b/addons/docs/src/blocks/Heading.tsx @@ -0,0 +1,7 @@ +import React, { FunctionComponent } from 'react'; +import { H2 } from '@storybook/components/html'; + +interface HeadingProps { + children: JSX.Element | string; +} +export const Heading: FunctionComponent<HeadingProps> = ({ children }) => <H2>{children}</H2>; diff --git a/addons/docs/src/blocks/Primary.tsx b/addons/docs/src/blocks/Primary.tsx new file mode 100644 index 00000000000..fe2b764fcaa --- /dev/null +++ b/addons/docs/src/blocks/Primary.tsx @@ -0,0 +1,16 @@ +import React, { useContext, FunctionComponent } from 'react'; +import { DocsContext } from './DocsContext'; +import { DocsStory } from './DocsStory'; +import { getDocsStories } from './utils'; +import { StorySlot } from './shared'; + +interface PrimaryProps { + slot?: StorySlot; +} + +export const Primary: FunctionComponent<PrimaryProps> = ({ slot }) => { + const context = useContext(DocsContext); + const componentStories = getDocsStories(context); + const story = slot ? slot(componentStories, context) : componentStories && componentStories[0]; + return story ? <DocsStory {...story} expanded={false} withToolbar /> : null; +}; diff --git a/addons/docs/src/blocks/Props.tsx b/addons/docs/src/blocks/Props.tsx index c5794f78c44..21a4d573852 100644 --- a/addons/docs/src/blocks/Props.tsx +++ b/addons/docs/src/blocks/Props.tsx @@ -1,7 +1,18 @@ -import React, { FunctionComponent } from 'react'; -import { PropsTable, PropsTableError, PropsTableProps } from '@storybook/components'; +import React, { FunctionComponent, useContext } from 'react'; +import { isNil } from 'lodash'; + +import { + PropsTable, + PropsTableError, + PropsTableProps, + PropsTableRowsProps, + PropsTableSectionsProps, + PropDef, + TabsState, +} from '@storybook/components'; import { DocsContext, DocsContextProps } from './DocsContext'; -import { Component, CURRENT_SELECTION } from './shared'; +import { Component, PropsSlot, CURRENT_SELECTION } from './shared'; +import { getComponentName } from './utils'; import { PropsExtractor } from '../lib/docgen/types'; import { extractProps as reactExtractProps } from '../frameworks/react/extractProps'; @@ -9,7 +20,11 @@ import { extractProps as vueExtractProps } from '../frameworks/vue/extractProps' interface PropsProps { exclude?: string[]; - of: '.' | Component; + of?: '.' | Component; + components?: { + [label: string]: Component; + }; + slot?: PropsSlot; } // FIXME: remove in SB6.0 & require config @@ -24,36 +39,109 @@ const inferPropsExtractor = (framework: string): PropsExtractor | null => { } }; -export const getPropsTableProps = ( - { exclude, of }: PropsProps, +const filterRows = (rows: PropDef[], exclude: string[]) => + rows && rows.filter((row: PropDef) => !exclude.includes(row.name)); + +export const getComponentProps = ( + component: Component, + { exclude }: PropsProps, { parameters }: DocsContextProps ): PropsTableProps => { + if (!component) { + return null; + } try { const params = parameters || {}; - const { component, framework = null } = params; + const { framework = null } = params; - const target = of === CURRENT_SELECTION ? component : of; - if (!target) { - throw new Error(PropsTableError.NO_COMPONENT); - } - - const { extractProps = inferPropsExtractor(framework) } = params.docs || {}; + const { extractProps = inferPropsExtractor(framework) }: { extractProps: PropsExtractor } = + params.docs || {}; if (!extractProps) { throw new Error(PropsTableError.PROPS_UNSUPPORTED); } - return extractProps(target, { exclude }); + let props = extractProps(component); + if (!isNil(exclude)) { + const { rows } = props as PropsTableRowsProps; + const { sections } = props as PropsTableSectionsProps; + if (rows) { + props = { rows: filterRows(rows, exclude) }; + } else if (sections) { + Object.keys(sections).forEach(section => { + sections[section] = filterRows(sections[section], exclude); + }); + } + } + + return props; } catch (err) { return { error: err.message }; } }; -const PropsContainer: FunctionComponent<PropsProps> = props => ( - <DocsContext.Consumer> - {context => { - const propsTableProps = getPropsTableProps(props, context); - return <PropsTable {...propsTableProps} />; - }} - </DocsContext.Consumer> -); +export const getComponent = (props: PropsProps = {}, context: DocsContextProps): Component => { + const { of } = props; + const { parameters = {} } = context; + const { component } = parameters; + + const target = of === CURRENT_SELECTION ? component : of; + if (!target) { + if (of === CURRENT_SELECTION) { + return null; + } + throw new Error(PropsTableError.NO_COMPONENT); + } + return target; +}; + +const PropsContainer: FunctionComponent<PropsProps> = props => { + const context = useContext(DocsContext); + const { slot, components } = props; + const { + parameters: { subcomponents }, + } = context; + + let allComponents = components; + if (!allComponents) { + const main = getComponent(props, context); + const mainLabel = getComponentName(main); + const mainProps = slot ? slot(context, main) : getComponentProps(main, props, context); + + if (!subcomponents || typeof subcomponents !== 'object') { + return mainProps && <PropsTable {...mainProps} />; + } + + allComponents = { [mainLabel]: main, ...subcomponents }; + } + + const tabs: { label: string; table: PropsTableProps }[] = []; + Object.entries(allComponents).forEach(([label, component]) => { + tabs.push({ + label, + table: slot ? slot(context, component) : getComponentProps(component, props, context), + }); + }); + + return ( + <TabsState> + {tabs.map(({ label, table }) => { + if (!table) { + return null; + } + const id = `prop_table_div_${label}`; + return ( + <div key={id} id={id} title={label}> + {({ active }: { active: boolean }) => + active ? <PropsTable key={`prop_table_${label}`} {...table} /> : null + } + </div> + ); + })} + </TabsState> + ); +}; + +PropsContainer.defaultProps = { + of: '.', +}; export { PropsContainer as Props }; diff --git a/addons/docs/src/blocks/Stories.tsx b/addons/docs/src/blocks/Stories.tsx new file mode 100644 index 00000000000..c1b585e82db --- /dev/null +++ b/addons/docs/src/blocks/Stories.tsx @@ -0,0 +1,33 @@ +import React, { useContext, FunctionComponent } from 'react'; +import { DocsContext } from './DocsContext'; +import { DocsStory } from './DocsStory'; +import { Heading } from './Heading'; +import { getDocsStories } from './utils'; +import { StoriesSlot, DocsStoryProps } from './shared'; + +interface StoriesProps { + slot?: StoriesSlot; + title?: JSX.Element | string; +} + +export const Stories: FunctionComponent<StoriesProps> = ({ slot, title }) => { + const context = useContext(DocsContext); + const componentStories = getDocsStories(context); + + const stories: DocsStoryProps[] = slot + ? slot(componentStories, context) + : componentStories && componentStories.slice(1); + if (!stories) { + return null; + } + return ( + <> + <Heading>{title}</Heading> + {stories.map(story => story && <DocsStory key={story.id} {...story} expanded />)} + </> + ); +}; + +Stories.defaultProps = { + title: 'Stories', +}; diff --git a/addons/docs/src/blocks/Subheading.tsx b/addons/docs/src/blocks/Subheading.tsx new file mode 100644 index 00000000000..0cda996ffc2 --- /dev/null +++ b/addons/docs/src/blocks/Subheading.tsx @@ -0,0 +1,7 @@ +import React, { FunctionComponent } from 'react'; +import { H3 } from '@storybook/components/html'; + +interface SubheadingProps { + children: JSX.Element | string; +} +export const Subheading: FunctionComponent<SubheadingProps> = ({ children }) => <H3>{children}</H3>; diff --git a/addons/docs/src/blocks/Subtitle.tsx b/addons/docs/src/blocks/Subtitle.tsx new file mode 100644 index 00000000000..595bac6452f --- /dev/null +++ b/addons/docs/src/blocks/Subtitle.tsx @@ -0,0 +1,19 @@ +import React, { useContext, FunctionComponent } from 'react'; +import { Subtitle as PureSubtitle } from '@storybook/components'; +import { DocsContext } from './DocsContext'; +import { StringSlot } from './shared'; + +interface SubtitleProps { + slot?: StringSlot; + children?: JSX.Element | string; +} + +export const Subtitle: FunctionComponent<SubtitleProps> = ({ slot, children }) => { + const context = useContext(DocsContext); + const { parameters } = context; + let text: JSX.Element | string = children; + if (!text) { + text = slot ? slot(context) : parameters && parameters.componentSubtitle; + } + return text ? <PureSubtitle className="sbdocs-subtitle">{text}</PureSubtitle> : null; +}; diff --git a/addons/docs/src/blocks/Title.tsx b/addons/docs/src/blocks/Title.tsx new file mode 100644 index 00000000000..a670600d6e2 --- /dev/null +++ b/addons/docs/src/blocks/Title.tsx @@ -0,0 +1,48 @@ +import React, { useContext, FunctionComponent } from 'react'; +import { parseKind } from '@storybook/router'; +import { Title as PureTitle } from '@storybook/components'; +import { DocsContext } from './DocsContext'; +import { StringSlot } from './shared'; + +interface TitleProps { + slot?: StringSlot; + children?: JSX.Element | string; +} +export const defaultTitleSlot: StringSlot = ({ selectedKind, parameters }) => { + const { + showRoots, + hierarchyRootSeparator: rootSeparator, + hierarchySeparator: groupSeparator, + } = (parameters && parameters.options) || { + showRoots: undefined, + hierarchyRootSeparator: '|', + hierarchySeparator: /\/|\./, + }; + + let groups; + if (typeof showRoots !== 'undefined') { + groups = selectedKind.split('/'); + } else { + // This covers off all the remaining cases: + // - If the separators were set above, we should use them + // - If they weren't set, we should only should use the old defaults if the kind contains '.' or '|', + // which for this particular splitting is the only case in which it actually matters. + ({ groups } = parseKind(selectedKind, { rootSeparator, groupSeparator })); + } + + return (groups && groups[groups.length - 1]) || selectedKind; +}; + +export const Title: FunctionComponent<TitleProps> = ({ slot, children }) => { + const context = useContext(DocsContext); + const { selectedKind, parameters } = context; + let text: JSX.Element | string = children; + if (!text) { + if (slot) { + text = slot(context); + } else { + text = defaultTitleSlot({ selectedKind, parameters }); + } + } + return text ? <PureTitle className="sbdocs-title">{text}</PureTitle> : null; +}; diff --git a/addons/docs/src/blocks/index.ts b/addons/docs/src/blocks/index.ts index 4e68cf50276..e4afb011602 100644 --- a/addons/docs/src/blocks/index.ts +++ b/addons/docs/src/blocks/index.ts @@ -5,12 +5,21 @@ export * from './Description'; export * from './DocsContext'; export * from './DocsPage'; export * from './DocsContainer'; +export * from './DocsStory'; +export * from './Heading'; export * from './Meta'; export * from './Preview'; +export * from './Primary'; export * from './Props'; export * from './Source'; +export * from './Stories'; export * from './Story'; +export * from './Subheading'; +export * from './Subtitle'; +export * from './Title'; export * from './Wrapper'; +export * from './shared'; + // helper function for MDX export const makeStoryFn = (val: any) => (typeof val === 'function' ? val : () => val); diff --git a/addons/docs/src/blocks/shared.ts b/addons/docs/src/blocks/shared.ts index 61d2a7f93f5..baab2861c30 100644 --- a/addons/docs/src/blocks/shared.ts +++ b/addons/docs/src/blocks/shared.ts @@ -1,2 +1,41 @@ +import { PropsTableProps } from '@storybook/components'; + export const CURRENT_SELECTION = '.'; + export type Component = any; + +export interface StoryData { + id?: string; + kind?: string; + name?: string; + parameters?: any; +} + +export type DocsStoryProps = StoryData & { + expanded?: boolean; + withToolbar?: boolean; +}; + +export interface SlotContext { + id?: string; + selectedKind?: string; + selectedStory?: string; + parameters?: any; + storyStore?: any; +} + +export type StringSlot = (context: SlotContext) => string; +export type DescriptionSlot = (description: string, context: SlotContext) => string; +export type PropsSlot = (context: SlotContext, component: Component) => PropsTableProps; +export type StorySlot = (stories: StoryData[], context: SlotContext) => DocsStoryProps; + +export type StoriesSlot = (stories: StoryData[], context: SlotContext) => DocsStoryProps[]; + +export interface DocsPageProps { + titleSlot?: StringSlot; + subtitleSlot?: StringSlot; + descriptionSlot?: DescriptionSlot; + primarySlot?: StorySlot; + propsSlot?: PropsSlot; + storiesSlot?: StoriesSlot; +} diff --git a/addons/docs/src/blocks/utils.ts b/addons/docs/src/blocks/utils.ts new file mode 100644 index 00000000000..316c6bae4a9 --- /dev/null +++ b/addons/docs/src/blocks/utils.ts @@ -0,0 +1,34 @@ +/* eslint-disable no-underscore-dangle */ +import { DocsContextProps } from './DocsContext'; +import { StoryData, Component } from './shared'; + +export const getDocsStories = (context: DocsContextProps): StoryData[] => { + const { storyStore, selectedKind } = context; + return storyStore + .getStoriesForKind(selectedKind) + .filter((s: any) => !(s.parameters && s.parameters.docs && s.parameters.docs.disable)); +}; + +const titleCase = (str: string): string => + str + .split('-') + .map(part => part.charAt(0).toUpperCase() + part.slice(1)) + .join(''); + +export const getComponentName = (component: Component): string => { + if (!component) { + return undefined; + } + + if (typeof component === 'string') { + if (component.includes('-')) { + return titleCase(component); + } + return component; + } + if (component.__docgenInfo && component.__docgenInfo.displayName) { + return component.__docgenInfo.displayName; + } + + return component.name; +}; diff --git a/addons/docs/src/frameworks/common/index.ts b/addons/docs/src/frameworks/common/index.ts deleted file mode 100644 index 3de17860d84..00000000000 --- a/addons/docs/src/frameworks/common/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '../../lib/docgen'; diff --git a/addons/docs/src/frameworks/react/extractProps.ts b/addons/docs/src/frameworks/react/extractProps.ts index 73a2e116ad9..5d0e9f6c6ad 100644 --- a/addons/docs/src/frameworks/react/extractProps.ts +++ b/addons/docs/src/frameworks/react/extractProps.ts @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { isForwardRef, isMemo } from 'react-is'; import { PropDef } from '@storybook/components'; -import { hasDocgen, extractPropsFromDocgen, PropsExtractor, TypeSystem } from '../../lib/docgen'; +import { hasDocgen, extractComponentProps, PropsExtractor, TypeSystem } from '../../lib/docgen'; import { Component } from '../../blocks/shared'; import { enhancePropTypesProps } from './propTypes/handleProp'; @@ -32,7 +32,7 @@ function getPropDefs(component: Component, section: string): PropDef[] { } } - const extractedProps = extractPropsFromDocgen(processedComponent, section); + const extractedProps = extractComponentProps(processedComponent, section); if (extractedProps.length === 0) { return []; } diff --git a/addons/docs/src/frameworks/react/propTypes/createDefaultValue.ts b/addons/docs/src/frameworks/react/propTypes/createDefaultValue.ts index 3ca17796955..db593b8b49f 100644 --- a/addons/docs/src/frameworks/react/propTypes/createDefaultValue.ts +++ b/addons/docs/src/frameworks/react/propTypes/createDefaultValue.ts @@ -1,6 +1,6 @@ import { isNil } from 'lodash'; // @ts-ignore -import { PropDefaultValue, PropSummaryValue } from '@storybook/components'; +import { PropDefaultValue } from '@storybook/components'; import { inspectValue } from '../inspection/inspectValue'; import { OBJECT_CAPTION, FUNCTION_CAPTION, ELEMENT_CAPTION, ARRAY_CAPTION } from './captions'; import { generateCode } from './generateCode'; @@ -11,12 +11,7 @@ import { InspectionElement, } from '../inspection/types'; import { isHtmlTag } from './isHtmlTag'; - -const MAX_SUMMARY_LENGTH = 50; - -function isTooLongForSummary(value: string): boolean { - return value.length > MAX_SUMMARY_LENGTH; -} +import { createSummaryValue, isTooLongForDefaultValueSummary } from '../../../lib'; // TODO: Fix this any type. function getPrettyIdentifier(inferedType: any): string { @@ -32,10 +27,6 @@ function getPrettyIdentifier(inferedType: any): string { } } -function createSummaryValue(summary: string, detail?: string): PropSummaryValue { - return { summary, detail }; -} - function generateObject({ ast }: InspectionResult): PropDefaultValue { let prettyCaption = generateCode(ast, true); @@ -45,7 +36,7 @@ function generateObject({ ast }: InspectionResult): PropDefaultValue { prettyCaption = `${prettyCaption.slice(0, -1)} }`; } - return !isTooLongForSummary(prettyCaption) + return !isTooLongForDefaultValueSummary(prettyCaption) ? createSummaryValue(prettyCaption) : createSummaryValue(OBJECT_CAPTION, generateCode(ast)); } @@ -59,13 +50,13 @@ function generateFunc({ inferedType, ast }: InspectionResult): PropDefaultValue const prettyCaption = generateCode(ast, true); - return !isTooLongForSummary(prettyCaption) + return !isTooLongForDefaultValueSummary(prettyCaption) ? createSummaryValue(prettyCaption) : createSummaryValue(FUNCTION_CAPTION, generateCode(ast)); } // All elements are JSX elements. -// JSX elements cannot are not supported by escodegen. +// JSX elements are not supported by escodegen. function generateElement( defaultValue: string, inspectionResult: InspectionResult @@ -84,7 +75,7 @@ function generateElement( } } - return !isTooLongForSummary(defaultValue) + return !isTooLongForDefaultValueSummary(defaultValue) ? createSummaryValue(defaultValue) : createSummaryValue(ELEMENT_CAPTION, defaultValue); } @@ -92,7 +83,7 @@ function generateElement( function generateArray({ ast }: InspectionResult): PropDefaultValue { const prettyCaption = generateCode(ast, true); - return !isTooLongForSummary(prettyCaption) + return !isTooLongForDefaultValueSummary(prettyCaption) ? createSummaryValue(prettyCaption) : createSummaryValue(ARRAY_CAPTION, generateCode(ast)); } diff --git a/addons/docs/src/frameworks/react/propTypes/createType.ts b/addons/docs/src/frameworks/react/propTypes/createType.ts index cad45030a41..dd309e56b31 100644 --- a/addons/docs/src/frameworks/react/propTypes/createType.ts +++ b/addons/docs/src/frameworks/react/propTypes/createType.ts @@ -1,5 +1,6 @@ import { isNil } from 'lodash'; import { PropSummaryValue, PropType } from '@storybook/components'; +import { createSummaryValue, isTooLongForTypeSummary } from '../../../lib'; import { ExtractedProp, DocgenPropType } from '../../../lib/docgen'; import { inspectValue } from '../inspection/inspectValue'; import { generateCode } from './generateCode'; @@ -15,8 +16,6 @@ import { import { InspectionType } from '../inspection/types'; import { isHtmlTag } from './isHtmlTag'; -const MAX_SUMMARY_LENGTH = 35; - enum PropTypesType { CUSTOM = 'custom', ANY = 'any', @@ -90,15 +89,11 @@ function getCaptionFromInspectionType(type: InspectionType): string { } } -function isTooLongForSummary(value: string): boolean { - return value.length > MAX_SUMMARY_LENGTH; -} - function generateValuesForObjectAst(ast: any): [string, string] { let summary = prettyObject(ast, true); let detail; - if (!isTooLongForSummary(summary)) { + if (!isTooLongForTypeSummary(summary)) { detail = summary; } else { summary = OBJECT_CAPTION; @@ -188,7 +183,7 @@ function generateObjectOf(type: DocgenPropType, extractedProp: ExtractedProp): T let { summary, detail } = value; if (name === PropTypesType.SHAPE) { - if (!isTooLongForSummary(detail)) { + if (!isTooLongForTypeSummary(detail)) { summary = detail; } } @@ -350,15 +345,12 @@ export function createType(extractedProp: ExtractedProp): PropType { case PropTypesType.ARRAYOF: { const { summary, detail } = generateType(type, extractedProp).value; - return { - summary, - detail: summary !== detail ? detail : undefined, - }; + return createSummaryValue(summary, summary !== detail ? detail : undefined); } case PropTypesType.FUNC: { const { detail } = generateType(type, extractedProp).value; - return { summary: detail }; + return createSummaryValue(detail); } default: return null; diff --git a/addons/docs/src/frameworks/react/propTypes/handleProp.test.ts b/addons/docs/src/frameworks/react/propTypes/handleProp.test.ts index 2ac447e41e5..b0addf1941a 100644 --- a/addons/docs/src/frameworks/react/propTypes/handleProp.test.ts +++ b/addons/docs/src/frameworks/react/propTypes/handleProp.test.ts @@ -3,7 +3,7 @@ import { PropDef } from '@storybook/components'; import PropTypes from 'prop-types'; import { Component } from '../../../blocks/shared'; -import { extractPropsFromDocgen, DocgenInfo } from '../../../lib/docgen'; +import { extractComponentProps, DocgenInfo } from '../../../lib/docgen'; import { enhancePropTypesProp, enhancePropTypesProps } from './handleProp'; const DOCGEN_SECTION = 'props'; @@ -43,19 +43,19 @@ function createComponent({ propTypes = {}, defaultProps = {}, docgenInfo = {} }) } function extractPropDef(component: Component): PropDef { - return enhancePropTypesProp(extractPropsFromDocgen(component, DOCGEN_SECTION)[0]); + return enhancePropTypesProp(extractComponentProps(component, DOCGEN_SECTION)[0]); } describe('enhancePropTypesProp', () => { - function createTestComponent(docgenInfo: Partial<DocgenInfo>): Component { - return createComponent({ - docgenInfo: { - ...createDocgenProp({ name: 'prop', ...docgenInfo }), - }, - }); - } - describe('type', () => { + function createTestComponent(docgenInfo: Partial<DocgenInfo>): Component { + return createComponent({ + docgenInfo: { + ...createDocgenProp({ name: 'prop', ...docgenInfo }), + }, + }); + } + describe('custom', () => { describe('when raw value is available', () => { it('should support literal', () => { @@ -82,9 +82,7 @@ describe('enhancePropTypesProp', () => { const { type } = extractPropDef(component); - const expectedSummary = `{ - text: string - }`; + const expectedSummary = '{ text: string }'; expect(type.summary.replace(/\s/g, '')).toBe(expectedSummary.replace(/\s/g, '')); expect(type.detail).toBeUndefined(); @@ -707,10 +705,185 @@ describe('enhancePropTypesProp', () => { }); }); }); + + describe('defaultValue', () => { + function createTestComponent(defaultValue: string): Component { + return createComponent({ + docgenInfo: { + ...createDocgenProp({ + name: 'prop', + type: { name: 'custom' }, + defaultValue: { value: defaultValue }, + }), + }, + }); + } + + it('should support short object', () => { + const component = createTestComponent("{ foo: 'foo', bar: 'bar' }"); + + const { defaultValue } = extractPropDef(component); + + const expectedSummary = "{ foo: 'foo', bar: 'bar' }"; + + expect(defaultValue.summary.replace(/\s/g, '')).toBe(expectedSummary.replace(/\s/g, '')); + expect(defaultValue.detail).toBeUndefined(); + }); + + it('should support long object', () => { + const component = createTestComponent("{ foo: 'foo', bar: 'bar', another: 'another' }"); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).toBe('object'); + + const expectedDetail = `{ + foo: 'foo', + bar: 'bar', + another: 'another' + }`; + + expect(defaultValue.detail.replace(/\s/g, '')).toBe(expectedDetail.replace(/\s/g, '')); + }); + + it('should support short function', () => { + const component = createTestComponent('() => {}'); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).toBe('() => {}'); + expect(defaultValue.detail).toBeUndefined(); + }); + + it('should support long function', () => { + const component = createTestComponent( + '(foo, bar) => {\n const concat = foo + bar;\n const append = concat + " hey!";\n \n return append;\n}' + ); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).toBe('func'); + + const expectedDetail = `(foo, bar) => { + const concat = foo + bar; + const append = concat + ' hey!'; + return append + }`; + + expect(defaultValue.detail.replace(/\s/g, '')).toBe(expectedDetail.replace(/\s/g, '')); + }); + + it('should use the name of function when available and indicate that args are present', () => { + const component = createTestComponent('function concat(a, b) {\n return a + b;\n}'); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).toBe('concat( ... )'); + + const expectedDetail = `function concat(a, b) { + return a + b + }`; + + expect(defaultValue.detail.replace(/\s/g, '')).toBe(expectedDetail.replace(/\s/g, '')); + }); + + it('should use the name of function when available', () => { + const component = createTestComponent('function hello() {\n return "hello";\n}'); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).toBe('hello()'); + + const expectedDetail = `function hello() { + return 'hello' + }`; + + expect(defaultValue.detail.replace(/\s/g, '')).toBe(expectedDetail.replace(/\s/g, '')); + }); + + it('should support short element', () => { + const component = createTestComponent('<div>Hey!</div>'); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).toBe('<div>Hey!</div>'); + expect(defaultValue.detail).toBeUndefined(); + }); + + it('should support long element', () => { + const component = createTestComponent( + '() => {\n return <div>Inlined FunctionnalComponent!</div>;\n}' + ); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).toBe('element'); + + const expectedDetail = `() => { + return <div>Inlined FunctionnalComponent!</div>; + }`; + + expect(defaultValue.detail.replace(/\s/g, '')).toBe(expectedDetail.replace(/\s/g, '')); + }); + + it("should use the name of the React component when it's available", () => { + const component = createTestComponent( + 'function InlinedFunctionalComponent() {\n return <div>Inlined FunctionnalComponent!</div>;\n}' + ); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).toBe('<InlinedFunctionalComponent />'); + + const expectedDetail = `function InlinedFunctionalComponent() { + return <div>Inlined FunctionnalComponent!</div>; + }`; + + expect(defaultValue.detail.replace(/\s/g, '')).toBe(expectedDetail.replace(/\s/g, '')); + }); + + it('should not use the name of an HTML element', () => { + const component = createTestComponent('<div>Hey!</div>'); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).not.toBe('<div />'); + }); + + it('should support short array', () => { + const component = createTestComponent('[1]'); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).toBe('[1]'); + expect(defaultValue.detail).toBeUndefined(); + }); + + it('should support long array', () => { + const component = createTestComponent( + '[\n {\n thing: {\n id: 2,\n func: () => {},\n arr: [],\n },\n },\n]' + ); + + const { defaultValue } = extractPropDef(component); + + expect(defaultValue.summary).toBe('array'); + + const expectedDetail = `[{ + thing: { + id: 2, + func: () => { + }, + arr: [] + } + }]`; + + expect(defaultValue.detail.replace(/\s/g, '')).toBe(expectedDetail.replace(/\s/g, '')); + }); + }); }); describe('enhancePropTypesProps', () => { - it('keep the original definition order', () => { + it('should keep the original definition order', () => { const component = createComponent({ propTypes: { foo: PropTypes.string, @@ -741,7 +914,7 @@ describe('enhancePropTypesProps', () => { }); const props = enhancePropTypesProps( - extractPropsFromDocgen(component, DOCGEN_SECTION), + extractComponentProps(component, DOCGEN_SECTION), component ); @@ -751,4 +924,32 @@ describe('enhancePropTypesProps', () => { expect(props[2].name).toBe('bar'); expect(props[3].name).toBe('endWithDefaultValue'); }); + + it('should not include @ignore props', () => { + const component = createComponent({ + propTypes: { + foo: PropTypes.string, + bar: PropTypes.string, + }, + docgenInfo: { + ...createDocgenProp({ + name: 'foo', + type: { name: 'string' }, + }), + ...createDocgenProp({ + name: 'bar', + type: { name: 'string' }, + description: '@ignore', + }), + }, + }); + + const props = enhancePropTypesProps( + extractComponentProps(component, DOCGEN_SECTION), + component + ); + + expect(props.length).toBe(1); + expect(props[0].name).toBe('foo'); + }); }); diff --git a/addons/docs/src/frameworks/react/propTypes/sortProps.ts b/addons/docs/src/frameworks/react/propTypes/sortProps.ts index 375ce9c5e04..9061ee0ded5 100644 --- a/addons/docs/src/frameworks/react/propTypes/sortProps.ts +++ b/addons/docs/src/frameworks/react/propTypes/sortProps.ts @@ -2,7 +2,7 @@ import { PropDef } from '@storybook/components'; import { isNil } from 'lodash'; import { Component } from '../../../blocks/shared'; -// react-docgen doesn't returned the props in the order they were defined in the "propTypes" of the component. +// react-docgen doesn't returned the props in the order they were defined in the "propTypes" object of the component. // This function re-order them by their original definition order. export function keepOriginalDefinitionOrder( extractedProps: PropDef[], @@ -12,7 +12,9 @@ export function keepOriginalDefinitionOrder( const { propTypes } = component; if (!isNil(propTypes)) { - return Object.keys(propTypes).map(x => extractedProps.find(y => y.name === x)); + return Object.keys(propTypes) + .map(x => extractedProps.find(y => y.name === x)) + .filter(x => x); } return extractedProps; diff --git a/addons/docs/src/frameworks/vue/config.tsx b/addons/docs/src/frameworks/vue/config.tsx index e08d3430877..680e4616579 100644 --- a/addons/docs/src/frameworks/vue/config.tsx +++ b/addons/docs/src/frameworks/vue/config.tsx @@ -4,7 +4,7 @@ import toReact from '@egoist/vue-to-react'; import { StoryFn } from '@storybook/addons'; import { addParameters } from '@storybook/client-api'; import { extractProps } from './extractProps'; -import { extractComponentDescription } from '../../lib/docgen/utils'; +import { extractComponentDescription } from '../../lib/docgen'; addParameters({ docs: { diff --git a/addons/docs/src/frameworks/vue/extractProps.ts b/addons/docs/src/frameworks/vue/extractProps.ts index 495dd8b0c24..f4a26acc76c 100644 --- a/addons/docs/src/frameworks/vue/extractProps.ts +++ b/addons/docs/src/frameworks/vue/extractProps.ts @@ -1,5 +1,5 @@ import { PropDef } from '@storybook/components'; -import { PropsExtractor, hasDocgen, extractPropsFromDocgen } from '../../lib/docgen'; +import { PropsExtractor, hasDocgen, extractComponentProps } from '../../lib/docgen'; const SECTIONS = ['props', 'events', 'slots']; @@ -9,7 +9,7 @@ export const extractProps: PropsExtractor = component => { } const sections: Record<string, PropDef[]> = {}; SECTIONS.forEach(section => { - sections[section] = extractPropsFromDocgen(component, section).map(x => x.propDef); + sections[section] = extractComponentProps(component, section).map(x => x.propDef); }); return { sections }; }; diff --git a/addons/docs/src/lib/docgen/createDefaultValue.ts b/addons/docs/src/lib/docgen/createDefaultValue.ts deleted file mode 100644 index 36fdc32f711..00000000000 --- a/addons/docs/src/lib/docgen/createDefaultValue.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { isNil } from 'lodash'; -import { PropDefaultValue } from '@storybook/components'; -import { DocgenPropDefaultValue } from './types'; - -const BLACKLIST = ['null', 'undefined']; - -function isDefaultValueBlacklisted(value: string) { - return BLACKLIST.some(x => x === value); -} - -export function createDefaultValue(defaultValue: DocgenPropDefaultValue): PropDefaultValue { - if (!isNil(defaultValue)) { - const { value } = defaultValue; - - if (!isDefaultValueBlacklisted(value)) { - return { - summary: value, - }; - } - } - - return null; -} diff --git a/addons/docs/src/lib/docgen/createPropDef.ts b/addons/docs/src/lib/docgen/createPropDef.ts index c314511d86a..ea8ac3ad425 100644 --- a/addons/docs/src/lib/docgen/createPropDef.ts +++ b/addons/docs/src/lib/docgen/createPropDef.ts @@ -1,8 +1,10 @@ import { isNil } from 'lodash'; -import { PropDef } from '@storybook/components'; -import { TypeSystem, DocgenInfo, DocgenType } from './types'; +import { PropDef, PropDefaultValue } from '@storybook/components'; +import { TypeSystem, DocgenInfo, DocgenType, DocgenPropDefaultValue } from './types'; import { JsDocParsingResult } from '../jsdocParser'; -import { createDefaultValue } from './createDefaultValue'; +import { createSummaryValue } from '../utils'; +import { createFlowPropDef } from './flow/createPropDef'; +import { isDefaultValueBlacklisted } from './utils/defaultValue'; export type PropDefFactory = ( propName: string, @@ -10,30 +12,36 @@ export type PropDefFactory = ( jsDocParsingResult?: JsDocParsingResult ) => PropDef; +function createDefaultValue(defaultValue: DocgenPropDefaultValue): PropDefaultValue { + if (!isNil(defaultValue)) { + const { value } = defaultValue; + + if (!isDefaultValueBlacklisted(value)) { + return createSummaryValue(value); + } + } + + return null; +} + function createBasicPropDef(name: string, type: DocgenType, docgenInfo: DocgenInfo): PropDef { const { description, required, defaultValue } = docgenInfo; return { name, - type: { summary: type.name }, + type: createSummaryValue(type.name), required, description, defaultValue: createDefaultValue(defaultValue), }; } -function createPropDef( - name: string, - type: DocgenType, - docgenInfo: DocgenInfo, - jsDocParsingResult: JsDocParsingResult -): PropDef { - const propDef = createBasicPropDef(name, type, docgenInfo); - +function applyJsDocResult(propDef: PropDef, jsDocParsingResult: JsDocParsingResult): PropDef { if (jsDocParsingResult.includesJsDoc) { const { description, extractedTags } = jsDocParsingResult; if (!isNil(description)) { + // eslint-disable-next-line no-param-reassign propDef.description = jsDocParsingResult.description; } @@ -41,6 +49,7 @@ function createPropDef( const hasReturns = !isNil(extractedTags.returns) && !isNil(extractedTags.returns.type); if (hasParams || hasReturns) { + // eslint-disable-next-line no-param-reassign propDef.jsDocTags = { params: hasParams && @@ -53,36 +62,28 @@ function createPropDef( return propDef; } -export const javaScriptFactory: PropDefFactory = ( - propName: string, - docgenInfo: DocgenInfo, - jsDocParsingResult?: JsDocParsingResult -) => { - return createPropDef(propName, docgenInfo.type, docgenInfo, jsDocParsingResult); +export const javaScriptFactory: PropDefFactory = (propName, docgenInfo, jsDocParsingResult) => { + const propDef = createBasicPropDef(propName, docgenInfo.type, docgenInfo); + + return applyJsDocResult(propDef, jsDocParsingResult); }; -export const tsFactory: PropDefFactory = ( - propName: string, - docgenInfo: DocgenInfo, - jsDocParsingResult?: JsDocParsingResult -) => { - return createPropDef(propName, docgenInfo.tsType, docgenInfo, jsDocParsingResult); +export const tsFactory: PropDefFactory = (propName, docgenInfo, jsDocParsingResult) => { + const propDef = createBasicPropDef(propName, docgenInfo.tsType, docgenInfo); + + return applyJsDocResult(propDef, jsDocParsingResult); }; -export const flowFactory: PropDefFactory = ( - propName: string, - docgenInfo: DocgenInfo, - jsDocParsingResult?: JsDocParsingResult -) => { - return createPropDef(propName, docgenInfo.flowType, docgenInfo, jsDocParsingResult); +export const flowFactory: PropDefFactory = (propName, docgenInfo, jsDocParsingResult) => { + const propDef = createFlowPropDef(propName, docgenInfo); + + return applyJsDocResult(propDef, jsDocParsingResult); }; -export const unknownFactory: PropDefFactory = ( - propName: string, - docgenInfo: DocgenInfo, - jsDocParsingResult?: JsDocParsingResult -) => { - return createPropDef(propName, { name: 'unknown' }, docgenInfo, jsDocParsingResult); +export const unknownFactory: PropDefFactory = (propName, docgenInfo, jsDocParsingResult) => { + const propDef = createBasicPropDef(propName, { name: 'unknown' }, docgenInfo); + + return applyJsDocResult(propDef, jsDocParsingResult); }; export const getPropDefFactory = (typeSystem: TypeSystem): PropDefFactory => { diff --git a/addons/docs/src/lib/docgen/extractDocgenProps.test.ts b/addons/docs/src/lib/docgen/extractDocgenProps.test.ts index 64a1a67dd6d..d2b7c57aa0a 100644 --- a/addons/docs/src/lib/docgen/extractDocgenProps.test.ts +++ b/addons/docs/src/lib/docgen/extractDocgenProps.test.ts @@ -1,7 +1,7 @@ /* eslint-disable no-underscore-dangle */ import { Component } from '../../blocks/shared'; -import { extractPropsFromDocgen } from './extractDocgenProps'; +import { extractComponentProps } from './extractDocgenProps'; const DOCGEN_SECTION = 'props'; const PROP_NAME = 'propName'; @@ -14,6 +14,7 @@ interface TypeSystemDef { const TypeSystems: TypeSystemDef[] = [ { name: 'javascript', typeProperty: 'type' }, { name: 'typescript', typeProperty: 'tsType' }, + { name: 'flow', typeProperty: 'flowType' }, ]; function createType(typeName: string, others: Record<string, any> = {}): Record<string, string> { @@ -53,103 +54,127 @@ function createComponent(docgenInfo: Record<string, any>): Component { } TypeSystems.forEach(x => { - it('should map defaults docgen info properly', () => { - const component = createComponent({ - ...createStringType(x), - description: 'Hey! Hey!', - defaultValue: { - value: 'Default', - }, + describe(`${x.name}`, () => { + it('should map defaults docgen info properly', () => { + const component = createComponent({ + ...createStringType(x), + description: 'Hey! Hey!', + defaultValue: { + value: 'Default', + }, + }); + + const { propDef } = extractComponentProps(component, DOCGEN_SECTION)[0]; + + expect(propDef.name).toBe(PROP_NAME); + expect(propDef.type.summary).toBe('string'); + expect(propDef.description).toBe('Hey! Hey!'); + expect(propDef.required).toBe(false); + expect(propDef.defaultValue.summary).toBe('Default'); }); - const { propDef } = extractPropsFromDocgen(component, DOCGEN_SECTION)[0]; + it('should remove JSDoc tags from the description', () => { + const component = createComponent({ + ...createStringType(x), + description: 'Hey!\n@param event\nreturns {string}', + }); - expect(propDef.name).toBe(PROP_NAME); - expect(propDef.type.summary).toBe('string'); - expect(propDef.description).toBe('Hey! Hey!'); - expect(propDef.required).toBe(false); - expect(propDef.defaultValue.summary).toBe('Default'); - }); + const { propDef } = extractComponentProps(component, DOCGEN_SECTION)[0]; - it('should remove JSDoc tags from the description', () => { - const component = createComponent({ - ...createStringType(x), - description: 'Hey!\n@param event\nreturns {string}', + expect(propDef.description).toBe('Hey!'); }); - const { propDef } = extractPropsFromDocgen(component, DOCGEN_SECTION)[0]; + it('should not remove newline characters of multilines description without JSDoc tags', () => { + const component = createComponent({ + ...createStringType(x), + description: 'onClick description\nis a\nmulti-lines\ndescription', + }); - expect(propDef.description).toBe('Hey!'); - }); + const { propDef } = extractComponentProps(component, DOCGEN_SECTION)[0]; - it('should not remove newline characters of multilines description without JSDoc tags', () => { - const component = createComponent({ - ...createStringType(x), - description: 'onClick description\nis a\nmulti-lines\ndescription', + expect(propDef.description).toBe('onClick description\nis a\nmulti-lines\ndescription'); }); - const { propDef } = extractPropsFromDocgen(component, DOCGEN_SECTION)[0]; + it('should not remove newline characters of multilines description with JSDoc tags', () => { + const component = createComponent({ + ...createFuncType(x), + description: 'onClick description\nis a\nmulti-lines\ndescription\n@param event', + }); - expect(propDef.description).toBe('onClick description\nis a\nmulti-lines\ndescription'); - }); + const { propDef } = extractComponentProps(component, DOCGEN_SECTION)[0]; - it('should not remove newline characters of multilines description with JSDoc tags', () => { - const component = createComponent({ - ...createFuncType(x), - description: 'onClick description\nis a\nmulti-lines\ndescription\n@param event', + expect(propDef.description).toBe('onClick description\nis a\nmulti-lines\ndescription'); }); - const { propDef } = extractPropsFromDocgen(component, DOCGEN_SECTION)[0]; + it('should not remove markdown from description without JSDoc tags', () => { + const component = createComponent({ + ...createStringType(x), + description: 'onClick *emphasis*, **strong**, `formatted` description.', + }); - expect(propDef.description).toBe('onClick description\nis a\nmulti-lines\ndescription'); - }); + const { propDef } = extractComponentProps(component, DOCGEN_SECTION)[0]; - it('should not remove markdown from description without JSDoc tags', () => { - const component = createComponent({ - ...createStringType(x), - description: 'onClick *emphasis*, **strong**, `formatted` description.', + expect(propDef.description).toBe('onClick *emphasis*, **strong**, `formatted` description.'); }); - const { propDef } = extractPropsFromDocgen(component, DOCGEN_SECTION)[0]; + it('should not remove markdown from description with JSDoc tags', () => { + const component = createComponent({ + ...createFuncType(x), + description: 'onClick *emphasis*, **strong**, `formatted` description.\n@param event', + }); - expect(propDef.description).toBe('onClick *emphasis*, **strong**, `formatted` description.'); - }); + const { propDef } = extractComponentProps(component, DOCGEN_SECTION)[0]; - it('should not remove markdown from description with JSDoc tags', () => { - const component = createComponent({ - ...createFuncType(x), - description: 'onClick *emphasis*, **strong**, `formatted` description.\n@param event', + expect(propDef.description).toBe('onClick *emphasis*, **strong**, `formatted` description.'); }); - const { propDef } = extractPropsFromDocgen(component, DOCGEN_SECTION)[0]; + it('should return null when the property is marked with @ignore', () => { + const component = createComponent({ + ...createStringType(x), + description: 'onClick description\n@ignore', + }); - expect(propDef.description).toBe('onClick *emphasis*, **strong**, `formatted` description.'); - }); - - it('should return null when the property is marked with @ignore', () => { - const component = createComponent({ - ...createStringType(x), - description: 'onClick description\n@ignore', + expect(extractComponentProps(component, DOCGEN_SECTION).length).toBe(0); }); - expect(extractPropsFromDocgen(component, DOCGEN_SECTION).length).toBe(0); - }); + it('should provide raw @param tags', () => { + const component = createComponent({ + ...createFuncType(x), + description: + 'onClick description\n@param {SyntheticEvent} event - Original event.\n@param {string} value', + }); - it('should provide raw @param tags', () => { - const component = createComponent({ - ...createFuncType(x), - description: - 'onClick description\n@param {SyntheticEvent} event - Original event.\n@param {string} value', + const { propDef } = extractComponentProps(component, DOCGEN_SECTION)[0]; + + expect(propDef.description).toBe('onClick description'); + expect(propDef.jsDocTags).toBeDefined(); + expect(propDef.jsDocTags.params).toBeDefined(); + expect(propDef.jsDocTags.params[0].name).toBe('event'); + expect(propDef.jsDocTags.params[0].description).toBe('Original event.'); + expect(propDef.jsDocTags.params[1].name).toBe('value'); + expect(propDef.jsDocTags.params[1].description).toBeNull(); }); - const { propDef } = extractPropsFromDocgen(component, DOCGEN_SECTION)[0]; + it("should not return 'null' default value", () => { + const component = createComponent({ + ...createStringType(x), + defaultValue: { value: 'null' }, + }); - expect(propDef.description).toBe('onClick description'); - expect(propDef.jsDocTags).toBeDefined(); - expect(propDef.jsDocTags.params).toBeDefined(); - expect(propDef.jsDocTags.params[0].name).toBe('event'); - expect(propDef.jsDocTags.params[0].description).toBe('Original event.'); - expect(propDef.jsDocTags.params[1].name).toBe('value'); - expect(propDef.jsDocTags.params[1].description).toBeNull(); + const { propDef } = extractComponentProps(component, DOCGEN_SECTION)[0]; + + expect(propDef.defaultValue).toBeNull(); + }); + + it("should not return 'undefined' default value", () => { + const component = createComponent({ + ...createStringType(x), + defaultValue: { value: 'undefined' }, + }); + + const { propDef } = extractComponentProps(component, DOCGEN_SECTION)[0]; + + expect(propDef.defaultValue).toBeNull(); + }); }); }); diff --git a/addons/docs/src/lib/docgen/extractDocgenProps.ts b/addons/docs/src/lib/docgen/extractDocgenProps.ts index adcf4d906da..b5e68f51160 100644 --- a/addons/docs/src/lib/docgen/extractDocgenProps.ts +++ b/addons/docs/src/lib/docgen/extractDocgenProps.ts @@ -3,7 +3,7 @@ import { PropDef } from '@storybook/components'; import { Component } from '../../blocks/shared'; import { ExtractedJsDoc, parseJsDoc } from '../jsdocParser'; import { DocgenInfo, TypeSystem } from './types'; -import { getDocgenSection, isValidDocgenSection } from './utils'; +import { getDocgenSection, isValidDocgenSection, getDocgenDescription } from './utils'; import { getPropDefFactory, PropDefFactory } from './createPropDef'; export interface ExtractedProp { @@ -31,7 +31,7 @@ const getTypeSystem = (docgenInfo: DocgenInfo): TypeSystem => { return TypeSystem.UNKNOWN; }; -export const extractPropsFromDocgen: ExtractProps = (component, section) => { +export const extractComponentProps: ExtractProps = (component, section) => { const docgenSection = getDocgenSection(component, section); if (!isValidDocgenSection(docgenSection)) { @@ -75,3 +75,7 @@ function extractProp( return null; } + +export function extractComponentDescription(component?: Component): string { + return !isNil(component) && getDocgenDescription(component); +} diff --git a/addons/docs/src/lib/docgen/flow/createDefaultValue.ts b/addons/docs/src/lib/docgen/flow/createDefaultValue.ts new file mode 100644 index 00000000000..0bec4162d38 --- /dev/null +++ b/addons/docs/src/lib/docgen/flow/createDefaultValue.ts @@ -0,0 +1,22 @@ +import { PropDefaultValue } from '@storybook/components'; +import { isNil } from 'lodash'; +import { DocgenPropDefaultValue, DocgenPropType } from '../types'; +import { createSummaryValue, isTooLongForDefaultValueSummary } from '../../utils'; +import { isDefaultValueBlacklisted } from '../utils/defaultValue'; + +export function createDefaultValue( + defaultValue: DocgenPropDefaultValue, + type: DocgenPropType +): PropDefaultValue { + if (!isNil(defaultValue)) { + const { value } = defaultValue; + + if (!isDefaultValueBlacklisted(value)) { + return !isTooLongForDefaultValueSummary(value) + ? createSummaryValue(value) + : createSummaryValue(type.name, value); + } + } + + return null; +} diff --git a/addons/docs/src/lib/docgen/flow/createPropDef.test.ts b/addons/docs/src/lib/docgen/flow/createPropDef.test.ts new file mode 100644 index 00000000000..fb56311ad68 --- /dev/null +++ b/addons/docs/src/lib/docgen/flow/createPropDef.test.ts @@ -0,0 +1,242 @@ +import { isNil } from 'lodash'; +import { createFlowPropDef } from './createPropDef'; +import { DocgenInfo, DocgenFlowType } from '../types'; + +const PROP_NAME = 'propName'; + +function createDocgenInfo({ + type, + defaultValue, + ...rest +}: { + type: DocgenFlowType; + defaultValue?: string; +}): DocgenInfo { + return { + flowType: type, + defaultValue: !isNil(defaultValue) ? { value: defaultValue } : undefined, + required: false, + ...rest, + }; +} + +describe('type', () => { + ['string', 'number', 'boolean', 'any', 'void', 'Object', 'String', 'MyClass', 'literal'].forEach( + x => { + it(`should support ${x}`, () => { + const docgenInfo = createDocgenInfo({ + type: { name: x }, + }); + + const { type } = createFlowPropDef(PROP_NAME, docgenInfo); + + expect(type.summary).toBe(x); + expect(type.detail).toBeUndefined(); + }); + } + ); + + ['Array', 'Class', 'MyClass'].forEach(x => { + it(`should support untyped ${x}`, () => { + const docgenInfo = createDocgenInfo({ + type: { name: x }, + }); + + const { type } = createFlowPropDef(PROP_NAME, docgenInfo); + + expect(type.summary).toBe(x); + expect(type.detail).toBeUndefined(); + }); + + it(`should support typed ${x}`, () => { + const docgenInfo = createDocgenInfo({ + type: { + name: x, + elements: [ + { + name: 'any', + }, + ], + raw: `${x}<any>`, + }, + }); + + const { type } = createFlowPropDef(PROP_NAME, docgenInfo); + + expect(type.summary).toBe(`${x}<any>`); + expect(type.detail).toBeUndefined(); + }); + }); + + it('should support short object signature', () => { + const docgenInfo = createDocgenInfo({ + type: { + name: 'signature', + type: 'object', + raw: '{ foo: string, bar?: mixed }', + signature: { + properties: [ + { + key: 'foo', + value: { + name: 'string', + required: true, + }, + }, + { + key: 'bar', + value: { + name: 'mixed', + required: false, + }, + }, + ], + }, + }, + }); + + const { type } = createFlowPropDef(PROP_NAME, docgenInfo); + + expect(type.summary).toBe('{ foo: string, bar?: mixed }'); + expect(type.detail).toBeUndefined(); + }); + + it('should support long object signature', () => { + const docgenInfo = createDocgenInfo({ + type: { + name: 'signature', + type: 'object', + raw: '{ (x: string): void, prop: string }', + signature: { + properties: [ + { + key: 'prop', + value: { + name: 'string', + required: true, + }, + }, + ], + constructor: { + name: 'signature', + type: 'function', + raw: '(x: string): void', + signature: { + arguments: [ + { + name: 'x', + type: { + name: 'string', + }, + }, + ], + return: { + name: 'void', + }, + }, + }, + }, + }, + }); + + const { type } = createFlowPropDef(PROP_NAME, docgenInfo); + + expect(type.summary).toBe('object'); + expect(type.detail).toBe('{ (x: string): void, prop: string }'); + }); + + it('should support func signature', () => { + const docgenInfo = createDocgenInfo({ + type: { + name: 'signature', + type: 'function', + raw: '(x: string) => void', + signature: { + arguments: [ + { + name: 'x', + type: { + name: 'string', + }, + }, + ], + return: { + name: 'void', + }, + }, + }, + }); + + const { type } = createFlowPropDef(PROP_NAME, docgenInfo); + + expect(type.summary).toBe('(x: string) => void'); + expect(type.detail).toBeUndefined(); + }); + + it('should support tuple', () => { + const docgenInfo = createDocgenInfo({ + type: { + name: 'tuple', + raw: '[foo, "value", number]', + elements: [ + { + name: 'foo', + }, + { + name: 'literal', + value: '"value"', + }, + { + name: 'number', + }, + ], + }, + }); + + const { type } = createFlowPropDef(PROP_NAME, docgenInfo); + + expect(type.summary).toBe('[foo, "value", number]'); + }); + + it('should support union', () => { + const docgenInfo = createDocgenInfo({ + type: { + name: 'union', + raw: 'number | string', + elements: [ + { + name: 'number', + }, + { + name: 'string', + }, + ], + }, + }); + + const { type } = createFlowPropDef(PROP_NAME, docgenInfo); + + expect(type.summary).toBe('number | string'); + }); + + it('should support intersection', () => { + const docgenInfo = createDocgenInfo({ + type: { + name: 'intersection', + raw: 'number & string', + elements: [ + { + name: 'number', + }, + { + name: 'string', + }, + ], + }, + }); + + const { type } = createFlowPropDef(PROP_NAME, docgenInfo); + + expect(type.summary).toBe('number & string'); + }); +}); diff --git a/addons/docs/src/lib/docgen/flow/createPropDef.ts b/addons/docs/src/lib/docgen/flow/createPropDef.ts new file mode 100644 index 00000000000..74c03e280a9 --- /dev/null +++ b/addons/docs/src/lib/docgen/flow/createPropDef.ts @@ -0,0 +1,15 @@ +import { PropDefFactory } from '../createPropDef'; +import { createType } from './createType'; +import { createDefaultValue } from './createDefaultValue'; + +export const createFlowPropDef: PropDefFactory = (propName, docgenInfo) => { + const { flowType, description, required, defaultValue } = docgenInfo; + + return { + name: propName, + type: createType(flowType), + required, + description, + defaultValue: createDefaultValue(defaultValue, flowType), + }; +}; diff --git a/addons/docs/src/lib/docgen/flow/createType.ts b/addons/docs/src/lib/docgen/flow/createType.ts new file mode 100644 index 00000000000..98be7fa31d9 --- /dev/null +++ b/addons/docs/src/lib/docgen/flow/createType.ts @@ -0,0 +1,66 @@ +import { PropType } from '@storybook/components'; +import { isNil } from 'lodash'; +import { DocgenFlowType } from '../types'; +import { createSummaryValue, isTooLongForTypeSummary } from '../../utils'; + +enum FlowTypesType { + UNION = 'union', + SIGNATURE = 'signature', +} + +interface DocgenFlowUnionType extends DocgenFlowType { + elements: { name: string; value: string }[]; +} + +function generateUnion({ name, raw, elements }: DocgenFlowUnionType): PropType { + if (!isNil(raw)) { + return createSummaryValue(raw); + } + + if (!isNil(elements)) { + return createSummaryValue(elements.map(x => x.value).join(' | ')); + } + + return createSummaryValue(name); +} + +function generateFuncSignature({ type, raw }: DocgenFlowType): PropType { + if (!isNil(raw)) { + return createSummaryValue(raw); + } + + return createSummaryValue(type); +} + +function generateObjectSignature({ type, raw }: DocgenFlowType): PropType { + if (!isNil(raw)) { + return !isTooLongForTypeSummary(raw) ? createSummaryValue(raw) : createSummaryValue(type, raw); + } + + return createSummaryValue(type); +} + +function generateSignature(flowType: DocgenFlowType): PropType { + const { type } = flowType; + + return type === 'object' ? generateObjectSignature(flowType) : generateFuncSignature(flowType); +} + +function generateDefault({ name, raw }: DocgenFlowType): PropType { + if (!isNil(raw)) { + return !isTooLongForTypeSummary(raw) ? createSummaryValue(raw) : createSummaryValue(name, raw); + } + + return createSummaryValue(name); +} + +export function createType(type: DocgenFlowType): PropType { + switch (type.name) { + case FlowTypesType.UNION: + return generateUnion(type as DocgenFlowUnionType); + case FlowTypesType.SIGNATURE: + return generateSignature(type); + default: + return generateDefault(type); + } +} diff --git a/addons/docs/src/lib/docgen/types.ts b/addons/docs/src/lib/docgen/types.ts index fd560c9edc7..130587ef515 100644 --- a/addons/docs/src/lib/docgen/types.ts +++ b/addons/docs/src/lib/docgen/types.ts @@ -15,8 +15,12 @@ export interface DocgenPropType extends DocgenBaseType { computed?: boolean; } -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface DocgenFlowType extends DocgenBaseType {} +export interface DocgenFlowType extends DocgenBaseType { + type?: string; + raw?: string; + signature?: any; + elements?: any[]; +} // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface DocgenTypeScriptType extends DocgenBaseType {} diff --git a/addons/docs/src/lib/docgen/utils/defaultValue.ts b/addons/docs/src/lib/docgen/utils/defaultValue.ts new file mode 100644 index 00000000000..0757f9eef6e --- /dev/null +++ b/addons/docs/src/lib/docgen/utils/defaultValue.ts @@ -0,0 +1,5 @@ +const BLACKLIST = ['null', 'undefined']; + +export function isDefaultValueBlacklisted(value: string): boolean { + return BLACKLIST.some(x => x === value); +} diff --git a/addons/docs/src/lib/docgen/utils.ts b/addons/docs/src/lib/docgen/utils/docgen.ts similarity index 52% rename from addons/docs/src/lib/docgen/utils.ts rename to addons/docs/src/lib/docgen/utils/docgen.ts index 4bdc8c7138a..623047c7e38 100644 --- a/addons/docs/src/lib/docgen/utils.ts +++ b/addons/docs/src/lib/docgen/utils/docgen.ts @@ -1,17 +1,8 @@ /* eslint-disable no-underscore-dangle */ import { isNil } from 'lodash'; -import { Component } from '../../blocks/shared'; - -export const str = (obj: any) => { - if (!obj) { - return ''; - } - if (typeof obj === 'string') { - return obj as string; - } - throw new Error(`Description: expected string, got: ${JSON.stringify(obj)}`); -}; +import { Component } from '../../../blocks/shared'; +import { str } from './string'; export function hasDocgen(component: Component): boolean { return !!component.__docgenInfo; @@ -25,5 +16,6 @@ export function getDocgenSection(component: Component, section: string): any { return hasDocgen(component) ? component.__docgenInfo[section] : null; } -export const extractComponentDescription = (component?: Component) => - component && hasDocgen(component) && str(component.__docgenInfo.description); +export function getDocgenDescription(component: Component): string { + return hasDocgen(component) && str(component.__docgenInfo.description); +} diff --git a/addons/docs/src/lib/docgen/utils/index.ts b/addons/docs/src/lib/docgen/utils/index.ts new file mode 100644 index 00000000000..4d3acb13d2f --- /dev/null +++ b/addons/docs/src/lib/docgen/utils/index.ts @@ -0,0 +1,3 @@ +export * from './defaultValue'; +export * from './string'; +export * from './docgen'; diff --git a/addons/docs/src/lib/docgen/utils/string.ts b/addons/docs/src/lib/docgen/utils/string.ts new file mode 100644 index 00000000000..9accdd8d063 --- /dev/null +++ b/addons/docs/src/lib/docgen/utils/string.ts @@ -0,0 +1,9 @@ +export const str = (obj: any) => { + if (!obj) { + return ''; + } + if (typeof obj === 'string') { + return obj as string; + } + throw new Error(`Description: expected string, got: ${JSON.stringify(obj)}`); +}; diff --git a/addons/docs/src/lib/index.ts b/addons/docs/src/lib/index.ts new file mode 100644 index 00000000000..04bca77e0de --- /dev/null +++ b/addons/docs/src/lib/index.ts @@ -0,0 +1 @@ +export * from './utils'; diff --git a/addons/docs/src/lib/utils.ts b/addons/docs/src/lib/utils.ts new file mode 100644 index 00000000000..2c81e5003b3 --- /dev/null +++ b/addons/docs/src/lib/utils.ts @@ -0,0 +1,16 @@ +import { PropSummaryValue } from '@storybook/components'; + +export const MAX_TYPE_SUMMARY_LENGTH = 30; +export const MAX_DEFALUT_VALUE_SUMMARY_LENGTH = 50; + +export function isTooLongForTypeSummary(value: string): boolean { + return value.length > MAX_TYPE_SUMMARY_LENGTH; +} + +export function isTooLongForDefaultValueSummary(value: string): boolean { + return value.length > MAX_DEFALUT_VALUE_SUMMARY_LENGTH; +} + +export function createSummaryValue(summary: string, detail?: string): PropSummaryValue { + return { summary, detail }; +} diff --git a/addons/docs/src/mdx/__testfixtures__/component-id.output.snapshot b/addons/docs/src/mdx/__testfixtures__/component-id.output.snapshot index c3cf1c46ffa..55814119d63 100644 --- a/addons/docs/src/mdx/__testfixtures__/component-id.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/component-id.output.snapshot @@ -39,7 +39,7 @@ componentNotes.story.parameters = { mdxSource: '<Button>Component notes</Button> const componentMeta = { title: 'Button', id: 'button-id', includeStories: ['componentNotes'] }; -const mdxStoryNameToId = { 'component notes': 'button--component-notes' }; +const mdxStoryNameToId = { 'component notes': 'button-id--component-notes' }; componentMeta.parameters = componentMeta.parameters || {}; componentMeta.parameters.docs = { diff --git a/addons/docs/src/mdx/mdx-compiler-plugin.js b/addons/docs/src/mdx/mdx-compiler-plugin.js index 1d489ce1ff0..f5ca25aabfb 100644 --- a/addons/docs/src/mdx/mdx-compiler-plugin.js +++ b/addons/docs/src/mdx/mdx-compiler-plugin.js @@ -298,11 +298,11 @@ function extractExports(node, options) { } metaExport.includeStories = JSON.stringify(includeStories); - const { title } = metaExport; + const { title, id: componentId } = metaExport; const mdxStoryNameToId = Object.entries(context.storyNameToKey).reduce( (acc, [storyName, storyKey]) => { if (title) { - acc[storyName] = toId(title, storyNameFromExport(storyKey)); + acc[storyName] = toId(componentId || title, storyNameFromExport(storyKey)); } return acc; }, diff --git a/addons/events/package.json b/addons/events/package.json index 3f8d8c0b516..090ed38cc47 100644 --- a/addons/events/package.json +++ b/addons/events/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-events", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Add events to your Storybook stories.", "keywords": [ "addon", @@ -31,11 +31,11 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-api": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-api": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "format-json": "^1.0.3", "lodash": "^4.17.15", diff --git a/addons/google-analytics/package.json b/addons/google-analytics/package.json index 7a50750dad2..710fd4800cd 100644 --- a/addons/google-analytics/package.json +++ b/addons/google-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-google-analytics", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook addon for google analytics", "keywords": [ "addon", @@ -20,8 +20,8 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "react-ga": "^2.5.7" diff --git a/addons/graphql/package.json b/addons/graphql/package.json index 6d7c2636c8e..6f8b8115eb9 100644 --- a/addons/graphql/package.json +++ b/addons/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-graphql", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook addon to display the GraphiQL IDE", "keywords": [ "addon", @@ -29,8 +29,8 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "graphiql": "^0.16.0", diff --git a/addons/info/package.json b/addons/info/package.json index 3bb71aa9a9c..6618aba809f 100644 --- a/addons/info/package.json +++ b/addons/info/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-info", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "A Storybook addon to show additional information for your stories.", "keywords": [ "addon", @@ -28,10 +28,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "marksy": "^7.0.0", diff --git a/addons/jest/package.json b/addons/jest/package.json index 77ccdf5fb7a..5512e801f38 100644 --- a/addons/jest/package.json +++ b/addons/jest/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-jest", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "React storybook addon that show component jest report", "keywords": [ "addon", @@ -35,11 +35,11 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "react": "^16.8.3", diff --git a/addons/knobs/package.json b/addons/knobs/package.json index 418ad1de428..cbb60dab16a 100644 --- a/addons/knobs/package.json +++ b/addons/knobs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-knobs", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook Addon Prop Editor Component", "keywords": [ "addon", @@ -29,12 +29,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-api": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-api": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "@types/react-color": "^3.0.1", "copy-to-clipboard": "^3.0.8", "core-js": "^3.0.1", diff --git a/addons/links/package.json b/addons/links/package.json index ae2c5079ce5..c3aece5670f 100644 --- a/addons/links/package.json +++ b/addons/links/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-links", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Story Links addon for storybook", "keywords": [ "addon", @@ -29,10 +29,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/router": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/router": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "prop-types": "^15.7.2", diff --git a/addons/notes/package.json b/addons/notes/package.json index b2676b0025e..0c420acc172 100644 --- a/addons/notes/package.json +++ b/addons/notes/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-notes", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Write notes for your Storybook stories.", "keywords": [ "addon", @@ -30,13 +30,13 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/router": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/router": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "markdown-to-jsx": "^6.10.3", diff --git a/addons/ondevice-actions/package.json b/addons/ondevice-actions/package.json index ba9da446b29..7042af22e93 100644 --- a/addons/ondevice-actions/package.json +++ b/addons/ondevice-actions/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-ondevice-actions", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Action Logger addon for react-native storybook", "keywords": [ "storybook" @@ -26,13 +26,13 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", "core-js": "^3.0.1", "fast-deep-equal": "^2.0.1" }, "devDependencies": { - "@storybook/addon-actions": "5.3.0-beta.1" + "@storybook/addon-actions": "5.3.0-beta.3" }, "peerDependencies": { "@storybook/addon-actions": "*", diff --git a/addons/ondevice-backgrounds/package.json b/addons/ondevice-backgrounds/package.json index a59337accf9..f5579e7b08d 100644 --- a/addons/ondevice-backgrounds/package.json +++ b/addons/ondevice-backgrounds/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-ondevice-backgrounds", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "A react-native storybook addon to show different backgrounds for your preview", "keywords": [ "addon", @@ -31,9 +31,9 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-api": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-api": "5.3.0-beta.3", "core-js": "^3.0.1", "prop-types": "^15.7.2" }, diff --git a/addons/ondevice-knobs/package.json b/addons/ondevice-knobs/package.json index e69ba4442c7..cb39f1db7e9 100644 --- a/addons/ondevice-knobs/package.json +++ b/addons/ondevice-knobs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-ondevice-knobs", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Display storybook story knobs on your deviced.", "keywords": [ "addon", @@ -28,8 +28,8 @@ }, "dependencies": { "@emotion/native": "^10.0.14", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", "core-js": "^3.0.1", "deep-equal": "^1.0.1", "prop-types": "^15.7.2", @@ -39,7 +39,7 @@ "react-native-switch": "^1.5.0" }, "peerDependencies": { - "@storybook/addon-knobs": "5.2.0-alpha.34", + "@storybook/addon-knobs": "5.2.0-beta.1", "react": "*", "react-native": "*" }, diff --git a/addons/ondevice-notes/package.json b/addons/ondevice-notes/package.json index b2f6874e253..645d9b6afe6 100644 --- a/addons/ondevice-notes/package.json +++ b/addons/ondevice-notes/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-ondevice-notes", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Write notes for your react-native Storybook stories.", "keywords": [ "addon", @@ -28,11 +28,11 @@ }, "dependencies": { "@emotion/core": "^10.0.20", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-api": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-api": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", "core-js": "^3.0.1", "prop-types": "^15.7.2", "react-native-simple-markdown": "^1.1.0" diff --git a/addons/options/package.json b/addons/options/package.json index 8884f3a1528..6def67d5465 100644 --- a/addons/options/package.json +++ b/addons/options/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-options", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Options addon for storybook", "keywords": [ "addon", @@ -29,7 +29,7 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", "core-js": "^3.0.1", "util-deprecate": "^1.0.2" }, diff --git a/addons/queryparams/package.json b/addons/queryparams/package.json index 570f5a41f60..dafb59390d5 100644 --- a/addons/queryparams/package.json +++ b/addons/queryparams/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-queryparams", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "parameter addon for storybook", "keywords": [ "addon", @@ -30,12 +30,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "qs": "^6.6.0", diff --git a/addons/storyshots/storyshots-core/package.json b/addons/storyshots/storyshots-core/package.json index 17b339df494..3b8b465a7f4 100644 --- a/addons/storyshots/storyshots-core/package.json +++ b/addons/storyshots/storyshots-core/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-storyshots", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "StoryShots is a Jest Snapshot Testing Addon for Storybook.", "keywords": [ "addon", @@ -33,8 +33,8 @@ }, "dependencies": { "@jest/transform": "^24.9.0", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/client-api": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/client-api": "5.3.0-beta.3", "@types/glob": "^7.1.1", "@types/jest": "^24.0.16", "@types/jest-specific-snapshot": "^0.5.3", @@ -47,8 +47,8 @@ "ts-dedent": "^1.1.0" }, "devDependencies": { - "@storybook/addon-docs": "5.3.0-beta.1", - "@storybook/react": "5.3.0-beta.1", + "@storybook/addon-docs": "5.3.0-beta.3", + "@storybook/react": "5.3.0-beta.3", "babel-loader": "^8.0.6", "enzyme-to-json": "^3.4.1", "jest-emotion": "^10.0.17", diff --git a/addons/storyshots/storyshots-puppeteer/package.json b/addons/storyshots/storyshots-puppeteer/package.json index 30b6b39b6e1..fe09abb3334 100644 --- a/addons/storyshots/storyshots-puppeteer/package.json +++ b/addons/storyshots/storyshots-puppeteer/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-storyshots-puppeteer", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Image snapshots addition to StoryShots based on puppeteer", "keywords": [ "addon", @@ -29,8 +29,8 @@ "prepare": "node ../../../scripts/prepare.js" }, "dependencies": { - "@storybook/node-logger": "5.3.0-beta.1", - "@storybook/router": "5.3.0-beta.1", + "@storybook/node-logger": "5.3.0-beta.3", + "@storybook/router": "5.3.0-beta.3", "@types/jest-image-snapshot": "^2.8.0", "@types/puppeteer-core": "^1.9.0", "core-js": "^3.0.1", @@ -39,7 +39,7 @@ "regenerator-runtime": "^0.13.3" }, "peerDependencies": { - "@storybook/addon-storyshots": "5.3.0-alpha.13" + "@storybook/addon-storyshots": "5.3.0-beta.1" }, "publishConfig": { "access": "public" diff --git a/addons/storysource/package.json b/addons/storysource/package.json index 857ac7a6ab6..48b36affaaa 100644 --- a/addons/storysource/package.json +++ b/addons/storysource/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-storysource", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Stories addon for storybook", "keywords": [ "addon", @@ -28,11 +28,11 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/router": "5.3.0-beta.1", - "@storybook/source-loader": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/router": "5.3.0-beta.3", + "@storybook/source-loader": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "estraverse": "^4.2.0", "loader-utils": "^1.2.3", diff --git a/addons/viewport/package.json b/addons/viewport/package.json index c62de2508de..7c46bb057b7 100644 --- a/addons/viewport/package.json +++ b/addons/viewport/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-viewport", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook addon to change the viewport size to mobile", "keywords": [ "addon", @@ -29,12 +29,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "memoizerific": "^1.11.3", diff --git a/app/angular/package.json b/app/angular/package.json index fa2f1c2d05f..c8a2c6e9814 100644 --- a/app/angular/package.json +++ b/app/angular/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/angular", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for Angular: Develop Angular Components in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -33,9 +33,9 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", - "@storybook/node-logger": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", + "@storybook/node-logger": "5.3.0-beta.3", "core-js": "^3.0.1", "fork-ts-checker-webpack-plugin": "^3.0.1", "global": "^4.3.2", diff --git a/app/angular/src/server/__tests__/angular-cli_config.test.ts b/app/angular/src/server/__tests__/angular-cli_config.test.ts index 3bdf80d27bb..fb7ec193564 100644 --- a/app/angular/src/server/__tests__/angular-cli_config.test.ts +++ b/app/angular/src/server/__tests__/angular-cli_config.test.ts @@ -51,12 +51,23 @@ describe('angular-cli_config', () => { }); }); + it('should return null if `architect.build` option are not exists.', () => { + const angularJson = fs.readFileSync(path.resolve(__dirname, 'angular.json'), 'utf8'); + const angularJsonWithNoBuildOptions = JSON.parse(stripJsonComments(angularJson)); + angularJsonWithNoBuildOptions.projects['angular-cli'].architect.build = undefined; + + getLeadingAngularCliProject(angularJsonWithNoBuildOptions); + + const config = getAngularCliWebpackConfigOptions('/'); + expect(config).toBeNull(); + }); + it('should return baseConfig if no angular.json was found', () => { const baseConfig = { test: 'config' }; const projectConfig = getAngularCliWebpackConfigOptions('test-path' as Path); const config = applyAngularCliWebpackConfig(baseConfig, projectConfig); - expect(projectConfig).toBe(undefined); + expect(projectConfig).toBe(null); expect(config).toBe(baseConfig); }); }); diff --git a/app/angular/src/server/angular-cli_config.ts b/app/angular/src/server/angular-cli_config.ts index ec0c7a9a22d..fd98d622cb8 100644 --- a/app/angular/src/server/angular-cli_config.ts +++ b/app/angular/src/server/angular-cli_config.ts @@ -57,6 +57,10 @@ export function getAngularCliConfig(dirToSearch: string) { } export function getLeadingAngularCliProject(ngCliConfig: any) { + if (!ngCliConfig) { + return null; + } + const { defaultProject } = ngCliConfig; const { projects } = ngCliConfig; if (!projects || !Object.keys(projects).length) { @@ -70,19 +74,18 @@ export function getLeadingAngularCliProject(ngCliConfig: any) { export function getAngularCliWebpackConfigOptions(dirToSearch: Path) { const angularCliConfig = getAngularCliConfig(dirToSearch); - if (!angularCliConfig) { - return undefined; + const project = getLeadingAngularCliProject(angularCliConfig); + + if (!angularCliConfig || !project.architect.build) { + return null; } - const project = getLeadingAngularCliProject(angularCliConfig); const { options: projectOptions } = project.architect.build; - const normalizedAssets = normalizeAssetPatterns( projectOptions.assets, dirToSearch, project.sourceRoot ); - const projectRoot = path.resolve(dirToSearch, project.root); const tsConfigPath = path.resolve(dirToSearch, projectOptions.tsConfig) as Path; const tsConfig = getTsConfigOptions(tsConfigPath); diff --git a/app/ember/package.json b/app/ember/package.json index f8f4e7abf63..83a5ec3356e 100644 --- a/app/ember/package.json +++ b/app/ember/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/ember", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for Ember: Develop Ember Component in isolation with Hot Reloading.", "homepage": "https://github.com/storybookjs/storybook/tree/master/app/ember", "bugs": { @@ -31,7 +31,7 @@ }, "dependencies": { "@ember/test-helpers": "^1.5.0", - "@storybook/core": "5.3.0-beta.1", + "@storybook/core": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "regenerator-runtime": "^0.13.3", diff --git a/app/html/package.json b/app/html/package.json index 3e220ba5405..2ab1c537c64 100644 --- a/app/html/package.json +++ b/app/html/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/html", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for HTML: View HTML snippets in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -33,8 +33,8 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", "@types/webpack-env": "^1.13.9", "core-js": "^3.0.1", "global": "^4.3.2", diff --git a/app/marko/package.json b/app/marko/package.json index 0260fb93909..4550ce487d2 100644 --- a/app/marko/package.json +++ b/app/marko/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/marko", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for Marko: Develop Marko Component in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -33,8 +33,8 @@ }, "dependencies": { "@marko/webpack": "^2.0.0", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "regenerator-runtime": "^0.13.3", diff --git a/app/mithril/package.json b/app/mithril/package.json index 72003f81b72..068d39ad5d4 100644 --- a/app/mithril/package.json +++ b/app/mithril/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/mithril", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for Mithril: Develop Mithril Component in isolation.", "keywords": [ "storybook" @@ -35,8 +35,8 @@ "dependencies": { "@babel/core": "^7.6.2", "@babel/plugin-transform-react-jsx": "^7.3.0", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", "@types/mithril": "^2.0.0", "core-js": "^3.0.1", "global": "^4.3.2", diff --git a/app/polymer/package.json b/app/polymer/package.json index a31a53421d1..f31402eb6ab 100644 --- a/app/polymer/package.json +++ b/app/polymer/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/polymer", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for Polymer: Develop Polymer components in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -32,7 +32,7 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/core": "5.3.0-beta.1", + "@storybook/core": "5.3.0-beta.3", "@webcomponents/webcomponentsjs": "^1.2.0", "core-js": "^3.0.1", "global": "^4.3.2", diff --git a/app/preact/package.json b/app/preact/package.json index ab2e7b0ab6b..01824268522 100644 --- a/app/preact/package.json +++ b/app/preact/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/preact", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for Preact: Develop Preact Component in isolation.", "keywords": [ "storybook" @@ -34,8 +34,8 @@ }, "dependencies": { "@babel/plugin-transform-react-jsx": "^7.3.0", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", "@types/webpack-env": "^1.13.9", "core-js": "^3.0.1", "global": "^4.3.2", diff --git a/app/rax/package.json b/app/rax/package.json index e43682b9418..968a1e5b261 100644 --- a/app/rax/package.json +++ b/app/rax/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/rax", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for Rax: Develop Rax Component in isolation.", "keywords": [ "rax", @@ -33,7 +33,7 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/core": "5.3.0-beta.1", + "@storybook/core": "5.3.0-beta.3", "babel-preset-rax": "^1.0.0-beta.0", "core-js": "^3.0.1", "driver-dom": "^2.0.0", diff --git a/app/react-native-server/package.json b/app/react-native-server/package.json index 61c6ee8dc8c..1d5d8ae4867 100644 --- a/app/react-native-server/package.json +++ b/app/react-native-server/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-native-server", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "A better way to develop React Native Components for your app", "keywords": [ "react", @@ -31,12 +31,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/channel-websocket": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/ui": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/channel-websocket": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/ui": "5.3.0-beta.3", "commander": "^4.0.1", "core-js": "^3.0.1", "global": "^4.3.2", diff --git a/app/react-native/package.json b/app/react-native/package.json index 7c3525dde91..fe529a17c2b 100644 --- a/app/react-native/package.json +++ b/app/react-native/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-native", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "A better way to develop React Native Components for your app", "keywords": [ "react", @@ -31,11 +31,11 @@ "dependencies": { "@emotion/core": "^10.0.20", "@emotion/native": "^10.0.14", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/channel-websocket": "5.3.0-beta.1", - "@storybook/channels": "5.3.0-beta.1", - "@storybook/client-api": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/channel-websocket": "5.3.0-beta.3", + "@storybook/channels": "5.3.0-beta.3", + "@storybook/client-api": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", "core-js": "^3.0.1", "emotion-theming": "^10.0.19", "react-native-swipe-gestures": "^1.0.4" diff --git a/app/react/README.md b/app/react/README.md index 63426d44391..5576862408b 100644 --- a/app/react/README.md +++ b/app/react/README.md @@ -25,7 +25,7 @@ You can also build a [static version](https://storybook.js.org/basics/exporting- Here are some featured storybooks that you can reference to see how Storybook works: - [Demo of React Dates](http://airbnb.io/react-dates/) - [source](https://github.com/airbnb/react-dates) -- [Demo of React Native Web](http://necolas.github.io/react-native-web/storybook/) - [source](https://github.com/necolas/react-native-web) +- [Demo of React Native Web](https://necolas.github.io/react-native-web/docs/) - [source](https://github.com/necolas/react-native-web) ## Create React App diff --git a/app/react/package.json b/app/react/package.json index 15e2346b5b4..fabcd85fead 100644 --- a/app/react/package.json +++ b/app/react/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for React: Develop React Component in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -36,9 +36,9 @@ "@babel/plugin-transform-react-constant-elements": "^7.2.0", "@babel/preset-flow": "^7.0.0", "@babel/preset-react": "^7.0.0", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", - "@storybook/node-logger": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", + "@storybook/node-logger": "5.3.0-beta.3", "@svgr/webpack": "^4.0.3", "@types/webpack-env": "^1.13.7", "babel-plugin-add-react-displayname": "^0.0.5", diff --git a/app/riot/package.json b/app/riot/package.json index b37c833bcf0..f5c3913d807 100644 --- a/app/riot/package.json +++ b/app/riot/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/riot", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for riot.js: View riot snippets in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -33,7 +33,7 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/core": "5.3.0-beta.1", + "@storybook/core": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "raw-loader": "^3.1.0", diff --git a/app/svelte/package.json b/app/svelte/package.json index 3cb961e6b82..cbe8c7b8200 100644 --- a/app/svelte/package.json +++ b/app/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/svelte", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for Svelte: Develop Svelte Component in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -33,8 +33,8 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "regenerator-runtime": "^0.13.3", diff --git a/app/vue/package.json b/app/vue/package.json index c6241d4d306..0da64d0099c 100644 --- a/app/vue/package.json +++ b/app/vue/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for Vue: Develop Vue Component in isolation with Hot Reloading.", "keywords": [ "storybook" @@ -33,8 +33,8 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", "@types/webpack-env": "^1.13.9", "core-js": "^3.0.1", "global": "^4.3.2", diff --git a/app/web-components/package.json b/app/web-components/package.json index 58502a8cd95..855c1467692 100644 --- a/app/web-components/package.json +++ b/app/web-components/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/web-components", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "Storybook for web-components: View web components snippets in isolation with Hot Reloading.", "keywords": [ "lit-html", @@ -37,8 +37,8 @@ "dependencies": { "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-import-meta": "^7.2.0", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", "@types/webpack-env": "^1.13.9", "babel-plugin-bundled-import-meta": "^0.3.1", "core-js": "^3.0.1", diff --git a/dev-kits/addon-decorator/package.json b/dev-kits/addon-decorator/package.json index 46411a62501..4f11a1bfe61 100644 --- a/dev-kits/addon-decorator/package.json +++ b/dev-kits/addon-decorator/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-decorator", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "decorator addon for storybook", "keywords": [ "addon", @@ -24,8 +24,8 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/client-api": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/client-api": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.4.0" }, diff --git a/dev-kits/addon-parameter/package.json b/dev-kits/addon-parameter/package.json index 3635264bd1c..a8a75e7f6f6 100644 --- a/dev-kits/addon-parameter/package.json +++ b/dev-kits/addon-parameter/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-parameter", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "parameter addon for storybook", "keywords": [ "addon", @@ -24,12 +24,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "react": "^16.8.3", diff --git a/dev-kits/addon-preview-wrapper/package.json b/dev-kits/addon-preview-wrapper/package.json index 962a13d2adc..6dd5f21c903 100644 --- a/dev-kits/addon-preview-wrapper/package.json +++ b/dev-kits/addon-preview-wrapper/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-preview-wrapper", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "preview wrapper addon for storybook", "keywords": [ "addon", @@ -24,7 +24,7 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", "react": "^16.8.3" }, "publishConfig": { diff --git a/dev-kits/addon-roundtrip/package.json b/dev-kits/addon-roundtrip/package.json index 4fa06bf9fe0..e14ea224931 100644 --- a/dev-kits/addon-roundtrip/package.json +++ b/dev-kits/addon-roundtrip/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-roundtrip", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "description": "roundtrip addon for storybook", "keywords": [ "addon", @@ -24,13 +24,13 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.1", - "@storybook/api": "5.3.0-beta.1", - "@storybook/client-api": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/api": "5.3.0-beta.3", + "@storybook/client-api": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "core-js": "^3.0.1", "global": "^4.3.2", "react": "^16.8.3", diff --git a/docs/package.json b/docs/package.json index 16e5a5ff030..5cc87a73a6d 100644 --- a/docs/package.json +++ b/docs/package.json @@ -38,9 +38,9 @@ "marked": "^0.7.0", "polished": "^3.4.2", "prop-types": "^15.7.2", - "react": "^16.11.0", + "react": "^16.12.0", "react-document-title": "^2.0.3", - "react-dom": "^16.11.0", + "react-dom": "^16.12.0", "react-helmet": "^5.2.0", "react-popper-tooltip": "^2.10.0", "react-router": "^4.3.1", diff --git a/docs/src/pages/basics/exporting-storybook/index.md b/docs/src/pages/basics/exporting-storybook/index.md index ea91a218600..1e5bc07374c 100644 --- a/docs/src/pages/basics/exporting-storybook/index.md +++ b/docs/src/pages/basics/exporting-storybook/index.md @@ -6,7 +6,7 @@ title: 'Exporting Storybook as a Static App' Storybook gives a great developer experience with its dev time features, like instant change updates via Webpack's HMR. But Storybook is also a tool you can use to showcase your components to others. -Demos of [React Native Web](http://necolas.github.io/react-native-web/storybook/) and [React Dates](http://airbnb.io/react-dates/) are a good example for that. +Demos of [React Native Web](https://necolas.github.io/react-native-web/docs/) and [React Dates](http://airbnb.io/react-dates/) are a good example for that. For that, Storybook comes with a tool to export your storybook into a static web app. Then you can deploy it to GitHub pages or any static hosting service. diff --git a/docs/src/pages/basics/introduction/index.md b/docs/src/pages/basics/introduction/index.md index e2969b0c899..d3beedd52bb 100644 --- a/docs/src/pages/basics/introduction/index.md +++ b/docs/src/pages/basics/introduction/index.md @@ -16,6 +16,6 @@ A [Static version](/basics/exporting-storybook) of Storybook can also be built a Here are some featured Storybooks to see how it works: - [Demo of React Dates](http://airbnb.io/react-dates/) - [source](https://github.com/airbnb/react-dates) -- [Demo of React Native Web](http://necolas.github.io/react-native-web/storybook/) - [source](https://github.com/necolas/react-native-web) +- [Demo of React Native Web](https://necolas.github.io/react-native-web/docs/) - [source](https://github.com/necolas/react-native-web) Read the Learn Storybook [tutorial](https://www.learnstorybook.com) for a step by step guide to building an app with Storybook and to see how building components in isolation can supercharge your app development workflow. diff --git a/docs/src/pages/examples/_examples.yml b/docs/src/pages/examples/_examples.yml index 0bbbf651105..ff63b3712ef 100644 --- a/docs/src/pages/examples/_examples.yml +++ b/docs/src/pages/examples/_examples.yml @@ -69,7 +69,7 @@ necolas: title: React Native Web description: Storybook demo for React Native Web. source: https://github.com/necolas/react-native-web - demo: https://necolas.github.io/react-native-web/storybook/ + demo: https://necolas.github.io/react-native-web/docs/ griddle: thumbnail: griddle.jpg title: Griddle diff --git a/docs/src/stories/data.js b/docs/src/stories/data.js index 8e2fdd884ce..4bd0bf47774 100644 --- a/docs/src/stories/data.js +++ b/docs/src/stories/data.js @@ -82,7 +82,7 @@ storiesOf('Toggle', module) owner: 'https://avatars3.githubusercontent.com/u/239676?v=3&s=460', storybook: { name: 'React Native Web', - link: 'https://necolas.github.io/react-native-web/storybook', + link: 'https://necolas.github.io/react-native-web/docs/', }, source: 'https://github.com/necolas/react-native-web', }, diff --git a/docs/src/versions/next.json b/docs/src/versions/next.json index 59033dd5382..542dee25979 100644 --- a/docs/src/versions/next.json +++ b/docs/src/versions/next.json @@ -1 +1 @@ -{"version":"5.3.0-beta.1","info":{"plain":"### Features\n\n* Addon-google-analytics: Add gaOption config ([#8859](https://github.com/storybookjs/storybook/pull/8859))\n\n### Bug Fixes\n\n* Addon-docs: Fix props table props sorting for PropTypes ([#8857](https://github.com/storybookjs/storybook/pull/8857))\n* Fix layout of Preview container ([#8628](https://github.com/storybookjs/storybook/pull/8628))"}} \ No newline at end of file +{"version":"5.3.0-beta.3","info":{"plain":"### Features\n\n* Addon-docs: Rich props table UI ([#8887](https://github.com/storybookjs/storybook/pull/8887))\n* Addon-docs: Improve basic support for Flow props ([#8890](https://github.com/storybookjs/storybook/pull/8890))\n* CLI: Avoid id changes after `storiesof-to-csf` migration ([#8856](https://github.com/storybookjs/storybook/pull/8856))\n\n### Bug Fixes\n\n* Addon-docs: Fix props table for sections props ([#8904](https://github.com/storybookjs/storybook/pull/8904))\n* Addon-docs: Fix Description block when no component provided ([#8902](https://github.com/storybookjs/storybook/pull/8902))\n* Angular: Fix project without `architect.build` option ([#6737](https://github.com/storybookjs/storybook/pull/6737))\n\n### Maintenance\n\n* Addon-docs: Docgen lib maintenance ([#8896](https://github.com/storybookjs/storybook/pull/8896))\n* Examples: Fix stories glob in official-storybook ([#8888](https://github.com/storybookjs/storybook/pull/8888))"}} \ No newline at end of file diff --git a/docs/yarn.lock b/docs/yarn.lock index 995ca7f85a3..8d52d1858b7 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -9807,25 +9807,15 @@ react-dom@^15.6.0: object-assign "^4.1.0" prop-types "^15.5.10" -react-dom@^16.11.0: - version "16.11.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.11.0.tgz#7e7c4a5a85a569d565c2462f5d345da2dd849af5" - integrity sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA== +react-dom@^16.12.0, react-dom@^16.8.3: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" + integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.17.0" - -react-dom@^16.8.3: - version "16.9.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.9.0.tgz#5e65527a5e26f22ae3701131bcccaee9fb0d3962" - integrity sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.15.0" + scheduler "^0.18.0" react-error-overlay@^3.0.0: version "3.0.0" @@ -10040,19 +10030,10 @@ react@^15.6.0: object-assign "^4.1.0" prop-types "^15.5.10" -react@^16.11.0: - version "16.11.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.11.0.tgz#d294545fe62299ccee83363599bf904e4a07fdbb" - integrity sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - -react@^16.8.3: - version "16.9.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.9.0.tgz#40ba2f9af13bc1a38d75dbf2f4359a5185c4f7aa" - integrity sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w== +react@^16.12.0, react@^16.8.3: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" + integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -10882,18 +10863,10 @@ sc-formatter@^3.0.1: resolved "https://registry.yarnpkg.com/sc-formatter/-/sc-formatter-3.0.2.tgz#9abdb14e71873ce7157714d3002477bbdb33c4e6" integrity sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A== -scheduler@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.15.0.tgz#6bfcf80ff850b280fed4aeecc6513bc0b4f17f8e" - integrity sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -scheduler@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.17.0.tgz#7c9c673e4ec781fac853927916d1c426b6f3ddfe" - integrity sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA== +scheduler@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" + integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" diff --git a/examples-native/crna-kitchen-sink/package.json b/examples-native/crna-kitchen-sink/package.json index 681688c7d87..dd0d954a1bc 100644 --- a/examples-native/crna-kitchen-sink/package.json +++ b/examples-native/crna-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "crna-kitchen-sink", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "main": "node_modules/expo/AppEntry.js", "workspaces": { @@ -31,15 +31,15 @@ "devDependencies": { "@babel/core": "^7.2.2", "@babel/plugin-transform-react-jsx-source": "^7.2.0", - "@storybook/addon-actions": "5.3.0-beta.1", - "@storybook/addon-knobs": "5.3.0-beta.1", - "@storybook/addon-links": "5.3.0-beta.1", - "@storybook/addon-ondevice-actions": "5.3.0-beta.1", - "@storybook/addon-ondevice-backgrounds": "5.3.0-beta.1", - "@storybook/addon-ondevice-knobs": "5.3.0-beta.1", - "@storybook/addon-ondevice-notes": "5.3.0-beta.1", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/react-native": "5.3.0-beta.1", + "@storybook/addon-actions": "5.3.0-beta.3", + "@storybook/addon-knobs": "5.3.0-beta.3", + "@storybook/addon-links": "5.3.0-beta.3", + "@storybook/addon-ondevice-actions": "5.3.0-beta.3", + "@storybook/addon-ondevice-backgrounds": "5.3.0-beta.3", + "@storybook/addon-ondevice-knobs": "5.3.0-beta.3", + "@storybook/addon-ondevice-notes": "5.3.0-beta.3", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/react-native": "5.3.0-beta.3", "babel-loader": "^8.0.4", "babel-plugin-module-resolver": "^3.2.0", "babel-preset-expo": "^7.0.0", diff --git a/examples/angular-cli/package.json b/examples/angular-cli/package.json index b1b398f7db0..5838bae5c32 100644 --- a/examples/angular-cli/package.json +++ b/examples/angular-cli/package.json @@ -1,6 +1,6 @@ { "name": "angular-cli", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "license": "MIT", "scripts": { @@ -37,21 +37,21 @@ "@angular/cli": "^8.3.6", "@angular/compiler-cli": "^8.2.8", "@compodoc/compodoc": "^1.1.11", - "@storybook/addon-a11y": "5.3.0-beta.1", - "@storybook/addon-actions": "5.3.0-beta.1", - "@storybook/addon-backgrounds": "5.3.0-beta.1", - "@storybook/addon-centered": "5.3.0-beta.1", - "@storybook/addon-docs": "5.3.0-beta.1", - "@storybook/addon-jest": "5.3.0-beta.1", - "@storybook/addon-knobs": "5.3.0-beta.1", - "@storybook/addon-links": "5.3.0-beta.1", - "@storybook/addon-notes": "5.3.0-beta.1", - "@storybook/addon-options": "5.3.0-beta.1", - "@storybook/addon-storyshots": "5.3.0-beta.1", - "@storybook/addon-storysource": "5.3.0-beta.1", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/angular": "5.3.0-beta.1", - "@storybook/source-loader": "5.3.0-beta.1", + "@storybook/addon-a11y": "5.3.0-beta.3", + "@storybook/addon-actions": "5.3.0-beta.3", + "@storybook/addon-backgrounds": "5.3.0-beta.3", + "@storybook/addon-centered": "5.3.0-beta.3", + "@storybook/addon-docs": "5.3.0-beta.3", + "@storybook/addon-jest": "5.3.0-beta.3", + "@storybook/addon-knobs": "5.3.0-beta.3", + "@storybook/addon-links": "5.3.0-beta.3", + "@storybook/addon-notes": "5.3.0-beta.3", + "@storybook/addon-options": "5.3.0-beta.3", + "@storybook/addon-storyshots": "5.3.0-beta.3", + "@storybook/addon-storysource": "5.3.0-beta.3", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/angular": "5.3.0-beta.3", + "@storybook/source-loader": "5.3.0-beta.3", "@types/core-js": "^2.5.0", "@types/jest": "^24.0.11", "@types/node": "^12.7.9", diff --git a/examples/angular-cli/src/stories/addon-actions.stories.ts b/examples/angular-cli/src/stories/addon-actions.stories.ts index 40d245c49a2..7d9b6ad7777 100644 --- a/examples/angular-cli/src/stories/addon-actions.stories.ts +++ b/examples/angular-cli/src/stories/addon-actions.stories.ts @@ -5,7 +5,7 @@ export default { title: 'Addon/Actions', }; -export const actionOnly = () => ({ +export const ActionOnly = () => ({ component: Button, props: { text: 'Action only', @@ -13,11 +13,11 @@ export const actionOnly = () => ({ }, }); -actionOnly.story = { +ActionOnly.story = { name: 'Action only', }; -export const actionAndMethod = () => ({ +export const ActionAndMethod = () => ({ component: Button, props: { text: 'Action and Method', @@ -29,6 +29,6 @@ export const actionAndMethod = () => ({ }, }); -actionAndMethod.story = { +ActionAndMethod.story = { name: 'Action and method', }; diff --git a/examples/angular-cli/src/stories/addon-jest.stories.ts b/examples/angular-cli/src/stories/addon-jest.stories.ts index c0f821ddc4c..b5ca229ef1b 100644 --- a/examples/angular-cli/src/stories/addon-jest.stories.ts +++ b/examples/angular-cli/src/stories/addon-jest.stories.ts @@ -13,12 +13,12 @@ export default { ], }; -export const appComponentWithJestTests = () => ({ +export const AppComponentWithJestTests = () => ({ component: AppComponent, props: {}, }); -appComponentWithJestTests.story = { +AppComponentWithJestTests.story = { name: 'app.component with jest tests', parameters: { diff --git a/examples/angular-cli/src/stories/addon-knobs.stories.ts b/examples/angular-cli/src/stories/addon-knobs.stories.ts index fc4436e6eb8..36501f9165b 100644 --- a/examples/angular-cli/src/stories/addon-knobs.stories.ts +++ b/examples/angular-cli/src/stories/addon-knobs.stories.ts @@ -26,7 +26,7 @@ export default { }, }; -export const simple = () => { +export const Simple = () => { const name = text('name', 'John Doe'); const age = number('age', 0); const phoneNumber = text('phoneNumber', '555-55-55'); @@ -53,11 +53,11 @@ export const simple = () => { }; }; -simple.story = { +Simple.story = { name: 'Simple', }; -export const allKnobs = () => { +export const AllKnobs = () => { const name = text('name', 'Jane'); const stock = number('stock', 20, { range: true, @@ -101,14 +101,14 @@ export const allKnobs = () => { }; }; -allKnobs.story = { +AllKnobs.story = { name: 'All knobs', }; -export const xssSafety = () => ({ +export const XssSafety = () => ({ template: text('Rendered string', '<img src=x onerror="alert(\'XSS Attack\')" >'), }); -xssSafety.story = { +XssSafety.story = { name: 'XSS safety', }; diff --git a/examples/angular-cli/src/stories/addon-links.stories.ts b/examples/angular-cli/src/stories/addon-links.stories.ts index 785828427eb..065d4df9841 100644 --- a/examples/angular-cli/src/stories/addon-links.stories.ts +++ b/examples/angular-cli/src/stories/addon-links.stories.ts @@ -5,7 +5,7 @@ export default { title: 'Addon/Links', }; -export const buttonWithLinkToAnotherStory = () => ({ +export const ButtonWithLinkToAnotherStory = () => ({ component: Button, props: { text: 'Go to Welcome Story', @@ -13,6 +13,6 @@ export const buttonWithLinkToAnotherStory = () => ({ }, }); -buttonWithLinkToAnotherStory.story = { +ButtonWithLinkToAnotherStory.story = { name: 'button with link to another story', }; diff --git a/examples/angular-cli/src/stories/addon-notes.stories.ts b/examples/angular-cli/src/stories/addon-notes.stories.ts index e4a3b3b5923..87f7bb7d69c 100644 --- a/examples/angular-cli/src/stories/addon-notes.stories.ts +++ b/examples/angular-cli/src/stories/addon-notes.stories.ts @@ -4,7 +4,7 @@ export default { title: 'Addon/Notes', }; -export const simpleNote = () => ({ +export const SimpleNote = () => ({ component: Button, props: { text: 'Notes on some Button', @@ -12,12 +12,12 @@ export const simpleNote = () => ({ }, }); -simpleNote.story = { +SimpleNote.story = { name: 'Simple note', parameters: { notes: 'My notes on some button' }, }; -export const noteWithHtml = () => ({ +export const NoteWithHtml = () => ({ component: Button, props: { text: 'Notes with HTML', @@ -25,7 +25,7 @@ export const noteWithHtml = () => ({ }, }); -noteWithHtml.story = { +NoteWithHtml.story = { name: 'Note with HTML', parameters: { notes: ` diff --git a/examples/angular-cli/src/stories/app.component.stories.ts b/examples/angular-cli/src/stories/app.component.stories.ts index 40f7b779e89..d9a65e40769 100644 --- a/examples/angular-cli/src/stories/app.component.stories.ts +++ b/examples/angular-cli/src/stories/app.component.stories.ts @@ -5,12 +5,12 @@ export default { component: AppComponent, }; -export const componentWithSeparateTemplate = () => ({ +export const ComponentWithSeparateTemplate = () => ({ component: AppComponent, props: {}, }); -componentWithSeparateTemplate.story = { +ComponentWithSeparateTemplate.story = { name: 'Component with separate template', parameters: { docs: { iframeHeight: 400 } }, }; diff --git a/examples/angular-cli/src/stories/component-with-di/di.component.stories.ts b/examples/angular-cli/src/stories/component-with-di/di.component.stories.ts index 92033eada97..59e2734db89 100644 --- a/examples/angular-cli/src/stories/component-with-di/di.component.stories.ts +++ b/examples/angular-cli/src/stories/component-with-di/di.component.stories.ts @@ -5,25 +5,25 @@ export default { title: 'Custom/Dependencies', }; -export const inputsAndInjectDependencies = () => ({ +export const InputsAndInjectDependencies = () => ({ component: DiComponent, props: { title: 'Component dependencies', }, }); -inputsAndInjectDependencies.story = { +InputsAndInjectDependencies.story = { name: 'inputs and inject dependencies', }; -export const inputsAndInjectDependenciesWithKnobs = () => ({ +export const InputsAndInjectDependenciesWithKnobs = () => ({ component: DiComponent, props: { title: text('title', 'Component dependencies'), }, }); -inputsAndInjectDependenciesWithKnobs.story = { +InputsAndInjectDependenciesWithKnobs.story = { name: 'inputs and inject dependencies with knobs', decorators: [withKnobs], }; diff --git a/examples/angular-cli/src/stories/component-with-style/styled.component.stories.ts b/examples/angular-cli/src/stories/component-with-style/styled.component.stories.ts index e94b3b4f21d..868e6dd3548 100644 --- a/examples/angular-cli/src/stories/component-with-style/styled.component.stories.ts +++ b/examples/angular-cli/src/stories/component-with-style/styled.component.stories.ts @@ -4,10 +4,10 @@ export default { title: 'Custom/styleUrls', }; -export const componentWithStyles = () => ({ +export const ComponentWithStyles = () => ({ component: StyledComponent, }); -componentWithStyles.story = { +ComponentWithStyles.story = { name: 'Component with styles', }; diff --git a/examples/angular-cli/src/stories/core.stories.ts b/examples/angular-cli/src/stories/core.stories.ts index 0e8908b13ba..91898719d28 100644 --- a/examples/angular-cli/src/stories/core.stories.ts +++ b/examples/angular-cli/src/stories/core.stories.ts @@ -14,7 +14,7 @@ export default { }, }; -export const passedToStory = ({ parameters: { fileName, ...parameters } }) => ({ +export const PassedToStory = ({ parameters: { fileName, ...parameters } }) => ({ component: Button, props: { text: `Parameters are ${JSON.stringify(parameters)}`, @@ -22,7 +22,7 @@ export const passedToStory = ({ parameters: { fileName, ...parameters } }) => ({ }, }); -passedToStory.story = { +PassedToStory.story = { name: 'passed to story', parameters: { storyParameter }, }; diff --git a/examples/angular-cli/src/stories/custom-pipes.stories.ts b/examples/angular-cli/src/stories/custom-pipes.stories.ts index 48edeb238d0..f0c9d379fce 100644 --- a/examples/angular-cli/src/stories/custom-pipes.stories.ts +++ b/examples/angular-cli/src/stories/custom-pipes.stories.ts @@ -16,25 +16,25 @@ export default { ], }; -export const simple = () => ({ +export const Simple = () => ({ component: NameComponent, props: { field: 'foobar', }, }); -simple.story = { +Simple.story = { name: 'Simple', }; -export const withKnobsStory = () => ({ +export const WithKnobsStory = () => ({ component: NameComponent, props: { field: text('field', 'foobar'), }, }); -withKnobsStory.story = { +WithKnobsStory.story = { name: 'With Knobs', decorators: [withKnobs], }; diff --git a/examples/angular-cli/src/stories/custom-providers.stories.ts b/examples/angular-cli/src/stories/custom-providers.stories.ts index fd5a3acf12b..86b2c209379 100644 --- a/examples/angular-cli/src/stories/custom-providers.stories.ts +++ b/examples/angular-cli/src/stories/custom-providers.stories.ts @@ -16,18 +16,18 @@ export default { ], }; -export const simple = () => ({ +export const Simple = () => ({ component: ServiceComponent, props: { name: 'Static name', }, }); -simple.story = { +Simple.story = { name: 'Simple', }; -export const withKnobsStory = () => { +export const WithKnobsStory = () => { const name = text('name', 'Dynamic knob'); return { @@ -38,7 +38,7 @@ export const withKnobsStory = () => { }; }; -withKnobsStory.story = { +WithKnobsStory.story = { name: 'With knobs', decorators: [withKnobs], }; diff --git a/examples/angular-cli/src/stories/custom-styles.stories.ts b/examples/angular-cli/src/stories/custom-styles.stories.ts index c54b858ad67..207e818174c 100644 --- a/examples/angular-cli/src/stories/custom-styles.stories.ts +++ b/examples/angular-cli/src/stories/custom-styles.stories.ts @@ -12,7 +12,7 @@ export default { ], }; -export const defaultStory = () => ({ +export const DefaultStory = () => ({ template: `<storybook-button-component [text]="text" (onClick)="onClick($event)"></storybook-button-component>`, props: { text: 'Button with custom styles', @@ -28,11 +28,11 @@ export const defaultStory = () => ({ ], }); -defaultStory.story = { +DefaultStory.story = { name: 'Default', }; -export const withKnobsStory = () => ({ +export const WithKnobsStory = () => ({ template: `<storybook-button-component [text]="text" (onClick)="onClick($event)"></storybook-button-component>`, props: { text: text('text', 'Button with custom styles'), @@ -48,7 +48,7 @@ export const withKnobsStory = () => ({ ], }); -withKnobsStory.story = { +WithKnobsStory.story = { name: 'With Knobs', decorators: [withKnobs], }; diff --git a/examples/angular-cli/src/stories/customControlValueAccessor/custom-cva-component.stories.ts b/examples/angular-cli/src/stories/customControlValueAccessor/custom-cva-component.stories.ts index a620d636cea..bb93d416ef2 100644 --- a/examples/angular-cli/src/stories/customControlValueAccessor/custom-cva-component.stories.ts +++ b/examples/angular-cli/src/stories/customControlValueAccessor/custom-cva-component.stories.ts @@ -9,7 +9,7 @@ export default { title: 'Custom/ngModel', }; -export const customControlValueAccessor = () => ({ +export const CustomControlValueAccessor = () => ({ component: CustomCvaComponent, props: { ngModel: 'Type anything', @@ -17,7 +17,7 @@ export const customControlValueAccessor = () => ({ }, }); -customControlValueAccessor.story = { +CustomControlValueAccessor.story = { name: 'custom ControlValueAccessor', parameters: { notes: description }, }; diff --git a/examples/angular-cli/src/stories/doc-button/doc-button.stories.ts b/examples/angular-cli/src/stories/doc-button/doc-button.stories.ts index fba2d69a05b..30faec0ae6c 100644 --- a/examples/angular-cli/src/stories/doc-button/doc-button.stories.ts +++ b/examples/angular-cli/src/stories/doc-button/doc-button.stories.ts @@ -6,7 +6,7 @@ export default { parameters: { docs: { iframeHeight: 120 } }, }; -export const basic = () => ({ +export const Basic = () => ({ component: ButtonComponent, props: { label: 'Docs Test', diff --git a/examples/angular-cli/src/stories/inheritance/inheritance.stories.ts b/examples/angular-cli/src/stories/inheritance/inheritance.stories.ts index 0ca1dfcd367..37060f32ca9 100644 --- a/examples/angular-cli/src/stories/inheritance/inheritance.stories.ts +++ b/examples/angular-cli/src/stories/inheritance/inheritance.stories.ts @@ -5,7 +5,7 @@ export default { title: 'Custom/Inheritance', }; -export const iconButton = () => ({ +export const IconButton = () => ({ component: IconButtonComponent, props: { icon: 'this is icon', @@ -13,17 +13,17 @@ export const iconButton = () => ({ }, }); -iconButton.story = { +IconButton.story = { name: 'icon button', }; -export const baseButton = () => ({ +export const BaseButton = () => ({ component: BaseButtonComponent, props: { label: 'this is label', }, }); -baseButton.story = { +BaseButton.story = { name: 'base button', }; diff --git a/examples/angular-cli/src/stories/metadata-combined.stories.ts b/examples/angular-cli/src/stories/metadata-combined.stories.ts index 4233e46a133..a1af3919269 100644 --- a/examples/angular-cli/src/stories/metadata-combined.stories.ts +++ b/examples/angular-cli/src/stories/metadata-combined.stories.ts @@ -22,18 +22,18 @@ export default { ], }; -export const combined1 = () => ({ +export const Combined1 = () => ({ template: `<storybook-simple-token-component [name]="name"></storybook-simple-token-component>`, props: { name: 'Prop Name', }, }); -combined1.story = { +Combined1.story = { name: 'Combined 1', }; -export const combined2 = () => ({ +export const Combined2 = () => ({ template: `<storybook-simple-token-component [name]="name | customPipe"></storybook-simple-token-component>`, props: { name: 'Prop Name', @@ -43,6 +43,6 @@ export const combined2 = () => ({ }, }); -combined2.story = { +Combined2.story = { name: 'Combined 2', }; diff --git a/examples/angular-cli/src/stories/metadata-individual.stories.ts b/examples/angular-cli/src/stories/metadata-individual.stories.ts index 35392945881..d70c0306f69 100644 --- a/examples/angular-cli/src/stories/metadata-individual.stories.ts +++ b/examples/angular-cli/src/stories/metadata-individual.stories.ts @@ -4,7 +4,7 @@ export default { title: 'Metadata/Individual', }; -export const individual1 = () => ({ +export const Individual1 = () => ({ template: `<storybook-simple-token-component [name]="name"></storybook-simple-token-component>`, props: { name: 'Prop Name', @@ -21,11 +21,11 @@ export const individual1 = () => ({ }, }); -individual1.story = { +Individual1.story = { name: 'Individual 1', }; -export const individual2 = () => ({ +export const Individual2 = () => ({ template: `<storybook-simple-token-component></storybook-simple-token-component>`, moduleMetadata: { imports: [], @@ -43,6 +43,6 @@ export const individual2 = () => ({ }, }); -individual2.story = { +Individual2.story = { name: 'Individual 2', }; diff --git a/examples/angular-cli/src/stories/metadata-shared.stories.ts b/examples/angular-cli/src/stories/metadata-shared.stories.ts index c09bfabb53e..9748a174f30 100644 --- a/examples/angular-cli/src/stories/metadata-shared.stories.ts +++ b/examples/angular-cli/src/stories/metadata-shared.stories.ts @@ -21,21 +21,21 @@ export default { ], }; -export const shared1 = () => ({ +export const Shared1 = () => ({ template: `<storybook-simple-token-component [name]="name"></storybook-simple-token-component>`, props: { name: 'Prop Name', }, }); -shared1.story = { +Shared1.story = { name: 'Shared 1', }; -export const shared2 = () => ({ +export const Shared2 = () => ({ template: `<storybook-simple-token-component></storybook-simple-token-component>`, }); -shared2.story = { +Shared2.story = { name: 'Shared 2', }; diff --git a/examples/angular-cli/src/stories/on-push/on-push.stories.ts b/examples/angular-cli/src/stories/on-push/on-push.stories.ts index 5077336acf9..0246c5e87a3 100644 --- a/examples/angular-cli/src/stories/on-push/on-push.stories.ts +++ b/examples/angular-cli/src/stories/on-push/on-push.stories.ts @@ -6,7 +6,7 @@ export default { decorators: [withKnobs], }; -export const classSpecifiedComponentWithOnPushAndKnobs = () => ({ +export const ClassSpecifiedComponentWithOnPushAndKnobs = () => ({ component: OnPushBoxComponent, props: { word: text('Word', 'OnPush'), @@ -14,7 +14,7 @@ export const classSpecifiedComponentWithOnPushAndKnobs = () => ({ }, }); -classSpecifiedComponentWithOnPushAndKnobs.story = { +ClassSpecifiedComponentWithOnPushAndKnobs.story = { name: 'Class-specified component with OnPush and Knobs', parameters: { notes: ` diff --git a/examples/cra-kitchen-sink/package.json b/examples/cra-kitchen-sink/package.json index 7bcc6980031..50089841f3e 100644 --- a/examples/cra-kitchen-sink/package.json +++ b/examples/cra-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "cra-kitchen-sink", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "scripts": { "build": "react-scripts build", @@ -18,23 +18,23 @@ "react-lifecycles-compat": "^3.0.4" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.1", - "@storybook/addon-actions": "5.3.0-beta.1", - "@storybook/addon-backgrounds": "5.3.0-beta.1", - "@storybook/addon-centered": "5.3.0-beta.1", - "@storybook/addon-docs": "5.3.0-beta.1", - "@storybook/addon-events": "5.3.0-beta.1", - "@storybook/addon-info": "5.3.0-beta.1", - "@storybook/addon-jest": "5.3.0-beta.1", - "@storybook/addon-knobs": "5.3.0-beta.1", - "@storybook/addon-links": "5.3.0-beta.1", - "@storybook/addon-notes": "5.3.0-beta.1", - "@storybook/addon-options": "5.3.0-beta.1", - "@storybook/addon-storyshots": "5.3.0-beta.1", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/client-logger": "5.3.0-beta.1", - "@storybook/react": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addon-a11y": "5.3.0-beta.3", + "@storybook/addon-actions": "5.3.0-beta.3", + "@storybook/addon-backgrounds": "5.3.0-beta.3", + "@storybook/addon-centered": "5.3.0-beta.3", + "@storybook/addon-docs": "5.3.0-beta.3", + "@storybook/addon-events": "5.3.0-beta.3", + "@storybook/addon-info": "5.3.0-beta.3", + "@storybook/addon-jest": "5.3.0-beta.3", + "@storybook/addon-knobs": "5.3.0-beta.3", + "@storybook/addon-links": "5.3.0-beta.3", + "@storybook/addon-notes": "5.3.0-beta.3", + "@storybook/addon-options": "5.3.0-beta.3", + "@storybook/addon-storyshots": "5.3.0-beta.3", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/client-logger": "5.3.0-beta.3", + "@storybook/react": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "react-scripts": "^3.0.1" } } diff --git a/examples/cra-kitchen-sink/src/stories/App.stories.js b/examples/cra-kitchen-sink/src/stories/App.stories.js index 953d945c6f4..2f773b4b223 100644 --- a/examples/cra-kitchen-sink/src/stories/App.stories.js +++ b/examples/cra-kitchen-sink/src/stories/App.stories.js @@ -8,8 +8,8 @@ export default { title: 'App', }; -export const fullApp = () => <App />; +export const FullApp = () => <App />; -fullApp.story = { +FullApp.story = { name: 'full app', }; diff --git a/examples/cra-kitchen-sink/src/stories/Lifecycle.stories.js b/examples/cra-kitchen-sink/src/stories/Lifecycle.stories.js index 0b48d1a4032..0a8fbaceb3f 100644 --- a/examples/cra-kitchen-sink/src/stories/Lifecycle.stories.js +++ b/examples/cra-kitchen-sink/src/stories/Lifecycle.stories.js @@ -5,4 +5,4 @@ export default { title: 'Lifecycle', }; -export const logging = () => <LifecycleLogger />; +export const Logging = () => <LifecycleLogger />; diff --git a/examples/cra-kitchen-sink/src/stories/button.stories.js b/examples/cra-kitchen-sink/src/stories/button.stories.js index b0ec9efecd6..4a6563d040f 100644 --- a/examples/cra-kitchen-sink/src/stories/button.stories.js +++ b/examples/cra-kitchen-sink/src/stories/button.stories.js @@ -28,30 +28,30 @@ export default { component: Button, }; -export const story1 = () => <Button onClick={action('clicked', { depth: 1 })}>Hello Button</Button>; -story1.story = { +export const Story1 = () => <Button onClick={action('clicked', { depth: 1 })}>Hello Button</Button>; +Story1.story = { name: 'with text', parameters: { options: { selectedPanel: 'storybook/actions/panel' }, }, }; -export const story2 = () => ( +export const Story2 = () => ( <Button onClick={action('clicked')}> <span role="img" aria-label="yolo"> 😀 😎 👍 💯 </span> </Button> ); -story2.story = { +Story2.story = { name: 'with some emoji', parameters: { options: { selectedPanel: 'storybook/actions/panel' }, }, }; -export const story3 = () => <Button>Check my notes in the notes panel</Button>; -story3.story = { +export const Story3 = () => <Button>Check my notes in the notes panel</Button>; +Story3.story = { name: 'with notes', parameters: { notes: 'A very simple button', @@ -59,14 +59,14 @@ story3.story = { }, }; -export const story4 = context => ( +export const Story4 = context => ( <Container> <span> click the <InfoButton /> label in top right for info about "{context.name}" </span> </Container> ); -story4.story = { +Story4.story = { name: 'with new info', parameters: { notes: 'Composition: Info(Notes())', diff --git a/examples/cra-kitchen-sink/src/stories/cra-dynamic-import.stories.js b/examples/cra-kitchen-sink/src/stories/cra-dynamic-import.stories.js index 45fb81c1424..24b6f340196 100644 --- a/examples/cra-kitchen-sink/src/stories/cra-dynamic-import.stories.js +++ b/examples/cra-kitchen-sink/src/stories/cra-dynamic-import.stories.js @@ -7,7 +7,7 @@ export default { title: 'CRA', }; -export const story1 = () => { +export const Story1 = () => { if (!Component) { import('@storybook/react/demo').then(({ Button }) => { Component = Button; @@ -20,4 +20,4 @@ export const story1 = () => { return <Component>Hello Button</Component>; }; -story1.story = { name: 'Dynamic import' }; +Story1.story = { name: 'Dynamic import' }; diff --git a/examples/cra-kitchen-sink/src/stories/force-rerender.stories.js b/examples/cra-kitchen-sink/src/stories/force-rerender.stories.js index ad1c9edb4f6..c46682a20c5 100644 --- a/examples/cra-kitchen-sink/src/stories/force-rerender.stories.js +++ b/examples/cra-kitchen-sink/src/stories/force-rerender.stories.js @@ -11,8 +11,8 @@ export default { title: 'Force ReRender', }; -export const button = () => ( - <button type="button" onClick={increment}> +export const Button = () => ( + <Button type="button" onClick={increment}> Click me to increment: {count} - </button> + </Button> ); diff --git a/examples/cra-kitchen-sink/src/stories/long-description.stories.js b/examples/cra-kitchen-sink/src/stories/long-description.stories.js index 02b61f38868..2fc4ffe7394 100644 --- a/examples/cra-kitchen-sink/src/stories/long-description.stories.js +++ b/examples/cra-kitchen-sink/src/stories/long-description.stories.js @@ -8,5 +8,5 @@ export default { decorators: [centered], }; -export const story1 = () => <Button onClick={action('clicked')}>Hello Button</Button>; -story1.story = { name: 'with text' }; +export const Story1 = () => <Button onClick={action('clicked')}>Hello Button</Button>; +Story1.story = { name: 'with text' }; diff --git a/examples/cra-kitchen-sink/src/stories/welcome.stories.js b/examples/cra-kitchen-sink/src/stories/welcome.stories.js index a7203b79b87..878844fa562 100644 --- a/examples/cra-kitchen-sink/src/stories/welcome.stories.js +++ b/examples/cra-kitchen-sink/src/stories/welcome.stories.js @@ -7,5 +7,5 @@ export default { component: Welcome, }; -export const story1 = () => <Welcome showApp={linkTo('Button')} />; -story1.title = 'to Storybook'; +export const Story1 = () => <Welcome showApp={linkTo('Button')} />; +Story1.title = 'to Storybook'; diff --git a/examples/cra-react15/package.json b/examples/cra-react15/package.json index 7fb47833967..b70f4416cef 100644 --- a/examples/cra-react15/package.json +++ b/examples/cra-react15/package.json @@ -1,6 +1,6 @@ { "name": "cra-react15", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "scripts": { "build": "react-scripts build", @@ -18,10 +18,10 @@ "react-scripts": "3.0.1" }, "devDependencies": { - "@storybook/addon-actions": "5.3.0-beta.1", - "@storybook/addon-links": "5.3.0-beta.1", - "@storybook/react": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addon-actions": "5.3.0-beta.3", + "@storybook/addon-links": "5.3.0-beta.3", + "@storybook/react": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "babel-core": "6", "babel-runtime": "6" } diff --git a/examples/cra-react15/src/stories/button.stories.js b/examples/cra-react15/src/stories/button.stories.js index 3c443e29464..1b35a0e35f1 100644 --- a/examples/cra-react15/src/stories/button.stories.js +++ b/examples/cra-react15/src/stories/button.stories.js @@ -9,14 +9,14 @@ export default { }, }; -export const story1 = () => <Button onClick={action('clicked')}>Hello Button</Button>; -story1.story = { name: 'with text' }; +export const Story1 = () => <Button onClick={action('clicked')}>Hello Button</Button>; +Story1.story = { name: 'with text' }; -export const story2 = () => ( +export const Story2 = () => ( <Button onClick={action('clicked')}> <span role="img" aria-label="so cool"> 😀 😎 👍 💯 </span> </Button> ); -story2.story = { name: 'with some emoji' }; +Story2.story = { name: 'with some emoji' }; diff --git a/examples/cra-ts-kitchen-sink/.storybook/presets.js b/examples/cra-ts-kitchen-sink/.storybook/presets.js index 0fa1bcda804..0519eb42237 100644 --- a/examples/cra-ts-kitchen-sink/.storybook/presets.js +++ b/examples/cra-ts-kitchen-sink/.storybook/presets.js @@ -8,6 +8,7 @@ module.exports = [ tsconfigPath: path.resolve(__dirname, '../tsconfig.json'), shouldExtractLiteralValuesFromEnum: true, propFilter: prop => { + // Currently not working, prop.parent is always null. if (prop.parent) { return !prop.parent.fileName.includes('node_modules/@types/react/'); } diff --git a/examples/cra-ts-kitchen-sink/package.json b/examples/cra-ts-kitchen-sink/package.json index c9fb9be7406..d71b6ba7673 100644 --- a/examples/cra-ts-kitchen-sink/package.json +++ b/examples/cra-ts-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "cra-ts-kitchen-sink", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "scripts": { "build": "react-scripts build", @@ -34,15 +34,15 @@ "typescript": "3.6.4" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.1", - "@storybook/addon-actions": "5.3.0-beta.1", - "@storybook/addon-info": "5.3.0-beta.1", - "@storybook/addon-knobs": "5.3.0-beta.1", - "@storybook/addon-links": "5.3.0-beta.1", - "@storybook/addon-options": "5.3.0-beta.1", - "@storybook/addons": "5.3.0-beta.1", + "@storybook/addon-a11y": "5.3.0-beta.3", + "@storybook/addon-actions": "5.3.0-beta.3", + "@storybook/addon-info": "5.3.0-beta.3", + "@storybook/addon-knobs": "5.3.0-beta.3", + "@storybook/addon-links": "5.3.0-beta.3", + "@storybook/addon-options": "5.3.0-beta.3", + "@storybook/addons": "5.3.0-beta.3", "@storybook/preset-create-react-app": "^1.3.1", - "@storybook/react": "5.3.0-beta.1", + "@storybook/react": "5.3.0-beta.3", "@types/enzyme": "^3.9.0", "@types/react": "^16.8.14", "@types/react-dom": "^16.8.2", diff --git a/examples/cra-ts-kitchen-sink/src/components/Button.stories.tsx b/examples/cra-ts-kitchen-sink/src/components/Button.stories.tsx index f7da6411c63..d058304c95f 100644 --- a/examples/cra-ts-kitchen-sink/src/components/Button.stories.tsx +++ b/examples/cra-ts-kitchen-sink/src/components/Button.stories.tsx @@ -10,7 +10,7 @@ export default { type Story = () => any; -export const simpleButton: Story = () => { +export const SimpleButton: Story = () => { const x = 0; return <Button onClick={action('button clicked')}>OK {x}</Button>; }; @@ -20,6 +20,6 @@ const typeOptions = { Action: 'action', }; -export const withType = () => ( +export const WithType = () => ( <Button type={radios('Type', typeOptions, typeOptions.Default) as Type}>Label</Button> ); diff --git a/examples/cra-ts-kitchen-sink/src/stories/0-Welcome.stories.tsx b/examples/cra-ts-kitchen-sink/src/stories/0-Welcome.stories.tsx index fa267f24c31..c76f45f3b4b 100644 --- a/examples/cra-ts-kitchen-sink/src/stories/0-Welcome.stories.tsx +++ b/examples/cra-ts-kitchen-sink/src/stories/0-Welcome.stories.tsx @@ -7,8 +7,8 @@ export default { component: Welcome, }; -export const toStorybook = () => <Welcome showApp={linkTo('Button')} />; +export const ToStorybook = () => <Welcome showApp={linkTo('Button')} />; -toStorybook.story = { +ToStorybook.story = { name: 'to Storybook', }; diff --git a/examples/cra-ts-kitchen-sink/src/stories/1-Button.stories.tsx b/examples/cra-ts-kitchen-sink/src/stories/1-Button.stories.tsx index b4608d78e92..f9cd3c5119d 100644 --- a/examples/cra-ts-kitchen-sink/src/stories/1-Button.stories.tsx +++ b/examples/cra-ts-kitchen-sink/src/stories/1-Button.stories.tsx @@ -7,9 +7,9 @@ export default { component: Button, }; -export const text = () => <Button onClick={action('clicked')}>Hello Button</Button>; +export const Text = () => <Button onClick={action('clicked')}>Hello Button</Button>; -export const emoji = () => ( +export const Emoji = () => ( <Button onClick={action('clicked')}> <span role="img" aria-label="so cool"> 😀 😎 👍 💯 diff --git a/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/ext.js b/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/ext.js new file mode 100644 index 00000000000..df0f646a519 --- /dev/null +++ b/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/ext.js @@ -0,0 +1,12 @@ +import PropTypes from 'prop-types'; + +export const PRESET_SHAPE = { + text: PropTypes.string.isRequired, + startDate: PropTypes.object.isRequired, + endDate: PropTypes.object.isRequired, +}; + +export const SOME_PROP_TYPES = { + ext1: PropTypes.string, + ext2: PropTypes.number, +}; diff --git a/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/prop-types.js b/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/prop-types.js index bcd6246ad96..71cbc5841cb 100644 --- a/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/prop-types.js +++ b/examples/cra-ts-kitchen-sink/src/stories/docgen-tests/types/prop-types.js @@ -1,6 +1,8 @@ +/* eslint-disable react/require-default-props */ /* eslint-disable react/no-unused-prop-types */ import React from 'react'; import PropTypes, { string, shape } from 'prop-types'; +import { PRESET_SHAPE, SOME_PROP_TYPES } from './ext'; const NAMED_OBJECT = { text: PropTypes.string.isRequired, @@ -159,6 +161,7 @@ PropTypesProps.propTypes = { ), }) ), + arrayExternalShape: PropTypes.arrayOf(PropTypes.shape(PRESET_SHAPE)), /** * A simple `objectOf` propType. */ @@ -257,6 +260,7 @@ PropTypesProps.propTypes = { requiredString: PropTypes.string.isRequired, nullDefaultValue: PropTypes.string, undefinedDefaultValue: PropTypes.string, + ...SOME_PROP_TYPES, }; PropTypesProps.defaultProps = { diff --git a/examples/cra-ts-kitchen-sink/src/stories/props-sort.stories.mdx b/examples/cra-ts-kitchen-sink/src/stories/props-sort.stories.mdx index 5c1cadf7ebf..9e234655586 100644 --- a/examples/cra-ts-kitchen-sink/src/stories/props-sort.stories.mdx +++ b/examples/cra-ts-kitchen-sink/src/stories/props-sort.stories.mdx @@ -3,4 +3,5 @@ import { Props } from '@storybook/addon-docs/blocks'; <Meta title="PropsSort" /> -<Props of={PropsSort} /> \ No newline at end of file +<Props of={PropsSort} /> +<Props of={PropsSort} exclude={["foo"]} /> \ No newline at end of file diff --git a/examples/dev-kits/package.json b/examples/dev-kits/package.json index 837d5d6ff63..4a28e55cb6c 100644 --- a/examples/dev-kits/package.json +++ b/examples/dev-kits/package.json @@ -1,22 +1,22 @@ { "name": "@storybook/example-devkits", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "scripts": { "build-storybook": "build-storybook -c ./", "storybook": "start-storybook -p 9011 -c ./" }, "devDependencies": { - "@storybook/addon-decorator": "5.3.0-beta.1", - "@storybook/addon-parameter": "5.3.0-beta.1", - "@storybook/addon-preview-wrapper": "5.3.0-beta.1", - "@storybook/addon-roundtrip": "5.3.0-beta.1", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/node-logger": "5.3.0-beta.1", - "@storybook/react": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addon-decorator": "5.3.0-beta.3", + "@storybook/addon-parameter": "5.3.0-beta.3", + "@storybook/addon-preview-wrapper": "5.3.0-beta.3", + "@storybook/addon-roundtrip": "5.3.0-beta.3", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/node-logger": "5.3.0-beta.3", + "@storybook/react": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "cors": "^2.8.5", "cross-env": "^6.0.3", "enzyme-to-json": "^3.4.1", diff --git a/examples/ember-cli/package.json b/examples/ember-cli/package.json index 01fc0ee73ac..e8190f19c76 100644 --- a/examples/ember-cli/package.json +++ b/examples/ember-cli/package.json @@ -1,6 +1,6 @@ { "name": "ember-example", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "scripts": { "build": "ember build", @@ -15,19 +15,19 @@ }, "devDependencies": { "@babel/core": "^7.3.4", - "@storybook/addon-a11y": "5.3.0-beta.1", - "@storybook/addon-actions": "5.3.0-beta.1", - "@storybook/addon-backgrounds": "5.3.0-beta.1", - "@storybook/addon-centered": "5.3.0-beta.1", - "@storybook/addon-knobs": "5.3.0-beta.1", - "@storybook/addon-links": "5.3.0-beta.1", - "@storybook/addon-notes": "5.3.0-beta.1", - "@storybook/addon-options": "5.3.0-beta.1", - "@storybook/addon-storysource": "5.3.0-beta.1", - "@storybook/addon-viewport": "5.3.0-beta.1", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/ember": "5.3.0-beta.1", - "@storybook/source-loader": "5.3.0-beta.1", + "@storybook/addon-a11y": "5.3.0-beta.3", + "@storybook/addon-actions": "5.3.0-beta.3", + "@storybook/addon-backgrounds": "5.3.0-beta.3", + "@storybook/addon-centered": "5.3.0-beta.3", + "@storybook/addon-knobs": "5.3.0-beta.3", + "@storybook/addon-links": "5.3.0-beta.3", + "@storybook/addon-notes": "5.3.0-beta.3", + "@storybook/addon-options": "5.3.0-beta.3", + "@storybook/addon-storysource": "5.3.0-beta.3", + "@storybook/addon-viewport": "5.3.0-beta.3", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/ember": "5.3.0-beta.3", + "@storybook/source-loader": "5.3.0-beta.3", "babel-loader": "^8", "broccoli-asset-rev": "^3.0.0", "cross-env": "^6.0.3", diff --git a/examples/ember-cli/stories/addon-a11y.stories.js b/examples/ember-cli/stories/addon-a11y.stories.js index a8bcb652920..4958bd0157f 100644 --- a/examples/ember-cli/stories/addon-a11y.stories.js +++ b/examples/ember-cli/stories/addon-a11y.stories.js @@ -14,9 +14,9 @@ export const Default = () => hbs`<button></button>`; export const Label = () => hbs`<button>Testing the a11y addon</button>`; export const Disabled = () => hbs`<button disabled>Testing the a11y addon</button>`; -export const invalidContrast = () => +export const InvalidContrast = () => hbs`<button style="color: black; background-color: brown;">Testing the a11y addon</button>`; -invalidContrast.story = { +InvalidContrast.story = { name: 'Invalid contrast', }; diff --git a/examples/ember-cli/stories/addon-actions.stories.js b/examples/ember-cli/stories/addon-actions.stories.js index aab9fd86f06..60b66a0377d 100644 --- a/examples/ember-cli/stories/addon-actions.stories.js +++ b/examples/ember-cli/stories/addon-actions.stories.js @@ -11,7 +11,7 @@ export default { }, }; -export const button = () => ({ +export const Button = () => ({ template: hbs`<button {{action onClick}}>Click Me</button>`, context: { onClick: action('clicked'), diff --git a/examples/ember-cli/stories/addon-backgrounds.stories.js b/examples/ember-cli/stories/addon-backgrounds.stories.js index 0f8ab7df34b..7f17ebeea6c 100644 --- a/examples/ember-cli/stories/addon-backgrounds.stories.js +++ b/examples/ember-cli/stories/addon-backgrounds.stories.js @@ -11,18 +11,18 @@ export default { }, }; -export const story1 = () => ({ +export const Story1 = () => ({ template: hbs`<button>You should be able to switch backgrounds for this story</button>`, }); -story1.story = { +Story1.story = { name: 'story 1', }; -export const story2 = () => ({ +export const Story2 = () => ({ template: hbs`<button>This one too!</button>`, }); -story2.story = { +Story2.story = { name: 'story 2', }; diff --git a/examples/ember-cli/stories/addon-centered.stories.js b/examples/ember-cli/stories/addon-centered.stories.js index 797e882feda..2382a0b83b8 100644 --- a/examples/ember-cli/stories/addon-centered.stories.js +++ b/examples/ember-cli/stories/addon-centered.stories.js @@ -10,6 +10,6 @@ export default { }, }; -export const button = () => ({ +export const Button = () => ({ template: hbs`<button>A Button</button>`, }); diff --git a/examples/ember-cli/stories/addon-knobs.stories.js b/examples/ember-cli/stories/addon-knobs.stories.js index 7cc3806665d..a379a495814 100644 --- a/examples/ember-cli/stories/addon-knobs.stories.js +++ b/examples/ember-cli/stories/addon-knobs.stories.js @@ -11,7 +11,7 @@ export default { }, }; -export const withText = () => ({ +export const WithText = () => ({ template: hbs` {{welcome-banner style=(if hidden "display: none") @@ -34,6 +34,6 @@ export const withText = () => ({ }, }); -withText.story = { +WithText.story = { name: 'with text', }; diff --git a/examples/ember-cli/stories/addon-links.stories.js b/examples/ember-cli/stories/addon-links.stories.js index 8aba44e7002..539a821fe43 100644 --- a/examples/ember-cli/stories/addon-links.stories.js +++ b/examples/ember-cli/stories/addon-links.stories.js @@ -5,13 +5,13 @@ export default { title: 'Addon/Links', }; -export const goToWelcome = () => ({ +export const GoToWelcome = () => ({ template: hbs`<button {{action onClick}}>This button brings you to welcome</button>`, context: { onClick: linkTo('Welcome'), }, }); -goToWelcome.story = { +GoToWelcome.story = { name: 'Go to welcome', }; diff --git a/examples/ember-cli/stories/addon-notes.stories.js b/examples/ember-cli/stories/addon-notes.stories.js index 25ebe7cf591..a2b963b58da 100644 --- a/examples/ember-cli/stories/addon-notes.stories.js +++ b/examples/ember-cli/stories/addon-notes.stories.js @@ -4,20 +4,20 @@ export default { title: 'Addon/Notes', }; -export const simpleNote = () => ({ +export const SimpleNote = () => ({ template: hbs`<p><strong>Etiam vulputate elit eu venenatis eleifend. Duis nec lectus augue. Morbi egestas diam sed vulputate mollis. Fusce egestas pretium vehicula. Integer sed neque diam. Donec consectetur velit vitae enim varius, ut placerat arcu imperdiet. Praesent sed faucibus arcu. Nullam sit amet nibh a enim eleifend rhoncus. Donec pretium elementum leo at fermentum. Nulla sollicitudin, mauris quis semper tempus, sem metus tristique diam, efficitur pulvinar mi urna id urna.</strong></p>`, }); -simpleNote.story = { +SimpleNote.story = { name: 'Simple note', parameters: { notes: 'My notes on some bold text' }, }; -export const noteWithHtml = () => ({ +export const NoteWithHtml = () => ({ template: hbs`<p>🤔😳😯😮<br/>😄😩😓😱<br/>🤓😑😶😊</p>`, }); -noteWithHtml.story = { +NoteWithHtml.story = { name: 'Note with HTML', parameters: { diff --git a/examples/ember-cli/stories/index.stories.js b/examples/ember-cli/stories/index.stories.js index 4c194a8a2dd..8b3f32fce52 100644 --- a/examples/ember-cli/stories/index.stories.js +++ b/examples/ember-cli/stories/index.stories.js @@ -8,7 +8,7 @@ export default { }, }; -export const basic = () => ({ +export const Basic = () => ({ template: hbs` {{welcome-page}} `, diff --git a/examples/ember-cli/stories/welcome-banner.stories.js b/examples/ember-cli/stories/welcome-banner.stories.js index 3a914a80b41..6b5f3d0bbf8 100644 --- a/examples/ember-cli/stories/welcome-banner.stories.js +++ b/examples/ember-cli/stories/welcome-banner.stories.js @@ -5,7 +5,7 @@ export default { title: 'welcome-banner', }; -export const basic = () => ({ +export const Basic = () => ({ template: hbs` {{welcome-banner backgroundColor=backgroundColor diff --git a/examples/html-kitchen-sink/package.json b/examples/html-kitchen-sink/package.json index 393424c2a88..aefc568476a 100644 --- a/examples/html-kitchen-sink/package.json +++ b/examples/html-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "html-kitchen-sink", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "description": "", "keywords": [], @@ -13,26 +13,26 @@ "storybook": "start-storybook -p 9006" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.1", - "@storybook/addon-actions": "5.3.0-beta.1", - "@storybook/addon-backgrounds": "5.3.0-beta.1", - "@storybook/addon-centered": "5.3.0-beta.1", - "@storybook/addon-docs": "5.3.0-beta.1", - "@storybook/addon-events": "5.3.0-beta.1", - "@storybook/addon-jest": "5.3.0-beta.1", - "@storybook/addon-knobs": "5.3.0-beta.1", - "@storybook/addon-links": "5.3.0-beta.1", - "@storybook/addon-notes": "5.3.0-beta.1", - "@storybook/addon-options": "5.3.0-beta.1", - "@storybook/addon-storyshots": "5.3.0-beta.1", - "@storybook/addon-storysource": "5.3.0-beta.1", - "@storybook/addon-viewport": "5.3.0-beta.1", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/client-api": "5.3.0-beta.1", - "@storybook/core": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/html": "5.3.0-beta.1", - "@storybook/source-loader": "5.3.0-beta.1", + "@storybook/addon-a11y": "5.3.0-beta.3", + "@storybook/addon-actions": "5.3.0-beta.3", + "@storybook/addon-backgrounds": "5.3.0-beta.3", + "@storybook/addon-centered": "5.3.0-beta.3", + "@storybook/addon-docs": "5.3.0-beta.3", + "@storybook/addon-events": "5.3.0-beta.3", + "@storybook/addon-jest": "5.3.0-beta.3", + "@storybook/addon-knobs": "5.3.0-beta.3", + "@storybook/addon-links": "5.3.0-beta.3", + "@storybook/addon-notes": "5.3.0-beta.3", + "@storybook/addon-options": "5.3.0-beta.3", + "@storybook/addon-storyshots": "5.3.0-beta.3", + "@storybook/addon-storysource": "5.3.0-beta.3", + "@storybook/addon-viewport": "5.3.0-beta.3", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/client-api": "5.3.0-beta.3", + "@storybook/core": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/html": "5.3.0-beta.3", + "@storybook/source-loader": "5.3.0-beta.3", "eventemitter3": "^4.0.0", "format-json": "^1.0.3", "global": "^4.3.2", diff --git a/examples/html-kitchen-sink/stories/addon-a11y.stories.js b/examples/html-kitchen-sink/stories/addon-a11y.stories.js index 89942adb7cf..a811c0cee73 100644 --- a/examples/html-kitchen-sink/stories/addon-a11y.stories.js +++ b/examples/html-kitchen-sink/stories/addon-a11y.stories.js @@ -14,15 +14,15 @@ export default { export const Default = () => `<button></button>`; export const Label = () => `<button>${text}</button>`; export const Disabled = () => `<button disabled>${text}</button>`; -export const story4 = () => +export const Story4 = () => `<button style="color: black; background-color: brown;">${text}</button>`; -story4.story = { name: 'Invalid contrast' }; +Story4.story = { name: 'Invalid contrast' }; -export const story5 = () => { +export const Story5 = () => { const div = document.createElement('div'); setTimeout(() => { div.innerHTML = `<button>This button has a delayed render of 1s</button>`; }, 1000); return div; }; -story5.story = { name: 'Delayed render' }; +Story5.story = { name: 'Delayed render' }; diff --git a/examples/html-kitchen-sink/stories/addon-actions.stories.js b/examples/html-kitchen-sink/stories/addon-actions.stories.js index 4b7f110b639..40ec7cb6eba 100644 --- a/examples/html-kitchen-sink/stories/addon-actions.stories.js +++ b/examples/html-kitchen-sink/stories/addon-actions.stories.js @@ -8,19 +8,19 @@ export default { title: 'Addons/Actions', }; -export const story1 = () => withActions('click')(button); -story1.story = { name: 'Hello World' }; -export const story2 = () => withActions('click', 'contextmenu')(button); -story2.story = { name: 'Multiple actions' }; +export const Story1 = () => withActions('click')(button); +Story1.story = { name: 'Hello World' }; +export const Story2 = () => withActions('click', 'contextmenu')(button); +Story2.story = { name: 'Multiple actions' }; -export const story3 = () => +export const Story3 = () => withActions('click', 'contextmenu', { clearOnStoryChange: false })(button); -story3.story = { name: 'Multiple actions + config' }; +Story3.story = { name: 'Multiple actions + config' }; -export const story4 = () => withActions({ click: 'clicked', contextmenu: 'right clicked' })(button); -story4.story = { name: 'Multiple actions, object' }; +export const Story4 = () => withActions({ click: 'clicked', contextmenu: 'right clicked' })(button); +Story4.story = { name: 'Multiple actions, object' }; -export const story5 = () => +export const Story5 = () => withActions({ 'click .btn': 'clicked', contextmenu: 'right clicked' })( () => ` <div> @@ -28,18 +28,18 @@ export const story5 = () => </div> ` ); -story5.story = { name: 'Multiple actions, selector' }; +Story5.story = { name: 'Multiple actions, selector' }; -export const story6 = () => +export const Story6 = () => withActions( { click: 'clicked', contextmenu: 'right clicked' }, { clearOnStoryChange: false } )(button); -story6.story = { name: 'Multiple actions, object + config' }; +Story6.story = { name: 'Multiple actions, object + config' }; -export const story7 = () => pickTarget.withActions('click', 'contextmenu')(button); -story7.story = { name: 'Decorated actions' }; +export const Story7 = () => pickTarget.withActions('click', 'contextmenu')(button); +Story7.story = { name: 'Decorated actions' }; -export const story8 = () => +export const Story8 = () => pickTarget.withActions('click', 'contextmenu', { clearOnStoryChange: false })(button); -story8.story = { name: 'Decorated actions + config' }; +Story8.story = { name: 'Decorated actions + config' }; diff --git a/examples/html-kitchen-sink/stories/addon-backgrounds.stories.js b/examples/html-kitchen-sink/stories/addon-backgrounds.stories.js index 6a2d799ac4c..fdfdb6b9954 100644 --- a/examples/html-kitchen-sink/stories/addon-backgrounds.stories.js +++ b/examples/html-kitchen-sink/stories/addon-backgrounds.stories.js @@ -8,9 +8,9 @@ export default { }, }; -export const story1 = () => +export const Story1 = () => '<span style="color: white">You should be able to switch backgrounds for this story</span>'; -story1.story = { name: 'story 1' }; +Story1.story = { name: 'story 1' }; -export const story2 = () => '<span style="color: white">This one too!</span>'; -story2.story = { name: 'story 2' }; +export const Story2 = () => '<span style="color: white">This one too!</span>'; +Story2.story = { name: 'story 2' }; diff --git a/examples/html-kitchen-sink/stories/addon-centered.stories.js b/examples/html-kitchen-sink/stories/addon-centered.stories.js index 858709b9a32..611afd93433 100644 --- a/examples/html-kitchen-sink/stories/addon-centered.stories.js +++ b/examples/html-kitchen-sink/stories/addon-centered.stories.js @@ -5,5 +5,5 @@ export default { decorators: [centered], }; -export const story1 = () => '<button>I am a Button !</button>'; -story1.story = { name: 'button in center' }; +export const Story1 = () => '<button>I am a Button !</button>'; +Story1.story = { name: 'button in center' }; diff --git a/examples/html-kitchen-sink/stories/addon-jest.stories.js b/examples/html-kitchen-sink/stories/addon-jest.stories.js index f2dee19b523..eb80009be86 100644 --- a/examples/html-kitchen-sink/stories/addon-jest.stories.js +++ b/examples/html-kitchen-sink/stories/addon-jest.stories.js @@ -6,5 +6,5 @@ export default { decorators: [wt({ results })], }; -export const withTests = () => 'This story shows test results'; -withTests.parameters = { jest: 'addon-jest' }; +export const WithTests = () => 'This story shows test results'; +WithTests.parameters = { jest: 'addon-jest' }; diff --git a/examples/html-kitchen-sink/stories/addon-knobs.stories.js b/examples/html-kitchen-sink/stories/addon-knobs.stories.js index e97a4608cdc..7b529a6c410 100644 --- a/examples/html-kitchen-sink/stories/addon-knobs.stories.js +++ b/examples/html-kitchen-sink/stories/addon-knobs.stories.js @@ -34,7 +34,7 @@ export const DOM = () => { return container; }; -export const story3 = () => { +export const Story3 = () => { const name = text('Name', 'John Doe'); const textColor = color('Text color', 'orangered'); cachedContainer.textContent = name; @@ -42,9 +42,9 @@ export const story3 = () => { cachedContainer.style.color = textColor; return cachedContainer; }; -story3.story = { name: 'CSS transitions' }; +Story3.story = { name: 'CSS transitions' }; -export const story4 = () => { +export const Story4 = () => { const name = text('Name', 'Jane'); const stock = number('Stock', 20, { range: true, @@ -85,7 +85,7 @@ export const story4 = () => { </div> `; }; -story4.story = { name: 'All knobs' }; +Story4.story = { name: 'All knobs' }; -export const story5 = () => text('Rendered string', '<img src=x onerror="alert(\'XSS Attack\')" >'); -story5.story = { name: 'XSS safety' }; +export const Story5 = () => text('Rendered string', '<img src=x onerror="alert(\'XSS Attack\')" >'); +Story5.story = { name: 'XSS safety' }; diff --git a/examples/html-kitchen-sink/stories/addon-notes.stories.js b/examples/html-kitchen-sink/stories/addon-notes.stories.js index 795a21fe7a9..9129457c82d 100644 --- a/examples/html-kitchen-sink/stories/addon-notes.stories.js +++ b/examples/html-kitchen-sink/stories/addon-notes.stories.js @@ -2,13 +2,13 @@ export default { title: 'Addons/Notes', }; -export const story1 = () => +export const Story1 = () => `<p> <strong> This is a fragment of HTML </strong> </p>`; -story1.story = { +Story1.story = { name: 'Simple note', parameters: { notes: 'My notes on some bold text', diff --git a/examples/html-kitchen-sink/stories/button.stories.js b/examples/html-kitchen-sink/stories/button.stories.js index 72627d513e5..bf4c9ea5f99 100644 --- a/examples/html-kitchen-sink/stories/button.stories.js +++ b/examples/html-kitchen-sink/stories/button.stories.js @@ -6,18 +6,18 @@ export default { title: 'Demo', }; -export const heading = () => '<h1>Hello World</h1>'; -export const headings = () => +export const Heading = () => '<h1>Hello World</h1>'; +export const Headings = () => '<h1>Hello World</h1><h2>Hello World</h2><h3>Hello World</h3><h4>Hello World</h4>'; -export const button = () => { +export const Button = () => { const btn = document.createElement('button'); btn.innerHTML = 'Hello Button'; btn.addEventListener('click', action('Click')); return btn; }; -export const effect = () => { +export const Effect = () => { useEffect(() => { document.getElementById('button').style.backgroundColor = 'yellow'; }); diff --git a/examples/marko-cli/package.json b/examples/marko-cli/package.json index 57ca8f73acf..19d6be161a8 100644 --- a/examples/marko-cli/package.json +++ b/examples/marko-cli/package.json @@ -1,6 +1,6 @@ { "name": "marko-cli", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "description": "Demo of how to build an app using marko-starter", "repository": { @@ -23,14 +23,14 @@ "marko-starter": "^2.0.4" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.1", - "@storybook/addon-actions": "5.3.0-beta.1", - "@storybook/addon-knobs": "5.3.0-beta.1", - "@storybook/addon-options": "5.3.0-beta.1", - "@storybook/addon-storysource": "5.3.0-beta.1", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/marko": "5.3.0-beta.1", - "@storybook/source-loader": "5.3.0-beta.1", + "@storybook/addon-a11y": "5.3.0-beta.3", + "@storybook/addon-actions": "5.3.0-beta.3", + "@storybook/addon-knobs": "5.3.0-beta.3", + "@storybook/addon-options": "5.3.0-beta.3", + "@storybook/addon-storysource": "5.3.0-beta.3", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/marko": "5.3.0-beta.3", + "@storybook/source-loader": "5.3.0-beta.3", "prettier": "^1.16.4", "webpack": "^4.33.0" } diff --git a/examples/marko-cli/src/stories/hello.stories.js b/examples/marko-cli/src/stories/hello.stories.js index 4c9e74866c6..a6a717560ad 100644 --- a/examples/marko-cli/src/stories/hello.stories.js +++ b/examples/marko-cli/src/stories/hello.stories.js @@ -8,5 +8,5 @@ export default { }; export const Simple = () => ({ input: { name: 'abc', age: 20 } }); -export const story2 = () => 'NOT A MARKO RENDER_RESULT'; -story2.story = { name: 'with ERROR!' }; +export const Story2 = () => 'NOT A MARKO RENDER_RESULT'; +Story2.story = { name: 'with ERROR!' }; diff --git a/examples/mithril-kitchen-sink/package.json b/examples/mithril-kitchen-sink/package.json index 231ed830664..8fcff6ef645 100644 --- a/examples/mithril-kitchen-sink/package.json +++ b/examples/mithril-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "mithril-example", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "scripts": { "build-storybook": "build-storybook", @@ -10,20 +10,20 @@ "mithril": "^1.1.6" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.1", - "@storybook/addon-actions": "5.3.0-beta.1", - "@storybook/addon-backgrounds": "5.3.0-beta.1", - "@storybook/addon-centered": "5.3.0-beta.1", - "@storybook/addon-knobs": "5.3.0-beta.1", - "@storybook/addon-links": "5.3.0-beta.1", - "@storybook/addon-notes": "5.3.0-beta.1", - "@storybook/addon-options": "5.3.0-beta.1", - "@storybook/addon-storyshots": "5.3.0-beta.1", - "@storybook/addon-storysource": "5.3.0-beta.1", - "@storybook/addon-viewport": "5.3.0-beta.1", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/mithril": "5.3.0-beta.1", - "@storybook/source-loader": "5.3.0-beta.1", + "@storybook/addon-a11y": "5.3.0-beta.3", + "@storybook/addon-actions": "5.3.0-beta.3", + "@storybook/addon-backgrounds": "5.3.0-beta.3", + "@storybook/addon-centered": "5.3.0-beta.3", + "@storybook/addon-knobs": "5.3.0-beta.3", + "@storybook/addon-links": "5.3.0-beta.3", + "@storybook/addon-notes": "5.3.0-beta.3", + "@storybook/addon-options": "5.3.0-beta.3", + "@storybook/addon-storyshots": "5.3.0-beta.3", + "@storybook/addon-storysource": "5.3.0-beta.3", + "@storybook/addon-viewport": "5.3.0-beta.3", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/mithril": "5.3.0-beta.3", + "@storybook/source-loader": "5.3.0-beta.3", "webpack": "^4.33.0" } } diff --git a/examples/mithril-kitchen-sink/src/stories/addon-actions.stories.js b/examples/mithril-kitchen-sink/src/stories/addon-actions.stories.js index 193629f7ef8..aa033b382be 100644 --- a/examples/mithril-kitchen-sink/src/stories/addon-actions.stories.js +++ b/examples/mithril-kitchen-sink/src/stories/addon-actions.stories.js @@ -8,28 +8,28 @@ export default { title: 'Addons/Actions', }; -export const story1 = () => ({ +export const Story1 = () => ({ view: () => <Button onclick={action('logo1')}>Click me to log the action</Button>, }); -story1.story = { name: 'Action only' }; +Story1.story = { name: 'Action only' }; -export const story2 = () => ({ +export const Story2 = () => ({ view: () => ( <Button {...actions('onclick', 'ondblclick')}>(Double) click me to log the action</Button> ), }); -story2.story = { name: 'Multiple actions' }; +Story2.story = { name: 'Multiple actions' }; -export const story3 = () => ({ +export const Story3 = () => ({ view: () => ( <Button {...actions({ onclick: 'clicked', ondblclick: 'double clicked' })}> (Double) click me to log the action </Button> ), }); -story3.story = { name: 'Multiple actions, object' }; +Story3.story = { name: 'Multiple actions, object' }; -export const story4 = () => ({ +export const Story4 = () => ({ view: () => ( <Button onclick={e => { @@ -41,4 +41,4 @@ export const story4 = () => ({ </Button> ), }); -story4.story = { name: 'Action and method' }; +Story4.story = { name: 'Action and method' }; diff --git a/examples/mithril-kitchen-sink/src/stories/addon-backgrounds.stories.js b/examples/mithril-kitchen-sink/src/stories/addon-backgrounds.stories.js index 7423669b09a..48c15869195 100644 --- a/examples/mithril-kitchen-sink/src/stories/addon-backgrounds.stories.js +++ b/examples/mithril-kitchen-sink/src/stories/addon-backgrounds.stories.js @@ -13,12 +13,12 @@ export default { }, }; -export const story1 = () => ({ +export const Story1 = () => ({ view: () => <BaseButton label="You should be able to switch backgrounds for this story" />, }); -story1.story = { name: 'story 1' }; +Story1.story = { name: 'story 1' }; -export const story2 = () => ({ +export const Story2 = () => ({ view: () => <BaseButton label="This one too!" />, }); -story2.story = { name: 'story 2' }; +Story2.story = { name: 'story 2' }; diff --git a/examples/mithril-kitchen-sink/src/stories/addon-knobs.stories.js b/examples/mithril-kitchen-sink/src/stories/addon-knobs.stories.js index 6d8b76d6ace..4cf79669f6a 100644 --- a/examples/mithril-kitchen-sink/src/stories/addon-knobs.stories.js +++ b/examples/mithril-kitchen-sink/src/stories/addon-knobs.stories.js @@ -29,7 +29,7 @@ export const Simple = () => { }; }; -export const story2 = () => { +export const Story2 = () => { const name = text('Name', 'Jane'); const stock = number('Stock', 20, { range: true, @@ -75,9 +75,9 @@ export const story2 = () => { ), }; }; -story2.story = { name: 'All knobs' }; +Story2.story = { name: 'All knobs' }; -export const story3 = () => ({ +export const Story3 = () => ({ view: () => text('Rendered string', '<img src=x onerror="alert(\'XSS Attack\')" >'), }); -story3.story = { name: 'XSS safety' }; +Story3.story = { name: 'XSS safety' }; diff --git a/examples/mithril-kitchen-sink/src/stories/addon-links.stories.js b/examples/mithril-kitchen-sink/src/stories/addon-links.stories.js index 72589574ae1..ea20da6fa52 100644 --- a/examples/mithril-kitchen-sink/src/stories/addon-links.stories.js +++ b/examples/mithril-kitchen-sink/src/stories/addon-links.stories.js @@ -9,7 +9,7 @@ export default { title: 'Addons/Links', }; -export const story1 = () => ({ +export const Story1 = () => ({ view: () => <Button onclick={linkTo('Welcome')}>This buttons links to Welcome</Button>, }); -story1.story = { name: 'Go to welcome' }; +Story1.story = { name: 'Go to welcome' }; diff --git a/examples/mithril-kitchen-sink/src/stories/addon-notes.stories.js b/examples/mithril-kitchen-sink/src/stories/addon-notes.stories.js index 6801d66fcec..26a9b8a401d 100644 --- a/examples/mithril-kitchen-sink/src/stories/addon-notes.stories.js +++ b/examples/mithril-kitchen-sink/src/stories/addon-notes.stories.js @@ -6,7 +6,7 @@ export default { title: 'Addons/Notes', }; -export const story1 = () => ({ +export const Story1 = () => ({ view: () => ( <p> <strong> @@ -21,12 +21,12 @@ export const story1 = () => ({ ), }); -story1.story = { +Story1.story = { name: 'Simple note', parameters: { notes: 'My notes on some bold text' }, }; -export const story2 = () => ({ +export const Story2 = () => ({ view: () => ( <p> <span>🤔😳😯😮</span> @@ -38,7 +38,7 @@ export const story2 = () => ({ ), }); -story2.story = { +Story2.story = { name: 'Note with HTML', parameters: { notes: ` diff --git a/examples/mithril-kitchen-sink/src/stories/button.stories.js b/examples/mithril-kitchen-sink/src/stories/button.stories.js index ef051b16dec..f172c6abe7f 100644 --- a/examples/mithril-kitchen-sink/src/stories/button.stories.js +++ b/examples/mithril-kitchen-sink/src/stories/button.stories.js @@ -12,12 +12,12 @@ export default { }, }; -export const story1 = () => ({ +export const Story1 = () => ({ view: () => m(Button, { onclick: action('clicked') }, 'Hello Button'), }); -story1.story = { name: 'with text' }; +Story1.story = { name: 'with text' }; -export const story2 = () => ({ +export const Story2 = () => ({ view: () => m( Button, @@ -25,4 +25,4 @@ export const story2 = () => ({ m('span', { role: 'img', ariaLabel: 'so cool' }, '😀 😎 👍 💯') ), }); -story2.story = { name: 'with some emoji' }; +Story2.story = { name: 'with some emoji' }; diff --git a/examples/mithril-kitchen-sink/src/stories/welcome.stories.js b/examples/mithril-kitchen-sink/src/stories/welcome.stories.js index 60ead95a694..c30203e117c 100644 --- a/examples/mithril-kitchen-sink/src/stories/welcome.stories.js +++ b/examples/mithril-kitchen-sink/src/stories/welcome.stories.js @@ -7,7 +7,7 @@ export default { component: Welcome, }; -export const story1 = () => ({ +export const Story1 = () => ({ view: () => m(Welcome, { showApp: linkTo('Button') }), }); -story1.story = { name: 'to Storybook' }; +Story1.story = { name: 'to Storybook' }; diff --git a/examples/official-storybook/components/ButtonGroup.js b/examples/official-storybook/components/ButtonGroup.js new file mode 100644 index 00000000000..01953ea10d9 --- /dev/null +++ b/examples/official-storybook/components/ButtonGroup.js @@ -0,0 +1,17 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +/** ButtonGroup component description from docgen */ +export const ButtonGroup = ({ background, children }) => ( + <div style={{ background }}>{children}</div> +); + +ButtonGroup.defaultProps = { + background: '#ff0', + children: null, +}; + +ButtonGroup.propTypes = { + background: PropTypes.string, + children: PropTypes.arrayOf(PropTypes.element), +}; diff --git a/examples/official-storybook/main.js b/examples/official-storybook/main.js index ebd5bdbf7d7..74dadf2bd33 100644 --- a/examples/official-storybook/main.js +++ b/examples/official-storybook/main.js @@ -1,9 +1,9 @@ module.exports = { presets: ['@storybook/addon-docs/preset'], stories: [ - '../../lib/ui/src/**/*.stories./(js|tsx|mdx)', + '../../lib/ui/src/**/*.stories.(js|tsx|mdx)', '../../lib/components/src/**/*.stories.(js|tsx|mdx)', - './stories/*.stories.(js|tsx|mdx)', + './stories/**/*.stories.(js|tsx|mdx)', ], addons: [ '@storybook/addon-storysource/register', diff --git a/examples/official-storybook/package.json b/examples/official-storybook/package.json index 9020903ecf8..dc24b347e49 100644 --- a/examples/official-storybook/package.json +++ b/examples/official-storybook/package.json @@ -1,6 +1,6 @@ { "name": "official-storybook", - "version": "5.3.0-beta.1", + "version": "5.3.0-beta.3", "private": true, "scripts": { "build-storybook": "cross-env STORYBOOK_DISPLAY_WARNING=true DISPLAY_WARNING=true build-storybook -c ./", @@ -13,34 +13,34 @@ }, "devDependencies": { "@packtracker/webpack-plugin": "^2.0.1", - "@storybook/addon-a11y": "5.3.0-beta.1", - "@storybook/addon-actions": "5.3.0-beta.1", - "@storybook/addon-backgrounds": "5.3.0-beta.1", - "@storybook/addon-centered": "5.3.0-beta.1", - "@storybook/addon-contexts": "5.3.0-beta.1", - "@storybook/addon-cssresources": "5.3.0-beta.1", - "@storybook/addon-design-assets": "5.3.0-beta.1", - "@storybook/addon-docs": "5.3.0-beta.1", - "@storybook/addon-events": "5.3.0-beta.1", - "@storybook/addon-graphql": "5.3.0-beta.1", - "@storybook/addon-info": "5.3.0-beta.1", - "@storybook/addon-jest": "5.3.0-beta.1", - "@storybook/addon-knobs": "5.3.0-beta.1", - "@storybook/addon-links": "5.3.0-beta.1", - "@storybook/addon-notes": "5.3.0-beta.1", - "@storybook/addon-options": "5.3.0-beta.1", - "@storybook/addon-queryparams": "5.3.0-beta.1", - "@storybook/addon-storyshots": "5.3.0-beta.1", - "@storybook/addon-storyshots-puppeteer": "5.3.0-beta.1", - "@storybook/addon-storysource": "5.3.0-beta.1", - "@storybook/addon-viewport": "5.3.0-beta.1", - "@storybook/addons": "5.3.0-beta.1", - "@storybook/components": "5.3.0-beta.1", - "@storybook/core-events": "5.3.0-beta.1", - "@storybook/node-logger": "5.3.0-beta.1", - "@storybook/react": "5.3.0-beta.1", - "@storybook/source-loader": "5.3.0-beta.1", - "@storybook/theming": "5.3.0-beta.1", + "@storybook/addon-a11y": "5.3.0-beta.3", + "@storybook/addon-actions": "5.3.0-beta.3", + "@storybook/addon-backgrounds": "5.3.0-beta.3", + "@storybook/addon-centered": "5.3.0-beta.3", + "@storybook/addon-contexts": "5.3.0-beta.3", + "@storybook/addon-cssresources": "5.3.0-beta.3", + "@storybook/addon-design-assets": "5.3.0-beta.3", + "@storybook/addon-docs": "5.3.0-beta.3", + "@storybook/addon-events": "5.3.0-beta.3", + "@storybook/addon-graphql": "5.3.0-beta.3", + "@storybook/addon-info": "5.3.0-beta.3", + "@storybook/addon-jest": "5.3.0-beta.3", + "@storybook/addon-knobs": "5.3.0-beta.3", + "@storybook/addon-links": "5.3.0-beta.3", + "@storybook/addon-notes": "5.3.0-beta.3", + "@storybook/addon-options": "5.3.0-beta.3", + "@storybook/addon-queryparams": "5.3.0-beta.3", + "@storybook/addon-storyshots": "5.3.0-beta.3", + "@storybook/addon-storyshots-puppeteer": "5.3.0-beta.3", + "@storybook/addon-storysource": "5.3.0-beta.3", + "@storybook/addon-viewport": "5.3.0-beta.3", + "@storybook/addons": "5.3.0-beta.3", + "@storybook/components": "5.3.0-beta.3", + "@storybook/core-events": "5.3.0-beta.3", + "@storybook/node-logger": "5.3.0-beta.3", + "@storybook/react": "5.3.0-beta.3", + "@storybook/source-loader": "5.3.0-beta.3", + "@storybook/theming": "5.3.0-beta.3", "cors": "^2.8.5", "cross-env": "^6.0.3", "enzyme-to-json": "^3.4.1", diff --git a/examples/official-storybook/preview.js b/examples/official-storybook/preview.js index b4cacdbb4f3..f536535ede7 100644 --- a/examples/official-storybook/preview.js +++ b/examples/official-storybook/preview.js @@ -56,12 +56,6 @@ addParameters({ { name: 'dark', value: '#222222' }, ], docs: { - // eslint-disable-next-line react/prop-types - page: ({ context }) => ( - <DocsPage - context={context} - subtitleSlot={({ selectedKind }) => `Subtitle: ${selectedKind}`} - /> - ), + page: () => <DocsPage subtitleSlot={({ selectedKind }) => `Subtitle: ${selectedKind}`} />, }, }); diff --git a/examples/official-storybook/stories/addon-a11y/base-button.stories.js b/examples/official-storybook/stories/addon-a11y/base-button.stories.js index cfdac38ea8b..64f1aded15c 100644 --- a/examples/official-storybook/stories/addon-a11y/base-button.stories.js +++ b/examples/official-storybook/stories/addon-a11y/base-button.stories.js @@ -16,11 +16,11 @@ export const Default = () => <BaseButton label="" />; export const Label = () => <BaseButton label={text} />; export const Disabled = () => <BaseButton disabled label={text} />; -export const invalidContrast = () => ( +export const InvalidContrast = () => ( // FIXME: has no effect on score <BaseButton style={{ color: 'black', backgroundColor: 'black' }} label={text} /> ); -invalidContrast.story = { +InvalidContrast.story = { name: 'Invalid contrast', }; diff --git a/examples/official-storybook/stories/addon-a11y/button.stories.js b/examples/official-storybook/stories/addon-a11y/button.stories.js index 6f030c88bec..a59bd7a4860 100644 --- a/examples/official-storybook/stories/addon-a11y/button.stories.js +++ b/examples/official-storybook/stories/addon-a11y/button.stories.js @@ -15,7 +15,7 @@ export const Default = () => <Button />; export const Content = () => <Button content={text} />; export const Label = () => <Button label={text} />; export const Disabled = () => <Button disabled content={text} />; -export const invalidContrast = () => <Button contrast="wrong" content={text} />; -invalidContrast.story = { +export const InvalidContrast = () => <Button contrast="wrong" content={text} />; +InvalidContrast.story = { name: 'Invalid contrast', }; diff --git a/examples/official-storybook/stories/addon-a11y/form.stories.js b/examples/official-storybook/stories/addon-a11y/form.stories.js index d0df82b3b09..e120332ce11 100644 --- a/examples/official-storybook/stories/addon-a11y/form.stories.js +++ b/examples/official-storybook/stories/addon-a11y/form.stories.js @@ -12,29 +12,29 @@ export default { }, }; -export const withoutLabel = () => ( +export const WithoutLabel = () => ( <Form.Field label=""> <Form.Input /> </Form.Field> ); -withoutLabel.story = { +WithoutLabel.story = { name: 'Without Label', }; -export const withLabel = () => ( +export const WithLabel = () => ( <Form.Field label={text}> <Form.Input id="1" /> </Form.Field> ); -withLabel.story = { +WithLabel.story = { name: 'With label', }; -export const withPlaceholder = () => ( +export const WithPlaceholder = () => ( <Form.Field label=""> <Form.Input id="1" placeholder={text} /> </Form.Field> ); -withPlaceholder.story = { +WithPlaceholder.story = { name: 'With placeholder', }; diff --git a/examples/official-storybook/stories/addon-a11y/image.stories.js b/examples/official-storybook/stories/addon-a11y/image.stories.js index 7b516b0c7cd..9a124605cf1 100644 --- a/examples/official-storybook/stories/addon-a11y/image.stories.js +++ b/examples/official-storybook/stories/addon-a11y/image.stories.js @@ -11,13 +11,13 @@ export default { }, }; -export const withoutAlt = () => <img src={image} />; -withoutAlt.story = { +export const WithoutAlt = () => <img src={image} />; +WithoutAlt.story = { name: 'Without alt', }; -export const withoutAltButUnchecked = () => <img src={image} />; -withoutAltButUnchecked.story = { +export const WithoutAltButUnchecked = () => <img src={image} />; +WithoutAltButUnchecked.story = { name: 'Without alt but unchecked', parameters: { a11y: { @@ -30,8 +30,8 @@ withoutAltButUnchecked.story = { }, }; -export const withAlt = () => <img src={image} alt={text} />; -withAlt.story = { +export const WithAlt = () => <img src={image} alt={text} />; +WithAlt.story = { name: 'With alt', }; diff --git a/examples/official-storybook/stories/addon-a11y/typography.stories.js b/examples/official-storybook/stories/addon-a11y/typography.stories.js index 1c51cef77ac..9fc6868def1 100644 --- a/examples/official-storybook/stories/addon-a11y/typography.stories.js +++ b/examples/official-storybook/stories/addon-a11y/typography.stories.js @@ -19,26 +19,26 @@ export const Correct = () => ( </Fragment> ); -export const emptyHeading = () => <h1 />; +export const EmptyHeading = () => <h1 />; -emptyHeading.story = { +EmptyHeading.story = { name: 'Empty Heading', }; -export const emptyParagraph = () => <p />; +export const EmptyParagraph = () => <p />; -emptyParagraph.story = { +EmptyParagraph.story = { name: 'Empty Paragraph', }; -export const emptyLink = () => <a href={href} />; +export const EmptyLink = () => <a href={href} />; -emptyLink.story = { +EmptyLink.story = { name: 'Empty Link', }; -export const linkWithoutHref = () => <a>{`${text}...`}</a>; +export const LinkWithoutHref = () => <a>{`${text}...`}</a>; -linkWithoutHref.story = { +LinkWithoutHref.story = { name: 'Link without href', }; diff --git a/examples/official-storybook/stories/addon-actions.stories.js b/examples/official-storybook/stories/addon-actions.stories.js index 66ae37eadea..f28d05bd18d 100644 --- a/examples/official-storybook/stories/addon-actions.stories.js +++ b/examples/official-storybook/stories/addon-actions.stories.js @@ -23,39 +23,39 @@ export default { }, }; -export const basicExample = () => <Button onClick={action('hello-world')}>Hello World</Button>; +export const BasicExample = () => <Button onClick={action('hello-world')}>Hello World</Button>; -basicExample.story = { +BasicExample.story = { name: 'Basic example', }; -export const multipleActions = () => ( +export const MultipleActions = () => ( <Button {...actions('onClick', 'onMouseOver')}>Hello World</Button> ); -multipleActions.story = { +MultipleActions.story = { name: 'Multiple actions', }; -export const multipleActionsConfig = () => ( +export const MultipleActionsConfig = () => ( <Button {...actions('onClick', 'onMouseOver', { clearOnStoryChange: false })}> Moving away from this story will persist the action logger </Button> ); -multipleActionsConfig.story = { +MultipleActionsConfig.story = { name: 'Multiple actions + config', }; -export const multipleActionsAsObject = () => ( +export const MultipleActionsAsObject = () => ( <Button {...actions({ onClick: 'clicked', onMouseOver: 'hovered' })}>Hello World</Button> ); -multipleActionsAsObject.story = { +MultipleActionsAsObject.story = { name: 'Multiple actions as object', }; -export const multipleActionsObjectConfig = () => ( +export const MultipleActionsObjectConfig = () => ( <Button {...actions({ onClick: 'clicked', onMouseOver: 'hovered' }, { clearOnStoryChange: false })} > @@ -63,63 +63,63 @@ export const multipleActionsObjectConfig = () => ( </Button> ); -multipleActionsObjectConfig.story = { +MultipleActionsObjectConfig.story = { name: 'Multiple actions, object + config', }; -export const decoratedAction = () => ( +export const DecoratedAction = () => ( <Button onClick={pickNative.action('decorated')}>Native Event</Button> ); -decoratedAction.story = { +DecoratedAction.story = { name: 'Decorated action', }; -export const decoratedActionConfig = () => ( +export const DecoratedActionConfig = () => ( <Button onClick={pickNative.action('decorated', { clearOnStoryChange: false })}> Moving away from this story will persist the action logger </Button> ); -decoratedActionConfig.story = { +DecoratedActionConfig.story = { name: 'Decorated action + config', }; -export const decoratedActions = () => ( +export const DecoratedActions = () => ( <Button {...pickNative.actions('onClick', 'onMouseOver')}>Native Event</Button> ); -decoratedActions.story = { +DecoratedActions.story = { name: 'Decorated actions', }; -export const decoratedActionsConfig = () => ( +export const DecoratedActionsConfig = () => ( <Button {...pickNative.actions('onClick', 'onMouseOver', { clearOnStoryChange: false })}> Moving away from this story will persist the action logger </Button> ); -decoratedActionsConfig.story = { +DecoratedActionsConfig.story = { name: 'Decorated actions + config', }; -export const circularPayload = () => { +export const CircularPayload = () => { const circular = { foo: {} }; circular.foo.circular = circular; return <Button onClick={() => action('circular')(circular)}>Circular Payload</Button>; }; -circularPayload.story = { +CircularPayload.story = { name: 'Circular Payload', }; -export const reservedKeywordAsName = () => <Button onClick={action('delete')}>Delete</Button>; +export const ReservedKeywordAsName = () => <Button onClick={action('delete')}>Delete</Button>; -reservedKeywordAsName.story = { +ReservedKeywordAsName.story = { name: 'Reserved keyword as name', }; -export const allTypes = () => { +export const AllTypes = () => { function A() {} function B() {} @@ -185,11 +185,11 @@ export const allTypes = () => { ); }; -allTypes.story = { +AllTypes.story = { name: 'All types', }; -export const configureActionsDepth = () => { +export const ConfigureActionsDepth = () => { configureActions({ depth: 2, }); @@ -201,7 +201,7 @@ export const configureActionsDepth = () => { ); }; -export const persistingTheActionLogger = () => ( +export const PersistingTheActionLogger = () => ( <Fragment> <p>Moving away from this story will persist the action logger</p> <Button onClick={action('clear-action-logger', { clearOnStoryChange: false })}> @@ -210,11 +210,11 @@ export const persistingTheActionLogger = () => ( </Fragment> ); -persistingTheActionLogger.story = { +PersistingTheActionLogger.story = { name: 'Persisting the action logger', }; -export const limitActionOutput = () => { +export const LimitActionOutput = () => { configureActions({ limit: 2, }); @@ -226,6 +226,6 @@ export const limitActionOutput = () => { </Fragment> ); }; -limitActionOutput.story = { +LimitActionOutput.story = { name: 'Limit Action Output', }; diff --git a/examples/official-storybook/stories/addon-backgrounds.stories.js b/examples/official-storybook/stories/addon-backgrounds.stories.js index 17ef4de2626..738f174bc2d 100644 --- a/examples/official-storybook/stories/addon-backgrounds.stories.js +++ b/examples/official-storybook/stories/addon-backgrounds.stories.js @@ -16,23 +16,23 @@ export default { }, }; -export const story1 = () => ( +export const Story1 = () => ( <BaseButton label="You should be able to switch backgrounds for this story" /> ); -story1.story = { +Story1.story = { name: 'story 1', }; -export const story2 = () => <BaseButton label="This one too!" />; +export const Story2 = () => <BaseButton label="This one too!" />; -story2.story = { +Story2.story = { name: 'story 2', }; -export const overridden = () => <BaseButton label="This one should have different backgrounds" />; +export const Overridden = () => <BaseButton label="This one should have different backgrounds" />; -overridden.story = { +Overridden.story = { parameters: { backgrounds: [ { name: 'pink', value: 'hotpink' }, @@ -41,9 +41,9 @@ overridden.story = { }, }; -export const disabledVia = () => <BaseButton label="This one should not use backgrounds" />; +export const DisabledVia = () => <BaseButton label="This one should not use backgrounds" />; -disabledVia.story = { +DisabledVia.story = { name: 'disabled via []', parameters: { @@ -51,11 +51,11 @@ disabledVia.story = { }, }; -export const skippedViaDisableTrue = () => ( +export const SkippedViaDisableTrue = () => ( <BaseButton label="This one should not use backgrounds either" /> ); -skippedViaDisableTrue.story = { +SkippedViaDisableTrue.story = { name: 'skipped via disable:true', parameters: { @@ -63,11 +63,11 @@ skippedViaDisableTrue.story = { }, }; -export const gridCellSize = () => ( +export const GridCellSize = () => ( <BaseButton label="This one should have a different grid cell size" /> ); -gridCellSize.story = { +GridCellSize.story = { parameters: { grid: { cellSize: 10 }, }, diff --git a/examples/official-storybook/stories/addon-centered.stories.js b/examples/official-storybook/stories/addon-centered.stories.js index 44cc6d60502..bd428217e74 100644 --- a/examples/official-storybook/stories/addon-centered.stories.js +++ b/examples/official-storybook/stories/addon-centered.stories.js @@ -8,15 +8,15 @@ export default { decorators: [centered], }; -export const story1 = () => <BaseButton label="This story should be centered" />; +export const Story1 = () => <BaseButton label="This story should be centered" />; -story1.story = { +Story1.story = { name: 'story 1', }; -export const story2 = () => <BaseButton label="This story should not be centered" />; +export const Story2 = () => <BaseButton label="This story should not be centered" />; -story2.story = { +Story2.story = { name: 'story 2 not centered', parameters: { diff --git a/examples/official-storybook/stories/addon-contexts.stories.js b/examples/official-storybook/stories/addon-contexts.stories.js index 0e76638a612..d85a97ad6c7 100644 --- a/examples/official-storybook/stories/addon-contexts.stories.js +++ b/examples/official-storybook/stories/addon-contexts.stories.js @@ -43,10 +43,10 @@ export default { decorators: [withContexts(topLevelContexts)], }; -export const simpleCssTheming = () => ( +export const SimpleCssTheming = () => ( <>I'm a children of the injected 'div' (where provides a theming context).</> ); -simpleCssTheming.story = { +SimpleCssTheming.story = { name: 'Simple CSS Theming', parameters: { contexts: storyLevelContexts, diff --git a/examples/official-storybook/stories/addon-cssresources.stories.js b/examples/official-storybook/stories/addon-cssresources.stories.js index 18537dbe8c9..e0e5b2f0d77 100644 --- a/examples/official-storybook/stories/addon-cssresources.stories.js +++ b/examples/official-storybook/stories/addon-cssresources.stories.js @@ -4,12 +4,12 @@ export default { title: 'Addons/Cssresources', }; -export const primaryLargeButton = () => ( +export const PrimaryLargeButton = () => ( <button type="button" className="btn btn-lg btn-primary"> Primary Large Button </button> ); -primaryLargeButton.story = { +PrimaryLargeButton.story = { name: 'Primary Large Button', parameters: { cssresources: [ @@ -30,8 +30,8 @@ primaryLargeButton.story = { }, }; -export const cameraIcon = () => <i className="fa fa-camera-retro"> Camera Icon</i>; -cameraIcon.story = { +export const CameraIcon = () => <i className="fa fa-camera-retro"> Camera Icon</i>; +CameraIcon.story = { name: 'Camera Icon', parameters: { cssresources: [ diff --git a/examples/official-storybook/stories/addon-design-assets.stories.js b/examples/official-storybook/stories/addon-design-assets.stories.js index b0f928195c9..6d858132d68 100644 --- a/examples/official-storybook/stories/addon-design-assets.stories.js +++ b/examples/official-storybook/stories/addon-design-assets.stories.js @@ -10,9 +10,9 @@ export default { }, }; -export const singleImage = () => <div>This story should a single image in the assets panel</div>; +export const SingleImage = () => <div>This story should a single image in the assets panel</div>; -singleImage.story = { +SingleImage.story = { name: 'single image', parameters: { @@ -20,9 +20,9 @@ singleImage.story = { }, }; -export const singleWebpage = () => <div>This story should a single image in the assets panel</div>; +export const SingleWebpage = () => <div>This story should a single image in the assets panel</div>; -singleWebpage.story = { +SingleWebpage.story = { name: 'single webpage', parameters: { @@ -30,9 +30,9 @@ singleWebpage.story = { }, }; -export const youtubeVideo = () => <div>This story should a single image in the assets panel</div>; +export const YoutubeVideo = () => <div>This story should a single image in the assets panel</div>; -youtubeVideo.story = { +YoutubeVideo.story = { name: 'youtube video', parameters: { @@ -40,11 +40,11 @@ youtubeVideo.story = { }, }; -export const multipleImages = () => ( +export const MultipleImages = () => ( <div>This story should a multiple images in the assets panel</div> ); -multipleImages.story = { +MultipleImages.story = { name: 'multiple images', parameters: { @@ -55,9 +55,9 @@ multipleImages.story = { }, }; -export const namedAssets = () => <div>This story should a single image in the assets panel</div>; +export const NamedAssets = () => <div>This story should a single image in the assets panel</div>; -namedAssets.story = { +NamedAssets.story = { name: 'named assets', parameters: { @@ -74,11 +74,11 @@ namedAssets.story = { }, }; -export const urlReplacement = () => ( +export const UrlReplacement = () => ( <div>This story should have a webpge, with within it's url the storyId</div> ); -urlReplacement.story = { +UrlReplacement.story = { name: 'url replacement', parameters: { diff --git a/examples/official-storybook/stories/addon-docs/addon-docs-blocks.stories.js b/examples/official-storybook/stories/addon-docs/addon-docs-blocks.stories.js new file mode 100644 index 00000000000..1f614050bb0 --- /dev/null +++ b/examples/official-storybook/stories/addon-docs/addon-docs-blocks.stories.js @@ -0,0 +1,176 @@ +import React from 'react'; +import { + Title, + Subtitle, + Description, + Primary, + Props, + Stories, +} from '@storybook/addon-docs/blocks'; +import { DocgenButton } from '../../components/DocgenButton'; +import BaseButton from '../../components/BaseButton'; +import { ButtonGroup } from '../../components/ButtonGroup'; + +export default { + title: 'Addons/Docs/stories docs bocks', + component: DocgenButton, + parameters: { + docs: { + page: () => ( + <> + <Title /> + <Subtitle /> + <Description /> + <Primary /> + <Props /> + <Stories /> + </> + ), + }, + }, +}; + +export const defDocsPage = () => <div>Default docs page</div>; + +export const smallDocsPage = () => <div>Just primary story, </div>; +smallDocsPage.story = { + parameters: { + docs: { + page: () => ( + <> + <Title /> + <Primary /> + </> + ), + }, + }, +}; + +export const checkBoxProps = () => <div>Primary props displayed with a check box </div>; +checkBoxProps.story = { + parameters: { + docs: { + page: () => { + const [showProps, setShowProps] = React.useState(false); + return ( + <> + <Title /> + <Subtitle /> + <Description /> + <Primary /> + <label> + <input + type="checkbox" + checked={showProps} + onChange={() => setShowProps(!showProps)} + /> + <span>display props</span> + </label> + {showProps && <Props />} + </> + ); + }, + }, + }, +}; + +export const customLabels = () => <div>Display custom title, Subtitle, Description</div>; +customLabels.story = { + parameters: { + docs: { + page: () => ( + <> + <Title>Custom title + Custom sub title + Custom description + + + + + ), + }, + }, +}; + +export const customStoriesFilter = () =>
Displays ALL stories (not excluding first one)
; +customStoriesFilter.story = { + parameters: { + docs: { + page: () => ( + <> + stories} /> + + ), + }, + }, +}; + +export const descriptionSlot = () =>
Adds markdown to the description
; +descriptionSlot.story = { + parameters: { + docs: { + page: () => ( + <> + `${description}`} /> + + ), + }, + }, +}; + +export const multipleComponents = () => ( + + + + + +); + +multipleComponents.story = { + name: 'Many Components', + parameters: { + component: ButtonGroup, + subcomponents: { + 'Docgen Button': DocgenButton, + 'Base Button': BaseButton, + }, + docs: { + page: () => ( + <> + + <Subtitle /> + <Description /> + <Primary slot={stories => stories.find(story => story.story === 'Many Components')} /> + <Props /> + </> + ), + }, + }, +}; + +export const componentsProps = () => <div>Display multiple prop tables in tabs</div>; +componentsProps.story = { + subcomponents: { + 'Docgen Button': DocgenButton, + 'Base Button': BaseButton, + }, + parameters: { + docs: { + page: () => ( + <> + <Title>Multiple prop tables + + Here's what happens when your component has some related components + + + + ), + }, + }, +}; diff --git a/examples/official-storybook/stories/addon-docs/addon-docs.stories.js b/examples/official-storybook/stories/addon-docs/addon-docs.stories.js index 1b06f9bfc19..c82415db502 100644 --- a/examples/official-storybook/stories/addon-docs/addon-docs.stories.js +++ b/examples/official-storybook/stories/addon-docs/addon-docs.stories.js @@ -8,49 +8,49 @@ export default { component: DocgenButton, }; -export const basic = () =>
Click docs tab to see basic docs
; +export const Basic = () =>
Click docs tab to see basic docs
; -export const noDocs = () =>
Click docs tab to see no docs error
; -noDocs.story = { +export const NoDocs = () =>
Click docs tab to see no docs error
; +NoDocs.story = { name: 'no docs', parameters: { docs: { page: null } }, }; -export const withNotes = () =>
Click docs tab to see DocsPage docs
; -withNotes.story = { +export const WithNotes = () =>
Click docs tab to see DocsPage docs
; +WithNotes.story = { name: 'with notes', parameters: { notes }, }; -export const withInfo = () =>
Click docs tab to see DocsPage docs
; -withInfo.story = { +export const WithInfo = () =>
Click docs tab to see DocsPage docs
; +WithInfo.story = { name: 'with info', parameters: { info: 'some user info string', }, }; -export const mdxOverride = () =>
Click docs tab to see MDX-overridden docs
; -mdxOverride.story = { +export const MdxOverride = () =>
Click docs tab to see MDX-overridden docs
; +MdxOverride.story = { name: 'mdx override', parameters: { docs: { page: mdxNotes }, }, }; -export const jsxOverride = () =>
Click docs tab to see JSX-overridden docs
; -jsxOverride.story = { +export const JsxOverride = () =>
Click docs tab to see JSX-overridden docs
; +JsxOverride.story = { name: 'jsx override', parameters: { docs: { page: () =>
Hello docs
}, }, }; -export const docsDisable = () =>
This story shouldn't show up in DocsPage
; -docsDisable.story = { +export const DocsDisable = () =>
This story shouldn't show up in DocsPage
; +DocsDisable.story = { parameters: { docs: { disable: true }, }, }; -export const largerThanPreview = () =>
HUGE
; +export const LargerThanPreview = () =>
HUGE
; diff --git a/examples/official-storybook/stories/addon-docs/mdx.stories.js b/examples/official-storybook/stories/addon-docs/mdx.stories.js index c4cab584e45..e2563d4825f 100644 --- a/examples/official-storybook/stories/addon-docs/mdx.stories.js +++ b/examples/official-storybook/stories/addon-docs/mdx.stories.js @@ -8,7 +8,7 @@ export default { }; // This renders the contents of the docs panel into story content -export const typography = () => { +export const Typography = () => { const Docs = markdown.parameters.docs.page; return ; }; diff --git a/examples/official-storybook/stories/addon-graphql.stories.js b/examples/official-storybook/stories/addon-graphql.stories.js index f1e8044e0d9..ceab150d2f7 100644 --- a/examples/official-storybook/stories/addon-graphql.stories.js +++ b/examples/official-storybook/stories/addon-graphql.stories.js @@ -4,9 +4,9 @@ export default { title: 'Addons/GraphQL', }; -export const getPikachu = () =>
hello
; +export const GetPikachu = () =>
hello
; -getPikachu.story = { +GetPikachu.story = { name: 'get Pikachu', parameters: { graphiql: { diff --git a/examples/official-storybook/stories/addon-info/decorators.stories.js b/examples/official-storybook/stories/addon-info/decorators.stories.js index 0d3774ffdcc..780fb3a0b6d 100644 --- a/examples/official-storybook/stories/addon-info/decorators.stories.js +++ b/examples/official-storybook/stories/addon-info/decorators.stories.js @@ -7,5 +7,5 @@ export default { decorators: [withInfo('Info can take options via the global or local decorator as well.')], }; -export const useInfo = () => ; -useInfo.story = { name: 'Use Info as story decorator' }; +export const UseInfo = () => ; +UseInfo.story = { name: 'Use Info as story decorator' }; diff --git a/examples/official-storybook/stories/addon-info/forward-ref.stories.js b/examples/official-storybook/stories/addon-info/forward-ref.stories.js index 21fdcd5ac6d..1aa8da24c02 100644 --- a/examples/official-storybook/stories/addon-info/forward-ref.stories.js +++ b/examples/official-storybook/stories/addon-info/forward-ref.stories.js @@ -8,10 +8,10 @@ export default { decorators: [withInfo], }; -export const displaysCorrectly = () => ; -displaysCorrectly.story = { name: 'Displays forwarded ref components correctly' }; +export const DisplaysCorrectly = () => ; +DisplaysCorrectly.story = { name: 'Displays forwarded ref components correctly' }; -export const displayName = () => ( +export const DisplayName = () => ( ); -displayName.story = { name: 'Uses forwardRef displayName if available' }; +DisplayName.story = { name: 'Uses forwardRef displayName if available' }; diff --git a/examples/official-storybook/stories/addon-info/jsx.stories.js b/examples/official-storybook/stories/addon-info/jsx.stories.js index 5052bf5f241..7db0a4ee09b 100644 --- a/examples/official-storybook/stories/addon-info/jsx.stories.js +++ b/examples/official-storybook/stories/addon-info/jsx.stories.js @@ -25,11 +25,11 @@ export default { decorators: [withInfo], }; -export const displaysJsxInDescription = () => ( +export const DisplaysJsxInDescription = () => ( ); -displaysJsxInDescription.story = { +DisplaysJsxInDescription.story = { name: 'Displays JSX in description', parameters: { diff --git a/examples/official-storybook/stories/addon-info/markdown.stories.js b/examples/official-storybook/stories/addon-info/markdown.stories.js index 208b5c84ffe..38038e50703 100644 --- a/examples/official-storybook/stories/addon-info/markdown.stories.js +++ b/examples/official-storybook/stories/addon-info/markdown.stories.js @@ -47,20 +47,20 @@ html with special formatting Maybe include a [link](http://storybook.js.org) to your project as well. `; -export const displaysMarkdownInDescription = () => ( +export const DisplaysMarkdownInDescription = () => ( ); -displaysMarkdownInDescription.story = { +DisplaysMarkdownInDescription.story = { name: 'Displays Markdown in description', parameters: { info: markdownDescription }, }; -export const fromInternalMarkdownFile = () => ( +export const FromInternalMarkdownFile = () => ( ); -fromInternalMarkdownFile.story = { +FromInternalMarkdownFile.story = { name: 'From internal Markdown file', parameters: { @@ -72,11 +72,11 @@ fromInternalMarkdownFile.story = { }, }; -export const fromExternalMarkdownFile = () => ( +export const FromExternalMarkdownFile = () => ( ); -fromExternalMarkdownFile.story = { +FromExternalMarkdownFile.story = { name: 'From external Markdown file', parameters: { info: externalMdDocs }, }; diff --git a/examples/official-storybook/stories/addon-info/options.stories.js b/examples/official-storybook/stories/addon-info/options.stories.js index 632518c932f..f75e3b82560 100644 --- a/examples/official-storybook/stories/addon-info/options.stories.js +++ b/examples/official-storybook/stories/addon-info/options.stories.js @@ -12,8 +12,8 @@ export default { decorators: [withInfo], }; -export const inlinesComponentInsideStory = () => ; -inlinesComponentInsideStory.story = { +export const InlinesComponentInsideStory = () => ; +InlinesComponentInsideStory.story = { name: 'Inlines component inside story', parameters: { info: { @@ -23,10 +23,10 @@ inlinesComponentInsideStory.story = { }, }; -export const excludesPropTypesThatAreInTheExcludedPropTypesArray = () => ( +export const ExcludesPropTypesThatAreInTheExcludedPropTypesArray = () => ( ); -excludesPropTypesThatAreInTheExcludedPropTypesArray.story = { +ExcludesPropTypesThatAreInTheExcludedPropTypesArray.story = { name: 'Excludes propTypes that are in the excludedPropTypes array', parameters: { info: { @@ -36,8 +36,8 @@ excludesPropTypesThatAreInTheExcludedPropTypesArray.story = { }, }; -export const showsOrHidesInfoAddonHeader = () => ; -showsOrHidesInfoAddonHeader.story = { +export const ShowsOrHidesInfoAddonHeader = () => ; +ShowsOrHidesInfoAddonHeader.story = { name: 'Shows or hides Info Addon header', parameters: { info: { @@ -47,8 +47,8 @@ showsOrHidesInfoAddonHeader.story = { }, }; -export const showsOrHidesInfoAddonSource = () => ; -showsOrHidesInfoAddonSource.story = { +export const ShowsOrHidesInfoAddonSource = () => ; +ShowsOrHidesInfoAddonSource.story = { name: 'Shows or hides Info Addon source', parameters: { info: { @@ -58,8 +58,8 @@ showsOrHidesInfoAddonSource.story = { }, }; -export const showsAdditionalComponentPropTables = () => ; -showsAdditionalComponentPropTables.story = { +export const ShowsAdditionalComponentPropTables = () => ; +ShowsAdditionalComponentPropTables.story = { name: 'Shows additional component prop tables', parameters: { info: { @@ -69,13 +69,13 @@ showsAdditionalComponentPropTables.story = { }, }; -export const excludeComponentFromPropTables = () => ( +export const ExcludeComponentFromPropTables = () => (
); -excludeComponentFromPropTables.story = { +ExcludeComponentFromPropTables.story = { name: 'Exclude component from prop tables', parameters: { info: { @@ -85,8 +85,8 @@ excludeComponentFromPropTables.story = { }, }; -export const extendInfoStylesWithAnObject = () => ; -extendInfoStylesWithAnObject.story = { +export const ExtendInfoStylesWithAnObject = () => ; +ExtendInfoStylesWithAnObject.story = { name: 'Extend info styles with an object', parameters: { info: { @@ -106,8 +106,8 @@ extendInfoStylesWithAnObject.story = { }, }; -export const fullControlOverStylesUsingAFunction = () => ; -fullControlOverStylesUsingAFunction.story = { +export const FullControlOverStylesUsingAFunction = () => ; +FullControlOverStylesUsingAFunction.story = { name: 'Full control over styles using a function', parameters: { info: { @@ -125,8 +125,8 @@ fullControlOverStylesUsingAFunction.story = { }, }; -export const useACustomComponentForTheTable = () => ; -useACustomComponentForTheTable.story = { +export const UseACustomComponentForTheTable = () => ; +UseACustomComponentForTheTable.story = { name: 'Use a custom component for the table', component: TableComponent, parameters: { @@ -136,22 +136,22 @@ useACustomComponentForTheTable.story = { }, }; -export const useInfoAsStoryDecorator = () => ; +export const UseInfoAsStoryDecorator = () => ; -useInfoAsStoryDecorator.story = { +UseInfoAsStoryDecorator.story = { name: 'Use Info as story decorator', decorators: [withInfo('Info can take options via the global or local decorator as well.')], }; -export const usingParametersAcrossAllStories = () => ; -usingParametersAcrossAllStories.story = { +export const UsingParametersAcrossAllStories = () => ; +UsingParametersAcrossAllStories.story = { name: 'Using parameters across all stories', }; -export const overwritingAndExtendingTheParametersAndOptionsSetStoriesWise = () => ( +export const OverwritingAndExtendingTheParametersAndOptionsSetStoriesWise = () => ( ); -overwritingAndExtendingTheParametersAndOptionsSetStoriesWise.story = { +OverwritingAndExtendingTheParametersAndOptionsSetStoriesWise.story = { name: 'Overwriting and extending the parameters and options set stories-wise', parameters: { info: { @@ -161,20 +161,20 @@ overwritingAndExtendingTheParametersAndOptionsSetStoriesWise.story = { }, }; -export const overwriteTheParametersWithMarkdownVariable = () => ( +export const OverwriteTheParametersWithMarkdownVariable = () => ( ); -overwriteTheParametersWithMarkdownVariable.story = { +OverwriteTheParametersWithMarkdownVariable.story = { name: 'Overwrite the parameters with markdown variable', parameters: { info: markdownDescription }, }; -export const overwriteTheTextParameterWithMarkdownInline = () => ( +export const OverwriteTheTextParameterWithMarkdownInline = () => ( ); -overwriteTheTextParameterWithMarkdownInline.story = { +OverwriteTheTextParameterWithMarkdownInline.story = { name: 'Overwrite the text parameter with markdown inline', parameters: { info: { @@ -189,10 +189,10 @@ overwriteTheTextParameterWithMarkdownInline.story = { }, }; -export const disableTheAddonEntirely = () => ( +export const DisableTheAddonEntirely = () => ( ); -disableTheAddonEntirely.story = { +DisableTheAddonEntirely.story = { name: 'Disable the addon entirely', parameters: { info: { disable: true } }, }; diff --git a/examples/official-storybook/stories/addon-info/parameters.stories.js b/examples/official-storybook/stories/addon-info/parameters.stories.js index 257c165f993..9e36b966b5f 100644 --- a/examples/official-storybook/stories/addon-info/parameters.stories.js +++ b/examples/official-storybook/stories/addon-info/parameters.stories.js @@ -27,15 +27,15 @@ export default { }, }; -export const usingParametersAcrossAllStories = () => ; -usingParametersAcrossAllStories.story = { +export const UsingParametersAcrossAllStories = () => ; +UsingParametersAcrossAllStories.story = { name: 'Using parameters across all stories', }; -export const overwritingAndExtendingTheParametersAndOptionsSetStoriesWise = () => ( +export const OverwritingAndExtendingTheParametersAndOptionsSetStoriesWise = () => ( ); -overwritingAndExtendingTheParametersAndOptionsSetStoriesWise.story = { +OverwritingAndExtendingTheParametersAndOptionsSetStoriesWise.story = { name: 'Overwriting and extending the parameters and options set stories-wise', parameters: { info: { @@ -45,18 +45,18 @@ overwritingAndExtendingTheParametersAndOptionsSetStoriesWise.story = { }, }; -export const overwriteTheParametersWithMarkdownVariable = () => ( +export const OverwriteTheParametersWithMarkdownVariable = () => ( ); -overwriteTheParametersWithMarkdownVariable.story = { +OverwriteTheParametersWithMarkdownVariable.story = { name: 'Overwrite the parameters with markdown variable', parameters: { info: markdownDescription }, }; -export const overwriteTheTextParameterWithMarkdownInline = () => ( +export const OverwriteTheTextParameterWithMarkdownInline = () => ( ); -overwriteTheTextParameterWithMarkdownInline.story = { +OverwriteTheTextParameterWithMarkdownInline.story = { name: 'Overwrite the text parameter with markdown inline', parameters: { info: { @@ -71,10 +71,10 @@ overwriteTheTextParameterWithMarkdownInline.story = { }, }; -export const disableTheAddonEntirely = () => ( +export const DisableTheAddonEntirely = () => ( ); -disableTheAddonEntirely.story = { +DisableTheAddonEntirely.story = { name: 'Disable the addon entirely', parameters: { info: { disable: true } }, }; diff --git a/examples/official-storybook/stories/addon-info/react-docgen.stories.js b/examples/official-storybook/stories/addon-info/react-docgen.stories.js index bbb6412abeb..deef915f047 100644 --- a/examples/official-storybook/stories/addon-info/react-docgen.stories.js +++ b/examples/official-storybook/stories/addon-info/react-docgen.stories.js @@ -13,7 +13,7 @@ export default { decorators: [withInfo], }; -export const commentsFromPropTypeDeclarations = () => ( +export const CommentsFromPropTypeDeclarations = () => ( ( /> ); -commentsFromPropTypeDeclarations.story = { +CommentsFromPropTypeDeclarations.story = { name: 'Comments from PropType declarations', parameters: { @@ -42,11 +42,11 @@ commentsFromPropTypeDeclarations.story = { }, }; -export const commentsFromFlowDeclarations = () => ( +export const CommentsFromFlowDeclarations = () => ( ); -commentsFromFlowDeclarations.story = { +CommentsFromFlowDeclarations.story = { name: 'Comments from Flow declarations', parameters: { @@ -55,11 +55,11 @@ commentsFromFlowDeclarations.story = { }, }; -export const commentsFromComponentDeclaration = () => ( +export const CommentsFromComponentDeclaration = () => ( ); -commentsFromComponentDeclaration.story = { +CommentsFromComponentDeclaration.story = { name: 'Comments from component declaration', parameters: { @@ -68,11 +68,11 @@ commentsFromComponentDeclaration.story = { }, }; -export const commentsFromNamedExportComponentDeclaration = () => ( +export const CommentsFromNamedExportComponentDeclaration = () => ( ); -commentsFromNamedExportComponentDeclaration.story = { +CommentsFromNamedExportComponentDeclaration.story = { name: 'Comments from named export component declaration', parameters: { diff --git a/examples/official-storybook/stories/addon-info/story-source.stories.js b/examples/official-storybook/stories/addon-info/story-source.stories.js index fb2a42ece90..8c8f3dd4ec7 100644 --- a/examples/official-storybook/stories/addon-info/story-source.stories.js +++ b/examples/official-storybook/stories/addon-info/story-source.stories.js @@ -10,21 +10,21 @@ export default { decorators: [withInfo], }; -export const oneProp = () => ; -oneProp.story = { name: 'One prop' }; +export const OneProp = () => ; +OneProp.story = { name: 'One prop' }; -export const manyProps = () => ; -manyProps.story = { name: 'Many props' }; +export const ManyProps = () => ; +ManyProps.story = { name: 'Many props' }; -export const children = () => ( +export const Children = () => (

Here is my nice button:

); -children.story = { name: 'Children' }; +Children.story = { name: 'Children' }; -export const arrayProp = () => { +export const ArrayProp = () => { const propDefs = [ { property: 'label', @@ -55,9 +55,9 @@ export const arrayProp = () => { ]; return ; }; -arrayProp.story = { name: 'Array prop' }; +ArrayProp.story = { name: 'Array prop' }; -export const objectProp = () => ( +export const ObjectProp = () => ( ( }} /> ); -objectProp.story = { name: 'Object prop' }; +ObjectProp.story = { name: 'Object prop' }; diff --git a/examples/official-storybook/stories/addon-jest.stories.js b/examples/official-storybook/stories/addon-jest.stories.js index b0226b4cd8f..e488a6e6f75 100644 --- a/examples/official-storybook/stories/addon-jest.stories.js +++ b/examples/official-storybook/stories/addon-jest.stories.js @@ -8,7 +8,7 @@ export default { decorators: [withTestsHOC({ results })], }; -export const withTests = () =>

Hello

; -withTests.story = { +export const WithTests = () =>

Hello

; +WithTests.story = { parameters: { jest: 'addon-jest' }, }; diff --git a/examples/official-storybook/stories/addon-knobs/with-knobs-decorators.stories.js b/examples/official-storybook/stories/addon-knobs/with-knobs-decorators.stories.js index 1a9a5a6d7ba..478b21d5ef0 100644 --- a/examples/official-storybook/stories/addon-knobs/with-knobs-decorators.stories.js +++ b/examples/official-storybook/stories/addon-knobs/with-knobs-decorators.stories.js @@ -4,10 +4,10 @@ export default { title: 'Addons/Knobs/with decorators', }; -export const withDecoratorCallingStoryFunctionMoreThanOnce = () => { +export const WithDecoratorCallingStoryFunctionMoreThanOnce = () => { return text('Text', 'Hello'); }; -withDecoratorCallingStoryFunctionMoreThanOnce.story = { +WithDecoratorCallingStoryFunctionMoreThanOnce.story = { decorators: [ withKnobs, storyFn => { diff --git a/examples/official-storybook/stories/addon-knobs/with-knobs-options.stories.js b/examples/official-storybook/stories/addon-knobs/with-knobs-options.stories.js index d4ee216a4fd..df29629444b 100644 --- a/examples/official-storybook/stories/addon-knobs/with-knobs-options.stories.js +++ b/examples/official-storybook/stories/addon-knobs/with-knobs-options.stories.js @@ -10,7 +10,7 @@ export default { ], }; -export const acceptsOptions = () =>
{text('Rendered string', '

Hello

')}
; -acceptsOptions.story = { +export const AcceptsOptions = () =>
{text('Rendered string', '

Hello

')}
; +AcceptsOptions.story = { name: 'accepts options', }; diff --git a/examples/official-storybook/stories/addon-knobs/with-knobs.stories.js b/examples/official-storybook/stories/addon-knobs/with-knobs.stories.js index c6209f09a21..4b9109dd07b 100644 --- a/examples/official-storybook/stories/addon-knobs/with-knobs.stories.js +++ b/examples/official-storybook/stories/addon-knobs/with-knobs.stories.js @@ -45,7 +45,7 @@ export default { decorators: [withKnobs], }; -export const tweaksStaticValues = () => { +export const TweaksStaticValues = () => { const name = text('Name', 'Storyteller'); const age = number('Age', 70, { range: true, min: 0, max: 90, step: 5 }); const fruits = { @@ -119,11 +119,11 @@ export const tweaksStaticValues = () => { ); }; -tweaksStaticValues.story = { +TweaksStaticValues.story = { name: 'tweaks static values', }; -export const tweaksStaticValuesOrganizedInGroups = () => { +export const TweaksStaticValuesOrganizedInGroups = () => { const GROUP_IDS = { DISPLAY: 'Display', GENERAL: 'General', @@ -206,11 +206,11 @@ export const tweaksStaticValuesOrganizedInGroups = () => { ); }; -tweaksStaticValuesOrganizedInGroups.story = { +TweaksStaticValuesOrganizedInGroups.story = { name: 'tweaks static values organized in groups', }; -export const dynamicKnobs = () => { +export const DynamicKnobs = () => { const showOptional = select('Show optional', ['yes', 'no'], 'yes'); return ( @@ -219,11 +219,11 @@ export const dynamicKnobs = () => { ); }; -dynamicKnobs.story = { +DynamicKnobs.story = { name: 'dynamic knobs', }; -export const complexSelect = () => { +export const ComplexSelect = () => { const m = select( 'complex', { @@ -243,11 +243,11 @@ export const complexSelect = () => { ); }; -complexSelect.story = { +ComplexSelect.story = { name: 'complex select', }; -export const optionsKnob = () => { +export const OptionsKnob = () => { const valuesRadio = { Monday: 'Monday', Tuesday: 'Tuesday', @@ -322,7 +322,7 @@ export const optionsKnob = () => { ); }; -export const triggersActionsViaButton = () => { +export const TriggersActionsViaButton = () => { button('Toggle item list state', () => { if (!injectedIsLoading && injectedItems.length === 0) { injectedIsLoading = true; @@ -346,18 +346,18 @@ export const triggersActionsViaButton = () => { ); }; -triggersActionsViaButton.story = { +TriggersActionsViaButton.story = { name: 'triggers actions via button', }; -export const buttonWithReactUseState = () => { +export const ButtonWithReactUseState = () => { const [counter, setCounter] = React.useState(0); button('increment', () => setCounter(counter + 1)); button('decrement', () => setCounter(counter - 1)); return counter; }; -export const xssSafety = () => ( +export const XssSafety = () => (
( }} /> ); -xssSafety.story = { +XssSafety.story = { name: 'XSS safety', }; -export const acceptsStoryParameters = () =>
{text('Rendered string', '

Hello

')}
; -acceptsStoryParameters.story = { +export const AcceptsStoryParameters = () =>
{text('Rendered string', '

Hello

')}
; +AcceptsStoryParameters.story = { name: 'accepts story parameters', parameters: { @@ -378,7 +378,7 @@ acceptsStoryParameters.story = { }, }; -export const withDuplicateDecorator = () => { +export const WithDuplicateDecorator = () => { return text('Text', 'Hello'); }; -withDuplicateDecorator.story = { decorators: [withKnobs] }; +WithDuplicateDecorator.story = { decorators: [withKnobs] }; diff --git a/examples/official-storybook/stories/addon-links/href.stories.js b/examples/official-storybook/stories/addon-links/href.stories.js index 98dc6fb4a89..fc2f79bae16 100644 --- a/examples/official-storybook/stories/addon-links/href.stories.js +++ b/examples/official-storybook/stories/addon-links/href.stories.js @@ -6,12 +6,12 @@ export default { title: 'Addons/Links/Href', }; -export const log = () => { +export const Log = () => { hrefTo('Addons|Links.Href', 'log').then(href => action('URL of this story')(href)); return See action logger; }; -log.story = { +Log.story = { parameters: { options: { panel: 'storybook/actions/panel', diff --git a/examples/official-storybook/stories/addon-notes.stories.js b/examples/official-storybook/stories/addon-notes.stories.js index f6053091f72..b9d05dd3503 100644 --- a/examples/official-storybook/stories/addon-notes.stories.js +++ b/examples/official-storybook/stories/addon-notes.stories.js @@ -77,11 +77,11 @@ export default { title: 'Addons/Notes', }; -export const addonNotes = () => ( +export const AddonNotes = () => ( ); -addonNotes.story = { +AddonNotes.story = { name: 'addon notes', parameters: { notes: @@ -89,44 +89,44 @@ addonNotes.story = { }, }; -export const addonNotesRenderingImportedMarkdown = () => ( +export const AddonNotesRenderingImportedMarkdown = () => ( ); -addonNotesRenderingImportedMarkdown.story = { +AddonNotesRenderingImportedMarkdown.story = { name: 'addon notes rendering imported markdown', parameters: { notes: { markdown: markdownNotes }, }, }; -export const addonNotesRenderingInlineGithubFlavoredMarkdown = () => ( +export const AddonNotesRenderingInlineGithubFlavoredMarkdown = () => ( ); -addonNotesRenderingInlineGithubFlavoredMarkdown.story = { +AddonNotesRenderingInlineGithubFlavoredMarkdown.story = { name: 'addon notes rendering inline, github-flavored markdown', parameters: { notes: { markdown: markdownString }, }, }; -export const withAMarkdownTable = () => ( +export const WithAMarkdownTable = () => ( ); -withAMarkdownTable.story = { +WithAMarkdownTable.story = { name: 'with a markdown table', parameters: { notes: { markdown: markdownTable }, }, }; -export const withAMarkdownGiphy = () => ( +export const WithAMarkdownGiphy = () => ( ); -withAMarkdownGiphy.story = { +WithAMarkdownGiphy.story = { name: 'with a markdown giphy', parameters: { notes: { markdown: giphyMarkdown }, diff --git a/examples/official-storybook/stories/addon-options.stories.js b/examples/official-storybook/stories/addon-options.stories.js index 358abb41b2f..b8cafe157fa 100644 --- a/examples/official-storybook/stories/addon-options.stories.js +++ b/examples/official-storybook/stories/addon-options.stories.js @@ -4,11 +4,11 @@ export default { title: 'Addons/Options', }; -export const settingName = () => ( +export const SettingName = () => (
This story should have changed the name of the storybook
); -settingName.story = { +SettingName.story = { name: 'setting name', parameters: { @@ -18,11 +18,11 @@ settingName.story = { }, }; -export const hidingAddonPanel = () => ( +export const HidingAddonPanel = () => (
This story should have changed hidden the addons panel
); -hidingAddonPanel.story = { +HidingAddonPanel.story = { name: 'hiding addon panel', parameters: { diff --git a/examples/official-storybook/stories/addon-queryparams.stories.js b/examples/official-storybook/stories/addon-queryparams.stories.js index 8fe633c230f..3d5c515fb2a 100644 --- a/examples/official-storybook/stories/addon-queryparams.stories.js +++ b/examples/official-storybook/stories/addon-queryparams.stories.js @@ -13,19 +13,19 @@ export default { }, }; -export const mockIsTrue = () => ( +export const MockIsTrue = () => (
This story should have an extra url query param: {document.location.search}
); -mockIsTrue.story = { +MockIsTrue.story = { name: 'mock is true', }; -export const mockIs4 = () => ( +export const MockIs4 = () => (
This story should have an extra url query param: {document.location.search}
); -mockIs4.story = { +MockIs4.story = { name: 'mock is 4', parameters: { query: { mock: 4 } }, }; diff --git a/examples/official-storybook/stories/addon-viewport/custom-default.stories.js b/examples/official-storybook/stories/addon-viewport/custom-default.stories.js index aa98e44191f..b75528e380b 100644 --- a/examples/official-storybook/stories/addon-viewport/custom-default.stories.js +++ b/examples/official-storybook/stories/addon-viewport/custom-default.stories.js @@ -28,12 +28,12 @@ export const Inherited = () => ( ); -export const overriddenViaWithViewportParameterizedDecorator = () => ( +export const OverriddenViaWithViewportParameterizedDecorator = () => ( I respect my parents but I should be looking good on iPad. ); -overriddenViaWithViewportParameterizedDecorator.story = { +OverriddenViaWithViewportParameterizedDecorator.story = { name: 'Overridden via "withViewport" parameterized decorator', parameters: { viewport: { defaultViewport: 'ipad' } }, }; diff --git a/examples/official-storybook/stories/addon-viewport/default.stories.js b/examples/official-storybook/stories/addon-viewport/default.stories.js index 945473987ad..31c43a42c86 100644 --- a/examples/official-storybook/stories/addon-viewport/default.stories.js +++ b/examples/official-storybook/stories/addon-viewport/default.stories.js @@ -12,7 +12,7 @@ export default { }, }, }; -export const defaultFn = () => ( +export const DefaultFn = () => ( I don't have problems being rendered using the default viewport. ); -defaultFn.story = { name: 'default' }; +DefaultFn.story = { name: 'default' }; diff --git a/examples/official-storybook/stories/core/decorators.stories.js b/examples/official-storybook/stories/core/decorators.stories.js index be0c8c2071e..15af07f7bde 100644 --- a/examples/official-storybook/stories/core/decorators.stories.js +++ b/examples/official-storybook/stories/core/decorators.stories.js @@ -26,8 +26,8 @@ export default { ], }; -export const all = () =>

Story

; -all.story = { +export const All = () =>

Story

; +All.story = { decorators: [ s => ( <> @@ -38,8 +38,8 @@ all.story = { ], }; -export const deprecated = () =>

Story

; -deprecated.story = { +export const Deprecated = () =>

Story

; +Deprecated.story = { parameters: { decorators: [ s => ( diff --git a/examples/official-storybook/stories/core/errors.stories.js b/examples/official-storybook/stories/core/errors.stories.js index 54950d17808..00c6c19bf08 100644 --- a/examples/official-storybook/stories/core/errors.stories.js +++ b/examples/official-storybook/stories/core/errors.stories.js @@ -7,10 +7,10 @@ export default { title: 'Core/Errors', }; -export const exception = () => { +export const Exception = () => { throw new Error('storyFn threw an error! WHOOPS'); }; -exception.story = { +Exception.story = { name: 'story throws exception', parameters: { storyshots: { disable: true }, @@ -33,8 +33,8 @@ badComponent.story = { }, }; -export const badStory = () => badOutput; -badStory.story = { +export const BadStory = () => badOutput; +BadStory.story = { name: 'story errors - story un-renderable type', parameters: { notes: 'Story does not return something react can render', diff --git a/examples/official-storybook/stories/core/events.stories.js b/examples/official-storybook/stories/core/events.stories.js index 4da37afffc0..7f193d263b3 100644 --- a/examples/official-storybook/stories/core/events.stories.js +++ b/examples/official-storybook/stories/core/events.stories.js @@ -13,5 +13,5 @@ export default { title: 'Core/Events', }; -export const force = () => ; -force.story = { name: 'Force re-render' }; +export const Force = () => ; +Force.story = { name: 'Force re-render' }; diff --git a/examples/official-storybook/stories/core/parameters.stories.js b/examples/official-storybook/stories/core/parameters.stories.js index 25c93dadf61..2afcde8a13a 100644 --- a/examples/official-storybook/stories/core/parameters.stories.js +++ b/examples/official-storybook/stories/core/parameters.stories.js @@ -19,10 +19,10 @@ export default { // I'm not sure what we should recommend regarding propTypes? are they a good idea for examples? // Given we sort of control the props, should we export a prop type? -export const passed = ({ parameters: { options, fileName, ...parameters }, ...rest }) => ( +export const Passed = ({ parameters: { options, fileName, ...parameters }, ...rest }) => (
Parameters: {JSON.stringify(parameters, null, 2)}
); -passed.story = { +Passed.story = { name: 'passed to story', parameters: { storyParameter: 'storyParameter' }, }; diff --git a/examples/official-storybook/stories/core/scroll.stories.js b/examples/official-storybook/stories/core/scroll.stories.js index 4b619f0af7c..73b7b4bca47 100644 --- a/examples/official-storybook/stories/core/scroll.stories.js +++ b/examples/official-storybook/stories/core/scroll.stories.js @@ -13,7 +13,7 @@ const Horizontal = styled(props => )({ }); const Vertical = styled(props => )({}); -export const story1 = () => ( +export const Story1 = () => (
START, when switching stories, you should be able to read this at the top of the page
middle
@@ -23,9 +23,9 @@ export const story1 = () => (
); -story1.story = { name: 'story with 100vh padding 1' }; +Story1.story = { name: 'story with 100vh padding 1' }; -export const story2 = () => ( +export const Story2 = () => (
START, when switching stories, you should be able to read this at the top of the page
middle
@@ -35,22 +35,22 @@ export const story2 = () => (
); -story2.story = { name: 'story with 100vh padding 2' }; +Story2.story = { name: 'story with 100vh padding 2' }; -export const story3 = () => ( +export const Story3 = () => (
START
middle
END
); -story3.story = { name: 'story with 100vw+' }; +Story3.story = { name: 'story with 100vw+' }; -export const story4 = () => ( +export const Story4 = () => (
START
middle
END
); -story4.story = { name: 'story with 100vw+ 2' }; +Story4.story = { name: 'story with 100vw+ 2' }; diff --git a/examples/official-storybook/stories/demo/button.stories.js b/examples/official-storybook/stories/demo/button.stories.js index ed9e74c27d4..d641ccae005 100644 --- a/examples/official-storybook/stories/demo/button.stories.js +++ b/examples/official-storybook/stories/demo/button.stories.js @@ -13,29 +13,29 @@ export default { }, }; -export const withText = () => ; -withText.story = { +export const WithText = () => ; +WithText.story = { name: 'with text', }; -export const withSomeEmoji = () => ( +export const WithSomeEmoji = () => ( ); -withSomeEmoji.story = { +WithSomeEmoji.story = { name: 'with some emoji', }; -export const withCounter = () => { +export const WithCounter = () => { const [counter, setCounter] = useState(0); const label = `Testing: ${counter}`; return ; }; -withCounter.story = { +WithCounter.story = { name: 'with counter', parameters: { docs: { diff --git a/examples/official-storybook/stories/demo/csf-embedding.test.js b/examples/official-storybook/stories/demo/csf-embedding.test.js index b5f566e3257..ba26d54e53d 100644 --- a/examples/official-storybook/stories/demo/csf-embedding.test.js +++ b/examples/official-storybook/stories/demo/csf-embedding.test.js @@ -1,6 +1,6 @@ import React from 'react'; import { render, fireEvent } from '@testing-library/react'; -import { withText as WithText, withCounter as WithCounter } from './button.stories'; +import { WithText, WithCounter } from './button.stories'; const mockAction = jest.fn(); jest.mock('@storybook/addon-actions', () => ({ diff --git a/examples/official-storybook/stories/demo/welcome.stories.js b/examples/official-storybook/stories/demo/welcome.stories.js index b0b56a55bc0..7d13665f6f2 100644 --- a/examples/official-storybook/stories/demo/welcome.stories.js +++ b/examples/official-storybook/stories/demo/welcome.stories.js @@ -7,7 +7,7 @@ export default { component: Welcome, }; -export const toStorybook = () => ; -toStorybook.story = { +export const ToStorybook = () => ; +ToStorybook.story = { name: 'to Storybook', }; diff --git a/examples/official-storybook/stories/deprecated/addon-actions.stories.js b/examples/official-storybook/stories/deprecated/addon-actions.stories.js index 0da9183e3d7..eb04f408d1d 100644 --- a/examples/official-storybook/stories/deprecated/addon-actions.stories.js +++ b/examples/official-storybook/stories/deprecated/addon-actions.stories.js @@ -18,10 +18,10 @@ export default { title: 'Addons/Actions/deprecated', }; -export const decoratedAction = () => ( +export const DecoratedAction = () => ( ); -decoratedAction.story = { +DecoratedAction.story = { name: 'Decorated Action', }; diff --git a/examples/official-storybook/stories/deprecated/addon-info.stories.js b/examples/official-storybook/stories/deprecated/addon-info.stories.js index 4180d2ed88d..f63fadce4b1 100644 --- a/examples/official-storybook/stories/deprecated/addon-info.stories.js +++ b/examples/official-storybook/stories/deprecated/addon-info.stories.js @@ -9,8 +9,8 @@ export default { title: 'Addons/Info/deprecated', }; -export const displaysMarkdown = withInfo(markdownDescription)(() => ( +export const DisplaysMarkdown = withInfo(markdownDescription)(() => ( )); -displaysMarkdown.story = { name: 'Displays Markdown in description' }; +DisplaysMarkdown.story = { name: 'Displays Markdown in description' }; diff --git a/examples/official-storybook/stories/hooks.stories.js b/examples/official-storybook/stories/hooks.stories.js index 3f349858e25..6f705a02498 100644 --- a/examples/official-storybook/stories/hooks.stories.js +++ b/examples/official-storybook/stories/hooks.stories.js @@ -20,7 +20,7 @@ export const Input = () => { return setText(e.target.value)} />; }; -export const effect = () => { +export const Effect = () => { const ref = useRef(); useEffect(() => { if (ref.current != null) { @@ -35,7 +35,7 @@ export const effect = () => { ); }; -export const reactHookCheckbox = () => { +export const ReactHookCheckbox = () => { const [on, setOn] = React.useState(false); return (
); -complexStory.story = { +ComplexStory.story = { name: 'complex story', };" `; diff --git a/lib/codemod/src/transforms/__testfixtures__/mdx-to-csf/parameters.output.snapshot b/lib/codemod/src/transforms/__testfixtures__/mdx-to-csf/parameters.output.snapshot index 18f2744d688..95b9c8814b2 100644 --- a/lib/codemod/src/transforms/__testfixtures__/mdx-to-csf/parameters.output.snapshot +++ b/lib/codemod/src/transforms/__testfixtures__/mdx-to-csf/parameters.output.snapshot @@ -15,9 +15,9 @@ export default { }, }; -export const withKindParameters = () => ; +export const SoloStory = () => ; -soloStory.story = { +SoloStory.story = { name: 'solo story', };" `; diff --git a/lib/codemod/src/transforms/__testfixtures__/storiesof-to-csf/basic.output.snapshot b/lib/codemod/src/transforms/__testfixtures__/storiesof-to-csf/basic.output.snapshot index 3e04e63a0db..6b26bc23804 100644 --- a/lib/codemod/src/transforms/__testfixtures__/storiesof-to-csf/basic.output.snapshot +++ b/lib/codemod/src/transforms/__testfixtures__/storiesof-to-csf/basic.output.snapshot @@ -12,34 +12,34 @@ export default { title: 'Button', }; -export const story1 = () =>