@lynx-js/react-alias-rsbuild-plugin
Version:
A rsbuild plugin for making alias in ReactLynx
89 lines (88 loc) • 4.8 kB
JavaScript
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 };