UNPKG

@lynx-js/react-alias-rsbuild-plugin

Version:

A rsbuild plugin for making alias in ReactLynx

89 lines (88 loc) 4.8 kB
import * as __WEBPACK_EXTERNAL_MODULE_node_module_ab9f2194__ from "node:module"; import * as __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__ from "node:path"; const S_PLUGIN_REACT_ALIAS = Symbol.for('@lynx-js/plugin-react-alias'); function pluginReactAlias(options) { const { LAYERS, lazy, rootPath } = options ?? {}; return { name: 'lynx:react-alias', setup (api) { const hasAlias = api.useExposed(S_PLUGIN_REACT_ALIAS); if (hasAlias) return; api.expose(S_PLUGIN_REACT_ALIAS, true); const require = (0, __WEBPACK_EXTERNAL_MODULE_node_module_ab9f2194__.createRequire)(import.meta.url); const reactLynxDir = __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__["default"].dirname(require.resolve('@lynx-js/react/package.json', { paths: [ rootPath ?? api.context.rootPath ] })); const resolve = createLazyResolver(reactLynxDir, lazy ? [ 'lazy', 'import' ] : [ 'import' ]); api.modifyRsbuildConfig((config, { mergeRsbuildConfig })=>mergeRsbuildConfig(config, { source: { include: [ reactLynxDir ] } })); api.modifyBundlerChain(async (chain)=>{ const jsxRuntime = { background: await resolve('@lynx-js/react/jsx-runtime'), mainThread: await resolve('@lynx-js/react/lepus/jsx-runtime') }; const jsxDevRuntime = { background: await resolve('@lynx-js/react/jsx-dev-runtime'), mainThread: await resolve('@lynx-js/react/lepus/jsx-dev-runtime') }; const reactLepus = { background: await resolve('@lynx-js/react'), mainThread: await resolve('@lynx-js/react/lepus') }; chain.module.rule('react:jsx-runtime:main-thread').issuerLayer(LAYERS.MAIN_THREAD).resolve.alias.set('react/jsx-runtime', jsxRuntime.mainThread).set('react/jsx-dev-runtime', jsxDevRuntime.mainThread).set('@lynx-js/react/jsx-runtime', jsxRuntime.mainThread).set('@lynx-js/react/jsx-dev-runtime', jsxDevRuntime.mainThread).set('@lynx-js/react/lepus$', reactLepus.mainThread).set('@lynx-js/react/lepus/jsx-runtime', jsxRuntime.mainThread).set('@lynx-js/react/lepus/jsx-dev-runtime', jsxDevRuntime.mainThread).end().end().end().rule('react:jsx-runtime:background').issuerLayer(LAYERS.BACKGROUND).resolve.alias.set('react/jsx-runtime', jsxRuntime.background).set('react/jsx-dev-runtime', jsxDevRuntime.background).set('@lynx-js/react/jsx-runtime', jsxRuntime.background).set('@lynx-js/react/jsx-dev-runtime', jsxDevRuntime.background).set('@lynx-js/react/lepus$', reactLepus.background).end().end().end().end(); const transformedEntries = [ 'internal', 'legacy-react-runtime', 'runtime-components', 'worklet-runtime/bindings' ]; await Promise.all(transformedEntries.map((entry)=>`@lynx-js/react/${entry}`).map((entry)=>resolve(entry).then((value)=>{ chain.resolve.alias.set(`${entry}$`, value); }))); chain.resolve.alias.set('react$', reactLepus.background).set('@lynx-js/react$', reactLepus.background); const preactEntries = [ 'preact', 'preact/compat', 'preact/debug', 'preact/devtools', 'preact/hooks', 'preact/test-utils', 'preact/jsx-runtime', 'preact/jsx-dev-runtime', 'preact/compat', 'preact/compat/client', 'preact/compat/server', 'preact/compat/jsx-runtime', 'preact/compat/jsx-dev-runtime', 'preact/compat/scheduler' ]; await Promise.all(preactEntries.map((entry)=>resolve(entry).then((value)=>{ chain.resolve.alias.set(`${entry}$`, value); }))); }); } }; } function createLazyResolver(context, conditionNames) { let lazyExports; let resolverLazy; return async (request)=>{ const { default: resolver } = await import("enhanced-resolve"); return (lazyExports ??= {})[request] ??= (resolverLazy ??= resolver.create.sync({ conditionNames }))(context, request); }; } export { pluginReactAlias };