@module-federation/manifest
Version:
Provide manifest/stats for webpack/rspack MF project .
1,219 lines (1,212 loc) • 94.2 kB
JavaScript
'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