@web/storybook-builder
Version:
Storybook builder powered by `@web/dev-server`
97 lines • 4.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CANDIDATES = exports.rollupPluginPrebundleModules = exports.PREBUNDLED_MODULES_DIR = void 0;
const esbuild_1 = require("esbuild");
const promises_1 = require("node:fs/promises");
const node_path_1 = require("node:path");
const esbuild_plugin_commonjs_named_exports_js_1 = require("./esbuild-plugin-commonjs-named-exports.js");
const stringify_process_envs_js_1 = require("./stringify-process-envs.js");
exports.PREBUNDLED_MODULES_DIR = (0, node_path_1.normalize)('node_modules/.prebundled_modules');
function rollupPluginPrebundleModules(env, options) {
const modulePaths = {};
return {
name: 'rollup-plugin-prebundle-modules',
async buildStart() {
const modules = exports.CANDIDATES.filter(moduleExists);
const modulesDir = (0, node_path_1.join)(process.cwd(), exports.PREBUNDLED_MODULES_DIR);
await (0, promises_1.rm)(modulesDir, { recursive: true, force: true });
for (const module of modules) {
modulePaths[module] = (0, node_path_1.join)(modulesDir, module.endsWith('.js') ? module.replace(/\.js$/, '.mjs') : `${module}.mjs`);
}
await (0, esbuild_1.build)({
entryPoints: modules,
outdir: exports.PREBUNDLED_MODULES_DIR,
outExtension: { '.js': '.mjs' },
bundle: true,
format: 'esm',
splitting: true,
sourcemap: true,
alias: Object.assign({}, (moduleExists('@storybook/react-dom-shim') && {
'@storybook/react-dom-shim': await getReactDomShimAlias(options),
})),
external: [...modules],
define: (0, stringify_process_envs_js_1.stringifyProcessEnvs)(env),
plugins: [(0, esbuild_plugin_commonjs_named_exports_js_1.esbuildPluginCommonjsNamedExports)(modules)],
});
},
async resolveId(source) {
return modulePaths[source];
},
};
}
exports.rollupPluginPrebundleModules = rollupPluginPrebundleModules;
// this is different to https://github.com/storybookjs/storybook/blob/v8.5.0/code/builders/builder-vite/src/optimizeDeps.ts
// builder-vite bundles different dependencies for performance reasons
// we aim only at browserifying NodeJS dependencies (CommonJS/process.env/...)
exports.CANDIDATES = [
/* for different addons built with React and for MDX */
'react',
'react/jsx-runtime',
'react/jsx-dev-runtime',
'react-dom',
'react-dom/client',
/* for different packages */
'memoizerific',
'tiny-invariant',
/* for @storybook/core */
'jsdoc-type-pratt-parser',
/* for @storybook/addon-a11y */
'axe-core',
'vitest-axe/matchers',
/* for @storybook/addon-docs */
'color-convert',
];
function moduleExists(moduleName) {
try {
require.resolve(moduleName, { paths: [process.cwd()] });
return true;
}
catch (e) {
return false;
}
}
/**
* Get react-dom version from the resolvedReact preset, which points to either a root react-dom
* dependency or the react-dom dependency shipped with addon-docs
*/
async function getIsReactVersion18or19(options) {
const { legacyRootApi } = (await options.presets.apply('frameworkOptions')) || {};
if (legacyRootApi) {
return false;
}
const resolvedReact = await options.presets.apply('resolvedReact', {});
const reactDom = resolvedReact.reactDom || (0, node_path_1.dirname)(require.resolve('react-dom/package.json'));
if (!(0, node_path_1.isAbsolute)(reactDom)) {
// if react-dom is not resolved to a file we can't be sure if the version in package.json is correct or even if package.json exists
// this happens when react-dom is resolved to 'preact/compat' for example
return false;
}
const { version } = JSON.parse(await (0, promises_1.readFile)((0, node_path_1.join)(reactDom, 'package.json'), 'utf-8'));
return version.startsWith('18') || version.startsWith('19') || version.startsWith('0.0.0');
}
async function getReactDomShimAlias(options) {
return (await getIsReactVersion18or19(options))
? require.resolve('@storybook/react-dom-shim')
: require.resolve('@storybook/react-dom-shim/dist/react-16');
}
//# sourceMappingURL=rollup-plugin-prebundle-modules.js.map