@module-federation/runtime 0.0.0-next-20240119073703 → 0.0.0-next-20240119091713

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.
@@ -1,4 +1,4 @@
1
- import { l as getRegisteredShare, u as getGlobalShareScope, G as Global, H as nativeGlobal, I as resetFederationGlobalInfo, B as getGlobalFederationInstance, E as setGlobalFederationInstance, C as getGlobalFederationConstructor, A as setGlobalFederationConstructor, m as getInfoWithoutType, t as getGlobalSnapshot, J as getTargetSnapshotInfoByModuleInfo, p as getGlobalSnapshotInfoByModuleInfo, r as setGlobalSnapshotInfoByModuleInfo, q as addGlobalSnapshot, c as getRemoteEntryExports, F as registerGlobalPlugins, g as getGlobalHostPlugins, n as getPreloaded, o as setPreloaded } from './share.esm.js';
1
+ import { l as getRegisteredShare, t as getGlobalShareScope, G as Global, F as nativeGlobal, H as resetFederationGlobalInfo, A as getGlobalFederationInstance, C as setGlobalFederationInstance, B as getGlobalFederationConstructor, z as setGlobalFederationConstructor, m as getInfoWithoutType, r as getGlobalSnapshot, I as getTargetSnapshotInfoByModuleInfo, p as getGlobalSnapshotInfoByModuleInfo, q as setGlobalSnapshotInfoByModuleInfo, J as addGlobalSnapshot, c as getRemoteEntryExports, E as registerGlobalPlugins, g as getGlobalHostPlugins, n as getPreloaded, o as setPreloaded } from './share.esm.js';
2
2
 
3
3
  const ShareUtils = {
4
4
  getRegisteredShare,
package/dist/index.cjs.js CHANGED
@@ -674,9 +674,9 @@ function splitId(id) {
674
674
  }
675
675
  }
676
676
  // Traverse all nodes in moduleInfo and traverse the entire snapshot
677
- function traverseModuleInfo(globalSnapshot, remoteInfo, traverse, isRoot, memo = {}, remoteSnapshot) {
677
+ function traverseModuleInfo(globalSnapshot, remoteInfo, traverse, isRoot, memo = {}, remoteSnapshot, getModuleInfoHook) {
678
678
  const id = share.getFMId(remoteInfo);
679
- const { value: snapshotValue } = share.getInfoWithoutType(globalSnapshot, id);
679
+ const { value: snapshotValue } = share.getInfoWithoutType(globalSnapshot, id, getModuleInfoHook);
680
680
  const effectiveRemoteSnapshot = remoteSnapshot || snapshotValue;
681
681
  if (effectiveRemoteSnapshot && !sdk.isManifestProvider(effectiveRemoteSnapshot)) {
682
682
  traverse(effectiveRemoteSnapshot, remoteInfo, isRoot);
@@ -692,7 +692,7 @@ function traverseModuleInfo(globalSnapshot, remoteInfo, traverse, isRoot, memo =
692
692
  traverseModuleInfo(globalSnapshot, {
693
693
  name: subRemoteInfo.name,
694
694
  version: remoteValue.matchedVersion
695
- }, traverse, false, memo, undefined);
695
+ }, traverse, false, memo, undefined, getModuleInfoHook);
696
696
  }
697
697
  }
698
698
  }
@@ -792,7 +792,16 @@ function generatePreloadAssets(origin, preloadOptions, remote, globalSnapshot, r
792
792
  share.setPreloaded(exposeFullPath);
793
793
  }
794
794
  }
795
- }, true, memo, remoteSnapshot);
795
+ }, true, memo, remoteSnapshot, (target, key)=>{
796
+ const res = origin.loaderHook.lifecycle.getModuleInfo.emit({
797
+ target,
798
+ key
799
+ });
800
+ if (res && !(res instanceof Promise)) {
801
+ return res;
802
+ }
803
+ return;
804
+ });
796
805
  if (remoteSnapshot.shared) {
797
806
  remoteSnapshot.shared.forEach((shared)=>{
798
807
  var _options_shared;
@@ -885,27 +894,37 @@ class SnapshotHandler {
885
894
  // eslint-disable-next-line max-lines-per-function
886
895
  async loadRemoteSnapshotInfo(moduleInfo) {
887
896
  const { options } = this.HostInstance;
897
+ const hostSnapshot = share.getGlobalSnapshotInfoByModuleInfo({
898
+ name: this.HostInstance.options.name,
899
+ version: this.HostInstance.options.version
900
+ }, {
901
+ getModuleInfoHook: (target, key)=>{
902
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
903
+ target,
904
+ key
905
+ });
906
+ if (res && !(res instanceof Promise)) {
907
+ return res;
908
+ }
909
+ return;
910
+ }
911
+ });
888
912
  await this.hooks.lifecycle.beforeLoadRemoteSnapshot.emit({
889
913
  options,
890
914
  moduleInfo
891
915
  });
892
- let hostSnapshot = share.getGlobalSnapshotInfoByModuleInfo({
893
- name: this.HostInstance.options.name,
894
- version: this.HostInstance.options.version
895
- });
896
- if (!hostSnapshot) {
897
- hostSnapshot = {
898
- version: this.HostInstance.options.version || '',
899
- remoteEntry: '',
900
- remotesInfo: {}
901
- };
902
- share.addGlobalSnapshot({
903
- [this.HostInstance.options.name]: hostSnapshot
904
- });
905
- }
906
916
  // In dynamic loadRemote scenarios, incomplete remotesInfo delivery may occur. In such cases, the remotesInfo in the host needs to be completed in the snapshot at runtime.
907
917
  // This ensures the snapshot's integrity and helps the chrome plugin correctly identify all producer modules, ensuring that proxyable producer modules will not be missing.
908
- if (hostSnapshot && 'remotesInfo' in hostSnapshot && !share.getInfoWithoutType(hostSnapshot.remotesInfo, moduleInfo.name).value) {
918
+ if (hostSnapshot && 'remotesInfo' in hostSnapshot && !share.getInfoWithoutType(hostSnapshot.remotesInfo, moduleInfo.name, (target, key)=>{
919
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
920
+ target,
921
+ key
922
+ });
923
+ if (res && !(res instanceof Promise)) {
924
+ return res;
925
+ }
926
+ return;
927
+ }).value) {
909
928
  if ('version' in moduleInfo || 'entry' in moduleInfo) {
910
929
  hostSnapshot.remotesInfo = _extends$1({}, hostSnapshot == null ? void 0 : hostSnapshot.remotesInfo, {
911
930
  [moduleInfo.name]: {
@@ -927,11 +946,7 @@ class SnapshotHandler {
927
946
  if (sdk.isManifestProvider(globalRemoteSnapshot)) {
928
947
  const moduleSnapshot = await this.getManifestJson(globalRemoteSnapshot.remoteEntry, moduleInfo, {});
929
948
  // eslint-disable-next-line @typescript-eslint/no-shadow
930
- const globalSnapshotRes = share.setGlobalSnapshotInfoByModuleInfo(_extends$1({}, moduleInfo, {
931
- // The global remote may be overridden
932
- // Therefore, set the snapshot key to the global address of the actual request
933
- entry: globalRemoteSnapshot.remoteEntry
934
- }), moduleSnapshot);
949
+ const globalSnapshotRes = share.setGlobalSnapshotInfoByModuleInfo(_extends$1({}, moduleInfo), moduleSnapshot);
935
950
  return {
936
951
  remoteSnapshot: moduleSnapshot,
937
952
  globalSnapshot: globalSnapshotRes
@@ -978,9 +993,29 @@ class SnapshotHandler {
978
993
  const hostGlobalSnapshot = share.getGlobalSnapshotInfoByModuleInfo({
979
994
  name: this.HostInstance.options.name,
980
995
  version: this.HostInstance.options.version
996
+ }, {
997
+ getModuleInfoHook: (target, key)=>{
998
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
999
+ target,
1000
+ key
1001
+ });
1002
+ if (res && !(res instanceof Promise)) {
1003
+ return res;
1004
+ }
1005
+ return;
1006
+ }
981
1007
  });
982
1008
  // get remote detail info from global
983
- const globalRemoteInfo = hostGlobalSnapshot && 'remotesInfo' in hostGlobalSnapshot && hostGlobalSnapshot.remotesInfo && share.getInfoWithoutType(hostGlobalSnapshot.remotesInfo, moduleInfo.name).value;
1009
+ const globalRemoteInfo = hostGlobalSnapshot && 'remotesInfo' in hostGlobalSnapshot && hostGlobalSnapshot.remotesInfo && share.getInfoWithoutType(hostGlobalSnapshot.remotesInfo, moduleInfo.name, (target, key)=>{
1010
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
1011
+ target,
1012
+ key
1013
+ });
1014
+ if (res && !(res instanceof Promise)) {
1015
+ return res;
1016
+ }
1017
+ return;
1018
+ }).value;
984
1019
  if (globalRemoteInfo && globalRemoteInfo.matchedVersion) {
985
1020
  return {
986
1021
  hostGlobalSnapshot,
@@ -988,6 +1023,17 @@ class SnapshotHandler {
988
1023
  remoteSnapshot: share.getGlobalSnapshotInfoByModuleInfo({
989
1024
  name: moduleInfo.name,
990
1025
  version: globalRemoteInfo.matchedVersion
1026
+ }, {
1027
+ getModuleInfoHook: (target, key)=>{
1028
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
1029
+ target,
1030
+ key
1031
+ });
1032
+ if (res && !(res instanceof Promise)) {
1033
+ return res;
1034
+ }
1035
+ return;
1036
+ }
991
1037
  })
992
1038
  };
993
1039
  }
@@ -997,6 +1043,17 @@ class SnapshotHandler {
997
1043
  remoteSnapshot: share.getGlobalSnapshotInfoByModuleInfo({
998
1044
  name: moduleInfo.name,
999
1045
  version: 'version' in moduleInfo ? moduleInfo.version : undefined
1046
+ }, {
1047
+ getModuleInfoHook: (target, key)=>{
1048
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
1049
+ target,
1050
+ key
1051
+ });
1052
+ if (res && !(res instanceof Promise)) {
1053
+ return res;
1054
+ }
1055
+ return;
1056
+ }
1000
1057
  })
1001
1058
  };
1002
1059
  }
@@ -1324,7 +1381,7 @@ class FederationHost {
1324
1381
  const { module, moduleOptions, remoteMatchInfo } = await this._getRemoteModuleAndOptions(id);
1325
1382
  const { pkgNameOrAlias, remote, expose, id: idRes } = remoteMatchInfo;
1326
1383
  const moduleOrFactory = await module.get(expose, options);
1327
- await this.hooks.lifecycle.onLoad.emit({
1384
+ const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({
1328
1385
  id: idRes,
1329
1386
  pkgNameOrAlias,
1330
1387
  expose,
@@ -1335,6 +1392,9 @@ class FederationHost {
1335
1392
  moduleInstance: module,
1336
1393
  origin: this
1337
1394
  });
1395
+ if (typeof moduleWrapper === 'function') {
1396
+ return moduleWrapper;
1397
+ }
1338
1398
  return moduleOrFactory;
1339
1399
  } catch (error) {
1340
1400
  const { from = 'runtime' } = options || {
@@ -1461,7 +1521,7 @@ class FederationHost {
1461
1521
  }
1462
1522
  // Set the remote entry to a complete path
1463
1523
  if ('entry' in remote) {
1464
- if (share.isBrowserEnv()) {
1524
+ if (share.isBrowserEnv() && !remote.entry.startsWith('http')) {
1465
1525
  remote.entry = new URL(remote.entry, window.location.origin).href;
1466
1526
  }
1467
1527
  }
@@ -1576,7 +1636,7 @@ class FederationHost {
1576
1636
  // not used yet
1577
1637
  afterPreloadRemote: new AsyncHook()
1578
1638
  });
1579
- this.version = "0.0.8";
1639
+ this.version = "0.0.9";
1580
1640
  this.moduleCache = new Map();
1581
1641
  this.loaderHook = new PluginSystem({
1582
1642
  // FIXME: may not be suitable , not open to the public yet
package/dist/index.esm.js CHANGED
@@ -1,5 +1,5 @@
1
- import { g as getGlobalHostPlugins, D as DEFAULT_REMOTE_TYPE, a as DEFAULT_SCOPE, b as globalLoading, c as getRemoteEntryExports, d as assert, s as safeToString, e as getFMId, i as isObject, f as error, w as warn, h as isPlainObject, j as isRemoteInfoWithEntry, k as isPureRemoteEntry, l as getRegisteredShare, m as getInfoWithoutType, n as getPreloaded, o as setPreloaded, p as getGlobalSnapshotInfoByModuleInfo, q as addGlobalSnapshot, r as setGlobalSnapshotInfoByModuleInfo, t as getGlobalSnapshot, G as Global, u as getGlobalShareScope, v as formatShareConfigs, x as isBrowserEnv, y as getBuilderId, z as addUniqueItem, A as setGlobalFederationConstructor, B as getGlobalFederationInstance, C as getGlobalFederationConstructor, E as setGlobalFederationInstance } from './share.esm.js';
2
- export { F as registerGlobalPlugins } from './share.esm.js';
1
+ import { g as getGlobalHostPlugins, D as DEFAULT_REMOTE_TYPE, a as DEFAULT_SCOPE, b as globalLoading, c as getRemoteEntryExports, d as assert, s as safeToString, e as getFMId, i as isObject, f as error, w as warn, h as isPlainObject, j as isRemoteInfoWithEntry, k as isPureRemoteEntry, l as getRegisteredShare, m as getInfoWithoutType, n as getPreloaded, o as setPreloaded, p as getGlobalSnapshotInfoByModuleInfo, q as setGlobalSnapshotInfoByModuleInfo, r as getGlobalSnapshot, G as Global, t as getGlobalShareScope, u as formatShareConfigs, v as isBrowserEnv, x as getBuilderId, y as addUniqueItem, z as setGlobalFederationConstructor, A as getGlobalFederationInstance, B as getGlobalFederationConstructor, C as setGlobalFederationInstance } from './share.esm.js';
2
+ export { E as registerGlobalPlugins } from './share.esm.js';
3
3
  import { composeKeyWithSeparator, loadScriptNode, loadScript, createScript, getResourceUrl, isManifestProvider, generateSnapshotFromManifest } from '@module-federation/sdk';
4
4
  export { loadScript } from '@module-federation/sdk';
5
5
 
@@ -672,9 +672,9 @@ function splitId(id) {
672
672
  }
673
673
  }
674
674
  // Traverse all nodes in moduleInfo and traverse the entire snapshot
675
- function traverseModuleInfo(globalSnapshot, remoteInfo, traverse, isRoot, memo = {}, remoteSnapshot) {
675
+ function traverseModuleInfo(globalSnapshot, remoteInfo, traverse, isRoot, memo = {}, remoteSnapshot, getModuleInfoHook) {
676
676
  const id = getFMId(remoteInfo);
677
- const { value: snapshotValue } = getInfoWithoutType(globalSnapshot, id);
677
+ const { value: snapshotValue } = getInfoWithoutType(globalSnapshot, id, getModuleInfoHook);
678
678
  const effectiveRemoteSnapshot = remoteSnapshot || snapshotValue;
679
679
  if (effectiveRemoteSnapshot && !isManifestProvider(effectiveRemoteSnapshot)) {
680
680
  traverse(effectiveRemoteSnapshot, remoteInfo, isRoot);
@@ -690,7 +690,7 @@ function traverseModuleInfo(globalSnapshot, remoteInfo, traverse, isRoot, memo =
690
690
  traverseModuleInfo(globalSnapshot, {
691
691
  name: subRemoteInfo.name,
692
692
  version: remoteValue.matchedVersion
693
- }, traverse, false, memo, undefined);
693
+ }, traverse, false, memo, undefined, getModuleInfoHook);
694
694
  }
695
695
  }
696
696
  }
@@ -790,7 +790,16 @@ function generatePreloadAssets(origin, preloadOptions, remote, globalSnapshot, r
790
790
  setPreloaded(exposeFullPath);
791
791
  }
792
792
  }
793
- }, true, memo, remoteSnapshot);
793
+ }, true, memo, remoteSnapshot, (target, key)=>{
794
+ const res = origin.loaderHook.lifecycle.getModuleInfo.emit({
795
+ target,
796
+ key
797
+ });
798
+ if (res && !(res instanceof Promise)) {
799
+ return res;
800
+ }
801
+ return;
802
+ });
794
803
  if (remoteSnapshot.shared) {
795
804
  remoteSnapshot.shared.forEach((shared)=>{
796
805
  var _options_shared;
@@ -883,27 +892,37 @@ class SnapshotHandler {
883
892
  // eslint-disable-next-line max-lines-per-function
884
893
  async loadRemoteSnapshotInfo(moduleInfo) {
885
894
  const { options } = this.HostInstance;
895
+ const hostSnapshot = getGlobalSnapshotInfoByModuleInfo({
896
+ name: this.HostInstance.options.name,
897
+ version: this.HostInstance.options.version
898
+ }, {
899
+ getModuleInfoHook: (target, key)=>{
900
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
901
+ target,
902
+ key
903
+ });
904
+ if (res && !(res instanceof Promise)) {
905
+ return res;
906
+ }
907
+ return;
908
+ }
909
+ });
886
910
  await this.hooks.lifecycle.beforeLoadRemoteSnapshot.emit({
887
911
  options,
888
912
  moduleInfo
889
913
  });
890
- let hostSnapshot = getGlobalSnapshotInfoByModuleInfo({
891
- name: this.HostInstance.options.name,
892
- version: this.HostInstance.options.version
893
- });
894
- if (!hostSnapshot) {
895
- hostSnapshot = {
896
- version: this.HostInstance.options.version || '',
897
- remoteEntry: '',
898
- remotesInfo: {}
899
- };
900
- addGlobalSnapshot({
901
- [this.HostInstance.options.name]: hostSnapshot
902
- });
903
- }
904
914
  // In dynamic loadRemote scenarios, incomplete remotesInfo delivery may occur. In such cases, the remotesInfo in the host needs to be completed in the snapshot at runtime.
905
915
  // This ensures the snapshot's integrity and helps the chrome plugin correctly identify all producer modules, ensuring that proxyable producer modules will not be missing.
906
- if (hostSnapshot && 'remotesInfo' in hostSnapshot && !getInfoWithoutType(hostSnapshot.remotesInfo, moduleInfo.name).value) {
916
+ if (hostSnapshot && 'remotesInfo' in hostSnapshot && !getInfoWithoutType(hostSnapshot.remotesInfo, moduleInfo.name, (target, key)=>{
917
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
918
+ target,
919
+ key
920
+ });
921
+ if (res && !(res instanceof Promise)) {
922
+ return res;
923
+ }
924
+ return;
925
+ }).value) {
907
926
  if ('version' in moduleInfo || 'entry' in moduleInfo) {
908
927
  hostSnapshot.remotesInfo = _extends$1({}, hostSnapshot == null ? void 0 : hostSnapshot.remotesInfo, {
909
928
  [moduleInfo.name]: {
@@ -925,11 +944,7 @@ class SnapshotHandler {
925
944
  if (isManifestProvider(globalRemoteSnapshot)) {
926
945
  const moduleSnapshot = await this.getManifestJson(globalRemoteSnapshot.remoteEntry, moduleInfo, {});
927
946
  // eslint-disable-next-line @typescript-eslint/no-shadow
928
- const globalSnapshotRes = setGlobalSnapshotInfoByModuleInfo(_extends$1({}, moduleInfo, {
929
- // The global remote may be overridden
930
- // Therefore, set the snapshot key to the global address of the actual request
931
- entry: globalRemoteSnapshot.remoteEntry
932
- }), moduleSnapshot);
947
+ const globalSnapshotRes = setGlobalSnapshotInfoByModuleInfo(_extends$1({}, moduleInfo), moduleSnapshot);
933
948
  return {
934
949
  remoteSnapshot: moduleSnapshot,
935
950
  globalSnapshot: globalSnapshotRes
@@ -976,9 +991,29 @@ class SnapshotHandler {
976
991
  const hostGlobalSnapshot = getGlobalSnapshotInfoByModuleInfo({
977
992
  name: this.HostInstance.options.name,
978
993
  version: this.HostInstance.options.version
994
+ }, {
995
+ getModuleInfoHook: (target, key)=>{
996
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
997
+ target,
998
+ key
999
+ });
1000
+ if (res && !(res instanceof Promise)) {
1001
+ return res;
1002
+ }
1003
+ return;
1004
+ }
979
1005
  });
980
1006
  // get remote detail info from global
981
- const globalRemoteInfo = hostGlobalSnapshot && 'remotesInfo' in hostGlobalSnapshot && hostGlobalSnapshot.remotesInfo && getInfoWithoutType(hostGlobalSnapshot.remotesInfo, moduleInfo.name).value;
1007
+ const globalRemoteInfo = hostGlobalSnapshot && 'remotesInfo' in hostGlobalSnapshot && hostGlobalSnapshot.remotesInfo && getInfoWithoutType(hostGlobalSnapshot.remotesInfo, moduleInfo.name, (target, key)=>{
1008
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
1009
+ target,
1010
+ key
1011
+ });
1012
+ if (res && !(res instanceof Promise)) {
1013
+ return res;
1014
+ }
1015
+ return;
1016
+ }).value;
982
1017
  if (globalRemoteInfo && globalRemoteInfo.matchedVersion) {
983
1018
  return {
984
1019
  hostGlobalSnapshot,
@@ -986,6 +1021,17 @@ class SnapshotHandler {
986
1021
  remoteSnapshot: getGlobalSnapshotInfoByModuleInfo({
987
1022
  name: moduleInfo.name,
988
1023
  version: globalRemoteInfo.matchedVersion
1024
+ }, {
1025
+ getModuleInfoHook: (target, key)=>{
1026
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
1027
+ target,
1028
+ key
1029
+ });
1030
+ if (res && !(res instanceof Promise)) {
1031
+ return res;
1032
+ }
1033
+ return;
1034
+ }
989
1035
  })
990
1036
  };
991
1037
  }
@@ -995,6 +1041,17 @@ class SnapshotHandler {
995
1041
  remoteSnapshot: getGlobalSnapshotInfoByModuleInfo({
996
1042
  name: moduleInfo.name,
997
1043
  version: 'version' in moduleInfo ? moduleInfo.version : undefined
1044
+ }, {
1045
+ getModuleInfoHook: (target, key)=>{
1046
+ const res = this.HostInstance.loaderHook.lifecycle.getModuleInfo.emit({
1047
+ target,
1048
+ key
1049
+ });
1050
+ if (res && !(res instanceof Promise)) {
1051
+ return res;
1052
+ }
1053
+ return;
1054
+ }
998
1055
  })
999
1056
  };
1000
1057
  }
@@ -1322,7 +1379,7 @@ class FederationHost {
1322
1379
  const { module, moduleOptions, remoteMatchInfo } = await this._getRemoteModuleAndOptions(id);
1323
1380
  const { pkgNameOrAlias, remote, expose, id: idRes } = remoteMatchInfo;
1324
1381
  const moduleOrFactory = await module.get(expose, options);
1325
- await this.hooks.lifecycle.onLoad.emit({
1382
+ const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({
1326
1383
  id: idRes,
1327
1384
  pkgNameOrAlias,
1328
1385
  expose,
@@ -1333,6 +1390,9 @@ class FederationHost {
1333
1390
  moduleInstance: module,
1334
1391
  origin: this
1335
1392
  });
1393
+ if (typeof moduleWrapper === 'function') {
1394
+ return moduleWrapper;
1395
+ }
1336
1396
  return moduleOrFactory;
1337
1397
  } catch (error) {
1338
1398
  const { from = 'runtime' } = options || {
@@ -1459,7 +1519,7 @@ class FederationHost {
1459
1519
  }
1460
1520
  // Set the remote entry to a complete path
1461
1521
  if ('entry' in remote) {
1462
- if (isBrowserEnv()) {
1522
+ if (isBrowserEnv() && !remote.entry.startsWith('http')) {
1463
1523
  remote.entry = new URL(remote.entry, window.location.origin).href;
1464
1524
  }
1465
1525
  }
@@ -1574,7 +1634,7 @@ class FederationHost {
1574
1634
  // not used yet
1575
1635
  afterPreloadRemote: new AsyncHook()
1576
1636
  });
1577
- this.version = "0.0.8";
1637
+ this.version = "0.0.9";
1578
1638
  this.moduleCache = new Map();
1579
1639
  this.loaderHook = new PluginSystem({
1580
1640
  // FIXME: may not be suitable , not open to the public yet
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/runtime",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "author": "zhouxiao <codingzx@gmail.com>",
5
5
  "main": "./index.cjs.js",
6
6
  "module": "./index.esm.js",
package/dist/share.cjs.js CHANGED
@@ -168,48 +168,29 @@ function setGlobalFederationInstance(FederationInstance) {
168
168
  function getGlobalFederationConstructor() {
169
169
  return globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR__;
170
170
  }
171
- function setGlobalFederationConstructor(FederationConstructor, isDebug = isDebugMode()) {
172
- if (isDebug) {
171
+ function setGlobalFederationConstructor(FederationConstructor) {
172
+ if (isDebugMode()) {
173
173
  globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;
174
- globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.0.8";
174
+ globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.0.9";
175
175
  }
176
176
  }
177
177
  // eslint-disable-next-line @typescript-eslint/ban-types
178
- function getInfoWithoutType(target, key) {
179
- if (typeof key === 'string') {
180
- const keyRes = target[key];
181
- if (keyRes) {
182
- return {
183
- value: target[key],
184
- key: key
185
- };
186
- } else {
187
- const targetKeys = Object.keys(target);
188
- for (let targetKey of targetKeys){
189
- const [targetTypeOrName, _] = targetKey.split(':');
190
- const nKey = `${targetTypeOrName}:${key}`;
191
- const typeWithKeyRes = target[nKey];
192
- if (typeWithKeyRes) {
193
- return {
194
- value: typeWithKeyRes,
195
- key: nKey
196
- };
197
- }
198
- }
199
- return {
200
- value: undefined,
201
- key: key
202
- };
203
- }
204
- } else {
205
- throw new Error('key must be string');
178
+ function getInfoWithoutType(target, key, getModuleInfoHook) {
179
+ let res = {
180
+ value: target[key],
181
+ key: key
182
+ };
183
+ if (getModuleInfoHook) {
184
+ const hookRes = getModuleInfoHook(target, key);
185
+ res = hookRes || res;
206
186
  }
187
+ return res;
207
188
  }
208
189
  const getGlobalSnapshot = ()=>nativeGlobal.__FEDERATION__.moduleInfo;
209
- const getTargetSnapshotInfoByModuleInfo = (moduleInfo, snapshot)=>{
190
+ const getTargetSnapshotInfoByModuleInfo = (moduleInfo, snapshot, getModuleInfoHook)=>{
210
191
  // Check if the remote is included in the hostSnapshot
211
192
  const moduleKey = getFMId(moduleInfo);
212
- const getModuleInfo = getInfoWithoutType(snapshot, moduleKey).value;
193
+ const getModuleInfo = getInfoWithoutType(snapshot, moduleKey, getModuleInfoHook).value;
213
194
  // The remoteSnapshot might not include a version
214
195
  if (getModuleInfo && !getModuleInfo.version && 'version' in moduleInfo && moduleInfo['version']) {
215
196
  getModuleInfo.version = moduleInfo['version'];
@@ -223,14 +204,14 @@ const getTargetSnapshotInfoByModuleInfo = (moduleInfo, snapshot)=>{
223
204
  "version"
224
205
  ]);
225
206
  const moduleKeyWithoutVersion = getFMId(resModuleInfo);
226
- const getModuleInfoWithoutVersion = getInfoWithoutType(nativeGlobal.__FEDERATION__.moduleInfo, moduleKeyWithoutVersion).value;
207
+ const getModuleInfoWithoutVersion = getInfoWithoutType(nativeGlobal.__FEDERATION__.moduleInfo, moduleKeyWithoutVersion, getModuleInfoHook).value;
227
208
  if ((getModuleInfoWithoutVersion == null ? void 0 : getModuleInfoWithoutVersion.version) === version) {
228
209
  return getModuleInfoWithoutVersion;
229
210
  }
230
211
  }
231
212
  return;
232
213
  };
233
- const getGlobalSnapshotInfoByModuleInfo = (moduleInfo)=>getTargetSnapshotInfoByModuleInfo(moduleInfo, nativeGlobal.__FEDERATION__.moduleInfo);
214
+ const getGlobalSnapshotInfoByModuleInfo = (moduleInfo, extraOptions)=>getTargetSnapshotInfoByModuleInfo(moduleInfo, nativeGlobal.__FEDERATION__.moduleInfo, extraOptions == null ? void 0 : extraOptions.getModuleInfoHook);
234
215
  const setGlobalSnapshotInfoByModuleInfo = (remoteInfo, moduleDetailInfo)=>{
235
216
  const moduleKey = getFMId(remoteInfo);
236
217
  nativeGlobal.__FEDERATION__.moduleInfo[moduleKey] = moduleDetailInfo;
@@ -702,24 +683,27 @@ const findVersion = (shareScopeMap, scope, pkgName, cb)=>{
702
683
  return prev;
703
684
  }, 0);
704
685
  };
686
+ const isLoaded = (shared)=>{
687
+ return Boolean(shared.loaded) || typeof shared.lib === 'function';
688
+ };
705
689
  function findSingletonVersionOrderByVersion(shareScopeMap, scope, pkgName) {
706
690
  const versions = shareScopeMap[scope][pkgName];
707
691
  const callback = function(prev, cur) {
708
- return !versions[prev].loaded && versionLt(prev, cur);
692
+ return !isLoaded(versions[prev]) && versionLt(prev, cur);
709
693
  };
710
694
  return findVersion(shareScopeMap, scope, pkgName, callback);
711
695
  }
712
696
  function findSingletonVersionOrderByLoaded(shareScopeMap, scope, pkgName) {
713
697
  const versions = shareScopeMap[scope][pkgName];
714
698
  const callback = function(prev, cur) {
715
- if (versions[cur].loaded) {
716
- if (versions[prev].loaded) {
699
+ if (isLoaded(versions[cur])) {
700
+ if (isLoaded(versions[prev])) {
717
701
  return Boolean(versionLt(prev, cur));
718
702
  } else {
719
703
  return true;
720
704
  }
721
705
  }
722
- if (versions[prev].loaded) {
706
+ if (isLoaded(versions[prev])) {
723
707
  return false;
724
708
  }
725
709
  return versionLt(prev, cur);
package/dist/share.esm.js CHANGED
@@ -166,48 +166,29 @@ function setGlobalFederationInstance(FederationInstance) {
166
166
  function getGlobalFederationConstructor() {
167
167
  return globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR__;
168
168
  }
169
- function setGlobalFederationConstructor(FederationConstructor, isDebug = isDebugMode()) {
170
- if (isDebug) {
169
+ function setGlobalFederationConstructor(FederationConstructor) {
170
+ if (isDebugMode()) {
171
171
  globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;
172
- globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.0.8";
172
+ globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.0.9";
173
173
  }
174
174
  }
175
175
  // eslint-disable-next-line @typescript-eslint/ban-types
176
- function getInfoWithoutType(target, key) {
177
- if (typeof key === 'string') {
178
- const keyRes = target[key];
179
- if (keyRes) {
180
- return {
181
- value: target[key],
182
- key: key
183
- };
184
- } else {
185
- const targetKeys = Object.keys(target);
186
- for (let targetKey of targetKeys){
187
- const [targetTypeOrName, _] = targetKey.split(':');
188
- const nKey = `${targetTypeOrName}:${key}`;
189
- const typeWithKeyRes = target[nKey];
190
- if (typeWithKeyRes) {
191
- return {
192
- value: typeWithKeyRes,
193
- key: nKey
194
- };
195
- }
196
- }
197
- return {
198
- value: undefined,
199
- key: key
200
- };
201
- }
202
- } else {
203
- throw new Error('key must be string');
176
+ function getInfoWithoutType(target, key, getModuleInfoHook) {
177
+ let res = {
178
+ value: target[key],
179
+ key: key
180
+ };
181
+ if (getModuleInfoHook) {
182
+ const hookRes = getModuleInfoHook(target, key);
183
+ res = hookRes || res;
204
184
  }
185
+ return res;
205
186
  }
206
187
  const getGlobalSnapshot = ()=>nativeGlobal.__FEDERATION__.moduleInfo;
207
- const getTargetSnapshotInfoByModuleInfo = (moduleInfo, snapshot)=>{
188
+ const getTargetSnapshotInfoByModuleInfo = (moduleInfo, snapshot, getModuleInfoHook)=>{
208
189
  // Check if the remote is included in the hostSnapshot
209
190
  const moduleKey = getFMId(moduleInfo);
210
- const getModuleInfo = getInfoWithoutType(snapshot, moduleKey).value;
191
+ const getModuleInfo = getInfoWithoutType(snapshot, moduleKey, getModuleInfoHook).value;
211
192
  // The remoteSnapshot might not include a version
212
193
  if (getModuleInfo && !getModuleInfo.version && 'version' in moduleInfo && moduleInfo['version']) {
213
194
  getModuleInfo.version = moduleInfo['version'];
@@ -221,14 +202,14 @@ const getTargetSnapshotInfoByModuleInfo = (moduleInfo, snapshot)=>{
221
202
  "version"
222
203
  ]);
223
204
  const moduleKeyWithoutVersion = getFMId(resModuleInfo);
224
- const getModuleInfoWithoutVersion = getInfoWithoutType(nativeGlobal.__FEDERATION__.moduleInfo, moduleKeyWithoutVersion).value;
205
+ const getModuleInfoWithoutVersion = getInfoWithoutType(nativeGlobal.__FEDERATION__.moduleInfo, moduleKeyWithoutVersion, getModuleInfoHook).value;
225
206
  if ((getModuleInfoWithoutVersion == null ? void 0 : getModuleInfoWithoutVersion.version) === version) {
226
207
  return getModuleInfoWithoutVersion;
227
208
  }
228
209
  }
229
210
  return;
230
211
  };
231
- const getGlobalSnapshotInfoByModuleInfo = (moduleInfo)=>getTargetSnapshotInfoByModuleInfo(moduleInfo, nativeGlobal.__FEDERATION__.moduleInfo);
212
+ const getGlobalSnapshotInfoByModuleInfo = (moduleInfo, extraOptions)=>getTargetSnapshotInfoByModuleInfo(moduleInfo, nativeGlobal.__FEDERATION__.moduleInfo, extraOptions == null ? void 0 : extraOptions.getModuleInfoHook);
232
213
  const setGlobalSnapshotInfoByModuleInfo = (remoteInfo, moduleDetailInfo)=>{
233
214
  const moduleKey = getFMId(remoteInfo);
234
215
  nativeGlobal.__FEDERATION__.moduleInfo[moduleKey] = moduleDetailInfo;
@@ -700,24 +681,27 @@ const findVersion = (shareScopeMap, scope, pkgName, cb)=>{
700
681
  return prev;
701
682
  }, 0);
702
683
  };
684
+ const isLoaded = (shared)=>{
685
+ return Boolean(shared.loaded) || typeof shared.lib === 'function';
686
+ };
703
687
  function findSingletonVersionOrderByVersion(shareScopeMap, scope, pkgName) {
704
688
  const versions = shareScopeMap[scope][pkgName];
705
689
  const callback = function(prev, cur) {
706
- return !versions[prev].loaded && versionLt(prev, cur);
690
+ return !isLoaded(versions[prev]) && versionLt(prev, cur);
707
691
  };
708
692
  return findVersion(shareScopeMap, scope, pkgName, callback);
709
693
  }
710
694
  function findSingletonVersionOrderByLoaded(shareScopeMap, scope, pkgName) {
711
695
  const versions = shareScopeMap[scope][pkgName];
712
696
  const callback = function(prev, cur) {
713
- if (versions[cur].loaded) {
714
- if (versions[prev].loaded) {
697
+ if (isLoaded(versions[cur])) {
698
+ if (isLoaded(versions[prev])) {
715
699
  return Boolean(versionLt(prev, cur));
716
700
  } else {
717
701
  return true;
718
702
  }
719
703
  }
720
- if (versions[prev].loaded) {
704
+ if (isLoaded(versions[prev])) {
721
705
  return false;
722
706
  }
723
707
  return versionLt(prev, cur);
@@ -786,4 +770,4 @@ function getGlobalShareScope() {
786
770
  return Global.__FEDERATION__.__SHARE__;
787
771
  }
788
772
 
789
- export { setGlobalFederationConstructor as A, getGlobalFederationInstance as B, getGlobalFederationConstructor as C, DEFAULT_REMOTE_TYPE as D, setGlobalFederationInstance as E, registerGlobalPlugins as F, Global as G, nativeGlobal as H, resetFederationGlobalInfo as I, getTargetSnapshotInfoByModuleInfo as J, DEFAULT_SCOPE as a, globalLoading as b, getRemoteEntryExports as c, assert as d, getFMId as e, error as f, getGlobalHostPlugins as g, isPlainObject as h, isObject as i, isRemoteInfoWithEntry as j, isPureRemoteEntry as k, getRegisteredShare as l, getInfoWithoutType as m, getPreloaded as n, setPreloaded as o, getGlobalSnapshotInfoByModuleInfo as p, addGlobalSnapshot as q, setGlobalSnapshotInfoByModuleInfo as r, safeToString as s, getGlobalSnapshot as t, getGlobalShareScope as u, formatShareConfigs as v, warn as w, isBrowserEnv as x, getBuilderId as y, addUniqueItem as z };
773
+ export { getGlobalFederationInstance as A, getGlobalFederationConstructor as B, setGlobalFederationInstance as C, DEFAULT_REMOTE_TYPE as D, registerGlobalPlugins as E, nativeGlobal as F, Global as G, resetFederationGlobalInfo as H, getTargetSnapshotInfoByModuleInfo as I, addGlobalSnapshot as J, DEFAULT_SCOPE as a, globalLoading as b, getRemoteEntryExports as c, assert as d, getFMId as e, error as f, getGlobalHostPlugins as g, isPlainObject as h, isObject as i, isRemoteInfoWithEntry as j, isPureRemoteEntry as k, getRegisteredShare as l, getInfoWithoutType as m, getPreloaded as n, setPreloaded as o, getGlobalSnapshotInfoByModuleInfo as p, setGlobalSnapshotInfoByModuleInfo as q, getGlobalSnapshot as r, safeToString as s, getGlobalShareScope as t, formatShareConfigs as u, isBrowserEnv as v, warn as w, getBuilderId as x, addUniqueItem as y, setGlobalFederationConstructor as z };
@@ -23,14 +23,25 @@ export declare function resetFederationGlobalInfo(): void;
23
23
  export declare function getGlobalFederationInstance(name: string, version: string | undefined): FederationHost | undefined;
24
24
  export declare function setGlobalFederationInstance(FederationInstance: FederationHost): void;
25
25
  export declare function getGlobalFederationConstructor(): typeof FederationHost | undefined;
26
- export declare function setGlobalFederationConstructor(FederationConstructor: typeof FederationHost | undefined, isDebug?: boolean): void;
27
- export declare function getInfoWithoutType<T extends object>(target: T, key: keyof T): {
26
+ export declare function setGlobalFederationConstructor(FederationConstructor: typeof FederationHost): void;
27
+ export declare function getInfoWithoutType<T extends object>(target: T, key: keyof T, getModuleInfoHook?: (target: any, key: string | number | symbol) => {
28
+ value: any | undefined;
29
+ key: string;
30
+ } | void): {
28
31
  value: T[keyof T] | undefined;
29
32
  key: string;
30
33
  };
31
34
  export declare const getGlobalSnapshot: () => GlobalModuleInfo;
32
- export declare const getTargetSnapshotInfoByModuleInfo: (moduleInfo: Optional<Remote, 'alias'>, snapshot: GlobalModuleInfo) => GlobalModuleInfo[string] | undefined;
33
- export declare const getGlobalSnapshotInfoByModuleInfo: (moduleInfo: Optional<Remote, 'alias'>) => GlobalModuleInfo[string] | undefined;
35
+ export declare const getTargetSnapshotInfoByModuleInfo: (moduleInfo: Optional<Remote, 'alias'>, snapshot: GlobalModuleInfo, getModuleInfoHook?: ((target: any, key: string | number | symbol) => void | {
36
+ value: any | undefined;
37
+ key: string;
38
+ }) | undefined) => GlobalModuleInfo[string] | undefined;
39
+ export declare const getGlobalSnapshotInfoByModuleInfo: (moduleInfo: Optional<Remote, 'alias'>, extraOptions?: {
40
+ getModuleInfoHook?: ((target: any, key: string | number | symbol) => void | {
41
+ value: any | undefined;
42
+ key: string;
43
+ }) | undefined;
44
+ } | undefined) => GlobalModuleInfo[string] | undefined;
34
45
  export declare const setGlobalSnapshotInfoByModuleInfo: (remoteInfo: Remote, moduleDetailInfo: GlobalModuleInfo[string]) => GlobalModuleInfo;
35
46
  export declare const addGlobalSnapshot: (moduleInfos: GlobalModuleInfo) => (() => void);
36
47
  export declare const getRemoteEntryExports: (name: string, globalName: string | undefined) => {
@@ -38,12 +38,12 @@ type SharedBaseArgs = {
38
38
  deps?: Array<string>;
39
39
  strategy?: 'version-first' | 'loaded-first';
40
40
  };
41
- export type SharedGetter = (() => () => Module) | (() => Promise<() => Module>);
42
41
  export type ShareArgs = (SharedBaseArgs & {
43
- get: SharedGetter;
42
+ get: () => () => Module | Promise<() => Module>;
44
43
  }) | (SharedBaseArgs & {
45
44
  lib: () => Module;
46
45
  });
46
+ export type SharedGetter = () => () => Promise<() => Module> | Module;
47
47
  export type Shared = {
48
48
  version: string;
49
49
  get: SharedGetter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/runtime",
3
- "version": "0.0.0-next-20240119073703",
3
+ "version": "0.0.0-next-20240119091713",
4
4
  "author": "zhouxiao <codingzx@gmail.com>",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.esm.js",
@@ -45,6 +45,6 @@
45
45
  }
46
46
  },
47
47
  "dependencies": {
48
- "@module-federation/sdk": "0.0.0-next-20240119073703"
48
+ "@module-federation/sdk": "0.0.0-next-20240119091713"
49
49
  }
50
50
  }