@storybook/addon-storyshots
Version:
Take a code snapshot of every story automatically with Jest
98 lines (97 loc) • 4.23 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getMainFile = exports.getPreviewFile = void 0;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const core_webpack_1 = require("@storybook/core-webpack");
const core_common_1 = require("@storybook/core-common");
const register_1 = __importDefault(require("@storybook/babel-plugin-require-context-hook/register"));
const global_1 = require("@storybook/global");
(0, register_1.default)();
const isFile = (file) => {
try {
return fs_1.default.lstatSync(file).isFile();
}
catch (e) {
return false;
}
};
const supportedExtensions = ['ts', 'tsx', 'js', 'jsx', 'cjs', 'mjs'];
const resolveFile = (configDir, supportedFilenames) => supportedFilenames
.flatMap((filename) => supportedExtensions.map((ext) => path_1.default.join(configDir, `${filename}.${ext}`)))
.find(isFile) || false;
const getPreviewFile = (configDir) => resolveFile(configDir, ['preview', 'config']);
exports.getPreviewFile = getPreviewFile;
const getMainFile = (configDir) => resolveFile(configDir, ['main']);
exports.getMainFile = getMainFile;
function getConfigPathParts(input) {
const configDir = path_1.default.resolve(input);
if (fs_1.default.lstatSync(configDir).isDirectory()) {
const output = {};
const preview = (0, exports.getPreviewFile)(configDir);
const main = (0, exports.getMainFile)(configDir);
if (preview) {
output.preview = preview;
}
if (main) {
const { default: defaultExport, ...rest } = jest.requireActual(main);
const { stories = [], features = {} } = defaultExport || rest;
output.features = features;
const workingDir = process.cwd();
output.stories = stories.map((entry) => {
const specifier = (0, core_common_1.normalizeStoriesEntry)(entry, {
configDir,
workingDir,
});
return specifier;
});
output.requireContexts = output.stories?.map((specifier) => {
const { path: basePath, recursive, match } = (0, core_webpack_1.toRequireContext)(specifier);
// eslint-disable-next-line no-underscore-dangle
return global_1.global.__requireContext(workingDir, basePath, recursive, match);
});
}
return output;
}
return { preview: configDir };
}
function configure(options) {
const { configPath = '.storybook', config, storybook } = options;
if (config && typeof config === 'function') {
config(storybook);
return;
}
const { preview, features = {}, stories = [], requireContexts = [], } = getConfigPathParts(configPath);
global_1.global.FEATURES = features;
global_1.global.CONFIG_TYPE = 'DEVELOPMENT';
global_1.global.STORIES = stories.map((specifier) => ({
...specifier,
importPathMatcher: specifier.importPathMatcher.source,
}));
if (preview) {
// This is essentially the same code as builders/builder-webpack5/templates/virtualModuleEntry.template
const { parameters, decorators, globals, globalTypes, argsEnhancers, argTypesEnhancers, runStep, } = jest.requireActual(preview);
if (decorators) {
decorators.forEach((decorator) => storybook.addDecorator(decorator));
}
if (parameters || globals || globalTypes) {
storybook.addParameters({ ...parameters, globals, globalTypes });
}
if (runStep) {
storybook.addStepRunner(runStep);
}
if (argsEnhancers) {
argsEnhancers.forEach((enhancer) => storybook.addArgsEnhancer(enhancer));
}
if (argTypesEnhancers) {
argTypesEnhancers.forEach((enhancer) => storybook.addArgTypesEnhancer(enhancer));
}
}
if (requireContexts && requireContexts.length) {
storybook.configure(requireContexts, false, false);
}
}
exports.default = configure;