UNPKG

@macrof/cli

Version:

React MicroFrontend compiler, Typescript, Webpack 5, ModuleFederation

73 lines (72 loc) 2.63 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const extractUrlAndGlobal_1 = __importDefault(require("webpack/lib/util/extractUrlAndGlobal")); const webpack_sources_1 = require("webpack-sources"); const MODULE_NAME = "MFDynamicRemotes"; class default_1 { apply(compiler) { compiler.hooks.make.tap(MODULE_NAME, compilation => { const scriptExternalModules = []; compilation.hooks.buildModule.tap(MODULE_NAME, (module) => { if (module.constructor.name === 'ExternalModule' && module.externalType === 'script') { scriptExternalModules.push(module); } }); compilation.hooks.afterCodeGeneration.tap(MODULE_NAME, () => { scriptExternalModules.map(module => { const urlTemplate = (0, extractUrlAndGlobal_1.default)(module.request)[0]; const sourceMap = compilation.codeGenerationResults.get(module).sources; sourceMap.set('javascript', new webpack_sources_1.RawSource(compilation.codeGenerationResults .get(module).sources .get('javascript') .source() .replace(`"${urlTemplate}"`, toExpression(urlTemplate)))); }); }); }); } } exports.default = default_1; ; const toExpression = (templateUrl) => { const result = [], current = []; let isExpression = false, invalid = false; for (const c of templateUrl) { if (c === '[') { if (isExpression) { invalid = true; break; } isExpression = true; if (current.length) { result.push(`"${current.join('')}"`); current.length = 0; } } else if (c === ']') { if (!isExpression) { invalid = true; break; } isExpression = false; if (current.length) { result.push(`${current.join('')}`); current.length = 0; } current.length = 0; } else { current.push(c); } } if (isExpression || invalid) { throw new Error(`Invalid template URL "${templateUrl}"`); } if (current.length) { result.push(`"${current.join('')}"`); } return result.join(' + '); };