@module-federation/manifest
Version:
Provide manifest/stats for webpack/rspack MF project .
101 lines (89 loc) • 3.18 kB
JavaScript
import { styleText } from "node:util";
import { getManifestFileName } from "@module-federation/sdk";
import { isDev } from "./utils.mjs";
import logger from "./logger.mjs";
;// CONCATENATED MODULE: external "node:util"
;// CONCATENATED MODULE: external "@module-federation/sdk"
;// CONCATENATED MODULE: external "./utils.mjs"
;// CONCATENATED MODULE: external "./logger.mjs"
;// CONCATENATED MODULE: ./src/ManifestManager.ts
class ManifestManager {
init(options) {
this._options = options;
}
get fileName() {
return getManifestFileName(this._options.manifest).manifestFileName;
}
updateManifest(options) {
const manifest = this.generateManifest(options);
return manifest;
}
generateManifest(options) {
const { publicPath, stats, compiler } = options;
// Initialize manifest with required properties from stats
const { id, name, metaData } = stats;
if (metaData.buildInfo) {
'target' in metaData.buildInfo && delete metaData.buildInfo.target;
'plugins' in metaData.buildInfo && delete metaData.buildInfo.plugins;
}
const manifest = {
id,
name,
metaData,
shared: [],
remotes: [],
exposes: []
};
manifest.exposes = stats.exposes.reduce((sum, cur)=>{
const expose = {
id: cur.id,
name: cur.name,
assets: cur.assets,
path: cur.path
};
sum.push(expose);
return sum;
}, []);
manifest.shared = stats.shared.reduce((sum, cur)=>{
const shared = {
id: cur.id,
name: cur.name,
version: cur.version,
singleton: cur.singleton,
requiredVersion: cur.requiredVersion,
hash: cur.hash,
assets: cur.assets,
fallback: cur.fallback,
fallbackName: cur.fallbackName,
fallbackType: cur.fallbackType
};
sum.push(shared);
return sum;
}, []);
manifest.remotes = stats.remotes.reduce((sum, cur)=>{
// @ts-ignore version/entry will be added as follow
const 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;
}, []);
if (isDev() && (process.env['MF_SSR_PRJ'] ? compiler.options.target !== 'async-node' : true)) {
logger.info(`Manifest Link: ${styleText('cyan', `${publicPath === 'auto' ? '{auto}/' : publicPath}${this.fileName}`)} `);
}
return manifest;
}
constructor(){
this._options = {};
}
}
export { ManifestManager };