creevey
Version:
Cross-browser screenshot testing tool for Storybook with fancy UI Runner
137 lines (104 loc) • 5.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = register;
var _module = _interopRequireDefault(require("module"));
var _fs = _interopRequireDefault(require("fs"));
var _path = require("path");
var _pirates = require("pirates");
var _types = require("../../../types");
var _utils = require("../../utils");
var _creeveyPlugin = _interopRequireDefault(require("./creevey-plugin"));
var _helpers = require("../../storybook/helpers");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
let parents = null;
let story = null; //@ts-expect-error private field doesn't have types
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment
const jsLoader = _module.default._extensions['.js']; //@ts-expect-error private field doesn't have types
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
_module.default._extensions['.js'] = function (mod, filename) {
parents = Object.values(require.cache).filter(m => m === null || m === void 0 ? void 0 : m.children.includes(mod)).filter(_types.isDefined).map(m => m.filename); // eslint-disable-next-line @typescript-eslint/no-unsafe-call
jsLoader(mod, filename);
parents = null;
};
(0, _pirates.addHook)(() => '', {
exts: ['.jpg', '.jpeg', '.png', '.gif', '.eot', '.otf', '.svg', '.ttf', '.woff', '.woff2', '.css', '.less', '.scss', '.styl'],
ignoreNodeModules: false
});
function getRequireContext(rootDir) {
return function requireContext(rootPath, deep, filter) {
const ids = [];
let contextPath; // Relative path
if (rootPath.startsWith('.')) contextPath = (0, _path.resolve)(rootDir, rootPath); // Module path
else if (!(0, _path.isAbsolute)(rootPath)) contextPath = require.resolve(rootPath); // Absolute path
else contextPath = rootPath;
const traverse = dirPath => {
_fs.default.readdirSync(dirPath, {
withFileTypes: true
}).forEach(dirent => {
var _filter$test;
const filename = dirent.name;
const filePath = (0, _path.join)(dirPath, filename);
if (dirent.isDirectory() && deep) return traverse(filePath);
if (dirent.isFile() && ((_filter$test = filter === null || filter === void 0 ? void 0 : filter.test(`./${(0, _path.relative)(contextPath, filePath)}`)) !== null && _filter$test !== void 0 ? _filter$test : true)) return ids.push(filePath);
});
};
traverse(contextPath);
const context = id => {
story = id; // eslint-disable-next-line @typescript-eslint/no-var-requires
const storyModule = require(id);
story = null;
return storyModule;
};
context.id = contextPath;
context.keys = () => ids;
context.resolve = id => id;
return context;
};
}
async function register(config, debug = false) {
const requireContext = getRequireContext(config.storybookDir);
const preview = (0, _path.resolve)(config.storybookDir, 'preview');
if ((0, _helpers.hasDocsAddon)()) {
const mdx = (await Promise.resolve(`${(0, _helpers.resolveFromStorybookAddonDocs)('@mdx-js/mdx')}`).then(s => _interopRequireWildcard(require(s)))).default;
const {
mdxOptions
} = await Promise.resolve().then(() => _interopRequireWildcard(require('../webpack/mdx-loader')));
(0, _pirates.addHook)((code, filename) => {
if (!story || !filename.startsWith(story)) return code;
return mdx.sync(code, mdxOptions());
}, {
exts: ['.mdx']
});
} // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
(await Promise.resolve().then(() => _interopRequireWildcard(require('@babel/register')))).default(config.babelOptions({
babelrc: false,
rootMode: 'upward-optional',
ignore: [/node_modules/],
extensions: (0, _helpers.hasDocsAddon)() ? [..._utils.extensions, '.mdx'] : _utils.extensions,
parserOpts: {
sourceType: 'module',
plugins: ['classProperties', 'decorators-legacy', 'jsx', 'typescript']
},
plugins: [[_creeveyPlugin.default, {
debug,
preview,
parents: () => parents,
story: () => story
}], ['@babel/plugin-transform-runtime', {
// eslint-disable-next-line @typescript-eslint/no-var-requires
version: require('@babel/helpers/package.json').version,
absoluteRuntime: true,
corejs: 3
}]],
presets: [['@babel/preset-env', {
targets: {
node: '10'
}
}]]
}));
return requireContext;
}