Skip to content

Commit 5ef0150

Browse files
fix(runtime): preserve generic in loadRemote/loadShare/loadShareSync (#2325) (#2345)
Co-authored-by: Zack Jackson <[email protected]>
1 parent fcbae83 commit 5ef0150

File tree

3 files changed

+50
-11
lines changed

3 files changed

+50
-11
lines changed

.changeset/tasty-parents-guess.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@module-federation/runtime': patch
3+
---
4+
5+
fix: preserve generic in loadRemote/loadShare/loadShareSync

packages/runtime/__tests__/global.spec.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { assert, describe, test, it, vi } from 'vitest';
2-
import { init } from '../src/index';
1+
import { assert, describe, test, it, vi, expectTypeOf } from 'vitest';
2+
import { init, loadRemote, loadShare, loadShareSync } from '../src/index';
33
import { getInfoWithoutType } from '../src/global';
44

55
describe('global', () => {
@@ -44,4 +44,32 @@ describe('global', () => {
4444
value: 4,
4545
});
4646
});
47+
48+
describe('global types (generic)', () => {
49+
it('loadRemote', async () => {
50+
const typedLoadRemote: typeof loadRemote<string> = loadRemote;
51+
expectTypeOf(typedLoadRemote).returns.toMatchTypeOf<
52+
Promise<string | null>
53+
>();
54+
expectTypeOf(typedLoadRemote).returns.not.toMatchTypeOf<Promise<null>>();
55+
});
56+
57+
it('loadShare', async () => {
58+
const typedLoadShare: typeof loadShare<string> = loadShare;
59+
expectTypeOf(typedLoadShare).returns.toMatchTypeOf<
60+
Promise<false | (() => string | undefined)>
61+
>();
62+
expectTypeOf(typedLoadShare).returns.not.toMatchTypeOf<
63+
Promise<false | (() => undefined)>
64+
>();
65+
});
66+
67+
it('loadShareSync', async () => {
68+
const typedLoadShareSync: typeof loadShareSync<string> = loadShareSync;
69+
expectTypeOf(typedLoadShareSync).returns.toMatchTypeOf<
70+
() => string | never
71+
>();
72+
expectTypeOf(typedLoadShareSync).returns.not.toMatchTypeOf<() => never>();
73+
});
74+
});
4775
});

packages/runtime/src/index.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,28 +37,34 @@ export function init(options: UserOptions): FederationHost {
3737
}
3838
}
3939

40-
export function loadRemote(
40+
export function loadRemote<T>(
4141
...args: Parameters<FederationHost['loadRemote']>
42-
): ReturnType<FederationHost['loadRemote']> {
42+
): Promise<T | null> {
4343
assert(FederationInstance, 'Please call init first');
44+
const loadRemote: typeof FederationInstance.loadRemote<T> =
45+
FederationInstance.loadRemote;
4446
// eslint-disable-next-line prefer-spread
45-
return FederationInstance.loadRemote.apply(FederationInstance, args);
47+
return loadRemote.apply(FederationInstance, args);
4648
}
4749

48-
export function loadShare(
50+
export function loadShare<T>(
4951
...args: Parameters<FederationHost['loadShare']>
50-
): ReturnType<FederationHost['loadShare']> {
52+
): Promise<false | (() => T | undefined)> {
5153
assert(FederationInstance, 'Please call init first');
5254
// eslint-disable-next-line prefer-spread
53-
return FederationInstance.loadShare.apply(FederationInstance, args);
55+
const loadShare: typeof FederationInstance.loadShare<T> =
56+
FederationInstance.loadShare;
57+
return loadShare.apply(FederationInstance, args);
5458
}
5559

56-
export function loadShareSync(
60+
export function loadShareSync<T>(
5761
...args: Parameters<FederationHost['loadShareSync']>
58-
): ReturnType<FederationHost['loadShareSync']> {
62+
): () => T | never {
5963
assert(FederationInstance, 'Please call init first');
64+
const loadShareSync: typeof FederationInstance.loadShareSync<T> =
65+
FederationInstance.loadShareSync;
6066
// eslint-disable-next-line prefer-spread
61-
return FederationInstance.loadShareSync.apply(FederationInstance, args);
67+
return loadShareSync.apply(FederationInstance, args);
6268
}
6369

6470
export function preloadRemote(

0 commit comments

Comments
 (0)