UNPKG

@module-federation/manifest

Version:

Provide manifest/stats for webpack/rspack MF project .

1,219 lines (1,212 loc) 94.2 kB
'use strict'; var chalk = require('chalk'); var path = require('path'); var sdk = require('@module-federation/sdk'); var core = require('@module-federation/dts-plugin/core'); var fs = require('fs'); var managers = require('@module-federation/managers'); var PLUGIN_IDENTIFIER = 'Module Federation Manifest Plugin'; var HOT_UPDATE_SUFFIX = '.hot-update'; var logger = sdk.createLogger(chalk.cyan("[ ".concat(PLUGIN_IDENTIFIER, " ]"))); function _array_like_to_array$2(arr, len) { if (len == null || len > arr.length) len = arr.length; for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i]; return arr2; } function _array_with_holes$2(arr) { if (Array.isArray(arr)) return arr; } function _array_without_holes$1(arr) { if (Array.isArray(arr)) return _array_like_to_array$2(arr); } function _define_property$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _iterable_to_array$1(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _iterable_to_array_limit$2(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){ _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally{ try { if (!_n && _i["return"] != null) _i["return"](); } finally{ if (_d) throw _e; } } return _arr; } function _non_iterable_rest$2() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _non_iterable_spread$1() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _object_spread$2(target) { for(var i = 1; i < arguments.length; i++){ var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === "function") { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function(key) { _define_property$2(target, key, source[key]); }); } return target; } function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); keys.push.apply(keys, symbols); } return keys; } function _object_spread_props$2(target, source) { source = source != null ? source : {}; if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function(key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _sliced_to_array$2(arr, i) { return _array_with_holes$2(arr) || _iterable_to_array_limit$2(arr, i) || _unsupported_iterable_to_array$2(arr, i) || _non_iterable_rest$2(); } function _to_consumable_array$1(arr) { return _array_without_holes$1(arr) || _iterable_to_array$1(arr) || _unsupported_iterable_to_array$2(arr) || _non_iterable_spread$1(); } function _unsupported_iterable_to_array$2(o, minLen) { if (!o) return; if (typeof o === "string") return _array_like_to_array$2(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array$2(o, minLen); } function isHotFile(file) { return file.includes(HOT_UPDATE_SUFFIX); } var collectAssets = function(assets, jsTargetSet, cssTargetSet) { assets.forEach(function(file) { if (file.endsWith('.css')) { cssTargetSet.add(file); } else { if (isDev()) { if (!isHotFile(file)) { jsTargetSet.add(file); } } else { jsTargetSet.add(file); } } }); }; function getSharedModuleName(name) { var _name_split = _sliced_to_array$2(name.split(' '), 5); _name_split[0]; _name_split[1]; _name_split[2]; _name_split[3]; var sharedInfo = _name_split[4]; return sharedInfo.split('@').slice(0, -1).join('@'); } function getAssetsByChunkIDs(compilation, chunkIDMap) { var arrayChunks = Array.from(compilation.chunks); var assetMap = {}; Object.keys(chunkIDMap).forEach(function(key) { var chunkIDs = Array.from(chunkIDMap[key]); if (!assetMap[key]) { assetMap[key] = { css: new Set(), js: new Set() }; } chunkIDs.forEach(function(chunkID) { var chunk = arrayChunks.find(function(item) { return item.id === chunkID; }); if (chunk) { collectAssets(_to_consumable_array$1(chunk.files), assetMap[key].js, assetMap[key].css); } }); }); var assets = {}; Object.keys(assetMap).map(function(key) { assets[key] = { js: Array.from(assetMap[key].js), css: Array.from(assetMap[key].css) }; }); return assets; } function findChunk(id, chunks) { var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined; try { for(var _iterator = chunks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){ var chunk = _step.value; if (id === chunk.id) { return chunk; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally{ try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally{ if (_didIteratorError) { throw _iteratorError; } } } } function getSharedModules(stats, sharedModules) { var _stats_modules; // 获取入口文件就是实际内容的 module var entryContentModuleNames = []; var effectiveSharedModules = ((_stats_modules = stats.modules) === null || _stats_modules === void 0 ? void 0 : _stats_modules.reduce(function(sum, module) { var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined; try { for(var _iterator = sharedModules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){ var sharedModule = _step.value; if (sharedModule.name === module.issuerName) { entryContentModuleNames.push(sharedModule.name); sum.push([ getSharedModuleName(module.issuerName), module ]); return sum; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally{ try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally{ if (_didIteratorError) { throw _iteratorError; } } } return sum; }, [])) || []; // 获取入口文件仅作为 Re Export 的 module var entryReExportModules = sharedModules.filter(function(sharedModule) { return !entryContentModuleNames.includes(sharedModule.name); }); if (entryReExportModules.length) { effectiveSharedModules = effectiveSharedModules.concat(stats.modules.reduce(function(sum, module) { var flag = false; var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined; try { for(var _iterator = entryReExportModules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){ var entryReExportModule = _step.value; if (flag) { break; } if (module.reasons) { var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined; try { for(var _iterator1 = module.reasons[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){ var issueModule = _step1.value; if (issueModule.moduleName === entryReExportModule.name) { sum.push([ getSharedModuleName(entryReExportModule.name), module ]); flag = true; break; } } } catch (err) { _didIteratorError1 = true; _iteratorError1 = err; } finally{ try { if (!_iteratorNormalCompletion1 && _iterator1.return != null) { _iterator1.return(); } } finally{ if (_didIteratorError1) { throw _iteratorError1; } } } } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally{ try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally{ if (_didIteratorError) { throw _iteratorError; } } } return sum; }, [])); } return effectiveSharedModules; } function getAssetsByChunk(chunk, entryPointNames) { var assesSet = { js: { sync: new Set(), async: new Set() }, css: { sync: new Set(), async: new Set() } }; var collectChunkFiles = function(targetChunk, type) { _to_consumable_array$1(targetChunk.groupsIterable).forEach(function(chunkGroup) { if (chunkGroup.name && !entryPointNames.includes(chunkGroup.name)) { collectAssets(chunkGroup.getFiles(), assesSet.js[type], assesSet.css[type]); } }); }; collectChunkFiles(chunk, 'sync'); _to_consumable_array$1(chunk.getAllAsyncChunks()).forEach(function(asyncChunk) { collectAssets(_to_consumable_array$1(asyncChunk.files), assesSet.js['async'], assesSet.css['async']); collectChunkFiles(asyncChunk, 'async'); }); var assets = { js: { sync: Array.from(assesSet.js.sync), async: Array.from(assesSet.js.async) }, css: { sync: Array.from(assesSet.css.sync), async: Array.from(assesSet.css.async) } }; return assets; } function assert(condition, msg) { if (!condition) { error(msg); } } function error(msg) { throw new Error("[ ".concat(PLUGIN_IDENTIFIER, " ]: ").concat(msg)); } function isDev() { return process.env['NODE_ENV'] === 'development'; } function getFileNameWithOutExt(str) { return str.replace(path.extname(str), ''); } function getFileName(manifestOptions) { if (!manifestOptions) { return { statsFileName: sdk.StatsFileName, manifestFileName: sdk.ManifestFileName }; } var filePath = typeof manifestOptions === 'boolean' ? '' : manifestOptions.filePath || ''; var fileName = typeof manifestOptions === 'boolean' ? '' : manifestOptions.fileName || ''; var JSON_EXT = '.json'; var addExt = function(name) { if (name.endsWith(JSON_EXT)) { return name; } return "".concat(name).concat(JSON_EXT); }; var insertSuffix = function(name, suffix) { return name.replace(JSON_EXT, "".concat(suffix).concat(JSON_EXT)); }; var manifestFileName = fileName ? addExt(fileName) : sdk.ManifestFileName; var statsFileName = fileName ? insertSuffix(manifestFileName, '-stats') : sdk.StatsFileName; return { statsFileName: sdk.simpleJoinRemoteEntry(filePath, statsFileName), manifestFileName: sdk.simpleJoinRemoteEntry(filePath, manifestFileName) }; } function getTypesMetaInfo(pluginOptions, context) { var defaultRemoteOptions = { generateAPITypes: true, compileInChildProcess: true }; var defaultTypesMetaInfo = { path: '', name: '', zip: '', api: '' }; try { var normalizedDtsOptions = sdk.normalizeOptions(core.isTSProject(pluginOptions.dts, context), { generateTypes: defaultRemoteOptions, consumeTypes: {} }, 'mfOptions.dts')(pluginOptions.dts); if (normalizedDtsOptions === false) { return defaultTypesMetaInfo; } var normalizedRemote = sdk.normalizeOptions(true, defaultRemoteOptions, 'mfOptions.dts.generateTypes')(normalizedDtsOptions.generateTypes); if (normalizedRemote === false) { return defaultTypesMetaInfo; } var _retrieveTypesAssetsInfo = core.retrieveTypesAssetsInfo(_object_spread_props$2(_object_spread$2({}, normalizedRemote), { context: context, moduleFederationConfig: pluginOptions })), apiFileName = _retrieveTypesAssetsInfo.apiFileName, zipName = _retrieveTypesAssetsInfo.zipName, zipPrefix = _retrieveTypesAssetsInfo.zipPrefix; var zip = path.join(zipPrefix, zipName); var api = path.join(zipPrefix, apiFileName); return { path: '', name: '', zip: zip, api: api }; } catch (err) { logger.warn("getTypesMetaInfo failed, it will use the default types meta info, and the errors as belows: ".concat(err)); return defaultTypesMetaInfo; } } function asyncGeneratorStep$2(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _async_to_generator$2(fn) { return function() { var self = this, args = arguments; return new Promise(function(resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep$2(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep$2(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function _class_call_check$3(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties$3(target, props) { for(var i = 0; i < props.length; i++){ var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _create_class$3(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$3(Constructor.prototype, protoProps); return Constructor; } function _ts_generator$2(thisArg, body) { var f, y, t, g, _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function(v) { return step([ n, v ]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while(_)try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [ op[0] & 2, t.value ]; switch(op[0]){ case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [ 0 ]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [ 6, e ]; y = 0; } finally{ f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } var ManifestManager = /*#__PURE__*/ function() { function ManifestManager() { _class_call_check$3(this, ManifestManager); this._options = {}; } _create_class$3(ManifestManager, [ { key: "manifest", get: function get() { return this._manifest; } }, { key: "init", value: function init(options) { this._options = options; } }, { key: "fileName", get: function get() { return getFileName(this._options.manifest).manifestFileName; } }, { key: "generateManifest", value: function generateManifest(options) { var extraOptions = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; var _this = this; return _async_to_generator$2(function() { var compilation, publicPath, stats, compiler, bundler, additionalData, disableEmit, id, name, metaData, manifest, manifestFileName, ret; return _ts_generator$2(this, function(_state) { switch(_state.label){ case 0: compilation = options.compilation, publicPath = options.publicPath, stats = options.stats, compiler = options.compiler, bundler = options.bundler, additionalData = options.additionalData; disableEmit = extraOptions.disableEmit; // Initialize manifest with required properties from stats id = stats.id, name = stats.name, metaData = stats.metaData; manifest = { id: id, name: name, metaData: metaData, shared: [], remotes: [], exposes: [] }; manifest.exposes = stats.exposes.reduce(function(sum, cur) { var expose = { id: cur.id, name: cur.name, assets: cur.assets, path: cur.path }; sum.push(expose); return sum; }, []); manifest.shared = stats.shared.reduce(function(sum, cur) { var shared = { id: cur.id, name: cur.name, version: cur.version, singleton: cur.singleton, requiredVersion: cur.requiredVersion, hash: cur.hash, assets: cur.assets }; sum.push(shared); return sum; }, []); manifest.remotes = stats.remotes.reduce(function(sum, cur) { // @ts-ignore version/entry will be added as follow var remote = { federationContainerName: cur.federationContainerName, moduleName: cur.moduleName, alias: cur.alias }; if ('entry' in cur) { // @ts-ignore remote.entry = cur.entry; } else if ('version' in cur) { // @ts-ignore remote.entry = cur.version; } sum.push(remote); return sum; }, []); _this._manifest = manifest; manifestFileName = _this.fileName; if (!additionalData) return [ 3, 2 ]; return [ 4, additionalData({ manifest: _this._manifest, stats: stats, pluginOptions: _this._options, compiler: compiler, compilation: compilation, bundler: bundler }) ]; case 1: ret = _state.sent(); _this._manifest = ret || _this._manifest; _state.label = 2; case 2: if (!disableEmit) { compilation.emitAsset(manifestFileName, new compiler.webpack.sources.RawSource(JSON.stringify(_this._manifest, null, 2))); } if (isDev() && (process.env['MF_SSR_PRJ'] ? compiler.options.target !== 'async-node' : true)) { logger.info("Manifest Link: ".concat(chalk.cyan("".concat(publicPath === 'auto' ? '{auto}/' : publicPath).concat(manifestFileName)), " ")); } return [ 2, { manifest: _this._manifest, filename: manifestFileName } ]; } }); })(); } } ]); return ManifestManager; }(); function _array_like_to_array$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i]; return arr2; } function _array_with_holes$1(arr) { if (Array.isArray(arr)) return arr; } function _class_call_check$2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties$2(target, props) { for(var i = 0; i < props.length; i++){ var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _create_class$2(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$2(Constructor.prototype, protoProps); return Constructor; } function _define_property$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _iterable_to_array_limit$1(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){ _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally{ try { if (!_n && _i["return"] != null) _i["return"](); } finally{ if (_d) throw _e; } } return _arr; } function _non_iterable_rest$1() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _object_spread$1(target) { for(var i = 1; i < arguments.length; i++){ var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === "function") { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function(key) { _define_property$1(target, key, source[key]); }); } return target; } function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); keys.push.apply(keys, symbols); } return keys; } function _object_spread_props$1(target, source) { source = source != null ? source : {}; if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function(key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _sliced_to_array$1(arr, i) { return _array_with_holes$1(arr) || _iterable_to_array_limit$1(arr, i) || _unsupported_iterable_to_array$1(arr, i) || _non_iterable_rest$1(); } function _unsupported_iterable_to_array$1(o, minLen) { if (!o) return; if (typeof o === "string") return _array_like_to_array$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array$1(o, minLen); } var getExposeName = function(exposeKey) { return exposeKey.replace('./', ''); }; function getExposeItem(param) { var exposeKey = param.exposeKey, name = param.name, file = param.file; var exposeModuleName = getExposeName(exposeKey); return { path: exposeKey, id: sdk.composeKeyWithSeparator(name, exposeModuleName), name: exposeModuleName, // @ts-ignore to deduplicate requires: new Set(), file: path.relative(process.cwd(), file.import[0]), assets: { js: { async: [], sync: [] }, css: { async: [], sync: [] } } }; } var ModuleHandler = /*#__PURE__*/ function() { function ModuleHandler(options, modules, param) { var bundler = param.bundler; _class_call_check$2(this, ModuleHandler); this._bundler = 'webpack'; this._remoteManager = new managers.RemoteManager(); this._sharedManager = new managers.SharedManager(); this._options = options; this._modules = modules; this._bundler = bundler; this._remoteManager = new managers.RemoteManager(); this._remoteManager.init(options); this._sharedManager = new managers.SharedManager(); this._sharedManager.init(options); } _create_class$2(ModuleHandler, [ { key: "isRspack", get: function get() { return this._bundler === 'rspack'; } }, { key: "_handleSharedModule", value: function _handleSharedModule(mod, sharedMap, exposesMap) { var _this = this; var identifier = mod.identifier, moduleType = mod.moduleType; if (!identifier) { return; } var sharedManagerNormalizedOptions = this._sharedManager.normalizedOptions; var initShared = function(pkgName, pkgVersion) { var _sharedManagerNormalizedOptions_pkgName; if (sharedMap[pkgName]) { return; } sharedMap[pkgName] = _object_spread_props$1(_object_spread$1({}, sharedManagerNormalizedOptions[pkgName]), { id: "".concat(_this._options.name, ":").concat(pkgName), requiredVersion: ((_sharedManagerNormalizedOptions_pkgName = sharedManagerNormalizedOptions[pkgName]) === null || _sharedManagerNormalizedOptions_pkgName === void 0 ? void 0 : _sharedManagerNormalizedOptions_pkgName.requiredVersion) || "^".concat(pkgVersion), name: pkgName, version: pkgVersion, assets: { js: { async: [], sync: [] }, css: { async: [], sync: [] } }, // @ts-ignore to deduplicate usedIn: new Set() }); }; var collectRelationshipMap = function(mod, pkgName) { var issuerName = mod.issuerName, reasons = mod.reasons; if (issuerName) { if (exposesMap[getFileNameWithOutExt(issuerName)]) { var expose = exposesMap[getFileNameWithOutExt(issuerName)]; // @ts-ignore use Set to deduplicate expose.requires.add(pkgName); // @ts-ignore use Set to deduplicate sharedMap[pkgName].usedIn.add(expose.path); } } if (reasons) { reasons.forEach(function(param) { var resolvedModule = param.resolvedModule, moduleName = param.moduleName; var exposeModName = _this.isRspack ? moduleName : resolvedModule; // filters out entrypoints if (exposeModName) { if (exposesMap[getFileNameWithOutExt(exposeModName)]) { var expose = exposesMap[getFileNameWithOutExt(exposeModName)]; // @ts-ignore to deduplicate expose.requires.add(pkgName); // @ts-ignore to deduplicate sharedMap[pkgName].usedIn.add(expose.path); } } }); } }; var parseResolvedIdentifier = function(nameAndVersion) { var name = ''; var version = ''; if (nameAndVersion.startsWith('@')) { var splitInfo = nameAndVersion.split('@'); splitInfo[0] = '@'; name = splitInfo[0] + splitInfo[1]; version = splitInfo[2]; } else if (nameAndVersion.includes('@')) { var ref; ref = _sliced_to_array$1(nameAndVersion.split('@'), 2), name = ref[0], version = ref[1]; version = version.replace(/[\^~>|>=]/g, ''); } return { name: name, version: version }; }; if (moduleType === 'provide-module') { // identifier(rspack) = provide shared module (default) react@18.2.0 = /temp/node_modules/.pnpm/react@18.2.0/node_modules/react/index.js // identifier(webpack) = provide module (default) react@18.2.0 = /temp/node_modules/.pnpm/react@18.2.0/node_modules/react/index.js var data = identifier.split(' '); var nameAndVersion = this.isRspack ? data[4] : data[3]; var _parseResolvedIdentifier = parseResolvedIdentifier(nameAndVersion), name = _parseResolvedIdentifier.name, version = _parseResolvedIdentifier.version; if (name && version) { initShared(name, version); collectRelationshipMap(mod, name); } } if (moduleType === 'consume-shared-module') { // identifier(rspack) = consume shared module (default) lodash/get@^4.17.21 (strict) (fallback: /temp/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/get.js) // identifier(webpack) = consume-shared-module|default|react-dom|!=1.8...2...0|false|/temp/node_modules/.pnpm/react-dom@18.2.0_react@18.2.0/node_modules/react-dom/index.js|true|false var SEPARATOR = this.isRspack ? ' ' : '|'; var data1 = identifier.split(SEPARATOR); var pkgName = ''; var pkgVersion = ''; if (this.isRspack) { var nameAndVersion1 = data1[4]; var res = parseResolvedIdentifier(nameAndVersion1); pkgName = res.name; pkgVersion = res.version; } else { pkgName = data1[2]; var pkgVersionRange = data1[3]; pkgVersion = ''; if (pkgVersionRange.startsWith('=')) { pkgVersion = data1[3].replace('=', ''); } else { if (sharedManagerNormalizedOptions[pkgName]) { pkgVersion = sharedManagerNormalizedOptions[pkgName].version; } else { var fullPkgName = pkgName.split('/').slice(0, -1).join('/'); // pkgName: react-dom/ if (sharedManagerNormalizedOptions["".concat(fullPkgName, "/")]) { if (sharedManagerNormalizedOptions[fullPkgName]) { pkgVersion = sharedManagerNormalizedOptions[fullPkgName].version; } else { pkgVersion = sharedManagerNormalizedOptions["".concat(fullPkgName, "/")].version; } } } } } if (pkgName && pkgVersion) { initShared(pkgName, pkgVersion); collectRelationshipMap(mod, pkgName); } } } }, { key: "_handleRemoteModule", value: function _handleRemoteModule(mod, remotes, remotesConsumerMap) { var _this = this; var identifier = mod.identifier, reasons = mod.reasons, nameForCondition = mod.nameForCondition; if (!identifier) { return; } var remoteManagerNormalizedOptions = this._remoteManager.normalizedOptions; // identifier = remote (default) webpack/container/reference/app2 ./Button var data = identifier.split(' '); if (data.length === 4) { var moduleName = data[3].replace('./', ''); var remoteAlias = data[2].replace('webpack/container/reference/', ''); var normalizedRemote = remoteManagerNormalizedOptions[remoteAlias]; var basicRemote = { alias: normalizedRemote.alias, consumingFederationContainerName: this._options.name || '', federationContainerName: remoteManagerNormalizedOptions[remoteAlias].name, moduleName: moduleName, // @ts-ignore to deduplicate usedIn: new Set() }; if (!nameForCondition) { return; } var remote; if ('version' in normalizedRemote) { remote = _object_spread_props$1(_object_spread$1({}, basicRemote), { version: normalizedRemote.version }); } else { remote = _object_spread_props$1(_object_spread$1({}, basicRemote), { entry: normalizedRemote.entry }); } remotes.push(remote); remotesConsumerMap[nameForCondition] = remote; } if (reasons) { reasons.forEach(function(param) { var userRequest = param.userRequest, resolvedModule = param.resolvedModule, moduleName = param.moduleName; var exposeModName = _this.isRspack ? moduleName : resolvedModule; if (userRequest && exposeModName && remotesConsumerMap[userRequest]) { // @ts-ignore to deduplicate remotesConsumerMap[userRequest].usedIn.add(exposeModName.replace('./', '')); } }); } } }, { key: "_handleContainerModule", value: function _handleContainerModule(mod, exposesMap) { var _this = this; var identifier = mod.identifier; if (!identifier) { return; } // identifier: container entry (default) [[".",{"import":["./src/routes/page.tsx"],"name":"__federation_expose_default_export"}]]' var data = identifier.split(' '); JSON.parse(data[3]).forEach(function(param) { var _param = _sliced_to_array$1(param, 2), prefixedName = _param[0], file = _param[1]; // TODO: support multiple import exposesMap[getFileNameWithOutExt(file.import[0])] = getExposeItem({ exposeKey: prefixedName, name: _this._options.name, file: file }); }); } }, { key: "collect", value: function collect() { var _this = this; var remotes = []; var remotesConsumerMap = {}; var exposesMap = {}; var sharedMap = {}; var isSharedModule = function(moduleType) { return Boolean(moduleType && [ 'provide-module', 'consume-shared-module' ].includes(moduleType)); }; var isContainerModule = function(identifier) { var data = identifier.split(' '); return Boolean(data[0] === 'container' && data[1] === 'entry'); }; var isRemoteModule = function(identifier) { var data = identifier.split(' '); return data[0] === 'remote'; }; // handle remote/expose this._modules.forEach(function(mod) { var identifier = mod.identifier; mod.reasons; mod.nameForCondition; var moduleType = mod.moduleType; if (!identifier) { return; } if (isSharedModule(moduleType)) { _this._handleSharedModule(mod, sharedMap, exposesMap); } if (isRemoteModule(identifier)) { _this._handleRemoteModule(mod, remotes, remotesConsumerMap); } else if (isContainerModule(identifier)) { _this._handleContainerModule(mod, exposesMap); } }); return { remotes: remotes, exposesMap: exposesMap, sharedMap: sharedMap }; } } ]); return ModuleHandler; }(); /* eslint-disable max-lines-per-function */ /* eslint-disable @typescript-eslint/member-ordering */ /* eslint-disable max-depth */ function _array_like_to_array(arr, len) { if (len == null || len > arr.length) len = arr.length; for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i]; return arr2; } function _array_with_holes(arr) { if (Array.isArray(arr)) return arr; } function _array_without_holes(arr) { if (Array.isArray(arr)) return _array_like_to_array(arr); } function asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _async_to_generator$1(fn) { return function() { var self = this, args = arguments; return new Promise(function(resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function _class_call_check$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties$1(target, props) { for(var i = 0; i < props.length; i++){ var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _create_class$1(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$1(Constructor.prototype, protoProps); return Constructor; } function _define_property(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _iterable_to_array(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _iterable_to_array_limit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){ _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally{ try { if (!_n && _i["return"] != null) _i["return"](); } finally{ if (_d) throw _e; } } return _arr; } function _non_iterable_rest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _non_iterable_spread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _object_spread(target) { for(var i = 1; i < arguments.length; i++){ var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === "function") { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function(key) { _define_property(target, key, source[key]); }); } return target; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); keys.push.apply(keys, symbols); } return keys; } function _object_spread_props(target, source) { source = source != null ? source : {}; if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnProperty