{"version":3,"file":"utils.cjs","names":["SEPARATOR","getProcessEnv","MANIFEST_EXT","NameTransformSymbol","NameTransformMap","EncodedNameTransformMap","isBrowserEnv","isReactNativeEnv"],"sources":["../src/utils.ts"],"sourcesContent":["import { RemoteEntryInfo, ModuleInfo } from './types';\nimport {\n  NameTransformMap,\n  NameTransformSymbol,\n  EncodedNameTransformMap,\n  SEPARATOR,\n  MANIFEST_EXT,\n} from './constant';\nimport { getProcessEnv, isBrowserEnv, isReactNativeEnv } from './env';\n\nconst LOG_CATEGORY = '[ Federation Runtime ]';\n\n// entry: name:version   version : 1.0.0 | ^1.2.3\n// entry: name:entry  entry:  https://localhost:9000/federation-manifest.json\nconst parseEntry = (\n  str: string,\n  devVerOrUrl?: string,\n  separator = SEPARATOR,\n): RemoteEntryInfo => {\n  const strSplit = str.split(separator);\n  const devVersionOrUrl =\n    getProcessEnv()['NODE_ENV'] === 'development' && devVerOrUrl;\n  const defaultVersion = '*';\n  const isEntry = (s: string) =>\n    s.startsWith('http') || s.includes(MANIFEST_EXT);\n\n  // Check if the string starts with a type\n  if (strSplit.length >= 2) {\n    let [name, ...versionOrEntryArr] = strSplit;\n    // @name@manifest-url.json\n    if (str.startsWith(separator)) {\n      name = strSplit.slice(0, 2).join(separator);\n      versionOrEntryArr = [\n        devVersionOrUrl || strSplit.slice(2).join(separator),\n      ];\n    }\n\n    let versionOrEntry = devVersionOrUrl || versionOrEntryArr.join(separator);\n\n    if (isEntry(versionOrEntry)) {\n      return {\n        name,\n        entry: versionOrEntry,\n      };\n    } else {\n      // Apply version rule\n      // devVersionOrUrl => inputVersion => defaultVersion\n      return {\n        name,\n        version: versionOrEntry || defaultVersion,\n      };\n    }\n  } else if (strSplit.length === 1) {\n    const [name] = strSplit;\n    if (devVersionOrUrl && isEntry(devVersionOrUrl)) {\n      return {\n        name,\n        entry: devVersionOrUrl,\n      };\n    }\n    return {\n      name,\n      version: devVersionOrUrl || defaultVersion,\n    };\n  } else {\n    throw `Invalid entry value: ${str}`;\n  }\n};\n\ndeclare global {\n  // eslint-disable-next-line no-var\n  var FEDERATION_DEBUG: string | undefined;\n}\n\nconst composeKeyWithSeparator = function (\n  ...args: (string | undefined)[]\n): string {\n  if (!args.length) {\n    return '';\n  }\n\n  return args.reduce((sum, cur) => {\n    if (!cur) {\n      return sum;\n    }\n    if (!sum) {\n      return cur;\n    }\n\n    return `${sum}${SEPARATOR}${cur}`;\n  }, '') as string;\n};\n\nconst encodeName = function (\n  name: string,\n  prefix = '',\n  withExt = false,\n): string {\n  try {\n    const ext = withExt ? '.js' : '';\n    return `${prefix}${name\n      .replace(\n        new RegExp(`${NameTransformSymbol.AT}`, 'g'),\n        NameTransformMap[NameTransformSymbol.AT],\n      )\n      .replace(\n        new RegExp(`${NameTransformSymbol.HYPHEN}`, 'g'),\n        NameTransformMap[NameTransformSymbol.HYPHEN],\n      )\n      .replace(\n        new RegExp(`${NameTransformSymbol.SLASH}`, 'g'),\n        NameTransformMap[NameTransformSymbol.SLASH],\n      )}${ext}`;\n  } catch (err) {\n    throw err;\n  }\n};\n\nconst decodeName = function (\n  name: string,\n  prefix?: string,\n  withExt?: boolean,\n): string {\n  try {\n    let decodedName = name;\n    if (prefix) {\n      if (!decodedName.startsWith(prefix)) {\n        return decodedName;\n      }\n      decodedName = decodedName.replace(new RegExp(prefix, 'g'), '');\n    }\n    decodedName = decodedName\n      .replace(\n        new RegExp(`${NameTransformMap[NameTransformSymbol.AT]}`, 'g'),\n        EncodedNameTransformMap[NameTransformMap[NameTransformSymbol.AT]],\n      )\n      .replace(\n        new RegExp(`${NameTransformMap[NameTransformSymbol.SLASH]}`, 'g'),\n        EncodedNameTransformMap[NameTransformMap[NameTransformSymbol.SLASH]],\n      )\n      .replace(\n        new RegExp(`${NameTransformMap[NameTransformSymbol.HYPHEN]}`, 'g'),\n        EncodedNameTransformMap[NameTransformMap[NameTransformSymbol.HYPHEN]],\n      );\n    if (withExt) {\n      decodedName = decodedName.replace('.js', '');\n    }\n    return decodedName;\n  } catch (err) {\n    throw err;\n  }\n};\n\nconst generateExposeFilename = (\n  exposeName: string,\n  withExt: boolean,\n): string => {\n  if (!exposeName) {\n    return '';\n  }\n\n  let expose = exposeName;\n  if (expose === '.') {\n    expose = 'default_export';\n  }\n  if (expose.startsWith('./')) {\n    expose = expose.replace('./', '');\n  }\n\n  return encodeName(expose, '__federation_expose_', withExt);\n};\n\nconst generateShareFilename = (pkgName: string, withExt: boolean): string => {\n  if (!pkgName) {\n    return '';\n  }\n  return encodeName(pkgName, '__federation_shared_', withExt);\n};\n\nconst getResourceUrl = (module: ModuleInfo, sourceUrl: string): string => {\n  if ('getPublicPath' in module) {\n    let publicPath;\n\n    if (!module.getPublicPath.startsWith('function')) {\n      publicPath = new Function(module.getPublicPath)();\n    } else {\n      publicPath = new Function('return ' + module.getPublicPath)()();\n    }\n\n    return `${publicPath}${sourceUrl}`;\n  } else if ('publicPath' in module) {\n    if (\n      !isBrowserEnv() &&\n      !isReactNativeEnv() &&\n      'ssrPublicPath' in module &&\n      typeof module.ssrPublicPath === 'string'\n    ) {\n      return `${module.ssrPublicPath}${sourceUrl}`;\n    }\n    return `${module.publicPath}${sourceUrl}`;\n  } else {\n    console.warn(\n      'Cannot get resource URL. If in debug mode, please ignore.',\n      module,\n      sourceUrl,\n    );\n    return '';\n  }\n};\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nconst assert = (condition: any, msg: string): asserts condition => {\n  if (!condition) {\n    error(msg);\n  }\n};\n\nconst error = (msg: string | Error | unknown): never => {\n  throw new Error(`${LOG_CATEGORY}: ${msg}`);\n};\n\nconst warn = (msg: Parameters<typeof console.warn>[0]): void => {\n  console.warn(`${LOG_CATEGORY}: ${msg}`);\n};\n\nfunction safeToString(info: any): string {\n  try {\n    return JSON.stringify(info, null, 2);\n  } catch (e) {\n    return '';\n  }\n}\n\n// RegExp for version string\nconst VERSION_PATTERN_REGEXP: RegExp = /^([\\d^=v<>~]|[*xX]$)/;\n\nfunction isRequiredVersion(str: string): boolean {\n  return VERSION_PATTERN_REGEXP.test(str);\n}\n\nexport {\n  parseEntry,\n  decodeName,\n  encodeName,\n  composeKeyWithSeparator,\n  generateExposeFilename,\n  generateShareFilename,\n  getResourceUrl,\n  assert,\n  error,\n  warn,\n  safeToString,\n  isRequiredVersion,\n};\n"],"mappings":"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"}