{"version":3,"file":"generateSnapshotFromManifest.cjs","names":["MANIFEST_EXT","StatsFileName","ManifestFileName"],"sources":["../src/generateSnapshotFromManifest.ts"],"sourcesContent":["import {\n  Manifest,\n  ProviderModuleInfo,\n  ModuleInfo,\n  BasicProviderModuleInfo,\n  ConsumerModuleInfo,\n  ManifestProvider,\n  moduleFederationPlugin,\n} from './types';\nimport { MANIFEST_EXT, ManifestFileName, StatsFileName } from './constant';\n\ninterface IOptions {\n  remotes?: Record<string, string>;\n  overrides?: Record<string, string>;\n  version?: string;\n}\n\nexport const simpleJoinRemoteEntry = (rPath: string, rName: string): string => {\n  if (!rPath) {\n    return rName;\n  }\n  const transformPath = (str: string) => {\n    if (str === '.') {\n      return '';\n    }\n    if (str.startsWith('./')) {\n      return str.replace('./', '');\n    }\n    if (str.startsWith('/')) {\n      const strWithoutSlash = str.slice(1);\n      if (strWithoutSlash.endsWith('/')) {\n        return strWithoutSlash.slice(0, -1);\n      }\n      return strWithoutSlash;\n    }\n    return str;\n  };\n\n  const transformedPath = transformPath(rPath);\n\n  if (!transformedPath) {\n    return rName;\n  }\n\n  if (transformedPath.endsWith('/')) {\n    return `${transformedPath}${rName}`;\n  }\n\n  return `${transformedPath}/${rName}`;\n};\n\nexport function inferAutoPublicPath(url: string): string {\n  return url\n    .replace(/#.*$/, '')\n    .replace(/\\?.*$/, '')\n    .replace(/\\/[^\\/]+$/, '/');\n}\n\n// Priority: overrides > remotes\n// eslint-disable-next-line max-lines-per-function\nexport function generateSnapshotFromManifest(\n  manifest: Manifest,\n  options: IOptions = {},\n): ProviderModuleInfo {\n  const { remotes = {}, overrides = {}, version } = options;\n  let remoteSnapshot: ProviderModuleInfo;\n\n  const getPublicPath = (): string => {\n    if ('publicPath' in manifest.metaData) {\n      if (\n        (manifest.metaData.publicPath === 'auto' ||\n          manifest.metaData.publicPath === '') &&\n        version\n      ) {\n        // use same implementation as publicPath auto runtime module implements\n        return inferAutoPublicPath(version);\n      }\n      return manifest.metaData.publicPath;\n    } else {\n      return manifest.metaData.getPublicPath;\n    }\n  };\n\n  const overridesKeys = Object.keys(overrides);\n\n  let remotesInfo: ConsumerModuleInfo['remotesInfo'] = {};\n\n  // If remotes are not provided, only the remotes in the manifest will be read\n  if (!Object.keys(remotes).length) {\n    remotesInfo =\n      manifest.remotes?.reduce(\n        (res, next) => {\n          let matchedVersion: string;\n          const name = next.federationContainerName;\n          // overrides have higher priority\n          if (overridesKeys.includes(name)) {\n            matchedVersion = overrides[name];\n          } else {\n            if ('version' in next) {\n              matchedVersion = next.version;\n            } else {\n              matchedVersion = next.entry;\n            }\n          }\n          res[name] = {\n            matchedVersion,\n          };\n          return res;\n        },\n        {} as ConsumerModuleInfo['remotesInfo'],\n      ) || {};\n  }\n\n  // If remotes (deploy scenario) are specified, they need to be traversed again\n  Object.keys(remotes).forEach(\n    (key) =>\n      (remotesInfo[key] = {\n        // overrides will override dependencies\n        matchedVersion: overridesKeys.includes(key)\n          ? overrides[key]\n          : remotes[key],\n      }),\n  );\n\n  const {\n    remoteEntry: {\n      path: remoteEntryPath,\n      name: remoteEntryName,\n      type: remoteEntryType,\n    },\n    types: remoteTypes = { path: '', name: '', zip: '', api: '' },\n    buildInfo: { buildVersion },\n    globalName,\n    ssrRemoteEntry,\n  } = manifest.metaData;\n  const { exposes } = manifest;\n\n  let basicRemoteSnapshot: BasicProviderModuleInfo = {\n    version: version ? version : '',\n    buildVersion,\n    globalName,\n    remoteEntry: simpleJoinRemoteEntry(remoteEntryPath, remoteEntryName),\n    remoteEntryType,\n    remoteTypes: simpleJoinRemoteEntry(remoteTypes.path, remoteTypes.name),\n    remoteTypesZip: remoteTypes.zip || '',\n    remoteTypesAPI: remoteTypes.api || '',\n    remotesInfo,\n    shared: manifest?.shared.map((item) => ({\n      assets: item.assets,\n      sharedName: item.name,\n      version: item.version,\n      // @ts-ignore\n      usedExports: item.referenceExports || [],\n    })),\n    modules: exposes?.map((expose) => ({\n      moduleName: expose.name,\n      modulePath: expose.path,\n      assets: expose.assets,\n    })),\n  };\n\n  if ('publicPath' in manifest.metaData) {\n    remoteSnapshot = {\n      ...basicRemoteSnapshot,\n      publicPath: getPublicPath(),\n    };\n    if (typeof manifest.metaData.ssrPublicPath === 'string') {\n      remoteSnapshot.ssrPublicPath = manifest.metaData.ssrPublicPath;\n    }\n  } else {\n    remoteSnapshot = {\n      ...basicRemoteSnapshot,\n      getPublicPath: getPublicPath(),\n    };\n  }\n\n  if (ssrRemoteEntry) {\n    const fullSSRRemoteEntry = simpleJoinRemoteEntry(\n      ssrRemoteEntry.path,\n      ssrRemoteEntry.name,\n    );\n    remoteSnapshot.ssrRemoteEntry = fullSSRRemoteEntry;\n    remoteSnapshot.ssrRemoteEntryType =\n      ssrRemoteEntry.type || 'commonjs-module';\n  }\n\n  return remoteSnapshot;\n}\n\nexport function isManifestProvider(\n  moduleInfo: ModuleInfo | ManifestProvider,\n): moduleInfo is ManifestProvider {\n  if (\n    'remoteEntry' in moduleInfo &&\n    moduleInfo.remoteEntry.includes(MANIFEST_EXT)\n  ) {\n    return true;\n  } else {\n    return false;\n  }\n}\n\nexport function getManifestFileName(\n  manifestOptions?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest'],\n): {\n  statsFileName: string;\n  manifestFileName: string;\n} {\n  if (!manifestOptions) {\n    return {\n      statsFileName: StatsFileName,\n      manifestFileName: ManifestFileName,\n    };\n  }\n\n  let filePath =\n    typeof manifestOptions === 'boolean' ? '' : manifestOptions.filePath || '';\n  let fileName =\n    typeof manifestOptions === 'boolean' ? '' : manifestOptions.fileName || '';\n\n  const JSON_EXT = '.json';\n  const addExt = (name: string): string => {\n    if (name.endsWith(JSON_EXT)) {\n      return name;\n    }\n    return `${name}${JSON_EXT}`;\n  };\n  const insertSuffix = (name: string, suffix: string): string => {\n    return name.replace(JSON_EXT, `${suffix}${JSON_EXT}`);\n  };\n  const manifestFileName = fileName ? addExt(fileName) : ManifestFileName;\n  const statsFileName = fileName\n    ? insertSuffix(manifestFileName, '-stats')\n    : StatsFileName;\n\n  return {\n    statsFileName: simpleJoinRemoteEntry(filePath, statsFileName),\n    manifestFileName: simpleJoinRemoteEntry(filePath, manifestFileName),\n  };\n}\n"],"mappings":"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"}