UNPKG

@web/storybook-builder

Version:
97 lines 4.44 kB
"use strict"; 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