UNPKG

zephyr-rspress-plugin

Version:

Rspress plugin for Zephyr

62 lines (61 loc) • 2.58 kB
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