@module-federation/vite 1.7.0 → 1.7.2

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.
package/lib/index.esm.js CHANGED
@@ -2,7 +2,7 @@ import defu from 'defu';
2
2
  import * as fs from 'fs';
3
3
  import { mkdirSync, writeFileSync, existsSync, writeFile } from 'fs';
4
4
  import * as path from 'pathe';
5
- import path__default, { resolve, parse, join, dirname, relative } from 'pathe';
5
+ import path__default, { resolve, basename, parse, join, dirname } from 'pathe';
6
6
  import { createFilter } from '@rollup/pluginutils';
7
7
  import { walk } from 'estree-walker';
8
8
  import MagicString from 'magic-string';
@@ -98,7 +98,7 @@ var addEntry = function addEntry(_ref) {
98
98
  emitFileOptions.fileName = fileName;
99
99
  }
100
100
  emitFileId = this.emitFile(emitFileOptions);
101
- if (htmlFilePath) {
101
+ if (htmlFilePath && fs.existsSync(htmlFilePath)) {
102
102
  var htmlContent = fs.readFileSync(htmlFilePath, 'utf-8');
103
103
  var scriptRegex = /<script\s+[^>]*src=["']([^"']+)["'][^>]*>/gi;
104
104
  var match;
@@ -137,10 +137,14 @@ var addEntry = function addEntry(_ref) {
137
137
  */
138
138
  function PluginDevProxyModuleTopLevelAwait() {
139
139
  var filterFunction = createFilter();
140
+ var processedFlag = '/* already-processed-by-dev-proxy-module-top-level-await */';
140
141
  return {
141
142
  name: 'dev-proxy-module-top-level-await',
142
143
  apply: 'serve',
143
144
  transform: function transform(code, id) {
145
+ if (code.includes(processedFlag)) {
146
+ return null;
147
+ }
144
148
  if (!code.includes('/*mf top-level-await placeholder replacement mf*/')) {
145
149
  return null;
146
150
  }
@@ -193,8 +197,9 @@ function PluginDevProxyModuleTopLevelAwait() {
193
197
  }
194
198
  }
195
199
  });
200
+ var transformedCode = magicString.toString();
196
201
  return {
197
- code: magicString.toString(),
202
+ code: processedFlag + "\n" + transformedCode,
198
203
  map: magicString.generateMap({
199
204
  hires: true
200
205
  })
@@ -513,6 +518,14 @@ function getNodeModulesDir() {
513
518
  }
514
519
  return cachedNodeModulesDir;
515
520
  }
521
+ function getSuffix(name) {
522
+ var base = basename(name);
523
+ var dotIndex = base.lastIndexOf('.');
524
+ if (dotIndex > 0 && dotIndex < base.length - 1) {
525
+ return base.slice(dotIndex);
526
+ }
527
+ return '.js';
528
+ }
516
529
  var patternMap = {};
517
530
  var cacheMap = {};
518
531
  /**
@@ -520,7 +533,6 @@ var cacheMap = {};
520
533
  */
521
534
  var VirtualModule = /*#__PURE__*/function () {
522
535
  function VirtualModule(name, tag, suffix) {
523
- var _name$split$slice$pop;
524
536
  if (tag === void 0) {
525
537
  tag = '__mf_v__';
526
538
  }
@@ -533,7 +545,7 @@ var VirtualModule = /*#__PURE__*/function () {
533
545
  this.inited = false;
534
546
  this.name = name;
535
547
  this.tag = tag;
536
- this.suffix = suffix || ((_name$split$slice$pop = name.split('.').slice(1).pop()) == null ? void 0 : _name$split$slice$pop.replace(/(.)/, '.$1')) || '.js';
548
+ this.suffix = suffix || getSuffix(name);
537
549
  if (!cacheMap[this.tag]) cacheMap[this.tag] = {};
538
550
  cacheMap[this.tag][this.name] = this;
539
551
  }
@@ -685,9 +697,9 @@ function writeLocalSharedImportMap() {
685
697
  }
686
698
  function generateLocalSharedImportMap() {
687
699
  var options = getNormalizeModuleFederationOptions();
688
- return "\n const importMap = {\n " + Array.from(getUsedShares()).map(function (pkg) {
700
+ return "\n const importMap = {\n " + Array.from(getUsedShares()).sort().map(function (pkg) {
689
701
  return "\n " + JSON.stringify(pkg) + ": async () => {\n let pkg = await import(\"" + getPreBuildLibImportId(pkg) + "\")\n return pkg\n }\n ";
690
- }).join(',') + "\n }\n const usedShared = {\n " + Array.from(getUsedShares()).map(function (key) {
702
+ }).join(',') + "\n }\n const usedShared = {\n " + Array.from(getUsedShares()).sort().map(function (key) {
691
703
  var shareItem = getNormalizeShareItem(key);
692
704
  if (!shareItem) return null;
693
705
  return "\n " + JSON.stringify(key) + ": {\n name: " + JSON.stringify(key) + ",\n version: " + JSON.stringify(shareItem.version) + ",\n scope: [" + JSON.stringify(shareItem.scope) + "],\n loaded: false,\n from: " + JSON.stringify(options.name) + ",\n async get () {\n usedShared[" + JSON.stringify(key) + "].loaded = true\n const {" + JSON.stringify(key) + ": pkgDynamicImport} = importMap \n const res = await pkgDynamicImport()\n const exportModule = {...res}\n // All npm packages pre-built by vite will be converted to esm\n Object.defineProperty(exportModule, \"__esModule\", {\n value: true,\n enumerable: false\n })\n return function () {\n return exportModule\n }\n },\n shareConfig: {\n singleton: " + shareItem.shareConfig.singleton + ",\n requiredVersion: " + JSON.stringify(shareItem.shareConfig.requiredVersion) + "\n }\n }\n ";
@@ -735,6 +747,154 @@ function initVirtualModules() {
735
747
  writeRuntimeInitStatus();
736
748
  }
737
749
 
750
+ var ASSET_TYPES = ['js', 'css'];
751
+ var LOAD_TIMINGS = ['sync', 'async'];
752
+ var JS_EXTENSIONS = ['.ts', '.tsx', '.jsx', '.mjs', '.cjs'];
753
+ /**
754
+ * Creates an empty asset map structure for tracking JS and CSS assets
755
+ * @returns Initialized asset map with sync/async arrays for JS and CSS
756
+ */
757
+ var createEmptyAssetMap = function createEmptyAssetMap() {
758
+ return {
759
+ js: {
760
+ sync: [],
761
+ async: []
762
+ },
763
+ css: {
764
+ sync: [],
765
+ async: []
766
+ }
767
+ };
768
+ };
769
+ /**
770
+ * Tracks an asset in the preload map with deduplication
771
+ * @param map - The preload map to update
772
+ * @param key - The module key to track under
773
+ * @param fileName - The asset filename to track
774
+ * @param isAsync - Whether the asset is loaded async
775
+ * @param type - The asset type ('js' or 'css')
776
+ */
777
+ var trackAsset = function trackAsset(map, key, fileName, isAsync, type) {
778
+ if (!map[key]) {
779
+ map[key] = createEmptyAssetMap();
780
+ }
781
+ var target = isAsync ? map[key][type].async : map[key][type].sync;
782
+ if (!target.includes(fileName)) {
783
+ target.push(fileName);
784
+ }
785
+ };
786
+ /**
787
+ * Checks if a file is a CSS file by extension
788
+ * @param fileName - The filename to check
789
+ * @returns True if file has a CSS extension (.css, .scss, .less)
790
+ */
791
+ var isCSSFile = function isCSSFile(fileName) {
792
+ return fileName.endsWith('.css') || fileName.endsWith('.scss') || fileName.endsWith('.less');
793
+ };
794
+ /**
795
+ * Collects all CSS assets from the bundle
796
+ * @param bundle - The Rollup output bundle
797
+ * @returns Set of CSS asset filenames
798
+ */
799
+ var collectCssAssets = function collectCssAssets(bundle) {
800
+ var cssAssets = new Set();
801
+ for (var _i = 0, _Object$entries = Object.entries(bundle); _i < _Object$entries.length; _i++) {
802
+ var _Object$entries$_i = _Object$entries[_i],
803
+ fileName = _Object$entries$_i[0],
804
+ fileData = _Object$entries$_i[1];
805
+ if (fileData.type === 'asset' && isCSSFile(fileName)) {
806
+ cssAssets.add(fileName);
807
+ }
808
+ }
809
+ return cssAssets;
810
+ };
811
+ /**
812
+ * Processes module assets and tracks them in the files map
813
+ * @param bundle - The Rollup output bundle
814
+ * @param filesMap - The preload map to populate
815
+ * @param moduleMatcher - Function that matches module paths to keys
816
+ */
817
+ var processModuleAssets = function processModuleAssets(bundle, filesMap, moduleMatcher) {
818
+ for (var _i2 = 0, _Object$entries2 = Object.entries(bundle); _i2 < _Object$entries2.length; _i2++) {
819
+ var _Object$entries2$_i = _Object$entries2[_i2],
820
+ fileName = _Object$entries2$_i[0],
821
+ fileData = _Object$entries2$_i[1];
822
+ if (fileData.type !== 'chunk') continue;
823
+ if (!fileData.modules) continue;
824
+ for (var _i3 = 0, _Object$keys = Object.keys(fileData.modules); _i3 < _Object$keys.length; _i3++) {
825
+ var modulePath = _Object$keys[_i3];
826
+ var matchKey = moduleMatcher(modulePath);
827
+ if (!matchKey) continue;
828
+ // Track main JS chunk
829
+ trackAsset(filesMap, matchKey, fileName, false, 'js');
830
+ // Handle dynamic imports
831
+ if (fileData.dynamicImports) {
832
+ for (var _iterator = _createForOfIteratorHelperLoose(fileData.dynamicImports), _step; !(_step = _iterator()).done;) {
833
+ var dynamicImport = _step.value;
834
+ var importData = bundle[dynamicImport];
835
+ if (!importData) continue;
836
+ var isCss = isCSSFile(dynamicImport);
837
+ trackAsset(filesMap, matchKey, dynamicImport, true, isCss ? 'css' : 'js');
838
+ }
839
+ }
840
+ }
841
+ }
842
+ };
843
+ /**
844
+ * Deduplicates assets in the files map
845
+ * @param filesMap - The preload map to deduplicate
846
+ * @returns New deduplicated preload map
847
+ */
848
+ var deduplicateAssets = function deduplicateAssets(filesMap) {
849
+ var result = {};
850
+ for (var _i4 = 0, _Object$entries3 = Object.entries(filesMap); _i4 < _Object$entries3.length; _i4++) {
851
+ var _Object$entries3$_i = _Object$entries3[_i4],
852
+ key = _Object$entries3$_i[0],
853
+ assetMaps = _Object$entries3$_i[1];
854
+ result[key] = createEmptyAssetMap();
855
+ for (var _i5 = 0, _ASSET_TYPES = ASSET_TYPES; _i5 < _ASSET_TYPES.length; _i5++) {
856
+ var type = _ASSET_TYPES[_i5];
857
+ for (var _i6 = 0, _LOAD_TIMINGS = LOAD_TIMINGS; _i6 < _LOAD_TIMINGS.length; _i6++) {
858
+ var timing = _LOAD_TIMINGS[_i6];
859
+ result[key][type][timing] = Array.from(new Set(assetMaps[type][timing]));
860
+ }
861
+ }
862
+ }
863
+ return result;
864
+ };
865
+ /**
866
+ * Builds a mapping between module files and their share keys
867
+ * @param shareKeys - Set of share keys to map
868
+ * @param resolveFn - Function to resolve module paths
869
+ * @returns Map of file paths to their corresponding share keys
870
+ */
871
+ var buildFileToShareKeyMap = function buildFileToShareKeyMap(shareKeys, resolveFn) {
872
+ try {
873
+ var fileToShareKey = new Map();
874
+ return Promise.resolve(Promise.all(Array.from(shareKeys).map(function (shareKey) {
875
+ return resolveFn(getPreBuildLibImportId(shareKey)).then(function (resolution) {
876
+ var _resolution$id;
877
+ return {
878
+ shareKey: shareKey,
879
+ file: resolution == null || (_resolution$id = resolution.id) == null ? void 0 : _resolution$id.split('?')[0]
880
+ };
881
+ })["catch"](function () {
882
+ return null;
883
+ });
884
+ }))).then(function (resolutions) {
885
+ for (var _iterator2 = _createForOfIteratorHelperLoose(resolutions), _step2; !(_step2 = _iterator2()).done;) {
886
+ var resolution = _step2.value;
887
+ if (resolution != null && resolution.file) {
888
+ fileToShareKey.set(resolution.file, resolution.shareKey);
889
+ }
890
+ }
891
+ return fileToShareKey;
892
+ });
893
+ } catch (e) {
894
+ return Promise.reject(e);
895
+ }
896
+ };
897
+
738
898
  var Manifest = function Manifest() {
739
899
  var mfOptions = getNormalizeModuleFederationOptions();
740
900
  var name = mfOptions.name,
@@ -746,21 +906,43 @@ var Manifest = function Manifest() {
746
906
  mfManifestName = 'mf-manifest.json';
747
907
  }
748
908
  if (typeof manifestOptions !== 'boolean') {
749
- mfManifestName = join((manifestOptions == null ? void 0 : manifestOptions.filePath) || '', (manifestOptions == null ? void 0 : manifestOptions.fileName) || '');
909
+ mfManifestName = path.join((manifestOptions == null ? void 0 : manifestOptions.filePath) || '', (manifestOptions == null ? void 0 : manifestOptions.fileName) || '');
750
910
  }
751
- var extensions;
752
911
  var root;
753
912
  var remoteEntryFile;
754
913
  var publicPath;
755
914
  var _command;
756
915
  var _originalConfigBase;
757
916
  var viteConfig;
917
+ /**
918
+ * Adds global CSS assets to all module exports
919
+ * @param filesMap - The preload map to update
920
+ * @param cssAssets - Set of CSS asset filenames to add
921
+ */
922
+ var addCssAssetsToAllExports = function addCssAssetsToAllExports(filesMap, cssAssets) {
923
+ Object.keys(filesMap).forEach(function (key) {
924
+ cssAssets.forEach(function (cssAsset) {
925
+ trackAsset(filesMap, key, cssAsset, false, 'css');
926
+ });
927
+ });
928
+ };
758
929
  return [{
759
930
  name: 'module-federation-manifest',
760
931
  apply: 'serve',
932
+ /**
933
+ * Stores resolved Vite config for later use
934
+ */
935
+ /**
936
+ * Finalizes configuration after all plugins are resolved
937
+ * @param config - Fully resolved Vite config
938
+ */
761
939
  configResolved: function configResolved(config) {
762
940
  viteConfig = config;
763
941
  },
942
+ /**
943
+ * Configures dev server middleware to handle manifest requests
944
+ * @param server - Vite dev server instance
945
+ */
764
946
  configureServer: function configureServer(server) {
765
947
  server.middlewares.use(function (req, res, next) {
766
948
  var _req$url;
@@ -808,137 +990,85 @@ var Manifest = function Manifest() {
808
990
  }, {
809
991
  name: 'module-federation-manifest',
810
992
  enforce: 'post',
993
+ /**
994
+ * Initial plugin configuration
995
+ * @param config - Vite config object
996
+ * @param command - Current Vite command (serve/build)
997
+ */
811
998
  config: function config(_config, _ref) {
812
999
  var command = _ref.command;
813
1000
  if (!_config.build) _config.build = {};
814
- if (!_config.build.manifest) _config.build.manifest = _config.build.manifest || !!manifestOptions;
1001
+ if (!_config.build.manifest) {
1002
+ _config.build.manifest = _config.build.manifest || !!manifestOptions;
1003
+ }
815
1004
  _command = command;
816
1005
  _originalConfigBase = _config.base;
817
1006
  },
818
1007
  configResolved: function configResolved(config) {
819
1008
  root = config.root;
820
- extensions = config.resolve.extensions || ['.mjs', '.js', '.mts', '.ts', '.jsx', '.tsx', '.json'];
821
1009
  var base = config.base;
822
1010
  if (_command === 'serve') {
823
1011
  base = (config.server.origin || '') + config.base;
824
1012
  }
825
1013
  publicPath = _originalConfigBase === '' ? 'auto' : base ? base.replace(/\/?$/, '/') : 'auto';
826
1014
  },
1015
+ /**
1016
+ * Generates the module federation manifest file
1017
+ * @param options - Rollup output options
1018
+ * @param bundle - Generated bundle assets
1019
+ */
827
1020
  generateBundle: function generateBundle(options, bundle) {
828
1021
  try {
829
1022
  var _this = this;
830
- // 递归查找模块的同步导入文件
831
- var _findSynchronousImports = function findSynchronousImports(fileName, array) {
832
- var fileData = bundle[fileName];
833
- if (fileData && fileData.type === 'chunk') {
834
- array.push(fileName); // 将当前文件加入预加载列表
835
- // 遍历该文件的同步导入文件
836
- fileData.imports.forEach(function (importedFile) {
837
- if (array.indexOf(importedFile) === -1) {
838
- _findSynchronousImports(importedFile, array); // 递归查找同步导入的文件
839
- }
840
- });
841
- }
842
- };
843
1023
  if (!mfManifestName) return Promise.resolve();
844
- var exposesModules = Object.keys(mfOptions.exposes).map(function (item) {
845
- return mfOptions.exposes[item]["import"];
846
- }); // 获取你提供的 moduleIds
847
- var filesContainingModules = {};
848
- // 帮助函数:检查模块路径是否匹配
849
- var isModuleMatched = function isModuleMatched(relativeModulePath, preloadModule) {
850
- // 先尝试直接匹配
851
- if (relativeModulePath === preloadModule) return true;
852
- // 如果 preloadModule 没有后缀,尝试添加可能的后缀进行匹配
853
- for (var _iterator = _createForOfIteratorHelperLoose(extensions), _step; !(_step = _iterator()).done;) {
854
- var ext = _step.value;
855
- if (relativeModulePath === "" + preloadModule + ext) {
856
- return true;
857
- }
858
- }
859
- return false;
860
- };
861
- // 遍历打包生成的每个文件
1024
+ var filesMap = {};
1025
+ // First pass: Find remoteEntry file
862
1026
  for (var _i = 0, _Object$entries = Object.entries(bundle); _i < _Object$entries.length; _i++) {
863
1027
  var _Object$entries$_i = _Object$entries[_i],
864
- fileName = _Object$entries$_i[0],
1028
+ _ = _Object$entries$_i[0],
865
1029
  fileData = _Object$entries$_i[1];
866
1030
  if (mfOptions.filename.replace(/[\[\]]/g, '_').replace(/\.[^/.]+$/, '') === fileData.name || fileData.name === 'remoteEntry') {
867
1031
  remoteEntryFile = fileData.fileName;
868
- }
869
- if (fileData.type === 'chunk') {
870
- // 遍历该文件的所有模块
871
- for (var _i2 = 0, _Object$keys = Object.keys(fileData.modules); _i2 < _Object$keys.length; _i2++) {
872
- var modulePath = _Object$keys[_i2];
873
- // 将绝对路径转换为相对于 Vite root 的相对路径
874
- var relativeModulePath = relative(root, modulePath);
875
- // 检查模块是否在 preloadModules 列表中
876
- for (var _iterator2 = _createForOfIteratorHelperLoose(exposesModules), _step2; !(_step2 = _iterator2()).done;) {
877
- var preloadModule = _step2.value;
878
- var formatPreloadModule = preloadModule.replace('./', '');
879
- if (isModuleMatched(relativeModulePath, formatPreloadModule)) {
880
- var _filesContainingModul;
881
- if (!filesContainingModules[preloadModule]) {
882
- filesContainingModules[preloadModule] = {
883
- sync: [],
884
- async: []
885
- };
886
- }
887
- console.log(Object.keys(fileData.modules));
888
- filesContainingModules[preloadModule].sync.push(fileName);
889
- (_filesContainingModul = filesContainingModules[preloadModule].async).push.apply(_filesContainingModul, fileData.dynamicImports || []);
890
- _findSynchronousImports(fileName, filesContainingModules[preloadModule].sync);
891
- break; // 如果找到匹配,跳出循环
892
- }
893
- }
894
- }
1032
+ break; // We can break early since we only need to find remoteEntry once
895
1033
  }
896
1034
  }
897
- var fileToShareKey = {};
898
- return Promise.resolve(Promise.all(Array.from(getUsedShares()).map(function (shareKey) {
899
- try {
900
- return Promise.resolve(_this.resolve(getPreBuildLibImportId(shareKey))).then(function (_this$resolve) {
901
- var file = _this$resolve.id.split('?')[0];
902
- fileToShareKey[file] = shareKey;
903
- });
904
- } catch (e) {
905
- return Promise.reject(e);
906
- }
907
- }))).then(function () {
908
- // 遍历打包生成的每个文件
909
- for (var _i3 = 0, _Object$entries2 = Object.entries(bundle); _i3 < _Object$entries2.length; _i3++) {
910
- var _Object$entries2$_i = _Object$entries2[_i3],
911
- _fileName = _Object$entries2$_i[0],
912
- _fileData = _Object$entries2$_i[1];
913
- if (_fileData.type === 'chunk') {
914
- // 遍历该文件的所有模块
915
- for (var _i4 = 0, _Object$keys2 = Object.keys(_fileData.modules); _i4 < _Object$keys2.length; _i4++) {
916
- var _modulePath = _Object$keys2[_i4];
917
- var sharedKey = fileToShareKey[_modulePath];
918
- if (sharedKey) {
919
- var _filesContainingModul2;
920
- if (!filesContainingModules[sharedKey]) {
921
- filesContainingModules[sharedKey] = {
922
- sync: [],
923
- async: []
924
- };
925
- }
926
- filesContainingModules[sharedKey].sync.push(_fileName);
927
- (_filesContainingModul2 = filesContainingModules[sharedKey].async).push.apply(_filesContainingModul2, _fileData.dynamicImports || []);
928
- _findSynchronousImports(_fileName, filesContainingModules[sharedKey].sync);
929
- break; // 如果找到匹配,跳出循环
930
- }
931
- }
1035
+ // Second pass: Collect all CSS assets
1036
+ var allCssAssets = collectCssAssets(bundle);
1037
+ var exposesModules = Object.keys(mfOptions.exposes).map(function (item) {
1038
+ return mfOptions.exposes[item]["import"];
1039
+ });
1040
+ // Process exposed modules
1041
+ processModuleAssets(bundle, filesMap, function (modulePath) {
1042
+ var absoluteModulePath = path.resolve(root, modulePath);
1043
+ return exposesModules.find(function (exposeModule) {
1044
+ var exposePath = path.resolve(root, exposeModule);
1045
+ // First try exact path match
1046
+ if (absoluteModulePath === exposePath) {
1047
+ return true;
932
1048
  }
933
- }
934
- Object.keys(filesContainingModules).forEach(function (key) {
935
- filesContainingModules[key].sync = Array.from(new Set(filesContainingModules[key].sync));
936
- filesContainingModules[key].async = Array.from(new Set(filesContainingModules[key].async));
1049
+ // Then try path match without known extensions
1050
+ var getPathWithoutKnownExt = function getPathWithoutKnownExt(filePath) {
1051
+ var ext = path.extname(filePath);
1052
+ return JS_EXTENSIONS.includes(ext) ? path.join(path.dirname(filePath), path.basename(filePath, ext)) : filePath;
1053
+ };
1054
+ var modulePathNoExt = getPathWithoutKnownExt(absoluteModulePath);
1055
+ var exposePathNoExt = getPathWithoutKnownExt(exposePath);
1056
+ return modulePathNoExt === exposePathNoExt;
1057
+ });
1058
+ });
1059
+ // Process shared modules
1060
+ return Promise.resolve(buildFileToShareKeyMap(getUsedShares(), _this.resolve.bind(_this))).then(function (fileToShareKey) {
1061
+ processModuleAssets(bundle, filesMap, function (modulePath) {
1062
+ return fileToShareKey.get(modulePath);
937
1063
  });
1064
+ // Add all CSS assets to every export
1065
+ addCssAssetsToAllExports(filesMap, allCssAssets);
1066
+ // Final deduplication of all assets
1067
+ filesMap = deduplicateAssets(filesMap);
938
1068
  _this.emitFile({
939
1069
  type: 'asset',
940
1070
  fileName: mfManifestName,
941
- source: JSON.stringify(generateMFManifest(filesContainingModules))
1071
+ source: JSON.stringify(generateMFManifest(filesMap))
942
1072
  });
943
1073
  });
944
1074
  } catch (e) {
@@ -946,6 +1076,11 @@ var Manifest = function Manifest() {
946
1076
  }
947
1077
  }
948
1078
  }];
1079
+ /**
1080
+ * Generates the final manifest JSON structure
1081
+ * @param preloadMap - Map of module assets to include
1082
+ * @returns Complete manifest object
1083
+ */
949
1084
  function generateMFManifest(preloadMap) {
950
1085
  var options = getNormalizeModuleFederationOptions();
951
1086
  var name = options.name;
@@ -954,23 +1089,23 @@ var Manifest = function Manifest() {
954
1089
  path: '',
955
1090
  type: 'module'
956
1091
  };
957
- var remotes = [];
958
- var usedRemotesMap = getUsedRemotesMap();
959
- Object.keys(usedRemotesMap).forEach(function (remoteKey) {
960
- var usedModules = Array.from(usedRemotesMap[remoteKey]);
961
- usedModules.forEach(function (moduleKey) {
962
- remotes.push({
1092
+ // Process remotes
1093
+ var remotes = Array.from(Object.entries(getUsedRemotesMap())).flatMap(function (_ref2) {
1094
+ var remoteKey = _ref2[0],
1095
+ modules = _ref2[1];
1096
+ return Array.from(modules).map(function (moduleKey) {
1097
+ return {
963
1098
  federationContainerName: options.remotes[remoteKey].entry,
964
1099
  moduleName: moduleKey.replace(remoteKey, '').replace('/', ''),
965
1100
  alias: remoteKey,
966
1101
  entry: '*'
967
- });
1102
+ };
968
1103
  });
969
1104
  });
970
- // @ts-ignore
1105
+ // Process shared dependencies
971
1106
  var shared = Array.from(getUsedShares()).map(function (shareKey) {
972
- var _preloadMap$shareKey, _preloadMap$shareKey2;
973
1107
  var shareItem = getNormalizeShareItem(shareKey);
1108
+ var assets = preloadMap[shareKey] || createEmptyAssetMap();
974
1109
  return {
975
1110
  id: name + ":" + shareKey,
976
1111
  name: shareKey,
@@ -978,42 +1113,40 @@ var Manifest = function Manifest() {
978
1113
  requiredVersion: shareItem.shareConfig.requiredVersion,
979
1114
  assets: {
980
1115
  js: {
981
- async: (preloadMap == null || (_preloadMap$shareKey = preloadMap[shareKey]) == null ? void 0 : _preloadMap$shareKey.async) || [],
982
- sync: (preloadMap == null || (_preloadMap$shareKey2 = preloadMap[shareKey]) == null ? void 0 : _preloadMap$shareKey2.sync) || []
1116
+ async: assets.js.async,
1117
+ sync: assets.js.sync
983
1118
  },
984
1119
  css: {
985
- async: [],
986
- sync: []
1120
+ async: assets.css.async,
1121
+ sync: assets.css.sync
987
1122
  }
988
1123
  }
989
1124
  };
990
- }).filter(function (item) {
991
- return item;
992
- });
993
- var exposes = Object.keys(options.exposes).map(function (key) {
994
- var _preloadMap$sourceFil, _preloadMap$sourceFil2;
995
- // assets(.css, .jpg, .svg等)其他资源, 不重要, 暂未处理
1125
+ }).filter(Boolean);
1126
+ // Process exposed modules
1127
+ var exposes = Object.entries(options.exposes).map(function (_ref3) {
1128
+ var key = _ref3[0],
1129
+ value = _ref3[1];
996
1130
  var formatKey = key.replace('./', '');
997
- var sourceFile = options.exposes[key]["import"];
1131
+ var sourceFile = value["import"];
1132
+ var assets = preloadMap[sourceFile] || createEmptyAssetMap();
998
1133
  return {
999
- id: name + ':' + formatKey,
1134
+ id: name + ":" + formatKey,
1000
1135
  name: formatKey,
1001
1136
  assets: {
1002
1137
  js: {
1003
- async: (preloadMap == null || (_preloadMap$sourceFil = preloadMap[sourceFile]) == null ? void 0 : _preloadMap$sourceFil.async) || [],
1004
- sync: (preloadMap == null || (_preloadMap$sourceFil2 = preloadMap[sourceFile]) == null ? void 0 : _preloadMap$sourceFil2.sync) || []
1138
+ async: assets.js.async,
1139
+ sync: assets.js.sync
1005
1140
  },
1006
1141
  css: {
1007
- sync: [],
1008
- async: []
1142
+ async: assets.css.async,
1143
+ sync: assets.css.sync
1009
1144
  }
1010
1145
  },
1011
1146
  path: key
1012
1147
  };
1013
- }).filter(function (item) {
1014
- return item;
1015
- }); // Filter out any null values
1016
- var result = {
1148
+ }).filter(Boolean);
1149
+ return {
1017
1150
  id: name,
1018
1151
  name: name,
1019
1152
  metaData: _extends({
@@ -1028,8 +1161,6 @@ var Manifest = function Manifest() {
1028
1161
  types: {
1029
1162
  path: '',
1030
1163
  name: ''
1031
- // "zip": "@mf-types.zip",
1032
- // "api": "@mf-types.d.ts"
1033
1164
  },
1034
1165
  globalName: name,
1035
1166
  pluginVersion: '0.2.5'
@@ -1042,7 +1173,6 @@ var Manifest = function Manifest() {
1042
1173
  remotes: remotes,
1043
1174
  exposes: exposes
1044
1175
  };
1045
- return result;
1046
1176
  }
1047
1177
  };
1048
1178