diff --git a/lib/components/src/blocks/PropsTable/PropRow.stories.tsx b/lib/components/src/blocks/PropsTable/PropRow.stories.tsx index 25ca899dec43..303cdbd9f910 100644 --- a/lib/components/src/blocks/PropsTable/PropRow.stories.tsx +++ b/lib/components/src/blocks/PropsTable/PropRow.stories.tsx @@ -7,6 +7,7 @@ import { DocsPageWrapper } from '../DocsPage'; export default { Component: PropRow, title: 'Docs|PropRow', + excludeStories: /.*Def$/, decorators: [ getStory => ( @@ -18,7 +19,7 @@ export default { ], }; -const stringDef = { +export const stringDef = { name: 'someString', type: { name: 'string' }, required: true, @@ -26,17 +27,17 @@ const stringDef = { defaultValue: 'fixme', }; -const longNameDef = { +export const longNameDef = { ...stringDef, name: 'reallyLongStringThatTakesUpSpace', }; -const longDescDef = { +export const longDescDef = { ...stringDef, description: 'really long description that takes up a lot of space. sometimes this happens.', }; -const numberDef = { +export const numberDef = { name: 'someNumber', type: { name: 'number' }, required: false, @@ -44,7 +45,7 @@ const numberDef = { defaultValue: 0, }; -const objectDef = { +export const objectDef = { name: 'someObject', type: { name: 'objectOf', value: { name: 'number' } }, required: false, @@ -52,7 +53,7 @@ const objectDef = { defaultValue: { value: '{ key: 1 }', computed: false }, }; -const arrayDef = { +export const arrayDef = { name: 'someOArray', type: { name: 'arrayOf', value: { name: 'number' } }, required: false, @@ -60,7 +61,7 @@ const arrayDef = { defaultValue: { value: '[1, 2, 3]', computed: false }, }; -const complexDef = { +export const complexDef = { name: 'someComplex', type: { name: 'objectOf', diff --git a/lib/components/src/blocks/PropsTable/PropsTable.stories.tsx b/lib/components/src/blocks/PropsTable/PropsTable.stories.tsx index 6ac13b588692..43fb624daa2a 100644 --- a/lib/components/src/blocks/PropsTable/PropsTable.stories.tsx +++ b/lib/components/src/blocks/PropsTable/PropsTable.stories.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { PropsTable, PropsTableError } from './PropsTable'; import { DocsPageWrapper } from '../DocsPage'; -import * as rowStories from './PropRow.stories'; +import { stringDef, numberDef } from './PropRow.stories'; export default { Component: PropsTable, @@ -13,6 +13,4 @@ export const error = () => ; export const empty = () => ; -const { row: stringRow } = rowStories.string().props; -const { row: numberRow } = rowStories.number().props; -export const normal = () => ; +export const normal = () => ; diff --git a/lib/core/src/client/preview/start.js b/lib/core/src/client/preview/start.js index 77a84389d1bf..a4a33b914e03 100644 --- a/lib/core/src/client/preview/start.js +++ b/lib/core/src/client/preview/start.js @@ -21,6 +21,20 @@ 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 ( + (!includeStories || matches(key, includeStories)) && + (!excludeStories || !matches(key, excludeStories)) + ); +} + function showMain() { document.body.classList.remove(classes.NOPREVIEW); document.body.classList.remove(classes.ERROR); @@ -283,7 +297,7 @@ export default function start(render, { decorateStory } = {}) { ); } - const { default: meta, ...examples } = fileExports; + const { default: meta, ...exports } = fileExports; const kindName = meta.title; if (previousExports[filename]) { @@ -307,10 +321,12 @@ export default function start(render, { decorateStory } = {}) { kind.addParameters(meta.parameters); } - Object.keys(examples).forEach(key => { - const example = examples[key]; - const { title = example.title || key, parameters } = example; - kind.add(title, example, parameters); + Object.keys(exports).forEach(key => { + if (isExportStory(key, meta)) { + const story = exports[key]; + const { title = story.title || key, parameters } = story; + kind.add(title, story, parameters); + } }); previousExports[filename] = fileExports; diff --git a/lib/core/src/client/preview/start.test.js b/lib/core/src/client/preview/start.test.js index 76f365e2bc09..074ebcda5bca 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 from './start'; +import start, { isExportStory } from './start'; jest.mock('@storybook/client-logger'); jest.mock('global', () => ({ @@ -142,3 +142,37 @@ describe('STORY_INIT', () => { expect(store.setSelection).toHaveBeenCalledWith({ storyId: 'kind--story' }); }); }); + +describe('story filters for module exports', () => { + 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(); + }); +});