134 lines
3.8 KiB
JavaScript
Raw Normal View History

import React from 'react';
import { storiesOf, configure, addDecorator, addParameters } from '@storybook/react';
import { Global, ThemeProvider, themes, createReset } from '@storybook/theming';
import { INITIAL_VIEWPORTS } from '@storybook/addon-viewport';
import { withCssResources } from '@storybook/addon-cssresources';
import { withA11Y } from '@storybook/addon-a11y';
import { withNotes } from '@storybook/addon-notes';
import 'storybook-chromatic';
import addHeadWarning from './head-warning';
import extraViewports from './extra-viewports.json';
2018-10-14 17:39:35 +02:00
if (process.env.NODE_ENV === 'development') {
if (!process.env.DOTENV_DEVELOPMENT_DISPLAY_WARNING) {
2018-12-29 19:50:44 +01:00
addHeadWarning('dotenv-env', 'Dotenv development file not loaded');
2018-10-14 17:39:35 +02:00
}
if (!process.env.STORYBOOK_DISPLAY_WARNING) {
2018-12-29 19:50:44 +01:00
addHeadWarning('env-glob', 'Global storybook env var not loaded');
2018-10-14 17:39:35 +02:00
}
if (process.env.DISPLAY_WARNING) {
2018-12-29 19:50:44 +01:00
addHeadWarning('env-extra', 'Global non-storybook env var loaded');
2018-10-14 17:39:35 +02:00
}
}
2018-12-29 19:50:44 +01:00
addHeadWarning('preview-head-not-loaded', 'Preview head not loaded');
addHeadWarning('dotenv-file-not-loaded', 'Dotenv file not loaded');
2017-12-27 10:39:31 +01:00
addDecorator(withCssResources);
addDecorator(withA11Y);
addDecorator(withNotes);
2017-11-27 13:48:46 +11:00
addDecorator(storyFn => (
2018-12-29 19:50:44 +01:00
<ThemeProvider theme={themes.normal}>
<Global styles={createReset} />
{storyFn()}
2018-12-29 19:50:44 +01:00
</ThemeProvider>
));
addParameters({
a11y: {},
options: {
2018-12-11 01:10:15 +01:00
name: 'Storybook',
hierarchySeparator: /\/|\./,
hierarchyRootSeparator: '|',
// theme: themes.dark,
},
viewports: {
...INITIAL_VIEWPORTS,
...extraViewports,
},
backgrounds: [
{ name: 'storybook app', value: themes.normal.background.app, default: true },
{ name: 'light', value: '#eeeeee' },
{ name: 'dark', value: '#222222' },
],
});
let previousExports = {};
if (module && module.hot && module.hot.dispose) {
({ previousExports = {} } = module.hot.data || {});
module.hot.dispose(data => {
// eslint-disable-next-line no-param-reassign
data.previousExports = previousExports;
});
}
// The simplest version of examples would just export this function for users to use
2018-12-20 14:16:17 +11:00
function importAll(context) {
const storyStore = window.__STORYBOOK_CLIENT_API__._storyStore; // eslint-disable-line no-undef, no-underscore-dangle
context.keys().forEach(filename => {
const fileExports = context(filename);
2018-12-20 14:16:17 +11:00
// A old-style story file
if (!fileExports.default) {
return;
}
const { default: component, ...examples } = fileExports;
let componentOptions = component;
if (component.prototype && component.prototype.isReactComponent) {
componentOptions = { component };
}
const kindName = componentOptions.title || componentOptions.component.displayName;
if (previousExports[filename]) {
if (previousExports[filename] === fileExports) {
return;
}
// Otherwise clear this kind
storyStore.removeStoryKind(kindName);
storyStore.incrementRevision();
}
// We pass true here to avoid the warning about HMR. It's cool clientApi, we got this
const kind = storiesOf(kindName, true);
(componentOptions.decorators || []).forEach(decorator => {
kind.addDecorator(decorator);
});
if (componentOptions.parameters) {
kind.addParameters(componentOptions.parameters);
}
Object.keys(examples).forEach(key => {
const example = examples[key];
const { title = key, parameters } = example;
kind.add(title, example, parameters);
});
previousExports[filename] = fileExports;
});
}
2017-11-27 13:48:46 +11:00
function loadStories() {
let req;
req = require.context('../../lib/ui/src', true, /\.stories\.js$/);
2018-01-31 14:54:29 +02:00
importAll(req);
req = require.context('../../lib/components/src', true, /\.stories\.js$/);
2018-01-31 14:54:29 +02:00
importAll(req);
req = require.context('./stories', true, /\.stories\.js$/);
2018-01-31 14:54:29 +02:00
importAll(req);
2017-11-27 13:48:46 +11:00
}
configure(loadStories, module);