@module-federation/enhanced 2.5.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @module-federation/enhanced
2
2
 
3
+ ## 2.5.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 4da5508: Preserve all compiled shared fallback versions for webpack tree shaking.
8
+ - Updated dependencies [b79ba22]
9
+ - Updated dependencies [b553153]
10
+ - Updated dependencies [b9b3b8c]
11
+ - @module-federation/dts-plugin@2.5.1
12
+ - @module-federation/sdk@2.5.1
13
+ - @module-federation/cli@2.5.1
14
+ - @module-federation/manifest@2.5.1
15
+ - @module-federation/rspack@2.5.1
16
+ - @module-federation/bridge-react-webpack-plugin@2.5.1
17
+ - @module-federation/managers@2.5.1
18
+ - @module-federation/webpack-bundler-runtime@2.5.1
19
+ - @module-federation/runtime-tools@2.5.1
20
+ - @module-federation/inject-external-runtime-core-plugin@2.5.1
21
+ - @module-federation/error-codes@2.5.1
22
+
3
23
  ## 2.5.0
4
24
 
5
25
  ### Patch Changes
@@ -15,6 +15,9 @@ declare class CollectSharedEntryPlugin {
15
15
  private _collectedEntries;
16
16
  constructor(options: CollectSharedEntryPluginOptions);
17
17
  getData(): ShareRequestsMap;
18
+ private resetData;
19
+ private getMatchedSharedOption;
20
+ private addRequest;
18
21
  apply(compiler: Compiler): void;
19
22
  }
20
23
  //#endregion
@@ -7,14 +7,20 @@ fs = require_runtime.__toESM(fs);
7
7
 
8
8
  //#region src/lib/sharing/tree-shaking/CollectSharedEntryPlugin.ts
9
9
  const PLUGIN_NAME = "CollectSharedEntryPlugin";
10
+ const NODE_MODULES = "node_modules";
11
+ const PNPM_STORE = ".pnpm";
10
12
  function inferPkgVersionFromResource(resource) {
11
13
  try {
12
- const nmIndex = resource.lastIndexOf("node_modules");
14
+ const nmIndex = resource.lastIndexOf(NODE_MODULES);
13
15
  if (nmIndex === -1) return;
14
16
  const after = resource.substring(nmIndex + 12 + 1);
15
- if (after.startsWith(".pnpm/")) {
16
- const m = after.match(/\.pnpm\/(?:[^/]+)@([^/]+)\/node_modules\//);
17
- if (m && m[1]) return m[1];
17
+ if (after.startsWith(`${PNPM_STORE}/`)) {
18
+ const encodedPkgWithVersion = after.split(/[\\/]+/)[1];
19
+ if (encodedPkgWithVersion) {
20
+ const encodedPkgWithoutPeers = encodedPkgWithVersion.split("_")[0];
21
+ const versionStart = encodedPkgWithoutPeers.lastIndexOf("@");
22
+ if (versionStart > 0) return encodedPkgWithoutPeers.slice(versionStart + 1);
23
+ }
18
24
  }
19
25
  const parts = after.split(/[\\/]+/).filter(Boolean);
20
26
  if (!parts.length) return;
@@ -44,32 +50,33 @@ var CollectSharedEntryPlugin = class {
44
50
  getData() {
45
51
  return this._collectedEntries;
46
52
  }
53
+ resetData() {
54
+ this._collectedEntries = {};
55
+ }
56
+ getMatchedSharedOption(request) {
57
+ return this.sharedOptions.find(([sharedName, sharedConfig]) => request === sharedName || request === sharedConfig.import || request === sharedConfig.request || request === sharedConfig.shareKey);
58
+ }
59
+ addRequest(sharedName, resource, version) {
60
+ this._collectedEntries[sharedName] ||= { requests: [] };
61
+ const requests = this._collectedEntries[sharedName].requests;
62
+ if (requests.some(([, existingVersion]) => existingVersion === version)) return;
63
+ requests.push([resource, version]);
64
+ }
47
65
  apply(compiler) {
48
- const { sharedOptions } = this;
49
- const { _collectedEntries: collectedEntries } = this;
50
66
  compiler.hooks.compilation.tap("CollectSharedEntryPlugin", (_compilation, { normalModuleFactory }) => {
51
- normalModuleFactory.hooks.module.tap("CollectSharedEntryPlugin", (module, { resource }, resolveData) => {
67
+ this.resetData();
68
+ normalModuleFactory.hooks.module.tap("CollectSharedEntryPlugin", (module, { resource }) => {
52
69
  if (!resource || !("rawRequest" in module)) return module;
53
- const matchedSharedOption = sharedOptions.find((item) => item[0] === module.rawRequest);
70
+ const matchedSharedOption = this.getMatchedSharedOption(module.rawRequest);
54
71
  if (!matchedSharedOption) return module;
55
- const [sharedName, _] = matchedSharedOption;
56
- const sharedVersion = inferPkgVersionFromResource(resource);
72
+ const [sharedName, sharedConfig] = matchedSharedOption;
73
+ const configuredVersion = typeof sharedConfig.version === "string" ? sharedConfig.version : void 0;
74
+ const sharedVersion = inferPkgVersionFromResource(resource) || configuredVersion;
57
75
  if (!sharedVersion) return module;
58
- collectedEntries[sharedName] ||= { requests: [] };
59
- collectedEntries[sharedName].requests.push([resource, sharedVersion]);
76
+ this.addRequest(sharedName, resource, sharedVersion);
60
77
  return module;
61
78
  });
62
79
  });
63
- compiler.hooks.thisCompilation.tap("Collect shared entry", (compilation) => {
64
- compilation.hooks.processAssets.tapPromise({
65
- name: "CollectSharedEntry",
66
- stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE
67
- }, async () => {
68
- compilation.getAssets().forEach((asset) => {
69
- compilation.deleteAsset(asset.name);
70
- });
71
- });
72
- });
73
80
  }
74
81
  };
75
82
 
@@ -1 +1 @@
1
- {"version":3,"file":"CollectSharedEntryPlugin.js","names":[],"sources":["../../../../../src/lib/sharing/tree-shaking/CollectSharedEntryPlugin.ts"],"sourcesContent":["import type { Compiler } from 'webpack';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { NormalizedSharedOptions } from '../SharePlugin';\n\nconst PLUGIN_NAME = 'CollectSharedEntryPlugin';\n\nexport type ShareRequestsMap = Record<\n string,\n {\n // request, version\n requests: [string, string][];\n }\n>;\n\nexport type CollectSharedEntryPluginOptions = {\n sharedOptions: NormalizedSharedOptions;\n shareScope?: string;\n};\n\nfunction inferPkgVersionFromResource(resource: string): string | undefined {\n try {\n const nmIndex = resource.lastIndexOf('node_modules');\n if (nmIndex === -1) {\n return undefined;\n }\n const after = resource.substring(nmIndex + 'node_modules'.length + 1);\n\n // pnpm layout: node_modules/.pnpm/<encoded@version>/node_modules/<pkg>/...\n if (after.startsWith('.pnpm/')) {\n const m = after.match(/\\.pnpm\\/(?:[^/]+)@([^/]+)\\/node_modules\\//);\n if (m && m[1]) {\n return m[1];\n }\n }\n\n const parts = after.split(/[\\\\/]+/).filter(Boolean);\n if (!parts.length) {\n return undefined;\n }\n let pkgPathParts: string[];\n if (parts[0].startsWith('@') && parts.length >= 2) {\n pkgPathParts = [parts[0], parts[1]];\n } else {\n pkgPathParts = [parts[0]];\n }\n const nmBase = resource.substring(0, nmIndex + 'node_modules'.length + 1);\n const pkgJsonPath = path.join(nmBase, ...pkgPathParts, 'package.json');\n try {\n const content = fs.readFileSync(pkgJsonPath, 'utf-8');\n const pkg = JSON.parse(content);\n const v = pkg?.version;\n if (typeof v === 'string' && v) {\n return v;\n }\n } catch {\n // ignore\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nclass CollectSharedEntryPlugin {\n name = PLUGIN_NAME;\n\n sharedOptions: NormalizedSharedOptions;\n private _collectedEntries: ShareRequestsMap;\n\n constructor(options: CollectSharedEntryPluginOptions) {\n this.name = PLUGIN_NAME;\n\n const { sharedOptions } = options;\n\n this.sharedOptions = sharedOptions;\n this._collectedEntries = {};\n }\n\n getData() {\n return this._collectedEntries;\n }\n\n apply(compiler: Compiler): void {\n const { sharedOptions } = this;\n const { _collectedEntries: collectedEntries } = this;\n compiler.hooks.compilation.tap(\n 'CollectSharedEntryPlugin',\n (_compilation, { normalModuleFactory }) => {\n normalModuleFactory.hooks.module.tap(\n 'CollectSharedEntryPlugin',\n (module, { resource }, resolveData) => {\n if (!resource || !('rawRequest' in module)) {\n return module;\n }\n const matchedSharedOption = sharedOptions.find(\n (item) => item[0] === (module.rawRequest as string),\n );\n if (!matchedSharedOption) {\n return module;\n }\n const [sharedName, _] = matchedSharedOption;\n const sharedVersion = inferPkgVersionFromResource(resource);\n if (!sharedVersion) {\n return module;\n }\n collectedEntries[sharedName] ||= { requests: [] };\n collectedEntries[sharedName].requests.push([\n resource,\n sharedVersion,\n ]);\n return module;\n },\n );\n },\n );\n\n compiler.hooks.thisCompilation.tap(\n 'Collect shared entry',\n (compilation) => {\n compilation.hooks.processAssets.tapPromise(\n {\n name: 'CollectSharedEntry',\n stage:\n compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE,\n },\n async () => {\n compilation.getAssets().forEach((asset) => {\n compilation.deleteAsset(asset.name);\n });\n },\n );\n },\n );\n }\n}\n\nexport default CollectSharedEntryPlugin;\n"],"mappings":";;;;;;;;AAKA,MAAM,cAAc;AAepB,SAAS,4BAA4B,UAAsC;AACzE,KAAI;EACF,MAAM,UAAU,SAAS,YAAY,eAAe;AACpD,MAAI,YAAY,GACd;EAEF,MAAM,QAAQ,SAAS,UAAU,UAAU,KAAwB,EAAE;AAGrE,MAAI,MAAM,WAAW,SAAS,EAAE;GAC9B,MAAM,IAAI,MAAM,MAAM,4CAA4C;AAClE,OAAI,KAAK,EAAE,GACT,QAAO,EAAE;;EAIb,MAAM,QAAQ,MAAM,MAAM,SAAS,CAAC,OAAO,QAAQ;AACnD,MAAI,CAAC,MAAM,OACT;EAEF,IAAI;AACJ,MAAI,MAAM,GAAG,WAAW,IAAI,IAAI,MAAM,UAAU,EAC9C,gBAAe,CAAC,MAAM,IAAI,MAAM,GAAG;MAEnC,gBAAe,CAAC,MAAM,GAAG;EAE3B,MAAM,SAAS,SAAS,UAAU,GAAG,UAAU,KAAwB,EAAE;EACzE,MAAM,cAAc,KAAK,KAAK,QAAQ,GAAG,cAAc,eAAe;AACtE,MAAI;GACF,MAAM,UAAU,GAAG,aAAa,aAAa,QAAQ;GAErD,MAAM,IADM,KAAK,MAAM,QAAQ,EAChB;AACf,OAAI,OAAO,MAAM,YAAY,EAC3B,QAAO;UAEH;AAGR;SACM;AACN;;;AAIJ,IAAM,2BAAN,MAA+B;CAM7B,YAAY,SAA0C;cAL/C;AAML,OAAK,OAAO;EAEZ,MAAM,EAAE,kBAAkB;AAE1B,OAAK,gBAAgB;AACrB,OAAK,oBAAoB,EAAE;;CAG7B,UAAU;AACR,SAAO,KAAK;;CAGd,MAAM,UAA0B;EAC9B,MAAM,EAAE,kBAAkB;EAC1B,MAAM,EAAE,mBAAmB,qBAAqB;AAChD,WAAS,MAAM,YAAY,IACzB,6BACC,cAAc,EAAE,0BAA0B;AACzC,uBAAoB,MAAM,OAAO,IAC/B,6BACC,QAAQ,EAAE,YAAY,gBAAgB;AACrC,QAAI,CAAC,YAAY,EAAE,gBAAgB,QACjC,QAAO;IAET,MAAM,sBAAsB,cAAc,MACvC,SAAS,KAAK,OAAQ,OAAO,WAC/B;AACD,QAAI,CAAC,oBACH,QAAO;IAET,MAAM,CAAC,YAAY,KAAK;IACxB,MAAM,gBAAgB,4BAA4B,SAAS;AAC3D,QAAI,CAAC,cACH,QAAO;AAET,qBAAiB,gBAAgB,EAAE,UAAU,EAAE,EAAE;AACjD,qBAAiB,YAAY,SAAS,KAAK,CACzC,UACA,cACD,CAAC;AACF,WAAO;KAEV;IAEJ;AAED,WAAS,MAAM,gBAAgB,IAC7B,yBACC,gBAAgB;AACf,eAAY,MAAM,cAAc,WAC9B;IACE,MAAM;IACN,OACE,SAAS,QAAQ,YAAY;IAChC,EACD,YAAY;AACV,gBAAY,WAAW,CAAC,SAAS,UAAU;AACzC,iBAAY,YAAY,MAAM,KAAK;MACnC;KAEL;IAEJ"}
1
+ {"version":3,"file":"CollectSharedEntryPlugin.js","names":[],"sources":["../../../../../src/lib/sharing/tree-shaking/CollectSharedEntryPlugin.ts"],"sourcesContent":["import type { Compiler } from 'webpack';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { NormalizedSharedOptions } from '../SharePlugin';\n\nconst PLUGIN_NAME = 'CollectSharedEntryPlugin';\n\nexport type ShareRequestsMap = Record<\n string,\n {\n // request, version\n requests: [string, string][];\n }\n>;\n\nexport type CollectSharedEntryPluginOptions = {\n sharedOptions: NormalizedSharedOptions;\n shareScope?: string;\n};\n\nconst NODE_MODULES = 'node_modules';\nconst PNPM_STORE = '.pnpm';\n\nfunction inferPkgVersionFromResource(resource: string): string | undefined {\n try {\n const nmIndex = resource.lastIndexOf(NODE_MODULES);\n if (nmIndex === -1) {\n return undefined;\n }\n const after = resource.substring(nmIndex + NODE_MODULES.length + 1);\n\n // pnpm layout: node_modules/.pnpm/<encoded@version>/node_modules/<pkg>/...\n if (after.startsWith(`${PNPM_STORE}/`)) {\n const encodedPkgWithVersion = after.split(/[\\\\/]+/)[1];\n if (encodedPkgWithVersion) {\n const encodedPkgWithoutPeers = encodedPkgWithVersion.split('_')[0];\n const versionStart = encodedPkgWithoutPeers.lastIndexOf('@');\n if (versionStart > 0) {\n return encodedPkgWithoutPeers.slice(versionStart + 1);\n }\n }\n }\n\n const parts = after.split(/[\\\\/]+/).filter(Boolean);\n if (!parts.length) {\n return undefined;\n }\n let pkgPathParts: string[];\n if (parts[0].startsWith('@') && parts.length >= 2) {\n pkgPathParts = [parts[0], parts[1]];\n } else {\n pkgPathParts = [parts[0]];\n }\n const nmBase = resource.substring(0, nmIndex + NODE_MODULES.length + 1);\n const pkgJsonPath = path.join(nmBase, ...pkgPathParts, 'package.json');\n try {\n const content = fs.readFileSync(pkgJsonPath, 'utf-8');\n const pkg = JSON.parse(content);\n const v = pkg?.version;\n if (typeof v === 'string' && v) {\n return v;\n }\n } catch {\n // ignore\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nclass CollectSharedEntryPlugin {\n name = PLUGIN_NAME;\n\n sharedOptions: NormalizedSharedOptions;\n private _collectedEntries: ShareRequestsMap;\n\n constructor(options: CollectSharedEntryPluginOptions) {\n this.name = PLUGIN_NAME;\n\n const { sharedOptions } = options;\n\n this.sharedOptions = sharedOptions;\n this._collectedEntries = {};\n }\n\n getData() {\n return this._collectedEntries;\n }\n\n private resetData() {\n this._collectedEntries = {};\n }\n\n private getMatchedSharedOption(request: string) {\n const matchedSharedOption = this.sharedOptions.find(\n ([sharedName, sharedConfig]) =>\n request === sharedName ||\n request === sharedConfig.import ||\n request === sharedConfig.request ||\n request === sharedConfig.shareKey,\n );\n return matchedSharedOption;\n }\n\n private addRequest(sharedName: string, resource: string, version: string) {\n this._collectedEntries[sharedName] ||= { requests: [] };\n const requests = this._collectedEntries[sharedName].requests;\n if (requests.some(([, existingVersion]) => existingVersion === version)) {\n return;\n }\n requests.push([resource, version]);\n }\n\n apply(compiler: Compiler): void {\n compiler.hooks.compilation.tap(\n 'CollectSharedEntryPlugin',\n (_compilation, { normalModuleFactory }) => {\n this.resetData();\n normalModuleFactory.hooks.module.tap(\n 'CollectSharedEntryPlugin',\n (module, { resource }) => {\n if (!resource || !('rawRequest' in module)) {\n return module;\n }\n const matchedSharedOption = this.getMatchedSharedOption(\n module.rawRequest as string,\n );\n if (!matchedSharedOption) {\n return module;\n }\n const [sharedName, sharedConfig] = matchedSharedOption;\n const configuredVersion =\n typeof sharedConfig.version === 'string'\n ? sharedConfig.version\n : undefined;\n const sharedVersion =\n inferPkgVersionFromResource(resource) || configuredVersion;\n if (!sharedVersion) {\n return module;\n }\n this.addRequest(sharedName, resource, sharedVersion);\n return module;\n },\n );\n },\n );\n }\n}\n\nexport default CollectSharedEntryPlugin;\n"],"mappings":";;;;;;;;AAKA,MAAM,cAAc;AAepB,MAAM,eAAe;AACrB,MAAM,aAAa;AAEnB,SAAS,4BAA4B,UAAsC;AACzE,KAAI;EACF,MAAM,UAAU,SAAS,YAAY,aAAa;AAClD,MAAI,YAAY,GACd;EAEF,MAAM,QAAQ,SAAS,UAAU,UAAU,KAAsB,EAAE;AAGnE,MAAI,MAAM,WAAW,GAAG,WAAW,GAAG,EAAE;GACtC,MAAM,wBAAwB,MAAM,MAAM,SAAS,CAAC;AACpD,OAAI,uBAAuB;IACzB,MAAM,yBAAyB,sBAAsB,MAAM,IAAI,CAAC;IAChE,MAAM,eAAe,uBAAuB,YAAY,IAAI;AAC5D,QAAI,eAAe,EACjB,QAAO,uBAAuB,MAAM,eAAe,EAAE;;;EAK3D,MAAM,QAAQ,MAAM,MAAM,SAAS,CAAC,OAAO,QAAQ;AACnD,MAAI,CAAC,MAAM,OACT;EAEF,IAAI;AACJ,MAAI,MAAM,GAAG,WAAW,IAAI,IAAI,MAAM,UAAU,EAC9C,gBAAe,CAAC,MAAM,IAAI,MAAM,GAAG;MAEnC,gBAAe,CAAC,MAAM,GAAG;EAE3B,MAAM,SAAS,SAAS,UAAU,GAAG,UAAU,KAAsB,EAAE;EACvE,MAAM,cAAc,KAAK,KAAK,QAAQ,GAAG,cAAc,eAAe;AACtE,MAAI;GACF,MAAM,UAAU,GAAG,aAAa,aAAa,QAAQ;GAErD,MAAM,IADM,KAAK,MAAM,QAAQ,EAChB;AACf,OAAI,OAAO,MAAM,YAAY,EAC3B,QAAO;UAEH;AAGR;SACM;AACN;;;AAIJ,IAAM,2BAAN,MAA+B;CAM7B,YAAY,SAA0C;cAL/C;AAML,OAAK,OAAO;EAEZ,MAAM,EAAE,kBAAkB;AAE1B,OAAK,gBAAgB;AACrB,OAAK,oBAAoB,EAAE;;CAG7B,UAAU;AACR,SAAO,KAAK;;CAGd,AAAQ,YAAY;AAClB,OAAK,oBAAoB,EAAE;;CAG7B,AAAQ,uBAAuB,SAAiB;AAQ9C,SAP4B,KAAK,cAAc,MAC5C,CAAC,YAAY,kBACZ,YAAY,cACZ,YAAY,aAAa,UACzB,YAAY,aAAa,WACzB,YAAY,aAAa,SAC5B;;CAIH,AAAQ,WAAW,YAAoB,UAAkB,SAAiB;AACxE,OAAK,kBAAkB,gBAAgB,EAAE,UAAU,EAAE,EAAE;EACvD,MAAM,WAAW,KAAK,kBAAkB,YAAY;AACpD,MAAI,SAAS,MAAM,GAAG,qBAAqB,oBAAoB,QAAQ,CACrE;AAEF,WAAS,KAAK,CAAC,UAAU,QAAQ,CAAC;;CAGpC,MAAM,UAA0B;AAC9B,WAAS,MAAM,YAAY,IACzB,6BACC,cAAc,EAAE,0BAA0B;AACzC,QAAK,WAAW;AAChB,uBAAoB,MAAM,OAAO,IAC/B,6BACC,QAAQ,EAAE,eAAe;AACxB,QAAI,CAAC,YAAY,EAAE,gBAAgB,QACjC,QAAO;IAET,MAAM,sBAAsB,KAAK,uBAC/B,OAAO,WACR;AACD,QAAI,CAAC,oBACH,QAAO;IAET,MAAM,CAAC,YAAY,gBAAgB;IACnC,MAAM,oBACJ,OAAO,aAAa,YAAY,WAC5B,aAAa,UACb;IACN,MAAM,gBACJ,4BAA4B,SAAS,IAAI;AAC3C,QAAI,CAAC,cACH,QAAO;AAET,SAAK,WAAW,YAAY,UAAU,cAAc;AACpD,WAAO;KAEV;IAEJ"}
@@ -59,18 +59,15 @@ var IndependentSharedPlugin = class {
59
59
  }
60
60
  apply(compiler) {
61
61
  const { manifest } = this;
62
- let runCount = 0;
63
- compiler.hooks.beforeRun.tapPromise("IndependentSharedPlugin", async () => {
64
- if (runCount) return;
65
- await this.createIndependentCompilers(compiler);
66
- runCount++;
67
- });
68
- compiler.hooks.watchRun.tapPromise("IndependentSharedPlugin", async () => {
69
- if (runCount) return;
70
- await this.createIndependentCompilers(compiler);
71
- runCount++;
72
- });
62
+ const collectSharedEntryPlugin = new require_lib_sharing_tree_shaking_CollectSharedEntryPlugin.default({ sharedOptions: this.sharedOptions });
63
+ collectSharedEntryPlugin.apply(compiler);
73
64
  compiler.hooks.thisCompilation.tap("IndependentSharedPlugin", (compilation) => {
65
+ compilation.hooks.finishModules.tapPromise({
66
+ name: "IndependentSharedPlugin",
67
+ stage: 20
68
+ }, async () => {
69
+ await this.createIndependentCompilers(compiler, collectSharedEntryPlugin.getData());
70
+ });
74
71
  compilation.hooks.additionalTreeRuntimeRequirements.tap("OptimizeDependencyReferencedExportsPlugin", (chunk) => {
75
72
  compilation.addRuntimeModule(chunk, new require_lib_sharing_tree_shaking_IndependentSharedRuntimeModule.default(this.buildAssets, this.library?.type || "global"));
76
73
  });
@@ -107,17 +104,19 @@ var IndependentSharedPlugin = class {
107
104
  fs.writeFileSync(entryPath, entryContent);
108
105
  return entryPath;
109
106
  }
110
- async createIndependentCompilers(parentCompiler) {
107
+ async createIndependentCompilers(parentCompiler, shareRequestsMap) {
111
108
  const { sharedOptions, outputDir } = this;
109
+ this.buildAssets = {};
110
+ if (!sharedOptions.some(([shareName, shareConfig]) => Boolean(shareConfig.treeShaking) && Boolean(shareRequestsMap[shareName]?.requests.length))) return;
112
111
  console.log("Start building shared fallback resources ...");
113
- const shareRequestsMap = await this.createIndependentCompiler(parentCompiler);
114
112
  await Promise.all(sharedOptions.map(async ([shareName, shareConfig]) => {
115
113
  if (!shareConfig.treeShaking) return;
116
- const shareRequests = shareRequestsMap[shareName].requests;
117
- await Promise.all(shareRequests.map(async ([request, version]) => {
114
+ const shareRequests = shareRequestsMap[shareName]?.requests ?? [];
115
+ for (let index = 0; index < shareRequests.length; index++) {
116
+ const [request, version] = shareRequests[index];
118
117
  const sharedConfig = sharedOptions.find(([name]) => name === shareName)?.[1];
119
118
  const [shareFileName, globalName, sharedVersion] = await this.createIndependentCompiler(parentCompiler, {
120
- shareRequestsMap,
119
+ cleanOutput: index === 0,
121
120
  currentShare: {
122
121
  shareName,
123
122
  version,
@@ -133,41 +132,37 @@ var IndependentSharedPlugin = class {
133
132
  globalName
134
133
  ]);
135
134
  }
136
- }));
135
+ }
137
136
  }));
138
137
  console.log("All shared fallback have been compiled successfully");
139
138
  }
140
139
  async createIndependentCompiler(parentCompiler, extraOptions) {
141
140
  const { treeShaking, plugins, outputDir, sharedOptions, mfName, library, treeShakingSharedExcludePlugins } = this;
142
- const outputDirWithShareName = resolveOutputDir(outputDir, extraOptions?.currentShare?.shareName || "");
141
+ const outputDirWithShareName = resolveOutputDir(outputDir, extraOptions.currentShare.shareName);
143
142
  const parentConfig = parentCompiler.options;
144
143
  const finalPlugins = [];
145
- let extraPlugin;
146
- if (!extraOptions) extraPlugin = new require_lib_sharing_tree_shaking_CollectSharedEntryPlugin.default({ sharedOptions });
147
- else {
148
- extraPlugin = new require_lib_sharing_tree_shaking_SharedContainerPlugin_SharedContainerPlugin.default({
149
- mfName: `${mfName}_${treeShaking ? "t" : "f"}`,
150
- library,
151
- ...extraOptions.currentShare
152
- });
153
- (parentConfig.plugins || []).forEach((plugin) => {
154
- if (plugin !== void 0 && typeof plugin !== "string" && filterPlugin(plugin, treeShakingSharedExcludePlugins)) finalPlugins.push(plugin);
155
- });
156
- plugins.forEach((plugin) => {
157
- finalPlugins.push(plugin);
158
- });
159
- finalPlugins.push(new require_lib_sharing_ConsumeSharedPlugin.default({ consumes: sharedOptions.filter(([key, options]) => extraOptions?.currentShare.shareName !== (options.shareKey || key)).map(([key, options]) => ({ [key]: {
160
- import: !extraOptions ? options.import : false,
161
- shareKey: options.shareKey || key,
162
- shareScope: options.shareScope,
163
- requiredVersion: options.requiredVersion,
164
- strictVersion: options.strictVersion,
165
- singleton: options.singleton,
166
- packageName: options.packageName,
167
- eager: options.eager
168
- } })) }));
169
- if (treeShaking) finalPlugins.push(new require_lib_sharing_tree_shaking_SharedUsedExportsOptimizerPlugin.default(sharedOptions, this.injectTreeShakingUsedExports, [IGNORED_ENTRY], this.manifest));
170
- }
144
+ const extraPlugin = new require_lib_sharing_tree_shaking_SharedContainerPlugin_SharedContainerPlugin.default({
145
+ mfName: `${mfName}_${treeShaking ? "t" : "f"}`,
146
+ library,
147
+ ...extraOptions.currentShare
148
+ });
149
+ (parentConfig.plugins || []).forEach((plugin) => {
150
+ if (plugin !== void 0 && typeof plugin !== "string" && filterPlugin(plugin, treeShakingSharedExcludePlugins)) finalPlugins.push(plugin);
151
+ });
152
+ plugins.forEach((plugin) => {
153
+ finalPlugins.push(plugin);
154
+ });
155
+ finalPlugins.push(new require_lib_sharing_ConsumeSharedPlugin.default({ consumes: sharedOptions.filter(([key, options]) => extraOptions.currentShare.shareName !== (options.shareKey || key)).map(([key, options]) => ({ [key]: {
156
+ import: false,
157
+ shareKey: options.shareKey || key,
158
+ shareScope: options.shareScope,
159
+ requiredVersion: options.requiredVersion,
160
+ strictVersion: options.strictVersion,
161
+ singleton: options.singleton,
162
+ packageName: options.packageName,
163
+ eager: options.eager
164
+ } })) }));
165
+ if (treeShaking) finalPlugins.push(new require_lib_sharing_tree_shaking_SharedUsedExportsOptimizerPlugin.default(sharedOptions, this.injectTreeShakingUsedExports, [IGNORED_ENTRY], this.manifest));
171
166
  finalPlugins.push(extraPlugin);
172
167
  const fullOutputDir = path.resolve(parentCompiler.outputPath, outputDirWithShareName);
173
168
  const compilerConfig = {
@@ -177,7 +172,7 @@ var IndependentSharedPlugin = class {
177
172
  entry: { [IGNORED_ENTRY]: this.createEntry(parentCompiler.context) },
178
173
  output: {
179
174
  path: fullOutputDir,
180
- clean: true,
175
+ clean: extraOptions.cleanOutput,
181
176
  publicPath: parentConfig.output?.publicPath || "auto"
182
177
  },
183
178
  plugins: finalPlugins,
@@ -190,7 +185,7 @@ var IndependentSharedPlugin = class {
190
185
  if (parentCompiler.inputFileSystem) compiler.inputFileSystem = parentCompiler.inputFileSystem;
191
186
  if (parentCompiler.outputFileSystem) compiler.outputFileSystem = parentCompiler.outputFileSystem;
192
187
  if (parentCompiler.intermediateFileSystem) compiler.intermediateFileSystem = parentCompiler.intermediateFileSystem;
193
- const { currentShare, shareRequestsMap } = extraOptions || {};
188
+ const { currentShare } = extraOptions;
194
189
  return new Promise((resolve, reject) => {
195
190
  compiler.run((err, stats) => {
196
191
  const shareName = currentShare?.shareName || "unknown shared package";
@@ -228,7 +223,7 @@ var IndependentSharedPlugin = class {
228
223
  reject(err || /* @__PURE__ */ new Error(`Shared "${shareName}" compilation failed`));
229
224
  return;
230
225
  }
231
- shareRequestsMap && console.log(`Shared "${shareName}" compilation succeeded`);
226
+ console.log(`Shared "${shareName}" compilation succeeded`);
232
227
  resolve(extraPlugin.getData());
233
228
  });
234
229
  });
@@ -1 +1 @@
1
- {"version":3,"file":"IndependentSharedPlugin.js","names":["parseOptions","IndependentSharedRuntimeModule","StatsFileName","CollectSharedEntryPlugin","SharedContainerPlugin","ConsumeSharedPlugin","SharedUsedExportsOptimizerPlugin"],"sources":["../../../../../src/lib/sharing/tree-shaking/IndependentSharedPlugin.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n WebpackPluginInstance,\n Compiler,\n Configuration,\n WebpackOptionsNormalized,\n} from 'webpack';\nimport type { moduleFederationPlugin, Stats } from '@module-federation/sdk';\nimport {\n encodeName,\n isRequiredVersion,\n StatsFileName,\n} from '@module-federation/sdk';\nimport CollectSharedEntryPlugin, {\n type ShareRequestsMap,\n} from './CollectSharedEntryPlugin';\nimport SharedUsedExportsOptimizerPlugin from './SharedUsedExportsOptimizerPlugin';\nimport SharedContainerPlugin, {\n SharedContainerPluginOptions,\n} from './SharedContainerPlugin/SharedContainerPlugin';\nimport { parseOptions } from '../../container/options';\ntype SharedConfig = moduleFederationPlugin.SharedConfig;\nimport ConsumeSharedPlugin from '../ConsumeSharedPlugin';\nimport { NormalizedSharedOptions } from '../SharePlugin';\nimport IndependentSharedRuntimeModule from './IndependentSharedRuntimeModule';\n\nconst IGNORED_ENTRY = 'ignored-entry';\n\n// { react: [ [ react/19.0.0/index.js , 19.0.0, react_global_name ] ] }\nexport type ShareFallback = Record<string, [string, string, string][]>;\n\nexport type MakeRequired<T, K extends keyof T> = Required<Pick<T, K>> &\n Omit<T, K>;\n\nconst filterPlugin = (\n plugin: WebpackOptionsNormalized['plugins'][0],\n treeShakingSharedExcludePlugins: string[] = [],\n) => {\n if (!plugin) {\n return true;\n }\n const pluginName = plugin['name'] || plugin['constructor']?.name;\n if (!pluginName) {\n return true;\n }\n return ![\n 'IndependentSharedPlugin',\n 'ModuleFederationPlugin',\n 'SharedUsedExportsOptimizerPlugin',\n 'HtmlWebpackPlugin',\n 'TreeShakingSharedPlugin',\n ...treeShakingSharedExcludePlugins,\n ].includes(pluginName);\n};\n\nconst resolveOutputDir = (outputDir: string, shareName?: string) => {\n return shareName ? path.join(outputDir, encodeName(shareName)) : outputDir;\n};\n\nexport interface IndependentSharePluginOptions {\n name: string;\n shared: moduleFederationPlugin.Shared;\n library?: moduleFederationPlugin.LibraryOptions;\n outputDir?: string;\n plugins?: WebpackPluginInstance[];\n treeShaking?: boolean;\n manifest?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest'];\n injectTreeShakingUsedExports?: boolean;\n treeShakingSharedExcludePlugins?: string[];\n}\n\nexport default class IndependentSharedPlugin {\n mfName: string;\n shared: moduleFederationPlugin.Shared;\n library?: moduleFederationPlugin.LibraryOptions;\n sharedOptions: NormalizedSharedOptions;\n outputDir: string;\n plugins: WebpackPluginInstance[];\n treeShaking?: boolean;\n manifest?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest'];\n injectTreeShakingUsedExports?: boolean;\n buildAssets: ShareFallback = {};\n treeShakingSharedExcludePlugins?: string[];\n\n name = 'IndependentSharedPlugin';\n constructor(options: IndependentSharePluginOptions) {\n const {\n outputDir,\n plugins,\n treeShaking,\n shared,\n name,\n manifest,\n injectTreeShakingUsedExports,\n library,\n treeShakingSharedExcludePlugins,\n } = options;\n this.shared = shared;\n this.treeShakingSharedExcludePlugins = treeShakingSharedExcludePlugins;\n this.mfName = name;\n this.outputDir = outputDir || 'independent-packages';\n this.plugins = plugins || [];\n this.treeShaking = treeShaking;\n this.manifest = manifest;\n this.injectTreeShakingUsedExports = injectTreeShakingUsedExports ?? true;\n this.library = library;\n this.sharedOptions = parseOptions(\n shared,\n (item, key) => {\n if (typeof item !== 'string')\n throw new Error(\n `Unexpected array in shared configuration for key \"${key}\"`,\n );\n const config: SharedConfig =\n item === key || !isRequiredVersion(item)\n ? {\n import: item,\n }\n : {\n import: key,\n requiredVersion: item,\n };\n\n return config;\n },\n (item) => {\n return item;\n },\n );\n }\n\n static IndependentShareBuildAssetsFilename =\n 'independent-share-build-assets.json';\n\n apply(compiler: Compiler) {\n const { manifest } = this;\n let runCount = 0;\n\n compiler.hooks.beforeRun.tapPromise('IndependentSharedPlugin', async () => {\n if (runCount) {\n return;\n }\n await this.createIndependentCompilers(compiler);\n runCount++;\n });\n\n compiler.hooks.watchRun.tapPromise('IndependentSharedPlugin', async () => {\n if (runCount) {\n return;\n }\n await this.createIndependentCompilers(compiler);\n runCount++;\n });\n\n compiler.hooks.thisCompilation.tap(\n 'IndependentSharedPlugin',\n (compilation) => {\n compilation.hooks.additionalTreeRuntimeRequirements.tap(\n 'OptimizeDependencyReferencedExportsPlugin',\n (chunk) => {\n compilation.addRuntimeModule(\n chunk,\n new IndependentSharedRuntimeModule(\n this.buildAssets,\n this.library?.type || 'global',\n ),\n );\n },\n );\n // inject buildAssets to stats\n if (!manifest) {\n return;\n }\n compilation.hooks.processAssets.tapPromise(\n {\n name: 'injectReferenceExports',\n stage:\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n (compilation.constructor as any)\n .PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER,\n },\n async () => {\n const stats = compilation.getAsset(StatsFileName);\n if (!stats) {\n return;\n }\n const statsContent = JSON.parse(\n stats.source.source().toString(),\n ) as Stats;\n\n const { shared } = statsContent;\n Object.entries(this.buildAssets).forEach(([key, item]) => {\n const targetShared = shared.find((s) => s.name === key);\n if (!targetShared) {\n return;\n }\n item.forEach(([entry, version, globalName]) => {\n if (version === targetShared.version) {\n targetShared.fallback = entry;\n targetShared.fallbackName = globalName;\n }\n });\n });\n\n compilation.updateAsset(\n StatsFileName,\n new compiler.webpack.sources.RawSource(\n JSON.stringify(statsContent),\n ),\n );\n },\n );\n },\n );\n }\n\n private createEntry(context: string) {\n const { sharedOptions } = this;\n const entryContent = sharedOptions.reduce((acc, cur, index) => {\n return `${acc}import shared_${index} from '${cur[0]}';\\n`;\n }, '');\n const entryPath = path.resolve(\n context,\n 'node_modules',\n '.federation',\n // name,\n 'shared-entry.js',\n );\n if (!fs.existsSync(path.dirname(entryPath))) {\n fs.mkdirSync(path.dirname(entryPath), { recursive: true });\n }\n fs.writeFileSync(entryPath, entryContent);\n return entryPath;\n }\n\n private async createIndependentCompilers(parentCompiler: Compiler) {\n const { sharedOptions, outputDir } = this;\n console.log('Start building shared fallback resources ...');\n\n const shareRequestsMap: ShareRequestsMap =\n await this.createIndependentCompiler(parentCompiler);\n\n await Promise.all(\n sharedOptions.map(async ([shareName, shareConfig]) => {\n if (!shareConfig.treeShaking) {\n return;\n }\n const shareRequests = shareRequestsMap[shareName].requests;\n await Promise.all(\n shareRequests.map(async ([request, version]) => {\n const sharedConfig = sharedOptions.find(\n ([name]) => name === shareName,\n )?.[1];\n const [shareFileName, globalName, sharedVersion] =\n await this.createIndependentCompiler(parentCompiler, {\n shareRequestsMap,\n currentShare: {\n shareName,\n version,\n request,\n independentShareFileName: sharedConfig?.treeShaking?.filename,\n },\n });\n if (typeof shareFileName === 'string') {\n this.buildAssets[shareName] ||= [];\n this.buildAssets[shareName].push([\n path.join(\n resolveOutputDir(outputDir, shareName),\n shareFileName,\n ),\n sharedVersion,\n globalName,\n ]);\n }\n }),\n );\n }),\n );\n\n console.log('All shared fallback have been compiled successfully');\n }\n\n private async createIndependentCompiler(\n parentCompiler: Compiler,\n extraOptions?: {\n currentShare: Omit<SharedContainerPluginOptions, 'mfName'>;\n shareRequestsMap: ShareRequestsMap;\n },\n ) {\n const {\n treeShaking,\n plugins,\n outputDir,\n sharedOptions,\n mfName,\n library,\n treeShakingSharedExcludePlugins,\n } = this;\n const outputDirWithShareName = resolveOutputDir(\n outputDir,\n extraOptions?.currentShare?.shareName || '',\n );\n\n const parentConfig = parentCompiler.options;\n\n const finalPlugins = [];\n let extraPlugin: CollectSharedEntryPlugin | SharedContainerPlugin;\n if (!extraOptions) {\n extraPlugin = new CollectSharedEntryPlugin({\n sharedOptions,\n });\n } else {\n extraPlugin = new SharedContainerPlugin({\n mfName: `${mfName}_${treeShaking ? 't' : 'f'}`,\n library: library,\n ...extraOptions.currentShare,\n });\n (parentConfig.plugins || []).forEach((plugin) => {\n if (\n plugin !== undefined &&\n typeof plugin !== 'string' &&\n filterPlugin(plugin, treeShakingSharedExcludePlugins)\n ) {\n finalPlugins.push(plugin);\n }\n });\n plugins.forEach((plugin) => {\n finalPlugins.push(plugin);\n });\n finalPlugins.push(\n new ConsumeSharedPlugin({\n consumes: sharedOptions\n .filter(\n ([key, options]) =>\n extraOptions?.currentShare.shareName !==\n (options.shareKey || key),\n )\n .map(([key, options]) => ({\n [key]: {\n import: !extraOptions ? options.import : false,\n shareKey: options.shareKey || key,\n shareScope: options.shareScope,\n requiredVersion: options.requiredVersion,\n strictVersion: options.strictVersion,\n singleton: options.singleton,\n packageName: options.packageName,\n eager: options.eager,\n },\n })),\n }),\n );\n\n if (treeShaking) {\n finalPlugins.push(\n new SharedUsedExportsOptimizerPlugin(\n sharedOptions,\n this.injectTreeShakingUsedExports,\n [IGNORED_ENTRY],\n this.manifest,\n ),\n );\n }\n }\n finalPlugins.push(extraPlugin);\n const fullOutputDir = path.resolve(\n parentCompiler.outputPath,\n outputDirWithShareName,\n );\n // @ts-ignore webpack version is not the same as the one used in the plugin\n const compilerConfig: Configuration = {\n ...parentConfig,\n mode: parentConfig.mode || 'development',\n ignoreWarnings: [],\n entry: {\n [IGNORED_ENTRY]: this.createEntry(parentCompiler.context),\n },\n\n // 输出配置\n output: {\n path: fullOutputDir,\n clean: true,\n publicPath: parentConfig.output?.publicPath || 'auto',\n },\n\n // 插件继承\n plugins: finalPlugins,\n\n // 优化配置继承\n optimization: {\n ...parentConfig.optimization,\n splitChunks: false, // 每个包独立,不拆分\n },\n };\n\n // 创建独立的 webpack compiler 实例\n const webpack = parentCompiler.webpack;\n const compiler = webpack.webpack(compilerConfig as any);\n\n // 设置文件系统\n if (parentCompiler.inputFileSystem) {\n compiler.inputFileSystem = parentCompiler.inputFileSystem;\n }\n if (parentCompiler.outputFileSystem) {\n compiler.outputFileSystem = parentCompiler.outputFileSystem;\n }\n if (parentCompiler.intermediateFileSystem) {\n compiler.intermediateFileSystem = parentCompiler.intermediateFileSystem;\n }\n\n const { currentShare, shareRequestsMap } = extraOptions || {};\n\n return new Promise<any>((resolve, reject) => {\n compiler.run((err: any, stats: any) => {\n const shareName = currentShare?.shareName || 'unknown shared package';\n const hasStatsErrors =\n !!stats &&\n (stats.hasErrors?.() || stats.toJson?.()?.errors?.length > 0);\n if (err || hasStatsErrors) {\n const lines: string[] = [];\n if (err) {\n const errMsg = (err && (err.stack || err.message)) || String(err);\n lines.push(`Compiler error: ${errMsg}`);\n }\n if (stats?.toJson) {\n const json = stats.toJson({\n all: false,\n errors: true,\n warnings: false,\n errorDetails: true,\n moduleTrace: true,\n } as any);\n const errors = (json && json.errors) || [];\n if (errors.length) {\n lines.push(`Webpack errors (${errors.length}):`);\n const max = 5;\n for (let i = 0; i < Math.min(errors.length, max); i++) {\n const e: any = errors[i];\n const where =\n e.moduleName || e.file || e.moduleIdentifier || '';\n const loc = e.loc ? ` @ ${e.loc}` : '';\n const msg = e.message || e.details || String(e);\n lines.push(` [${i + 1}] ${where}${loc}`);\n lines.push(` ${msg}`);\n }\n if (errors.length > max) {\n lines.push(` ... and ${errors.length - max} more errors`);\n }\n }\n }\n console.error(\n `❌ Shared \"${shareName}\" compilation failed\\n${lines.join('\\n')}`,\n );\n reject(err || new Error(`Shared \"${shareName}\" compilation failed`));\n return;\n }\n\n shareRequestsMap &&\n console.log(`Shared \"${shareName}\" compilation succeeded`);\n\n resolve(extraPlugin.getData());\n });\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"IndependentSharedPlugin.js","names":["parseOptions","CollectSharedEntryPlugin","IndependentSharedRuntimeModule","StatsFileName","SharedContainerPlugin","ConsumeSharedPlugin","SharedUsedExportsOptimizerPlugin"],"sources":["../../../../../src/lib/sharing/tree-shaking/IndependentSharedPlugin.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n WebpackPluginInstance,\n Compiler,\n Configuration,\n WebpackOptionsNormalized,\n} from 'webpack';\nimport type { moduleFederationPlugin, Stats } from '@module-federation/sdk';\nimport {\n encodeName,\n isRequiredVersion,\n StatsFileName,\n} from '@module-federation/sdk';\nimport CollectSharedEntryPlugin, {\n type ShareRequestsMap,\n} from './CollectSharedEntryPlugin';\nimport SharedUsedExportsOptimizerPlugin from './SharedUsedExportsOptimizerPlugin';\nimport SharedContainerPlugin, {\n SharedContainerPluginOptions,\n} from './SharedContainerPlugin/SharedContainerPlugin';\nimport { parseOptions } from '../../container/options';\ntype SharedConfig = moduleFederationPlugin.SharedConfig;\nimport ConsumeSharedPlugin from '../ConsumeSharedPlugin';\nimport { NormalizedSharedOptions } from '../SharePlugin';\nimport IndependentSharedRuntimeModule from './IndependentSharedRuntimeModule';\n\nconst IGNORED_ENTRY = 'ignored-entry';\n\n// { react: [ [ react/19.0.0/index.js , 19.0.0, react_global_name ] ] }\nexport type ShareFallback = Record<string, [string, string, string][]>;\n\nexport type MakeRequired<T, K extends keyof T> = Required<Pick<T, K>> &\n Omit<T, K>;\n\nconst filterPlugin = (\n plugin: WebpackOptionsNormalized['plugins'][0],\n treeShakingSharedExcludePlugins: string[] = [],\n) => {\n if (!plugin) {\n return true;\n }\n const pluginName = plugin['name'] || plugin['constructor']?.name;\n if (!pluginName) {\n return true;\n }\n return ![\n 'IndependentSharedPlugin',\n 'ModuleFederationPlugin',\n 'SharedUsedExportsOptimizerPlugin',\n 'HtmlWebpackPlugin',\n 'TreeShakingSharedPlugin',\n ...treeShakingSharedExcludePlugins,\n ].includes(pluginName);\n};\n\nconst resolveOutputDir = (outputDir: string, shareName?: string) => {\n return shareName ? path.join(outputDir, encodeName(shareName)) : outputDir;\n};\n\nexport interface IndependentSharePluginOptions {\n name: string;\n shared: moduleFederationPlugin.Shared;\n library?: moduleFederationPlugin.LibraryOptions;\n outputDir?: string;\n plugins?: WebpackPluginInstance[];\n treeShaking?: boolean;\n manifest?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest'];\n injectTreeShakingUsedExports?: boolean;\n treeShakingSharedExcludePlugins?: string[];\n}\n\nexport default class IndependentSharedPlugin {\n mfName: string;\n shared: moduleFederationPlugin.Shared;\n library?: moduleFederationPlugin.LibraryOptions;\n sharedOptions: NormalizedSharedOptions;\n outputDir: string;\n plugins: WebpackPluginInstance[];\n treeShaking?: boolean;\n manifest?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest'];\n injectTreeShakingUsedExports?: boolean;\n buildAssets: ShareFallback = {};\n treeShakingSharedExcludePlugins?: string[];\n\n name = 'IndependentSharedPlugin';\n constructor(options: IndependentSharePluginOptions) {\n const {\n outputDir,\n plugins,\n treeShaking,\n shared,\n name,\n manifest,\n injectTreeShakingUsedExports,\n library,\n treeShakingSharedExcludePlugins,\n } = options;\n this.shared = shared;\n this.treeShakingSharedExcludePlugins = treeShakingSharedExcludePlugins;\n this.mfName = name;\n this.outputDir = outputDir || 'independent-packages';\n this.plugins = plugins || [];\n this.treeShaking = treeShaking;\n this.manifest = manifest;\n this.injectTreeShakingUsedExports = injectTreeShakingUsedExports ?? true;\n this.library = library;\n this.sharedOptions = parseOptions(\n shared,\n (item, key) => {\n if (typeof item !== 'string')\n throw new Error(\n `Unexpected array in shared configuration for key \"${key}\"`,\n );\n const config: SharedConfig =\n item === key || !isRequiredVersion(item)\n ? {\n import: item,\n }\n : {\n import: key,\n requiredVersion: item,\n };\n\n return config;\n },\n (item) => {\n return item;\n },\n );\n }\n\n static IndependentShareBuildAssetsFilename =\n 'independent-share-build-assets.json';\n\n apply(compiler: Compiler) {\n const { manifest } = this;\n const collectSharedEntryPlugin = new CollectSharedEntryPlugin({\n sharedOptions: this.sharedOptions,\n });\n collectSharedEntryPlugin.apply(compiler);\n\n compiler.hooks.thisCompilation.tap(\n 'IndependentSharedPlugin',\n (compilation) => {\n compilation.hooks.finishModules.tapPromise(\n {\n name: 'IndependentSharedPlugin',\n stage: 20,\n },\n async () => {\n await this.createIndependentCompilers(\n compiler,\n collectSharedEntryPlugin.getData(),\n );\n },\n );\n compilation.hooks.additionalTreeRuntimeRequirements.tap(\n 'OptimizeDependencyReferencedExportsPlugin',\n (chunk) => {\n compilation.addRuntimeModule(\n chunk,\n new IndependentSharedRuntimeModule(\n this.buildAssets,\n this.library?.type || 'global',\n ),\n );\n },\n );\n // inject buildAssets to stats\n if (!manifest) {\n return;\n }\n compilation.hooks.processAssets.tapPromise(\n {\n name: 'injectReferenceExports',\n stage:\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n (compilation.constructor as any)\n .PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER,\n },\n async () => {\n const stats = compilation.getAsset(StatsFileName);\n if (!stats) {\n return;\n }\n const statsContent = JSON.parse(\n stats.source.source().toString(),\n ) as Stats;\n\n const { shared } = statsContent;\n Object.entries(this.buildAssets).forEach(([key, item]) => {\n const targetShared = shared.find((s) => s.name === key);\n if (!targetShared) {\n return;\n }\n item.forEach(([entry, version, globalName]) => {\n if (version === targetShared.version) {\n targetShared.fallback = entry;\n targetShared.fallbackName = globalName;\n }\n });\n });\n\n compilation.updateAsset(\n StatsFileName,\n new compiler.webpack.sources.RawSource(\n JSON.stringify(statsContent),\n ),\n );\n },\n );\n },\n );\n }\n\n private createEntry(context: string) {\n const { sharedOptions } = this;\n const entryContent = sharedOptions.reduce((acc, cur, index) => {\n return `${acc}import shared_${index} from '${cur[0]}';\\n`;\n }, '');\n const entryPath = path.resolve(\n context,\n 'node_modules',\n '.federation',\n // name,\n 'shared-entry.js',\n );\n if (!fs.existsSync(path.dirname(entryPath))) {\n fs.mkdirSync(path.dirname(entryPath), { recursive: true });\n }\n fs.writeFileSync(entryPath, entryContent);\n return entryPath;\n }\n\n private async createIndependentCompilers(\n parentCompiler: Compiler,\n shareRequestsMap: ShareRequestsMap,\n ) {\n const { sharedOptions, outputDir } = this;\n this.buildAssets = {};\n\n const hasShareRequests = sharedOptions.some(\n ([shareName, shareConfig]) =>\n Boolean(shareConfig.treeShaking) &&\n Boolean(shareRequestsMap[shareName]?.requests.length),\n );\n if (!hasShareRequests) {\n return;\n }\n\n console.log('Start building shared fallback resources ...');\n\n await Promise.all(\n sharedOptions.map(async ([shareName, shareConfig]) => {\n if (!shareConfig.treeShaking) {\n return;\n }\n const shareRequests = shareRequestsMap[shareName]?.requests ?? [];\n for (let index = 0; index < shareRequests.length; index++) {\n const [request, version] = shareRequests[index];\n const sharedConfig = sharedOptions.find(\n ([name]) => name === shareName,\n )?.[1];\n const [shareFileName, globalName, sharedVersion] =\n await this.createIndependentCompiler(parentCompiler, {\n cleanOutput: index === 0,\n currentShare: {\n shareName,\n version,\n request,\n independentShareFileName: sharedConfig?.treeShaking?.filename,\n },\n });\n if (typeof shareFileName === 'string') {\n this.buildAssets[shareName] ||= [];\n this.buildAssets[shareName].push([\n path.join(resolveOutputDir(outputDir, shareName), shareFileName),\n sharedVersion,\n globalName,\n ]);\n }\n }\n }),\n );\n\n console.log('All shared fallback have been compiled successfully');\n }\n\n private async createIndependentCompiler(\n parentCompiler: Compiler,\n extraOptions: {\n currentShare: Omit<SharedContainerPluginOptions, 'mfName'>;\n cleanOutput: boolean;\n },\n ) {\n const {\n treeShaking,\n plugins,\n outputDir,\n sharedOptions,\n mfName,\n library,\n treeShakingSharedExcludePlugins,\n } = this;\n const outputDirWithShareName = resolveOutputDir(\n outputDir,\n extraOptions.currentShare.shareName,\n );\n\n const parentConfig = parentCompiler.options;\n\n const finalPlugins = [];\n const extraPlugin = new SharedContainerPlugin({\n mfName: `${mfName}_${treeShaking ? 't' : 'f'}`,\n library: library,\n ...extraOptions.currentShare,\n });\n (parentConfig.plugins || []).forEach((plugin) => {\n if (\n plugin !== undefined &&\n typeof plugin !== 'string' &&\n filterPlugin(plugin, treeShakingSharedExcludePlugins)\n ) {\n finalPlugins.push(plugin);\n }\n });\n plugins.forEach((plugin) => {\n finalPlugins.push(plugin);\n });\n finalPlugins.push(\n new ConsumeSharedPlugin({\n consumes: sharedOptions\n .filter(\n ([key, options]) =>\n extraOptions.currentShare.shareName !== (options.shareKey || key),\n )\n .map(([key, options]) => ({\n [key]: {\n import: false,\n shareKey: options.shareKey || key,\n shareScope: options.shareScope,\n requiredVersion: options.requiredVersion,\n strictVersion: options.strictVersion,\n singleton: options.singleton,\n packageName: options.packageName,\n eager: options.eager,\n },\n })),\n }),\n );\n\n if (treeShaking) {\n finalPlugins.push(\n new SharedUsedExportsOptimizerPlugin(\n sharedOptions,\n this.injectTreeShakingUsedExports,\n [IGNORED_ENTRY],\n this.manifest,\n ),\n );\n }\n finalPlugins.push(extraPlugin);\n const fullOutputDir = path.resolve(\n parentCompiler.outputPath,\n outputDirWithShareName,\n );\n // @ts-ignore webpack version is not the same as the one used in the plugin\n const compilerConfig: Configuration = {\n ...parentConfig,\n mode: parentConfig.mode || 'development',\n ignoreWarnings: [],\n entry: {\n [IGNORED_ENTRY]: this.createEntry(parentCompiler.context),\n },\n\n // 输出配置\n output: {\n path: fullOutputDir,\n clean: extraOptions.cleanOutput,\n publicPath: parentConfig.output?.publicPath || 'auto',\n },\n\n // 插件继承\n plugins: finalPlugins,\n\n // 优化配置继承\n optimization: {\n ...parentConfig.optimization,\n splitChunks: false, // 每个包独立,不拆分\n },\n };\n\n // 创建独立的 webpack compiler 实例\n const webpack = parentCompiler.webpack;\n const compiler = webpack.webpack(compilerConfig as any);\n\n // 设置文件系统\n if (parentCompiler.inputFileSystem) {\n compiler.inputFileSystem = parentCompiler.inputFileSystem;\n }\n if (parentCompiler.outputFileSystem) {\n compiler.outputFileSystem = parentCompiler.outputFileSystem;\n }\n if (parentCompiler.intermediateFileSystem) {\n compiler.intermediateFileSystem = parentCompiler.intermediateFileSystem;\n }\n\n const { currentShare } = extraOptions;\n\n return new Promise<any>((resolve, reject) => {\n compiler.run((err: any, stats: any) => {\n const shareName = currentShare?.shareName || 'unknown shared package';\n const hasStatsErrors =\n !!stats &&\n (stats.hasErrors?.() || stats.toJson?.()?.errors?.length > 0);\n if (err || hasStatsErrors) {\n const lines: string[] = [];\n if (err) {\n const errMsg = (err && (err.stack || err.message)) || String(err);\n lines.push(`Compiler error: ${errMsg}`);\n }\n if (stats?.toJson) {\n const json = stats.toJson({\n all: false,\n errors: true,\n warnings: false,\n errorDetails: true,\n moduleTrace: true,\n } as any);\n const errors = (json && json.errors) || [];\n if (errors.length) {\n lines.push(`Webpack errors (${errors.length}):`);\n const max = 5;\n for (let i = 0; i < Math.min(errors.length, max); i++) {\n const e: any = errors[i];\n const where =\n e.moduleName || e.file || e.moduleIdentifier || '';\n const loc = e.loc ? ` @ ${e.loc}` : '';\n const msg = e.message || e.details || String(e);\n lines.push(` [${i + 1}] ${where}${loc}`);\n lines.push(` ${msg}`);\n }\n if (errors.length > max) {\n lines.push(` ... and ${errors.length - max} more errors`);\n }\n }\n }\n console.error(\n `❌ Shared \"${shareName}\" compilation failed\\n${lines.join('\\n')}`,\n );\n reject(err || new Error(`Shared \"${shareName}\" compilation failed`));\n return;\n }\n\n console.log(`Shared \"${shareName}\" compilation succeeded`);\n\n resolve(extraPlugin.getData());\n });\n });\n }\n}\n"],"mappings":"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"}
@@ -1967,7 +1967,7 @@ function D(o, { instancePath: i = "", parentData: a, parentDataProperty: p, root
1967
1967
  if (void 0 !== r.family) {
1968
1968
  let e = r.family;
1969
1969
  const n = c;
1970
- if (4 !== e && 6 !== e) {
1970
+ if (0 !== e && 4 !== e && 6 !== e) {
1971
1971
  const e = { params: { allowedValues: t.properties.dts.anyOf[1].properties.consumeTypes.anyOf[1].properties.family.enum } };
1972
1972
  null === u ? u = [e] : u.push(e), c++;
1973
1973
  }
@@ -2799,7 +2799,11 @@ var init_ModuleFederationPlugin_check = require_runtime.__esmMin((() => {
2799
2799
  }
2800
2800
  }] },
2801
2801
  timeout: { type: "number" },
2802
- family: { enum: [4, 6] },
2802
+ family: { enum: [
2803
+ 0,
2804
+ 4,
2805
+ 6
2806
+ ] },
2803
2807
  typesOnBuild: { type: "boolean" }
2804
2808
  }
2805
2809
  }] },