Skip to content

Commit 1191757

Browse files
feat(plugin): support object-based MF2 exposed modules in ModuleFederationTypesPlugin
1 parent 0f9a0bb commit 1191757

File tree

4 files changed

+28
-9
lines changed

4 files changed

+28
-9
lines changed

src/bin/make-federated-types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ if (argv['federation-config']) {
4646
.mfPluginOptions as FederationConfig;
4747
}
4848

49-
const exposedModules = Object.values(federationConfig.exposes);
49+
const exposedModules = federationConfig.exposes;
5050
const outDir =
5151
argv['output-types-folder'] || path.join(DEFAULT_DIR_DIST, DEFAULT_DIR_EMITTED_TYPES);
5252
const outFile = path.join(outDir, 'index.d.ts');
5353
const dirGlobalTypes = argv['global-types'] || DEFAULT_DIR_GLOBAL_TYPES;
5454
const tsconfigPath = argv.tsconfig || TS_CONFIG_FILE;
5555

56-
console.log(`Emitting types for ${exposedModules.length} exposed module(s)`);
56+
console.log(`Emitting types for ${Object.keys(exposedModules).length} exposed module(s)`);
5757

5858
setLogger(console);
5959

src/compileTypes/__tests__/compileTypesWorker.test.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ describe('compileTypesWorker', () => {
5959
test('handles successful compilation and rewrite', () => {
6060
const workerMessage: CompileTypesWorkerMessage = {
6161
tsconfigPath: 'tsconfig.json',
62-
exposedModules: ['moduleA', 'moduleB'],
62+
exposedModules: {
63+
'./moduleA': 'moduleA',
64+
'./moduleB': 'moduleB',
65+
},
6366
outFile: 'dist/types.d.ts',
6467
dirGlobalTypes: 'src/@types',
6568
federationConfig: {} as FederationConfig,
@@ -72,7 +75,10 @@ describe('compileTypesWorker', () => {
7275
expect(mockCompileTypes).toHaveBeenCalledWith(
7376
expect.objectContaining({
7477
tsconfigPath: 'tsconfig.json',
75-
exposedModules: ['moduleA', 'moduleB'],
78+
exposedModules: {
79+
'./moduleA': 'moduleA',
80+
'./moduleB': 'moduleB',
81+
},
7682
outFile: 'dist/types.d.ts',
7783
dirGlobalTypes: 'src/@types',
7884
}),
@@ -92,7 +98,7 @@ describe('compileTypesWorker', () => {
9298
test('handles compilation failure', () => {
9399
const workerMessage: CompileTypesWorkerMessage = {
94100
tsconfigPath: 'tsconfig.json',
95-
exposedModules: ['moduleA'],
101+
exposedModules: { './moduleA': 'moduleA' },
96102
outFile: 'dist/types.d.ts',
97103
dirGlobalTypes: 'src/@types',
98104
federationConfig: {} as FederationConfig,
@@ -108,7 +114,7 @@ describe('compileTypesWorker', () => {
108114
test('handles errors during compilation', () => {
109115
const workerMessage: CompileTypesWorkerMessage = {
110116
tsconfigPath: 'tsconfig.json',
111-
exposedModules: ['moduleA'],
117+
exposedModules: { './moduleA': 'moduleA' },
112118
outFile: 'dist/types.d.ts',
113119
dirGlobalTypes: 'src/@types',
114120
federationConfig: {} as FederationConfig,
@@ -130,7 +136,7 @@ describe('compileTypesWorker', () => {
130136
test('logs performance metrics', () => {
131137
const workerMessage: CompileTypesWorkerMessage = {
132138
tsconfigPath: 'tsconfig.json',
133-
exposedModules: ['moduleA'],
139+
exposedModules: { './moduleA': 'moduleA' },
134140
outFile: 'dist/types.d.ts',
135141
dirGlobalTypes: 'src/@types',
136142
federationConfig: {} as FederationConfig,

src/compileTypes/compileTypes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { getTSConfigCompilerOptions, reportCompileDiagnostic } from './helpers';
99

1010
export type CompileTypesParams = {
1111
tsconfigPath: string;
12-
exposedModules: string[];
12+
exposedModules: Dict<string>;
1313
outFile: string;
1414
dirGlobalTypes: string;
1515
};

src/plugin.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,19 @@ export class ModuleFederationTypesPlugin implements WebpackPluginInstance {
8282
return;
8383
}
8484

85+
// In MF2 an item can be an object with `import` and `name` properties
86+
federationPluginOptions.exposes = Object.entries(federationPluginOptions.exposes || {}).reduce(
87+
(acc, [key, value]) => {
88+
if (value && typeof value === 'object' && 'import' in value) {
89+
acc[key] = (value as Dict<string>).import[0];
90+
} else {
91+
acc[key] = value;
92+
}
93+
return acc;
94+
},
95+
{} as Dict<string>,
96+
);
97+
8598
// Define path for the emitted typings file
8699
const { exposes, remotes } = federationPluginOptions;
87100

@@ -100,7 +113,7 @@ export class ModuleFederationTypesPlugin implements WebpackPluginInstance {
100113
await compileTypesAsync(
101114
{
102115
tsconfigPath: TS_CONFIG_FILE,
103-
exposedModules: exposes as string[],
116+
exposedModules: exposes as Dict<string>,
104117
outFile,
105118
dirGlobalTypes,
106119
federationConfig: federationPluginOptions as FederationConfig,

0 commit comments

Comments
 (0)