{"version":3,"file":"generate-preload-assets.cjs","names":["getInfoWithoutType","getFMId","defaultPreloadArgs","getRemoteEntryInfoFromSnapshot","normalizePreloadExposes","getPreloaded","getRegisteredShare","arrayOptions","isBrowserEnvValue","isRemoteInfoWithEntry","isPureRemoteEntry"],"sources":["../../src/plugins/generate-preload-assets.ts"],"sourcesContent":["import {\n  GlobalModuleInfo,\n  ModuleInfo,\n  ProviderModuleInfo,\n  isManifestProvider,\n  getResourceUrl,\n  isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport {\n  EntryAssets,\n  ModuleFederationRuntimePlugin,\n  PreloadAssets,\n  PreloadConfig,\n  PreloadOptions,\n  RemoteInfoOptionalVersion,\n  Shared,\n  Remote,\n} from '../type';\nimport { assignRemoteInfo } from './snapshot';\nimport { getInfoWithoutType, getPreloaded, setPreloaded } from '../global';\nimport { ModuleFederation } from '../core';\nimport { defaultPreloadArgs, normalizePreloadExposes } from '../utils/preload';\nimport { getRegisteredShare } from '../utils/share';\nimport {\n  arrayOptions,\n  getFMId,\n  getRemoteEntryInfoFromSnapshot,\n  isPureRemoteEntry,\n  isRemoteInfoWithEntry,\n} from '../utils';\n\ndeclare global {\n  // eslint-disable-next-line no-var\n  var __INIT_VMOK_DEPLOY_GLOBAL_DATA__: boolean | undefined;\n}\n\n// name\n// name:version\nfunction splitId(id: string): {\n  name: string;\n  version: string | undefined;\n} {\n  const splitInfo = id.split(':');\n  if (splitInfo.length === 1) {\n    return {\n      name: splitInfo[0],\n      version: undefined,\n    };\n  } else if (splitInfo.length === 2) {\n    return {\n      name: splitInfo[0],\n      version: splitInfo[1],\n    };\n  } else {\n    return {\n      name: splitInfo[1],\n      version: splitInfo[2],\n    };\n  }\n}\n\n// Traverse all nodes in moduleInfo and traverse the entire snapshot\nfunction traverseModuleInfo(\n  globalSnapshot: GlobalModuleInfo,\n  remoteInfo: RemoteInfoOptionalVersion,\n  traverse: (\n    snapshotInfo: ModuleInfo,\n    remoteInfo: RemoteInfoOptionalVersion,\n    isRoot: boolean,\n  ) => void,\n  isRoot: boolean,\n  memo: Record<string, boolean> = {},\n  remoteSnapshot?: ModuleInfo,\n): void {\n  const id = getFMId(remoteInfo);\n  const { value: snapshotValue } = getInfoWithoutType(globalSnapshot, id);\n  const effectiveRemoteSnapshot = remoteSnapshot || snapshotValue;\n  if (effectiveRemoteSnapshot && !isManifestProvider(effectiveRemoteSnapshot)) {\n    traverse(effectiveRemoteSnapshot, remoteInfo, isRoot);\n    if (effectiveRemoteSnapshot.remotesInfo) {\n      const remoteKeys = Object.keys(effectiveRemoteSnapshot.remotesInfo);\n      for (const key of remoteKeys) {\n        if (memo[key]) {\n          continue;\n        }\n        memo[key] = true;\n        const subRemoteInfo = splitId(key);\n        const remoteValue = effectiveRemoteSnapshot.remotesInfo[key];\n        traverseModuleInfo(\n          globalSnapshot,\n          {\n            name: subRemoteInfo.name,\n            version: remoteValue.matchedVersion,\n          },\n          traverse,\n          false,\n          memo,\n          undefined,\n        );\n      }\n    }\n  }\n}\n\nconst isExisted = (type: 'link' | 'script', url: string) => {\n  return document.querySelector(\n    `${type}[${type === 'link' ? 'href' : 'src'}=\"${url}\"]`,\n  );\n};\n\n// eslint-disable-next-line max-lines-per-function\nexport function generatePreloadAssets(\n  origin: ModuleFederation,\n  preloadOptions: PreloadOptions[number],\n  remote: RemoteInfoOptionalVersion,\n  globalSnapshot: GlobalModuleInfo,\n  remoteSnapshot: ModuleInfo,\n): PreloadAssets {\n  const cssAssets: Array<string> = [];\n  const jsAssets: Array<string> = [];\n  const entryAssets: Array<EntryAssets> = [];\n  const loadedSharedJsAssets = new Set();\n  const loadedSharedCssAssets = new Set();\n  const { options } = origin;\n\n  const { preloadConfig: rootPreloadConfig } = preloadOptions;\n  const { depsRemote } = rootPreloadConfig;\n  const memo = {};\n  traverseModuleInfo(\n    globalSnapshot,\n    remote,\n    (moduleInfoSnapshot: ModuleInfo, remoteInfo, isRoot) => {\n      let preloadConfig: PreloadConfig;\n      if (isRoot) {\n        preloadConfig = rootPreloadConfig;\n      } else {\n        if (Array.isArray(depsRemote)) {\n          // eslint-disable-next-line array-callback-return\n          const findPreloadConfig = depsRemote.find((remoteConfig) => {\n            if (\n              remoteConfig.nameOrAlias === remoteInfo.name ||\n              remoteConfig.nameOrAlias === remoteInfo.alias\n            ) {\n              return true;\n            }\n            return false;\n          });\n          if (!findPreloadConfig) {\n            return;\n          }\n          preloadConfig = defaultPreloadArgs(findPreloadConfig);\n        } else if (depsRemote === true) {\n          preloadConfig = rootPreloadConfig;\n        } else {\n          return;\n        }\n      }\n\n      const remoteEntryUrl = getResourceUrl(\n        moduleInfoSnapshot,\n        getRemoteEntryInfoFromSnapshot(moduleInfoSnapshot).url,\n      );\n\n      if (remoteEntryUrl) {\n        entryAssets.push({\n          name: remoteInfo.name,\n          moduleInfo: {\n            name: remoteInfo.name,\n            entry: remoteEntryUrl,\n            type:\n              'remoteEntryType' in moduleInfoSnapshot\n                ? moduleInfoSnapshot.remoteEntryType\n                : 'global',\n            entryGlobalName:\n              'globalName' in moduleInfoSnapshot\n                ? moduleInfoSnapshot.globalName\n                : remoteInfo.name,\n            shareScope: '',\n            version:\n              'version' in moduleInfoSnapshot\n                ? moduleInfoSnapshot.version\n                : undefined,\n          },\n          url: remoteEntryUrl,\n        });\n      }\n\n      let moduleAssetsInfo: NonNullable<ProviderModuleInfo['modules']> =\n        'modules' in moduleInfoSnapshot ? moduleInfoSnapshot.modules : [];\n      const normalizedPreloadExposes = normalizePreloadExposes(\n        preloadConfig.exposes,\n      );\n      if (normalizedPreloadExposes.length && 'modules' in moduleInfoSnapshot) {\n        moduleAssetsInfo = moduleInfoSnapshot?.modules?.reduce(\n          (assets, moduleAssetInfo) => {\n            if (\n              normalizedPreloadExposes?.indexOf(moduleAssetInfo.moduleName) !==\n              -1\n            ) {\n              assets.push(moduleAssetInfo);\n            }\n            return assets;\n          },\n          [] as NonNullable<(typeof moduleInfoSnapshot)['modules']>,\n        );\n      }\n\n      function handleAssets(assets: string[]): string[] {\n        const assetsRes = assets.map((asset) =>\n          getResourceUrl(moduleInfoSnapshot, asset),\n        );\n        if (preloadConfig.filter) {\n          return assetsRes.filter(preloadConfig.filter);\n        }\n        return assetsRes;\n      }\n\n      if (moduleAssetsInfo) {\n        const assetsLength = moduleAssetsInfo.length;\n        for (let index = 0; index < assetsLength; index++) {\n          const assetsInfo = moduleAssetsInfo[index];\n          const exposeFullPath = `${remoteInfo.name}/${assetsInfo.moduleName}`;\n          origin.remoteHandler.hooks.lifecycle.handlePreloadModule.emit({\n            id:\n              assetsInfo.moduleName === '.' ? remoteInfo.name : exposeFullPath,\n            name: remoteInfo.name,\n            remoteSnapshot: moduleInfoSnapshot,\n            preloadConfig,\n            remote: remoteInfo as Remote,\n            origin,\n          });\n          const preloaded = getPreloaded(exposeFullPath);\n          if (preloaded) {\n            continue;\n          }\n\n          if (preloadConfig.resourceCategory === 'all') {\n            cssAssets.push(...handleAssets(assetsInfo.assets.css.async));\n            cssAssets.push(...handleAssets(assetsInfo.assets.css.sync));\n            jsAssets.push(...handleAssets(assetsInfo.assets.js.async));\n            jsAssets.push(...handleAssets(assetsInfo.assets.js.sync));\n          } else if (preloadConfig.resourceCategory === 'sync') {\n            cssAssets.push(...handleAssets(assetsInfo.assets.css.sync));\n            jsAssets.push(...handleAssets(assetsInfo.assets.js.sync));\n          }\n\n          setPreloaded(exposeFullPath);\n        }\n      }\n    },\n    true,\n    memo,\n    remoteSnapshot,\n  );\n\n  if (remoteSnapshot.shared && remoteSnapshot.shared.length > 0) {\n    const collectSharedAssets = (\n      shareInfo: Shared,\n      snapshotShared: ModuleInfo['shared'][0],\n    ) => {\n      const { shared: registeredShared } =\n        getRegisteredShare(\n          origin.shareScopeMap,\n          snapshotShared.sharedName,\n          shareInfo,\n          origin.sharedHandler.hooks.lifecycle.resolveShare,\n        ) || {};\n      // If the global share does not exist, or the lib function does not exist, it means that the shared has not been loaded yet and can be preloaded.\n\n      if (registeredShared && typeof registeredShared.lib === 'function') {\n        snapshotShared.assets.js.sync.forEach((asset) => {\n          loadedSharedJsAssets.add(asset);\n        });\n        snapshotShared.assets.css.sync.forEach((asset) => {\n          loadedSharedCssAssets.add(asset);\n        });\n      }\n    };\n    remoteSnapshot.shared.forEach((shared) => {\n      const shareInfos = options.shared?.[shared.sharedName];\n      if (!shareInfos) {\n        return;\n      }\n      // if no version, preload all shared\n      const sharedOptions = shared.version\n        ? shareInfos.find((s) => s.version === shared.version)\n        : shareInfos;\n\n      if (!sharedOptions) {\n        return;\n      }\n      const arrayShareInfo = arrayOptions(sharedOptions);\n      arrayShareInfo.forEach((s) => {\n        collectSharedAssets(s, shared);\n      });\n    });\n  }\n\n  const needPreloadJsAssets = jsAssets.filter(\n    (asset) => !loadedSharedJsAssets.has(asset) && !isExisted('script', asset),\n  );\n  const needPreloadCssAssets = cssAssets.filter(\n    (asset) => !loadedSharedCssAssets.has(asset) && !isExisted('link', asset),\n  );\n\n  return {\n    cssAssets: needPreloadCssAssets,\n    jsAssetsWithoutEntry: needPreloadJsAssets,\n    entryAssets: entryAssets.filter((entry) => !isExisted('script', entry.url)),\n  };\n}\n\nexport const generatePreloadAssetsPlugin: () => ModuleFederationRuntimePlugin =\n  function () {\n    return {\n      name: 'generate-preload-assets-plugin',\n      async generatePreloadAssets(args) {\n        const {\n          origin,\n          preloadOptions,\n          remoteInfo,\n          remote,\n          globalSnapshot,\n          remoteSnapshot,\n        } = args;\n        if (!isBrowserEnvValue) {\n          return {\n            cssAssets: [],\n            jsAssetsWithoutEntry: [],\n            entryAssets: [],\n          };\n        }\n\n        if (isRemoteInfoWithEntry(remote) && isPureRemoteEntry(remote)) {\n          return {\n            cssAssets: [],\n            jsAssetsWithoutEntry: [],\n            entryAssets: [\n              {\n                name: remote.name,\n                url: remote.entry,\n                moduleInfo: {\n                  name: remoteInfo.name,\n                  entry: remote.entry,\n                  type: remoteInfo.type || 'global',\n                  entryGlobalName: '',\n                  shareScope: '',\n                },\n              },\n            ],\n          };\n        }\n\n        assignRemoteInfo(remoteInfo, remoteSnapshot);\n\n        const assets = generatePreloadAssets(\n          origin,\n          preloadOptions,\n          remoteInfo,\n          globalSnapshot,\n          remoteSnapshot,\n        );\n\n        return assets;\n      },\n    };\n  };\n"],"mappings":"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"}