Skip to content

Commit 22b9ff9

Browse files
ScriptedAlchemyvinicius-at-webflowCopilot
authored
fix(enhanced): Populate buildMeta and buildInfo on ConsumeSharedPlugin using fallbacks (#4063)
Co-authored-by: Vinicius Rocha <[email protected]> Co-authored-by: Copilot <[email protected]>
1 parent 586e94b commit 22b9ff9

File tree

16 files changed

+668
-25
lines changed

16 files changed

+668
-25
lines changed

.changeset/great-pandas-knock.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@module-federation/enhanced': patch
3+
---
4+
5+
fix(enhanced): Populate `buildMeta` and `buildInfo` on `ConsumeSharedPlugin` using fallbacks

.vscode/launch.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@
9090
"type": "node",
9191
"request": "launch",
9292
"preLaunchTask": "pnpm-build-enhanced",
93-
"runtimeExecutable": "/Users/bytedance/.nvm/versions/node/v18.20.8/bin/node",
9493
"runtimeArgs": [
9594
"${workspaceFolder}/node_modules/jest/bin/jest.js",
9695
"test/ConfigTestCases.basictest.js",

packages/enhanced/src/lib/sharing/ConsumeSharedPlugin.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,54 @@ class ConsumeSharedPlugin {
695695
return Promise.resolve();
696696
},
697697
);
698+
699+
// Add finishModules hook to copy buildMeta/buildInfo from fallback modules *after* webpack's export analysis
700+
// Running earlier causes failures, so we intentionally execute later than plugins like FlagDependencyExportsPlugin.
701+
// This still follows webpack's pattern used by FlagDependencyExportsPlugin and InferAsyncModulesPlugin, but with a
702+
// later stage. Based on webpack's Compilation.js: finishModules (line 2833) runs before seal (line 2920).
703+
compilation.hooks.finishModules.tapAsync(
704+
{
705+
name: PLUGIN_NAME,
706+
stage: 10, // Run after FlagDependencyExportsPlugin (default stage 0)
707+
},
708+
(modules, callback) => {
709+
for (const module of modules) {
710+
// Only process ConsumeSharedModule instances with fallback dependencies
711+
if (
712+
!(module instanceof ConsumeSharedModule) ||
713+
!module.options.import
714+
) {
715+
continue;
716+
}
717+
718+
let dependency;
719+
if (module.options.eager) {
720+
// For eager mode, get the fallback directly from dependencies
721+
dependency = module.dependencies[0];
722+
} else {
723+
// For async mode, get it from the async dependencies block
724+
dependency = module.blocks[0]?.dependencies[0];
725+
}
726+
727+
if (dependency) {
728+
const fallbackModule =
729+
compilation.moduleGraph.getModule(dependency);
730+
if (
731+
fallbackModule &&
732+
fallbackModule.buildMeta &&
733+
fallbackModule.buildInfo
734+
) {
735+
// Copy buildMeta and buildInfo following webpack's DelegatedModule pattern: this.buildMeta = { ...delegateData.buildMeta };
736+
// This ensures ConsumeSharedModule inherits ESM/CJS detection (exportsType) and other optimization metadata
737+
module.buildMeta = { ...fallbackModule.buildMeta };
738+
module.buildInfo = { ...fallbackModule.buildInfo };
739+
}
740+
}
741+
}
742+
callback();
743+
},
744+
);
745+
698746
compilation.hooks.additionalTreeRuntimeRequirements.tap(
699747
PLUGIN_NAME,
700748
(chunk, set) => {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
it('should be able to consume nested modules', async () => {
2+
const { default: main } = await import('package-1');
3+
expect(main('test')).toEqual('test package-1 package-2');
4+
});

packages/enhanced/test/configCases/sharing/consume-nested/node_modules/package-1/esm/index.js

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/enhanced/test/configCases/sharing/consume-nested/node_modules/package-1/esm/package.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/enhanced/test/configCases/sharing/consume-nested/node_modules/package-1/package.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/enhanced/test/configCases/sharing/consume-nested/node_modules/package-2/index.js

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/enhanced/test/configCases/sharing/consume-nested/node_modules/package-2/package.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"version": "1.0.0",
3+
"dependencies": {
4+
"package-2": "1.0.0",
5+
"package-1": "1.0.0"
6+
}
7+
}

0 commit comments

Comments
 (0)