zephyr-rspress-plugin
Version:
Rspress plugin for Zephyr
62 lines (61 loc) • 2.58 kB
JavaScript
import "node:module";
import { isModuleFederationPlugin } from "zephyr-xpack-internal";
function moduleFederationPublicPathPlugin(options = {}) {
return {
name: 'zephyr-rspress-module-federation-public-path',
setup (api) {
api.onBeforeCreateCompiler({
order: 'post',
handler ({ bundlerConfigs }) {
const configs = bundlerConfigs ?? [];
options.onModuleFederationPlugins?.(configs.filter((config)=>!isNodeCompiler(config)).flatMap((config)=>(config.plugins ?? []).filter((plugin)=>isModuleFederationPlugin(plugin))));
if ('tap-app' !== options.target) for (const config of configs)setPortableModuleFederationPublicPath(config);
}
});
}
};
}
function setPortableModuleFederationPublicPath(config) {
if (isNodeCompiler(config) || !hasExposedModuleFederationRemote(config.plugins)) return;
if (isHttpPublicPath(config.output?.publicPath)) config.output = {
...config.output,
publicPath: 'auto'
};
}
function isNodeCompiler(config) {
return 'node' === config.name || hasNodeTarget(config.target);
}
function hasNodeTarget(target) {
const targets = Array.isArray(target) ? target : [
target
];
return targets.some((value)=>'string' == typeof value && value.toLowerCase().includes('node'));
}
function hasExposedModuleFederationRemote(plugins = []) {
return plugins.some((plugin)=>{
const options = getModuleFederationOptions(plugin);
return Boolean(options && hasExposes(options.exposes));
});
}
function getModuleFederationOptions(plugin) {
if (!isRecord(plugin)) return null;
const candidate = plugin;
const pluginName = candidate.name ?? candidate.constructor?.name;
if (!pluginName?.includes('ModuleFederationPlugin')) return null;
const rawOptions = candidate._options;
if (!isRecord(rawOptions)) return null;
const nestedConfig = rawOptions['config'];
return isRecord(nestedConfig) ? nestedConfig : rawOptions;
}
function hasExposes(exposes) {
if (Array.isArray(exposes)) return exposes.length > 0;
return isRecord(exposes) ? Object.keys(exposes).length > 0 : false;
}
function isRecord(value) {
return 'object' == typeof value && null !== value;
}
function isHttpPublicPath(value) {
return 'string' == typeof value && /^https?:\/\//i.test(value);
}
export { moduleFederationPublicPathPlugin, setPortableModuleFederationPublicPath };
//# sourceMappingURL=moduleFederationPublicPathPlugin.mjs.map