diff --git a/.circleci/config.yml b/.circleci/config.yml index ed8d38cfe75..211098ee841 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -51,7 +51,55 @@ jobs: command: yarn chromatic --storybook-build-dir="built-storybooks/official-storybook" --exit-zero-on-changes --app-code="ab7m45tp9p" - run: name: Run chromatic on the pre-built angular example - command: yarn chromatic --storybook-build-dir="built-storybooks/angular-cli" --exit-zero-on-changes --app-code="tl92yzsj6w" + command: yarn chromatic --storybook-build-dir="built-storybooks/angular-cli" --app-code="tl92yzsj6w" + - run: + name: Run chromatic on the pre-built cra-kitchen-sink example + command: yarn chromatic --storybook-build-dir="built-storybooks/cra-kitchen-sink" --app-code="tg55gajmdt" + - run: + name: Run chromatic on the pre-built cra-react15 example + command: yarn chromatic --storybook-build-dir="built-storybooks/cra-react15" --app-code="gxk7iqej3wt" + - run: + name: Run chromatic on the pre-built cra-ts-essentials example + command: yarn chromatic --storybook-build-dir="built-storybooks/cra-ts-essentials" --app-code="b311ypk6of" + - run: + name: Run chromatic on the pre-built cra-ts-kitchen-sink example + command: yarn chromatic --storybook-build-dir="built-storybooks/cra-ts-kitchen-sink" --app-code="19whyj1tlac" + - run: + name: Run chromatic on the pre-built dev-kits example + command: yarn chromatic --storybook-build-dir="built-storybooks/dev-kits" --app-code="7yykp9ifdxx" + - run: + name: Run chromatic on the pre-built ember-cli example + command: yarn chromatic --storybook-build-dir="built-storybooks/ember-cli" --app-code="19z23qxndju" + - run: + name: Run chromatic on the pre-built html-kitchen-sink example + command: yarn chromatic --storybook-build-dir="built-storybooks/html-kitchen-sink" --app-code="e8zolxoyg8o" + - run: + name: Run chromatic on the pre-built marko-cli example + command: yarn chromatic --storybook-build-dir="built-storybooks/marko-cli" --app-code="qaegx64axu" + - run: + name: Run chromatic on the pre-built mithril-kitchen-sink example + command: yarn chromatic --storybook-build-dir="built-storybooks/mithril-kitchen-sink" --app-code="8adgm46jzk8" + - run: + name: Run chromatic on the pre-built polymer-cli example + command: yarn chromatic --storybook-build-dir="built-storybooks/polymer-cli" --app-code="o6jl9kmh0qd" + - run: + name: Run chromatic on the pre-built preact-kitchen-sink example + command: yarn chromatic --storybook-build-dir="built-storybooks/preact-kitchen-sink" --app-code="ls0ikhnwqt" + - run: + name: Run chromatic on the pre-built rax-kitchen-sink example + command: yarn chromatic --storybook-build-dir="built-storybooks/rax-kitchen-sink" --app-code="4co6vptx8qo" + - run: + name: Run chromatic on the pre-built riot-kitchen-sink example + command: yarn chromatic --storybook-build-dir="built-storybooks/riot-kitchen-sink" --app-code="g2dp3lnr34a" + - run: + name: Run chromatic on the pre-built svelte-kitchen-sink example + command: yarn chromatic --storybook-build-dir="built-storybooks/svelte-kitchen-sink" --app-code="8ob73wgl995" + - run: + name: Run chromatic on the pre-built vue-kitchen-sink example + command: yarn chromatic --storybook-build-dir="built-storybooks/vue-kitchen-sink" --app-code="cyxj0e38bqj" + - run: + name: Run chromatic on the pre-built web-components-kitchen-sink example + command: yarn chromatic --storybook-build-dir="built-storybooks/web-components-kitchen-sink" --app-code="npm5gsofwkf" packtracker: <<: *defaults diff --git a/.eslintignore b/.eslintignore index 4b921681522..ad542e10775 100644 --- a/.eslintignore +++ b/.eslintignore @@ -15,8 +15,9 @@ scripts/storage examples/ember-cli/.storybook/preview-head.html examples/official-storybook/tests/addon-jest.test.js examples/cra-ts-kitchen-sink/*.json -examples/cra-ts-kitchen-sink/public/*.json -examples/cra-ts-kitchen-sink/public/*.html +examples/cra-ts-kitchen-sink/public/* +examples/cra-ts-essentials/*.json +examples/cra-ts-essentials/public/* !.remarkrc.js !.babelrc.js diff --git a/.github/automention.yml b/.github/automention.yml index 177c7086be9..4e3688c40d4 100644 --- a/.github/automention.yml +++ b/.github/automention.yml @@ -7,7 +7,7 @@ 'app: react-native': ['benoitdion', 'gongreg'] 'app: react-native-server': ['benoitdion', 'gongreg'] 'app: svelte': ['rixo', 'cam-stitt', 'plumpNation'] -'app: vue': ['backbone87', 'elevatebart', 'pksunkara', 'Aaron-Pool'] +'app: vue': ['backbone87', 'elevatebart', 'pksunkara', 'Aaron-Pool', 'pocka'] 'app: web-components': ['daKmoR'] 'api: addons': ['ndelangen'] 'addon: a11y': ['CodeByAlex', 'Armanio', 'jsomsanith'] diff --git a/CHANGELOG.md b/CHANGELOG.md index 299f26a6ea9..5e34b8bb52c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,147 @@ +## 5.3.0-rc.0 (December 19, 2019) + +### Features + +* CSF: Use `__orderedExports` in loader if provided ([#9181](https://github.com/storybookjs/storybook/pull/9181)) + +### Bug Fixes + +* Addon-a11y: Fix selected blindness color filter ([#9179](https://github.com/storybookjs/storybook/pull/9179)) + +### Maintenance + +* Addon-essentials: Remove actions, links, knobs ([#9184](https://github.com/storybookjs/storybook/pull/9184)) + +## 5.3.0-beta.31 (December 16, 2019) + +### Features + +* React: Add support for CRA without overrides ([#9157](https://github.com/storybookjs/storybook/pull/9157)) +* Addon-docs: Add fontFamily prop to Typeset component ([#9158](https://github.com/storybookjs/storybook/pull/9158)) + +### Bug Fixes + +* Core: Emit store render event synchronously if we can ([#9087](https://github.com/storybookjs/storybook/pull/9087)) + +## 5.3.0-beta.30 (December 16, 2019) + +Failed NPM publish + +## 5.3.0-beta.29 (December 16, 2019) + +Failed NPM publish + +## 5.3.0-beta.28 (December 16, 2019) + +Failed NPM publish + +## 5.3.0-beta.27 (December 16, 2019) + +Failed NPM publish + +## 5.3.0-beta.26 (December 16, 2019) + +Failed NPM publish + +## 5.3.0-beta.25 (December 15, 2019) + +### Bug Fixes + +* Addon-docs: Hide addons on docs-only stories ([#9125](https://github.com/storybookjs/storybook/pull/9125)) + +### Dependency Upgrades + +* Upgrade vue-docgen-loader to 1.3.0-beta.0 ([#9155](https://github.com/storybookjs/storybook/pull/9155)) + +## 5.3.0-beta.24 (December 15, 2019) + +Failed NPM publish + +## 5.3.0-beta.23 (December 14, 2019) + +### Features + +* Addon-docs: Render components as leaves in `--docs` mode ([#7700](https://github.com/storybookjs/storybook/pull/7700)) + +### Bug Fixes + +* Addon-viewport: Allow viewports config to be optional ([#9137](https://github.com/storybookjs/storybook/pull/9137)) + +## 5.3.0-beta.22 (December 12, 2019) + +### Bug Fixes + +* React: Fix CRA preset check ([#9142](https://github.com/storybookjs/storybook/pull/9142)) + +### Maintenance + +* Build: Change CI to chromatic on all examples ([#9114](https://github.com/storybookjs/storybook/pull/9114)) +* Web-components: Clean up example `custom-elements.json` and expose `defaultValue` ([#9107](https://github.com/storybookjs/storybook/pull/9107)) + +### Dependency Upgrades + +* Restore main jscodeshift package ([#9140](https://github.com/storybookjs/storybook/pull/9140)) + +## 5.3.0-beta.21 (December 11, 2019) + +### Features + +* CLI: Add Yarn workspaces support for init command ([#9104](https://github.com/storybookjs/storybook/pull/9104)) + +### Bug Fixes + +* Addon-docs: Update MDX compiler to fix knobs ([#9118](https://github.com/storybookjs/storybook/pull/9118)) +* CLI: Add web-components to sb init ([#9106](https://github.com/storybookjs/storybook/pull/9106)) + +### Maintenance + +* UI: Remove css usage ([#9003](https://github.com/storybookjs/storybook/pull/9003)) + +## 5.3.0-beta.20 (December 9, 2019) + +### Features + +* Addon-essentials: Remove docs from essentials ([#9093](https://github.com/storybookjs/storybook/pull/9093)) + +### Bug Fixes + +* Source-loader: Handle includeStories/excludeStories in CSF ([#9100](https://github.com/storybookjs/storybook/pull/9100)) +* Source-loader: Support function declaration story exports ([#9092](https://github.com/storybookjs/storybook/pull/9092)) + +### Maintenance + +* CSF: Refactor router utils into CSF library ([#9099](https://github.com/storybookjs/storybook/pull/9099)) + +## 5.3.0-beta.19 (December 7, 2019) + +### Features + +* Addon-essentials ([#9019](https://github.com/storybookjs/storybook/pull/9019)) + +### Bug Fixes + +* Addon-docs: Fix prop table default value for web-components ([#9086](https://github.com/storybookjs/storybook/pull/9086)) + +## 5.3.0-beta.18 (December 6, 2019) + +### Features + +* CLI: Change generators to Triconfig ([#9075](https://github.com/storybookjs/storybook/pull/9075)) +* Addon-docs: Add Props for Ember ([#9067](https://github.com/storybookjs/storybook/pull/9067)) +* MDX: Handle quotes / template literals in title ([#9069](https://github.com/storybookjs/storybook/pull/9069)) + +### Bug Fixes + +* Addon-docs: MDX Octicon anchors should not be tabbable ([#9063](https://github.com/storybookjs/storybook/pull/9063)) + +### Dependency Upgrades + +* Addon-docs: Upgrade vue-docgen-loader ([#9082](https://github.com/storybookjs/storybook/pull/9082)) + +## 5.3.0-beta.17 (December 6, 2019) + +NPM publish failed + ## 5.3.0-beta.16 (December 5, 2019) ### Features diff --git a/MIGRATION.md b/MIGRATION.md index 93f7f54e39a..ae7149b87b8 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -2,6 +2,7 @@ - [Migration](#migration) - [From version 5.2.x to 5.3.x](#from-version-52x-to-53x) + - [To tri-config configuration](#to-triconfig-configuration) - [Create React App preset](#create-react-app-preset) - [Description doc block](#description-doc-block) - [React Native Async Storage](#react-native-async-storage) @@ -74,8 +75,76 @@ - [Packages renaming](#packages-renaming) - [Deprecated embedded addons](#deprecated-embedded-addons) + ## From version 5.2.x to 5.3.x +### To tri-config configuration + +In storybook 5.3 3 new files for configuration were introduced, that replaced some previous files. + +These files are now soft-deprecated, (*they still work, but over time we will promote users to migrate*): + +- `config.js` has been renamed to `preview.js`. +- `addons.js` has been renamed to `manager.js`. +- `presets.js` has been renamed to `main.js`. + +#### Using main.js + +`main.js` is now the main point of configuration for Storybook. This is what a basic `main.js` looks like: + +```js +module.exports = { + stories: ['../**/*.stories.js'], + addons: [ + '@storybook/addon-docs/register', + ], +}; +``` + +You remove all "register" import from `addons.js` and place them inside the array. If this means `addons.js` is now empty for you, it's safe to remove. + +Next you remove the code that imports/requires all your stories from `config.js`, and change it to a glob-pattern and place that glob in the `stories` array. If this means `config.js` is empty, it's safe to remove. + +If you had a `presets.js` file before you can add the array of presets to the main.js file and remove `presets.js` like so: + +```js +module.exports = { + stories: ['../**/*.stories.js'], + presets: ['@storybook/addon-docs/preset'], +}; +``` + +#### Using preview.js + +If after migrating the imports/requires of your stories to `main.js` you're left with some code in `config.js` it's likely the usage of `addParameters` & `addDecorator`. + +This is fine, rename `config.js` to `preview.js`. + +This file can also be used to inject global stylesheets, fonts etc, into the preview bundle. + +#### Using manager.js + +If you are setting storybook options in `config.js`, especially `theme`, you should migrate it to `manager.js`: + +```js +import { addons } from '@storybook/addons'; +import { create } from '@storybook/theming/create'; + +const theme = create({ + base: 'light', + brandTitle: 'My custom title', +}); + +addons.setConfig({ + showRoots: true, + panelPosition: 'bottom', + theme, +}); +``` + +This makes storybook load and use the theme in the manager directly. +This allows for richer theming in the future, and has a much better performance! + ### Create React App preset You can now move to the new preset for [Create React App](https://create-react-app.dev/). The in-built preset for Create React App will be disabled in Storybook 6.0. @@ -187,7 +256,7 @@ For example, here's how to sort by story ID using `storySort`: addParameters({ options: { storySort: (a, b) => - a[1].kind === b[1].kind ? 0 : a[1].id.localeCompare(b[1].id, { numeric: true }), + a[1].kind === b[1].kind ? 0 : a[1].id.localeCompare(b[1].id, undefined, { numeric: true }), }, }); ``` diff --git a/__mocks__/inject-decorator.ts.csf.txt b/__mocks__/inject-decorator.ts.csf.txt index 47e60534ac8..b3a3d900dcc 100644 --- a/__mocks__/inject-decorator.ts.csf.txt +++ b/__mocks__/inject-decorator.ts.csf.txt @@ -3,7 +3,9 @@ import { action } from "@storybook/addon-actions"; import { Button } from "@storybook/react/demo"; export default { - title: "Button" + title: "Button", + excludeStories: ["text"], + includeStories: /emoji.*/ }; export const text = () => ( @@ -17,3 +19,13 @@ export const emoji = () => ( ); + +export function emojiFn() { + return ( + + ) +}; diff --git a/addons/a11y/package.json b/addons/a11y/package.json index e745f7d5f7f..772ba9dfdad 100644 --- a/addons/a11y/package.json +++ b/addons/a11y/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-a11y", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "a11y addon for storybook", "keywords": [ "a11y", @@ -33,12 +33,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.16", - "@storybook/api": "5.3.0-beta.16", - "@storybook/client-logger": "5.3.0-beta.16", - "@storybook/components": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/api": "5.3.0-rc.0", + "@storybook/client-logger": "5.3.0-rc.0", + "@storybook/components": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "axe-core": "^3.3.2", "core-js": "^3.0.1", "global": "^4.3.2", @@ -55,5 +55,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/addons/a11y/src/components/A11YPanel.tsx b/addons/a11y/src/components/A11YPanel.tsx index 89d916a71f5..f278877edc5 100644 --- a/addons/a11y/src/components/A11YPanel.tsx +++ b/addons/a11y/src/components/A11YPanel.tsx @@ -21,9 +21,9 @@ export enum RuleType { } const RotatingIcons = styled(Icons)(({ theme }) => ({ - height: '12px', - width: '12px', - marginRight: '4px', + height: 12, + width: 12, + marginRight: 4, animation: `${theme.animation.rotate360} 1s linear infinite;`, })); diff --git a/addons/a11y/src/components/ColorBlindness.tsx b/addons/a11y/src/components/ColorBlindness.tsx index 9d643a797f4..35edc2bd15c 100644 --- a/addons/a11y/src/components/ColorBlindness.tsx +++ b/addons/a11y/src/components/ColorBlindness.tsx @@ -87,9 +87,7 @@ export const ColorBlindness: FunctionComponent = () => { if (iframe) { iframe.style.filter = getFilter(activeState); - setActiveState({ - active: activeState, - }); + setActiveState(activeState); } else { logger.error('Cannot find Storybook iframe'); } diff --git a/addons/a11y/src/components/Report/Elements.tsx b/addons/a11y/src/components/Report/Elements.tsx index ce713ec948a..d2fc529b8d0 100644 --- a/addons/a11y/src/components/Report/Elements.tsx +++ b/addons/a11y/src/components/Report/Elements.tsx @@ -15,15 +15,15 @@ const ItemTitle = styled.span<{}>(({ theme }) => ({ borderBottom: `1px solid ${theme.appBorderColor}`, width: '100%', display: 'flex', - paddingBottom: '6px', - marginBottom: '6px', + paddingBottom: 6, + marginBottom: 6, justifyContent: 'space-between', })); const HighlightToggleElement = styled.span({ fontWeight: 'normal', alignSelf: 'center', - paddingRight: '15px', + paddingRight: 15, input: { margin: 0 }, }); diff --git a/addons/a11y/src/components/Report/Info.tsx b/addons/a11y/src/components/Report/Info.tsx index 5b1995fe414..743a617c02f 100644 --- a/addons/a11y/src/components/Report/Info.tsx +++ b/addons/a11y/src/components/Report/Info.tsx @@ -4,14 +4,14 @@ import { styled } from '@storybook/theming'; import { Result } from 'axe-core'; const Wrapper = styled.div({ - padding: '12px', - marginBottom: '10px', + padding: 12, + marginBottom: 10, }); const Help = styled.p({ margin: '0 0 12px', }); const Link = styled.a({ - marginTop: '12px', + marginTop: 12, textDecoration: 'underline', color: 'inherit', display: 'block', diff --git a/addons/a11y/src/components/Report/Item.tsx b/addons/a11y/src/components/Report/Item.tsx index 9122ff53c67..2ece16f74a1 100644 --- a/addons/a11y/src/components/Report/Item.tsx +++ b/addons/a11y/src/components/Report/Item.tsx @@ -24,7 +24,7 @@ const Icon = styled(Icons)(({ theme }) => ({ width: 10, minWidth: 10, color: theme.color.mediumdark, - marginRight: '10px', + marginRight: 10, transition: 'transform 0.1s ease-in-out', alignSelf: 'center', display: 'inline-flex', @@ -49,7 +49,7 @@ const HeaderBar = styled.div<{}>(({ theme }) => ({ const HighlightToggleElement = styled.span({ fontWeight: 'normal', float: 'right', - marginRight: '15px', + marginRight: 15, alignSelf: 'center', input: { margin: 0 }, }); diff --git a/addons/a11y/src/components/Report/Rules.tsx b/addons/a11y/src/components/Report/Rules.tsx index a7a61c3a671..48fe2dd924a 100644 --- a/addons/a11y/src/components/Report/Rules.tsx +++ b/addons/a11y/src/components/Report/Rules.tsx @@ -16,9 +16,9 @@ const impactColors = { const List = styled.div({ display: 'flex', flexDirection: 'column', - paddingBottom: '4px', - paddingRight: '4px', - paddingTop: '4px', + paddingBottom: 4, + paddingRight: 4, + paddingTop: 4, fontWeight: '400', } as any); @@ -26,23 +26,23 @@ const Item = styled.div(({ elementWidth }: { elementWidth: number }) => { const maxWidthBeforeBreak = 407; return { flexDirection: elementWidth > maxWidthBeforeBreak ? 'row' : 'inherit', - marginBottom: elementWidth > maxWidthBeforeBreak ? '6px' : '12px', + marginBottom: elementWidth > maxWidthBeforeBreak ? 6 : 12, display: elementWidth > maxWidthBeforeBreak ? 'flex' : 'block', }; }); const StyledBadge = styled(Badge)(({ status }: { status: string }) => ({ padding: '2px 8px', - marginBottom: '3px', - minWidth: '65px', + marginBottom: 3, + minWidth: 65, maxWidth: 'fit-content', width: '100%', textAlign: 'center', })); const Message = styled.div({ - paddingLeft: '6px', - paddingRight: '23px', + paddingLeft: 6, + paddingRight: 23, }); const Status = styled.div(({ passes, impact }: { passes: boolean; impact: string }) => ({ @@ -51,8 +51,8 @@ const Status = styled.div(({ passes, impact }: { passes: boolean; impact: string alignItems: 'center', color: passes ? impactColors.success : (impactColors as any)[impact], '& > svg': { - height: '16px', - width: '16px', + height: 16, + width: 16, }, })); diff --git a/addons/a11y/src/components/Report/Tags.tsx b/addons/a11y/src/components/Report/Tags.tsx index 62968af6aa3..e11245f5562 100644 --- a/addons/a11y/src/components/Report/Tags.tsx +++ b/addons/a11y/src/components/Report/Tags.tsx @@ -11,7 +11,7 @@ const Wrapper = styled.div({ const Item = styled.div<{}>(({ theme }) => ({ margin: '0 6px', - padding: '5px', + padding: 5, border: `1px solid ${theme.appBorderColor}`, borderRadius: theme.appBorderRadius, })); diff --git a/addons/a11y/src/components/Tabs.tsx b/addons/a11y/src/components/Tabs.tsx index 4ebeac7c490..26b6febaa04 100644 --- a/addons/a11y/src/components/Tabs.tsx +++ b/addons/a11y/src/components/Tabs.tsx @@ -18,8 +18,8 @@ const Container = styled.div({ const HighlightToggleLabel = styled.label<{}>(({ theme }) => ({ cursor: 'pointer', userSelect: 'none', - marginBottom: '3px', - marginRight: '3px', + marginBottom: 3, + marginRight: 3, color: theme.color.dark, })); @@ -31,7 +31,7 @@ const GlobalToggle = styled.div(({ elementWidth }: { elementWidth: number }) => padding: elementWidth > maxWidthBeforeBreak ? '12px 15px 10px 0' : '12px 0px 3px 12px', height: '40px', border: 'none', - marginTop: elementWidth > maxWidthBeforeBreak ? '-40px' : '0px', + marginTop: elementWidth > maxWidthBeforeBreak ? -40 : 0, float: elementWidth > maxWidthBeforeBreak ? 'right' : 'left', display: elementWidth > maxWidthBeforeBreak ? 'flex' : 'block', alignItems: 'center', @@ -39,10 +39,10 @@ const GlobalToggle = styled.div(({ elementWidth }: { elementWidth: number }) => borderBottom: elementWidth > maxWidthBeforeBreak ? 'none' : '1px solid rgba(0,0,0,.1)', input: { - marginLeft: '10', - marginRight: '0', - marginTop: '0', - marginBottom: '0', + marginLeft: 10, + marginRight: 0, + marginTop: 0, + marginBottom: 0, }, }; }); diff --git a/addons/actions/package.json b/addons/actions/package.json index 0dce620c4b4..4940d4b917e 100644 --- a/addons/actions/package.json +++ b/addons/actions/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-actions", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Action Logger addon for storybook", "keywords": [ "storybook" @@ -28,12 +28,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.16", - "@storybook/api": "5.3.0-beta.16", - "@storybook/client-api": "5.3.0-beta.16", - "@storybook/components": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/api": "5.3.0-rc.0", + "@storybook/client-api": "5.3.0-rc.0", + "@storybook/components": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "core-js": "^3.0.1", "fast-deep-equal": "^2.0.1", "global": "^4.3.2", @@ -49,5 +49,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/addons/actions/src/components/ActionLogger/style.tsx b/addons/actions/src/components/ActionLogger/style.tsx index 54abfbec156..450e407a697 100644 --- a/addons/actions/src/components/ActionLogger/style.tsx +++ b/addons/actions/src/components/ActionLogger/style.tsx @@ -3,7 +3,7 @@ import { opacify } from 'polished'; export const Action = styled.div({ display: 'flex', - padding: '0', + padding: 0, borderLeft: '5px solid transparent', borderBottom: '1px solid transparent', transition: 'all 0.1s', @@ -17,7 +17,7 @@ export const Counter = styled.div<{}>(({ theme }) => ({ fontWeight: theme.typography.weight.bold, lineHeight: 1, padding: '1px 5px', - borderRadius: '20px', + borderRadius: 20, margin: '2px 0px', })); diff --git a/addons/backgrounds/README.md b/addons/backgrounds/README.md index 05ca7d1b544..fe8554429f6 100644 --- a/addons/backgrounds/README.md +++ b/addons/backgrounds/README.md @@ -73,7 +73,7 @@ export const defaultView = () => ( ); defaultView.story = { parameters: { - background: [ + backgrounds: [ { name: 'red', value: 'rgba(255, 0, 0)' }, ], }, @@ -94,7 +94,7 @@ export const noBackgrounds = () => ( ); noBackgrounds.story = { parameters: { - background: [], + backgrounds: [], }, }; @@ -103,7 +103,7 @@ export const disabledBackgrounds = () => ( ); disabledBackgrounds.story = { parameters: { - background: { disabled: true }, + backgrounds: { disabled: true }, }, }; ``` diff --git a/addons/backgrounds/package.json b/addons/backgrounds/package.json index 47aff4d598a..4ea1ad7a904 100644 --- a/addons/backgrounds/package.json +++ b/addons/backgrounds/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-backgrounds", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "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.16", - "@storybook/api": "5.3.0-beta.16", - "@storybook/client-logger": "5.3.0-beta.16", - "@storybook/components": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/api": "5.3.0-rc.0", + "@storybook/client-logger": "5.3.0-rc.0", + "@storybook/components": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "core-js": "^3.0.1", "memoizerific": "^1.11.3", "react": "^16.8.3", @@ -48,5 +48,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/addons/centered/package.json b/addons/centered/package.json index e7bf0f1889e..1857e487367 100644 --- a/addons/centered/package.json +++ b/addons/centered/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-centered", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Storybook decorator to center components", "keywords": [ "addon", @@ -29,7 +29,7 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", "core-js": "^3.0.1", "global": "^4.3.2", "util-deprecate": "^1.0.2" @@ -39,5 +39,6 @@ "mithril": "*", "preact": "*", "react": "*" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/addons/contexts/package.json b/addons/contexts/package.json index 97f2bf0d600..c9226e028d8 100644 --- a/addons/contexts/package.json +++ b/addons/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-contexts", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Storybook Addon Contexts", "keywords": [ "preact", @@ -27,10 +27,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.16", - "@storybook/api": "5.3.0-beta.16", - "@storybook/components": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/api": "5.3.0-rc.0", + "@storybook/components": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", "core-js": "^3.0.1", "global": "^4.3.2", "qs": "^6.6.0" @@ -44,5 +44,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/addons/cssresources/package.json b/addons/cssresources/package.json index 9e5743f9fd6..9f6d809e780 100644 --- a/addons/cssresources/package.json +++ b/addons/cssresources/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-cssresources", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "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.16", - "@storybook/api": "5.3.0-beta.16", - "@storybook/components": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/api": "5.3.0-rc.0", + "@storybook/components": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", "core-js": "^3.0.1", "global": "^4.3.2", "react": "^16.8.3" @@ -45,5 +45,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/addons/design-assets/package.json b/addons/design-assets/package.json index 9b31dd466f3..0c4fe08b494 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.16", + "version": "5.3.0-rc.0", "description": "Design asset preview for storybook", "keywords": [ "addon", @@ -34,12 +34,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.16", - "@storybook/api": "5.3.0-beta.16", - "@storybook/client-logger": "5.3.0-beta.16", - "@storybook/components": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/api": "5.3.0-rc.0", + "@storybook/client-logger": "5.3.0-rc.0", + "@storybook/components": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "core-js": "^3.0.1", "global": "^4.3.2", "react": "^16.8.3", @@ -48,5 +48,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/addons/docs/README.md b/addons/docs/README.md index 59458a690b7..c7e702ca519 100644 --- a/addons/docs/README.md +++ b/addons/docs/README.md @@ -77,16 +77,16 @@ For more information on `MDX`, see the [`MDX` reference](./docs/mdx.md). Storybook Docs supports all view layers that Storybook supports except for React Native (currently). There are some framework-specific features as well, such as props tables and inline story rendering. This chart captures the current state of support: -| | React | Vue | Angular | HTML | [Web Components](./web-components) | Svelte | Polymer | Marko | Mithril | Riot | Ember | Preact | -| ----------------- | :---: | :-: | :-----: | :--: | :--------------------------------: | :----: | :-----: | :---: | :-----: | :--: | :---: | :----: | -| MDX stories | + | + | + | + | + | + | + | + | + | + | + | + | -| CSF stories | + | + | + | + | + | + | + | + | + | + | + | + | -| StoriesOf stories | + | + | + | + | + | + | + | + | + | + | + | + | -| Source | + | + | + | + | + | + | + | + | + | + | + | + | -| Notes / Info | + | + | + | + | + | + | + | + | + | + | + | + | -| Props table | + | + | # | | + | | | | | | | | -| Description | + | + | # | | + | | | | | | | | -| Inline stories | + | + | | | + | | | | | | | | +| | React | Vue | Angular | Ember | Web Components | HTML | Svelte | Preact | Polymer | Riot | Mithril | Marko | +| ----------------- | :---: | :-: | :-----: | :---: | :------------: | :--: | :----: | :----: | :-----: | :--: | :-----: | :---: | +| MDX stories | + | + | + | + | + | + | + | + | + | + | + | + | +| CSF stories | + | + | + | + | + | + | + | + | + | + | + | + | +| StoriesOf stories | + | + | + | + | + | + | + | + | + | + | + | + | +| Source | + | + | + | + | + | + | + | + | + | + | + | + | +| Notes / Info | + | + | + | + | + | + | + | + | + | + | + | + | +| Props table | + | + | + | + | + | | | | | | | | +| Description | + | + | + | + | + | | | | | | | | +| Inline stories | + | + | | | + | | | | | | | | **Note:** `#` = WIP support @@ -111,7 +111,7 @@ Then add the following to your `.storybook/main.js`: ```js module.exports = { presets: ['@storybook/addon-docs/preset'], - stories: ['../src/**/*/stories.(js|mdx)'], + stories: ['../src/**/*.stories.(js|mdx)'], }; ``` @@ -131,8 +131,10 @@ Add the following to your Jest configuration: ### Be sure to check framework specific installation needs -- [Angular](./angular) +- [React](./react) (covered here) - [Vue](./vue) +- [Angular](./angular) +- [Ember](./ember) - [Web Components](./web-components) ## Preset options @@ -164,11 +166,10 @@ If you don't want to use the preset, and prefer to configure "the long way", fir ```js module.exports = { - addons: ['@storybook/addon-docs/register'] + addons: ['@storybook/addon-docs/register'], }; ``` - Then configure Storybook's webpack loader in `.storybook/main.js` to understand MDX story files and annotate TS/JS story files with source code using `source-loader`: ```js @@ -201,7 +202,7 @@ module.exports = { enforce: 'pre', }); return config; - } + }, }; ``` diff --git a/addons/docs/angular/README.md b/addons/docs/angular/README.md index 3648eda1204..41a54018f58 100644 --- a/addons/docs/angular/README.md +++ b/addons/docs/angular/README.md @@ -22,10 +22,12 @@ First add the package. Make sure that the versions for your `@storybook/*` packa yarn add -D @storybook/addon-docs@next ``` -Then add the following to your `.storybook/presets.js` exports: +Then add the following to your `.storybook/main.js` exports: ```js -module.exports = ['@storybook/addon-docs/preset']; +module.exports = { + presets: ['@storybook/addon-docs/preset'], +}; ``` ## DocsPage @@ -55,7 +57,7 @@ Then you'll need to configure Compodoc to generate a `documentation.json` file. Unfortunately, it's not currently possible to update this dynamically as you edit your components, but [there's an open issue](https://github.com/storybookjs/storybook/issues/8672) to support this with improvements to Compodoc. -Next, add the following to your `.storybook/config.json` to load the Compodoc-generated file: +Next, add the following to `.storybook/preview.ts` to load the Compodoc-generated file: ```js import { setCompodocJson } from '@storybook/addon-docs/angular'; @@ -95,10 +97,12 @@ Docs has peer dependencies on `react`, `react-is`, and `babel-loader`. If you wa yarn add -D react react-is babel-loader ``` -Then update your `.storybook/config.ts` to make sure you load MDX files: +Then update your `.storybook/main.js` to make sure you load MDX files: ```ts -configure(require.context('../src/stories', true, /\.stories\.(ts|mdx)$/), module); +module.exports = { + stories: ['../src/stories/**/*.stories.(js|mdx)'], +}; ``` Finally, you can create MDX files like this: @@ -131,7 +135,7 @@ Also, to use the `Props` doc block, you need to set up Compodoc, [as described a Storybook Docs renders all Angular stories inside IFrames, with a default height of `60px`. You can update this default globally, or modify the IFrame height locally per story in `DocsPage` and `MDX`. -To update the global default, modify `.storybook/config.ts`: +To update the global default, modify `.storybook/preview.ts`: ```ts import { addParameters } from '@storybook/angular'; diff --git a/addons/docs/ember/README.md b/addons/docs/ember/README.md new file mode 100644 index 00000000000..6c3b110cb81 --- /dev/null +++ b/addons/docs/ember/README.md @@ -0,0 +1,150 @@ +# Storybook Docs for Ember + +Storybook Docs transforms your Storybook stories into world-class component documentation. Storybook Docs for Ember supports [DocsPage](../docs/docspage.md) for auto-generated docs, and [MDX](../docs/mdx.md) for rich long-form docs. + +To learn more about Storybook Docs, read the [general documentation](../README.md). To learn the Ember specifics, read on! + +- [Installation](#installation) +- [DocsPage](#docspage) +- [MDX](#mdx) +- [IFrame height](#iframe-height) +- [More resources](#more-resources) + +## Installation + +First add the package. Make sure that the versions for your `@storybook/*` packages match: + +```sh +yarn add -D @storybook/addon-docs@next +``` + +Then add the following to your `.storybook/main.js` presets: + +```js +module.exports = { + presets: ['@storybook/addon-docs/preset'], +}; +``` + +## DocsPage + +When you [install docs](#installation) you should get basic [DocsPage](../docs/docspage.md) documentation automagically for all your stories, available in the `Docs` tab of the Storybook UI. + +Props tables for your components requires a few more steps. Docs for Ember relies on [@storybook/ember-cli-storybook addon](https://github.com/storybookjs/ember-cli-storybook), to extract documentation comments from your component source files. If you're using Storybook with Ember, you should already have this addon installed, you will just need to enable it by adding the following config block in your `ember-cli-build.js` file: + +```js +let app = new EmberApp(defaults, { + 'ember-cli-storybook': { + enableAddonDocsIntegration: true, + }, +}); +``` + +Now, running the ember-cli server will generate a JSON documentation file at `/storybook-docgen/index.json`. Since generation of this file is tied into the ember-cli build, it will get regenerated everytime component files are saved. For details on documenting your components, check out the examples in the addon that powers the generation [ember-cli-addon-docs-yuidoc](https://github.com/ember-learn/ember-cli-addon-docs-yuidoc#documenting-components). + +Next, add the following to your `.storybook/preview.js` to load the generated json file: + +```js +import { setJSONDoc } from '@storybook/addon-docs/ember'; +import docJson from '../storybook-docgen/index.json'; +setJSONDoc(docJson); +``` + +Finally, be sure to fill in the `component` field in your story metadata. This should be a string that matches the name of the `@class` used in your souce comments: + +```ts +export default { + title: 'App Component', + component: 'AppComponent', +}; +``` + +If you haven't upgraded from `storiesOf`, you can use a parameter to do the same thing: + +```ts +import { storiesOf } from '@storybook/angular'; + +storiesOf('App Component', module) + .addParameters({ component: 'AppComponent' }) + .add( ... ); +``` + +## MDX + +[MDX](../docs/mdx.md) is a convenient way to document your components in Markdown and embed documentation components, such as stories and props tables, inline. + +Docs has peer dependencies on `react`, `react-is`, and `babel-loader`. If you want to write stories in MDX, you'll need to add these dependencies as well: + +```sh +yarn add -D react react-is babel-loader +``` + +Then update your `.storybook/main.js` to make sure you load MDX files: + +```js +module.exports = { + stories: ['../src/stories/**/*.stories.(js|mdx)'], +}; +``` + +Finally, you can create MDX files like this: + +```md +import { Meta, Story, Props } from '@storybook/addon-docs/blocks'; +import hbs from 'htmlbars-inline-precompile' + + + +# App Component + +Some **markdown** description, or whatever you want. + +{{ + template: hbs``, +context: { title: "Title" }, +}} + +## Props + + +``` + +Yes, it's redundant to declare `component` twice. [Coming soon](https://github.com/storybookjs/storybook/issues/8673). + +Also, to use the `Props` doc block, you need to set up documentation generation, [as described above](#docspage). + +## IFrame height + +Storybook Docs renders all Ember stories inside `iframe`s, with a default height of `60px`. You can update this default globally, or modify the `iframe` height locally per story in `DocsPage` and `MDX`. + +To update the global default, modify `.storybook/preview.js`: + +```ts +import { addParameters } from '@storybook/ember'; + +addParameters({ docs: { iframeHeight: 400 } }); +``` + +For `DocsPage`, you need to update the parameter locally in a story: + +```ts +export const basic = () => ... +basic.story = { + parameters: { docs: { iframeHeight: 400 } } +} +``` + +And for `MDX` you can modify it as an attribute on the `Story` element: + +```md +{...} +``` + +## More resources + +Want to learn more? Here are some more articles on Storybook Docs: + +- References: [DocsPage](../docs/docspage.md) / [MDX](../docs/mdx.md) / [FAQ](../docs/faq.md) / [Recipes](../docs/recipes.md) / [Theming](../docs/theming.md) +- Vision: [Storybook Docs sneak peak](https://medium.com/storybookjs/storybook-docs-sneak-peak-5be78445094a) +- Announcement: [DocsPage](https://medium.com/storybookjs/storybook-docspage-e185bc3622bf) +- Example: [Storybook Design System](https://github.com/storybookjs/design-system) diff --git a/addons/docs/ember/index.js b/addons/docs/ember/index.js new file mode 100644 index 00000000000..1ef21f6687b --- /dev/null +++ b/addons/docs/ember/index.js @@ -0,0 +1 @@ +module.exports = require('../dist/frameworks/ember'); diff --git a/addons/docs/package.json b/addons/docs/package.json index a7d6f9c0c8f..9923324c623 100644 --- a/addons/docs/package.json +++ b/addons/docs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-docs", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Superior documentation for your components", "keywords": [ "addon", @@ -45,13 +45,13 @@ "@mdx-js/loader": "^1.5.1", "@mdx-js/mdx": "^1.5.1", "@mdx-js/react": "^1.5.1", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/api": "5.3.0-beta.16", - "@storybook/components": "5.3.0-beta.16", - "@storybook/postinstall": "5.3.0-beta.16", - "@storybook/router": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/api": "5.3.0-rc.0", + "@storybook/components": "5.3.0-rc.0", + "@storybook/csf": "0.0.1", + "@storybook/postinstall": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "acorn": "^7.1.0", "acorn-jsx": "^5.1.0", "acorn-walk": "^7.0.0", @@ -69,7 +69,7 @@ "ts-dedent": "^1.1.0", "util-deprecate": "^1.0.2", "vue-docgen-api": "^4.1.0", - "vue-docgen-loader": "^1.0.1" + "vue-docgen-loader": "^1.3.0-beta.0" }, "devDependencies": { "@types/doctrine": "^0.0.3", @@ -87,5 +87,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/addons/docs/react/README.md b/addons/docs/react/README.md new file mode 100644 index 00000000000..afd9ea0cc20 --- /dev/null +++ b/addons/docs/react/README.md @@ -0,0 +1,120 @@ +
+ +
+ +# Storybook Docs for React + +Storybook Docs transforms your Storybook stories into world-class component documentation. Storybook Docs for React supports [DocsPage](../docs/docspage.md) for auto-generated docs, and [MDX](../docs/mdx.md) for rich long-form docs. + +To learn more about Storybook Docs, read the [general documentation](../README.md). To learn the React specifics, read on! + +- [Installation](#installation) +- [DocsPage](#docspage) +- [MDX](#mdx) +- [Inline stories](#inline-stories) +- [More resources](#more-resources) + +## Installation + +First add the package. Make sure that the versions for your `@storybook/*` packages match: + +```sh +yarn add -D @storybook/addon-docs@next +``` + +Then add the following to your `.storybook/main.js` list of `presets`: + +```js +module.exports = { + // other settings + presets: ['@storybook/addon-docs/preset']; +} +``` + +## DocsPage + +When you [install docs](#installation) you should get basic [DocsPage](../docs/docspage.md) documentation automagically for all your stories, available in the `Docs` tab of the Storybook UI. + +To show the props table for your component, be sure to fill in the `component` field in your story metadata: + +```ts +import { Button } from './Button'; + +export default { + title: 'Button', + component: Button, +}; +``` + +If you haven't upgraded from `storiesOf`, you can use a parameter to do the same thing: + +```ts +import { storiesOf } from '@storybook/react'; +import { Button } from './Button'; + +storiesOf('InfoButton', module) + .addParameters({ component: Button }) + .add( ... ); +``` + +## MDX + +[MDX](../docs/mdx.md) is a convenient way to document your components in Markdown and embed documentation components, such as stories and props tables, inline. + +Docs has peer dependencies on `react`, `react-is`, and `babel-loader`. If you want to write stories in MDX, you may need to add these dependencies as well: + +```sh +yarn add -D react react-is babel-loader +``` + +Then update your `.storybook/main.js` to make sure you load MDX files: + +```js +module.exports = { + stories: ['../src/stories/**/*.stories.(js|mdx)'], +}; +``` + +Finally, you can create MDX files like this: + +```md +import { Meta, Story, Props } from '@storybook/addon-docs/blocks'; +import { Button } from './Button'; + + + +# Button + +Some **markdown** description, or whatever you want. + + + + + +## Props + + +``` + +## Inline Stories + +Storybook Docs renders all React stories inline on the page by default. If you want to render stories in an `iframe` so that they are better isolated. To do this, update `.storybook/preview.js`: + +```js +import { addParameters } from '@storybook/react'; + +addParameters({ + docs: { + inlineStories: false, + }, +}); +``` + +## More resources + +Want to learn more? Here are some more articles on Storybook Docs: + +- References: [DocsPage](../docs/docspage.md) / [MDX](../docs/mdx.md) / [FAQ](../docs/faq.md) / [Recipes](../docs/recipes.md) / [Theming](../docs/theming.md) +- Vision: [Storybook Docs sneak peak](https://medium.com/storybookjs/storybook-docs-sneak-peak-5be78445094a) +- Announcement: [DocsPage](https://medium.com/storybookjs/storybook-docspage-e185bc3622bf) +- Example: [Storybook Design System](https://github.com/storybookjs/design-system) diff --git a/addons/docs/src/blocks/DocsPage.test.ts b/addons/docs/src/blocks/DocsPage.test.ts index 11294b76bb7..92e7264a40c 100644 --- a/addons/docs/src/blocks/DocsPage.test.ts +++ b/addons/docs/src/blocks/DocsPage.test.ts @@ -15,4 +15,10 @@ describe('defaultTitleSlot', () => { expect(defaultTitleSlot({ selectedKind: 'a|b', parameters })).toBe('b'); expect(defaultTitleSlot({ selectedKind: 'a/b/c.d', parameters })).toBe('d'); }); + it('empty options', () => { + const parameters = { options: {} }; + expect(defaultTitleSlot({ selectedKind: 'a/b/c', parameters })).toBe('c'); + expect(defaultTitleSlot({ selectedKind: 'a|b', parameters })).toBe('b'); + expect(defaultTitleSlot({ selectedKind: 'a/b/c.d', parameters })).toBe('d'); + }); }); diff --git a/addons/docs/src/blocks/Title.tsx b/addons/docs/src/blocks/Title.tsx index a670600d6e2..bbc4533bb61 100644 --- a/addons/docs/src/blocks/Title.tsx +++ b/addons/docs/src/blocks/Title.tsx @@ -1,5 +1,5 @@ import React, { useContext, FunctionComponent } from 'react'; -import { parseKind } from '@storybook/router'; +import { parseKind } from '@storybook/csf'; import { Title as PureTitle } from '@storybook/components'; import { DocsContext } from './DocsContext'; import { StringSlot } from './shared'; @@ -11,13 +11,9 @@ interface TitleProps { export const defaultTitleSlot: StringSlot = ({ selectedKind, parameters }) => { const { showRoots, - hierarchyRootSeparator: rootSeparator, - hierarchySeparator: groupSeparator, - } = (parameters && parameters.options) || { - showRoots: undefined, - hierarchyRootSeparator: '|', - hierarchySeparator: /\/|\./, - }; + hierarchyRootSeparator: rootSeparator = '|', + hierarchySeparator: groupSeparator = /\/|\./, + } = (parameters && parameters.options) || {}; let groups; if (typeof showRoots !== 'undefined') { diff --git a/addons/docs/src/blocks/mdx.tsx b/addons/docs/src/blocks/mdx.tsx index 40f8eda8e20..ca522560219 100644 --- a/addons/docs/src/blocks/mdx.tsx +++ b/addons/docs/src/blocks/mdx.tsx @@ -7,8 +7,13 @@ import { styled } from '@storybook/theming'; import { DocsContext, DocsContextProps } from './DocsContext'; import { scrollToElement } from './utils'; -// Hacky utility for dealing with functions or values in MDX Story elements -export const makeStoryFn = (val: any) => (typeof val === 'function' ? val : () => val); +// Hacky utility for asserting identifiers in MDX Story elements +export const assertIsFn = (val: any) => { + if (typeof val !== 'function') { + throw new Error(`Expected story function, got: ${val}`); + } + return val; +}; // Hacky utilty for adding mdxStoryToId to the default context export const AddContext: FC = props => { diff --git a/addons/docs/src/frameworks/ember/config.js b/addons/docs/src/frameworks/ember/config.js new file mode 100644 index 00000000000..2ba143d9b43 --- /dev/null +++ b/addons/docs/src/frameworks/ember/config.js @@ -0,0 +1,11 @@ +/* eslint-disable import/no-extraneous-dependencies */ +import { addParameters } from '@storybook/client-api'; +import { extractProps, extractComponentDescription } from './jsondoc'; + +addParameters({ + docs: { + iframeHeight: 80, + extractProps, + extractComponentDescription, + }, +}); diff --git a/addons/docs/src/frameworks/ember/index.js b/addons/docs/src/frameworks/ember/index.js new file mode 100644 index 00000000000..fab7166db9d --- /dev/null +++ b/addons/docs/src/frameworks/ember/index.js @@ -0,0 +1 @@ +export { setJSONDoc } from './jsondoc'; diff --git a/addons/docs/src/frameworks/ember/jsondoc.js b/addons/docs/src/frameworks/ember/jsondoc.js new file mode 100644 index 00000000000..a3a996d548c --- /dev/null +++ b/addons/docs/src/frameworks/ember/jsondoc.js @@ -0,0 +1,30 @@ +/* eslint-disable no-underscore-dangle */ +/* global window */ + +export const setJSONDoc = jsondoc => { + window.__EMBER_GENERATED_DOC_JSON__ = jsondoc; +}; +export const getJSONDoc = () => { + return window.__EMBER_GENERATED_DOC_JSON__; +}; + +export const extractProps = componentName => { + const json = getJSONDoc(); + const componentDoc = json.included.find(doc => doc.attributes.name === componentName); + const rows = componentDoc.attributes.arguments.map(prop => { + return { + name: prop.name, + type: prop.type, + required: prop.tags.length ? prop.tags.some(tag => tag.name === 'required') : false, + defaultValue: prop.defaultValue, + description: prop.description, + }; + }); + return { rows }; +}; + +export const extractComponentDescription = componentName => { + const json = getJSONDoc(); + const componentDoc = json.included.find(doc => doc.attributes.name === componentName); + return componentDoc.attributes.description; +}; diff --git a/addons/docs/src/frameworks/web-components/config.js b/addons/docs/src/frameworks/web-components/config.js index a26c871ce27..76083ba119f 100644 --- a/addons/docs/src/frameworks/web-components/config.js +++ b/addons/docs/src/frameworks/web-components/config.js @@ -11,7 +11,7 @@ function mapData(data) { type: { summary: item.type }, required: '', description: item.description, - defaultValue: { summary: item.default }, + defaultValue: { summary: item.defaultValue }, })); } diff --git a/addons/docs/src/mdx/__testfixtures__/component-id.output.snapshot b/addons/docs/src/mdx/__testfixtures__/component-id.output.snapshot index d92735dcf43..28cd4ed4165 100644 --- a/addons/docs/src/mdx/__testfixtures__/component-id.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/component-id.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin component-id.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Button } from '@storybook/react/demo'; import { Story, Meta } from '@storybook/addon-docs/blocks'; diff --git a/addons/docs/src/mdx/__testfixtures__/decorators.output.snapshot b/addons/docs/src/mdx/__testfixtures__/decorators.output.snapshot index b2e131aa52a..bded3c333d2 100644 --- a/addons/docs/src/mdx/__testfixtures__/decorators.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/decorators.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin decorators.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Button } from '@storybook/react/demo'; import { Story, Meta } from '@storybook/addon-docs/blocks'; diff --git a/addons/docs/src/mdx/__testfixtures__/docs-only.output.snapshot b/addons/docs/src/mdx/__testfixtures__/docs-only.output.snapshot index 99e33d86732..59f28b9c4b4 100644 --- a/addons/docs/src/mdx/__testfixtures__/docs-only.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/docs-only.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin docs-only.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Meta } from '@storybook/addon-docs/blocks'; diff --git a/addons/docs/src/mdx/__testfixtures__/meta-quotes-in-title.output.snapshot b/addons/docs/src/mdx/__testfixtures__/meta-quotes-in-title.output.snapshot index 8ad52b84d1f..64bb0d0c760 100644 --- a/addons/docs/src/mdx/__testfixtures__/meta-quotes-in-title.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/meta-quotes-in-title.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin meta-quotes-in-title.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Meta } from '@storybook/addon-docs/blocks'; diff --git a/addons/docs/src/mdx/__testfixtures__/non-story-exports.output.snapshot b/addons/docs/src/mdx/__testfixtures__/non-story-exports.output.snapshot index 9fd6046ac2a..39a4e7fab4a 100644 --- a/addons/docs/src/mdx/__testfixtures__/non-story-exports.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/non-story-exports.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin non-story-exports.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Button } from '@storybook/react/demo'; import { Story, Meta } from '@storybook/addon-docs/blocks'; diff --git a/addons/docs/src/mdx/__testfixtures__/parameters.output.snapshot b/addons/docs/src/mdx/__testfixtures__/parameters.output.snapshot index f2b9bd7d556..600811ad42a 100644 --- a/addons/docs/src/mdx/__testfixtures__/parameters.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/parameters.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin parameters.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Button } from '@storybook/react/demo'; import { Story, Meta } from '@storybook/addon-docs/blocks'; diff --git a/addons/docs/src/mdx/__testfixtures__/previews.output.snapshot b/addons/docs/src/mdx/__testfixtures__/previews.output.snapshot index 1da3fd972d0..cc9e55f146d 100644 --- a/addons/docs/src/mdx/__testfixtures__/previews.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/previews.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin previews.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Button } from '@storybook/react/demo'; import { Preview, Story, Meta } from '@storybook/addon-docs/blocks'; diff --git a/addons/docs/src/mdx/__testfixtures__/story-current.output.snapshot b/addons/docs/src/mdx/__testfixtures__/story-current.output.snapshot index de143f0fa95..ba937af8a3e 100644 --- a/addons/docs/src/mdx/__testfixtures__/story-current.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/story-current.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin story-current.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Story } from '@storybook/addon-docs/blocks'; diff --git a/addons/docs/src/mdx/__testfixtures__/story-def-text-only.output.snapshot b/addons/docs/src/mdx/__testfixtures__/story-def-text-only.output.snapshot index 80723e1154e..a37003d1567 100644 --- a/addons/docs/src/mdx/__testfixtures__/story-def-text-only.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/story-def-text-only.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin story-def-text-only.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Story, Meta } from '@storybook/addon-docs/blocks'; @@ -32,7 +32,7 @@ function MDXContent({ components, ...props }) { MDXContent.isMDXComponent = true; -export const text = makeStoryFn('Plain text'); +export const text = () => 'Plain text'; text.story = {}; text.story.name = 'text'; text.story.parameters = { mdxSource: \\"'Plain text'\\" }; diff --git a/addons/docs/src/mdx/__testfixtures__/story-definitions.output.snapshot b/addons/docs/src/mdx/__testfixtures__/story-definitions.output.snapshot index 41028a2707c..a0b17d0ba01 100644 --- a/addons/docs/src/mdx/__testfixtures__/story-definitions.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/story-definitions.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin story-definitions.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Button } from '@storybook/react/demo'; import { Story, Meta } from '@storybook/addon-docs/blocks'; diff --git a/addons/docs/src/mdx/__testfixtures__/story-function-var.output.snapshot b/addons/docs/src/mdx/__testfixtures__/story-function-var.output.snapshot index ef6586064fa..6f5d19b494d 100644 --- a/addons/docs/src/mdx/__testfixtures__/story-function-var.output.snapshot +++ b/addons/docs/src/mdx/__testfixtures__/story-function-var.output.snapshot @@ -2,7 +2,7 @@ exports[`docs-mdx-compiler-plugin story-function-var.mdx 1`] = ` "/* @jsx mdx */ -import { makeStoryFn, AddContext } from '@storybook/addon-docs/blocks'; +import { assertIsFn, AddContext } from '@storybook/addon-docs/blocks'; import { Meta, Story } from '@storybook/addon-docs/blocks'; export const basicFn = () => diff --git a/examples/cra-kitchen-sink/src/stories/perf.stories.js b/examples/cra-kitchen-sink/src/stories/perf.stories.js deleted file mode 100644 index d0612b21af1..00000000000 --- a/examples/cra-kitchen-sink/src/stories/perf.stories.js +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; - -import { storiesOf } from '@storybook/react'; - -import { Button } from '@storybook/react/demo'; - -for (let i = 0; i < 1; i += 1) { - const randomDemoName = Math.random() - .toString(36) - .substring(7); - const stories = storiesOf(`Perf.${randomDemoName}`); - - for (let j = 0; j < 10; j += 1) { - stories - .add(`with text ${j}`, () => ) - .add(`with emoji ${j}`, () => ( - - )); - } -} diff --git a/examples/cra-react15/package.json b/examples/cra-react15/package.json index 6b8dba86552..d6752374a8d 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.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "build": "react-scripts build", @@ -18,11 +18,11 @@ "react-scripts": "3.0.1" }, "devDependencies": { - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/react": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/react": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "babel-core": "6", "babel-runtime": "6" } diff --git a/examples/cra-ts-essentials/.storybook/main.js b/examples/cra-ts-essentials/.storybook/main.js new file mode 100644 index 00000000000..1fe1cb3ce2d --- /dev/null +++ b/examples/cra-ts-essentials/.storybook/main.js @@ -0,0 +1,12 @@ +module.exports = { + stories: ['../src/**/*.stories.tsx'], + presets: [ + '@storybook/preset-create-react-app', + { + name: '@storybook/addon-essentials', + options: { + backgrounds: false, + }, + }, + ], +}; diff --git a/examples/cra-ts-essentials/README.md b/examples/cra-ts-essentials/README.md new file mode 100644 index 00000000000..8ef4a5d7cdc --- /dev/null +++ b/examples/cra-ts-essentials/README.md @@ -0,0 +1 @@ +Demonstrate `@storybook/addon-essentials` default configuration with CRA / Typescript. diff --git a/examples/cra-ts-essentials/package.json b/examples/cra-ts-essentials/package.json new file mode 100644 index 00000000000..c2fa27c44ce --- /dev/null +++ b/examples/cra-ts-essentials/package.json @@ -0,0 +1,44 @@ +{ + "name": "cra-ts-essentials", + "version": "5.3.0-rc.0", + "private": true, + "scripts": { + "build": "react-scripts build", + "build-storybook": "build-storybook -s public", + "eject": "react-scripts eject", + "start": "react-scripts start", + "storybook": "start-storybook -p 9009 -s public", + "test": "react-scripts test" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "eslintConfig": { + "extends": "react-app" + }, + "dependencies": { + "@types/jest": "24.0.22", + "@types/node": "12.12.6", + "@types/react": "16.9.11", + "@types/react-dom": "16.9.4", + "react": "^16.11.0", + "react-dom": "^16.11.0", + "react-scripts": "3.2.0", + "typescript": "3.7.2" + }, + "devDependencies": { + "@storybook/addon-essentials": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/preset-create-react-app": "^1.5.0", + "@storybook/react": "5.3.0-rc.0" + } +} diff --git a/examples/cra-ts-essentials/public/favicon.ico b/examples/cra-ts-essentials/public/favicon.ico new file mode 100644 index 00000000000..c2c86b859ea Binary files /dev/null and b/examples/cra-ts-essentials/public/favicon.ico differ diff --git a/examples/cra-ts-essentials/public/index.html b/examples/cra-ts-essentials/public/index.html new file mode 100644 index 00000000000..c240d2ca8b0 --- /dev/null +++ b/examples/cra-ts-essentials/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/examples/cra-ts-essentials/public/logo192.png b/examples/cra-ts-essentials/public/logo192.png new file mode 100644 index 00000000000..fbdb05d4eb6 Binary files /dev/null and b/examples/cra-ts-essentials/public/logo192.png differ diff --git a/examples/cra-ts-essentials/public/logo512.png b/examples/cra-ts-essentials/public/logo512.png new file mode 100644 index 00000000000..917458c29a8 Binary files /dev/null and b/examples/cra-ts-essentials/public/logo512.png differ diff --git a/examples/cra-ts-essentials/public/manifest.json b/examples/cra-ts-essentials/public/manifest.json new file mode 100644 index 00000000000..080d6c77ac2 --- /dev/null +++ b/examples/cra-ts-essentials/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/examples/cra-ts-essentials/public/robots.txt b/examples/cra-ts-essentials/public/robots.txt new file mode 100644 index 00000000000..01b0f9a1073 --- /dev/null +++ b/examples/cra-ts-essentials/public/robots.txt @@ -0,0 +1,2 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * diff --git a/examples/cra-ts-essentials/src/App.css b/examples/cra-ts-essentials/src/App.css new file mode 100644 index 00000000000..afc3885715f --- /dev/null +++ b/examples/cra-ts-essentials/src/App.css @@ -0,0 +1,22 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #09d3ac; +} diff --git a/examples/cra-ts-essentials/src/App.test.tsx b/examples/cra-ts-essentials/src/App.test.tsx new file mode 100644 index 00000000000..a754b201bf9 --- /dev/null +++ b/examples/cra-ts-essentials/src/App.test.tsx @@ -0,0 +1,9 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; + +it('renders without crashing', () => { + const div = document.createElement('div'); + ReactDOM.render(, div); + ReactDOM.unmountComponentAtNode(div); +}); diff --git a/examples/cra-ts-essentials/src/App.tsx b/examples/cra-ts-essentials/src/App.tsx new file mode 100644 index 00000000000..226ee6316af --- /dev/null +++ b/examples/cra-ts-essentials/src/App.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import logo from './logo.svg'; +import './App.css'; + +const App: React.FC = () => { + return ( +
+
+ logo +

+ Edit src/App.tsx and save to reload. +

+ + Learn React + +
+
+ ); +} + +export default App; diff --git a/examples/cra-ts-essentials/src/index.css b/examples/cra-ts-essentials/src/index.css new file mode 100644 index 00000000000..ec2585e8c0b --- /dev/null +++ b/examples/cra-ts-essentials/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/examples/cra-ts-essentials/src/index.tsx b/examples/cra-ts-essentials/src/index.tsx new file mode 100644 index 00000000000..87d1be55189 --- /dev/null +++ b/examples/cra-ts-essentials/src/index.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.css'; +import App from './App'; +import * as serviceWorker from './serviceWorker'; + +ReactDOM.render(, document.getElementById('root')); + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: https://bit.ly/CRA-PWA +serviceWorker.unregister(); diff --git a/examples/cra-ts-essentials/src/logo.svg b/examples/cra-ts-essentials/src/logo.svg new file mode 100644 index 00000000000..7bd1599766b --- /dev/null +++ b/examples/cra-ts-essentials/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/cra-ts-essentials/src/react-app-env.d.ts b/examples/cra-ts-essentials/src/react-app-env.d.ts new file mode 100644 index 00000000000..6431bc5fc6b --- /dev/null +++ b/examples/cra-ts-essentials/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/cra-ts-essentials/src/serviceWorker.ts b/examples/cra-ts-essentials/src/serviceWorker.ts new file mode 100644 index 00000000000..15d90cb81a1 --- /dev/null +++ b/examples/cra-ts-essentials/src/serviceWorker.ts @@ -0,0 +1,143 @@ +// This optional code is used to register a service worker. +// register() is not called by default. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on subsequent visits to a page, after all the +// existing tabs open on the page have been closed, since previously cached +// resources are updated in the background. + +// To learn more about the benefits of this model and instructions on how to +// opt-in, read https://bit.ly/CRA-PWA + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.1/8 is considered localhost for IPv4. + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) +); + +type Config = { + onSuccess?: (registration: ServiceWorkerRegistration) => void; + onUpdate?: (registration: ServiceWorkerRegistration) => void; +}; + +export function register(config?: Config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL( + (process as { env: { [key: string]: string } }).env.PUBLIC_URL, + window.location.href + ); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit https://bit.ly/CRA-PWA' + ); + }); + } else { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW(swUrl: string, config?: Config) { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' + ); + + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker(swUrl: string, config?: Config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if ( + response.status === 404 || + (contentType != null && contentType.indexOf('javascript') === -1) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.' + ); + }); +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then(registration => { + registration.unregister(); + }); + } +} diff --git a/examples/cra-ts-essentials/src/stories/0-Welcome.stories.tsx b/examples/cra-ts-essentials/src/stories/0-Welcome.stories.tsx new file mode 100644 index 00000000000..fa267f24c31 --- /dev/null +++ b/examples/cra-ts-essentials/src/stories/0-Welcome.stories.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { linkTo } from '@storybook/addon-links'; +import { Welcome } from '@storybook/react/demo'; + +export default { + title: 'Welcome', + component: Welcome, +}; + +export const toStorybook = () => ; + +toStorybook.story = { + name: 'to Storybook', +}; diff --git a/examples/cra-ts-essentials/src/stories/1-Button.stories.tsx b/examples/cra-ts-essentials/src/stories/1-Button.stories.tsx new file mode 100644 index 00000000000..bf3304c3f2e --- /dev/null +++ b/examples/cra-ts-essentials/src/stories/1-Button.stories.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { action } from '@storybook/addon-actions'; +import { Button } from '@storybook/react/demo'; +import { text } from '@storybook/addon-knobs'; + +export default { + title: 'Button', + component: Button, +}; + +export const _text = () => ( + +); + +export const emoji = () => ( + +); diff --git a/examples/cra-ts-essentials/tsconfig.json b/examples/cra-ts-essentials/tsconfig.json new file mode 100644 index 00000000000..f2850b71613 --- /dev/null +++ b/examples/cra-ts-essentials/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react" + }, + "include": [ + "src" + ] +} diff --git a/examples/cra-ts-kitchen-sink/package.json b/examples/cra-ts-kitchen-sink/package.json index 76d5abc6fc4..48cf81e4efb 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.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "build": "react-scripts build", @@ -34,15 +34,15 @@ "typescript": "3.7.2" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-info": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/preset-create-react-app": "^1.3.1", - "@storybook/react": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-info": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/preset-create-react-app": "^1.5.0", + "@storybook/react": "5.3.0-rc.0", "@types/enzyme": "^3.9.0", "@types/react": "^16.8.14", "@types/react-dom": "^16.8.2", diff --git a/examples/dev-kits/main.js b/examples/dev-kits/main.js index cf58e227c54..c0b7859f927 100644 --- a/examples/dev-kits/main.js +++ b/examples/dev-kits/main.js @@ -1,3 +1,23 @@ module.exports = { - stories: [`${__dirname}/stories/*.*`], + stories: ['./stories/*.*'], + webpack: async (config, { configType }) => ({ + ...config, + module: { + ...config.module, + rules: [ + ...config.module.rules, + { + test: /\.(ts|tsx)$/, + loader: require.resolve('babel-loader'), + options: { + presets: [['react-app', { flow: false, typescript: true }]], + }, + }, + ], + }, + resolve: { + ...config.resolve, + extensions: [...(config.resolve.extensions || []), '.ts', '.tsx'], + }, + }), }; diff --git a/examples/dev-kits/manager.js b/examples/dev-kits/manager.js index 203b71164ba..15fdfd4baa6 100644 --- a/examples/dev-kits/manager.js +++ b/examples/dev-kits/manager.js @@ -1,12 +1,46 @@ -import '@storybook/addon-roundtrip/register'; -import '@storybook/addon-parameter/register'; -import '@storybook/addon-preview-wrapper/register'; - +import React from 'react'; +import { PropTypes } from 'prop-types'; +import { Button } from '@storybook/react/demo'; import { addons } from '@storybook/addons'; +import { useAddonState } from '@storybook/api'; import { themes } from '@storybook/theming'; +import { AddonPanel } from '@storybook/components'; addons.setConfig({ theme: themes.dark, panelPosition: 'bottom', selectedPanel: 'storybook/roundtrip', }); + +const StatePanel = ({ active, key }) => { + const [managerState, setManagerState] = useAddonState('manager', 10); + const [previewState, setPreviewState] = useAddonState('preview'); + return ( + +
+ Manager counter: {managerState} +
+ + +
+
+
+ Preview counter: {previewState} +
+ + +
+
+ ); +}; + +StatePanel.propTypes = { + active: PropTypes.bool.isRequired, + key: PropTypes.string.isRequired, +}; + +addons.addPanel('useAddonState', { + id: 'useAddonState', + title: 'useAddonState', + render: StatePanel, +}); diff --git a/examples/dev-kits/package.json b/examples/dev-kits/package.json index ca0dbc4681b..c2432007b91 100644 --- a/examples/dev-kits/package.json +++ b/examples/dev-kits/package.json @@ -1,22 +1,25 @@ { "name": "@storybook/example-devkits", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { - "build-storybook": "build-storybook -c ./", - "storybook": "start-storybook -p 9011 -c ./" + "build-storybook": "cross-env STORYBOOK_DISPLAY_WARNING=true DISPLAY_WARNING=true build-storybook -c ./", + "debug": "cross-env NODE_OPTIONS=--inspect-brk STORYBOOK_DISPLAY_WARNING=true DISPLAY_WARNING=true start-storybook -p 9011 -c ./ --no-dll", + "storybook": "cross-env STORYBOOK_DISPLAY_WARNING=true DISPLAY_WARNING=true start-storybook -p 9011 -c ./ --no-dll" }, "devDependencies": { - "@storybook/addon-decorator": "5.3.0-beta.16", - "@storybook/addon-parameter": "5.3.0-beta.16", - "@storybook/addon-preview-wrapper": "5.3.0-beta.16", - "@storybook/addon-roundtrip": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/components": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/node-logger": "5.3.0-beta.16", - "@storybook/react": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/addon-decorator": "5.3.0-rc.0", + "@storybook/addon-parameter": "5.3.0-rc.0", + "@storybook/addon-preview-wrapper": "5.3.0-rc.0", + "@storybook/addon-roundtrip": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/api": "5.3.0-rc.0", + "@storybook/client-api": "5.3.0-rc.0", + "@storybook/components": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/node-logger": "5.3.0-rc.0", + "@storybook/react": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "cors": "^2.8.5", "cross-env": "^6.0.3", "enzyme-to-json": "^3.4.1", diff --git a/examples/dev-kits/stories/addon-useaddonstate.tsx b/examples/dev-kits/stories/addon-useaddonstate.tsx new file mode 100644 index 00000000000..dbad9aa0193 --- /dev/null +++ b/examples/dev-kits/stories/addon-useaddonstate.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Button } from '@storybook/react/demo'; +import { useAddonState } from '@storybook/client-api'; + +export default { + title: 'addons|useAddonState', +}; + +export const managerDefault = () => { + const [state, setState] = useAddonState('manager'); + + return ( +
+ Manager counter: {state} +
+ + +
+ ); +}; + +export const previewDefault = () => { + const [state, setState] = useAddonState('preview', 50); + + return ( +
+ Preview counter: {state} +
+ + +
+ ); +}; diff --git a/examples/ember-cli/.storybook/main.js b/examples/ember-cli/.storybook/main.js index 8ef4c74c564..c8d73dff464 100644 --- a/examples/ember-cli/.storybook/main.js +++ b/examples/ember-cli/.storybook/main.js @@ -5,6 +5,7 @@ module.exports = { '@storybook/addon-a11y/register', '@storybook/addon-storysource/register', '@storybook/addon-actions/register', + '@storybook/addon-docs/register', '@storybook/addon-links/register', '@storybook/addon-notes/register', '@storybook/addon-knobs/register', diff --git a/lib/cli/generators/ANGULAR/template-mdx/.storybook/presets.js b/examples/ember-cli/.storybook/preset.js similarity index 100% rename from lib/cli/generators/ANGULAR/template-mdx/.storybook/presets.js rename to examples/ember-cli/.storybook/preset.js diff --git a/examples/ember-cli/.storybook/preview.js b/examples/ember-cli/.storybook/preview.js index 191e502e383..d8969edd461 100644 --- a/examples/ember-cli/.storybook/preview.js +++ b/examples/ember-cli/.storybook/preview.js @@ -1,6 +1,10 @@ import { addParameters, addDecorator } from '@storybook/ember'; +import { setJSONDoc } from '@storybook/addon-docs/ember'; import { withA11y } from '@storybook/addon-a11y'; +// eslint-disable-next-line import/no-unresolved +import docJson from '../dist/storybook-docgen/index.json'; +setJSONDoc(docJson); addDecorator(withA11y); addParameters({ options: { diff --git a/examples/ember-cli/app/components/welcome-banner.js b/examples/ember-cli/app/components/welcome-banner.js index 55706477346..5b4bb4e0bb1 100644 --- a/examples/ember-cli/app/components/welcome-banner.js +++ b/examples/ember-cli/app/components/welcome-banner.js @@ -1,3 +1,49 @@ import Component from '@ember/component'; -export default Component.extend({}); +/** + * + * `WelcomeBanner` renders a friendly message and is used to welcome Ember.js users when they first generate an application. + * + * + * ```js + * {{welcome-banner + * backgroundColor=backgroundColor + * titleColor=titleColor + * subTitleColor=subTitleColor + * title=title + * subtitle=subtitle + * click=(action onClick) + * }} + * ``` + * + * @class WelcomeBanner + */ +export default Component.extend({ + /** + * The hex-formatted color code for the background. + * @argument backgroundColor + * @type {string} + */ + backgroundColor: null, + + /** + * The hex-formatted color code for the subtitle. + * @argument subTitleColor + * @type {string} + */ + subTitleColor: null, + + /** + * The title of the banner. + * @argument title + * @type {string} + */ + title: null, + + /** + * The subtitle of the banner. + * @argument subtitle + * @type {string} + */ + subtitle: null, +}); diff --git a/examples/ember-cli/ember-cli-build.js b/examples/ember-cli/ember-cli-build.js index 78a64bb77d1..de9188ada6c 100644 --- a/examples/ember-cli/ember-cli-build.js +++ b/examples/ember-cli/ember-cli-build.js @@ -2,7 +2,9 @@ const EmberApp = require('ember-cli/lib/broccoli/ember-app'); module.exports = function build(defaults) { const app = new EmberApp(defaults, { - // Add options here + 'ember-cli-storybook': { + enableAddonDocsIntegration: true, + }, }); // Use `app.import` to add additional libraries to the generated diff --git a/examples/ember-cli/package.json b/examples/ember-cli/package.json index c92dede1bc9..3188a31bd49 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.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "build": "ember build", @@ -15,24 +15,26 @@ }, "devDependencies": { "@babel/core": "^7.3.4", - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-backgrounds": "5.3.0-beta.16", - "@storybook/addon-centered": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addon-viewport": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/ember": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-backgrounds": "5.3.0-rc.0", + "@storybook/addon-centered": "5.3.0-rc.0", + "@storybook/addon-docs": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addon-viewport": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/ember": "5.3.0-rc.0", + "@storybook/ember-cli-storybook": "^0.2.0", + "@storybook/source-loader": "5.3.0-rc.0", "babel-loader": "^8", "broccoli-asset-rev": "^3.0.0", "cross-env": "^6.0.3", - "ember-ajax": "^4.0.2", - "ember-cli": "~3.11.0", + "ember-ajax": "^5.0.0", + "ember-cli": "~3.14.0", "ember-cli-app-version": "^3.0.0", "ember-cli-babel": "^7.6.0", "ember-cli-htmlbars": "^3.0.1", @@ -40,11 +42,10 @@ "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-shims": "^1.2.0", "ember-cli-sri": "^2.1.0", - "ember-cli-storybook": "^0.1.0", - "ember-cli-uglify": "^2.0.0", + "ember-cli-uglify": "^3.0.0", "ember-load-initializers": "^2.0.0", "ember-resolver": "^5.1.3", - "ember-source": "~3.9.1", + "ember-source": "~3.15.0", "loader.js": "^4.2.3", "webpack": "^4.33.0", "webpack-cli": "^3.3.0" diff --git a/examples/ember-cli/stories/welcome-banner.stories.js b/examples/ember-cli/stories/welcome-banner.stories.js index 6b5f3d0bbf8..248ea7d96ee 100644 --- a/examples/ember-cli/stories/welcome-banner.stories.js +++ b/examples/ember-cli/stories/welcome-banner.stories.js @@ -3,6 +3,7 @@ import { action } from '@storybook/addon-actions'; export default { title: 'welcome-banner', + component: 'WelcomeBanner', }; export const Basic = () => ({ diff --git a/examples/html-kitchen-sink/package.json b/examples/html-kitchen-sink/package.json index 8df40cacaf8..f8e7cca0bc4 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.16", + "version": "5.3.0-rc.0", "private": true, "description": "", "keywords": [], @@ -13,26 +13,26 @@ "storybook": "start-storybook -p 9006" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-backgrounds": "5.3.0-beta.16", - "@storybook/addon-centered": "5.3.0-beta.16", - "@storybook/addon-docs": "5.3.0-beta.16", - "@storybook/addon-events": "5.3.0-beta.16", - "@storybook/addon-jest": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storyshots": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addon-viewport": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/client-api": "5.3.0-beta.16", - "@storybook/core": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/html": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-backgrounds": "5.3.0-rc.0", + "@storybook/addon-centered": "5.3.0-rc.0", + "@storybook/addon-docs": "5.3.0-rc.0", + "@storybook/addon-events": "5.3.0-rc.0", + "@storybook/addon-jest": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storyshots": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addon-viewport": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/client-api": "5.3.0-rc.0", + "@storybook/core": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/html": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", "eventemitter3": "^4.0.0", "format-json": "^1.0.3", "global": "^4.3.2", diff --git a/examples/marko-cli/package.json b/examples/marko-cli/package.json index 13ed5ce33bc..09101cbdb71 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.16", + "version": "5.3.0-rc.0", "private": true, "description": "Demo of how to build an app using marko-starter", "repository": { @@ -23,14 +23,14 @@ "marko-starter": "^2.1.0" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/marko": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/marko": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", "prettier": "^1.16.4", "webpack": "^4.33.0" } diff --git a/examples/mithril-kitchen-sink/package.json b/examples/mithril-kitchen-sink/package.json index 42b6a058150..a0ffc7c4b9c 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.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "build-storybook": "build-storybook", @@ -10,20 +10,20 @@ "mithril": "^1.1.6" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-backgrounds": "5.3.0-beta.16", - "@storybook/addon-centered": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storyshots": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addon-viewport": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/mithril": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-backgrounds": "5.3.0-rc.0", + "@storybook/addon-centered": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storyshots": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addon-viewport": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/mithril": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", "webpack": "^4.33.0" } } diff --git a/examples/mithril-kitchen-sink/src/Button.js b/examples/mithril-kitchen-sink/src/Button.js index edec915a04b..08d3f45a617 100644 --- a/examples/mithril-kitchen-sink/src/Button.js +++ b/examples/mithril-kitchen-sink/src/Button.js @@ -4,12 +4,12 @@ import m from 'mithril'; const style = { border: '1px solid #eee', - borderRadius: '3px', + borderRadius: 3, backgroundColor: '#FFFFFF', cursor: 'pointer', - fontSize: '15px', + fontSize: 15, padding: '3px 10px', - margin: '10px', + margin: 10, }; const Button = { diff --git a/examples/mithril-kitchen-sink/src/Welcome.js b/examples/mithril-kitchen-sink/src/Welcome.js index 86e83201655..3826e784d53 100644 --- a/examples/mithril-kitchen-sink/src/Welcome.js +++ b/examples/mithril-kitchen-sink/src/Welcome.js @@ -6,7 +6,7 @@ const Main = { view: vnode => (
- a[1].kind === b[1].kind ? 0 : a[1].id.localeCompare(b[1].id, { numeric: true }), + a[1].kind === b[1].kind ? 0 : a[1].id.localeCompare(b[1].id, undefined, { numeric: true }), }, backgrounds: [ { name: 'storybook app', value: themes.light.appBg, default: true }, 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 8c8f3dd4ec7..b3ab034e9ec 100644 --- a/examples/official-storybook/stories/addon-info/story-source.stories.js +++ b/examples/official-storybook/stories/addon-info/story-source.stories.js @@ -65,7 +65,7 @@ export const ObjectProp = () => ( backgroundColor: 'powderblue', fontSize: '16px', boxShadow: '1px 1px rgba(0, 0, 0, .07)', - borderRadius: '5px', + borderRadius: 5, padding: '4px 8px', }} /> 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 4b9109dd07b..e458969cc86 100644 --- a/examples/official-storybook/stories/addon-knobs/with-knobs.stories.js +++ b/examples/official-storybook/stories/addon-knobs/with-knobs.stories.js @@ -69,7 +69,7 @@ export const TweaksStaticValues = () => { const otherStyles = object('Styles', { border: '2px dashed silver', borderRadius: 10, - padding: '10px', + padding: 10, }); const nice = boolean('Nice', true); const images = files('Happy Picture', 'image/*', [ @@ -173,7 +173,7 @@ export const TweaksStaticValuesOrganizedInGroups = () => { { border: '2px dashed silver', borderRadius: 10, - padding: '10px', + padding: 10, }, GROUP_IDS.DISPLAY ); diff --git a/examples/polymer-cli/package.json b/examples/polymer-cli/package.json index 52fcdc95fb6..bcb52b675df 100644 --- a/examples/polymer-cli/package.json +++ b/examples/polymer-cli/package.json @@ -1,6 +1,6 @@ { "name": "polymer-cli", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "build-storybook": "build-storybook", @@ -9,18 +9,18 @@ }, "dependencies": { "@polymer/polymer": "^2.6.0", - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-backgrounds": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addon-viewport": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/polymer": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-backgrounds": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addon-viewport": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/polymer": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", "@webcomponents/webcomponentsjs": "^1.2.0", "global": "^4.3.2", "lit-html": "^1.0.0", diff --git a/examples/preact-kitchen-sink/package.json b/examples/preact-kitchen-sink/package.json index b699b82a4a5..b3732df32bb 100644 --- a/examples/preact-kitchen-sink/package.json +++ b/examples/preact-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "preact-example", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "build": "cross-env NODE_ENV=production webpack --progress --hide-modules", @@ -15,21 +15,21 @@ "devDependencies": { "@babel/core": "^7.3.4", "@babel/plugin-transform-runtime": "^7.2.0", - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-backgrounds": "5.3.0-beta.16", - "@storybook/addon-centered": "5.3.0-beta.16", - "@storybook/addon-contexts": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storyshots": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addon-viewport": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/preact": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-backgrounds": "5.3.0-rc.0", + "@storybook/addon-centered": "5.3.0-rc.0", + "@storybook/addon-contexts": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storyshots": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addon-viewport": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/preact": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", "babel-loader": "^8.0.4", "cross-env": "^6.0.3", "file-loader": "^4.2.0", diff --git a/examples/rax-kitchen-sink/package.json b/examples/rax-kitchen-sink/package.json index f7816bc46d3..14ebbd19962 100644 --- a/examples/rax-kitchen-sink/package.json +++ b/examples/rax-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "rax-kitchen-sink", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "build": "rax-scripts build", @@ -21,24 +21,24 @@ "rax-view": "^1.0.0" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-backgrounds": "5.3.0-beta.16", - "@storybook/addon-centered": "5.3.0-beta.16", - "@storybook/addon-events": "5.3.0-beta.16", - "@storybook/addon-info": "5.3.0-beta.16", - "@storybook/addon-jest": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storyshots": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addon-viewport": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/rax": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-backgrounds": "5.3.0-rc.0", + "@storybook/addon-centered": "5.3.0-rc.0", + "@storybook/addon-events": "5.3.0-rc.0", + "@storybook/addon-info": "5.3.0-rc.0", + "@storybook/addon-jest": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storyshots": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addon-viewport": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/rax": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "babel-eslint": "^10.0.3", "babel-preset-rax": "^1.0.0-beta.0", "rax-scripts": "^2.0.0", diff --git a/examples/rax-kitchen-sink/src/components/App/App.test.js b/examples/rax-kitchen-sink/src/components/App/App.test.js index 719fbb24b85..4aab78399d6 100644 --- a/examples/rax-kitchen-sink/src/components/App/App.test.js +++ b/examples/rax-kitchen-sink/src/components/App/App.test.js @@ -1,6 +1,6 @@ import { createElement } from 'rax'; import renderer from 'rax-test-renderer'; -import App from './index'; +import { App } from './index'; test('App render correctly', () => { const tree = renderer.create().toJSON(); diff --git a/examples/rax-kitchen-sink/src/components/App/index.js b/examples/rax-kitchen-sink/src/components/App/index.js index 2b1568388e6..2cdfa966eee 100644 --- a/examples/rax-kitchen-sink/src/components/App/index.js +++ b/examples/rax-kitchen-sink/src/components/App/index.js @@ -3,7 +3,7 @@ import View from 'rax-view'; import Text from 'rax-text'; import styles from './index.stylesheet'; -const App = () => ( +export const App = () => ( Welcome to Rax @@ -13,5 +13,3 @@ const App = () => ( ); - -export default App; diff --git a/examples/rax-kitchen-sink/src/components/App/index.stylesheet b/examples/rax-kitchen-sink/src/components/App/index.stylesheet index b934c26b377..136c2936a77 100644 --- a/examples/rax-kitchen-sink/src/components/App/index.stylesheet +++ b/examples/rax-kitchen-sink/src/components/App/index.stylesheet @@ -2,13 +2,14 @@ flex: 1; justify-content: center; align-items: center; - width: 300; + background-color: #222; + color: white; + padding: 40px; } .appHeader { - background-color: #222; height: 160; - padding: 40; + padding: 40px; } .appBanner, .appIntro { @@ -23,5 +24,4 @@ .appIntro { margin-top: 40; font-size: 20; - line-height: 30; } diff --git a/examples/rax-kitchen-sink/src/components/Welcome/Welcome.test.js b/examples/rax-kitchen-sink/src/components/Welcome/Welcome.test.js index f06f49a3a2a..0881e2f6373 100644 --- a/examples/rax-kitchen-sink/src/components/Welcome/Welcome.test.js +++ b/examples/rax-kitchen-sink/src/components/Welcome/Welcome.test.js @@ -1,6 +1,6 @@ import { createElement } from 'rax'; import renderer from 'rax-test-renderer'; -import Welcome from './index'; +import { Welcome } from './index'; test('Welcome render correctly', () => { const tree = renderer.create().toJSON(); diff --git a/examples/rax-kitchen-sink/src/components/Welcome/__snapshots__/Welcome.test.js.snap b/examples/rax-kitchen-sink/src/components/Welcome/__snapshots__/Welcome.test.js.snap index 6b71f7f67f1..0897cf06fc1 100644 --- a/examples/rax-kitchen-sink/src/components/Welcome/__snapshots__/Welcome.test.js.snap +++ b/examples/rax-kitchen-sink/src/components/Welcome/__snapshots__/Welcome.test.js.snap @@ -16,7 +16,7 @@ Object { "style": Object { "fontSize": 40, "fontWeight": "bold", - "lineHeight": 50, + "lineHeight": "80px", "webkitLineClamp": undefined, }, "tagName": "SPAN", diff --git a/examples/rax-kitchen-sink/src/components/Welcome/index.js b/examples/rax-kitchen-sink/src/components/Welcome/index.js index 8715efacb67..b1d9aa9aff2 100644 --- a/examples/rax-kitchen-sink/src/components/Welcome/index.js +++ b/examples/rax-kitchen-sink/src/components/Welcome/index.js @@ -2,7 +2,6 @@ import { createElement } from 'rax'; import View from 'rax-view'; import Text from 'rax-text'; -// import Button from 'rax-button'; import Image from 'rax-image'; const Main = ({ children, ...props }) => ( @@ -24,12 +23,12 @@ const P = ({ children, ...props }) => ( ); const Title = ({ children, ...props }) => ( - + {children} ); -const Welcome = ({ showApp }) => ( +export const Welcome = ({ showApp }) => (
Welcome to storybook for Rax (

); - -export default Welcome; diff --git a/examples/rax-kitchen-sink/src/index.js b/examples/rax-kitchen-sink/src/index.js index 595e779605b..2d90540a8cb 100644 --- a/examples/rax-kitchen-sink/src/index.js +++ b/examples/rax-kitchen-sink/src/index.js @@ -1,4 +1,4 @@ import { createElement, render } from 'rax'; -import App from './components/App/index'; +import { App } from './components/App/index'; render(); diff --git a/examples/rax-kitchen-sink/src/stories/addon-centered.stories.js b/examples/rax-kitchen-sink/src/stories/addon-centered.stories.js index 8c72523e63f..9cc99bf112f 100644 --- a/examples/rax-kitchen-sink/src/stories/addon-centered.stories.js +++ b/examples/rax-kitchen-sink/src/stories/addon-centered.stories.js @@ -1,7 +1,7 @@ import { createElement } from 'rax'; import Centered from '@storybook/addon-centered/rax'; import Text from 'rax-text'; -import App from '../components/App'; +import { App as AppComponent } from '../components/App'; export default { title: 'Addon/addon-centered', @@ -9,11 +9,9 @@ export default { }; export const Button = () => ( - + ); -Button.story = { name: 'Button' }; -export const app = () => ; -app.story = { name: 'App' }; +export const App = () => ; diff --git a/examples/rax-kitchen-sink/src/stories/addon-jest.stories.js b/examples/rax-kitchen-sink/src/stories/addon-jest.stories.js index 3d350d1cde5..961f8b7e840 100644 --- a/examples/rax-kitchen-sink/src/stories/addon-jest.stories.js +++ b/examples/rax-kitchen-sink/src/stories/addon-jest.stories.js @@ -1,7 +1,7 @@ import { createElement } from 'rax'; import { withTests } from '@storybook/addon-jest'; -import App from '../components/App'; -import Welcome from '../components/Welcome'; +import { App } from '../components/App'; +import { Welcome } from '../components/Welcome'; // eslint-disable-next-line import results from '../../jest-test-results.json'; diff --git a/examples/rax-kitchen-sink/src/stories/index.stories.js b/examples/rax-kitchen-sink/src/stories/index.stories.js index 1d5ab0e256f..d8547241fc4 100644 --- a/examples/rax-kitchen-sink/src/stories/index.stories.js +++ b/examples/rax-kitchen-sink/src/stories/index.stories.js @@ -1,18 +1,11 @@ import { createElement } from 'rax'; import { linkTo } from '@storybook/addon-links'; -import App from '../components/App'; -import Welcome from '../components/Welcome'; +import { App as AppComponent } from '../components/App/index'; +import { Welcome } from '../components/Welcome/index'; export default { title: 'Basic', }; export const WelcomeScreen = () => ; -WelcomeScreen.story = { - name: 'Welcome screen', -}; - -export const app = () => ; -app.story = { - name: 'App', -}; +export const App = () => ; diff --git a/examples/riot-kitchen-sink/package.json b/examples/riot-kitchen-sink/package.json index 548cea79aab..73dc05b4704 100644 --- a/examples/riot-kitchen-sink/package.json +++ b/examples/riot-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "riot-example", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "build": "cross-env NODE_ENV=production webpack --progress --hide-modules", @@ -15,20 +15,20 @@ }, "devDependencies": { "@babel/core": "^7.3.4", - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-backgrounds": "5.3.0-beta.16", - "@storybook/addon-centered": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storyshots": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addon-viewport": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/riot": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-backgrounds": "5.3.0-rc.0", + "@storybook/addon-centered": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storyshots": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addon-viewport": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/riot": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", "babel-loader": "^8.0.4", "cross-env": "^6.0.3", "file-loader": "^4.2.0", diff --git a/examples/standalone-preview/package.json b/examples/standalone-preview/package.json index dcb5845fe5b..20c7ca37acb 100644 --- a/examples/standalone-preview/package.json +++ b/examples/standalone-preview/package.json @@ -1,12 +1,12 @@ { "name": "standalone-preview", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "storybook": "parcel ./storybook.html --port 1337" }, "devDependencies": { - "@storybook/react": "5.3.0-beta.16", + "@storybook/react": "5.3.0-rc.0", "parcel": "^1.12.3", "react": "^16.8.4", "react-dom": "^16.8.4" diff --git a/examples/svelte-kitchen-sink/package.json b/examples/svelte-kitchen-sink/package.json index 433718a2a9f..94ad34b092d 100644 --- a/examples/svelte-kitchen-sink/package.json +++ b/examples/svelte-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "svelte-example", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "build-storybook": "build-storybook -s public", @@ -10,19 +10,19 @@ "global": "^4.3.2" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-backgrounds": "5.3.0-beta.16", - "@storybook/addon-centered": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storyshots": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addon-viewport": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", - "@storybook/svelte": "5.3.0-beta.16" + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-backgrounds": "5.3.0-rc.0", + "@storybook/addon-centered": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storyshots": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addon-viewport": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", + "@storybook/svelte": "5.3.0-rc.0" } } diff --git a/examples/vue-kitchen-sink/package.json b/examples/vue-kitchen-sink/package.json index 2d25b2743b7..cfaa96d5efe 100644 --- a/examples/vue-kitchen-sink/package.json +++ b/examples/vue-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "vue-example", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "scripts": { "build": "cross-env NODE_ENV=production webpack --progress --hide-modules", @@ -14,22 +14,22 @@ }, "devDependencies": { "@babel/core": "^7.3.4", - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-backgrounds": "5.3.0-beta.16", - "@storybook/addon-centered": "5.3.0-beta.16", - "@storybook/addon-contexts": "5.3.0-beta.16", - "@storybook/addon-docs": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storyshots": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addon-viewport": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", - "@storybook/vue": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-backgrounds": "5.3.0-rc.0", + "@storybook/addon-centered": "5.3.0-rc.0", + "@storybook/addon-contexts": "5.3.0-rc.0", + "@storybook/addon-docs": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storyshots": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addon-viewport": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", + "@storybook/vue": "5.3.0-rc.0", "babel-core": "^7.0.0-bridge.0", "babel-loader": "^8.0.5", "cross-env": "^6.0.3", diff --git a/examples/vue-kitchen-sink/src/stories/__snapshots__/core-errors.stories.storyshot b/examples/vue-kitchen-sink/src/stories/__snapshots__/core-errors.stories.storyshot deleted file mode 100644 index 7c1f2d2bb0b..00000000000 --- a/examples/vue-kitchen-sink/src/stories/__snapshots__/core-errors.stories.storyshot +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Core/Errors Null Error 1`] = ``; diff --git a/examples/vue-kitchen-sink/src/stories/core-errors.stories.js b/examples/vue-kitchen-sink/src/stories/core-errors.stories.js deleted file mode 100644 index 719a72a1a8d..00000000000 --- a/examples/vue-kitchen-sink/src/stories/core-errors.stories.js +++ /dev/null @@ -1,10 +0,0 @@ -export default { - title: 'Core/Errors', -}; - -export const ThrowsError = () => { - throw new Error('foo'); -}; -ThrowsError.story = { parameters: { storyshots: { disable: true } } }; - -export const NullError = () => null; diff --git a/examples/web-components-kitchen-sink/custom-elements.json b/examples/web-components-kitchen-sink/custom-elements.json index 448e527aea8..d0e18cdddda 100644 --- a/examples/web-components-kitchen-sink/custom-elements.json +++ b/examples/web-components-kitchen-sink/custom-elements.json @@ -1,27 +1,25 @@ { - "version": 2, + "version": 1.2, "tags": [ { "name": "demo-wc-card", "description": "This is a container looking like a card with a back and front side you can switch", - "jsDoc": "/**\n * This is a container looking like a card with a back and front side you can switch\n *\n * @slot - This is an unnamed slot (the default slot)\n * @fires side-changed - Fires whenever it switches between front/back\n * @cssprop --demo-wc-card-header-font-size - Header font size\n * @cssprop --demo-wc-card-front-color - Font color for front\n * @cssprop --demo-wc-card-back-color - Font color for back\n */", "attributes": [ { "name": "back-side", "description": "Indicates that the back of the card is shown", - "jsDoc": "/**\n * Indicates that the back of the card is shown\n */", - "type": "boolean" + "type": "boolean", + "defaultValue": false }, { "name": "header", "description": "Header message", - "jsDoc": "/**\n * Header message\n */", - "type": "string" + "type": "string", + "defaultValue": "Your message" }, { "name": "rows", "description": "Data rows", - "jsDoc": "/**\n * Data rows\n */", "type": "never[]" } ], @@ -29,19 +27,16 @@ { "name": "backSide", "description": "Indicates that the back of the card is shown", - "jsDoc": "/**\n * Indicates that the back of the card is shown\n */", "type": "boolean" }, { "name": "header", "description": "Header message", - "jsDoc": "/**\n * Header message\n */", "type": "string" }, { "name": "rows", "description": "Data rows", - "jsDoc": "/**\n * Data rows\n */", "type": "never[]" } ], @@ -73,4 +68,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/examples/web-components-kitchen-sink/package.json b/examples/web-components-kitchen-sink/package.json index 522c3f59672..bf8d9eb3eba 100644 --- a/examples/web-components-kitchen-sink/package.json +++ b/examples/web-components-kitchen-sink/package.json @@ -1,6 +1,6 @@ { "name": "web-components-kitchen-sink", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "description": "", "keywords": [], @@ -12,26 +12,26 @@ "storybook": "start-storybook -p 9006" }, "devDependencies": { - "@storybook/addon-a11y": "5.3.0-beta.16", - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-backgrounds": "5.3.0-beta.16", - "@storybook/addon-centered": "5.3.0-beta.16", - "@storybook/addon-docs": "5.3.0-beta.16", - "@storybook/addon-events": "5.3.0-beta.16", - "@storybook/addon-jest": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storyshots": "5.3.0-beta.16", - "@storybook/addon-storysource": "5.3.0-beta.16", - "@storybook/addon-viewport": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/client-api": "5.3.0-beta.16", - "@storybook/core": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/source-loader": "5.3.0-beta.16", - "@storybook/web-components": "5.3.0-beta.16", + "@storybook/addon-a11y": "5.3.0-rc.0", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-backgrounds": "5.3.0-rc.0", + "@storybook/addon-centered": "5.3.0-rc.0", + "@storybook/addon-docs": "5.3.0-rc.0", + "@storybook/addon-events": "5.3.0-rc.0", + "@storybook/addon-jest": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storyshots": "5.3.0-rc.0", + "@storybook/addon-storysource": "5.3.0-rc.0", + "@storybook/addon-viewport": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/client-api": "5.3.0-rc.0", + "@storybook/core": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/source-loader": "5.3.0-rc.0", + "@storybook/web-components": "5.3.0-rc.0", "babel-loader": "^8.0.5", "eventemitter3": "^4.0.0", "format-json": "^1.0.3", diff --git a/lerna.json b/lerna.json index 4e25f5d7991..c5f89a61c1d 100644 --- a/lerna.json +++ b/lerna.json @@ -2,5 +2,5 @@ "npmClient": "yarn", "useWorkspaces": true, "registry": "https://registry.npmjs.org", - "version": "5.3.0-beta.16" + "version": "5.3.0-rc.0" } diff --git a/lib/addons/package.json b/lib/addons/package.json index 64143e38a67..3633a889d38 100644 --- a/lib/addons/package.json +++ b/lib/addons/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addons", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Storybook addons store", "keywords": [ "storybook" @@ -27,10 +27,10 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/api": "5.3.0-beta.16", - "@storybook/channels": "5.3.0-beta.16", - "@storybook/client-logger": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", + "@storybook/api": "5.3.0-rc.0", + "@storybook/channels": "5.3.0-rc.0", + "@storybook/client-logger": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", "core-js": "^3.0.1", "global": "^4.3.2", "util-deprecate": "^1.0.2" @@ -40,5 +40,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/addons/src/hooks.ts b/lib/addons/src/hooks.ts index a7750250d13..ebf64215b6b 100644 --- a/lib/addons/src/hooks.ts +++ b/lib/addons/src/hooks.ts @@ -378,6 +378,7 @@ export interface EventMap { /* Accepts a map of Storybook channel event listeners, returns an emit function */ export function useChannel(eventMap: EventMap, deps: any[] = []) { const channel = addons.getChannel(); + useEffect(() => { Object.entries(eventMap).forEach(([type, listener]) => channel.on(type, listener)); return () => { @@ -387,7 +388,7 @@ export function useChannel(eventMap: EventMap, deps: any[] = []) { }; }, [...Object.keys(eventMap), ...deps]); - return channel.emit.bind(channel); + return useCallback(channel.emit.bind(channel), [channel]); } /* Returns current story context */ diff --git a/lib/addons/tsconfig.json b/lib/addons/tsconfig.json index 64eed74f8ea..9398dc348c7 100644 --- a/lib/addons/tsconfig.json +++ b/lib/addons/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "rootDir": "./src" + "rootDir": "./src", + "types": ["webpack-env"] }, "include": [ "src/**/*" diff --git a/lib/api/package.json b/lib/api/package.json index 1998a764221..f01f2f23ec8 100644 --- a/lib/api/package.json +++ b/lib/api/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/api", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Core Storybook API & Context", "keywords": [ "storybook" @@ -26,11 +26,12 @@ "prepare": "node ./scripts/generateVersion.js && node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/channels": "5.3.0-beta.16", - "@storybook/client-logger": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/router": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/channels": "5.3.0-rc.0", + "@storybook/client-logger": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/csf": "0.0.1", + "@storybook/router": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "core-js": "^3.0.1", "fast-deep-equal": "^2.0.1", "global": "^4.3.2", @@ -53,5 +54,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/api/src/index.tsx b/lib/api/src/index.tsx index a4a008f142c..7b937d5669b 100644 --- a/lib/api/src/index.tsx +++ b/lib/api/src/index.tsx @@ -1,9 +1,16 @@ -import React, { ReactElement, Component, useContext, useEffect, useRef } from 'react'; +import React, { ReactElement, Component, useContext, useEffect, useMemo } from 'react'; import memoize from 'memoizerific'; // @ts-ignore shallow-equal is not in DefinitelyTyped import shallowEqualObjects from 'shallow-equal/objects'; -import Events from '@storybook/core-events'; +import { + STORIES_CONFIGURED, + STORY_CHANGED, + SET_STORIES, + SELECT_STORY, + ADDON_STATE_CHANGED, + ADDON_STATE_SET, +} from '@storybook/core-events'; import { RenderData as RouterData } from '@storybook/router'; import { Listener } from '@storybook/channels'; import initProviderApi, { SubAPI as ProviderAPI, Provider } from './init-provider-api'; @@ -38,8 +45,6 @@ export { Options as StoreOptions, Listener as ChannelListener }; const ManagerContext = createContext({ api: undefined, state: getInitialState({}) }); -const { STORY_CHANGED, SET_STORIES, SELECT_STORY } = Events; - export type Module = StoreData & RouterData & ProviderData & { @@ -186,7 +191,6 @@ class ManagerProvider extends Component { api.selectStory(kind, story, rest); } ); - this.state = state; this.api = api; } @@ -310,40 +314,14 @@ function orDefault(fromStore: S, defaultState: S): S { return fromStore; } -type StateMerger = (input: S) => S; - -export function useAddonState(addonId: string, defaultState?: S) { - const api = useStorybookApi(); - const ref = useRef<{ [k: string]: boolean }>({}); - - const existingState = api.getAddonState(addonId); - const state = orDefault(existingState, defaultState); - - const setState = (newStateOrMerger: S | StateMerger, options?: Options) => { - return api.setAddonState(addonId, newStateOrMerger, options); - }; - - if (typeof existingState === 'undefined' && typeof state !== 'undefined') { - if (!ref.current[addonId]) { - api.setAddonState(addonId, state); - ref.current[addonId] = true; - } - } - - return [state, setState] as [ - S, - (newStateOrMerger: S | StateMerger, options?: Options) => Promise - ]; -} - -export const useChannel = (eventMap: EventMap) => { +export const useChannel = (eventMap: EventMap, deps: any[] = []) => { const api = useStorybookApi(); useEffect(() => { Object.entries(eventMap).forEach(([type, listener]) => api.on(type, listener)); return () => { Object.entries(eventMap).forEach(([type, listener]) => api.off(type, listener)); }; - }); + }, deps); return api.emit; }; @@ -354,3 +332,66 @@ export function useParameter(parameterKey: string, defaultValue?: S) { const result = api.getCurrentParameter(parameterKey); return orDefault(result, defaultValue); } + +type StateMerger = (input: S) => S; +// chache for taking care of HMR +const addonStateCache: { + [key: string]: any; +} = {}; + +// shared state +export function useAddonState(addonId: string, defaultState?: S) { + const api = useStorybookApi(); + const existingState = api.getAddonState(addonId); + const state = orDefault( + existingState, + addonStateCache[addonId] ? addonStateCache[addonId] : defaultState + ); + const setState = (s: S | StateMerger, options?: Options) => { + // set only after the stories are loaded + if (addonStateCache[addonId]) { + addonStateCache[addonId] = s; + } + api.setAddonState(addonId, s, options); + }; + const allListeners = useMemo(() => { + const stateChangeHandlers = { + [`${ADDON_STATE_CHANGED}-client-${addonId}`]: (s: S) => setState(s), + [`${ADDON_STATE_SET}-client-${addonId}`]: (s: S) => setState(s), + }; + const stateInitializationHandlers = { + [STORIES_CONFIGURED]: () => { + if (addonStateCache[addonId]) { + // this happens when HMR + setState(addonStateCache[addonId]); + api.emit(`${ADDON_STATE_SET}-manager-${addonId}`, addonStateCache[addonId]); + } else if (defaultState !== undefined) { + // if not HMR, yet the defaults are form the manager + setState(defaultState); + // initialize addonStateCache after first load, so its available for subsequent HMR + addonStateCache[addonId] = defaultState; + api.emit(`${ADDON_STATE_SET}-manager-${addonId}`, defaultState); + } + }, + [STORY_CHANGED]: () => { + if (api.getAddonState(addonId) !== undefined) { + api.emit(`${ADDON_STATE_SET}-manager-${addonId}`, api.getAddonState(addonId)); + } + }, + }; + + return { + ...stateChangeHandlers, + ...stateInitializationHandlers, + }; + }, [addonId]); + + const emit = useChannel(allListeners); + return [ + state, + (newStateOrMerger: S | StateMerger, options?: Options) => { + setState(newStateOrMerger, options); + emit(`${ADDON_STATE_CHANGED}-manager-${addonId}`, newStateOrMerger); + }, + ] as [S, (newStateOrMerger: S | StateMerger, options?: Options) => void]; +} diff --git a/lib/api/src/modules/stories.ts b/lib/api/src/modules/stories.ts index e41556d914a..8bdcdc41d94 100644 --- a/lib/api/src/modules/stories.ts +++ b/lib/api/src/modules/stories.ts @@ -1,5 +1,5 @@ -// FIXME: we shouldn't import from dist but there are no types otherwise -import { toId, sanitize, parseKind } from '@storybook/router'; +import { DOCS_MODE } from 'global'; +import { toId, sanitize, parseKind } from '@storybook/csf'; import deprecate from 'util-deprecate'; import { Module } from '../index'; @@ -132,6 +132,11 @@ const initStoriesApi = ({ const jumpToStory = (direction: Direction) => { const { storiesHash, viewMode, storyId } = store.getState(); + if (DOCS_MODE) { + jumpToComponent(direction); + return; + } + // cannot navigate when there's no current selection if (!storyId || !storiesHash[storyId]) { return; diff --git a/lib/api/src/modules/url.ts b/lib/api/src/modules/url.ts index 735dbf12274..6aec64d905f 100644 --- a/lib/api/src/modules/url.ts +++ b/lib/api/src/modules/url.ts @@ -1,5 +1,5 @@ import { queryFromLocation } from '@storybook/router'; -import { toId } from '@storybook/router/dist/utils'; +import { toId } from '@storybook/csf'; import { Module } from '../index'; import { PanelPositions } from './layout'; diff --git a/lib/api/src/version.ts b/lib/api/src/version.ts index f6c7115dbe2..d1499c15d1b 100644 --- a/lib/api/src/version.ts +++ b/lib/api/src/version.ts @@ -1 +1 @@ -export const version = '5.3.0-beta.16'; +export const version = '5.3.0-rc.0'; diff --git a/lib/channel-postmessage/package.json b/lib/channel-postmessage/package.json index 66658362406..a91274ca71c 100644 --- a/lib/channel-postmessage/package.json +++ b/lib/channel-postmessage/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/channel-postmessage", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "", "keywords": [ "storybook" @@ -27,13 +27,14 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/channels": "5.3.0-beta.16", - "@storybook/client-logger": "5.3.0-beta.16", + "@storybook/channels": "5.3.0-rc.0", + "@storybook/client-logger": "5.3.0-rc.0", "core-js": "^3.0.1", "global": "^4.3.2", "telejson": "^3.2.0" }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/channel-postmessage/src/index.ts b/lib/channel-postmessage/src/index.ts index 2bfc65ad612..863de1eaad0 100644 --- a/lib/channel-postmessage/src/index.ts +++ b/lib/channel-postmessage/src/index.ts @@ -60,7 +60,7 @@ export class PostmsgTransport { */ send(event: ChannelEvent, options?: any): Promise { const iframeWindow = this.getWindow(); - if (!iframeWindow) { + if (!iframeWindow || this.buffer.length) { return new Promise((resolve, reject) => { this.buffer.push({ event, resolve, reject }); }); diff --git a/lib/channel-websocket/package.json b/lib/channel-websocket/package.json index 87c8b6436c2..410fce2d48f 100644 --- a/lib/channel-websocket/package.json +++ b/lib/channel-websocket/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/channel-websocket", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "", "keywords": [ "storybook" @@ -27,12 +27,13 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/channels": "5.3.0-beta.16", + "@storybook/channels": "5.3.0-rc.0", "core-js": "^3.0.1", "global": "^4.3.2", "json-fn": "^1.1.1" }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/channels/package.json b/lib/channels/package.json index 19925e7cd9c..bc7ae5904fe 100644 --- a/lib/channels/package.json +++ b/lib/channels/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/channels", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "", "keywords": [ "storybook" @@ -31,5 +31,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/channels/src/index.ts b/lib/channels/src/index.ts index 36df014cffb..43134159031 100644 --- a/lib/channels/src/index.ts +++ b/lib/channels/src/index.ts @@ -40,6 +40,8 @@ export class Channel { private events: EventsKeyValue = {}; + private data: Record = {}; + private readonly transport: ChannelTransport; constructor({ transport, async = false }: ChannelArgs = {}) { @@ -87,6 +89,10 @@ export class Channel { } } + last(eventName: string) { + return this.data[eventName]; + } + eventNames() { return Object.keys(this.events); } @@ -134,6 +140,7 @@ export class Channel { if (listeners && (isPeer || event.from !== this.sender)) { listeners.forEach(fn => !(isPeer && fn.ignorePeer) && fn(...event.args)); } + this.data[event.type] = event.args; } private onceListener(eventName: string, listener: Listener) { diff --git a/lib/channels/tsconfig.json b/lib/channels/tsconfig.json index 64eed74f8ea..fe128055ea4 100644 --- a/lib/channels/tsconfig.json +++ b/lib/channels/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "rootDir": "./src" + "rootDir": "./src", + "types": ["node"] }, "include": [ "src/**/*" diff --git a/lib/cli-sb/package.json b/lib/cli-sb/package.json index 1335e95cd84..8180d34b9ce 100644 --- a/lib/cli-sb/package.json +++ b/lib/cli-sb/package.json @@ -1,6 +1,6 @@ { "name": "sb", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "description": "Storybook CLI", "keywords": [ @@ -23,7 +23,7 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/cli": "5.3.0-beta.16" + "@storybook/cli": "5.3.0-rc.0" }, "publishConfig": { "access": "public" diff --git a/lib/cli-storybook/package.json b/lib/cli-storybook/package.json index d3db9c077cd..6228b7380ef 100644 --- a/lib/cli-storybook/package.json +++ b/lib/cli-storybook/package.json @@ -1,6 +1,6 @@ { "name": "storybook", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "private": true, "description": "Storybook CLI", "keywords": [ @@ -24,7 +24,7 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/cli": "5.3.0-beta.16" + "@storybook/cli": "5.3.0-rc.0" }, "publishConfig": { "access": "public" diff --git a/lib/cli/README.md b/lib/cli/README.md index c556bcc81fe..3e2f0efe8de 100644 --- a/lib/cli/README.md +++ b/lib/cli/README.md @@ -23,7 +23,7 @@ See the command-line help with `-h` for details. ## [Yarn](https://github.com/yarnpkg/yarn) support -The CLI supports yarn. If you have installed yarn in your system, it'll detect it and use `yarn` instead of `npm`. +The CLI supports yarn. If you have installed yarn in your system and your project has `yarn.lock` file, it'll detect it and use `yarn` instead of `npm`. If you don't want to use `yarn` always you can use the `--use-npm` option like this: diff --git a/lib/cli/generators/ANGULAR/template-csf/.storybook/addons.js b/lib/cli/generators/ANGULAR/template-csf/.storybook/addons.js deleted file mode 100644 index 47eabe0ce40..00000000000 --- a/lib/cli/generators/ANGULAR/template-csf/.storybook/addons.js +++ /dev/null @@ -1,3 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; -import '@storybook/addon-notes/register'; diff --git a/lib/cli/generators/ANGULAR/template-csf/.storybook/config.js b/lib/cli/generators/ANGULAR/template-csf/.storybook/config.js deleted file mode 100644 index b9f8d0322eb..00000000000 --- a/lib/cli/generators/ANGULAR/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/angular'; - -// automatically import all files ending in *.stories.ts -configure(require.context('../src/stories', true, /\.stories\.ts$/), module); diff --git a/lib/cli/generators/ANGULAR/template-csf/.storybook/main.js b/lib/cli/generators/ANGULAR/template-csf/.storybook/main.js new file mode 100644 index 00000000000..fd9bed78b54 --- /dev/null +++ b/lib/cli/generators/ANGULAR/template-csf/.storybook/main.js @@ -0,0 +1,8 @@ +module.exports = { + stories: ['../src/stories/**/*.stories.ts'], + addons: [ + '@storybook/addon-actions/register', + '@storybook/addon-links/register', + '@storybook/addon-notes/register', + ], +}; diff --git a/lib/cli/generators/ANGULAR/template-mdx/.storybook/addons.js b/lib/cli/generators/ANGULAR/template-mdx/.storybook/addons.js deleted file mode 100644 index 47eabe0ce40..00000000000 --- a/lib/cli/generators/ANGULAR/template-mdx/.storybook/addons.js +++ /dev/null @@ -1,3 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; -import '@storybook/addon-notes/register'; diff --git a/lib/cli/generators/ANGULAR/template-mdx/.storybook/config.js b/lib/cli/generators/ANGULAR/template-mdx/.storybook/config.js deleted file mode 100644 index f1689d243bd..00000000000 --- a/lib/cli/generators/ANGULAR/template-mdx/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/angular'; - -// automatically import all files ending in *.stories.ts -configure(require.context('../src/stories', true, /\.stories\.(ts|mdx)$/), module); diff --git a/lib/cli/generators/ANGULAR/template-mdx/.storybook/main.js b/lib/cli/generators/ANGULAR/template-mdx/.storybook/main.js new file mode 100644 index 00000000000..6df0a6fe46b --- /dev/null +++ b/lib/cli/generators/ANGULAR/template-mdx/.storybook/main.js @@ -0,0 +1,9 @@ +module.exports = { + stories: ['../src/stories/**/*.stories.(ts|mdx)'], + addons: [ + '@storybook/addon-actions/register', + '@storybook/addon-links/register', + '@storybook/addon-notes/register', + ], + presets: ['@storybook/addon-docs/preset'], +}; diff --git a/lib/cli/generators/EMBER/template-csf/.storybook/addons.js b/lib/cli/generators/EMBER/template-csf/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/EMBER/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/EMBER/template-csf/.storybook/config.js b/lib/cli/generators/EMBER/template-csf/.storybook/config.js deleted file mode 100644 index e2271088fc6..00000000000 --- a/lib/cli/generators/EMBER/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/ember'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/EMBER/template-csf/.storybook/main.js b/lib/cli/generators/EMBER/template-csf/.storybook/main.js new file mode 100644 index 00000000000..448921317f4 --- /dev/null +++ b/lib/cli/generators/EMBER/template-csf/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], +}; diff --git a/lib/cli/generators/HTML/template-csf/.storybook/config.js b/lib/cli/generators/HTML/template-csf/.storybook/config.js deleted file mode 100644 index 055d4e30181..00000000000 --- a/lib/cli/generators/HTML/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/html'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/HTML/template-csf/.storybook/main.js b/lib/cli/generators/HTML/template-csf/.storybook/main.js new file mode 100644 index 00000000000..77857c48de3 --- /dev/null +++ b/lib/cli/generators/HTML/template-csf/.storybook/main.js @@ -0,0 +1,3 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], +}; diff --git a/lib/cli/generators/HTML/template-mdx/.storybook/config.js b/lib/cli/generators/HTML/template-mdx/.storybook/config.js deleted file mode 100644 index 0c2a58cfec2..00000000000 --- a/lib/cli/generators/HTML/template-mdx/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/html'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.(js|mdx)$/), module); diff --git a/lib/cli/generators/HTML/template-mdx/.storybook/main.js b/lib/cli/generators/HTML/template-mdx/.storybook/main.js new file mode 100644 index 00000000000..5e26231adcc --- /dev/null +++ b/lib/cli/generators/HTML/template-mdx/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../stories/**/*.stories.(js|mdx)'], + presets: ['@storybook/addon-docs/preset'], +}; diff --git a/lib/cli/generators/HTML/template-mdx/.storybook/presets.js b/lib/cli/generators/HTML/template-mdx/.storybook/presets.js deleted file mode 100644 index a04174c7a33..00000000000 --- a/lib/cli/generators/HTML/template-mdx/.storybook/presets.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = ['@storybook/addon-docs/preset']; diff --git a/lib/cli/generators/MARKO/template-csf/.storybook/addons.js b/lib/cli/generators/MARKO/template-csf/.storybook/addons.js deleted file mode 100644 index 218bf7a5e66..00000000000 --- a/lib/cli/generators/MARKO/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-knobs/register'; diff --git a/lib/cli/generators/MARKO/template-csf/.storybook/config.js b/lib/cli/generators/MARKO/template-csf/.storybook/config.js deleted file mode 100644 index cc728acf6bc..00000000000 --- a/lib/cli/generators/MARKO/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/marko'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/MARKO/template-csf/.storybook/main.js b/lib/cli/generators/MARKO/template-csf/.storybook/main.js new file mode 100644 index 00000000000..d8c8832bf86 --- /dev/null +++ b/lib/cli/generators/MARKO/template-csf/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-knobs/register'], +}; diff --git a/lib/cli/generators/METEOR/template-csf/.storybook/addons.js b/lib/cli/generators/METEOR/template-csf/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/METEOR/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/METEOR/template-csf/.storybook/config.js b/lib/cli/generators/METEOR/template-csf/.storybook/config.js deleted file mode 100644 index 0603ed51131..00000000000 --- a/lib/cli/generators/METEOR/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/react'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/METEOR/template-csf/.storybook/main.js b/lib/cli/generators/METEOR/template-csf/.storybook/main.js new file mode 100644 index 00000000000..d8c8832bf86 --- /dev/null +++ b/lib/cli/generators/METEOR/template-csf/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-knobs/register'], +}; diff --git a/lib/cli/generators/MITHRIL/template-csf/.storybook/addons.js b/lib/cli/generators/MITHRIL/template-csf/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/MITHRIL/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/MITHRIL/template-csf/.storybook/config.js b/lib/cli/generators/MITHRIL/template-csf/.storybook/config.js deleted file mode 100644 index a56f1e3c442..00000000000 --- a/lib/cli/generators/MITHRIL/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/mithril'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/MITHRIL/template-csf/.storybook/main.js b/lib/cli/generators/MITHRIL/template-csf/.storybook/main.js new file mode 100644 index 00000000000..d8c8832bf86 --- /dev/null +++ b/lib/cli/generators/MITHRIL/template-csf/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-knobs/register'], +}; diff --git a/lib/cli/generators/MITHRIL/template-csf/stories/Button.js b/lib/cli/generators/MITHRIL/template-csf/stories/Button.js index edec915a04b..08d3f45a617 100644 --- a/lib/cli/generators/MITHRIL/template-csf/stories/Button.js +++ b/lib/cli/generators/MITHRIL/template-csf/stories/Button.js @@ -4,12 +4,12 @@ import m from 'mithril'; const style = { border: '1px solid #eee', - borderRadius: '3px', + borderRadius: 3, backgroundColor: '#FFFFFF', cursor: 'pointer', - fontSize: '15px', + fontSize: 15, padding: '3px 10px', - margin: '10px', + margin: 10, }; const Button = { diff --git a/lib/cli/generators/MITHRIL/template-csf/stories/Welcome.js b/lib/cli/generators/MITHRIL/template-csf/stories/Welcome.js index d7dd3eca7ff..2c0f425a5f8 100644 --- a/lib/cli/generators/MITHRIL/template-csf/stories/Welcome.js +++ b/lib/cli/generators/MITHRIL/template-csf/stories/Welcome.js @@ -7,7 +7,7 @@ const Main = { view: vnode => (
( @@ -112,7 +112,7 @@ const StoryLink = { color: '#1474f3', textDecoration: 'none', borderBottom: '1px solid #1474f3', - paddingBottom: '2px', + paddingBottom: 2, }} onClick={vnode.state.onclick} > diff --git a/lib/cli/generators/POLYMER/template-csf/.storybook/config.js b/lib/cli/generators/POLYMER/template-csf/.storybook/config.js deleted file mode 100644 index 89ffce5d2c3..00000000000 --- a/lib/cli/generators/POLYMER/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/polymer'; - -// automatically import all files ending in *.stories.js -configure(require.context('../src/stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/POLYMER/template-csf/.storybook/main.js b/lib/cli/generators/POLYMER/template-csf/.storybook/main.js new file mode 100644 index 00000000000..c0c5891e74c --- /dev/null +++ b/lib/cli/generators/POLYMER/template-csf/.storybook/main.js @@ -0,0 +1,3 @@ +module.exports = { + stories: ['../src/stories/**/*.stories.js'], +}; diff --git a/lib/cli/generators/PREACT/template-csf/.storybook/addons.js b/lib/cli/generators/PREACT/template-csf/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/PREACT/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/PREACT/template-csf/.storybook/config.js b/lib/cli/generators/PREACT/template-csf/.storybook/config.js deleted file mode 100644 index 564558bd8d7..00000000000 --- a/lib/cli/generators/PREACT/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/preact'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/PREACT/template-csf/.storybook/main.js b/lib/cli/generators/PREACT/template-csf/.storybook/main.js new file mode 100644 index 00000000000..448921317f4 --- /dev/null +++ b/lib/cli/generators/PREACT/template-csf/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], +}; diff --git a/lib/cli/generators/RAX/template-csf/.storybook/manager.js b/lib/cli/generators/RAX/template-csf/.storybook/manager.js deleted file mode 100644 index 3cf5981c4be..00000000000 --- a/lib/cli/generators/RAX/template-csf/.storybook/manager.js +++ /dev/null @@ -1,14 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; - -import { create } from '@storybook/theming/create'; -import { addons } from '@storybook/addons'; - -const theme = create({ - base: 'light', - - brandTitle: 'Rax Kitchen Sink', - brandUrl: 'https://github.com/storybookjs/storybook/tree/master/examples/rax-kitchen-sink', -}); - -addons.setConfig({ theme }); diff --git a/lib/cli/generators/REACT/template-csf/.storybook/addons.js b/lib/cli/generators/REACT/template-csf/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/REACT/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/REACT/template-csf/.storybook/config.js b/lib/cli/generators/REACT/template-csf/.storybook/config.js deleted file mode 100644 index 0603ed51131..00000000000 --- a/lib/cli/generators/REACT/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/react'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/REACT/template-csf/.storybook/main.js b/lib/cli/generators/REACT/template-csf/.storybook/main.js new file mode 100644 index 00000000000..448921317f4 --- /dev/null +++ b/lib/cli/generators/REACT/template-csf/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], +}; diff --git a/lib/cli/generators/REACT/template-mdx/.storybook/addons.js b/lib/cli/generators/REACT/template-mdx/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/REACT/template-mdx/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/REACT/template-mdx/.storybook/config.js b/lib/cli/generators/REACT/template-mdx/.storybook/config.js deleted file mode 100644 index e178df98fe4..00000000000 --- a/lib/cli/generators/REACT/template-mdx/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/react'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.(js|mdx)$/), module); diff --git a/lib/cli/generators/REACT/template-mdx/.storybook/main.js b/lib/cli/generators/REACT/template-mdx/.storybook/main.js new file mode 100644 index 00000000000..a54a6695456 --- /dev/null +++ b/lib/cli/generators/REACT/template-mdx/.storybook/main.js @@ -0,0 +1,10 @@ +module.exports = { + stories: ['../stories/**/*.stories.(js|mdx)'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], + presets: [ + { + name: '@storybook/addon-docs/preset', + options: { configureJSX: true }, + }, + ], +}; diff --git a/lib/cli/generators/REACT/template-mdx/.storybook/presets.js b/lib/cli/generators/REACT/template-mdx/.storybook/presets.js deleted file mode 100644 index 8c1b9d4e5ba..00000000000 --- a/lib/cli/generators/REACT/template-mdx/.storybook/presets.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = [ - { - name: '@storybook/addon-docs/preset', - options: { configureJSX: true }, - }, -]; diff --git a/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/addons.ts b/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/addons.ts deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/addons.ts +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/config.ts b/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/config.ts deleted file mode 100644 index 0a0a64e2816..00000000000 --- a/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/config.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/react'; - -// automatically import all files ending in *.stories.(tsx|jsx) -configure(require.context('../src/stories', true, /\.stories\.[tj]sx?$/), module); diff --git a/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/main.js b/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/main.js new file mode 100644 index 00000000000..e7ecf26a2e1 --- /dev/null +++ b/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/main.js @@ -0,0 +1,5 @@ +module.exports = { + stories: ['../src/stories/**/*.stories.(ts|tsx|js|jsx)'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], + presets: ['@storybook/preset-create-react-app'], +}; diff --git a/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/presets.js b/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/presets.js deleted file mode 100644 index ccbce829866..00000000000 --- a/lib/cli/generators/REACT_SCRIPTS/template-csf-ts/.storybook/presets.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = ['@storybook/preset-create-react-app']; diff --git a/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/addons.js b/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/config.js b/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/config.js deleted file mode 100644 index 342071747f2..00000000000 --- a/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/react'; - -// automatically import all files ending in *.stories.js -configure(require.context('../src/stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/main.js b/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/main.js new file mode 100644 index 00000000000..42e0f55b0b7 --- /dev/null +++ b/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/main.js @@ -0,0 +1,5 @@ +module.exports = { + stories: ['../src/stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], + presets: ['@storybook/preset-create-react-app'], +}; diff --git a/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/presets.js b/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/presets.js deleted file mode 100644 index ccbce829866..00000000000 --- a/lib/cli/generators/REACT_SCRIPTS/template-csf/.storybook/presets.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = ['@storybook/preset-create-react-app']; diff --git a/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/addons.js b/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/config.js b/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/config.js deleted file mode 100644 index f3a1df13159..00000000000 --- a/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/react'; - -// automatically import all files ending in *.stories.js -configure(require.context('../src/stories', true, /\.stories\.(js|mdx)$/), module); diff --git a/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/main.js b/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/main.js new file mode 100644 index 00000000000..edbb63e2de4 --- /dev/null +++ b/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/main.js @@ -0,0 +1,13 @@ +module.exports = { + stories: ['../src/stories/**/*.stories.(js|mdx)'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], + presets: [ + '@storybook/preset-create-react-app', + { + name: '@storybook/addon-docs/preset', + options: { + configureJSX: true, + }, + }, + ], +}; diff --git a/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/presets.js b/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/presets.js deleted file mode 100644 index b92aeeb8fca..00000000000 --- a/lib/cli/generators/REACT_SCRIPTS/template-mdx/.storybook/presets.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = [ - '@storybook/preset-create-react-app', - { - name: '@storybook/addon-docs/preset', - options: { - configureJSX: true, - }, - }, -]; diff --git a/lib/cli/generators/RIOT/template-csf/.storybook/addons.js b/lib/cli/generators/RIOT/template-csf/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/RIOT/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/RIOT/template-csf/.storybook/config.js b/lib/cli/generators/RIOT/template-csf/.storybook/config.js deleted file mode 100644 index 99e7d848f2f..00000000000 --- a/lib/cli/generators/RIOT/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/riot'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/RIOT/template-csf/.storybook/main.js b/lib/cli/generators/RIOT/template-csf/.storybook/main.js new file mode 100644 index 00000000000..448921317f4 --- /dev/null +++ b/lib/cli/generators/RIOT/template-csf/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], +}; diff --git a/lib/cli/generators/SFC_VUE/template-csf/.storybook/addons.js b/lib/cli/generators/SFC_VUE/template-csf/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/SFC_VUE/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/SFC_VUE/template-csf/.storybook/config.js b/lib/cli/generators/SFC_VUE/template-csf/.storybook/config.js deleted file mode 100644 index 145eb83c09a..00000000000 --- a/lib/cli/generators/SFC_VUE/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/vue'; - -// automatically import all files ending in *.stories.js -configure(require.context('../src/stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/SFC_VUE/template-csf/.storybook/main.js b/lib/cli/generators/SFC_VUE/template-csf/.storybook/main.js new file mode 100644 index 00000000000..6c7d25e7583 --- /dev/null +++ b/lib/cli/generators/SFC_VUE/template-csf/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../src/stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], +}; diff --git a/lib/cli/generators/SFC_VUE/template-mdx/.storybook/addons.js b/lib/cli/generators/SFC_VUE/template-mdx/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/SFC_VUE/template-mdx/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/SFC_VUE/template-mdx/.storybook/config.js b/lib/cli/generators/SFC_VUE/template-mdx/.storybook/config.js deleted file mode 100644 index 08a361c9a9b..00000000000 --- a/lib/cli/generators/SFC_VUE/template-mdx/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/vue'; - -// automatically import all files ending in *.stories.js -configure(require.context('../src/stories', true, /\.stories\.(js|mdx)$/), module); diff --git a/lib/cli/generators/SFC_VUE/template-mdx/.storybook/main.js b/lib/cli/generators/SFC_VUE/template-mdx/.storybook/main.js new file mode 100644 index 00000000000..2f8d2982005 --- /dev/null +++ b/lib/cli/generators/SFC_VUE/template-mdx/.storybook/main.js @@ -0,0 +1,5 @@ +module.exports = { + stories: ['../src/stories/**/*.stories.(js|mdx)'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], + presets: ['@storybook/addon-docs/preset'], +}; diff --git a/lib/cli/generators/SFC_VUE/template-mdx/.storybook/presets.js b/lib/cli/generators/SFC_VUE/template-mdx/.storybook/presets.js deleted file mode 100644 index a04174c7a33..00000000000 --- a/lib/cli/generators/SFC_VUE/template-mdx/.storybook/presets.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = ['@storybook/addon-docs/preset']; diff --git a/lib/cli/generators/SVELTE/template-csf/.storybook/addons.js b/lib/cli/generators/SVELTE/template-csf/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/SVELTE/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/SVELTE/template-csf/.storybook/config.js b/lib/cli/generators/SVELTE/template-csf/.storybook/config.js deleted file mode 100644 index 1fdc85eecd1..00000000000 --- a/lib/cli/generators/SVELTE/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/svelte'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/SVELTE/template-csf/.storybook/main.js b/lib/cli/generators/SVELTE/template-csf/.storybook/main.js new file mode 100644 index 00000000000..448921317f4 --- /dev/null +++ b/lib/cli/generators/SVELTE/template-csf/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], +}; diff --git a/lib/cli/generators/VUE/template-csf/.storybook/addons.js b/lib/cli/generators/VUE/template-csf/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/VUE/template-csf/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/VUE/template-csf/.storybook/config.js b/lib/cli/generators/VUE/template-csf/.storybook/config.js deleted file mode 100644 index 1516685de79..00000000000 --- a/lib/cli/generators/VUE/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/vue'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/VUE/template-csf/.storybook/main.js b/lib/cli/generators/VUE/template-csf/.storybook/main.js new file mode 100644 index 00000000000..448921317f4 --- /dev/null +++ b/lib/cli/generators/VUE/template-csf/.storybook/main.js @@ -0,0 +1,4 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], +}; diff --git a/lib/cli/generators/VUE/template-mdx/.storybook/addons.js b/lib/cli/generators/VUE/template-mdx/.storybook/addons.js deleted file mode 100644 index 6aed412d04a..00000000000 --- a/lib/cli/generators/VUE/template-mdx/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-actions/register'; -import '@storybook/addon-links/register'; diff --git a/lib/cli/generators/VUE/template-mdx/.storybook/config.js b/lib/cli/generators/VUE/template-mdx/.storybook/config.js deleted file mode 100644 index f770a9332fd..00000000000 --- a/lib/cli/generators/VUE/template-mdx/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/vue'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.(js|mdx)$/), module); diff --git a/lib/cli/generators/VUE/template-mdx/.storybook/main.js b/lib/cli/generators/VUE/template-mdx/.storybook/main.js new file mode 100644 index 00000000000..78bc24049ae --- /dev/null +++ b/lib/cli/generators/VUE/template-mdx/.storybook/main.js @@ -0,0 +1,5 @@ +module.exports = { + stories: ['../stories/**/*.stories.(js|mdx)'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], + presets: ['@storybook/addon-docs/preset'], +}; diff --git a/lib/cli/generators/VUE/template-mdx/.storybook/presets.js b/lib/cli/generators/VUE/template-mdx/.storybook/presets.js deleted file mode 100644 index a04174c7a33..00000000000 --- a/lib/cli/generators/VUE/template-mdx/.storybook/presets.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = ['@storybook/addon-docs/preset']; diff --git a/lib/cli/generators/WEB-COMPONENTS/index.js b/lib/cli/generators/WEB-COMPONENTS/index.js index 52094627135..fbcd51d8176 100755 --- a/lib/cli/generators/WEB-COMPONENTS/index.js +++ b/lib/cli/generators/WEB-COMPONENTS/index.js @@ -8,10 +8,14 @@ import { installDependencies, } from '../../lib/helpers'; -export default async npmOptions => { +export default async (npmOptions, { storyFormat = 'csf' }) => { const storybookVersion = await getVersion(npmOptions, '@storybook/web-components'); fse.copySync(path.resolve(__dirname, 'template/'), '.', { overwrite: true }); + if (storyFormat === 'mdx') { + // TODO: handle adding of docs mode + } + const packageJson = await retrievePackageJson(); packageJson.dependencies = packageJson.dependencies || {}; diff --git a/lib/cli/generators/WEB-COMPONENTS/template/.storybook/config.js b/lib/cli/generators/WEB-COMPONENTS/template/.storybook/config.js deleted file mode 100644 index 055d4e30181..00000000000 --- a/lib/cli/generators/WEB-COMPONENTS/template/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/html'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/WEB-COMPONENTS/template/.storybook/main.js b/lib/cli/generators/WEB-COMPONENTS/template/.storybook/main.js new file mode 100644 index 00000000000..77857c48de3 --- /dev/null +++ b/lib/cli/generators/WEB-COMPONENTS/template/.storybook/main.js @@ -0,0 +1,3 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], +}; diff --git a/lib/cli/generators/WEB-COMPONENTS/template/.storybook/preview.js b/lib/cli/generators/WEB-COMPONENTS/template/.storybook/preview.js new file mode 100644 index 00000000000..08bb9bc215d --- /dev/null +++ b/lib/cli/generators/WEB-COMPONENTS/template/.storybook/preview.js @@ -0,0 +1,30 @@ +/* global window */ + +import { + configure, + addParameters, + // setCustomElements, +} from '@storybook/web-components'; + +// import customElements from '../custom-elements.json'; + +// setCustomElements(customElements); + +addParameters({ + docs: { + iframeHeight: '200px', + }, +}); + +// configure(require.context('../stories', true, /\.stories\.(js|mdx)$/), module); + +// force full reload to not reregister web components +const req = require.context('../stories', true, /\.stories\.(js|mdx)$/); +configure(req, module); +if (module.hot) { + module.hot.accept(req.id, () => { + const currentLocationHref = window.location.href; + window.history.pushState(null, null, currentLocationHref); + window.location.reload(); + }); +} diff --git a/lib/cli/generators/WEBPACK_REACT/template-csf/.storybook/config.js b/lib/cli/generators/WEBPACK_REACT/template-csf/.storybook/config.js deleted file mode 100644 index 0603ed51131..00000000000 --- a/lib/cli/generators/WEBPACK_REACT/template-csf/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/react'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.js$/), module); diff --git a/lib/cli/generators/WEBPACK_REACT/template-csf/.storybook/main.js b/lib/cli/generators/WEBPACK_REACT/template-csf/.storybook/main.js new file mode 100644 index 00000000000..437d40a17c9 --- /dev/null +++ b/lib/cli/generators/WEBPACK_REACT/template-csf/.storybook/main.js @@ -0,0 +1,9 @@ +module.exports = { + stories: ['../stories/**/*.stories.js'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], + webpack: async config => { + // do mutation to the config + + return config; + }, +}; diff --git a/lib/cli/generators/WEBPACK_REACT/template-csf/.storybook/webpack.config.js b/lib/cli/generators/WEBPACK_REACT/template-csf/.storybook/webpack.config.js deleted file mode 100644 index e010e2f2b81..00000000000 --- a/lib/cli/generators/WEBPACK_REACT/template-csf/.storybook/webpack.config.js +++ /dev/null @@ -1,18 +0,0 @@ -// you can use this file to add your custom webpack plugins, loaders and anything you like. -// This is just the basic way to add additional webpack configurations. -// For more information refer the docs: https://storybook.js.org/configurations/custom-webpack-config - -// IMPORTANT -// When you add this file, we won't add the default configurations which is similar -// to "React Create App". This only has babel loader to load JavaScript. - -module.exports = { - plugins: [ - // your custom plugins - ], - module: { - rules: [ - // add your custom rules. - ], - }, -}; diff --git a/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/config.js b/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/config.js deleted file mode 100644 index e178df98fe4..00000000000 --- a/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { configure } from '@storybook/react'; - -// automatically import all files ending in *.stories.js -configure(require.context('../stories', true, /\.stories\.(js|mdx)$/), module); diff --git a/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/main.js b/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/main.js new file mode 100644 index 00000000000..936fe48e798 --- /dev/null +++ b/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/main.js @@ -0,0 +1,15 @@ +module.exports = { + stories: ['../stories/**/*.stories.(js|mdx)'], + addons: ['@storybook/addon-actions/register', '@storybook/addon-links/register'], + presets: [ + { + name: '@storybook/addon-docs/preset', + options: { configureJSX: true }, + }, + ], + webpack: async config => { + // do mutation to the config + + return config; + }, +}; diff --git a/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/presets.js b/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/presets.js deleted file mode 100644 index 8c1b9d4e5ba..00000000000 --- a/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/presets.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = [ - { - name: '@storybook/addon-docs/preset', - options: { configureJSX: true }, - }, -]; diff --git a/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/webpack.config.js b/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/webpack.config.js deleted file mode 100644 index e010e2f2b81..00000000000 --- a/lib/cli/generators/WEBPACK_REACT/template-mdx/.storybook/webpack.config.js +++ /dev/null @@ -1,18 +0,0 @@ -// you can use this file to add your custom webpack plugins, loaders and anything you like. -// This is just the basic way to add additional webpack configurations. -// For more information refer the docs: https://storybook.js.org/configurations/custom-webpack-config - -// IMPORTANT -// When you add this file, we won't add the default configurations which is similar -// to "React Create App". This only has babel loader to load JavaScript. - -module.exports = { - plugins: [ - // your custom plugins - ], - module: { - rules: [ - // add your custom rules. - ], - }, -}; diff --git a/lib/cli/lib/detect.js b/lib/cli/lib/detect.js index 0e2237404ae..bb8c5ad9535 100644 --- a/lib/cli/lib/detect.js +++ b/lib/cli/lib/detect.js @@ -83,6 +83,13 @@ function detectFramework(dependencies) { return types.POLYMER; } + if ( + (dependencies.dependencies && dependencies.dependencies['lit-element']) || + (dependencies.devDependencies && dependencies.devDependencies['lit-element']) + ) { + return types.WEB_COMPONENTS; + } + if ( (dependencies.dependencies && dependencies.dependencies.mithril) || (dependencies.devDependencies && dependencies.devDependencies.mithril) diff --git a/lib/cli/lib/has_yarn.js b/lib/cli/lib/has_yarn.js index 7aff347ae37..ce7bdd251d9 100644 --- a/lib/cli/lib/has_yarn.js +++ b/lib/cli/lib/has_yarn.js @@ -1,12 +1,15 @@ import { sync as spawnSync } from 'cross-spawn'; import path from 'path'; -import fs from 'fs'; +import findUp from 'find-up'; export default function hasYarn() { const yarnAvailable = spawnSync('yarn', ['--version'], { silent: true }); const npmAvailable = spawnSync('npm', ['--version'], { silent: true }); - const yarnLockPath = path.resolve('yarn.lock'); - if ((fs.existsSync(yarnLockPath) || npmAvailable.status !== 0) && yarnAvailable.status === 0) { + + const lockFile = findUp.sync(['yarn.lock', 'package-lock.json']); + const hasYarnLock = lockFile && path.basename(lockFile) === 'yarn.lock'; + + if (yarnAvailable.status === 0 && (hasYarnLock || npmAvailable.status !== 0)) { return true; } return false; diff --git a/lib/cli/lib/initiate.js b/lib/cli/lib/initiate.js index 87eb2ce2889..a2ba31d55e8 100644 --- a/lib/cli/lib/initiate.js +++ b/lib/cli/lib/initiate.js @@ -25,6 +25,7 @@ import webpackReactGenerator from '../generators/WEBPACK_REACT'; import mithrilGenerator from '../generators/MITHRIL'; import markoGenerator from '../generators/MARKO'; import htmlGenerator from '../generators/HTML'; +import webComponentsGenerator from '../generators/WEB-COMPONENTS'; import riotGenerator from '../generators/RIOT'; import preactGenerator from '../generators/PREACT'; import svelteGenerator from '../generators/SVELTE'; @@ -172,6 +173,11 @@ const installStorybook = (projectType, options) => { .then(commandLog('Adding storybook support to your "HTML" app')) .then(end); + case types.WEB_COMPONENTS: + return webComponentsGenerator(npmOptions, generatorOptions) + .then(commandLog('Adding storybook support to your "web components" app')) + .then(end); + case types.RIOT: return riotGenerator(npmOptions, generatorOptions) .then(commandLog('Adding storybook support to your "riot.js" app')) diff --git a/lib/cli/lib/project_types.js b/lib/cli/lib/project_types.js index b605f349f9f..639e2620f6b 100644 --- a/lib/cli/lib/project_types.js +++ b/lib/cli/lib/project_types.js @@ -13,6 +13,7 @@ const projectTypes = { ALREADY_HAS_STORYBOOK: 'ALREADY_HAS_STORYBOOK', UPDATE_PACKAGE_ORGANIZATIONS: 'UPDATE_PACKAGE_ORGANIZATIONS', POLYMER: 'POLYMER', + WEB_COMPONENTS: 'WEB_COMPONENTS', MITHRIL: 'MITHRIL', MARKO: 'MARKO', HTML: 'HTML', diff --git a/lib/cli/package.json b/lib/cli/package.json index 8780c45cf49..2959c0797a4 100644 --- a/lib/cli/package.json +++ b/lib/cli/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/cli", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Storybook's CLI - easiest method of adding storybook to your projects", "keywords": [ "cli", @@ -38,7 +38,7 @@ "dependencies": { "@babel/core": "^7.4.5", "@babel/preset-env": "^7.4.5", - "@storybook/codemod": "5.3.0-beta.16", + "@storybook/codemod": "5.3.0-rc.0", "chalk": "^3.0.0", "commander": "^4.0.1", "core-js": "^3.0.1", @@ -46,6 +46,7 @@ "didyoumean": "^1.2.1", "envinfo": "^7.5.0", "esm": "3.2.25", + "find-up": "^4.1.0", "fs-extra": "^8.0.1", "inquirer": "^7.0.0", "jscodeshift": "^0.6.3", @@ -57,35 +58,37 @@ "update-notifier": "^3.0.0" }, "devDependencies": { - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-centered": "5.3.0-beta.16", - "@storybook/addon-graphql": "5.3.0-beta.16", - "@storybook/addon-info": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", - "@storybook/addon-links": "5.3.0-beta.16", - "@storybook/addon-notes": "5.3.0-beta.16", - "@storybook/addon-options": "5.3.0-beta.16", - "@storybook/addon-storyshots": "5.3.0-beta.16", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/angular": "5.3.0-beta.16", - "@storybook/channel-postmessage": "5.3.0-beta.16", - "@storybook/channel-websocket": "5.3.0-beta.16", - "@storybook/channels": "5.3.0-beta.16", - "@storybook/ember": "5.3.0-beta.16", - "@storybook/html": "5.3.0-beta.16", - "@storybook/marko": "5.3.0-beta.16", - "@storybook/mithril": "5.3.0-beta.16", - "@storybook/polymer": "5.3.0-beta.16", - "@storybook/preact": "5.3.0-beta.16", - "@storybook/rax": "5.3.0-beta.16", - "@storybook/react": "5.3.0-beta.16", - "@storybook/react-native": "5.3.0-beta.16", - "@storybook/riot": "5.3.0-beta.16", - "@storybook/svelte": "5.3.0-beta.16", - "@storybook/ui": "5.3.0-beta.16", - "@storybook/vue": "5.3.0-beta.16" + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-centered": "5.3.0-rc.0", + "@storybook/addon-graphql": "5.3.0-rc.0", + "@storybook/addon-info": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", + "@storybook/addon-links": "5.3.0-rc.0", + "@storybook/addon-notes": "5.3.0-rc.0", + "@storybook/addon-options": "5.3.0-rc.0", + "@storybook/addon-storyshots": "5.3.0-rc.0", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/angular": "5.3.0-rc.0", + "@storybook/channel-postmessage": "5.3.0-rc.0", + "@storybook/channel-websocket": "5.3.0-rc.0", + "@storybook/channels": "5.3.0-rc.0", + "@storybook/ember": "5.3.0-rc.0", + "@storybook/html": "5.3.0-rc.0", + "@storybook/marko": "5.3.0-rc.0", + "@storybook/mithril": "5.3.0-rc.0", + "@storybook/polymer": "5.3.0-rc.0", + "@storybook/preact": "5.3.0-rc.0", + "@storybook/rax": "5.3.0-rc.0", + "@storybook/react": "5.3.0-rc.0", + "@storybook/react-native": "5.3.0-rc.0", + "@storybook/riot": "5.3.0-rc.0", + "@storybook/svelte": "5.3.0-rc.0", + "@storybook/ui": "5.3.0-rc.0", + "@storybook/vue": "5.3.0-rc.0", + "@storybook/web-components": "5.3.0-rc.0" }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/client-api/package.json b/lib/client-api/package.json index fb74550243d..43a5dfc513f 100644 --- a/lib/client-api/package.json +++ b/lib/client-api/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/client-api", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Storybook Client API", "keywords": [ "storybook" @@ -27,12 +27,12 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.16", - "@storybook/channel-postmessage": "5.3.0-beta.16", - "@storybook/channels": "5.3.0-beta.16", - "@storybook/client-logger": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/router": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/channel-postmessage": "5.3.0-rc.0", + "@storybook/channels": "5.3.0-rc.0", + "@storybook/client-logger": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/csf": "0.0.1", "core-js": "^3.0.1", "eventemitter3": "^4.0.0", "global": "^4.3.2", @@ -46,5 +46,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/client-api/src/client_api.ts b/lib/client-api/src/client_api.ts index 67ca6dc77f0..af2c9db0844 100644 --- a/lib/client-api/src/client_api.ts +++ b/lib/client-api/src/client_api.ts @@ -4,7 +4,7 @@ import isPlainObject from 'is-plain-object'; import { logger } from '@storybook/client-logger'; import addons, { StoryContext, StoryFn, Parameters } from '@storybook/addons'; import Events from '@storybook/core-events'; -import { toId } from '@storybook/router/utils'; +import { toId } from '@storybook/csf'; import mergeWith from 'lodash/mergeWith'; import isEqual from 'lodash/isEqual'; diff --git a/lib/client-api/src/hooks.ts b/lib/client-api/src/hooks.ts index 3017db5d2af..05d6776031a 100644 --- a/lib/client-api/src/hooks.ts +++ b/lib/client-api/src/hooks.ts @@ -1,4 +1,7 @@ +import { ADDON_STATE_CHANGED, ADDON_STATE_SET } from '@storybook/core-events'; + import { + addons, HooksContext, applyHooks, useMemo, @@ -25,3 +28,39 @@ export { useStoryContext, useParameter, }; + +export function useAddonState(addonId: string, defaultState?: S): [S, (s: S) => void] { + const channel = addons.getChannel(); + + const [lastValue] = + channel.last(`${ADDON_STATE_CHANGED}-manager-${addonId}`) || + channel.last(`${ADDON_STATE_SET}-manager-${addonId}`) || + []; + + const [state, setState] = useState(lastValue || defaultState); + + const allListeners = useMemo( + () => ({ + [`${ADDON_STATE_CHANGED}-manager-${addonId}`]: (s: S) => setState(s), + [`${ADDON_STATE_SET}-manager-${addonId}`]: (s: S) => setState(s), + }), + [addonId] + ); + + const emit = useChannel(allListeners, [addonId]); + + useEffect(() => { + // init + if (defaultState !== undefined && !lastValue) { + emit(`${ADDON_STATE_SET}-client-${addonId}`, defaultState); + } + }, [addonId]); + + return [ + state, + s => { + setState(s); + emit(`${ADDON_STATE_CHANGED}-client-${addonId}`, s); + }, + ]; +} diff --git a/lib/client-api/src/story_store.test.ts b/lib/client-api/src/story_store.test.ts index 96baf327023..20c61f2893f 100644 --- a/lib/client-api/src/story_store.test.ts +++ b/lib/client-api/src/story_store.test.ts @@ -1,6 +1,7 @@ import createChannel from '@storybook/channel-postmessage'; -import { toId } from '@storybook/router/utils'; +import { toId } from '@storybook/csf'; import addons from '@storybook/addons'; +import Events from '@storybook/core-events'; import StoryStore from './story_store'; import { defaultDecorateStory } from './client_api'; @@ -39,7 +40,7 @@ describe('preview.story_store', () => { const extracted = store.extract(); - // We need exact key ordering, even if in theory JS doesns't guarantee it + // We need exact key ordering, even if in theory JS doesn't guarantee it expect(Object.keys(extracted)).toEqual(['a--1', 'a--2', 'b--1']); // content of item should be correct @@ -52,6 +53,80 @@ describe('preview.story_store', () => { }); }); + describe('storySort', () => { + it('sorts stories using given function', () => { + const parameters = { + options: { + // Test function does alphabetical ordering. + storySort: (a: any, b: any): number => + a[1].kind === b[1].kind + ? 0 + : a[1].id.localeCompare(b[1].id, undefined, { numeric: true }), + }, + }; + const store = new StoryStore({ channel }); + store.addStory(...make('a/a', '1', () => 0, parameters)); + store.addStory(...make('a/a', '2', () => 0, parameters)); + store.addStory(...make('a/b', '1', () => 0, parameters)); + store.addStory(...make('b/b1', '1', () => 0, parameters)); + store.addStory(...make('b/b10', '1', () => 0, parameters)); + store.addStory(...make('b/b9', '1', () => 0, parameters)); + store.addStory(...make('c', '1', () => 0, parameters)); + + const extracted = store.extract(); + + expect(Object.keys(extracted)).toEqual([ + 'a-a--1', + 'a-a--2', + 'a-b--1', + 'b-b1--1', + 'b-b9--1', + 'b-b10--1', + 'c--1', + ]); + }); + }); + + describe('emitting behaviour', () => { + it('is syncronously emits STORY_RENDER if the channel is defined', async () => { + const onChannelRender = jest.fn(); + const testChannel = createChannel({ page: 'preview' }); + testChannel.on(Events.STORY_RENDER, onChannelRender); + + const onStoreRender = jest.fn(); + const store = new StoryStore({ channel: testChannel }); + store.on(Events.STORY_RENDER, onStoreRender); + + store.setSelection({ storyId: 'storyId', viewMode: 'viewMode' }, undefined); + expect(onChannelRender).toHaveBeenCalled(); + expect(onStoreRender).not.toHaveBeenCalled(); + + onChannelRender.mockClear(); + await new Promise(r => setTimeout(r, 10)); + expect(onChannelRender).not.toHaveBeenCalled(); + expect(onStoreRender).toHaveBeenCalled(); + }); + + it('is asychronously emits STORY_RENDER if the channel is not yet defined', async () => { + const onChannelRender = jest.fn(); + const testChannel = createChannel({ page: 'preview' }); + testChannel.on(Events.STORY_RENDER, onChannelRender); + + const onStoreRender = jest.fn(); + const store = new StoryStore({ channel: undefined }); + store.on(Events.STORY_RENDER, onStoreRender); + + store.setSelection({ storyId: 'storyId', viewMode: 'viewMode' }, undefined); + expect(onChannelRender).not.toHaveBeenCalled(); + expect(onStoreRender).not.toHaveBeenCalled(); + + store.setChannel(testChannel); + await new Promise(r => setTimeout(r, 10)); + expect(onChannelRender).toHaveBeenCalled(); + expect(onStoreRender).toHaveBeenCalled(); + }); + }); + describe('dumpStoryBook', () => { it('should return nothing when empty', () => { const store = new StoryStore({ channel }); diff --git a/lib/client-api/src/story_store.ts b/lib/client-api/src/story_store.ts index 9fe704f5bdc..d2ba13df81f 100644 --- a/lib/client-api/src/story_store.ts +++ b/lib/client-api/src/story_store.ts @@ -145,9 +145,16 @@ export default class StoryStore extends EventEmitter { data === undefined ? this._selection : { storyId: data.storyId, viewMode: data.viewMode }; this._error = error === undefined ? this._error : error; + // Try and emit the STORY_RENDER event synchronously, but if the channel is not ready (RN), + // we'll try again later. + let isStarted = false; + if (this._channel) { + this._channel.emit(Events.STORY_RENDER); + isStarted = true; + } + setTimeout(() => { - // preferred method to emit event. - if (this._channel) { + if (this._channel && !isStarted) { this._channel.emit(Events.STORY_RENDER); } diff --git a/lib/client-logger/package.json b/lib/client-logger/package.json index 1e91fde54ee..8d367406fbf 100644 --- a/lib/client-logger/package.json +++ b/lib/client-logger/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/client-logger", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "", "keywords": [ "storybook" @@ -31,5 +31,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/client-logger/tsconfig.json b/lib/client-logger/tsconfig.json index 4894223ce82..e2c88041df6 100644 --- a/lib/client-logger/tsconfig.json +++ b/lib/client-logger/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "rootDir": "./src" + "rootDir": "./src", + "types": ["node"] }, "include": ["src/**/*"], "exclude": ["src/**/*.test.ts"] diff --git a/lib/codemod/package.json b/lib/codemod/package.json index 71cd6873820..b6786bac7c3 100644 --- a/lib/codemod/package.json +++ b/lib/codemod/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/codemod", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "A collection of codemod scripts written with JSCodeshift", "keywords": [ "storybook" @@ -27,14 +27,14 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@hypnosphi/jscodeshift": "^0.6.4", "@mdx-js/mdx": "^1.5.1", - "@storybook/node-logger": "5.3.0-beta.16", - "@storybook/router": "5.3.0-beta.16", + "@storybook/csf": "0.0.1", + "@storybook/node-logger": "5.3.0-rc.0", "core-js": "^3.0.1", "cross-spawn": "^7.0.0", "globby": "^10.0.1", "jest-specific-snapshot": "^2.0.0", + "jscodeshift": "^0.7.0", "lodash": "^4.17.15", "prettier": "^1.16.4", "recast": "^0.16.1", @@ -42,5 +42,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/codemod/src/transforms/__tests__/transforms.tests.js b/lib/codemod/src/transforms/__tests__/transforms.tests.js index aa607a3c091..2ac56a0a385 100644 --- a/lib/codemod/src/transforms/__tests__/transforms.tests.js +++ b/lib/codemod/src/transforms/__tests__/transforms.tests.js @@ -1,8 +1,7 @@ import path from 'path'; import fs from 'fs'; import 'jest-specific-snapshot'; -// TODO move back to original 'jscodeshift' package as soon as https://github.com/facebook/jscodeshift/pull/297 is released -import { applyTransform } from '@hypnosphi/jscodeshift/dist/testUtils'; +import { applyTransform } from 'jscodeshift/dist/testUtils'; jest.mock('@storybook/node-logger'); diff --git a/lib/codemod/src/transforms/csf-to-mdx.js b/lib/codemod/src/transforms/csf-to-mdx.js index fffa371bfc7..020426e1ba3 100644 --- a/lib/codemod/src/transforms/csf-to-mdx.js +++ b/lib/codemod/src/transforms/csf-to-mdx.js @@ -1,18 +1,5 @@ import recast from 'recast'; - -// FIXME: duplicate code from @storybook/core start.js -function isExportStory(key, { includeStories, excludeStories }) { - function matches(storyKey, arrayOrRegex) { - if (Array.isArray(arrayOrRegex)) { - return arrayOrRegex.includes(storyKey); - } - return storyKey.match(arrayOrRegex); - } - return ( - (!includeStories || matches(key, includeStories)) && - (!excludeStories || !matches(key, excludeStories)) - ); -} +import { isExportStory } from '@storybook/csf'; function exportMdx(root, options) { // eslint-disable-next-line no-underscore-dangle diff --git a/lib/codemod/src/transforms/storiesof-to-csf.js b/lib/codemod/src/transforms/storiesof-to-csf.js index 482cf6819a7..77e46900cdc 100644 --- a/lib/codemod/src/transforms/storiesof-to-csf.js +++ b/lib/codemod/src/transforms/storiesof-to-csf.js @@ -1,6 +1,6 @@ import prettier from 'prettier'; import { logger } from '@storybook/node-logger'; -import { storyNameFromExport } from '@storybook/router'; +import { storyNameFromExport } from '@storybook/csf'; import { sanitizeName } from '../lib/utils'; /** diff --git a/lib/components/package.json b/lib/components/package.json index 05c93e007bf..085aac4930c 100644 --- a/lib/components/package.json +++ b/lib/components/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/components", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Core Storybook Components", "keywords": [ "storybook" @@ -27,8 +27,8 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/client-logger": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/client-logger": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "@types/react-syntax-highlighter": "11.0.2", "@types/react-textarea-autosize": "^4.3.3", "core-js": "^3.0.1", @@ -60,5 +60,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/components/src/Button/Button.tsx b/lib/components/src/Button/Button.tsx index d5ee1387457..e5ca2f38533 100644 --- a/lib/components/src/Button/Button.tsx +++ b/lib/components/src/Button/Button.tsx @@ -1,226 +1,7 @@ import React, { FunctionComponent, forwardRef } from 'react'; -import { styled, css } from '@storybook/theming'; +import { styled } from '@storybook/theming'; import { darken, lighten, rgba, transparentize } from 'polished'; -type ButtonWrapperProps = ButtonProps; - -const ButtonWrapper = styled.button` - border: 0; - border-radius: 3em; - cursor: pointer; - display: inline-block; - overflow: hidden; - padding: ${props => (props.small ? '10px 16px' : '13px 20px')}; - position: relative; - text-align: center; - text-decoration: none; - transition: all 150ms ease-out; - transform: translate3d(0,0,0); - vertical-align: top; - white-space: nowrap; - user-select: none; - opacity: 1; - margin: 0; - background: transparent; - - - font-size: ${props => - props.small ? props.theme.typography.size.s1 : props.theme.typography.size.s2 - 1}px; - font-weight: ${props => props.theme.typography.weight.bold}; - line-height: 1; - - - svg { - display: inline-block; - height: ${props => (props.small ? '14' : '16')}px; - width: ${props => (props.small ? '14' : '16')}px; - vertical-align: top; - margin-right: ${props => (props.small ? '4' : '6')}px; - margin-top: ${props => (props.small ? '-1' : '-2')}px; - margin-bottom: ${props => (props.small ? '-1' : '-2')}px; - - /* Necessary for js mouse events to not glitch out when hovering on svgs */ - pointer-events: none; - - path { fill: currentColor; } - } - - ${props => - props.disabled && - css` - cursor: not-allowed !important; - opacity: 0.5; - &:hover { - transform: none; - } - `} - - ${props => - props.containsIcon && - css` - svg { - display: block; - margin: 0; - } - - ${props.small && - css` - padding: 9px; - `} - - ${!props.small && - css` - padding: 12px; - `} - `} - - /* Colored button for primary CTAs */ - ${props => - props.primary && - css` - background: ${props.theme.color.primary}; - color: ${props.theme.color.lightest}; - - &:hover { - background: ${darken(0.05, props.theme.color.primary)}; - } - &:active { - box-shadow: rgba(0, 0, 0, 0.1) 0 0 0 3em inset; - } - &:focus { - box-shadow: ${rgba(props.theme.color.primary, 0.4)} 0 1px 9px 2px; - } - &:focus:hover { - box-shadow: ${rgba(props.theme.color.primary, 0.2)} 0 8px 18px 0px; - } - `} - - - /* Colored button for secondary CTAs */ - ${props => - props.secondary && - css` - background: ${props.theme.color.secondary}; - color: ${props.theme.color.lightest}; - - &:hover { - background: ${darken(0.05, props.theme.color.secondary)}; - } - &:active { - box-shadow: rgba(0, 0, 0, 0.1) 0 0 0 3em inset; - } - &:focus { - box-shadow: ${rgba(props.theme.color.secondary, 0.4)} 0 1px 9px 2px; - } - &:focus:hover { - box-shadow: ${rgba(props.theme.color.secondary, 0.2)} 0 8px 18px 0px; - } - `} - - /* Button for tertiary CTAs and forms that responds to theme */ - ${props => - props.tertiary && - css` - background: ${props.theme.base === 'light' - ? darken(0.02, props.theme.input.background) - : lighten(0.02, props.theme.input.background)}; - color: ${props.theme.input.color}; - box-shadow: ${props.theme.input.border} 0 0 0 1px inset; - border-radius: ${props.theme.input.borderRadius}px; - - &:hover { - background: ${props.theme.base === 'light' - ? darken(0.05, props.theme.input.background) - : lighten(0.05, props.theme.input.background)}; - ${props.inForm - ? '' - : 'box-shadow: rgba(0,0,0,.2) 0 2px 6px 0, rgba(0,0,0,.1) 0 0 0 1px inset'} - } - &:active { - background: ${props.theme.base === 'light' - ? props.theme.input.background - : props.theme.input.background}; - } - &:focus { - box-shadow: ${rgba(props.theme.color.secondary, 0.4)} 0 0 0 1px inset; - } - `} - - /* Button that's outlined */ - ${props => - props.outline && - css` - box-shadow: ${transparentize(0.8, props.theme.color.defaultText)} 0 0 0 1px inset; - color: ${transparentize(0.3, props.theme.color.defaultText)}; - background: transparent; - - &:hover { - box-shadow: ${transparentize(0.5, props.theme.color.defaultText)} 0 0 0 1px inset; - } - - &:active { - box-shadow: ${transparentize(0.5, props.theme.color.defaultText)} 0 0 0 2px inset; - color: ${transparentize(0, props.theme.color.defaultText)}; - } - - ${props.primary && - css` - box-shadow: ${props.theme.color.primary} 0 0 0 1px inset; - color: ${props.theme.color.primary}; - - svg path { - fill: ${props.theme.color.primary}; - } - - &:hover { - box-shadow: ${props.theme.color.primary} 0 0 0 1px inset; - background: transparent; - } - - &:active { - background: ${props.theme.color.primary}; - box-shadow: ${props.theme.color.primary} 0 0 0 1px inset; - color: ${props.theme.color.lightest}; - } - &:focus { - box-shadow: ${props.theme.color.primary} 0 0 0 1px inset, - ${rgba(props.theme.color.primary, 0.4)} 0 1px 9px 2px; - } - &:focus:hover { - box-shadow: ${props.theme.color.primary} 0 0 0 1px inset, - ${rgba(props.theme.color.primary, 0.2)} 0 8px 18px 0px; - } - `}; - - ${props.secondary && - css` - box-shadow: ${props.theme.color.secondary} 0 0 0 1px inset; - color: ${props.theme.color.secondary}; - - &:hover { - box-shadow: ${props.theme.color.secondary} 0 0 0 1px inset; - background: transparent; - } - - &:active { - background: ${props.theme.color.secondary}; - box-shadow: ${props.theme.color.secondary} 0 0 0 1px inset; - color: ${props.theme.color.lightest}; - } - &:focus { - box-shadow: ${props.theme.color.secondary} 0 0 0 1px inset, - ${rgba(props.theme.color.secondary, 0.4)} 0 1px 9px 2px; - } - &:focus:hover { - box-shadow: ${props.theme.color.secondary} 0 0 0 1px inset, - ${rgba(props.theme.color.secondary, 0.2)} 0 8px 18px 0px; - } - `}; - `} -`; - -const ButtonLink = ButtonWrapper.withComponent('a'); - export interface ButtonProps { isLink?: boolean; primary?: boolean; @@ -233,6 +14,218 @@ export interface ButtonProps { containsIcon?: boolean; } +type ButtonWrapperProps = ButtonProps; + +const ButtonWrapper = styled.button( + ({ small, theme }) => ({ + border: 0, + borderRadius: '3em', + cursor: 'pointer', + display: 'inline-block', + overflow: 'hidden', + padding: small ? '10px 16px' : '13px 20px', + position: 'relative', + textAlign: 'center', + textDecoration: 'none', + transition: 'all 150ms ease-out', + transform: 'translate3d(0,0,0)', + verticalAlign: 'top', + whiteSpace: 'nowrap', + userSelect: 'none', + opacity: 1, + margin: 0, + background: 'transparent', + + fontSize: `${small ? theme.typography.size.s1 : theme.typography.size.s2 - 1}px`, + fontWeight: theme.typography.weight.bold, + lineHeight: '1', + + svg: { + display: 'inline-block', + height: small ? 14 : 16, + width: small ? 14 : 16, + + verticalAlign: 'top', + marginRight: small ? 4 : 6, + marginTop: small ? -1 : -2, + marginBottom: small ? -1 : -2, + + /* Necessary for js mouse events to not glitch out when hovering on svgs */ + pointerEvents: 'none', + + path: { + fill: 'currentColor }', + }, + }, + }), + ({ disabled }) => + disabled + ? { + cursor: 'not-allowed !important', + opacity: 0.5, + '&:hover': { + transform: 'none', + }, + } + : {}, + ({ containsIcon, small }) => + containsIcon + ? { + svg: { + display: 'block', + margin: 0, + }, + ...(small ? { padding: 9 } : { padding: 12 }), + } + : {}, + ({ theme, primary, secondary }) => { + let color; + + if (primary) { + color = theme.color.primary; + } + if (secondary) { + color = theme.color.secondary; + } + + return color + ? { + background: color, + color: theme.color.lightest, + + '&:hover': { + background: darken(0.05, color), + }, + '&:active': { + boxShadow: 'rgba(0, 0, 0, 0.1) 0 0 0 3em inset', + }, + '&:focus': { + boxShadow: `${rgba(color, 0.4)} 0 1px 9px 2px`, + }, + '&:focus:hover': { + boxShadow: `${rgba(color, 0.2)} 0 8px 18px 0px`, + }, + } + : {}; + }, + ({ theme, tertiary, inForm }) => + tertiary + ? { + background: + theme.base === 'light' + ? darken(0.02, theme.input.background) + : lighten(0.02, theme.input.background), + color: theme.input.color, + boxShadow: `${theme.input.border} 0 0 0 1px inset`, + borderRadius: theme.input.borderRadius, + + '&:hover': { + background: + theme.base === 'light' + ? darken(0.05, theme.input.background) + : lighten(0.05, theme.input.background), + ...(inForm + ? {} + : { + boxShadow: 'rgba(0,0,0,.2) 0 2px 6px 0, rgba(0,0,0,.1) 0 0 0 1px inset', + }), + }, + '&:active': { + background: theme.input.background, + }, + '&:focus': { + boxShadow: `${rgba(theme.color.secondary, 0.4)} 0 0 0 1px inset`, + }, + } + : {}, + ({ theme, outline }) => + outline + ? { + boxShadow: `${transparentize(0.8, theme.color.defaultText)} 0 0 0 1px inset`, + color: transparentize(0.3, theme.color.defaultText), + background: 'transparent', + + '&:hover': { + boxShadow: `${transparentize(0.5, theme.color.defaultText)} 0 0 0 1px inset`, + }, + + '&:active': { + boxShadow: `${transparentize(0.5, theme.color.defaultText)} 0 0 0 2px inset`, + color: transparentize(0, theme.color.defaultText), + }, + } + : {}, + ({ theme, outline, primary }) => { + const color = theme.color.primary; + + return outline && primary + ? { + boxShadow: `${color} 0 0 0 1px inset`, + color, + + 'svg path': { + fill: color, + }, + + '&:hover': { + boxShadow: `${color} 0 0 0 1px inset`, + background: 'transparent', + }, + + '&:active': { + background: color, + boxShadow: `${color} 0 0 0 1px inset`, + color: theme.color.lightest, + }, + '&:focus': { + boxShadow: `${color} 0 0 0 1px inset, ${rgba(color, 0.4)} 0 1px 9px 2px`, + }, + '&:focus:hover': { + boxShadow: `${color} 0 0 0 1px inset, ${rgba(color, 0.2)} 0 8px 18px 0px`, + }, + } + : {}; + }, + ({ theme, outline, primary, secondary }) => { + let color; + if (primary) { + color = theme.color.primary; + } + if (secondary) { + color = theme.color.secondary; + } + return outline && color + ? { + boxShadow: `${color} 0 0 0 1px inset`, + color, + + 'svg path': { + fill: color, + }, + + '&:hover': { + boxShadow: `${color} 0 0 0 1px inset`, + background: 'transparent', + }, + + '&:active': { + background: color, + boxShadow: `${color} 0 0 0 1px inset`, + color: theme.color.lightest, + }, + '&:focus': { + boxShadow: `${color} 0 0 0 1px inset, ${rgba(color, 0.4)} 0 1px 9px 2px`, + }, + '&:focus:hover': { + boxShadow: `${color} 0 0 0 1px inset, ${rgba(color, 0.2)} 0 8px 18px 0px`, + }, + } + : {}; + } +); + +const ButtonLink = ButtonWrapper.withComponent('a'); + export const Button = Object.assign( forwardRef(({ isLink, children, ...props }, ref) => { if (isLink) { diff --git a/lib/components/src/blocks/DocsPage.tsx b/lib/components/src/blocks/DocsPage.tsx index d2d723ec431..e6897e7d23f 100644 --- a/lib/components/src/blocks/DocsPage.tsx +++ b/lib/components/src/blocks/DocsPage.tsx @@ -29,18 +29,15 @@ export const Subtitle = styled.h2<{}>(withReset, ({ theme }: { theme: Theme }) = fontSize: theme.typography.size.s3, lineHeight: '20px', borderBottom: 'none', - marginBottom: '15px', + marginBottom: 15, [`@media (min-width: ${breakpoint}px)`]: { fontSize: theme.typography.size.m1, lineHeight: '28px', - marginBottom: '24px', + marginBottom: 24, }, - color: - theme.base === 'light' - ? transparentize(0.25, theme.color.defaultText) - : transparentize(0.25, theme.color.defaultText), + color: transparentize(0.25, theme.color.defaultText), })); export const DocsContent = styled.div({ diff --git a/lib/components/src/blocks/EmptyBlock.tsx b/lib/components/src/blocks/EmptyBlock.tsx index 39dba076bd2..39e117943ec 100644 --- a/lib/components/src/blocks/EmptyBlock.tsx +++ b/lib/components/src/blocks/EmptyBlock.tsx @@ -11,7 +11,7 @@ const Wrapper = styled.div<{}>(withReset, ({ theme }) => ({ fontSize: `${theme.typography.size.s2}px`, alignItems: 'center', justifyContent: 'center', - padding: '20px', + padding: 20, margin: '25px 0 40px', color: diff --git a/lib/components/src/blocks/PropsTable/PropJsDoc.tsx b/lib/components/src/blocks/PropsTable/PropJsDoc.tsx index 0eae9a2f434..5dbb8e98818 100644 --- a/lib/components/src/blocks/PropsTable/PropJsDoc.tsx +++ b/lib/components/src/blocks/PropsTable/PropJsDoc.tsx @@ -27,8 +27,8 @@ export const Table = styled.table(({ theme }) => ({ }, // End escape - marginTop: '0', - marginBottom: '0', + marginTop: 0, + marginBottom: 0, 'th:first-of-type, td:first-of-type': { paddingLeft: 0, @@ -39,8 +39,8 @@ export const Table = styled.table(({ theme }) => ({ }, td: { - paddingTop: '0', - paddingBottom: '4px', + paddingTop: 0, + paddingBottom: 4, '&:not(:first-of-type)': { paddingLeft: 10, diff --git a/lib/components/src/blocks/PropsTable/PropRow.tsx b/lib/components/src/blocks/PropsTable/PropRow.tsx index 425b1d46298..83d45fb841e 100644 --- a/lib/components/src/blocks/PropsTable/PropRow.tsx +++ b/lib/components/src/blocks/PropsTable/PropRow.tsx @@ -23,7 +23,7 @@ const Required = styled.span(({ theme }) => ({ const Description = styled.div(({ theme }) => ({ '&&': { p: { - margin: '0', + margin: 0, }, }, @@ -40,7 +40,7 @@ const Type = styled.div<{ hasDescription: boolean }>(({ theme, hasDescription }) theme.base === 'light' ? transparentize(0.1, theme.color.defaultText) : transparentize(0.2, theme.color.defaultText), - marginTop: hasDescription ? '4px' : '0', + marginTop: hasDescription ? 4 : 0, })); const TypeWithJsDoc = styled.div<{ hasDescription: boolean }>(({ theme, hasDescription }) => ({ @@ -48,8 +48,8 @@ const TypeWithJsDoc = styled.div<{ hasDescription: boolean }>(({ theme, hasDescr theme.base === 'light' ? transparentize(0.1, theme.color.defaultText) : transparentize(0.2, theme.color.defaultText), - marginTop: hasDescription ? '12px' : '0', - marginBottom: '12px', + marginTop: hasDescription ? 12 : 0, + marginBottom: 12, })); export const PropRow: FC = ({ diff --git a/lib/components/src/blocks/PropsTable/PropValue.tsx b/lib/components/src/blocks/PropsTable/PropValue.tsx index 7c1c5705624..f86e8dec98b 100644 --- a/lib/components/src/blocks/PropsTable/PropValue.tsx +++ b/lib/components/src/blocks/PropsTable/PropValue.tsx @@ -36,9 +36,9 @@ const Expandable = styled.div<{}>(codeCommon, ({ theme }) => ({ const Detail = styled.div<{ width: string }>(({ theme, width }) => ({ width, - minWidth: '200px', - maxWidth: '800px', - padding: '15px', + minWidth: 200, + maxWidth: 800, + padding: 15, // Dont remove the mono fontFamily here even if it seem useless, this is used by the browser to calculate the length of a "ch" unit. fontFamily: theme.typography.fonts.mono, fontSize: theme.typography.size.s2 - 1, @@ -54,7 +54,7 @@ const ArrowIcon = styled(Icons)({ height: 10, width: 10, minWidth: 10, - marginLeft: '4px', + marginLeft: 4, }); const EmptyProp = () => { diff --git a/lib/components/src/blocks/PropsTable/PropsTable.tsx b/lib/components/src/blocks/PropsTable/PropsTable.tsx index ca2ac324635..d2914eb3561 100644 --- a/lib/components/src/blocks/PropsTable/PropsTable.tsx +++ b/lib/components/src/blocks/PropsTable/PropsTable.tsx @@ -31,15 +31,15 @@ export const Table = styled.table<{}>(({ theme }) => ({ width: '100%', // Margin collapse - marginTop: '25px', - marginBottom: '40px', + marginTop: 25, + marginBottom: 40, 'th:first-of-type, td:first-of-type': { paddingLeft: 20, }, 'th:last-of-type, td:last-of-type': { - paddingRight: '20px', + paddingRight: 20, width: '20%', }, @@ -67,7 +67,7 @@ export const Table = styled.table<{}>(({ theme }) => ({ }, '&:last-of-type': { - paddingRight: '20px', + paddingRight: 20, }, }, diff --git a/lib/components/src/blocks/Typeset.stories.tsx b/lib/components/src/blocks/Typeset.stories.tsx index 39779e174e6..9945b12555c 100644 --- a/lib/components/src/blocks/Typeset.stories.tsx +++ b/lib/components/src/blocks/Typeset.stories.tsx @@ -8,9 +8,11 @@ export default { const fontSizes = ['12px', '14px', '16px', '20px', '24px', '32px', '40px', '48px']; const fontWeight = 900; +const fontFamily = 'monospace'; export const withFontSizes = () => ; export const withFontWeight = () => ; +export const withFontFamily = () => ; export const withWeightText = () => ( ); diff --git a/lib/components/src/blocks/Typeset.tsx b/lib/components/src/blocks/Typeset.tsx index 4a9150695a2..d88c7d6791e 100644 --- a/lib/components/src/blocks/Typeset.tsx +++ b/lib/components/src/blocks/Typeset.tsx @@ -35,6 +35,7 @@ const Wrapper = styled.div<{}>(withReset, ({ theme }) => ({ })); export interface TypesetProps { + fontFamily?: string; fontSizes: string[]; fontWeight?: number; sampleText?: string; @@ -45,6 +46,7 @@ export interface TypesetProps { * with different sizes and weights and configurable sample text. */ export const Typeset: FunctionComponent = ({ + fontFamily, fontSizes, fontWeight, sampleText, @@ -56,6 +58,7 @@ export const Typeset: FunctionComponent = ({ ( { '& svg': { transition: 'all 200ms ease-out', - opacity: '0', - height: '12px', - width: '12px', + opacity: 0, + height: 12, + width: 12, margin: '3px 0', verticalAlign: 'top', - } as any, + }, '& path': { fill: 'inherit', }, diff --git a/lib/components/src/tooltip/Tooltip.stories.tsx b/lib/components/src/tooltip/Tooltip.stories.tsx index 99cec614ec6..925cd6e5301 100644 --- a/lib/components/src/tooltip/Tooltip.stories.tsx +++ b/lib/components/src/tooltip/Tooltip.stories.tsx @@ -4,7 +4,7 @@ import { styled } from '@storybook/theming'; import { Tooltip } from './Tooltip'; // Popper would position the tooltip absolutely. We just need to make sure we are pos:rel -const mockPopperProps = { style: { position: 'relative', top: '20px', left: '20px' } }; +const mockPopperProps = { style: { position: 'relative', top: 20, left: 20 } }; const Content = styled.div({ width: '100px', diff --git a/lib/components/src/tooltip/WithTooltip.stories.tsx b/lib/components/src/tooltip/WithTooltip.stories.tsx index eb1b05ca1b3..d73cbefb815 100644 --- a/lib/components/src/tooltip/WithTooltip.stories.tsx +++ b/lib/components/src/tooltip/WithTooltip.stories.tsx @@ -5,28 +5,28 @@ import { styled } from '@storybook/theming'; import { TooltipMessage } from './TooltipMessage'; import { WithToolTipState as WithTooltip } from './WithTooltip'; -const ViewPort = styled.div` - height: 300px; -`; +const ViewPort = styled.div({ + height: 300, +}); -const BackgroundBox = styled.div` - width: 500px; - height: 500px; - overflow-y: scroll; - background: #eee; - position: relative; -`; +const BackgroundBox = styled.div({ + width: 500, + height: 500, + overflowY: 'scroll', + background: '#eee', + position: 'relative', +}); -const Spacer = styled.div` - height: 100px; -`; +const Spacer = styled.div({ + height: 100, +}); -const Trigger = styled.div` - width: 200px; - height: 100px; - background-color: red; - color: white; -`; +const Trigger = styled.div({ + width: 200, + height: 100, + backgroundColor: 'red', + color: 'white', +}); interface TooltipProps { onHide?: () => void; diff --git a/lib/components/src/typography/DocumentFormatting.tsx b/lib/components/src/typography/DocumentFormatting.tsx index 778bb9e4056..6c136299e28 100644 --- a/lib/components/src/typography/DocumentFormatting.tsx +++ b/lib/components/src/typography/DocumentFormatting.tsx @@ -9,7 +9,7 @@ export const H1 = styled.h1<{}>(withReset, headerCommon, ({ theme }) => ({ export const H2 = styled.h2<{}>(withReset, headerCommon, ({ theme }) => ({ fontSize: `${theme.typography.size.m2}px`, - paddingBottom: '4px', + paddingBottom: 4, borderBottom: `1px solid ${theme.appBorderColor}`, })); @@ -87,28 +87,28 @@ export const A = styled(Link)<{}>(withReset, ({ theme }) => ({ fontSize: theme.typography.size.s2, lineHeight: '24px', - color: `${theme.color.secondary}`, + color: theme.color.secondary, textDecoration: 'none', '&.absent': { color: '#cc0000', }, '&.anchor': { display: 'block', - paddingLeft: '30px', - marginLeft: '-30px', + paddingLeft: 30, + marginLeft: -30, cursor: 'pointer', position: 'absolute', - top: '0', - left: '0', - bottom: '0', + top: 0, + left: 0, + bottom: 0, }, })); export const HR = styled.hr<{}>(({ theme }) => ({ border: '0 none', borderTop: `1px solid ${theme.appBorderColor}`, - height: '4px', - padding: '0', + height: 4, + padding: 0, })); export const DL = styled.dl<{}>(withReset, { @@ -151,7 +151,7 @@ export const Blockquote = styled.blockquote<{}>(withReset, withMargin, ({ theme padding: '0 15px', color: theme.color.dark, '& > :first-of-type': { - marginTop: '0', + marginTop: 0, }, '& > :last-child': { marginBottom: 0, @@ -166,8 +166,8 @@ export const Table = styled.table<{}>(withReset, withMargin, ({ theme }) => ({ '& tr': { borderTop: `1px solid ${theme.appBorderColor}`, backgroundColor: 'white', - margin: '0', - padding: '0', + margin: 0, + padding: 0, }, '& tr:nth-of-type(2n)': { backgroundColor: `${theme.color.lighter}`, @@ -176,20 +176,20 @@ export const Table = styled.table<{}>(withReset, withMargin, ({ theme }) => ({ fontWeight: 'bold', border: `1px solid ${theme.appBorderColor}`, textAlign: 'left', - margin: '0', + margin: 0, padding: '6px 13px', }, '& tr td': { border: `1px solid ${theme.appBorderColor}`, textAlign: 'left', - margin: '0', + margin: 0, padding: '6px 13px', }, '& tr th :first-of-type, & tr td :first-of-type': { - marginTop: '0', + marginTop: 0, }, '& tr th :last-child, & tr td :last-child': { - marginBottom: '0', + marginBottom: 0, }, })); @@ -203,81 +203,85 @@ export const Span = styled.span<{}>(withReset, ({ theme }) => ({ '&.frame': { display: 'block', overflow: 'hidden', - }, - '&.frame > span': { - border: `1px solid ${theme.color.medium}`, - display: 'block', - float: 'left', - overflow: 'hidden', - margin: '13px 0 0', - padding: '7px', - width: 'auto', - }, - '&.frame span img': { - display: 'block', - float: 'left', - }, - '&.frame span span': { - clear: 'both', - color: theme.color.darkest, - display: 'block', - padding: '5px 0 0', + + '& > span': { + border: `1px solid ${theme.color.medium}`, + display: 'block', + float: 'left', + overflow: 'hidden', + margin: '13px 0 0', + padding: 7, + width: 'auto', + }, + '& span img': { + display: 'block', + float: 'left', + }, + '& span span': { + clear: 'both', + color: theme.color.darkest, + display: 'block', + padding: '5px 0 0', + }, }, '&.align-center': { display: 'block', overflow: 'hidden', clear: 'both', - }, - '&.align-center > span': { - display: 'block', - overflow: 'hidden', - margin: '13px auto 0', - textAlign: 'center', - }, - '&.align-center span img': { - margin: '0 auto', - textAlign: 'center', + + '& > span': { + display: 'block', + overflow: 'hidden', + margin: '13px auto 0', + textAlign: 'center', + }, + '& span img': { + margin: '0 auto', + textAlign: 'center', + }, }, '&.align-right': { display: 'block', overflow: 'hidden', clear: 'both', - }, - '&.align-right > span': { - display: 'block', - overflow: 'hidden', - margin: '13px 0 0', - textAlign: 'right', - }, - '&.align-right span img': { - margin: '0', - textAlign: 'right', + + '& > span': { + display: 'block', + overflow: 'hidden', + margin: '13px 0 0', + textAlign: 'right', + }, + '& span img': { + margin: 0, + textAlign: 'right', + }, }, '&.float-left': { display: 'block', - marginRight: '13px', + marginRight: 13, overflow: 'hidden', float: 'left', - }, - '&.float-left span': { - margin: '13px 0 0', + '& span': { + margin: '13px 0 0', + }, }, '&.float-right': { display: 'block', - marginLeft: '13px', + marginLeft: 13, overflow: 'hidden', float: 'right', - }, - '&.float-right > span': { - display: 'block', - overflow: 'hidden', - margin: '13px auto 0', - textAlign: 'right', + + '& > span': { + display: 'block', + overflow: 'hidden', + margin: '13px auto 0', + textAlign: 'right', + }, }, })); const listCommon: CSSObject = { - paddingLeft: '30px', + paddingLeft: 30, '& :first-of-type': { marginTop: 0, }, diff --git a/lib/components/src/typography/DocumentWrapper.tsx b/lib/components/src/typography/DocumentWrapper.tsx index 7576d8a2271..2351bc3955d 100644 --- a/lib/components/src/typography/DocumentWrapper.tsx +++ b/lib/components/src/typography/DocumentWrapper.tsx @@ -1,442 +1,308 @@ -import { styled, css } from '@storybook/theming'; - -export const DocumentWrapper = styled.div( - ({ theme }) => css` - /* Custom styles atop GitHub base theme (see below) */ - font-size: ${theme.typography.size.s2}px; - line-height: 1.6; - - h1 { - font-size: ${theme.typography.size.l1}px; - font-weight: ${theme.typography.weight.black}; - } - - h2 { - font-size: ${theme.typography.size.m2}px; - border-bottom: 1px solid ${theme.appBorderColor}; - } - - h3 { - font-size: ${theme.typography.size.m1}px; - } - - h4 { - font-size: ${theme.typography.size.s3}px; - } - - h5 { - font-size: ${theme.typography.size.s2}px; - } - - h6 { - font-size: ${theme.typography.size.s2}px; - color: ${theme.color.dark}; - } - - /* Custom for SB SyntaxHighlighter */ - - pre:not(.hljs) { - background: transparent; - border: none; - border-radius: 0; - padding: 0; - margin: 0; - } - - pre pre, - pre.hljs { - padding: 15px; - margin: 0; - - white-space: pre-wrap; - color: inherit; - - font-size: 13px; - line-height: 19px; - - code { - color: inherit; - font-size: inherit; - } - } - - pre code { - margin: 0; - padding: 0; - white-space: pre; - border: none; - background: transparent; - } - - pre code, - pre tt { - background-color: transparent; - border: none; - } - - /* GitHub inspired Markdown styles loosely from https://gist.github.com/tuzz/3331384 */ - - body > *:first-of-type { - margin-top: 0 !important; - } - - body > *:last-child { - margin-bottom: 0 !important; - } - - a { - color: ${theme.color.secondary}; - text-decoration: none; - } - - a.absent { - color: #cc0000; - } - - a.anchor { - display: block; - padding-left: 30px; - margin-left: -30px; - cursor: pointer; - position: absolute; - top: 0; - left: 0; - bottom: 0; - } - - h1, - h2, - h3, - h4, - h5, - h6 { - margin: 20px 0 10px; - padding: 0; - cursor: text; - position: relative; - } - - h2:first-of-type, - h1:first-of-type, - h1:first-of-type + h2, - h3:first-of-type, - h4:first-of-type, - h5:first-of-type, - h6:first-of-type { - margin-top: 0; - padding-top: 0; - } - - h1:hover a.anchor, - h2:hover a.anchor, - h3:hover a.anchor, - h4:hover a.anchor, - h5:hover a.anchor, - h6:hover a.anchor { - text-decoration: none; - } - - h1 tt, - h1 code { - font-size: inherit; - } - - h2 tt, - h2 code { - font-size: inherit; - } - - h3 tt, - h3 code { - font-size: inherit; - } - - h4 tt, - h4 code { - font-size: inherit; - } - - h5 tt, - h5 code { - font-size: inherit; - } - - h6 tt, - h6 code { - font-size: inherit; - } - - p, - blockquote, - ul, - ol, - dl, - li, - table, - pre { - margin: 15px 0; - } - - hr { - border: 0 none; - border-top: 1px solid ${theme.appBorderColor}; - height: 4px; - padding: 0; - } - - body > h2:first-of-type { - margin-top: 0; - padding-top: 0; - } - - body > h1:first-of-type { - margin-top: 0; - padding-top: 0; - } - - body > h1:first-of-type + h2 { - margin-top: 0; - padding-top: 0; - } - - body > h3:first-of-type, - body > h4:first-of-type, - body > h5:first-of-type, - body > h6:first-of-type { - margin-top: 0; - padding-top: 0; - } - - a:first-of-type h1, - a:first-of-type h2, - a:first-of-type h3, - a:first-of-type h4, - a:first-of-type h5, - a:first-of-type h6 { - margin-top: 0; - padding-top: 0; - } - - h1 p, - h2 p, - h3 p, - h4 p, - h5 p, - h6 p { - margin-top: 0; - } - - li p.first { - display: inline-block; - } - - ul, - ol { - padding-left: 30px; - } - - ul :first-of-type, - ol :first-of-type { - margin-top: 0; - } - - ul :last-child, - ol :last-child { - margin-bottom: 0; - } - - dl { - padding: 0; - } - - dl dt { - font-size: 14px; - font-weight: bold; - font-style: italic; - padding: 0; - margin: 15px 0 5px; - } - - dl dt:first-of-type { - padding: 0; - } - - dl dt > :first-of-type { - margin-top: 0; - } - - dl dt > :last-child { - margin-bottom: 0; - } - - dl dd { - margin: 0 0 15px; - padding: 0 15px; - } - - dl dd > :first-of-type { - margin-top: 0; - } - - dl dd > :last-child { - margin-bottom: 0; - } - - blockquote { - border-left: 4px solid ${theme.color.medium}; - padding: 0 15px; - color: ${theme.color.dark}; - } - - blockquote > :first-of-type { - margin-top: 0; - } - - blockquote > :last-child { - margin-bottom: 0; - } - - table { - padding: 0; - border-collapse: collapse; - } - table tr { - border-top: 1px solid ${theme.appBorderColor}; - background-color: white; - margin: 0; - padding: 0; - } - - table tr:nth-of-type(2n) { - background-color: ${theme.color.lighter}; - } - - table tr th { - font-weight: bold; - border: 1px solid ${theme.appBorderColor}; - text-align: left; - margin: 0; - padding: 6px 13px; - } - - table tr td { - border: 1px solid ${theme.appBorderColor}; - text-align: left; - margin: 0; - padding: 6px 13px; - } - - table tr th :first-of-type, - table tr td :first-of-type { - margin-top: 0; - } - - table tr th :last-child, - table tr td :last-child { - margin-bottom: 0; - } - - img { - max-width: 100%; - } - - span.frame { - display: block; - overflow: hidden; - } - - span.frame > span { - border: 1px solid ${theme.color.medium}; - display: block; - float: left; - overflow: hidden; - margin: 13px 0 0; - padding: 7px; - width: auto; - } - - span.frame span img { - display: block; - float: left; - } - - span.frame span span { - clear: both; - color: ${theme.color.darkest}; - display: block; - padding: 5px 0 0; - } - - span.align-center { - display: block; - overflow: hidden; - clear: both; - } - - span.align-center > span { - display: block; - overflow: hidden; - margin: 13px auto 0; - text-align: center; - } - - span.align-center span img { - margin: 0 auto; - text-align: center; - } - - span.align-right { - display: block; - overflow: hidden; - clear: both; - } - - span.align-right > span { - display: block; - overflow: hidden; - margin: 13px 0 0; - text-align: right; - } - - span.align-right span img { - margin: 0; - text-align: right; - } - - span.float-left { - display: block; - margin-right: 13px; - overflow: hidden; - float: left; - } - - span.float-left span { - margin: 13px 0 0; - } - - span.float-right { - display: block; - margin-left: 13px; - overflow: hidden; - float: right; - } - - span.float-right > span { - display: block; - overflow: hidden; - margin: 13px auto 0; - text-align: right; - } - - code, - tt { - margin: 0 2px; - padding: 0 5px; - white-space: nowrap; - border: 1px solid ${theme.color.mediumlight}; - background-color: ${theme.color.lighter}; - border-radius: 3px; - color: ${theme.base === 'dark' && theme.color.darkest}; - } - ` -); +import { styled } from '@storybook/theming'; + +export const DocumentWrapper = styled.div<{}>(({ theme }) => ({ + fontSize: `${theme.typography.size.s2}px`, + lineHeight: '1.6', + + h1: { + fontSize: `${theme.typography.size.l1}px`, + fontWeight: theme.typography.weight.black, + }, + h2: { + fontSize: `${theme.typography.size.m2}px`, + borderBottom: `1px solid ${theme.appBorderColor}`, + }, + h3: { + fontSize: `${theme.typography.size.m1}px`, + }, + h4: { + fontSize: `${theme.typography.size.s3}px`, + }, + h5: { + fontSize: `${theme.typography.size.s2}px`, + }, + h6: { + fontSize: `${theme.typography.size.s2}px`, + color: theme.color.dark, + }, + 'pre:not(.hljs)': { + background: 'transparent', + border: 'none', + borderRadius: 0, + padding: 0, + margin: 0, + }, + 'pre pre, pre.hljs': { + padding: 15, + margin: 0, + whiteSpace: 'pre-wrap', + color: 'inherit', + fontSize: '13px', + lineHeight: '19px', + }, + 'pre pre code, pre.hljs code': { + color: 'inherit', + fontSize: 'inherit', + }, + 'pre code': { + margin: 0, + padding: 0, + whiteSpace: 'pre', + border: 'none', + background: 'transparent', + }, + 'pre code, pre tt': { + backgroundColor: 'transparent', + border: 'none', + }, + /* GitHub inspired Markdown styles loosely from https://gist.github.com/tuzz/3331384 */ + 'body > *:first-of-type': { + marginTop: '0 !important', + }, + 'body > *:last-child': { + marginBottom: '0 !important', + }, + a: { + color: theme.color.secondary, + textDecoration: 'none', + }, + 'a.absent': { + color: '#cc0000', + }, + 'a.anchor': { + display: 'block', + paddingLeft: 30, + marginLeft: -30, + cursor: 'pointer', + position: 'absolute', + top: 0, + left: 0, + bottom: 0, + }, + 'h1, h2, h3, h4, h5, h6': { + margin: '20px 0 10px', + padding: 0, + cursor: 'text', + position: 'relative', + + '&:first-of-type': { + marginTop: 0, + paddingTop: 0, + }, + '&:hover a.anchor': { + textDecoration: 'none', + }, + '& tt, & code': { + fontSize: 'inherit', + }, + }, + 'h1:first-of-type + h2': { + marginTop: 0, + paddingTop: 0, + }, + 'p, blockquote, ul, ol, dl, li, table, pre': { + margin: '15px 0', + }, + hr: { + border: '0 none', + borderTop: `1px solid ${theme.appBorderColor}`, + height: 4, + padding: 0, + }, + 'body > h1:first-of-type, body > h2:first-of-type, body > h3:first-of-type, body > h4:first-of-type, body > h5:first-of-type, body > h6:first-of-type': { + marginTop: 0, + paddingTop: 0, + }, + 'body > h1:first-of-type + h2': { + marginTop: 0, + paddingTop: 0, + }, + 'a:first-of-type h1, a:first-of-type h2, a:first-of-type h3, a:first-of-type h4, a:first-of-type h5, a:first-of-type h6': { + marginTop: 0, + paddingTop: 0, + }, + 'h1 p, h2 p, h3 p, h4 p, h5 p, h6 p': { + marginTop: 0, + }, + 'li p.first': { + display: 'inline-block', + }, + 'ul, ol': { + paddingLeft: 30, + + '& :first-of-type': { + marginTop: 0, + }, + '& :last-child': { + marginBottom: 0, + }, + }, + dl: { + padding: 0, + }, + + 'dl dt': { + fontSize: '14px', + fontWeight: 'bold', + fontStyle: 'italic', + margin: '0 0 15px', + padding: '0 15px', + + '&:first-of-type': { + padding: 0, + }, + '& > :first-of-type': { + marginTop: 0, + }, + '& > :last-child': { + marginBottom: 0, + }, + }, + + blockquote: { + borderLeft: `4px solid ${theme.color.medium}`, + padding: '0 15px', + color: theme.color.dark, + + '& > :first-of-type': { + marginTop: 0, + }, + + '& > :last-child': { + marginBottom: 0, + }, + }, + + table: { + padding: 0, + borderCollapse: 'collapse', + + '& tr': { + borderTop: `1px solid ${theme.appBorderColor}`, + backgroundColor: 'white', + margin: 0, + padding: 0, + + '& th': { + fontWeight: 'bold', + border: `1px solid ${theme.appBorderColor}`, + textAlign: 'left', + margin: 0, + padding: '6px 13px', + }, + + '& td': { + border: `1px solid ${theme.appBorderColor}`, + textAlign: 'left', + margin: 0, + padding: '6px 13px', + }, + '&:nth-of-type(2n)': { + backgroundColor: theme.color.lighter, + }, + + '& th :first-of-type, & td :first-of-type': { + marginTop: 0, + }, + '& th :last-child, & td :last-child': { + marginBottom: 0, + }, + }, + }, + img: { + maxWidth: '100%', + }, + 'span.frame': { + display: 'block', + overflow: 'hidden', + + '& > span': { + border: `1px solid ${theme.color.medium}`, + display: 'block', + float: 'left', + overflow: 'hidden', + margin: '13px 0 0', + padding: 7, + width: 'auto', + }, + + '& span img': { + display: 'block', + float: 'left', + }, + + '& span span': { + clear: 'both', + color: theme.color.darkest, + display: 'block', + padding: '5px 0 0', + }, + }, + 'span.align-center': { + display: 'block', + overflow: 'hidden', + clear: 'both', + + '& > span': { + display: 'block', + overflow: 'hidden', + margin: '13px auto 0', + textAlign: 'center', + }, + '& span img': { + margin: '0 auto', + textAlign: 'center', + }, + }, + 'span.align-right': { + display: 'block', + overflow: 'hidden', + clear: 'both', + + '& > span': { + display: 'block', + overflow: 'hidden', + margin: '13px 0 0', + textAlign: 'right', + }, + + '& span img': { + margin: 0, + textAlign: 'right', + }, + }, + + 'span.float-left': { + display: 'block', + marginRight: 13, + overflow: 'hidden', + float: 'left', + + '& span': { + margin: '13px 0 0', + }, + }, + + 'span.float-right': { + display: 'block', + marginLeft: 13, + overflow: 'hidden', + float: 'right', + + '& > span': { + display: 'block', + overflow: 'hidden', + margin: '13px auto 0', + textAlign: 'right', + }, + }, + 'code, tt': { + margin: '0 2px', + padding: '0 5px', + whiteSpace: 'nowrap', + border: `1px solid ${theme.color.mediumlight}`, + backgroundColor: theme.color.lighter, + borderRadius: 3, + color: theme.base === 'dark' && theme.color.darkest, + }, +})); diff --git a/lib/components/src/typography/link/link.tsx b/lib/components/src/typography/link/link.tsx index c37e9ebba94..2c5ff953e59 100644 --- a/lib/components/src/typography/link/link.tsx +++ b/lib/components/src/typography/link/link.tsx @@ -1,10 +1,10 @@ import React, { AnchorHTMLAttributes, FunctionComponent, MouseEvent } from 'react'; -import { styled, css, Theme } from '@storybook/theming'; +import { styled } from '@storybook/theming'; import { darken } from 'polished'; import { Icons } from '../../icon/icon'; -// Cmd/Ctrl/Shift/Alt + Click should trigger default browser behaviour. Same applies to non-left clicks +// Cmd/Ctrl/Shift/Alt + Click should trigger default browser behavior. Same applies to non-left clicks const LEFT_BUTTON = 0; const isPlainLeftClick = (e: MouseEvent) => @@ -25,166 +25,155 @@ export interface LinkStylesProps { isButton?: boolean; } -const linkStyles = (props: LinkStylesProps & { theme: Theme }) => css` - display: inline-block; - transition: all 150ms ease-out; - text-decoration: none; - - color: ${props.theme.color.secondary}; - svg path { - fill: ${props.theme.color.secondary}; - } - - &:hover, - &:focus { - cursor: pointer; - color: ${darken(0.07, props.theme.color.secondary)}; - svg path { - fill: ${darken(0.07, props.theme.color.secondary)}; - } - } - &:active { - color: ${darken(0.1, props.theme.color.secondary)}; - svg path { - fill: ${darken(0.1, props.theme.color.secondary)}; - } - } - - svg { - display: inline-block; - height: 1em; - width: 1em; - vertical-align: text-top; - position: relative; - bottom: -0.125em; - margin-right: 0.4em; - } - - ${props.secondary && - css` - color: ${props.theme.color.mediumdark}; - svg path { - fill: ${props.theme.color.mediumdark}; - } - - &:hover { - color: ${props.theme.color.dark}; - svg path { - fill: ${props.theme.color.dark}; - } - } - - &:active { - color: ${props.theme.color.darker}; - svg path { - fill: ${props.theme.color.darker}; - } - } - `}; - - ${props.tertiary && - css` - color: ${props.theme.color.dark}; - svg path { - fill: ${props.theme.color.dark}; - } - - &:hover { - color: ${props.theme.color.darkest}; - svg path { - fill: ${props.theme.color.darkest}; - } - } - - &:active { - color: ${props.theme.color.mediumdark}; - svg path { - fill: ${props.theme.color.mediumdark}; - } - } - `}; - - ${props.nochrome && - css` - color: inherit; - - &:hover, - &:active { - color: inherit; - text-decoration: underline; - } - `}; - - ${props.inverse && - css` - color: ${props.theme.color.lightest}; - svg path { - fill: ${props.theme.color.lightest}; - } - - &:hover { - color: ${props.theme.color.lighter}; - svg path { - fill: ${props.theme.color.lighter}; - } - } - - &:active { - color: ${props.theme.color.light}; - svg path { - fill: ${props.theme.color.light}; - } - } - `}; - - ${props.isButton && - css` - border: 0; - border-radius: 0; - background: none; - padding: 0; - font-size: inherit; - `}; -`; - export interface LinkInnerProps { withArrow?: boolean; containsIcon?: boolean; } -const LinkInner = styled.span` - ${(props: LinkInnerProps) => - props.withArrow && - css` - > svg:last-of-type { - height: 0.7em; - width: 0.7em; - margin-right: 0; - margin-left: 0.25em; - bottom: auto; - vertical-align: inherit; - } - `}; - - ${props => - props.containsIcon && - css` - svg { - height: 1em; - width: 1em; - vertical-align: middle; - position: relative; - bottom: 0; - margin-right: 0; - } - `}; -`; +const LinkInner = styled.span( + ({ withArrow }) => + withArrow + ? { + '> svg:last-of-type': { + height: '0.7em', + width: '0.7em', + marginRight: 0, + marginLeft: '0.25em', + bottom: 'auto', + verticalAlign: 'inherit', + }, + } + : {}, + ({ containsIcon }) => + containsIcon + ? { + svg: { + height: '1em', + width: '1em', + verticalAlign: 'middle', + position: 'relative', + bottom: 0, + marginRight: 0, + }, + } + : {} +); type AProps = AnchorHTMLAttributes; -const A = styled.a` - ${linkStyles}; -`; +const A = styled.a( + ({ theme }) => ({ + display: 'inline-block', + transition: 'all 150ms ease-out', + textDecoration: 'none', + + color: theme.color.secondary, + + '&:hover, &:focus': { + cursor: 'pointer', + color: darken(0.07, theme.color.secondary), + 'svg path': { + fill: darken(0.07, theme.color.secondary), + }, + }, + '&:active': { + color: darken(0.1, theme.color.secondary), + 'svg path': { + fill: darken(0.1, theme.color.secondary), + }, + }, + + svg: { + display: 'inline-block', + height: '1em', + width: '1em', + verticalAlign: 'text-top', + position: 'relative', + bottom: '-0.125em', + marginRight: '0.4em', + + '& path': { + fill: theme.color.secondary, + }, + }, + }), + ({ theme, secondary, tertiary }) => { + let colors; + if (secondary) { + colors = [theme.color.mediumdark, theme.color.dark, theme.color.darker]; + } + if (tertiary) { + colors = [theme.color.dark, theme.color.darkest, theme.color.mediumdark]; + } + + return colors + ? { + color: colors[0], + 'svg path': { + fill: colors[0], + }, + + '&:hover': { + color: colors[1], + 'svg path': { + fill: colors[1], + }, + }, + + '&:active': { + color: colors[2], + 'svg path': { + fill: colors[2], + }, + }, + } + : {}; + }, + ({ nochrome }) => + nochrome + ? { + color: 'inherit', + + '&:hover, &:active': { + color: 'inherit', + textDecoration: 'underline', + }, + } + : {}, + ({ theme, inverse }) => + inverse + ? { + color: theme.color.lightest, + 'svg path': { + fill: theme.color.lightest, + }, + + '&:hover': { + color: theme.color.lighter, + 'svg path': { + fill: theme.color.lighter, + }, + }, + + '&:active': { + color: theme.color.light, + 'svg path': { + fill: theme.color.light, + }, + }, + } + : {}, + ({ isButton }) => + isButton + ? { + border: 0, + borderRadius: 0, + background: 'none', + padding: 0, + fontSize: 'inherit', + } + : {} +); export interface LinkProps extends LinkInnerProps, LinkStylesProps { cancel?: boolean; diff --git a/lib/components/src/typography/shared.tsx b/lib/components/src/typography/shared.tsx index 0ec259df0a5..4ff39c0bf94 100644 --- a/lib/components/src/typography/shared.tsx +++ b/lib/components/src/typography/shared.tsx @@ -25,11 +25,9 @@ export const codeCommon = ({ theme }: { theme: Theme }): CSSObject => ({ padding: '3px 5px', whiteSpace: 'nowrap', - borderRadius: '3px', + borderRadius: 3, fontSize: theme.typography.size.s2 - 1, - // color: theme.base === 'dark' && theme.color.darkest, - border: theme.base === 'light' ? `1px solid ${theme.color.mediumlight}` diff --git a/lib/core-events/package.json b/lib/core-events/package.json index c8f136fcbec..2918de45a9c 100644 --- a/lib/core-events/package.json +++ b/lib/core-events/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/core-events", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Event names used in storybook core", "keywords": [ "storybook" @@ -31,5 +31,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/core-events/src/index.ts b/lib/core-events/src/index.ts index 843a920b805..1b776491d7e 100644 --- a/lib/core-events/src/index.ts +++ b/lib/core-events/src/index.ts @@ -21,6 +21,8 @@ enum events { STORIES_COLLAPSE_ALL = 'storiesCollapseAll', STORIES_EXPAND_ALL = 'storiesExpandAll', DOCS_RENDERED = 'docsRendered', + ADDON_STATE_CHANGED = 'addonStateChanged', + ADDON_STATE_SET = 'addonStateSet', } // Enables: `import Events from ...` @@ -50,4 +52,6 @@ export const { STORIES_EXPAND_ALL, STORY_THREW_EXCEPTION, DOCS_RENDERED, + ADDON_STATE_CHANGED, + ADDON_STATE_SET, } = events; diff --git a/lib/core/package.json b/lib/core/package.json index 56e17007e51..61c7a752703 100644 --- a/lib/core/package.json +++ b/lib/core/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/core", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Storybook framework-agnostic API", "keywords": [ "storybook" @@ -32,15 +32,16 @@ "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-transform-react-constant-elements": "^7.2.0", "@babel/preset-env": "^7.4.5", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/channel-postmessage": "5.3.0-beta.16", - "@storybook/client-api": "5.3.0-beta.16", - "@storybook/client-logger": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/node-logger": "5.3.0-beta.16", - "@storybook/router": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", - "@storybook/ui": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/channel-postmessage": "5.3.0-rc.0", + "@storybook/client-api": "5.3.0-rc.0", + "@storybook/client-logger": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/csf": "0.0.1", + "@storybook/node-logger": "5.3.0-rc.0", + "@storybook/router": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", + "@storybook/ui": "5.3.0-rc.0", "airbnb-js-shims": "^2.2.1", "ansi-to-html": "^0.6.11", "autoprefixer": "^9.7.2", @@ -111,5 +112,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/core/src/client/preview/NoDocs.js b/lib/core/src/client/preview/NoDocs.js index 9394b8b4e4d..b9a57da4fc8 100644 --- a/lib/core/src/client/preview/NoDocs.js +++ b/lib/core/src/client/preview/NoDocs.js @@ -8,8 +8,8 @@ const wrapper = { const main = { margin: 'auto', - padding: '30px', - borderRadius: '10px', + padding: 30, + borderRadius: 10, background: 'rgba(0,0,0,0.03)', }; diff --git a/lib/core/src/client/preview/index.js b/lib/core/src/client/preview/index.js index 5fd9ec35687..0197cec7d3b 100644 --- a/lib/core/src/client/preview/index.js +++ b/lib/core/src/client/preview/index.js @@ -1,5 +1,5 @@ import { ClientApi, StoryStore, ConfigApi } from '@storybook/client-api'; -import { toId } from '@storybook/router/utils'; +import { toId } from '@storybook/csf'; import start from './start'; export default { diff --git a/lib/core/src/client/preview/start.js b/lib/core/src/client/preview/start.js index 9318203dae5..cee43477545 100644 --- a/lib/core/src/client/preview/start.js +++ b/lib/core/src/client/preview/start.js @@ -7,7 +7,7 @@ import AnsiToHtml from 'ansi-to-html'; import addons from '@storybook/addons'; import createChannel from '@storybook/channel-postmessage'; import { ClientApi, StoryStore, ConfigApi } from '@storybook/client-api'; -import { toId, storyNameFromExport } from '@storybook/router/utils'; +import { toId, storyNameFromExport, isExportStory } from '@storybook/csf'; import { logger } from '@storybook/client-logger'; import Events from '@storybook/core-events'; @@ -24,22 +24,6 @@ const classes = { ERROR: 'sb-show-errordisplay', }; -function matches(storyKey, arrayOrRegex) { - if (Array.isArray(arrayOrRegex)) { - return arrayOrRegex.includes(storyKey); - } - return storyKey.match(arrayOrRegex); -} - -export function isExportStory(key, { includeStories, excludeStories }) { - return ( - // https://babeljs.io/docs/en/babel-plugin-transform-modules-commonjs - key !== '__esModule' && - (!includeStories || matches(key, includeStories)) && - (!excludeStories || !matches(key, excludeStories)) - ); -} - function showMain() { document.body.classList.remove(classes.NOPREVIEW); document.body.classList.remove(classes.ERROR); @@ -194,7 +178,7 @@ export default function start(render, { decorateStory } = {}) { return; } - if (!forceRender && previousKind && previousStory) { + if (!forceRender && previousKind && previousStory && revision === previousRevision) { addons.getChannel().emit(Events.STORY_CHANGED, id); } @@ -395,7 +379,10 @@ export default function start(render, { decorateStory } = {}) { ); } - const { default: meta, ...exports } = fileExports; + const { default: meta, __orderedExports, ...namedExports } = fileExports; + // prefer a user/loader provided `__orderedExports` object if supplied as es module exports + // are ordered alphabetically - see https://github.com/storybookjs/storybook/issues/9136 + const exports = __orderedExports || namedExports; const { title: kindName, id: componentId, diff --git a/lib/core/src/client/preview/start.test.js b/lib/core/src/client/preview/start.test.js index 4b64ec026b4..bf56348e50f 100644 --- a/lib/core/src/client/preview/start.test.js +++ b/lib/core/src/client/preview/start.test.js @@ -2,7 +2,7 @@ import { history, document, window } from 'global'; import Events from '@storybook/core-events'; -import start, { isExportStory } from './start'; +import start from './start'; jest.mock('@storybook/client-logger'); jest.mock('global', () => ({ @@ -143,41 +143,3 @@ describe('STORY_INIT', () => { expect(store.setSelection).toHaveBeenCalledWith({ storyId: 'kind--story' }); }); }); - -describe('story filters for module exports', () => { - it('should exclude __esModule', () => { - expect(isExportStory('__esModule', {})).toBeFalsy(); - }); - - it('should include all stories when there are no filters', () => { - expect(isExportStory('a', {})).toBeTruthy(); - }); - - it('should filter stories by arrays', () => { - expect(isExportStory('a', { includeStories: ['a'] })).toBeTruthy(); - expect(isExportStory('a', { includeStories: [] })).toBeFalsy(); - expect(isExportStory('a', { includeStories: ['b'] })).toBeFalsy(); - - expect(isExportStory('a', { excludeStories: ['a'] })).toBeFalsy(); - expect(isExportStory('a', { excludeStories: [] })).toBeTruthy(); - expect(isExportStory('a', { excludeStories: ['b'] })).toBeTruthy(); - - expect(isExportStory('a', { includeStories: ['a'], excludeStories: ['a'] })).toBeFalsy(); - expect(isExportStory('a', { includeStories: [], excludeStories: [] })).toBeFalsy(); - expect(isExportStory('a', { includeStories: ['a'], excludeStories: ['b'] })).toBeTruthy(); - }); - - it('should filter stories by regex', () => { - expect(isExportStory('a', { includeStories: /a/ })).toBeTruthy(); - expect(isExportStory('a', { includeStories: /.*/ })).toBeTruthy(); - expect(isExportStory('a', { includeStories: /b/ })).toBeFalsy(); - - expect(isExportStory('a', { excludeStories: /a/ })).toBeFalsy(); - expect(isExportStory('a', { excludeStories: /.*/ })).toBeFalsy(); - expect(isExportStory('a', { excludeStories: /b/ })).toBeTruthy(); - - expect(isExportStory('a', { includeStories: /a/, excludeStories: ['a'] })).toBeFalsy(); - expect(isExportStory('a', { includeStories: /.*/, excludeStories: /.*/ })).toBeFalsy(); - expect(isExportStory('a', { includeStories: /a/, excludeStories: /b/ })).toBeTruthy(); - }); -}); diff --git a/lib/core/src/client/preview/url.js b/lib/core/src/client/preview/url.js index 47daf2130de..93f81c42678 100644 --- a/lib/core/src/client/preview/url.js +++ b/lib/core/src/client/preview/url.js @@ -1,6 +1,6 @@ import { history, document } from 'global'; import qs from 'qs'; -import { toId } from '@storybook/router/utils'; +import { toId } from '@storybook/csf'; export function pathToId(path) { const match = (path || '').match(/^\/story\/(.+)/); diff --git a/lib/core/src/server/common/babel.js b/lib/core/src/server/common/babel.js index e942fbc74b2..8c5d84c4161 100644 --- a/lib/core/src/server/common/babel.js +++ b/lib/core/src/server/common/babel.js @@ -15,6 +15,7 @@ export default ({ configType }) => { const prodPresets = isProd ? createProdPresets() : []; return { + sourceType: 'unambiguous', presets: [ [ require.resolve('@babel/preset-env'), diff --git a/lib/core/src/server/config/utils.js b/lib/core/src/server/config/utils.js index c8e5ff29343..ee4fc7a2e02 100644 --- a/lib/core/src/server/config/utils.js +++ b/lib/core/src/server/config/utils.js @@ -1,9 +1,31 @@ import path from 'path'; import { getEnvironment } from 'lazy-universal-dotenv'; +import findUp from 'find-up'; -export const includePaths = [path.resolve('./')]; +const projectRoot = () => { + let result; + try { + result = result || path.join(findUp.sync('.git', { type: 'directory' }), '..'); + } catch (e) { + // + } + try { + result = result || path.join(findUp.sync('.svn', { type: 'directory' }), '..'); + } catch (e) { + // + } + try { + result = result || __dirname.split('node-modules')[0]; + } catch (e) { + // + } + + return result || process.cwd(); +}; + +export const includePaths = [projectRoot()]; export const nodeModulesPaths = path.resolve('./node_modules'); -export const excludePaths = [nodeModulesPaths]; +export const excludePaths = [/node_modules/]; const nodePathsToArray = nodePath => nodePath diff --git a/lib/core/src/server/presets.js b/lib/core/src/server/presets.js index 027a13ad8c5..411573f2e1e 100644 --- a/lib/core/src/server/presets.js +++ b/lib/core/src/server/presets.js @@ -43,7 +43,7 @@ function loadPreset(input, level, storybookOptions) { return [ ...loadPresets(subPresets, level + 1, storybookOptions), { - name: input, + name, preset: rest, options: presetOptions, }, @@ -100,7 +100,7 @@ function applyPresets(presets, extension, config, args) { const context = { extensionFn, preset, - combinedOptions: { ...args, ...options }, + combinedOptions: { ...args, ...options, presetsList: presets }, }; return accumulationPromise.then(newConfig => diff --git a/lib/core/src/server/presets.test.js b/lib/core/src/server/presets.test.js index 977c463f099..613f4cddd5a 100644 --- a/lib/core/src/server/presets.test.js +++ b/lib/core/src/server/presets.test.js @@ -166,11 +166,17 @@ describe('presets', () => { await expect(testPresets()).resolves.toBeUndefined(); - expect(mockPresetFooExtendWebpack).toHaveBeenCalledWith(expect.anything(), { foo: 1 }); - expect(mockPresetBarExtendBabel).toHaveBeenCalledWith(expect.anything(), { bar: 'a' }); + expect(mockPresetFooExtendWebpack).toHaveBeenCalledWith(expect.anything(), { + foo: 1, + presetsList: expect.anything(), + }); + expect(mockPresetBarExtendBabel).toHaveBeenCalledWith(expect.anything(), { + bar: 'a', + presetsList: expect.anything(), + }); }); - it('loads and applies presets when they are declared as a string and as an object', async () => { + it('loads and applies presets when they are declared as a string and as an object', async () => { const mockPresetFooExtendWebpack = jest.fn(); const mockPresetBarExtendBabel = jest.fn(); @@ -184,7 +190,15 @@ describe('presets', () => { const getPresets = require.requireActual('./presets').default; const presets = wrapPreset( - getPresets(['preset-foo', { name: 'preset-bar', options: { bar: 'a' } }]) + getPresets([ + 'preset-foo', + { + name: 'preset-bar', + options: { + bar: 'a', + }, + }, + ]) ); async function testPresets() { @@ -195,7 +209,13 @@ describe('presets', () => { await expect(testPresets()).resolves.toBeUndefined(); expect(mockPresetFooExtendWebpack).toHaveBeenCalled(); - expect(mockPresetBarExtendBabel).toHaveBeenCalledWith(expect.anything(), { bar: 'a' }); + expect(mockPresetBarExtendBabel).toHaveBeenCalledWith(expect.anything(), { + bar: 'a', + presetsList: expect.arrayContaining([ + expect.objectContaining({ name: 'preset-foo' }), + expect.objectContaining({ name: 'preset-bar' }), + ]), + }); }); it('applies presets in chain', async () => { @@ -212,7 +232,19 @@ describe('presets', () => { const getPresets = require.requireActual('./presets').default; const presets = wrapPreset( - getPresets(['preset-foo', { name: 'preset-bar', options: { bar: 'a' } }]) + getPresets([ + 'preset-foo', + { + name: 'preset-bar', + options: { + bar: 'a', + presetsList: expect.arrayContaining([ + expect.objectContaining({ name: 'preset-foo' }), + expect.objectContaining({ name: 'preset-bar' }), + ]), + }, + }, + ]) ); async function testPresets() { @@ -223,7 +255,13 @@ describe('presets', () => { await expect(testPresets()).resolves.toBeUndefined(); expect(mockPresetFooExtendWebpack).toHaveBeenCalled(); - expect(mockPresetBarExtendWebpack).toHaveBeenCalledWith(expect.anything(), { bar: 'a' }); + expect(mockPresetBarExtendWebpack).toHaveBeenCalledWith(expect.anything(), { + bar: 'a', + presetsList: expect.arrayContaining([ + expect.objectContaining({ name: 'preset-foo' }), + expect.objectContaining({ name: 'preset-bar' }), + ]), + }); }); it('allows for presets to export presets array', async () => { diff --git a/lib/core/src/server/preview/base-webpack.config.js b/lib/core/src/server/preview/base-webpack.config.js index ef707aae285..87a87972683 100644 --- a/lib/core/src/server/preview/base-webpack.config.js +++ b/lib/core/src/server/preview/base-webpack.config.js @@ -3,7 +3,11 @@ import findUp from 'find-up'; import path from 'path'; import { logger } from '@storybook/node-logger'; -export async function createDefaultWebpackConfig(storybookBaseConfig) { +export async function createDefaultWebpackConfig(storybookBaseConfig, options) { + if (options.presetsList.some(({ name }) => name === '@storybook/preset-create-react-app')) { + return storybookBaseConfig; + } + const postcssConfigFiles = [ '.postcssrc', '.postcssrc.json', diff --git a/lib/core/src/server/preview/custom-webpack-preset.js b/lib/core/src/server/preview/custom-webpack-preset.js index a26b82c8cee..5b408c53f9e 100644 --- a/lib/core/src/server/preview/custom-webpack-preset.js +++ b/lib/core/src/server/preview/custom-webpack-preset.js @@ -6,7 +6,7 @@ import mergeConfigs from '../utils/merge-webpack-config'; import { createDefaultWebpackConfig } from './base-webpack.config'; async function createFinalDefaultConfig(presets, config, options) { - const defaultConfig = await createDefaultWebpackConfig(config); + const defaultConfig = await createDefaultWebpackConfig(config, options); return presets.apply('webpackFinal', defaultConfig, options); } diff --git a/lib/core/src/server/preview/iframe-webpack.config.js b/lib/core/src/server/preview/iframe-webpack.config.js index 6ce4caa9c60..937704ad09d 100644 --- a/lib/core/src/server/preview/iframe-webpack.config.js +++ b/lib/core/src/server/preview/iframe-webpack.config.js @@ -10,9 +10,9 @@ import VirtualModulePlugin from 'webpack-virtual-modules'; import resolveFrom from 'resolve-from'; -import babelLoader from '../common/babel-loader'; -import { loadEnv, nodeModulesPaths } from '../config/utils'; -import { getPreviewBodyHtml, getPreviewHeadHtml } from '../utils/template'; +import createBabelLoader from '../common/babel-loader'; +import { nodeModulesPaths, loadEnv } from '../config/utils'; +import { getPreviewHeadHtml, getPreviewBodyHtml } from '../utils/template'; import { toRequireContextString } from './to-require-context'; const reactPaths = {}; @@ -35,6 +35,7 @@ export default ({ framework, }) => { const { raw, stringified } = loadEnv({ production: true }); + const babelLoader = createBabelLoader(babelOptions); const isProd = configType === 'PRODUCTION'; return { @@ -88,7 +89,7 @@ export default ({ ].filter(Boolean), module: { rules: [ - babelLoader(babelOptions), + babelLoader, { test: /\.md$/, use: [ diff --git a/lib/node-logger/package.json b/lib/node-logger/package.json index 6ec509e72fd..e786cd7caa8 100644 --- a/lib/node-logger/package.json +++ b/lib/node-logger/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/node-logger", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "", "keywords": [ "storybook" @@ -39,5 +39,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/postinstall/package.json b/lib/postinstall/package.json index af2e8986596..644be1f51fe 100644 --- a/lib/postinstall/package.json +++ b/lib/postinstall/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/postinstall", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Storybook addons postinstall utilities", "keywords": [ "api", @@ -36,5 +36,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/router/package.json b/lib/router/package.json index aada61ce6c2..4b3842d88f5 100644 --- a/lib/router/package.json +++ b/lib/router/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/router", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Core Storybook Router", "keywords": [ "storybook" @@ -28,6 +28,7 @@ }, "dependencies": { "@reach/router": "^1.2.1", + "@storybook/csf": "0.0.1", "@types/reach__router": "^1.2.3", "core-js": "^3.0.1", "global": "^4.3.2", @@ -41,5 +42,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/router/src/utils.test.js b/lib/router/src/utils.test.js deleted file mode 100644 index 57a9bf40edf..00000000000 --- a/lib/router/src/utils.test.js +++ /dev/null @@ -1,53 +0,0 @@ -import { toId, storyNameFromExport } from './utils'; - -describe('toId', () => { - [ - // name, kind, story, output - ['handles simple cases', 'kind', 'story', 'kind--story'], - ['handles basic substitution', 'a b$c?d😀e', '1-2:3', 'a-b-c-d😀e--1-2-3'], - ['handles runs of non-url chars', 'a?&*b', 'story', 'a-b--story'], - ['removes non-url chars from start and end', '?ab-', 'story', 'ab--story'], - ['downcases', 'KIND', 'STORY', 'kind--story'], - ['non-latin', 'Кнопки', 'нормальный', 'кнопки--нормальный'], - ['korean', 'kind', '바보 (babo)', 'kind--바보-babo'], - ['all punctuation', 'kind', 'unicorns,’–—―′¿`"<>()!.!!!{}[]%^&$*#&', 'kind--unicorns'], - ].forEach(([name, kind, story, output]) => { - it(name, () => { - expect(toId(kind, story)).toBe(output); - }); - }); - - it('does not allow kind with *no* url chars', () => { - expect(() => toId('?', 'asdf')).toThrow( - `Invalid kind '?', must include alphanumeric characters` - ); - }); - - it('does not allow empty kind', () => { - expect(() => toId('', 'asdf')).toThrow(`Invalid kind '', must include alphanumeric characters`); - }); - - it('does not allow story with *no* url chars', () => { - expect(() => toId('kind', '?')).toThrow( - `Invalid name '?', must include alphanumeric characters` - ); - }); - - it('does not allow empty story', () => { - expect(() => toId('kind', '')).toThrow(`Invalid name '', must include alphanumeric characters`); - }); -}); - -describe('storyNameFromExport', () => { - it('should format CSF exports with sensible defaults', () => { - const testCases = { - name: 'Name', - someName: 'Some Name', - someNAME: 'Some NAME', - some_custom_NAME: 'Some Custom NAME', - someName1234: 'Some Name 1234', - someName1_2_3_4: 'Some Name 1 2 3 4', - }; - Object.entries(testCases).forEach(([key, val]) => expect(storyNameFromExport(key)).toBe(val)); - }); -}); diff --git a/lib/router/src/utils.ts b/lib/router/src/utils.ts index c094db1d092..97bac2a40ea 100644 --- a/lib/router/src/utils.ts +++ b/lib/router/src/utils.ts @@ -1,43 +1,16 @@ import qs from 'qs'; import memoize from 'memoizerific'; -import startCase from 'lodash/startCase'; + +// FIXME: Remove in SB 6.0 +export { toId, parseKind, sanitize } from '@storybook/csf'; interface StoryData { viewMode?: string; storyId?: string; } -interface SeparatorOptions { - rootSeparator: string | RegExp; - groupSeparator: string | RegExp; -} - const splitPathRegex = /\/([^/]+)\/([^/]+)?/; -// Remove punctuation https://gist.github.com/davidjrice/9d2af51100e41c6c4b4a -export const sanitize = (string: string) => { - return ( - string - .toLowerCase() - // eslint-disable-next-line no-useless-escape - .replace(/[ ’–—―′¿'`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '-') - .replace(/-+/g, '-') - .replace(/^-+/, '') - .replace(/-+$/, '') - ); -}; - -const sanitizeSafe = (string: string, part: string) => { - const sanitized = sanitize(string); - if (sanitized === '') { - throw new Error(`Invalid ${part} '${string}', must include alphanumeric characters`); - } - return sanitized; -}; - -export const toId = (kind: string, name: string) => - `${sanitizeSafe(kind, 'kind')}--${sanitizeSafe(name, 'name')}`; - export const parsePath: (path?: string) => StoryData = memoize(1000)( (path: string | undefined | null) => { const result: StoryData = { @@ -83,17 +56,3 @@ export const getMatch = memoize(1000)((current: string, target: string, startsWi } return null; }); - -export const parseKind = (kind: string, { rootSeparator, groupSeparator }: SeparatorOptions) => { - const [root, remainder] = kind.split(rootSeparator, 2); - const groups = (remainder || kind).split(groupSeparator).filter(i => !!i); - - // when there's no remainder, it means the root wasn't found/split - return { - root: remainder ? root : null, - groups, - }; -}; - -// Transform the CSF named export into a readable story name -export const storyNameFromExport = (key: string) => startCase(key); diff --git a/lib/source-loader/package.json b/lib/source-loader/package.json index bc7c9f6c91b..30bbf95bab2 100644 --- a/lib/source-loader/package.json +++ b/lib/source-loader/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/source-loader", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Source loader", "keywords": [ "lib", @@ -28,9 +28,9 @@ "prepare": "node ../../scripts/prepare.js" }, "dependencies": { - "@storybook/addons": "5.3.0-beta.16", - "@storybook/client-logger": "5.3.0-beta.16", - "@storybook/router": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/client-logger": "5.3.0-rc.0", + "@storybook/csf": "0.0.1", "core-js": "^3.0.1", "estraverse": "^4.2.0", "global": "^4.3.2", @@ -41,5 +41,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/source-loader/src/server/abstract-syntax-tree/__snapshots__/inject-decorator.csf.test.js.snap b/lib/source-loader/src/server/abstract-syntax-tree/__snapshots__/inject-decorator.csf.test.js.snap index 3721312e035..f9a49b512b4 100644 --- a/lib/source-loader/src/server/abstract-syntax-tree/__snapshots__/inject-decorator.csf.test.js.snap +++ b/lib/source-loader/src/server/abstract-syntax-tree/__snapshots__/inject-decorator.csf.test.js.snap @@ -5,13 +5,15 @@ exports[`inject-decorator positive - ts - csf includes storySource parameter in import { action } from \\"@storybook/addon-actions\\"; import { Button } from \\"@storybook/react/demo\\"; -export default {parameters: {\\"storySource\\":{\\"source\\":\\"import React from \\\\\\"react\\\\\\";\\\\nimport { action } from \\\\\\"@storybook/addon-actions\\\\\\";\\\\nimport { Button } from \\\\\\"@storybook/react/demo\\\\\\";\\\\n\\\\nexport default {\\\\n title: \\\\\\"Button\\\\\\"\\\\n};\\\\n\\\\nexport const text = () => (\\\\n \\\\n);\\\\n\\\\nexport const emoji = () => (\\\\n \\\\n);\\\\n\\",\\"locationsMap\\":{\\"button--text\\":{\\"startLoc\\":{\\"col\\":20,\\"line\\":9},\\"endLoc\\":{\\"col\\":1,\\"line\\":11},\\"startBody\\":{\\"col\\":20,\\"line\\":9},\\"endBody\\":{\\"col\\":1,\\"line\\":11}},\\"button--emoji\\":{\\"startLoc\\":{\\"col\\":21,\\"line\\":13},\\"endLoc\\":{\\"col\\":1,\\"line\\":19},\\"startBody\\":{\\"col\\":21,\\"line\\":13},\\"endBody\\":{\\"col\\":1,\\"line\\":19}}}},}, - title: \\"Button\\" +export default {parameters: {\\"storySource\\":{\\"source\\":\\"import React from \\\\\\"react\\\\\\";\\\\nimport { action } from \\\\\\"@storybook/addon-actions\\\\\\";\\\\nimport { Button } from \\\\\\"@storybook/react/demo\\\\\\";\\\\n\\\\nexport default {\\\\n title: \\\\\\"Button\\\\\\",\\\\n excludeStories: [\\\\\\"text\\\\\\"],\\\\n includeStories: /emoji.*/\\\\n};\\\\n\\\\nexport const text = () => (\\\\n \\\\n);\\\\n\\\\nexport const emoji = () => (\\\\n \\\\n);\\\\n\\\\nexport function emojiFn() {\\\\n return (\\\\n \\\\n )\\\\n};\\\\n\\",\\"locationsMap\\":{\\"button--text\\":{\\"startLoc\\":{\\"col\\":20,\\"line\\":11},\\"endLoc\\":{\\"col\\":1,\\"line\\":13},\\"startBody\\":{\\"col\\":20,\\"line\\":11},\\"endBody\\":{\\"col\\":1,\\"line\\":13}},\\"button--emoji\\":{\\"startLoc\\":{\\"col\\":21,\\"line\\":15},\\"endLoc\\":{\\"col\\":1,\\"line\\":21},\\"startBody\\":{\\"col\\":21,\\"line\\":15},\\"endBody\\":{\\"col\\":1,\\"line\\":21}},\\"button--emoji-fn\\":{\\"startLoc\\":{\\"col\\":7,\\"line\\":23},\\"endLoc\\":{\\"col\\":1,\\"line\\":31},\\"startBody\\":{\\"col\\":7,\\"line\\":23},\\"endBody\\":{\\"col\\":1,\\"line\\":31}}}},}, + title: \\"Button\\", + excludeStories: [\\"text\\"], + includeStories: /emoji.*/ }; -export const text = addSourceDecorator(() => ( +export const text = () => ( -), {__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__});; +); export const emoji = addSourceDecorator(() => ( -), {__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__}); +), {__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__});; + +export const emojiFn = addSourceDecorator(function emojiFn() { + return ( + + ) +}, {__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__}); " `; diff --git a/lib/source-loader/src/server/abstract-syntax-tree/generate-helpers.js b/lib/source-loader/src/server/abstract-syntax-tree/generate-helpers.js index 4f1ec791427..5c77a0b0846 100644 --- a/lib/source-loader/src/server/abstract-syntax-tree/generate-helpers.js +++ b/lib/source-loader/src/server/abstract-syntax-tree/generate-helpers.js @@ -68,7 +68,9 @@ const STORY_DECORATOR_STATEMENT = const ADD_PARAMETERS_STATEMENT = '.addParameters({ storySource: { source: __STORY__, locationsMap: __ADDS_MAP__ } })'; const applyExportDecoratorStatement = part => - ` addSourceDecorator(${part}, {__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__});`; + part.declaration.isVariableDeclaration + ? ` addSourceDecorator(${part.source}, {__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__});` + : ` const ${part.declaration.ident} = addSourceDecorator(${part.source}, {__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__});`; export function generateSourceWithDecorators(source, ast, withParameters) { const { comments = [] } = ast; @@ -91,7 +93,7 @@ export function generateSourceWithDecorators(source, ast, withParameters) { const partsUsingExports = splitExports(ast, source); const newSource = partsUsingExports - .map((part, i) => (i % 2 === 0 ? part : applyExportDecoratorStatement(part))) + .map((part, i) => (i % 2 === 0 ? part.source : applyExportDecoratorStatement(part))) .join(''); return { diff --git a/lib/source-loader/src/server/abstract-syntax-tree/parse-helpers.js b/lib/source-loader/src/server/abstract-syntax-tree/parse-helpers.js index a96ed14b094..7da7f744c78 100644 --- a/lib/source-loader/src/server/abstract-syntax-tree/parse-helpers.js +++ b/lib/source-loader/src/server/abstract-syntax-tree/parse-helpers.js @@ -1,4 +1,4 @@ -const { toId } = require('@storybook/router/utils'); +const { toId } = require('@storybook/csf'); const STORIES_OF = 'storiesOf'; diff --git a/lib/source-loader/src/server/abstract-syntax-tree/traverse-helpers.js b/lib/source-loader/src/server/abstract-syntax-tree/traverse-helpers.js index be8ba109600..f80ae30b22f 100644 --- a/lib/source-loader/src/server/abstract-syntax-tree/traverse-helpers.js +++ b/lib/source-loader/src/server/abstract-syntax-tree/traverse-helpers.js @@ -1,4 +1,4 @@ -import { storyNameFromExport } from '@storybook/router/utils'; +import { storyNameFromExport, isExportStory } from '@storybook/csf'; import { handleADD, handleSTORYOF, patchNode, handleExportedName } from './parse-helpers'; const estraverse = require('estraverse'); @@ -20,36 +20,119 @@ export function splitSTORYOF(ast, source) { return parts; } + +function isFunctionVariable(declarations, includeExclude) { + return ( + declarations && + declarations.length === 1 && + declarations[0].type === 'VariableDeclarator' && + declarations[0].id && + declarations[0].id.name && + declarations[0].init && + ['CallExpression', 'ArrowFunctionExpression', 'FunctionExpression'].includes( + declarations[0].init.type + ) && + isExportStory(declarations[0].id.name, includeExclude) + ); +} + +function isFunctionDeclaration(declaration, includeExclude) { + return ( + declaration.type === 'FunctionDeclaration' && + declaration.id && + declaration.id.name && + isExportStory(declaration.id.name, includeExclude) + ); +} + +function getDescriptor(metaDeclaration, propertyName) { + const property = + metaDeclaration && + metaDeclaration.declaration && + metaDeclaration.declaration.properties.find(p => p.key && p.key.name === propertyName); + if (!property) { + return undefined; + } + + const { type } = property.value; + + switch (type) { + case 'ArrayExpression': + return property.value.elements.map(t => { + if (!['StringLiteral', 'Literal'].includes(t.type)) { + throw new Error(`Unexpected descriptor element: ${t.type}`); + } + return t.value; + }); + case 'Literal': + case 'RegExpLiteral': + return property.value.value; + default: + throw new Error(`Unexpected descriptor: ${type}`); + } +} + +function findIncludeExclude(ast) { + const program = (ast && ast.program) || ast; + const metaDeclaration = + program && + program.body && + program.body.find( + d => + d.type === 'ExportDefaultDeclaration' && + d.declaration.type === 'ObjectExpression' && + (d.declaration.properties || []).length + ); + + const includeStories = getDescriptor(metaDeclaration, 'includeStories'); + const excludeStories = getDescriptor(metaDeclaration, 'excludeStories'); + + return { + includeStories, + excludeStories, + }; +} + export function splitExports(ast, source) { const parts = []; let lastIndex = 0; + const includeExclude = findIncludeExclude(ast); + estraverse.traverse(ast, { fallback: 'iteration', enter: node => { patchNode(node); - if ( - node.type === 'ExportNamedDeclaration' && - node.declaration && - node.declaration.declarations && - node.declaration.declarations.length === 1 && - node.declaration.declarations[0].type === 'VariableDeclarator' && - node.declaration.declarations[0].id && - node.declaration.declarations[0].id.name && - node.declaration.declarations[0].init && - ['CallExpression', 'ArrowFunctionExpression', 'FunctionExpression'].includes( - node.declaration.declarations[0].init.type - ) - ) { - const functionNode = node.declaration.declarations[0].init; - parts.push(source.substring(lastIndex, functionNode.start - 1)); - parts.push(source.substring(functionNode.start, functionNode.end)); + + const isNamedExport = node.type === 'ExportNamedDeclaration' && node.declaration; + + const isFunctionVariableExport = + isNamedExport && isFunctionVariable(node.declaration.declarations, includeExclude); + const isFunctionDeclarationExport = + isNamedExport && isFunctionDeclaration(node.declaration, includeExclude); + + if (isFunctionDeclarationExport || isFunctionVariableExport) { + const functionNode = isFunctionVariableExport + ? node.declaration.declarations[0].init + : node.declaration; + parts.push({ + source: source.substring(lastIndex, functionNode.start - 1), + }); + parts.push({ + source: source.substring(functionNode.start, functionNode.end), + declaration: { + isVariableDeclaration: isFunctionVariableExport, + ident: isFunctionVariableExport + ? node.declaration.declarations[0].id.name + : functionNode.id.name, + }, + }); lastIndex = functionNode.end; } }, }); - if (source.length > lastIndex + 1) parts.push(source.substring(lastIndex + 1)); + if (source.length > lastIndex + 1) parts.push({ source: source.substring(lastIndex + 1) }); if (parts.length === 1) return [source]; return parts; } @@ -110,9 +193,11 @@ export function findExportsMap(ast) { fallback: 'iteration', enter: node => { patchNode(node); - if ( - node.type === 'ExportNamedDeclaration' && - node.declaration && + + const isNamedExport = node.type === 'ExportNamedDeclaration' && node.declaration; + + const isFunctionVariableExport = + isNamedExport && node.declaration.declarations && node.declaration.declarations.length === 1 && node.declaration.declarations[0].type === 'VariableDeclarator' && @@ -121,10 +206,24 @@ export function findExportsMap(ast) { node.declaration.declarations[0].init && ['CallExpression', 'ArrowFunctionExpression', 'FunctionExpression'].includes( node.declaration.declarations[0].init.type - ) - ) { - const storyName = storyNameFromExport(node.declaration.declarations[0].id.name); - const toAdd = handleExportedName(title, storyName, node.declaration.declarations[0].init); + ); + + const isFunctionDeclarationExport = + isNamedExport && + node.declaration.type === 'FunctionDeclaration' && + node.declaration.id && + node.declaration.id.name; + + if (isFunctionDeclarationExport || isFunctionVariableExport) { + const exportDeclaration = isFunctionVariableExport + ? node.declaration.declarations[0] + : node.declaration; + const storyName = storyNameFromExport(exportDeclaration.id.name); + const toAdd = handleExportedName( + title, + storyName, + exportDeclaration.init || exportDeclaration + ); Object.assign(addsMap, toAdd); } }, diff --git a/lib/theming/package.json b/lib/theming/package.json index c5e20a3b653..81ea79c8eaa 100644 --- a/lib/theming/package.json +++ b/lib/theming/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/theming", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Core Storybook Components", "keywords": [ "storybook" @@ -29,7 +29,7 @@ "dependencies": { "@emotion/core": "^10.0.20", "@emotion/styled": "^10.0.17", - "@storybook/client-logger": "5.3.0-beta.16", + "@storybook/client-logger": "5.3.0-rc.0", "core-js": "^3.0.1", "deep-object-diff": "^1.1.0", "emotion-theming": "^10.0.19", @@ -46,5 +46,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/ui/package.json b/lib/ui/package.json index a424ea59ad7..1a5c0f0cd17 100644 --- a/lib/ui/package.json +++ b/lib/ui/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/ui", - "version": "5.3.0-beta.16", + "version": "5.3.0-rc.0", "description": "Core Storybook UI", "keywords": [ "storybook" @@ -28,14 +28,14 @@ }, "dependencies": { "@emotion/core": "^10.0.20", - "@storybook/addons": "5.3.0-beta.16", - "@storybook/api": "5.3.0-beta.16", - "@storybook/channels": "5.3.0-beta.16", - "@storybook/client-logger": "5.3.0-beta.16", - "@storybook/components": "5.3.0-beta.16", - "@storybook/core-events": "5.3.0-beta.16", - "@storybook/router": "5.3.0-beta.16", - "@storybook/theming": "5.3.0-beta.16", + "@storybook/addons": "5.3.0-rc.0", + "@storybook/api": "5.3.0-rc.0", + "@storybook/channels": "5.3.0-rc.0", + "@storybook/client-logger": "5.3.0-rc.0", + "@storybook/components": "5.3.0-rc.0", + "@storybook/core-events": "5.3.0-rc.0", + "@storybook/router": "5.3.0-rc.0", + "@storybook/theming": "5.3.0-rc.0", "copy-to-clipboard": "^3.0.8", "core-js": "^3.0.1", "core-js-pure": "^3.0.1", @@ -63,8 +63,8 @@ "util-deprecate": "^1.0.2" }, "devDependencies": { - "@storybook/addon-actions": "5.3.0-beta.16", - "@storybook/addon-knobs": "5.3.0-beta.16", + "@storybook/addon-actions": "5.3.0-rc.0", + "@storybook/addon-knobs": "5.3.0-rc.0", "corejs-upgrade-webpack-plugin": "^2.2.0", "flush-promises": "^1.0.2", "terser-webpack-plugin": "^2.1.2", @@ -72,5 +72,6 @@ }, "publishConfig": { "access": "public" - } + }, + "gitHead": "6ad2664adf18b50ea3ce015cbae2ff3e9a60cc4a" } diff --git a/lib/ui/src/app.js b/lib/ui/src/app.js index a090fc16c73..39459c5437a 100644 --- a/lib/ui/src/app.js +++ b/lib/ui/src/app.js @@ -41,7 +41,7 @@ const View = styled.div({ width: '100vw', }); -const App = React.memo(({ viewMode, layout, panelCount, size: { width, height } }) => { +const App = React.memo(({ viewMode, docsOnly, layout, panelCount, size: { width, height } }) => { const props = createProps(); let content; @@ -60,6 +60,7 @@ const App = React.memo(({ viewMode, layout, panelCount, size: { width, height } {...props} viewMode={viewMode} options={layout} + docsOnly={docsOnly} {...{ width, height }} panelCount={panelCount} /> @@ -81,9 +82,11 @@ App.propTypes = { width: PropTypes.number, height: PropTypes.number, }).isRequired, + docsOnly: PropTypes.bool, }; App.defaultProps = { viewMode: undefined, + docsOnly: false, }; const SizedApp = sizeMe({ monitorHeight: true })(App); diff --git a/lib/ui/src/components/layout/container.js b/lib/ui/src/components/layout/container.js index 8bd3d5b4a11..72fbf2cf33f 100644 --- a/lib/ui/src/components/layout/container.js +++ b/lib/ui/src/components/layout/container.js @@ -88,7 +88,7 @@ const Paper = styled.div( isFullscreen ? { boxShadow: 'none', - borderRadius: '0', + borderRadius: 0, } : { background: theme.background.content, @@ -405,13 +405,17 @@ class Layout extends Component { }; render() { - const { children, bounds, options, theme, viewMode, panelCount } = this.props; + const { children, bounds, options, theme, viewMode, docsOnly, panelCount } = this.props; const { isDragging, resizerNav, resizerPanel } = this.state; const margin = theme.layoutMargin; const isNavHidden = options.isFullscreen || !options.showNav; const isPanelHidden = - options.isFullscreen || !options.showPanel || viewMode !== 'story' || panelCount === 0; + options.isFullscreen || + !options.showPanel || + docsOnly || + viewMode !== 'story' || + panelCount === 0; const isFullscreen = options.isFullscreen || (isNavHidden && isPanelHidden); const { isToolshown } = options; @@ -494,6 +498,7 @@ class Layout extends Component { }, previewProps: { viewMode, + docsOnly, animate: !isDragging, isFullscreen, isToolshown, @@ -554,10 +559,12 @@ Layout.propTypes = { isToolshown: PropTypes.bool.isRequired, }).isRequired, viewMode: PropTypes.string, + docsOnly: PropTypes.bool, theme: PropTypes.shape({ layoutMargin: PropTypes.number }).isRequired, }; Layout.defaultProps = { viewMode: undefined, + docsOnly: false, }; const ThemedLayout = withTheme(Layout); diff --git a/lib/ui/src/components/layout/desktop.js b/lib/ui/src/components/layout/desktop.js index 0fc282a57cc..5e2cc88a25f 100644 --- a/lib/ui/src/components/layout/desktop.js +++ b/lib/ui/src/components/layout/desktop.js @@ -4,7 +4,19 @@ import PropTypes from 'prop-types'; import * as S from './container'; const Desktop = React.memo( - ({ Panel, Nav, Preview, Notifications, pages, options, viewMode, width, height, panelCount }) => ( + ({ + Panel, + Nav, + Preview, + Notifications, + pages, + options, + viewMode, + width, + height, + panelCount, + docsOnly, + }) => ( {({ navProps, mainProps, panelProps, previewProps }) => ( @@ -72,9 +85,11 @@ Desktop.propTypes = { isToolshown: PropTypes.bool.isRequired, }).isRequired, viewMode: PropTypes.string, + docsOnly: PropTypes.bool, }; Desktop.defaultProps = { viewMode: undefined, + docsOnly: false, height: 0, width: 0, }; diff --git a/lib/ui/src/components/preview/preview.js b/lib/ui/src/components/preview/preview.js index 22d703ea924..aa1461ad04e 100644 --- a/lib/ui/src/components/preview/preview.js +++ b/lib/ui/src/components/preview/preview.js @@ -84,7 +84,19 @@ const defaultWrappers = [ ]; const getTools = memoize(10)( - (getElements, queryParams, panels, api, options, storyId, viewMode, location, path, baseUrl) => { + ( + getElements, + queryParams, + panels, + api, + options, + storyId, + viewMode, + docsOnly, + location, + path, + baseUrl + ) => { const tools = getElementList(getElements, types.TOOL, [ panels.filter(p => p.id !== 'canvas').length ? { @@ -169,9 +181,16 @@ const getTools = memoize(10)( ), }, ]); - + // if its a docsOnly page, even the 'story' view mode is considered 'docs' const filter = item => - item && (!item.match || item.match({ storyId, viewMode, location, path })); + item && + (!item.match || + item.match({ + storyId, + viewMode: docsOnly && viewMode === 'story' ? 'docs' : viewMode, + location, + path, + })); const displayItems = list => list.reduce( @@ -199,13 +218,14 @@ const getDocumentTitle = description => { }; class Preview extends Component { - shouldComponentUpdate({ storyId, viewMode, options, queryParams }) { + shouldComponentUpdate({ storyId, viewMode, docsOnly, options, queryParams }) { const { props } = this; return ( options.isFullscreen !== props.options.isFullscreen || options.isToolshown !== props.options.isToolshown || viewMode !== props.viewMode || + docsOnly !== props.docsOnly || storyId !== props.storyId || queryParams !== props.queryParams ); @@ -225,6 +245,7 @@ class Preview extends Component { path, location, viewMode, + docsOnly, storyId, queryParams, getElements, @@ -272,6 +293,7 @@ class Preview extends Component { options, storyId, viewMode, + docsOnly, location, path, baseUrl @@ -322,10 +344,12 @@ Preview.propTypes = { isToolshown: PropTypes.bool, }).isRequired, baseUrl: PropTypes.string, + docsOnly: PropTypes.bool, }; Preview.defaultProps = { viewMode: undefined, + docsOnly: false, storyId: undefined, path: undefined, description: undefined, diff --git a/lib/ui/src/components/sidebar/Sidebar.tsx b/lib/ui/src/components/sidebar/Sidebar.tsx index 071cf207f01..544661d6a02 100644 --- a/lib/ui/src/components/sidebar/Sidebar.tsx +++ b/lib/ui/src/components/sidebar/Sidebar.tsx @@ -13,7 +13,7 @@ const Heading = styled(SidebarHeading)({ const Stories = styled(({ className, ...rest }) => ( -))(({ loading }) => (loading ? { marginTop: 8 } : {})); +))(({ loading }) => (loading ? { marginTop: 8, overflow: 'hidden' } : { overflow: 'hidden' })); const Container = styled.nav({ position: 'absolute', @@ -28,7 +28,7 @@ const Container = styled.nav({ const CustomScrollArea = styled(ScrollArea)({ '.simplebar-track.simplebar-vertical': { - right: '4px', + right: 4, }, }); diff --git a/lib/ui/src/components/sidebar/SidebarHeading.tsx b/lib/ui/src/components/sidebar/SidebarHeading.tsx index 94c92abb488..47fa203795f 100644 --- a/lib/ui/src/components/sidebar/SidebarHeading.tsx +++ b/lib/ui/src/components/sidebar/SidebarHeading.tsx @@ -49,12 +49,12 @@ export type MenuButtonProps = ComponentProps & highlighted: boolean; }; -const MenuButton = styled(Button)(props => ({ +const MenuButton = styled(Button)(({ highlighted, theme }) => ({ position: 'relative', overflow: 'visible', padding: 7, - ...(props.highlighted && { + ...(highlighted && { '&:after': { content: '""', position: 'absolute', @@ -63,7 +63,7 @@ const MenuButton = styled(Button)(props => ({ width: 8, height: 8, borderRadius: 8, - background: `${props.theme.color.positive}`, + background: theme.color.positive, }, }), })); diff --git a/lib/ui/src/components/sidebar/SidebarItem.tsx b/lib/ui/src/components/sidebar/SidebarItem.tsx index 3e9da2e8a36..60e3c15b238 100644 --- a/lib/ui/src/components/sidebar/SidebarItem.tsx +++ b/lib/ui/src/components/sidebar/SidebarItem.tsx @@ -2,6 +2,7 @@ import React, { ComponentProps } from 'react'; import { styled } from '@storybook/theming'; import { opacify, transparentize } from 'polished'; import { Icons } from '@storybook/components'; +import { DOCS_MODE } from 'global'; export type ExpanderProps = ComponentProps<'span'> & { isExpanded?: boolean; @@ -50,7 +51,7 @@ const Icon = styled(Icons)( if (icon === 'component') { return { color: '#1ea7fd' }; } - if (icon === 'bookmarkhollow') { + if (icon === 'bookmarkhollow' || (DOCS_MODE && icon === 'document')) { return { color: '#37d5d3' }; } if (icon === 'document') { diff --git a/lib/ui/src/components/sidebar/SidebarSearch.tsx b/lib/ui/src/components/sidebar/SidebarSearch.tsx index ace8f79c689..ee83b3b2805 100644 --- a/lib/ui/src/components/sidebar/SidebarSearch.tsx +++ b/lib/ui/src/components/sidebar/SidebarSearch.tsx @@ -66,45 +66,42 @@ export type FilterFormProps = ComponentProps<'form'> & { focussed: boolean; }; -const FilterForm = styled.form( - ({ theme, focussed }) => - ({ +const FilterForm = styled.form(({ theme, focussed }) => ({ + transition: 'all 150ms ease-out', + borderBottom: '1px solid transparent', + borderBottomColor: focussed + ? opacify(0.3, theme.appBorderColor) + : opacify(0.1, theme.appBorderColor), + outline: 0, + position: 'relative', + + input: { + color: theme.input.color, + fontSize: theme.typography.size.s2 - 1, + lineHeight: '20px', + paddingTop: 2, + paddingBottom: 2, + paddingLeft: 20, + }, + + '> svg': { + transition: 'all 150ms ease-out', + position: 'absolute', + top: '50%', + height: 12, + width: 12, + transform: 'translateY(-50%)', + zIndex: 1, + + background: 'transparent', + + path: { transition: 'all 150ms ease-out', - borderBottom: '1px solid transparent', - borderBottomColor: focussed - ? opacify(0.3, theme.appBorderColor) - : opacify(0.1, theme.appBorderColor), - outline: 0, - position: 'relative', - - input: { - color: theme.input.color, - fontSize: theme.typography.size.s2 - 1, - lineHeight: '20px', - paddingTop: '2px', - paddingBottom: '2px', - paddingLeft: '20px', - }, - - '> svg': { - transition: 'all 150ms ease-out', - position: 'absolute', - top: '50%', - height: '12px', - width: '12px', - transform: 'translateY(-50%)', - zIndex: '1', - - background: 'transparent', - - path: { - transition: 'all 150ms ease-out', - fill: 'currentColor', - opacity: focussed ? 1 : 0.3, - }, - }, - } as any) // FIXME: emotion have hard time to provide '> svg' typing -); + fill: 'currentColor', + opacity: focussed ? 1 : 0.3, + }, + }, +})); export type PureSidebarSearchProps = FilterFieldProps & { onChange: (arg: string) => void; diff --git a/lib/ui/src/components/sidebar/treeview/treeview.js b/lib/ui/src/components/sidebar/treeview/treeview.js index a65d761b12d..a8f3e28c3e2 100644 --- a/lib/ui/src/components/sidebar/treeview/treeview.js +++ b/lib/ui/src/components/sidebar/treeview/treeview.js @@ -361,58 +361,50 @@ class TreeState extends PureComponent { return ( {Filter ? : null} - {roots.length || others.length ? ( - - {roots.map(({ id, name, children }) => ( -
- - {name} - - {children.map(key => ( - - ))} -
+ {!roots.length && !others.length && This filter resulted in 0 results} + + {others.length ? ( +
+ {others.map(({ id }) => ( + ))} - {others.length ? ( -
- {roots.length ? ( - - Others - - ) : null} - {others.map(({ id }) => ( - - ))} -
- ) : null} - - ) : ( - This filter resulted in 0 results - )} +
+ ) : null} + + {roots.map(({ id, name, children }) => ( +
+ + {name} + + {children.map(key => ( + + ))} +
+ ))}
); } diff --git a/lib/ui/src/components/sidebar/treeview/utils.js b/lib/ui/src/components/sidebar/treeview/utils.js index 84a77494a3f..79811c808ff 100644 --- a/lib/ui/src/components/sidebar/treeview/utils.js +++ b/lib/ui/src/components/sidebar/treeview/utils.js @@ -1,5 +1,6 @@ import memoize from 'memoizerific'; import Fuse from 'fuse.js'; +import { DOCS_MODE } from 'global'; const FUZZY_SEARCH_THRESHOLD = 0.4; @@ -25,10 +26,10 @@ export const keyEventToAction = ({ keyCode, ctrlKey, shiftKey, altKey, metaKey } return 'DOWN'; } case 37: { - return 'LEFT'; + return DOCS_MODE ? 'UP' : 'LEFT'; } case 39: { - return 'RIGHT'; + return DOCS_MODE ? 'DOWN' : 'RIGHT'; } default: { return false; diff --git a/lib/ui/src/containers/nav.js b/lib/ui/src/containers/nav.js index c50d79cf390..9bc5dc0533e 100755 --- a/lib/ui/src/containers/nav.js +++ b/lib/ui/src/containers/nav.js @@ -1,8 +1,10 @@ +import { DOCS_MODE } from 'global'; import React from 'react'; import memoize from 'memoizerific'; import { Badge } from '@storybook/components'; import { Consumer } from '@storybook/api'; +import { logger } from '@storybook/client-logger'; import { shortcutToHumanString } from '../libs/shortcut'; @@ -107,7 +109,66 @@ const createMenu = memoize(1)( ] ); -const collapseDocsOnlyStories = storiesHash => { +export const collapseAllStories = stories => { + // keep track of component IDs that have been rewritten to the ID of their first leaf child + const componentIdToLeafId = {}; + + // 1) remove all leaves + const leavesRemoved = Object.values(stories).filter(item => !item.isLeaf); + + // 2) make all components leaves and rewrite their ID's to the first leaf child + const componentsFlattened = leavesRemoved.map(item => { + const { id, isComponent, children, ...rest } = item; + const nonLeafChildren = []; + const leafChildren = []; + children.forEach(child => (stories[child].isLeaf ? leafChildren : nonLeafChildren).push(child)); + + if (leafChildren.length === 0) { + return item; // pass through, we'll handle you later + } + + const leafId = leafChildren[0]; + const component = { ...rest, id: leafId, isLeaf: true, isComponent: true }; + componentIdToLeafId[id] = leafId; + + if ( + (isComponent && nonLeafChildren.length > 0) || + (!isComponent && nonLeafChildren.length === 0) + ) { + throw new Error( + `Unexpected '${item.id}': ${JSON.stringify({ isComponent, nonLeafChildren })}` + ); + } + + if (nonLeafChildren.length > 0) { + logger.error( + `Node ${item.id} contains non-leaf nodes that are getting removed: ${nonLeafChildren}!` + ); + } + + return component; + }); + + // 3) rewrite all the children as needed + const childrenRewritten = componentsFlattened.map(item => { + if (item.isLeaf) { + return item; + } + + const { children, ...rest } = item; + const rewritten = children.map(child => componentIdToLeafId[child] || child); + + return { children: rewritten, ...rest }; + }); + + const result = {}; + childrenRewritten.forEach(item => { + result[item.id] = item; + }); + return result; +}; + +export const collapseDocsOnlyStories = storiesHash => { // keep track of component IDs that have been rewritten to the ID of their first leaf child const componentIdToLeafId = {}; const docsOnlyStoriesRemoved = Object.values(storiesHash).filter(item => { @@ -159,7 +220,10 @@ export const mapper = ({ state, api }) => { storiesHash, storiesConfigured, } = state; - const stories = collapseDocsOnlyStories(storiesHash); + const stories = DOCS_MODE + ? collapseAllStories(storiesHash) + : collapseDocsOnlyStories(storiesHash); + const shortcutKeys = api.getShortcutKeys(); return { loading: !storiesConfigured, diff --git a/lib/ui/src/containers/nav.test.js b/lib/ui/src/containers/nav.test.js new file mode 100644 index 00000000000..91ece2ac1fe --- /dev/null +++ b/lib/ui/src/containers/nav.test.js @@ -0,0 +1,69 @@ +import { collapseDocsOnlyStories, collapseAllStories } from './nav'; + +const docsOnly = { parameters: { docsOnly: true } }; +const root = { id: 'root', parent: false, children: ['a', 'b'] }; +const a = { id: 'a', isComponent: true, parent: 'root', children: ['a1'] }; +const a1 = { id: 'a1', isLeaf: true, parent: 'a' }; +const b = { id: 'b', isComponent: true, parent: 'root', children: ['b1', 'b2'] }; +const b1 = { id: 'b1', isLeaf: true, parent: 'b' }; +const b2 = { id: 'b2', isLeaf: true, parent: 'b' }; +const stories = { root, a, a1, b, b1, b2 }; + +describe('collapse docs-only stories', () => { + it('ignores normal stories', () => { + const filtered = collapseDocsOnlyStories(stories); + expect(filtered).toEqual(stories); + }); + + it('filters out docs-only stories', () => { + const hasDocsOnly = { + ...stories, + a1: { ...a1, ...docsOnly }, + }; + const filtered = collapseDocsOnlyStories(hasDocsOnly); + expect(filtered.a1).toEqual({ + id: 'a1', + isComponent: true, + isLeaf: true, + parent: 'root', + }); + }); +}); + +describe('collapse all stories', () => { + it('collapses normal stories', () => { + const collapsed = collapseAllStories(stories); + expect(collapsed).toEqual({ + a1: { + id: 'a1', + isComponent: true, + isLeaf: true, + parent: 'root', + }, + b1: { + id: 'b1', + isComponent: true, + isLeaf: true, + parent: 'root', + }, + root: { + children: ['a1', 'b1'], + id: 'root', + parent: false, + }, + }); + }); + it('collapses docs-only stories', () => { + const hasDocsOnly = { + ...stories, + a1: { ...a1, ...docsOnly }, + }; + const filtered = collapseAllStories(hasDocsOnly); + expect(filtered.a1).toEqual({ + id: 'a1', + isComponent: true, + isLeaf: true, + parent: 'root', + }); + }); +}); diff --git a/lib/ui/src/containers/preview.js b/lib/ui/src/containers/preview.js index 4d7771f935d..3ecad17872a 100644 --- a/lib/ui/src/containers/preview.js +++ b/lib/ui/src/containers/preview.js @@ -15,15 +15,19 @@ const getDescription = (storiesHash, storyId) => { return storyInfo ? addExtraWhiteSpace(`${storyInfo.kind} - ${storyInfo.name}`) : ''; }; -const mapper = ({ api, state: { layout, location, customQueryParams, storiesHash, storyId } }) => ({ - api, - getElements: api.getElements, - options: layout, - description: getDescription(storiesHash, storyId), - ...api.getUrlState(), - queryParams: customQueryParams, - location, -}); +const mapper = ({ api, state: { layout, location, customQueryParams, storiesHash, storyId } }) => { + const story = storiesHash[storyId]; + return { + api, + getElements: api.getElements, + options: layout, + description: getDescription(storiesHash, storyId), + ...api.getUrlState(), + queryParams: customQueryParams, + docsOnly: story && story.parameters && story.parameters.docsOnly, + location, + }; +}; function getBaseUrl() { try { diff --git a/lib/ui/src/index.js b/lib/ui/src/index.js index f6f59c76684..245a7e2d9bc 100644 --- a/lib/ui/src/index.js +++ b/lib/ui/src/index.js @@ -39,6 +39,7 @@ export const Root = ({ provider }) => ( > {({ state, api }) => { const panelCount = Object.keys(api.getPanels()).length; + const story = state.storiesHash[state.storyId]; return ( ( viewMode={state.viewMode} layout={state.layout} panelCount={panelCount} + docsOnly={story && story.parameters && story.parameters.docsOnly} /> ); diff --git a/lib/ui/src/settings/shortcuts.js b/lib/ui/src/settings/shortcuts.js index 7a940e77649..7abf235f0b8 100644 --- a/lib/ui/src/settings/shortcuts.js +++ b/lib/ui/src/settings/shortcuts.js @@ -46,7 +46,7 @@ export const GridWrapper = styled.div({ display: 'grid', gridTemplateColumns: '1fr', gridAutoRows: 'minmax(auto, auto)', - marginBottom: '20px', + marginBottom: 20, }); // Form diff --git a/tsconfig.json b/tsconfig.json index a2454a3af84..0f4719660e9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,7 @@ "allowSyntheticDefaultImports": true, "esModuleInterop": true, "target": "es5", - "types": ["node", "jest"], + "types": ["jest"], "lib": ["es2017", "dom"] }, "exclude": [ diff --git a/yarn.lock b/yarn.lock index 09a984fbb4c..eff412bb994 100644 --- a/yarn.lock +++ b/yarn.lock @@ -298,7 +298,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.0.0", "@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.3", "@babel/core@^7.3.4", "@babel/core@^7.4.3", "@babel/core@^7.4.4", "@babel/core@^7.4.5", "@babel/core@^7.6.2", "@babel/core@^7.7.0": +"@babel/core@^7.0.0", "@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.2.2", "@babel/core@^7.3.3", "@babel/core@^7.3.4", "@babel/core@^7.4.4", "@babel/core@^7.4.5", "@babel/core@^7.6.2", "@babel/core@^7.7.0": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.4.tgz#37e864532200cb6b50ee9a4045f5f817840166ab" integrity sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ== @@ -446,6 +446,18 @@ "@babel/types" "^7.7.4" lodash "^4.17.13" +"@babel/helper-module-transforms@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835" + integrity sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw== + dependencies: + "@babel/helper-module-imports" "^7.7.4" + "@babel/helper-simple-access" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + lodash "^4.17.13" + "@babel/helper-optimise-call-expression@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" @@ -534,6 +546,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb" integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g== +"@babel/parser@^7.4.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.5.tgz#cbf45321619ac12d83363fcf9c94bb67fa646d71" + integrity sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig== + "@babel/plugin-external-helpers@^7.0.0": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.7.4.tgz#8aa7aa402f0e2ecb924611cbf30942a497dfd17e" @@ -674,10 +691,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.2.0", "@babel/plugin-proposal-object-rest-spread@^7.3.2", "@babel/plugin-proposal-object-rest-spread@^7.5.5", "@babel/plugin-proposal-object-rest-spread@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71" - integrity sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ== +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.2.0", "@babel/plugin-proposal-object-rest-spread@^7.3.2", "@babel/plugin-proposal-object-rest-spread@^7.5.5", "@babel/plugin-proposal-object-rest-spread@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz#9f27075004ab99be08c5c1bd653a2985813cb370" + integrity sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.7.4" @@ -698,10 +715,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.7.4" -"@babel/plugin-proposal-unicode-property-regex@^7.2.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz#7c239ccaf09470dbe1d453d50057460e84517ebb" - integrity sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA== +"@babel/plugin-proposal-unicode-property-regex@^7.2.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.7.tgz#433fa9dac64f953c12578b29633f456b68831c4e" + integrity sha512-80PbkKyORBUVm1fbTLrHpYdJxMThzM1UqFGh0ALEhO9TYbG86Ah9zQYAB/84axz2vcxefDLdZwWwZNlYARlu9w== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" @@ -869,7 +886,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.2.0", "@babel/plugin-transform-block-scoping@^7.5.5", "@babel/plugin-transform-block-scoping@^7.6.0", "@babel/plugin-transform-block-scoping@^7.7.4": +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.2.0", "@babel/plugin-transform-block-scoping@^7.5.5", "@babel/plugin-transform-block-scoping@^7.6.0", "@babel/plugin-transform-block-scoping@^7.6.2", "@babel/plugin-transform-block-scoping@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== @@ -912,10 +929,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.2.0", "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz#f7ccda61118c5b7a2599a72d5e3210884a021e96" - integrity sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw== +"@babel/plugin-transform-dotall-regex@^7.2.0", "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz#3e9713f1b69f339e87fa796b097d73ded16b937b" + integrity sha512-b4in+YlTeE/QmTgrllnb3bHA0HntYvjz8O3Mcbx75UBPJA2xhb5A8nle498VhxSXJHQefjtQxpnLPehDJ4TRlg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" @@ -980,21 +997,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.2.0", "@babel/plugin-transform-modules-amd@^7.5.0", "@babel/plugin-transform-modules-amd@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz#276b3845ca2b228f2995e453adc2e6f54d72fb71" - integrity sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ== +"@babel/plugin-transform-modules-amd@^7.2.0", "@babel/plugin-transform-modules-amd@^7.5.0", "@babel/plugin-transform-modules-amd@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz#39e0fb717224b59475b306402bb8eedab01e729c" + integrity sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ== dependencies: - "@babel/helper-module-transforms" "^7.7.4" + "@babel/helper-module-transforms" "^7.7.5" "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.4.4", "@babel/plugin-transform-modules-commonjs@^7.5.0", "@babel/plugin-transform-modules-commonjs@^7.6.0", "@babel/plugin-transform-modules-commonjs@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz#bee4386e550446343dd52a571eda47851ff857a3" - integrity sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA== +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.4.4", "@babel/plugin-transform-modules-commonjs@^7.5.0", "@babel/plugin-transform-modules-commonjs@^7.6.0", "@babel/plugin-transform-modules-commonjs@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz#1d27f5eb0bcf7543e774950e5b2fa782e637b345" + integrity sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q== dependencies: - "@babel/helper-module-transforms" "^7.7.4" + "@babel/helper-module-transforms" "^7.7.5" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.7.4" babel-plugin-dynamic-import-node "^2.3.0" @@ -1030,7 +1047,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-assign@^7.0.0": +"@babel/plugin-transform-object-assign@^7.0.0", "@babel/plugin-transform-object-assign@^7.2.0": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.7.4.tgz#a31b70c434a00a078b2d4d10dbd59992fa70afca" integrity sha512-0TpeUlnhQDwKxPLTIckdaWt46L2s61c/5w5snw1OUod5ehOJywZD98Ha3dFHVjeqkfOFtOTH7cqxddjxUuvcmg== @@ -1045,10 +1062,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.7.4" -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.2.0", "@babel/plugin-transform-parameters@^7.4.4", "@babel/plugin-transform-parameters@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz#da4555c97f39b51ac089d31c7380f03bca4075ce" - integrity sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw== +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.2.0", "@babel/plugin-transform-parameters@^7.4.4", "@babel/plugin-transform-parameters@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz#7a884b2460164dc5f194f668332736584c760007" + integrity sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew== dependencies: "@babel/helper-call-delegate" "^7.7.4" "@babel/helper-get-function-arity" "^7.7.4" @@ -1108,10 +1125,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.7.4" -"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.4.5", "@babel/plugin-transform-regenerator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz#d18eac0312a70152d7d914cbed2dc3999601cfc0" - integrity sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw== +"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.4.5", "@babel/plugin-transform-regenerator@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz#3a8757ee1a2780f390e89f246065ecf59c26fce9" + integrity sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw== dependencies: regenerator-transform "^0.14.0" @@ -1372,18 +1389,18 @@ semver "^5.5.0" "@babel/preset-env@^7.0.0", "@babel/preset-env@^7.1.6", "@babel/preset-env@^7.3.1", "@babel/preset-env@^7.4.1", "@babel/preset-env@^7.4.4", "@babel/preset-env@^7.4.5", "@babel/preset-env@^7.7.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.4.tgz#ccaf309ae8d1ee2409c85a4e2b5e280ceee830f8" - integrity sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g== + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.7.tgz#c294167b91e53e7e36d820e943ece8d0c7fe46ac" + integrity sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg== dependencies: "@babel/helper-module-imports" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-async-generator-functions" "^7.7.4" "@babel/plugin-proposal-dynamic-import" "^7.7.4" "@babel/plugin-proposal-json-strings" "^7.7.4" - "@babel/plugin-proposal-object-rest-spread" "^7.7.4" + "@babel/plugin-proposal-object-rest-spread" "^7.7.7" "@babel/plugin-proposal-optional-catch-binding" "^7.7.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.7.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.7.7" "@babel/plugin-syntax-async-generators" "^7.7.4" "@babel/plugin-syntax-dynamic-import" "^7.7.4" "@babel/plugin-syntax-json-strings" "^7.7.4" @@ -1397,23 +1414,23 @@ "@babel/plugin-transform-classes" "^7.7.4" "@babel/plugin-transform-computed-properties" "^7.7.4" "@babel/plugin-transform-destructuring" "^7.7.4" - "@babel/plugin-transform-dotall-regex" "^7.7.4" + "@babel/plugin-transform-dotall-regex" "^7.7.7" "@babel/plugin-transform-duplicate-keys" "^7.7.4" "@babel/plugin-transform-exponentiation-operator" "^7.7.4" "@babel/plugin-transform-for-of" "^7.7.4" "@babel/plugin-transform-function-name" "^7.7.4" "@babel/plugin-transform-literals" "^7.7.4" "@babel/plugin-transform-member-expression-literals" "^7.7.4" - "@babel/plugin-transform-modules-amd" "^7.7.4" - "@babel/plugin-transform-modules-commonjs" "^7.7.4" + "@babel/plugin-transform-modules-amd" "^7.7.5" + "@babel/plugin-transform-modules-commonjs" "^7.7.5" "@babel/plugin-transform-modules-systemjs" "^7.7.4" "@babel/plugin-transform-modules-umd" "^7.7.4" "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4" "@babel/plugin-transform-new-target" "^7.7.4" "@babel/plugin-transform-object-super" "^7.7.4" - "@babel/plugin-transform-parameters" "^7.7.4" + "@babel/plugin-transform-parameters" "^7.7.7" "@babel/plugin-transform-property-literals" "^7.7.4" - "@babel/plugin-transform-regenerator" "^7.7.4" + "@babel/plugin-transform-regenerator" "^7.7.5" "@babel/plugin-transform-reserved-words" "^7.7.4" "@babel/plugin-transform-shorthand-properties" "^7.7.4" "@babel/plugin-transform-spread" "^7.7.4" @@ -1423,7 +1440,7 @@ "@babel/plugin-transform-unicode-regex" "^7.7.4" "@babel/types" "^7.7.4" browserslist "^4.6.0" - core-js-compat "^3.1.1" + core-js-compat "^3.6.0" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" @@ -1516,7 +1533,7 @@ "@babel/parser" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.0", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3", "@babel/traverse@^7.7.4": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.0", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3", "@babel/traverse@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== @@ -1682,6 +1699,11 @@ resolved "https://registry.yarnpkg.com/@egoist/vue-to-react/-/vue-to-react-1.1.0.tgz#83c884b8608e8ee62e76c03e91ce9c26063a91ad" integrity sha512-MwfwXHDh6ptZGLEtNLPXp2Wghteav7mzpT2Mcwl3NZWKF814i5hhHnNkVrcQQEuxUroSWQqzxLkMKSb+nhPang== +"@ember/edition-utils@^1.1.1": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.2.0.tgz#a039f542dc14c8e8299c81cd5abba95e2459cfa6" + integrity sha512-VmVq/8saCaPdesQmftPqbFtxJWrzxNGSQ+e8x8LLe3Hjm36pJ04Q8LeORGZkAeOhldoUX9seLGmSaHeXkIqoog== + "@ember/test-helpers@^1.5.0": version "1.7.1" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-1.7.1.tgz#cc22a954b3b46856518f034bd492a74e0482389f" @@ -3563,6 +3585,23 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== +"@storybook/csf@0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" + integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw== + dependencies: + lodash "^4.17.15" + +"@storybook/ember-cli-storybook@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@storybook/ember-cli-storybook/-/ember-cli-storybook-0.2.0.tgz#c9b0a2512266e9c1a9cb443048c8defa2f00c035" + integrity sha512-367fsOCf9bw7tQHDVU1RBL7qc+f5d3dfj8l0hkAbelFSzcRkH3D2aFXXdBmNHd3NBb2b++mCK5EcWIqvYLOq0w== + dependencies: + broccoli-funnel "^2.0.2" + cheerio "^1.0.0-rc.2" + ember-cli-addon-docs-yuidoc "^0.2.3" + ember-cli-babel "^7.1.2" + "@storybook/eslint-config-storybook@^2.0.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@storybook/eslint-config-storybook/-/eslint-config-storybook-2.1.0.tgz#db785ebad0d0e6194e3497e1600ff5be936f943f" @@ -3591,10 +3630,10 @@ remark-lint "^6.0.4" remark-preset-lint-recommended "^3.0.2" -"@storybook/node-logger@^5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.2.6.tgz#e353aff14375bef9e922c217a0afb50f93e2ceb1" - integrity sha512-Z3mn9CUSiG7kR2OBoz4lNeoeBS094h5d9wufZSp5S+M47L6KEXmTgNcuePKj+t8Z8KT/Ph8B63bjChseKp3DNw== +"@storybook/node-logger@^5.2.8": + version "5.2.8" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.2.8.tgz#4a3df21d731014d54b9ca53d5b9a72dd350bb075" + integrity sha512-3TK5mx6VWbfJO+WUrqwPhTbTQ4qESTnwJY/02xPzOhvuC6tIG1QOxzi+Rq6rFlwxTpUuWh6iyDYnGIqFFQywkA== dependencies: chalk "^2.4.2" core-js "^3.0.1" @@ -3602,14 +3641,15 @@ pretty-hrtime "^1.0.3" regenerator-runtime "^0.12.1" -"@storybook/preset-create-react-app@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@storybook/preset-create-react-app/-/preset-create-react-app-1.3.1.tgz#1a7cb7d58b64a2254c566f9907eab8340a531506" - integrity sha512-atJ4Jbq5QYXRa+8wscfN1kCnDk3/Dn8RZy/xm1OVrozptjlRz2CuiJEDqfmKeIEi81fBuUs41Uc3M+VWocSklg== +"@storybook/preset-create-react-app@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@storybook/preset-create-react-app/-/preset-create-react-app-1.5.0.tgz#214c023790545a36bb6b551d317a8dacbb7bc1a1" + integrity sha512-HkVmduGBPiCdtpq+rNZDzjJXEt7+KxszePDkCvnXfQMKKe+OusvmiuHwNB1A7apB7fGXPysbAgST/1G96sn61Q== dependencies: - "@storybook/node-logger" "^5.2.6" - "@types/webpack" "^4.39.8" - react-docgen-typescript-loader "^3.3.0" + "@storybook/node-logger" "^5.2.8" + "@types/webpack" "^4.41.0" + react-docgen-typescript-loader "^3.6.0" + semver "7.0.0" "@stroncium/procfs@^1.0.0": version "1.0.0" @@ -3986,6 +4026,13 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/jest-diff@*": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-24.3.0.tgz#29e237a3d954babfe6e23cc59b57ecd8ca8d858d" + integrity sha512-vx1CRDeDUwQ0Pc7v+hS61O1ETA81kD04IMEC0hS1kPyVtHDdZrokAvpF7MT9VI/fVSzicelUZNCepDvhRV1PeA== + dependencies: + jest-diff "*" + "@types/jest-image-snapshot@^2.8.0": version "2.11.0" resolved "https://registry.yarnpkg.com/@types/jest-image-snapshot/-/jest-image-snapshot-2.11.0.tgz#cd5d0188e2733df7903fa0f5fbc408b0fcf3998f" @@ -4007,6 +4054,13 @@ dependencies: jest-diff "^24.3.0" +"@types/jest@24.0.22": + version "24.0.22" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.22.tgz#08a50be08e78aba850a1185626e71d31e2336145" + integrity sha512-t2OvhNZnrNjlzi2i0/cxbLVM59WN15I2r1Qtb7wDv28PnV9IzrPtagFRey/S9ezdLD0zyh1XGMQIEQND2YEfrw== + dependencies: + "@types/jest-diff" "*" + "@types/jest@^23.0.2", "@types/jest@^23.3.1": version "23.3.14" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.14.tgz#37daaf78069e7948520474c87b80092ea912520a" @@ -4066,6 +4120,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.11.tgz#bec2961975888d964196bf0016a2f984d793d3ce" integrity sha512-O+x6uIpa6oMNTkPuHDa9MhMMehlxLAd5QcOvKRjAFsBVpeFWTOPnXbDvILvFgFFZfQ1xh1EZi1FbXxUix+zpsQ== +"@types/node@12.12.6": + version "12.12.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.6.tgz#a47240c10d86a9a57bb0c633f0b2e0aea9ce9253" + integrity sha512-FjsYUPzEJdGXjwKqSpE0/9QEh6kzhTAeObA54rn6j3rR4C/mzpI9L0KNfoeASSPMMdxIsoJuCLDWcM/rVjIsSA== + "@types/node@^6.0.0": version "6.14.9" resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.9.tgz#733583e21ef0eab85a9737dfafbaa66345a92ef0" @@ -4331,7 +4390,7 @@ "@types/source-list-map" "*" source-map "^0.6.1" -"@types/webpack@*", "@types/webpack@^4.39.8", "@types/webpack@^4.41.0": +"@types/webpack@*", "@types/webpack@^4.41.0": version "4.41.0" resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.0.tgz#b813a044d8b0dec7dfcd7622fdbe327bde06eb9a" integrity sha512-tWkdf9nO0zFgAY/EumUKwrDUhraHKDqCPhwfFR/R8l0qnPdgb9le0Gzhvb7uzVpouuDGBgiE//ZdY+5jcZy2TA== @@ -5093,7 +5152,7 @@ any-observable@^0.3.0: resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== -any-promise@^1.0.0, any-promise@^1.3.0: +any-promise@^1.0.0, any-promise@^1.1.0, any-promise@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= @@ -5201,7 +5260,7 @@ argly@^1.0.0: resolved "https://registry.yarnpkg.com/argly/-/argly-1.2.0.tgz#2b274e4551a29ff5e7199d2ed9788eb66ed36e60" integrity sha1-KydORVGin/XnGZ0u2XiOtm7TbmA= -argparse@^1.0.7: +argparse@^1.0.7, argparse@~1.0.2: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -5433,6 +5492,11 @@ asn1.js@^4.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +asn1@0.1.11: + version "0.1.11" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" + integrity sha1-VZvhg3bQik7E2+gId9J4GGObLfc= + asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -5445,6 +5509,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assert-plus@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" + integrity sha1-7nQAlBMALYTOxyGcasgRgS5yMWA= + assert@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" @@ -5547,7 +5616,7 @@ async-limiter@^1.0.0, async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async-promise-queue@^1.0.3, async-promise-queue@^1.0.4: +async-promise-queue@^1.0.3, async-promise-queue@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.5.tgz#cb23bce9fce903a133946a700cc85f27f09ea49d" integrity sha512-xi0aQ1rrjPWYmqbwr18rrSKbSaXIeIwSd1J4KAgVfkq8utNbdZoht7GfvfY6swFUAMJ9obkc4WPJmtGwl+B8dw== @@ -5576,7 +5645,7 @@ async@2.6.1: dependencies: lodash "^4.17.10" -async@^0.9.0, async@^0.9.2: +async@^0.9.0, async@^0.9.2, async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= @@ -5639,6 +5708,11 @@ autoprefixer@^9.4.9, autoprefixer@^9.6.1, autoprefixer@^9.7.2: postcss "^7.0.23" postcss-value-parser "^4.0.2" +aws-sign2@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" + integrity sha1-xXED96F/wDfwLXwuZLYC6iI/fWM= + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -6048,7 +6122,7 @@ babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" -babel-plugin-debug-macros@^0.3.0: +babel-plugin-debug-macros@^0.3.0, babel-plugin-debug-macros@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.3.tgz#29c3449d663f61c7385f5b8c72d8015b069a5cb7" integrity sha512-E+NI8TKpxJDBbVkdWkwHrKgJi696mnRL8XYrOPYw82veNHPDORM9WIQifl6TpIo8PNy2tU2skPqbfkmHXrHKQA== @@ -6092,6 +6166,14 @@ babel-plugin-extract-import-names@^1.5.1: dependencies: "@babel/helper-plugin-utils" "7.0.0" +babel-plugin-filter-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-3.0.0.tgz#a849683837ad29960da17492fb32789ab6b09a11" + integrity sha512-p/chjzVTgCxUqyLM0q/pfWVZS7IJTwGQMwNg0LOvuQpKiTftQgZDtkGB8XvETnUw19rRcL7bJCTopSwibTN2tA== + dependencies: + "@babel/types" "^7.4.0" + lodash "^4.17.11" + babel-plugin-htmlbars-inline-precompile@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" @@ -7243,6 +7325,13 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= +boom@0.4.x: + version "0.4.2" + resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b" + integrity sha1-emNune1O/O+xnO9JR6PGffrukRs= + dependencies: + hoek "0.9.x" + bower-config@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" @@ -7418,7 +7507,7 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.2.0, broccoli-babel-transpiler@^7.3.0: +broccoli-babel-transpiler@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.3.0.tgz#a0ad3a37dbf74469664bbca403d652070c2c1317" integrity sha512-tsXNvDf3gp6g8rGkz234AhbaIRUsCdd6CM3ikfkJVB0EpC8ZAczGsFKTjENLy1etx4s7FkruW/QjI7Wfdhx6Ng== @@ -7482,7 +7571,7 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@^3.7.3: +broccoli-concat@^3.7.4: version "3.7.5" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.5.tgz#223beda8c1184252cf08ae020a3d45ffa6a48218" integrity sha512-rDs1Mej3Ej0Cy5yIO9oIQq5+BCv0opAwS2NW7M0BeCsAMeFM42Z/zacDUC6jKc5OV5wiHvGTyCPLnZkMe0h6kQ== @@ -7608,7 +7697,7 @@ broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^ broccoli-plugin "^1.3.0" merge-trees "^2.0.0" -broccoli-middleware@^2.0.1: +broccoli-middleware@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-2.1.1.tgz#183635bbef4dc1241533ee001a162f013d776cb9" integrity sha512-BK8aPhQpOLsHWiftrqXQr84XsvzUqeaN4PlCQOYg5yM0M+WKAHtX2WFXmicSQZOVgKDyh5aeoNTFkHjBAEBzwQ== @@ -7637,6 +7726,11 @@ broccoli-module-unification-reexporter@^1.0.0: mkdirp "^0.5.1" walk-sync "^0.3.2" +broccoli-node-api@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/broccoli-node-api/-/broccoli-node-api-1.7.0.tgz#391aa6edecd2a42c63c111b4162956b2fa288cb6" + integrity sha512-QIqLSVJWJUVOhclmkmypJJH9u9s/aWH4+FH6Q6Ju5l+Io4dtwqdPUNmDfw40o6sxhbZHhqGujDJuHTML1wG8Yw== + broccoli-node-info@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" @@ -7666,7 +7760,7 @@ broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.3: symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.3.1: +broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.3.0, broccoli-persistent-filter@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== @@ -7696,7 +7790,7 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" -broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: +broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== @@ -7706,6 +7800,16 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-plugin@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334" + integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw== + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" + broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" @@ -7718,6 +7822,13 @@ broccoli-source@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-1.1.0.tgz#54f0e82c8b73f46580cbbc4f578f0b32fca8f809" integrity sha1-VPDoLItz9GWAy7xPV48LMvyo+Ak= +broccoli-source@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-3.0.0.tgz#c7c9ba24505941b72a0244568285bc859f69dfbd" + integrity sha512-G4Zc8HngZIdASyQOiz/9H/0Gjc2F02EFwhWF4wiueaI+/FBrM9Ixj6Prno/1aiLIYcN0JvRC3oytN9uOVonTww== + dependencies: + broccoli-node-api "^1.6.0" + broccoli-sri-hash@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/broccoli-sri-hash/-/broccoli-sri-hash-2.1.2.tgz#bc69905ed7a381ad325cc0d02ded071328ebf3f3" @@ -7729,44 +7840,44 @@ broccoli-sri-hash@^2.1.0: sri-toolbox "^0.2.0" symlink-or-copy "^1.0.1" -broccoli-stew@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" - integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== +broccoli-stew@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-3.0.0.tgz#fd1d19d162ad9490b42e5c563b78c26eb1e80b95" + integrity sha512-NXfi+Vas24n3Ivo21GvENTI55qxKu7OwKRnCLWXld8MiLiQKQlWIq28eoARaFj0lTUFwUa4jKZeA7fW9PiWQeg== dependencies: broccoli-debug "^0.6.5" broccoli-funnel "^2.0.0" broccoli-merge-trees "^3.0.1" - broccoli-persistent-filter "^2.1.1" - broccoli-plugin "^1.3.1" + broccoli-persistent-filter "^2.3.0" + broccoli-plugin "^2.1.0" chalk "^2.4.1" - debug "^3.1.0" + debug "^4.1.1" ensure-posix-path "^1.0.1" - fs-extra "^6.0.1" + fs-extra "^8.0.1" minimatch "^3.0.4" - resolve "^1.8.1" - rsvp "^4.8.4" + resolve "^1.11.1" + rsvp "^4.8.5" symlink-or-copy "^1.2.0" - walk-sync "^0.3.3" + walk-sync "^1.1.3" -broccoli-uglify-sourcemap@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.2.0.tgz#2ff49389bdf342a550c3596750ba2dde95a8f7d4" - integrity sha1-L/STib3zQqVQw1lnULot3pWo99Q= +broccoli-uglify-sourcemap@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-3.2.0.tgz#d96f1d41f6c18e9a5d49af1a5ab9489cdcac1c6c" + integrity sha512-kkkn8v7kXdWwnZNekq+3ILuTAGkZoaoEMUYCKoER5/uokuoyTjtdYLHaE7UxHkuPEuLfjvJYv21sCCePZ74/2g== dependencies: - async-promise-queue "^1.0.4" + async-promise-queue "^1.0.5" broccoli-plugin "^1.2.1" - debug "^3.1.0" - lodash.defaultsdeep "^4.6.0" - matcher-collection "^1.0.5" + debug "^4.1.0" + lodash.defaultsdeep "^4.6.1" + matcher-collection "^2.0.0" mkdirp "^0.5.0" source-map-url "^0.4.0" symlink-or-copy "^1.0.1" - terser "^3.7.5" - walk-sync "^0.3.2" - workerpool "^2.3.0" + terser "^4.3.9" + walk-sync "^1.1.3" + workerpool "^5.0.1" -broccoli@^3.1.1: +broccoli@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-3.2.0.tgz#6b5a89b8d6d0c733d39aa23ac5b43d85f56fafab" integrity sha512-n58yqAbV2Zbg+HXmBGBOUoDOgbCM0hMJtqvnPDF89Jwk3ZBVhD5/UKW0diY6l3DbB5+j92NCDQVd9HqO+WYFYA== @@ -8025,14 +8136,14 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.1.1, browserslist@^4.3.4, browserslist@^4.4.2, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.4, browserslist@^4.7.3: - version "4.7.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.3.tgz#02341f162b6bcc1e1028e30624815d4924442dc3" - integrity sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ== +browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.1.1, browserslist@^4.3.4, browserslist@^4.4.2, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.4, browserslist@^4.7.3, browserslist@^4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289" + integrity sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA== dependencies: - caniuse-lite "^1.0.30001010" - electron-to-chromium "^1.3.306" - node-releases "^1.1.40" + caniuse-lite "^1.0.30001015" + electron-to-chromium "^1.3.322" + node-releases "^1.1.42" browserstack@^1.5.1: version "1.5.3" @@ -8470,6 +8581,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000939, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001012.tgz#653ec635e815b9e0fb801890923b0c2079eb34ec" integrity sha512-7RR4Uh04t9K1uYRWzOJmzplgEOAXbfK72oVNokCdMzA67trrhPzy93ahKk1AWHiA0c58tD2P+NHqxrA8FZ+Trg== +caniuse-lite@^1.0.30001015: + version "1.0.30001016" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz#16ea48d7d6e8caf3cad3295c2d746fe38c4e7f66" + integrity sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA== + canonical-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" @@ -8657,7 +8773,7 @@ cheerio@^1.0.0-rc.2, cheerio@^1.0.0-rc.3: lodash "^4.15.0" parse5 "^3.0.1" -"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.1.1: +"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.1.1, chokidar@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== @@ -9162,6 +9278,13 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +combined-stream@~0.0.4: + version "0.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f" + integrity sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8= + dependencies: + delayed-stream "0.0.5" + comma-separated-tokens@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz#419cd7fb3258b1ed838dc0953167a25e152f5b59" @@ -9368,6 +9491,18 @@ configstore@^4.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +configstore@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.0.tgz#37de662c7a49b5fe8dbcf8f6f5818d2d81ed852b" + integrity sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ== + dependencies: + dot-prop "^5.1.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + confusing-browser-globals@^1.0.7, confusing-browser-globals@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" @@ -9403,7 +9538,7 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -console-ui@^3.0.2, console-ui@^3.0.4: +console-ui@^3.0.4, console-ui@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-3.1.1.tgz#681a0414e8b0a23ed679d0a2802e39d920801171" integrity sha512-22y+uk4AGq9quz6kofKQjkeCIAm86+MTxT/RZMFm8fMArP2lAkzxjUjNyrw7S6wXnnB+qRnC+/2ANMTke68RTQ== @@ -9666,13 +9801,13 @@ copy-webpack-plugin@^5.0.0: serialize-javascript "^2.1.0" webpack-log "^2.0.0" -core-js-compat@^3.1.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.2.tgz#652fa7c54652b7f6586a893e37001df55ea2ac37" - integrity sha512-W0Aj+LM3EAxxjD0Kp2o4be8UlnxIZHNupBv2znqrheR4aY2nOn91794k/xoSp+SxqqriiZpTsSwBtZr60cbkwQ== +core-js-compat@^3.1.1, core-js-compat@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.0.tgz#4eb6cb69d03d99159ed7c860cd5fcf7d23a62ea9" + integrity sha512-Z3eCNjGgoYluH89Jt4wVkfYsc/VdLrA2/woX5lm0isO/pCT+P+Y+o65bOuEnjDJLthdwTBxbCVzptTXtc18fJg== dependencies: - browserslist "^4.7.3" - semver "^6.3.0" + browserslist "^4.8.2" + semver "7.0.0" core-js-pure@^3.0.1: version "3.4.2" @@ -9902,6 +10037,13 @@ crypt@~0.0.1: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= +cryptiles@0.2.x: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" + integrity sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw= + dependencies: + boom "0.4.x" + crypto-browserify@^3.0.0, crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -9929,6 +10071,11 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + css-blank-pseudo@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" @@ -10228,6 +10375,11 @@ csstype@^2.2.0, csstype@^2.5.7: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5" integrity sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ== +ctype@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" + integrity sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8= + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -10677,6 +10829,11 @@ delay-async@1.2.0: resolved "https://registry.yarnpkg.com/delay-async/-/delay-async-1.2.0.tgz#d62f7974868bd91980c6b9c17dc8132c6768709b" integrity sha512-BDhPL4k42yL2c0b5zTUlMIM3/wmv77HOgZi4ya/8tOHw16GZ1i9Qj7Tmy3xt0jWb4VmpQtklLPReUtOUZUuzuQ== +delayed-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" + integrity sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8= + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -11059,6 +11216,13 @@ dot-prop@^4.1.0, dot-prop@^4.1.1, dot-prop@^4.2.0: dependencies: is-obj "^1.0.0" +dot-prop@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + dot@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/dot/-/dot-1.1.2.tgz#c7377019fc4e550798928b2b9afeb66abfa1f2f9" @@ -11197,11 +11361,16 @@ ejs@^2.6.1, ejs@^2.7.4: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.191, electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.306, electron-to-chromium@^1.3.47: +electron-to-chromium@^1.3.191, electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.47: version "1.3.314" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.314.tgz#c186a499ed2c9057bce9eb8dca294d6d5450facc" integrity sha512-IKDR/xCxKFhPts7h+VaSXS02Z1mznP3fli1BbXWXeN89i2gCzKraU8qLpEid8YzKcmZdZD3Mly3cn5/lY9xsBQ== +electron-to-chromium@^1.3.322: + version "1.3.322" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8" + integrity sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA== + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -11227,12 +11396,12 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -ember-ajax@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-4.0.2.tgz#ce86d52c24289657e0a230140b06a52fe453d655" - integrity sha512-YeeeAQizQc5ioCeraxFo30y3W6mmUxmndF0ShI/Wvwfe8IhVw40jL42itaUHbo2CxKsNRZzQ8x3re65dGM0CrA== +ember-ajax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-5.0.0.tgz#404b17c93194ab37aff86b7b8607d8edab93c9ec" + integrity sha512-Pet0S5VuiO7PDOwyTIF28VHdR7BpugL+jp+6PxNHRQvAq3SkKmVnXN0W06rnOgicH3xX29S46fx7czkKOGB3gA== dependencies: - ember-cli-babel "^6.16.0" + ember-cli-babel "^7.5.0" najax "^1.0.3" ember-assign-polyfill@^2.6.0: @@ -11243,6 +11412,18 @@ ember-assign-polyfill@^2.6.0: ember-cli-babel "^6.16.0" ember-cli-version-checker "^2.0.0" +ember-cli-addon-docs-yuidoc@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ember-cli-addon-docs-yuidoc/-/ember-cli-addon-docs-yuidoc-0.2.3.tgz#13f7943c7ef1909d74ef9d33a719236117c17262" + integrity sha512-W1ASMlYnWS18qkyN4ducCAH/APQ5AljNH4rGXV81Ly6I6XHgh7WnQZdXD5eQqjc9XoruC/92hqBIIl27ykShKQ== + dependencies: + broccoli-caching-writer "^3.0.3" + ember-cli-babel "^7.7.3" + fs-extra "^5.0.0" + json-api-serializer "^1.11.0" + lodash "^4.17.5" + yuidocjs "^0.10.2" + ember-cli-app-version@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-3.2.0.tgz#7b9ad0e1b63ae0518648356ee24c703e922bc26e" @@ -11275,7 +11456,7 @@ ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0: ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.2, ember-cli-babel@^7.11.0, ember-cli-babel@^7.4.2, ember-cli-babel@^7.6.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.1.2, ember-cli-babel@^7.11.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.6.0, ember-cli-babel@^7.7.3: version "7.13.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.13.0.tgz#3f2c2ba7a44d7948ec927d41cf072673330f62cd" integrity sha512-VjagtumwQP+3jsjLR64gpca5iq2o0PS1MT0PdC90COtAYqpOqNM9axYEYBamNLIuv+3vJpAoFKu8EMBC1ZlWGQ== @@ -11397,14 +11578,6 @@ ember-cli-sri@^2.1.0: dependencies: broccoli-sri-hash "^2.1.0" -ember-cli-storybook@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-storybook/-/ember-cli-storybook-0.1.0.tgz#f652d037c2aa591e269dca873ead6eddd18f4e81" - integrity sha512-hcigBT1xGWX3n+WPHrOk95DJEyJ1iPhZ1Ha9ySX1vMkXp9oMf6dqrbnXUXrZcNBhZgSr/vzFD1Yjb5PF6uS1sg== - dependencies: - cheerio "^1.0.0-rc.2" - ember-cli-babel "^7.1.2" - ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" @@ -11428,12 +11601,12 @@ ember-cli-typescript@^2.0.2: stagehand "^1.0.0" walk-sync "^1.0.0" -ember-cli-uglify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.1.0.tgz#4a0641fe4768d7ab7d4807aca9924cc77c544184" - integrity sha512-lDzdAUfhGx5AMBsgyR54ibENVp/LRQuHNWNaP2SDjkAXDyuYFgW0iXIAfGbxF6+nYaesJ9Tr9AKOfTPlwxZDSg== +ember-cli-uglify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-3.0.0.tgz#8819665b2cc5fe70e3ba9fe7a94645209bc42fd6" + integrity sha512-n3QxdBfAgBdb2Cnso82Kt/nxm3ppIjnYWM8uhOEhF1aYxNXfM7AJrc+yiqTCDUR61Db8aCpHfAMvChz3kyme7g== dependencies: - broccoli-uglify-sourcemap "^2.1.1" + broccoli-uglify-sourcemap "^3.1.0" lodash.defaultsdeep "^4.6.0" ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.2: @@ -11444,7 +11617,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.2: resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^3.0.1, ember-cli-version-checker@^3.1.3: +ember-cli-version-checker@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== @@ -11452,42 +11625,42 @@ ember-cli-version-checker@^3.0.1, ember-cli-version-checker@^3.1.3: resolve-package-path "^1.2.6" semver "^5.6.0" -ember-cli@~3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.11.0.tgz#05c055fde0803b2f4034a3b5a68daaed408e632d" - integrity sha512-YU+nGUZ3l3MbqW5BiFX9c9k3szgm41EPRGjFFLEXerOXuyFByRWYPBZDtBOGmtdWmZpiqv53JXYRweMANHWLvA== +ember-cli@~3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.14.0.tgz#9a142da77aa8c95e0bc2c70acc67c9809e9e45cf" + integrity sha512-ZZEArSq8ynU6FbVAQnS2Nbx2yr73EgYsAngOHKOGoJwa6YEs3LFh4lHjYsxF26Bt245lH83WnehRcdlLssNF3w== dependencies: - "@babel/core" "^7.4.3" - "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/core" "^7.6.2" + "@babel/plugin-transform-modules-amd" "^7.5.0" amd-name-resolver "^1.3.1" babel-plugin-module-resolver "^3.2.0" bower-config "^1.4.1" bower-endpoint-parser "0.2.2" - broccoli "^3.1.1" + broccoli "^3.2.0" broccoli-amd-funnel "^2.0.1" - broccoli-babel-transpiler "^7.2.0" + broccoli-babel-transpiler "^7.3.0" broccoli-builder "^0.18.14" - broccoli-concat "^3.7.3" + broccoli-concat "^3.7.4" broccoli-config-loader "^1.0.1" broccoli-config-replace "^1.1.2" broccoli-debug "^0.6.5" broccoli-funnel "^2.0.2" broccoli-funnel-reducer "^1.0.0" broccoli-merge-trees "^3.0.2" - broccoli-middleware "^2.0.1" + broccoli-middleware "^2.1.0" broccoli-module-normalizer "^1.3.0" broccoli-module-unification-reexporter "^1.0.0" broccoli-slow-trees "^3.0.1" - broccoli-source "^1.1.0" - broccoli-stew "^2.1.0" + broccoli-source "^3.0.0" + broccoli-stew "^3.0.0" calculate-cache-key-for-tree "^2.0.0" capture-exit "^2.0.0" chalk "^2.4.2" ci-info "^2.0.0" clean-base-url "^1.0.0" compression "^1.7.4" - configstore "^4.0.0" - console-ui "^3.0.2" + configstore "^5.0.0" + console-ui "^3.1.1" core-object "^3.1.5" dag-map "^2.0.2" diff "^4.0.1" @@ -11497,57 +11670,57 @@ ember-cli@~3.11.0: ember-cli-normalize-entity-name "^1.0.0" ember-cli-preprocess-registry "^3.3.0" ember-cli-string-utils "^1.1.0" - ember-source-channel-url "^1.1.0" + ember-source-channel-url "^2.0.1" ensure-posix-path "^1.0.2" execa "^1.0.0" exit "^0.1.2" express "^4.16.4" - filesize "^4.1.2" - find-up "^3.0.0" + filesize "^4.2.0" + find-up "^4.1.0" find-yarn-workspace-root "^1.2.1" - fs-extra "^7.0.1" + fs-extra "^8.1.0" fs-tree-diff "^2.0.1" get-caller-file "^2.0.5" git-repo-info "^2.1.0" glob "^7.1.4" heimdalljs "^0.2.6" - heimdalljs-fs-monitor "^0.2.2" - heimdalljs-graph "^0.3.5" + heimdalljs-fs-monitor "^0.2.3" + heimdalljs-graph "^1.0.0" heimdalljs-logger "^0.1.10" - http-proxy "^1.17.0" + http-proxy "^1.18.0" inflection "^1.12.0" is-git-url "^1.0.0" isbinaryfile "^3.0.3" js-yaml "^3.13.1" json-stable-stringify "^1.0.1" leek "0.0.24" - lodash.template "^4.4.0" - markdown-it "^8.4.2" + lodash.template "^4.5.0" + markdown-it "^9.1.0" markdown-it-terminal "0.1.0" minimatch "^3.0.4" morgan "^1.9.1" nopt "^3.0.6" - npm-package-arg "^6.1.0" - p-defer "^2.1.0" - portfinder "^1.0.20" + npm-package-arg "^6.1.1" + p-defer "^3.0.0" + portfinder "^1.0.23" promise-map-series "^0.2.3" - promise.prototype.finally "^3.1.0" + promise.prototype.finally "^3.1.1" quick-temp "^0.1.8" - resolve "^1.10.1" + resolve "^1.12.0" resolve-package-path "^1.2.7" - rsvp "^4.8.4" + rsvp "^4.8.5" sane "^4.1.0" - semver "^6.0.0" + semver "^6.3.0" silent-error "^1.1.1" sort-package-json "^1.22.1" symlink-or-copy "^1.2.0" temp "0.9.0" - testem "^2.14.0" + testem "^2.17.0" tiny-lr "^1.1.1" - tree-sync "^1.4.0" - uuid "^3.3.2" - walk-sync "^1.1.3" - watch-detector "^0.1.0" + tree-sync "^2.0.0" + uuid "^3.3.3" + walk-sync "^2.0.2" + watch-detector "^1.0.0" yam "^1.0.0" ember-load-initializers@^2.0.0: @@ -11576,39 +11749,50 @@ ember-rfc176-data@^0.3.1, ember-rfc176-data@^0.3.12: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz#90d82878e69e2ac9a5438e8ce14d12c6031c5bd2" integrity sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g== -ember-router-generator@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" - integrity sha1-jtLKhv8yM2MSD8FCeBkeno8TFe4= +ember-router-generator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-2.0.0.tgz#d04abfed4ba8b42d166477bbce47fccc672dbde0" + integrity sha512-89oVHVJwmLDvGvAUWgS87KpBoRhy3aZ6U0Ql6HOmU4TrPkyaa8pM0W81wj9cIwjYprcQtN9EwzZMHnq46+oUyw== dependencies: - recast "^0.11.3" + "@babel/parser" "^7.4.5" + "@babel/traverse" "^7.4.5" + recast "^0.18.1" -ember-source-channel-url@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-1.2.0.tgz#77eb9d0889e5f5370e6c70fcb2696c63ff4a34a1" - integrity sha512-CLClcHzVf+8GoFk4176R16nwXoel70bd7DKVAY6D8M0m5fJJhbTrAPYpDA0lY8A60HZo9j/s8A8LWiGh1YmdZg== +ember-source-channel-url@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-2.0.1.tgz#18b88f8a00b7746e7a456b3551abb3aea18729cc" + integrity sha512-YlLUHW9gNvxEaohIj5exykoTZb4xj9ZRTcR4J3svv9S8rjAHJUnHmqC5Fd9onCs+NGxHo7KwR/fDwsfadbDu5Q== dependencies: got "^8.0.1" -ember-source@~3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.9.1.tgz#e6c7b08f823f9a55e448af1cc439266cabc3e65e" - integrity sha512-0rfP1m3KbfylKNnxk4ZWy0jqwqIWGm5rb7ZZFn4zazVJFI6gEmratWadXfzwEgqG2ukRcW9F8frEk0utuaAnMg== +ember-source@~3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.15.0.tgz#f6500c6d289ce58231bf1e6695c4974df2be7390" + integrity sha512-daTELJBDMGqAmQb/Puxdk1YR204/zs1DEiEMQWlqbtmhphAoDUbGi9ifJu20ajP/IcOCWw9Vp7aPzguTohWF7w== dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.6.2" + "@babel/plugin-transform-object-assign" "^7.2.0" + "@ember/edition-utils" "^1.1.1" + babel-plugin-debug-macros "^0.3.3" + babel-plugin-filter-imports "^3.0.0" + broccoli-concat "^3.7.4" broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" chalk "^2.4.2" - ember-cli-babel "^7.4.2" + ember-cli-babel "^7.11.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" - ember-cli-version-checker "^3.0.1" - ember-router-generator "^1.2.3" + ember-cli-version-checker "^3.1.3" + ember-router-generator "^2.0.0" inflection "^1.12.0" - jquery "^3.3.1" - resolve "^1.10.0" + jquery "^3.4.1" + resolve "^1.11.1" + semver "^6.1.1" + silent-error "^1.1.1" ember-template-compiler@^1.9.0-alpha: version "1.9.0-alpha" @@ -13351,7 +13535,7 @@ express@4.16.4: utils-merge "1.0.1" vary "~1.1.2" -express@^4.10.7, express@^4.16.2, express@^4.16.3, express@^4.16.4, express@^4.17.0, express@^4.17.1: +express@^4.10.7, express@^4.13.1, express@^4.16.2, express@^4.16.3, express@^4.16.4, express@^4.17.0, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -13798,7 +13982,7 @@ filesize@3.6.1, filesize@^3.6.0, filesize@^3.6.1: resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== -filesize@^4.1.2: +filesize@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.2.1.tgz#ab1cb2069db5d415911c1a13e144c0e743bc89bc" integrity sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA== @@ -14107,6 +14291,11 @@ foreach@^2.0.5: resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= +forever-agent@~0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130" + integrity sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA= + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -14127,13 +14316,13 @@ fork-ts-checker-webpack-plugin@1.5.0: worker-rpc "^0.1.0" fork-ts-checker-webpack-plugin@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.0.tgz#fb411a4b2c3697e1cd7f83436d4feeacbcc70c7b" - integrity sha512-6OkRfjuNMNqb14f01xokcWcKV5Ekknc2FvziNpcTYru+kxIYFA2MtuuBI19MHThZnjSBhoi35Dcq+I0oUkFjmQ== + version "3.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== dependencies: babel-code-frame "^6.22.0" chalk "^2.4.1" - chokidar "^2.0.4" + chokidar "^3.3.0" micromatch "^3.1.10" minimatch "^3.0.4" semver "^5.6.0" @@ -14158,6 +14347,15 @@ form-data@^2.5.0: combined-stream "^1.0.6" mime-types "^2.1.12" +form-data@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" + integrity sha1-kavXiKupcCsaq/qLwBAxoqyeOxI= + dependencies: + async "~0.9.0" + combined-stream "~0.0.4" + mime "~1.2.11" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -15454,12 +15652,22 @@ hasurl@^1.0.0: resolved "https://registry.yarnpkg.com/hasurl/-/hasurl-1.0.0.tgz#e4c619097ae1e8fc906bee904ce47e94f5e1ea37" integrity sha512-43ypUd3DbwyCT01UYpA99AEZxZ4aKtRxWGBHEIbjcOsUghd9YUON0C+JF6isNjaiwC/UF5neaUudy6JS9jZPZQ== +hawk@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9" + integrity sha1-h81JH5tG5OKurKM1QWdmiF0tHtk= + dependencies: + boom "0.4.x" + cryptiles "0.2.x" + hoek "0.9.x" + sntp "0.2.x" + he@1.2.x, he@^1.1.0, he@^1.1.1, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -heimdalljs-fs-monitor@^0.2.2: +heimdalljs-fs-monitor@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.2.3.tgz#1aedd4b1c61d86c51f6141fb75c5a3350dc41b15" integrity sha512-fYAvqSP0CxeOjLrt61B4wux/jqZzdZnS2xfb2oc14NP6BTZ8gtgtR2op6gKFakOR8lm8GN9Xhz1K4A1ZvJ4RQw== @@ -15467,10 +15675,10 @@ heimdalljs-fs-monitor@^0.2.2: heimdalljs "^0.2.3" heimdalljs-logger "^0.1.7" -heimdalljs-graph@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.5.tgz#420fbbc8fc3aec5963ddbbf1a5fb47921c4a5927" - integrity sha512-szOy9WZUc7eUInEBQEsoa1G2d+oYHrn6ndZPf76eh8A9ID1zWUCEEsxP3F+CvQx9+EDrg1srdyLUmfVAr8EB4g== +heimdalljs-graph@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-1.0.0.tgz#0059857952988e54f3a74bb23edaf669f8eaf6af" + integrity sha512-v2AsTERBss0ukm/Qv4BmXrkwsT5x6M1V5Om6E8NcDQ/ruGkERsfsuLi5T8jx8qWzKMGYlwzAd7c/idymxRaPzA== heimdalljs-logger@^0.1.10, heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: version "0.1.10" @@ -15506,6 +15714,11 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoek@0.9.x: + version "0.9.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505" + integrity sha1-PTIkYrrfB3Fup+uFuviAec3c5QU= + hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" @@ -15810,7 +16023,7 @@ http-proxy-middleware@0.19.1, http-proxy-middleware@^0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy@^1.13.1, http-proxy@^1.17.0, http-proxy@^1.8.1: +http-proxy@^1.13.1, http-proxy@^1.17.0, http-proxy@^1.18.0, http-proxy@^1.8.1: version "1.18.0" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== @@ -15847,6 +16060,15 @@ http-server@^0.11.1: portfinder "^1.0.13" union "~0.4.3" +http-signature@~0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66" + integrity sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY= + dependencies: + asn1 "0.1.11" + assert-plus "^0.1.5" + ctype "0.5.3" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -16794,6 +17016,11 @@ is-obj@^1.0.0, is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" @@ -16996,7 +17223,7 @@ is-type@0.0.1: dependencies: core-util-is "~1.0.0" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -17316,7 +17543,7 @@ jest-config@^24.8.0, jest-config@^24.9.0: pretty-format "^24.9.0" realpath-native "^1.1.0" -jest-diff@^24.3.0, jest-diff@^24.8.0, jest-diff@^24.9.0: +jest-diff@*, jest-diff@^24.3.0, jest-diff@^24.8.0, jest-diff@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== @@ -17870,6 +18097,15 @@ joi@^11.1.1: isemail "3.x.x" topo "2.x.x" +joi@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-12.0.0.tgz#46f55e68f4d9628f01bbb695902c8b307ad8d33a" + integrity sha512-z0FNlV4NGgjQN1fdtHYXf5kmgludM65fG/JlXzU6+rwkt9U5UWuXVYnXa2FpK0u6+qBuCmrm5byPNuiiddAHvQ== + dependencies: + hoek "4.x.x" + isemail "3.x.x" + topo "2.x.x" + join-component@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/join-component/-/join-component-1.1.0.tgz#b8417b750661a392bee2c2537c68b2a9d4977cd5" @@ -17880,7 +18116,7 @@ jquery-deferred@^0.3.0: resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= -jquery@^3.3.1: +jquery@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== @@ -17952,6 +18188,30 @@ jscodeshift@^0.6.3: temp "^0.8.1" write-file-atomic "^2.3.0" +jscodeshift@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.7.0.tgz#4eee7506fd4fdacbd80340287d61575af991fdab" + integrity sha512-Kt6rpTa1HVhAWagD6J0y6qxxqRmDgkFvczerLgOsDNSGoUZSmq2CO1vFRcda9OV1BaZKSHCIh+VREPts5tB/Ig== + dependencies: + "@babel/core" "^7.1.6" + "@babel/parser" "^7.1.6" + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/preset-env" "^7.1.6" + "@babel/preset-flow" "^7.0.0" + "@babel/preset-typescript" "^7.1.0" + "@babel/register" "^7.0.0" + babel-core "^7.0.0-bridge.0" + colors "^1.1.2" + flow-parser "0.*" + graceful-fs "^4.1.11" + micromatch "^3.1.10" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.18.1" + temp "^0.8.1" + write-file-atomic "^2.3.0" + jsdom@^11.5.1: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" @@ -18100,6 +18360,18 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-api-serializer@^1.11.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/json-api-serializer/-/json-api-serializer-1.15.1.tgz#241ea66dfc5c629ae46d8315c6ee4232b81bb6b7" + integrity sha512-dp7d/TLWudViXADFnmdiq80krYZ+zA0WeB1771O1Is8HWdeySZofhp/TPWHCzgFPmGkgwI7oTEgjgZ6Dcxr/2w== + dependencies: + into-stream "^3.1.0" + joi "^12.0.0" + lodash "^4.5.1" + stream-to-array "^2.3.0" + through2 "^2.0.3" + unique-stream "^2.2.1" + json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" @@ -18149,7 +18421,7 @@ json-stable-stringify@~0.0.0: dependencies: jsonify "~0.0.0" -json-stringify-safe@5.0.x, json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@5.0.x, json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= @@ -18811,6 +19083,13 @@ linkify-it@^2.0.0: dependencies: uc.micro "^1.0.1" +linkify-it@~1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-1.2.4.tgz#0773526c317c8fd13bd534ee1d180ff88abf881a" + integrity sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo= + dependencies: + uc.micro "^1.0.1" + lint-staged@^9.4.1: version "9.4.3" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-9.4.3.tgz#f55ad5f94f6e105294bfd6499b23142961f7b982" @@ -19195,7 +19474,7 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.defaultsdeep@^4.6.0: +lodash.defaultsdeep@^4.6.0, lodash.defaultsdeep@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== @@ -19435,7 +19714,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= -lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.16.2, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.0, lodash@^4.6.1, lodash@~4.17.10: +lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.16.2, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.5.1, lodash@^4.6.0, lodash@^4.6.1, lodash@~4.17.10: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -19751,7 +20030,18 @@ markdown-it-terminal@0.1.0: lodash.merge "^4.6.0" markdown-it "^8.3.1" -markdown-it@^8.3.1, markdown-it@^8.4.0, markdown-it@^8.4.2: +markdown-it@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-4.4.0.tgz#3df373dbea587a9a7fef3e56311b68908f75c414" + integrity sha1-PfNz2+pYepp/7z5WMRtokI91xBQ= + dependencies: + argparse "~1.0.2" + entities "~1.1.1" + linkify-it "~1.2.0" + mdurl "~1.0.0" + uc.micro "^1.0.0" + +markdown-it@^8.3.1, markdown-it@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== @@ -19762,6 +20052,17 @@ markdown-it@^8.3.1, markdown-it@^8.4.0, markdown-it@^8.4.2: mdurl "^1.0.1" uc.micro "^1.0.5" +markdown-it@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-9.1.0.tgz#df9601c168568704d554b1fff9af0c5b561168d9" + integrity sha512-xHKG4C8iPriyfu/jc2hsCC045fKrMQ0VexX2F1FGYiRxDxqMB2aAhF8WauJ3fltn2kb90moGBkiiEdooGIg55w== + dependencies: + argparse "^1.0.7" + entities "~1.1.1" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" + markdown-table@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" @@ -19893,13 +20194,21 @@ match-require@2.1.0: dependencies: uuid "^3.0.0" -matcher-collection@^1.0.0, matcher-collection@^1.0.5, matcher-collection@^1.1.1: +matcher-collection@^1.0.0, matcher-collection@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838" integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g== dependencies: minimatch "^3.0.2" +matcher-collection@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.1.tgz#90be1a4cf58d6f2949864f65bb3b0f3e41303b29" + integrity sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ== + dependencies: + "@types/minimatch" "^3.0.3" + minimatch "^3.0.2" + material-colors@^1.2.1: version "1.2.6" resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" @@ -20008,7 +20317,12 @@ mdn-data@2.0.4: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== -mdurl@^1.0.1: +mdn-links@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/mdn-links/-/mdn-links-0.1.0.tgz#e24c83b97cb4c5886cc39f2f780705fbfe273aa5" + integrity sha1-4kyDuXy0xYhsw58veAcF+/4nOqU= + +mdurl@^1.0.1, mdurl@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= @@ -20772,6 +21086,11 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.19, mime-types@~2.1.17, dependencies: mime-db "1.42.0" +mime-types@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" + integrity sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4= + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -20787,6 +21106,11 @@ mime@^2.0.3, mime@^2.3.1, mime@^2.4.0, mime@^2.4.4: resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== +mime@~1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" + integrity sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA= + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -21467,13 +21791,20 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.25, node-releases@^1.1.29, node-releases@^1.1.40: +node-releases@^1.1.25, node-releases@^1.1.29: version "1.1.41" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.41.tgz#57674a82a37f812d18e3b26118aefaf53a00afed" integrity sha512-+IctMa7wIs8Cfsa8iYzeaLTFwv5Y4r5jZud+4AnfymzeEXKBCavFX0KBgzVaPVqf0ywa6PrO8/b+bPqdwjGBSg== dependencies: semver "^6.3.0" +node-releases@^1.1.42: + version "1.1.43" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.43.tgz#2c6ca237f88ce11d49631f11190bb01f8d0549f2" + integrity sha512-Rmfnj52WNhvr83MvuAWHEqXVoZXCcDQssSOffU4n4XOL9sPrP61mSZ88g25NqmABDvH7PiAlFCzoSCSdzA293w== + dependencies: + semver "^6.3.0" + node-sass@^4.12.0: version "4.13.0" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.0.tgz#b647288babdd6a1cb726de4545516b31f90da066" @@ -21497,6 +21828,11 @@ node-sass@^4.12.0: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" +node-uuid@~1.4.0: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= + noop-fn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/noop-fn/-/noop-fn-1.0.0.tgz#5f33d47f13d2150df93e0cb036699e982f78ffbf" @@ -21631,7 +21967,7 @@ npm-package-arg@6.1.0: semver "^5.5.0" validate-npm-package-name "^3.0.0" -"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: +"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0, npm-package-arg@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== @@ -21784,6 +22120,11 @@ nwsapi@^2.0.7, nwsapi@^2.0.9, nwsapi@^2.1.3, nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== +oauth-sign@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.3.0.tgz#cb540f93bb2b22a7d5941691a288d60e8ea9386e" + integrity sha1-y1QPk7srIqfVlBaRoojWDo6pOG4= + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -22191,10 +22532,10 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= -p-defer@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-2.1.0.tgz#d9c97b40f8fb5c256a70b4aabec3c1c8c42f1fae" - integrity sha512-xMwL9id1bHn/UfNGFEMFwlULOprQUEOg6vhqSfr6oKxPFB0oSh0zhGq/9/tPSE+cyij2+RW6H8+0Ke4xsPdZ7Q== +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== p-each-series@^1.0.0: version "1.0.0" @@ -23201,7 +23542,7 @@ popper.js@^1.14.4, popper.js@^1.14.7: resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.0.tgz#2e1816bcbbaa518ea6c2e15a466f4cb9c6e2fbb3" integrity sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw== -portfinder@^1.0.13, portfinder@^1.0.20, portfinder@^1.0.25, portfinder@^1.0.9: +portfinder@^1.0.13, portfinder@^1.0.23, portfinder@^1.0.25, portfinder@^1.0.9: version "1.0.25" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== @@ -24303,7 +24644,7 @@ promise.allsettled@^1.0.0: es-abstract "^1.13.0" function-bind "^1.1.1" -promise.prototype.finally@^3.1.0: +promise.prototype.finally@^3.1.0, promise.prototype.finally@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.1.tgz#cb279d3a5020ca6403b3d92357f8e22d50ed92aa" integrity sha512-gnt8tThx0heJoI3Ms8a/JdkYBVhYP/wv+T7yQimR+kdOEJL21xTFbiJhMRqnSPcr54UVvMbsscDk2w+ivyaLPw== @@ -24666,6 +25007,11 @@ qs@^6.2.0, qs@^6.4.0, qs@^6.5.0, qs@^6.6.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== +qs@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-1.0.2.tgz#50a93e2b5af6691c31bcea5dae78ee6ea1903768" + integrity sha1-UKk+K1r2aRwxvOpdrnjubqGQN2g= + qs@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" @@ -25227,7 +25573,7 @@ react-devtools-core@^3.4.2, react-devtools-core@^3.6.0: shell-quote "^1.6.1" ws "^3.3.1" -react-docgen-typescript-loader@^3.3.0: +react-docgen-typescript-loader@^3.3.0, react-docgen-typescript-loader@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/react-docgen-typescript-loader/-/react-docgen-typescript-loader-3.6.0.tgz#5515f03f869e66d49e287c5f1e7ec10f2084f7bb" integrity sha512-+uEsM3VYCdlcBGxF3tBqI5XWL1phvrh8dkiIfdpciKlM1BDHW+d82kKJI9hX6zk9H8TL+3Th/j/JAEaKb5FFNw== @@ -25265,15 +25611,25 @@ react-dom@^15.4.2: object-assign "^4.1.0" prop-types "^15.5.10" -react-dom@^16.10.2, react-dom@^16.8.3, react-dom@^16.8.4: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" - integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== +react-dom@^16.10.2: + version "16.10.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.10.2.tgz#4840bce5409176bc3a1f2bd8cb10b92db452fda6" + integrity sha512-kWGDcH3ItJK4+6Pl9DZB16BXYAZyrYQItU4OMy0jAkv5aNqc+mAKb4TpFtAteI6TJZu+9ZlNhaeNQSVQDHJzkw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.18.0" + scheduler "^0.16.2" + +react-dom@^16.11.0, react-dom@^16.8.3, react-dom@^16.8.4: + 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== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.17.0" react-draggable@^4.0.3: version "4.1.0" @@ -25879,6 +26235,15 @@ react@^15.4.2: 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" + reactcss@^1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd" @@ -26122,16 +26487,6 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" -recast@^0.11.3, recast@~0.11.12: - version "0.11.23" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" - integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= - dependencies: - ast-types "0.9.6" - esprima "~3.1.0" - private "~0.1.5" - source-map "~0.5.0" - recast@^0.14.7: version "0.14.7" resolved "https://registry.yarnpkg.com/recast/-/recast-0.14.7.tgz#4f1497c2b5826d42a66e8e3c9d80c512983ff61d" @@ -26172,6 +26527,16 @@ recast@^0.18.1: private "^0.1.8" source-map "~0.6.1" +recast@~0.11.12: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -26853,6 +27218,26 @@ request@2.88.0, "request@>=2.76.0 <3.0.0", request@^2.81.0, request@^2.83.0, req tunnel-agent "^0.6.0" uuid "^3.3.2" +request@~2.40.0: + version "2.40.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.40.0.tgz#4dd670f696f1e6e842e66b4b5e839301ab9beb67" + integrity sha1-TdZw9pbx5uhC5mtLXoOTAaub62c= + dependencies: + forever-agent "~0.5.0" + json-stringify-safe "~5.0.0" + mime-types "~1.0.1" + node-uuid "~1.4.0" + qs "~1.0.0" + optionalDependencies: + aws-sign2 "~0.5.0" + form-data "~0.1.0" + hawk "1.1.1" + http-signature "~0.10.0" + oauth-sign "~0.3.0" + stringstream "~0.0.4" + tough-cookie ">=0.12.0" + tunnel-agent "~0.4.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -27001,10 +27386,10 @@ resolve@1.12.0: dependencies: path-parse "^1.0.6" -resolve@1.x, resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.2.tgz#08b12496d9aa8659c75f534a8f05f0d892fff594" - integrity sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw== +resolve@1.x, resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" + integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== dependencies: path-parse "^1.0.6" @@ -27115,7 +27500,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.2, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.2, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -27271,7 +27656,7 @@ rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0 resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -rsvp@^4.7.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.4: +rsvp@^4.7.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.4, rsvp@^4.8.5: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== @@ -27538,6 +27923,14 @@ scheduler@^0.16.2: 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== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" @@ -27689,6 +28082,11 @@ semver@6.3.0, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -27748,9 +28146,9 @@ serialize-javascript@^2.1.0: integrity sha512-a/mxFfU00QT88umAJQsNWOnUKckhNCqOl028N48e7wFmo2/EHpTo9Wso+iJJCMrQnmFvcjto5RJdAHEvVhcyUQ== serialize-to-js@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/serialize-to-js/-/serialize-to-js-3.0.0.tgz#1fd8736744819a4df29dc85e9d04a44a4984edc3" - integrity sha512-WdGgi0jGnWCQXph2p3vkxceDnTfvfyXfYxherQMRcZjSaJzMQdMBAW6i0nojsBKIZ3fFOztZKKVbbm05VbIdRA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/serialize-to-js/-/serialize-to-js-3.0.2.tgz#d71834a18135aff742e516d3b2208f662a46a8ac" + integrity sha512-o5FqeMyxGx1wkp8p14q9QqGXh1JjXtIDYTr15N/B4ThM5ULqlpXdtOO84m950jFGvBkeRD1utW+WyNKvao2ybQ== serve-favicon@^2.5.0: version "2.5.0" @@ -28187,6 +28585,13 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +sntp@0.2.x: + version "0.2.4" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900" + integrity sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA= + dependencies: + hoek "0.9.x" + socket.io-adapter@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" @@ -28884,6 +29289,13 @@ stream-splicer@^2.0.0: inherits "^2.0.1" readable-stream "^2.0.2" +stream-to-array@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353" + integrity sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M= + dependencies: + any-promise "^1.1.0" + stream-to-observable@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" @@ -29069,6 +29481,11 @@ stringify-package@^1.0.0: resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85" integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg== +stringstream@~0.0.4: + version "0.0.6" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" + integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA== + strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -29670,7 +30087,7 @@ terser@4.3.9: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^3.16.1, terser@^3.17.0, terser@^3.7.3, terser@^3.7.5: +terser@^3.16.1, terser@^3.17.0, terser@^3.7.3: version "3.17.0" resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== @@ -29709,7 +30126,7 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" -testem@^2.14.0: +testem@^2.17.0: version "2.17.0" resolved "https://registry.yarnpkg.com/testem/-/testem-2.17.0.tgz#1cb4a2a90524a088803dfe52fbf197a6fd73c883" integrity sha512-PLkIlT523w5rTJPWwR4TL1EiAEa941ECV7d4pMqsB0YdnH+sCTz0loWMKCUSdhR+VijveAZ6anE/JHehE7KqMQ== @@ -29788,7 +30205,15 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= -through2@^2.0.0, through2@^2.0.2, through2@~2.0.3: +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^2.0.0, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -30021,7 +30446,7 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= -tough-cookie@>=2.3.3, tough-cookie@^3.0.1: +tough-cookie@>=0.12.0, tough-cookie@>=2.3.3, tough-cookie@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== @@ -30083,7 +30508,7 @@ tree-kill@1.2.1, tree-kill@^1.1.0, tree-kill@^1.2.1: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== -tree-sync@^1.2.2, tree-sync@^1.4.0: +tree-sync@^1.2.2: version "1.4.0" resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.4.0.tgz#314598d13abaf752547d9335b8f95d9a137100d6" integrity sha512-YvYllqh3qrR5TAYZZTXdspnIhlKAYezPYw11ntmweoceu4VK+keN356phHRIIo1d+RDmLpHZrUlmxga2gc9kSQ== @@ -30094,6 +30519,17 @@ tree-sync@^1.2.2, tree-sync@^1.4.0: quick-temp "^0.1.5" walk-sync "^0.3.3" +tree-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-2.0.0.tgz#e51456731d5ac93b92f9a1d58dd383f76f0f2f39" + integrity sha512-AzeJnbmJjGVfWMTJ0T152fv8NDTbQc9ERY4nEs7Lmxd94Xah2bUS56+CcoTh6FB8qn2KjBMjC0mLNc731aVBqw== + dependencies: + debug "^2.2.0" + fs-tree-diff "^0.5.6" + mkdirp "^0.5.1" + quick-temp "^0.1.5" + walk-sync "^0.3.3" + trim-lines@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.2.tgz#c8adbdbdae21bb5c2766240a661f693afe23e59b" @@ -30372,6 +30808,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tunnel-agent@~0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + integrity sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us= + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -30442,6 +30883,13 @@ typed-styles@^0.0.7: resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -30472,7 +30920,7 @@ ua-parser-js@^0.7.18, ua-parser-js@^0.7.19: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098" integrity sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw== -uc.micro@^1.0.1, uc.micro@^1.0.5: +uc.micro@^1.0.0, uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== @@ -30817,6 +31265,14 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unique-stream@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -30824,6 +31280,13 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + unist-builder@1.0.4, unist-builder@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-1.0.4.tgz#e1808aed30bd72adc3607f25afecebef4dd59e17" @@ -31403,12 +31866,13 @@ vue-docgen-api@^4.1.0: ts-map "^1.0.3" vue-template-compiler "^2.0.0" -vue-docgen-loader@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vue-docgen-loader/-/vue-docgen-loader-1.1.1.tgz#209dd9eda337743a9dc70602ca1617eb8ca86848" - integrity sha512-CBfjAMQ0E4vouUCeT8N8bwZX3k8wHrSS/nKLksAiFY20sH8kc5PWQpmPuhzX4H44QIB8GvR1jr0r3x+I/gh2gw== +vue-docgen-loader@^1.3.0-beta.0: + version "1.3.0-beta.1" + resolved "https://registry.yarnpkg.com/vue-docgen-loader/-/vue-docgen-loader-1.3.0-beta.1.tgz#e72972e7d3c1b37679ec303180ec72c1d1d8d13a" + integrity sha512-842c/87P4T4wChDzuoFs0Iuni66Fe4ztlRi0XFJg1e7EN0IRZEAvgbkE2vT2BcGkQQkhB7VNFjmYSEEucz7BwQ== dependencies: clone "^2.1.2" + jscodeshift "^0.7.0" loader-utils "^1.2.3" querystring "^0.2.0" @@ -31523,6 +31987,15 @@ walk-sync@^1.0.0, walk-sync@^1.1.3: ensure-posix-path "^1.1.0" matcher-collection "^1.1.1" +walk-sync@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-2.0.2.tgz#5ea8a28377c8be68c92d50f4007ea381725da14b" + integrity sha512-dCZkrxfHjPn7tIvdYrX3uMD/R0beVrHpA8lROQ5wWrl8psJgR6xwCkwqTFes0dNujbS2o/ITpvSYgIFsLsf13A== + dependencies: + "@types/minimatch" "^3.0.3" + ensure-posix-path "^1.1.0" + matcher-collection "^2.0.0" + walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -31560,6 +32033,16 @@ watch-detector@^0.1.0: semver "^5.4.1" silent-error "^1.1.0" +watch-detector@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/watch-detector/-/watch-detector-1.0.0.tgz#c7b722d8695fee9ab6071e0f38f258e6adb22609" + integrity sha512-siywMl3fXK30Tlpu/dUBHhlpxhQmHdguZ8OIb813eU9lrVmmsJa9k0+n1HtJ+7p3SzFCPq2XbmR3GUYpPC3TBA== + dependencies: + heimdalljs-logger "^0.1.10" + semver "^6.3.0" + silent-error "^1.1.1" + tmp "^0.1.0" + watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" @@ -32475,6 +32958,11 @@ workerpool@^3.1.1: object-assign "4.1.1" rsvp "^4.8.4" +workerpool@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-5.0.2.tgz#8fd8f6c7250710b9c3143d5f7494db3b6633ce6e" + integrity sha512-RsXfHGFzbqrfrExTN1TyZobWXCN6+vbn9B1CsZ5zQ2ASA2kQaYONCGOAT88Ew+kNSaRq/XmApRC/HRSv9Z98Ng== + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -32540,6 +33028,16 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.1.tgz#558328352e673b5bb192cf86500d60b230667d4b" + integrity sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write-json-file@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" @@ -32657,6 +33155,11 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + xdg-trashdir@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/xdg-trashdir/-/xdg-trashdir-2.1.1.tgz#59a60aaf8e6f9240c1daed9a0944b2f514c27d8e" @@ -32729,7 +33232,7 @@ xregexp@4.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -33029,6 +33532,26 @@ yn@^3.0.0: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +yui@^3.18.1: + version "3.18.1" + resolved "https://registry.yarnpkg.com/yui/-/yui-3.18.1.tgz#e000269ec0a7b6fbc741cbb8fcbd0e65117b014c" + integrity sha1-4AAmnsCntvvHQcu4/L0OZRF7AUw= + dependencies: + request "~2.40.0" + +yuidocjs@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/yuidocjs/-/yuidocjs-0.10.2.tgz#33924967ce619024cd70ef694e267d2f988f73f6" + integrity sha1-M5JJZ85hkCTNcO9pTiZ9L5iPc/Y= + dependencies: + express "^4.13.1" + graceful-fs "^4.1.2" + markdown-it "^4.3.0" + mdn-links "^0.1.0" + minimatch "^3.0.2" + rimraf "^2.4.1" + yui "^3.18.1" + yup@^0.27.0: version "0.27.0" resolved "https://registry.yarnpkg.com/yup/-/yup-0.27.0.tgz#f8cb198c8e7dd2124beddc2457571329096b06e7"