@module-federation/runtime 0.0.0-next-20240529095100 → 0.0.0-next-20240529103203

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 { o as getRegisteredShare, y as getGlobalShareScope, G as Global, J as nativeGlobal, K as resetFederationGlobalInfo, E as getGlobalFederationInstance, H as setGlobalFederationInstance, F as getGlobalFederationConstructor, C as setGlobalFederationConstructor, l as getInfoWithoutType, u as getGlobalSnapshot, L as getTargetSnapshotInfoByModuleInfo, q as getGlobalSnapshotInfoByModuleInfo, t as setGlobalSnapshotInfoByModuleInfo, r as addGlobalSnapshot, c as getRemoteEntryExports, I as registerGlobalPlugins, g as getGlobalHostPlugins, m as getPreloaded, n as setPreloaded } from './share.esm.js';
1
+ import { q as getRegisteredShare, A as getGlobalShareScope, G as Global, K as nativeGlobal, L as resetFederationGlobalInfo, F as getGlobalFederationInstance, I as setGlobalFederationInstance, H as getGlobalFederationConstructor, E as setGlobalFederationConstructor, n as getInfoWithoutType, x as getGlobalSnapshot, M as getTargetSnapshotInfoByModuleInfo, t as getGlobalSnapshotInfoByModuleInfo, v as setGlobalSnapshotInfoByModuleInfo, u as addGlobalSnapshot, c as getRemoteEntryExports, J as registerGlobalPlugins, g as getGlobalHostPlugins, o as getPreloaded, p as setPreloaded } from './share.esm.js';
2
2
 
3
3
  const ShareUtils = {
4
4
  getRegisteredShare,
package/dist/index.cjs.js CHANGED
@@ -142,7 +142,7 @@ async function loadEntryScript({ name, globalName, entry, createScriptHook }) {
142
142
  `);
143
143
  return entryExports;
144
144
  }).catch((e)=>{
145
- return e;
145
+ throw e;
146
146
  });
147
147
  }
148
148
  return sdk.loadScript(entry, {
@@ -158,7 +158,7 @@ async function loadEntryScript({ name, globalName, entry, createScriptHook }) {
158
158
  `);
159
159
  return entryExports;
160
160
  }).catch((e)=>{
161
- return e;
161
+ throw e;
162
162
  });
163
163
  }
164
164
  function getRemoteEntryUniqueKey(remoteInfo) {
@@ -638,13 +638,16 @@ function _extends$4() {
638
638
  return _extends$4.apply(this, arguments);
639
639
  }
640
640
  function assignRemoteInfo(remoteInfo, remoteSnapshot) {
641
- if (!('remoteEntry' in remoteSnapshot) || !remoteSnapshot.remoteEntry) {
642
- share.error(`The attribute remoteEntry of ${name} must not be undefined.`);
641
+ const remoteEntryInfo = share.getRemoteEntryInfoFromSnapshot(remoteSnapshot);
642
+ if (!remoteEntryInfo.url) {
643
+ share.error(`The attribute remoteEntry of ${remoteInfo.name} must not be undefined.`);
643
644
  }
644
- const { remoteEntry } = remoteSnapshot;
645
- const entryUrl = sdk.getResourceUrl(remoteSnapshot, remoteEntry);
646
- remoteInfo.type = remoteSnapshot.remoteEntryType;
647
- remoteInfo.entryGlobalName = remoteSnapshot.globalName;
645
+ let entryUrl = sdk.getResourceUrl(remoteSnapshot, remoteEntryInfo.url);
646
+ if (!share.isBrowserEnv() && !entryUrl.startsWith('http')) {
647
+ entryUrl = `https:${entryUrl}`;
648
+ }
649
+ remoteInfo.type = remoteEntryInfo.type;
650
+ remoteInfo.entryGlobalName = remoteEntryInfo.globalName;
648
651
  remoteInfo.entry = entryUrl;
649
652
  remoteInfo.version = remoteSnapshot.version;
650
653
  remoteInfo.buildVersion = remoteSnapshot.buildVersion;
@@ -769,7 +772,7 @@ function generatePreloadAssets(origin, preloadOptions, remote, globalSnapshot, r
769
772
  return;
770
773
  }
771
774
  }
772
- const remoteEntryUrl = sdk.getResourceUrl(moduleInfoSnapshot, 'remoteEntry' in moduleInfoSnapshot ? moduleInfoSnapshot.remoteEntry : '');
775
+ const remoteEntryUrl = sdk.getResourceUrl(moduleInfoSnapshot, share.getRemoteEntryInfoFromSnapshot(moduleInfoSnapshot).url);
773
776
  if (remoteEntryUrl) {
774
777
  entryAssets.push({
775
778
  name: remoteInfo.name,
@@ -975,12 +978,13 @@ class SnapshotHandler {
975
978
  // global snapshot includes manifest or module info includes manifest
976
979
  if (globalRemoteSnapshot) {
977
980
  if (sdk.isManifestProvider(globalRemoteSnapshot)) {
978
- const moduleSnapshot = await this.getManifestJson(globalRemoteSnapshot.remoteEntry, moduleInfo, {});
981
+ const remoteEntry = share.isBrowserEnv() ? globalRemoteSnapshot.remoteEntry : globalRemoteSnapshot.ssrRemoteEntry || globalRemoteSnapshot.remoteEntry || '';
982
+ const moduleSnapshot = await this.getManifestJson(remoteEntry, moduleInfo, {});
979
983
  // eslint-disable-next-line @typescript-eslint/no-shadow
980
984
  const globalSnapshotRes = share.setGlobalSnapshotInfoByModuleInfo(_extends$3({}, moduleInfo, {
981
985
  // The global remote may be overridden
982
986
  // Therefore, set the snapshot key to the global address of the actual request
983
- entry: globalRemoteSnapshot.remoteEntry
987
+ entry: remoteEntry
984
988
  }), moduleSnapshot);
985
989
  return {
986
990
  remoteSnapshot: moduleSnapshot,
@@ -1512,6 +1516,10 @@ class RemoteHandler {
1512
1516
  moduleInstance: module,
1513
1517
  origin: host
1514
1518
  });
1519
+ this.idToRemoteMap[id] = {
1520
+ name: remote.name,
1521
+ expose
1522
+ };
1515
1523
  if (typeof moduleWrapper === 'function') {
1516
1524
  return moduleWrapper;
1517
1525
  }
@@ -1670,49 +1678,61 @@ class RemoteHandler {
1670
1678
  }
1671
1679
  }
1672
1680
  removeRemote(remote) {
1673
- const { host } = this;
1674
- const { name } = remote;
1675
- const remoteIndex = host.options.remotes.findIndex((item)=>item.name === name);
1676
- if (remoteIndex !== -1) {
1677
- host.options.remotes.splice(remoteIndex, 1);
1678
- }
1679
- const loadedModule = host.moduleCache.get(remote.name);
1680
- if (loadedModule) {
1681
- var _Object_getOwnPropertyDescriptor;
1682
- const remoteInfo = loadedModule.remoteInfo;
1683
- const key = remoteInfo.entryGlobalName;
1684
- if (globalThis[key] && ((_Object_getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(globalThis, key)) == null ? void 0 : _Object_getOwnPropertyDescriptor.configurable)) {
1685
- delete globalThis[key];
1686
- }
1687
- const remoteEntryUniqueKey = getRemoteEntryUniqueKey(loadedModule.remoteInfo);
1688
- if (share.globalLoading[remoteEntryUniqueKey]) {
1689
- delete share.globalLoading[remoteEntryUniqueKey];
1681
+ try {
1682
+ const { host } = this;
1683
+ const { name } = remote;
1684
+ const remoteIndex = host.options.remotes.findIndex((item)=>item.name === name);
1685
+ if (remoteIndex !== -1) {
1686
+ host.options.remotes.splice(remoteIndex, 1);
1690
1687
  }
1691
- // delete un loaded shared and instance
1692
- let remoteInsId = remoteInfo.buildVersion ? sdk.composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion) : remoteInfo.name;
1693
- const remoteInsIndex = globalThis.__FEDERATION__.__INSTANCES__.findIndex((ins)=>{
1694
- if (remoteInfo.buildVersion) {
1695
- return ins.options.id === remoteInsId;
1696
- } else {
1697
- return ins.name === remoteInsId;
1688
+ const loadedModule = host.moduleCache.get(remote.name);
1689
+ if (loadedModule) {
1690
+ const remoteInfo = loadedModule.remoteInfo;
1691
+ const key = remoteInfo.entryGlobalName;
1692
+ if (globalThis[key]) {
1693
+ delete globalThis[key];
1698
1694
  }
1699
- });
1700
- if (remoteInsIndex !== -1) {
1701
- const remoteIns = globalThis.__FEDERATION__.__INSTANCES__[remoteInsIndex];
1702
- remoteInsId = remoteIns.options.id || remoteInsId;
1703
- const globalShareScopeMap = share.getGlobalShareScope();
1704
- let isAllSharedNotUsed = true;
1705
- const needDeleteKeys = [];
1706
- Object.keys(globalShareScopeMap).forEach((instId)=>{
1707
- Object.keys(globalShareScopeMap[instId]).forEach((shareScope)=>{
1708
- Object.keys(globalShareScopeMap[instId][shareScope]).forEach((shareName)=>{
1709
- Object.keys(globalShareScopeMap[instId][shareScope][shareName]).forEach((shareVersion)=>{
1710
- const shared = globalShareScopeMap[instId][shareScope][shareName][shareVersion];
1711
- if (shared.from === remoteInfo.name) {
1712
- if (shared.loaded || shared.loading) {
1713
- shared.useIn = shared.useIn.filter((usedHostName)=>usedHostName !== remoteInfo.name);
1714
- if (shared.useIn.length) {
1715
- isAllSharedNotUsed = false;
1695
+ const remoteEntryUniqueKey = getRemoteEntryUniqueKey(loadedModule.remoteInfo);
1696
+ if (share.globalLoading[remoteEntryUniqueKey]) {
1697
+ delete share.globalLoading[remoteEntryUniqueKey];
1698
+ }
1699
+ host.snapshotHandler.manifestCache.delete(remoteInfo.entry);
1700
+ // delete un loaded shared and instance
1701
+ let remoteInsId = remoteInfo.buildVersion ? sdk.composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion) : remoteInfo.name;
1702
+ const remoteInsIndex = globalThis.__FEDERATION__.__INSTANCES__.findIndex((ins)=>{
1703
+ if (remoteInfo.buildVersion) {
1704
+ return ins.options.id === remoteInsId;
1705
+ } else {
1706
+ return ins.name === remoteInsId;
1707
+ }
1708
+ });
1709
+ if (remoteInsIndex !== -1) {
1710
+ const remoteIns = globalThis.__FEDERATION__.__INSTANCES__[remoteInsIndex];
1711
+ remoteInsId = remoteIns.options.id || remoteInsId;
1712
+ const globalShareScopeMap = share.getGlobalShareScope();
1713
+ let isAllSharedNotUsed = true;
1714
+ const needDeleteKeys = [];
1715
+ Object.keys(globalShareScopeMap).forEach((instId)=>{
1716
+ const shareScopeMap = globalShareScopeMap[instId];
1717
+ shareScopeMap && Object.keys(shareScopeMap).forEach((shareScope)=>{
1718
+ const shareScopeVal = shareScopeMap[shareScope];
1719
+ shareScopeVal && Object.keys(shareScopeVal).forEach((shareName)=>{
1720
+ const sharedPkgs = shareScopeVal[shareName];
1721
+ sharedPkgs && Object.keys(sharedPkgs).forEach((shareVersion)=>{
1722
+ const shared = sharedPkgs[shareVersion];
1723
+ if (shared && typeof shared === 'object' && shared.from === remoteInfo.name) {
1724
+ if (shared.loaded || shared.loading) {
1725
+ shared.useIn = shared.useIn.filter((usedHostName)=>usedHostName !== remoteInfo.name);
1726
+ if (shared.useIn.length) {
1727
+ isAllSharedNotUsed = false;
1728
+ } else {
1729
+ needDeleteKeys.push([
1730
+ instId,
1731
+ shareScope,
1732
+ shareName,
1733
+ shareVersion
1734
+ ]);
1735
+ }
1716
1736
  } else {
1717
1737
  needDeleteKeys.push([
1718
1738
  instId,
@@ -1721,30 +1741,25 @@ class RemoteHandler {
1721
1741
  shareVersion
1722
1742
  ]);
1723
1743
  }
1724
- } else {
1725
- needDeleteKeys.push([
1726
- instId,
1727
- shareScope,
1728
- shareName,
1729
- shareVersion
1730
- ]);
1731
1744
  }
1732
- }
1745
+ });
1733
1746
  });
1734
1747
  });
1735
1748
  });
1736
- });
1737
- if (isAllSharedNotUsed) {
1738
- remoteIns.shareScopeMap = {};
1739
- delete globalShareScopeMap[remoteInsId];
1749
+ if (isAllSharedNotUsed) {
1750
+ remoteIns.shareScopeMap = {};
1751
+ delete globalShareScopeMap[remoteInsId];
1752
+ }
1753
+ needDeleteKeys.forEach(([insId, shareScope, shareName, shareVersion])=>{
1754
+ var _globalShareScopeMap_insId_shareScope_shareName, _globalShareScopeMap_insId_shareScope, _globalShareScopeMap_insId;
1755
+ (_globalShareScopeMap_insId = globalShareScopeMap[insId]) == null ? true : (_globalShareScopeMap_insId_shareScope = _globalShareScopeMap_insId[shareScope]) == null ? true : (_globalShareScopeMap_insId_shareScope_shareName = _globalShareScopeMap_insId_shareScope[shareName]) == null ? true : delete _globalShareScopeMap_insId_shareScope_shareName[shareVersion];
1756
+ });
1757
+ globalThis.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);
1740
1758
  }
1741
- needDeleteKeys.forEach(([insId, shareScope, shareName, shareVersion])=>{
1742
- var _globalShareScopeMap_insId_shareScope_shareName, _globalShareScopeMap_insId_shareScope, _globalShareScopeMap_insId;
1743
- (_globalShareScopeMap_insId = globalShareScopeMap[insId]) == null ? true : (_globalShareScopeMap_insId_shareScope = _globalShareScopeMap_insId[shareScope]) == null ? true : (_globalShareScopeMap_insId_shareScope_shareName = _globalShareScopeMap_insId_shareScope[shareName]) == null ? true : delete _globalShareScopeMap_insId_shareScope_shareName[shareVersion];
1744
- });
1745
- globalThis.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);
1759
+ host.moduleCache.delete(remote.name);
1746
1760
  }
1747
- host.moduleCache.delete(remote.name);
1761
+ } catch (err) {
1762
+ console.log('removeRemote fail: ', err);
1748
1763
  }
1749
1764
  }
1750
1765
  constructor(host){
@@ -1759,6 +1774,7 @@ class RemoteHandler {
1759
1774
  afterPreloadRemote: new AsyncHook()
1760
1775
  });
1761
1776
  this.host = host;
1777
+ this.idToRemoteMap = {};
1762
1778
  }
1763
1779
  }
1764
1780
 
@@ -1881,7 +1897,7 @@ class FederationHost {
1881
1897
  // maybe will change, temporarily for internal use only
1882
1898
  initContainer: new AsyncWaterfallHook('initContainer')
1883
1899
  });
1884
- this.version = "0.1.16";
1900
+ this.version = "0.1.15";
1885
1901
  this.moduleCache = new Map();
1886
1902
  this.loaderHook = new PluginSystem({
1887
1903
  // FIXME: may not be suitable , not open to the public yet
@@ -1970,6 +1986,9 @@ function registerPlugins(...args) {
1970
1986
  // eslint-disable-next-line prefer-spread
1971
1987
  return FederationInstance.registerPlugins.apply(FederationInstance, args);
1972
1988
  }
1989
+ function getInstance() {
1990
+ return FederationInstance;
1991
+ }
1973
1992
  // Inject for debug
1974
1993
  share.setGlobalFederationConstructor(FederationHost);
1975
1994
 
@@ -1983,6 +2002,7 @@ Object.defineProperty(exports, 'loadScriptNode', {
1983
2002
  get: function () { return sdk.loadScriptNode; }
1984
2003
  });
1985
2004
  exports.FederationHost = FederationHost;
2005
+ exports.getInstance = getInstance;
1986
2006
  exports.getRemoteEntry = getRemoteEntry;
1987
2007
  exports.getRemoteInfo = getRemoteInfo;
1988
2008
  exports.init = init;
package/dist/index.esm.js CHANGED
@@ -1,6 +1,6 @@
1
- import { g as getGlobalHostPlugins, a as globalLoading, D as DEFAULT_REMOTE_TYPE, b as DEFAULT_SCOPE, 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 getInfoWithoutType, m as getPreloaded, n as setPreloaded, o as getRegisteredShare, p as arrayOptions, q as getGlobalSnapshotInfoByModuleInfo, r as addGlobalSnapshot, t as setGlobalSnapshotInfoByModuleInfo, u as getGlobalSnapshot, G as Global, v as formatShareConfigs, x as getTargetSharedOptions, y as getGlobalShareScope, z as addUniqueItem, A as getBuilderId, B as isBrowserEnv$1, C as setGlobalFederationConstructor, E as getGlobalFederationInstance, F as getGlobalFederationConstructor, H as setGlobalFederationInstance } from './share.esm.js';
2
- export { I as registerGlobalPlugins } from './share.esm.js';
3
- import { loadScriptNode, loadScript, composeKeyWithSeparator, createLink, getResourceUrl, isManifestProvider, generateSnapshotFromManifest, warn as warn$1, isBrowserEnv } from '@module-federation/sdk';
1
+ import { g as getGlobalHostPlugins, a as globalLoading, D as DEFAULT_REMOTE_TYPE, b as DEFAULT_SCOPE, 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 getRemoteEntryInfoFromSnapshot, m as isBrowserEnv, n as getInfoWithoutType, o as getPreloaded, p as setPreloaded, q as getRegisteredShare, r as arrayOptions, t as getGlobalSnapshotInfoByModuleInfo, u as addGlobalSnapshot, v as setGlobalSnapshotInfoByModuleInfo, x as getGlobalSnapshot, G as Global, y as formatShareConfigs, z as getTargetSharedOptions, A as getGlobalShareScope, B as addUniqueItem, C as getBuilderId, E as setGlobalFederationConstructor, F as getGlobalFederationInstance, H as getGlobalFederationConstructor, I as setGlobalFederationInstance } from './share.esm.js';
2
+ export { J as registerGlobalPlugins } from './share.esm.js';
3
+ import { loadScriptNode, loadScript, composeKeyWithSeparator, createLink, getResourceUrl, isManifestProvider, generateSnapshotFromManifest, warn as warn$1, isBrowserEnv as isBrowserEnv$1 } from '@module-federation/sdk';
4
4
  export { loadScript, loadScriptNode } from '@module-federation/sdk';
5
5
 
6
6
  // Function to match a remote with its name and expose
@@ -140,7 +140,7 @@ async function loadEntryScript({ name, globalName, entry, createScriptHook }) {
140
140
  `);
141
141
  return entryExports;
142
142
  }).catch((e)=>{
143
- return e;
143
+ throw e;
144
144
  });
145
145
  }
146
146
  return loadScript(entry, {
@@ -156,7 +156,7 @@ async function loadEntryScript({ name, globalName, entry, createScriptHook }) {
156
156
  `);
157
157
  return entryExports;
158
158
  }).catch((e)=>{
159
- return e;
159
+ throw e;
160
160
  });
161
161
  }
162
162
  function getRemoteEntryUniqueKey(remoteInfo) {
@@ -636,13 +636,16 @@ function _extends$4() {
636
636
  return _extends$4.apply(this, arguments);
637
637
  }
638
638
  function assignRemoteInfo(remoteInfo, remoteSnapshot) {
639
- if (!('remoteEntry' in remoteSnapshot) || !remoteSnapshot.remoteEntry) {
640
- error(`The attribute remoteEntry of ${name} must not be undefined.`);
639
+ const remoteEntryInfo = getRemoteEntryInfoFromSnapshot(remoteSnapshot);
640
+ if (!remoteEntryInfo.url) {
641
+ error(`The attribute remoteEntry of ${remoteInfo.name} must not be undefined.`);
641
642
  }
642
- const { remoteEntry } = remoteSnapshot;
643
- const entryUrl = getResourceUrl(remoteSnapshot, remoteEntry);
644
- remoteInfo.type = remoteSnapshot.remoteEntryType;
645
- remoteInfo.entryGlobalName = remoteSnapshot.globalName;
643
+ let entryUrl = getResourceUrl(remoteSnapshot, remoteEntryInfo.url);
644
+ if (!isBrowserEnv() && !entryUrl.startsWith('http')) {
645
+ entryUrl = `https:${entryUrl}`;
646
+ }
647
+ remoteInfo.type = remoteEntryInfo.type;
648
+ remoteInfo.entryGlobalName = remoteEntryInfo.globalName;
646
649
  remoteInfo.entry = entryUrl;
647
650
  remoteInfo.version = remoteSnapshot.version;
648
651
  remoteInfo.buildVersion = remoteSnapshot.buildVersion;
@@ -767,7 +770,7 @@ function generatePreloadAssets(origin, preloadOptions, remote, globalSnapshot, r
767
770
  return;
768
771
  }
769
772
  }
770
- const remoteEntryUrl = getResourceUrl(moduleInfoSnapshot, 'remoteEntry' in moduleInfoSnapshot ? moduleInfoSnapshot.remoteEntry : '');
773
+ const remoteEntryUrl = getResourceUrl(moduleInfoSnapshot, getRemoteEntryInfoFromSnapshot(moduleInfoSnapshot).url);
771
774
  if (remoteEntryUrl) {
772
775
  entryAssets.push({
773
776
  name: remoteInfo.name,
@@ -973,12 +976,13 @@ class SnapshotHandler {
973
976
  // global snapshot includes manifest or module info includes manifest
974
977
  if (globalRemoteSnapshot) {
975
978
  if (isManifestProvider(globalRemoteSnapshot)) {
976
- const moduleSnapshot = await this.getManifestJson(globalRemoteSnapshot.remoteEntry, moduleInfo, {});
979
+ const remoteEntry = isBrowserEnv() ? globalRemoteSnapshot.remoteEntry : globalRemoteSnapshot.ssrRemoteEntry || globalRemoteSnapshot.remoteEntry || '';
980
+ const moduleSnapshot = await this.getManifestJson(remoteEntry, moduleInfo, {});
977
981
  // eslint-disable-next-line @typescript-eslint/no-shadow
978
982
  const globalSnapshotRes = setGlobalSnapshotInfoByModuleInfo(_extends$3({}, moduleInfo, {
979
983
  // The global remote may be overridden
980
984
  // Therefore, set the snapshot key to the global address of the actual request
981
- entry: globalRemoteSnapshot.remoteEntry
985
+ entry: remoteEntry
982
986
  }), moduleSnapshot);
983
987
  return {
984
988
  remoteSnapshot: moduleSnapshot,
@@ -1510,6 +1514,10 @@ class RemoteHandler {
1510
1514
  moduleInstance: module,
1511
1515
  origin: host
1512
1516
  });
1517
+ this.idToRemoteMap[id] = {
1518
+ name: remote.name,
1519
+ expose
1520
+ };
1513
1521
  if (typeof moduleWrapper === 'function') {
1514
1522
  return moduleWrapper;
1515
1523
  }
@@ -1638,7 +1646,7 @@ class RemoteHandler {
1638
1646
  }
1639
1647
  // Set the remote entry to a complete path
1640
1648
  if ('entry' in remote) {
1641
- if (isBrowserEnv() && !remote.entry.startsWith('http')) {
1649
+ if (isBrowserEnv$1() && !remote.entry.startsWith('http')) {
1642
1650
  remote.entry = new URL(remote.entry, window.location.origin).href;
1643
1651
  }
1644
1652
  }
@@ -1668,49 +1676,61 @@ class RemoteHandler {
1668
1676
  }
1669
1677
  }
1670
1678
  removeRemote(remote) {
1671
- const { host } = this;
1672
- const { name } = remote;
1673
- const remoteIndex = host.options.remotes.findIndex((item)=>item.name === name);
1674
- if (remoteIndex !== -1) {
1675
- host.options.remotes.splice(remoteIndex, 1);
1676
- }
1677
- const loadedModule = host.moduleCache.get(remote.name);
1678
- if (loadedModule) {
1679
- var _Object_getOwnPropertyDescriptor;
1680
- const remoteInfo = loadedModule.remoteInfo;
1681
- const key = remoteInfo.entryGlobalName;
1682
- if (globalThis[key] && ((_Object_getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor(globalThis, key)) == null ? void 0 : _Object_getOwnPropertyDescriptor.configurable)) {
1683
- delete globalThis[key];
1684
- }
1685
- const remoteEntryUniqueKey = getRemoteEntryUniqueKey(loadedModule.remoteInfo);
1686
- if (globalLoading[remoteEntryUniqueKey]) {
1687
- delete globalLoading[remoteEntryUniqueKey];
1679
+ try {
1680
+ const { host } = this;
1681
+ const { name } = remote;
1682
+ const remoteIndex = host.options.remotes.findIndex((item)=>item.name === name);
1683
+ if (remoteIndex !== -1) {
1684
+ host.options.remotes.splice(remoteIndex, 1);
1688
1685
  }
1689
- // delete un loaded shared and instance
1690
- let remoteInsId = remoteInfo.buildVersion ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion) : remoteInfo.name;
1691
- const remoteInsIndex = globalThis.__FEDERATION__.__INSTANCES__.findIndex((ins)=>{
1692
- if (remoteInfo.buildVersion) {
1693
- return ins.options.id === remoteInsId;
1694
- } else {
1695
- return ins.name === remoteInsId;
1686
+ const loadedModule = host.moduleCache.get(remote.name);
1687
+ if (loadedModule) {
1688
+ const remoteInfo = loadedModule.remoteInfo;
1689
+ const key = remoteInfo.entryGlobalName;
1690
+ if (globalThis[key]) {
1691
+ delete globalThis[key];
1696
1692
  }
1697
- });
1698
- if (remoteInsIndex !== -1) {
1699
- const remoteIns = globalThis.__FEDERATION__.__INSTANCES__[remoteInsIndex];
1700
- remoteInsId = remoteIns.options.id || remoteInsId;
1701
- const globalShareScopeMap = getGlobalShareScope();
1702
- let isAllSharedNotUsed = true;
1703
- const needDeleteKeys = [];
1704
- Object.keys(globalShareScopeMap).forEach((instId)=>{
1705
- Object.keys(globalShareScopeMap[instId]).forEach((shareScope)=>{
1706
- Object.keys(globalShareScopeMap[instId][shareScope]).forEach((shareName)=>{
1707
- Object.keys(globalShareScopeMap[instId][shareScope][shareName]).forEach((shareVersion)=>{
1708
- const shared = globalShareScopeMap[instId][shareScope][shareName][shareVersion];
1709
- if (shared.from === remoteInfo.name) {
1710
- if (shared.loaded || shared.loading) {
1711
- shared.useIn = shared.useIn.filter((usedHostName)=>usedHostName !== remoteInfo.name);
1712
- if (shared.useIn.length) {
1713
- isAllSharedNotUsed = false;
1693
+ const remoteEntryUniqueKey = getRemoteEntryUniqueKey(loadedModule.remoteInfo);
1694
+ if (globalLoading[remoteEntryUniqueKey]) {
1695
+ delete globalLoading[remoteEntryUniqueKey];
1696
+ }
1697
+ host.snapshotHandler.manifestCache.delete(remoteInfo.entry);
1698
+ // delete un loaded shared and instance
1699
+ let remoteInsId = remoteInfo.buildVersion ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion) : remoteInfo.name;
1700
+ const remoteInsIndex = globalThis.__FEDERATION__.__INSTANCES__.findIndex((ins)=>{
1701
+ if (remoteInfo.buildVersion) {
1702
+ return ins.options.id === remoteInsId;
1703
+ } else {
1704
+ return ins.name === remoteInsId;
1705
+ }
1706
+ });
1707
+ if (remoteInsIndex !== -1) {
1708
+ const remoteIns = globalThis.__FEDERATION__.__INSTANCES__[remoteInsIndex];
1709
+ remoteInsId = remoteIns.options.id || remoteInsId;
1710
+ const globalShareScopeMap = getGlobalShareScope();
1711
+ let isAllSharedNotUsed = true;
1712
+ const needDeleteKeys = [];
1713
+ Object.keys(globalShareScopeMap).forEach((instId)=>{
1714
+ const shareScopeMap = globalShareScopeMap[instId];
1715
+ shareScopeMap && Object.keys(shareScopeMap).forEach((shareScope)=>{
1716
+ const shareScopeVal = shareScopeMap[shareScope];
1717
+ shareScopeVal && Object.keys(shareScopeVal).forEach((shareName)=>{
1718
+ const sharedPkgs = shareScopeVal[shareName];
1719
+ sharedPkgs && Object.keys(sharedPkgs).forEach((shareVersion)=>{
1720
+ const shared = sharedPkgs[shareVersion];
1721
+ if (shared && typeof shared === 'object' && shared.from === remoteInfo.name) {
1722
+ if (shared.loaded || shared.loading) {
1723
+ shared.useIn = shared.useIn.filter((usedHostName)=>usedHostName !== remoteInfo.name);
1724
+ if (shared.useIn.length) {
1725
+ isAllSharedNotUsed = false;
1726
+ } else {
1727
+ needDeleteKeys.push([
1728
+ instId,
1729
+ shareScope,
1730
+ shareName,
1731
+ shareVersion
1732
+ ]);
1733
+ }
1714
1734
  } else {
1715
1735
  needDeleteKeys.push([
1716
1736
  instId,
@@ -1719,30 +1739,25 @@ class RemoteHandler {
1719
1739
  shareVersion
1720
1740
  ]);
1721
1741
  }
1722
- } else {
1723
- needDeleteKeys.push([
1724
- instId,
1725
- shareScope,
1726
- shareName,
1727
- shareVersion
1728
- ]);
1729
1742
  }
1730
- }
1743
+ });
1731
1744
  });
1732
1745
  });
1733
1746
  });
1734
- });
1735
- if (isAllSharedNotUsed) {
1736
- remoteIns.shareScopeMap = {};
1737
- delete globalShareScopeMap[remoteInsId];
1747
+ if (isAllSharedNotUsed) {
1748
+ remoteIns.shareScopeMap = {};
1749
+ delete globalShareScopeMap[remoteInsId];
1750
+ }
1751
+ needDeleteKeys.forEach(([insId, shareScope, shareName, shareVersion])=>{
1752
+ var _globalShareScopeMap_insId_shareScope_shareName, _globalShareScopeMap_insId_shareScope, _globalShareScopeMap_insId;
1753
+ (_globalShareScopeMap_insId = globalShareScopeMap[insId]) == null ? true : (_globalShareScopeMap_insId_shareScope = _globalShareScopeMap_insId[shareScope]) == null ? true : (_globalShareScopeMap_insId_shareScope_shareName = _globalShareScopeMap_insId_shareScope[shareName]) == null ? true : delete _globalShareScopeMap_insId_shareScope_shareName[shareVersion];
1754
+ });
1755
+ globalThis.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);
1738
1756
  }
1739
- needDeleteKeys.forEach(([insId, shareScope, shareName, shareVersion])=>{
1740
- var _globalShareScopeMap_insId_shareScope_shareName, _globalShareScopeMap_insId_shareScope, _globalShareScopeMap_insId;
1741
- (_globalShareScopeMap_insId = globalShareScopeMap[insId]) == null ? true : (_globalShareScopeMap_insId_shareScope = _globalShareScopeMap_insId[shareScope]) == null ? true : (_globalShareScopeMap_insId_shareScope_shareName = _globalShareScopeMap_insId_shareScope[shareName]) == null ? true : delete _globalShareScopeMap_insId_shareScope_shareName[shareVersion];
1742
- });
1743
- globalThis.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);
1757
+ host.moduleCache.delete(remote.name);
1744
1758
  }
1745
- host.moduleCache.delete(remote.name);
1759
+ } catch (err) {
1760
+ console.log('removeRemote fail: ', err);
1746
1761
  }
1747
1762
  }
1748
1763
  constructor(host){
@@ -1757,6 +1772,7 @@ class RemoteHandler {
1757
1772
  afterPreloadRemote: new AsyncHook()
1758
1773
  });
1759
1774
  this.host = host;
1775
+ this.idToRemoteMap = {};
1760
1776
  }
1761
1777
  }
1762
1778
 
@@ -1879,7 +1895,7 @@ class FederationHost {
1879
1895
  // maybe will change, temporarily for internal use only
1880
1896
  initContainer: new AsyncWaterfallHook('initContainer')
1881
1897
  });
1882
- this.version = "0.1.16";
1898
+ this.version = "0.1.15";
1883
1899
  this.moduleCache = new Map();
1884
1900
  this.loaderHook = new PluginSystem({
1885
1901
  // FIXME: may not be suitable , not open to the public yet
@@ -1900,7 +1916,7 @@ class FederationHost {
1900
1916
  ],
1901
1917
  remotes: [],
1902
1918
  shared: {},
1903
- inBrowser: isBrowserEnv$1()
1919
+ inBrowser: isBrowserEnv()
1904
1920
  };
1905
1921
  this.name = userOptions.name;
1906
1922
  this.options = defaultOptions;
@@ -1968,7 +1984,10 @@ function registerPlugins(...args) {
1968
1984
  // eslint-disable-next-line prefer-spread
1969
1985
  return FederationInstance.registerPlugins.apply(FederationInstance, args);
1970
1986
  }
1987
+ function getInstance() {
1988
+ return FederationInstance;
1989
+ }
1971
1990
  // Inject for debug
1972
1991
  setGlobalFederationConstructor(FederationHost);
1973
1992
 
1974
- export { FederationHost, getRemoteEntry, getRemoteInfo, init, loadRemote, loadShare, loadShareSync, preloadRemote, registerPlugins, registerRemotes };
1993
+ export { FederationHost, getInstance, getRemoteEntry, getRemoteInfo, init, loadRemote, loadShare, loadShareSync, preloadRemote, registerPlugins, registerRemotes };
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/runtime",
3
- "version": "0.1.16",
3
+ "version": "0.1.15",
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
@@ -76,6 +76,28 @@ function arrayOptions(options) {
76
76
  options
77
77
  ];
78
78
  }
79
+ function getRemoteEntryInfoFromSnapshot(snapshot) {
80
+ const defaultRemoteEntryInfo = {
81
+ url: '',
82
+ type: 'global',
83
+ globalName: ''
84
+ };
85
+ if (isBrowserEnv()) {
86
+ return 'remoteEntry' in snapshot ? {
87
+ url: snapshot.remoteEntry,
88
+ type: snapshot.remoteEntryType,
89
+ globalName: snapshot.globalName
90
+ } : defaultRemoteEntryInfo;
91
+ }
92
+ if ('ssrRemoteEntry' in snapshot) {
93
+ return {
94
+ url: snapshot.ssrRemoteEntry || defaultRemoteEntryInfo.url,
95
+ type: snapshot.ssrRemoteEntryType || defaultRemoteEntryInfo.type,
96
+ globalName: snapshot.globalName
97
+ };
98
+ }
99
+ return defaultRemoteEntryInfo;
100
+ }
79
101
 
80
102
  function _extends$1() {
81
103
  _extends$1 = Object.assign || function(target) {
@@ -190,7 +212,7 @@ function getGlobalFederationConstructor() {
190
212
  function setGlobalFederationConstructor(FederationConstructor, isDebug = isDebugMode()) {
191
213
  if (isDebug) {
192
214
  globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;
193
- globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.1.16";
215
+ globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.1.15";
194
216
  }
195
217
  }
196
218
  // eslint-disable-next-line @typescript-eslint/ban-types
@@ -893,6 +915,7 @@ exports.getInfoWithoutType = getInfoWithoutType;
893
915
  exports.getPreloaded = getPreloaded;
894
916
  exports.getRegisteredShare = getRegisteredShare;
895
917
  exports.getRemoteEntryExports = getRemoteEntryExports;
918
+ exports.getRemoteEntryInfoFromSnapshot = getRemoteEntryInfoFromSnapshot;
896
919
  exports.getTargetSharedOptions = getTargetSharedOptions;
897
920
  exports.getTargetSnapshotInfoByModuleInfo = getTargetSnapshotInfoByModuleInfo;
898
921
  exports.globalLoading = globalLoading;
package/dist/share.esm.js CHANGED
@@ -74,6 +74,28 @@ function arrayOptions(options) {
74
74
  options
75
75
  ];
76
76
  }
77
+ function getRemoteEntryInfoFromSnapshot(snapshot) {
78
+ const defaultRemoteEntryInfo = {
79
+ url: '',
80
+ type: 'global',
81
+ globalName: ''
82
+ };
83
+ if (isBrowserEnv()) {
84
+ return 'remoteEntry' in snapshot ? {
85
+ url: snapshot.remoteEntry,
86
+ type: snapshot.remoteEntryType,
87
+ globalName: snapshot.globalName
88
+ } : defaultRemoteEntryInfo;
89
+ }
90
+ if ('ssrRemoteEntry' in snapshot) {
91
+ return {
92
+ url: snapshot.ssrRemoteEntry || defaultRemoteEntryInfo.url,
93
+ type: snapshot.ssrRemoteEntryType || defaultRemoteEntryInfo.type,
94
+ globalName: snapshot.globalName
95
+ };
96
+ }
97
+ return defaultRemoteEntryInfo;
98
+ }
77
99
 
78
100
  function _extends$1() {
79
101
  _extends$1 = Object.assign || function(target) {
@@ -188,7 +210,7 @@ function getGlobalFederationConstructor() {
188
210
  function setGlobalFederationConstructor(FederationConstructor, isDebug = isDebugMode()) {
189
211
  if (isDebug) {
190
212
  globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;
191
- globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.1.16";
213
+ globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.1.15";
192
214
  }
193
215
  }
194
216
  // eslint-disable-next-line @typescript-eslint/ban-types
@@ -870,4 +892,4 @@ function getTargetSharedOptions(options) {
870
892
  return Object.assign({}, resolver(shareInfos[pkgName]), extraOptions == null ? void 0 : extraOptions.customShareInfo);
871
893
  }
872
894
 
873
- export { getBuilderId as A, isBrowserEnv as B, setGlobalFederationConstructor as C, DEFAULT_REMOTE_TYPE as D, getGlobalFederationInstance as E, getGlobalFederationConstructor as F, Global as G, setGlobalFederationInstance as H, registerGlobalPlugins as I, nativeGlobal as J, resetFederationGlobalInfo as K, getTargetSnapshotInfoByModuleInfo as L, globalLoading as a, DEFAULT_SCOPE 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, getInfoWithoutType as l, getPreloaded as m, setPreloaded as n, getRegisteredShare as o, arrayOptions as p, getGlobalSnapshotInfoByModuleInfo as q, addGlobalSnapshot as r, safeToString as s, setGlobalSnapshotInfoByModuleInfo as t, getGlobalSnapshot as u, formatShareConfigs as v, warn as w, getTargetSharedOptions as x, getGlobalShareScope as y, addUniqueItem as z };
895
+ export { getGlobalShareScope as A, addUniqueItem as B, getBuilderId as C, DEFAULT_REMOTE_TYPE as D, setGlobalFederationConstructor as E, getGlobalFederationInstance as F, Global as G, getGlobalFederationConstructor as H, setGlobalFederationInstance as I, registerGlobalPlugins as J, nativeGlobal as K, resetFederationGlobalInfo as L, getTargetSnapshotInfoByModuleInfo as M, globalLoading as a, DEFAULT_SCOPE 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, getRemoteEntryInfoFromSnapshot as l, isBrowserEnv as m, getInfoWithoutType as n, getPreloaded as o, setPreloaded as p, getRegisteredShare as q, arrayOptions as r, safeToString as s, getGlobalSnapshotInfoByModuleInfo as t, addGlobalSnapshot as u, setGlobalSnapshotInfoByModuleInfo as v, warn as w, getGlobalSnapshot as x, formatShareConfigs as y, getTargetSharedOptions as z };
@@ -13,3 +13,4 @@ export declare function loadShareSync<T>(...args: Parameters<FederationHost['loa
13
13
  export declare function preloadRemote(...args: Parameters<FederationHost['preloadRemote']>): ReturnType<FederationHost['preloadRemote']>;
14
14
  export declare function registerRemotes(...args: Parameters<FederationHost['registerRemotes']>): ReturnType<FederationHost['registerRemotes']>;
15
15
  export declare function registerPlugins(...args: Parameters<FederationHost['registerPlugins']>): ReturnType<FederationHost['registerRemotes']>;
16
+ export declare function getInstance(): FederationHost | null;
@@ -39,6 +39,10 @@ export declare class SnapshotHandler {
39
39
  remoteSnapshot: ModuleInfo;
40
40
  globalSnapshot: GlobalModuleInfo;
41
41
  }> | never;
42
- private getGlobalRemoteInfo;
42
+ getGlobalRemoteInfo(moduleInfo: Remote): {
43
+ hostGlobalSnapshot: ModuleInfo | undefined;
44
+ globalSnapshot: ReturnType<typeof getGlobalSnapshot>;
45
+ remoteSnapshot: GlobalModuleInfo[string] | undefined;
46
+ };
43
47
  private getManifestJson;
44
48
  }
@@ -15,6 +15,10 @@ export interface LoadRemoteMatch {
15
15
  }
16
16
  export declare class RemoteHandler {
17
17
  host: FederationHost;
18
+ idToRemoteMap: Record<string, {
19
+ name: string;
20
+ expose: string;
21
+ }>;
18
22
  hooks: PluginSystem<{
19
23
  beforeRequest: AsyncWaterfallHook<{
20
24
  id: string;
@@ -1,4 +1,4 @@
1
- import type { RemoteWithEntry } from '@module-federation/sdk';
1
+ import type { RemoteWithEntry, ModuleInfo, RemoteEntryType } from '@module-federation/sdk';
2
2
  import { Remote, RemoteInfoOptionalVersion } from '../type';
3
3
  export declare function addUniqueItem(arr: Array<string>, item: string): Array<string>;
4
4
  export declare function getFMId(remoteInfo: RemoteInfoOptionalVersion | RemoteWithEntry): string;
@@ -11,3 +11,8 @@ export declare const objectToString: () => string;
11
11
  export declare function isPlainObject(val: any): val is object;
12
12
  export declare function isStaticResourcesEqual(url1: string, url2: string): boolean;
13
13
  export declare function arrayOptions<T>(options: T | Array<T>): Array<T>;
14
+ export declare function getRemoteEntryInfoFromSnapshot(snapshot: ModuleInfo): {
15
+ url: string;
16
+ type: RemoteEntryType;
17
+ globalName: string;
18
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/runtime",
3
- "version": "0.0.0-next-20240529095100",
3
+ "version": "0.0.0-next-20240529103203",
4
4
  "author": "zhouxiao <codingzx@gmail.com>",
5
5
  "main": "./dist/index.cjs.js",
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-20240529095100"
48
+ "@module-federation/sdk": "0.0.0-next-20240529103203"
49
49
  }
50
50
  }