Skip to content

Commit c62e2a8

Browse files
vinicius-at-webflowCopilotScriptedAlchemy
authored
fix(enhanced): Populate buildMeta and buildInfo on ConsumeSharedPlugin using fallbacks (#4038)
Co-authored-by: Copilot <[email protected]> Co-authored-by: Zack Jackson <[email protected]> Co-authored-by: ScriptedAlchemy <[email protected]>
1 parent eb69021 commit c62e2a8

File tree

15 files changed

+663
-25
lines changed

15 files changed

+663
-25
lines changed

.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 before webpack's export analysis
700+
// This follows webpack's pattern used by FlagDependencyExportsPlugin and InferAsyncModulesPlugin
701+
// We use finishModules.tapAsync with high priority stage to ensure buildMeta is available before other plugins process exports
702+
// 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, // Use STAGE_ADVANCED (10) to 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+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const { ModuleFederationPlugin } = require('../../../../dist/src');
2+
3+
module.exports = {
4+
mode: 'development',
5+
devtool: false,
6+
plugins: [
7+
new ModuleFederationPlugin({
8+
name: 'consume-nested',
9+
filename: 'remoteEntry.js',
10+
shared: {
11+
'package-2': { version: '1.0.0' },
12+
'package-1': { version: '1.0.0' },
13+
},
14+
}),
15+
],
16+
};

0 commit comments

Comments
 (0)