{"version":3,"file":"share.cjs","names":["TreeShakingStatus","arrayOptions","satisfy","DEFAULT_SCOPE","Global"],"sources":["../../src/utils/share.ts"],"sourcesContent":["import { DEFAULT_SCOPE } from '../constant';\nimport { TreeShakingStatus } from '@module-federation/sdk';\nimport { Global, Federation } from '../global';\nimport {\n  GlobalShareScopeMap,\n  Shared,\n  ShareArgs,\n  ShareInfos,\n  ShareScopeMap,\n  LoadShareExtraOptions,\n  UserOptions,\n  Options,\n  ShareStrategy,\n  TreeShakingArgs,\n  SharedGetter,\n} from '../type';\nimport { warn, error } from './logger';\nimport { satisfy } from './semver';\nimport { SyncWaterfallHook } from './hooks';\nimport { addUniqueItem, arrayOptions } from './tool';\n\nfunction formatShare(\n  shareArgs: ShareArgs,\n  from: string,\n  name: string,\n  shareStrategy?: ShareStrategy,\n): Shared {\n  let get: Shared['get'];\n  if ('get' in shareArgs) {\n    // eslint-disable-next-line prefer-destructuring\n    get = shareArgs.get;\n  } else if ('lib' in shareArgs) {\n    get = () => Promise.resolve(shareArgs.lib);\n  } else {\n    get = () =>\n      Promise.resolve(() => {\n        error(\n          `Cannot get shared \"${name}\" from \"${from}\": neither \"get\" nor \"lib\" is provided in the share config.`,\n        );\n      });\n  }\n\n  if (shareArgs.shareConfig?.eager && shareArgs.treeShaking?.mode) {\n    error(\n      `Invalid shared config for \"${name}\" from \"${from}\": cannot use both \"eager: true\" and \"treeShaking.mode\" simultaneously. Choose one strategy.`,\n    );\n  }\n\n  return {\n    deps: [],\n    useIn: [],\n    from,\n    loading: null,\n    ...shareArgs,\n    shareConfig: {\n      requiredVersion: `^${shareArgs.version}`,\n      singleton: false,\n      eager: false,\n      strictVersion: false,\n      ...shareArgs.shareConfig,\n    },\n    get,\n    loaded: shareArgs?.loaded || 'lib' in shareArgs ? true : undefined,\n    version: shareArgs.version ?? '0',\n    scope: Array.isArray(shareArgs.scope)\n      ? shareArgs.scope\n      : [shareArgs.scope ?? 'default'],\n    strategy: (shareArgs.strategy ?? shareStrategy) || 'version-first',\n    treeShaking: shareArgs.treeShaking\n      ? {\n          ...shareArgs.treeShaking,\n          mode: shareArgs.treeShaking.mode ?? 'server-calc',\n          status: shareArgs.treeShaking.status ?? TreeShakingStatus.UNKNOWN,\n          useIn: [],\n        }\n      : undefined,\n  };\n}\n\nexport function formatShareConfigs(\n  prevOptions: Options,\n  newOptions: UserOptions,\n) {\n  const shareArgs = newOptions.shared || {};\n  const from = newOptions.name;\n\n  const newShareInfos = Object.keys(shareArgs).reduce((res, pkgName) => {\n    const arrayShareArgs = arrayOptions(shareArgs[pkgName]);\n    res[pkgName] = res[pkgName] || [];\n    arrayShareArgs.forEach((shareConfig) => {\n      res[pkgName].push(\n        formatShare(shareConfig, from, pkgName, newOptions.shareStrategy),\n      );\n    });\n    return res;\n  }, {} as ShareInfos);\n\n  const allShareInfos = {\n    ...prevOptions.shared,\n  };\n\n  Object.keys(newShareInfos).forEach((shareKey) => {\n    if (!allShareInfos[shareKey]) {\n      allShareInfos[shareKey] = newShareInfos[shareKey];\n    } else {\n      newShareInfos[shareKey].forEach((newUserSharedOptions) => {\n        const isSameVersion = allShareInfos[shareKey].find(\n          (sharedVal) => sharedVal.version === newUserSharedOptions.version,\n        );\n        if (!isSameVersion) {\n          allShareInfos[shareKey].push(newUserSharedOptions);\n        }\n      });\n    }\n  });\n  return { allShareInfos, newShareInfos };\n}\n\nexport function shouldUseTreeShaking(\n  treeShaking?: TreeShakingArgs,\n  usedExports?: string[],\n) {\n  if (!treeShaking) {\n    return false;\n  }\n  const { status, mode } = treeShaking;\n  if (status === TreeShakingStatus.NO_USE) {\n    return false;\n  }\n\n  if (status === TreeShakingStatus.CALCULATED) {\n    return true;\n  }\n\n  if (mode === 'runtime-infer') {\n    if (!usedExports) {\n      return true;\n    }\n    return isMatchUsedExports(treeShaking, usedExports);\n  }\n\n  return false;\n}\n\n/**\n * compare version a and b, return true if a is less than b\n */\nexport function versionLt(a: string, b: string): boolean {\n  const transformInvalidVersion = (version: string) => {\n    const isNumberVersion = !Number.isNaN(Number(version));\n    if (isNumberVersion) {\n      const splitArr = version.split('.');\n      let validVersion = version;\n      for (let i = 0; i < 3 - splitArr.length; i++) {\n        validVersion += '.0';\n      }\n      return validVersion;\n    }\n    return version;\n  };\n  if (satisfy(transformInvalidVersion(a), `<=${transformInvalidVersion(b)}`)) {\n    return true;\n  } else {\n    return false;\n  }\n}\n\nexport const findVersion = (\n  shareVersionMap: ShareScopeMap[string][string],\n  cb?: (prev: string, cur: string) => boolean,\n): string => {\n  const callback =\n    cb ||\n    function (prev: string, cur: string): boolean {\n      return versionLt(prev, cur);\n    };\n\n  return Object.keys(shareVersionMap).reduce((prev: number | string, cur) => {\n    if (!prev) {\n      return cur;\n    }\n    if (callback(prev as string, cur)) {\n      return cur;\n    }\n\n    // default version is '0' https://github.com/webpack/webpack/blob/main/lib/sharing/ProvideSharedModule.js#L136\n    if (prev === '0') {\n      return cur;\n    }\n\n    return prev;\n  }, 0) as string;\n};\n\nexport const isLoaded = (shared: {\n  loading?: null | Promise<any>;\n  loaded?: boolean;\n  lib?: () => unknown;\n}) => {\n  return Boolean(shared.loaded) || typeof shared.lib === 'function';\n};\n\nconst isLoading = (shared: {\n  loading?: null | Promise<any>;\n  loaded?: boolean;\n  lib?: () => unknown;\n}) => {\n  return Boolean(shared.loading);\n};\n\nconst isMatchUsedExports = (\n  treeShaking?: TreeShakingArgs,\n  usedExports?: string[],\n) => {\n  if (!treeShaking || !usedExports) {\n    return false;\n  }\n\n  const { usedExports: treeShakingUsedExports } = treeShaking;\n\n  if (!treeShakingUsedExports) {\n    return false;\n  }\n\n  if (usedExports.every((e) => treeShakingUsedExports.includes(e))) {\n    return true;\n  }\n\n  return false;\n};\n\nfunction findSingletonVersionOrderByVersion(\n  shareScopeMap: ShareScopeMap,\n  scope: string,\n  pkgName: string,\n  treeShaking?: TreeShakingArgs,\n): {\n  version: string;\n  useTreesShaking: boolean;\n} {\n  const versions = shareScopeMap[scope][pkgName];\n  let version = '';\n  let useTreesShaking = shouldUseTreeShaking(treeShaking);\n  // return false means use prev version\n  const callback = function (prev: string, cur: string): boolean {\n    if (useTreesShaking) {\n      if (!versions[prev].treeShaking) {\n        return true;\n      }\n      if (!versions[cur].treeShaking) {\n        return false;\n      }\n      return !isLoaded(versions[prev].treeShaking) && versionLt(prev, cur);\n    }\n    return !isLoaded(versions[prev]) && versionLt(prev, cur);\n  };\n\n  if (useTreesShaking) {\n    version = findVersion(shareScopeMap[scope][pkgName], callback);\n    if (version) {\n      return {\n        version,\n        useTreesShaking,\n      };\n    }\n    useTreesShaking = false;\n  }\n\n  return {\n    version: findVersion(shareScopeMap[scope][pkgName], callback),\n    useTreesShaking,\n  };\n}\n\nconst isLoadingOrLoaded = (shared: {\n  loading?: null | Promise<any>;\n  loaded?: boolean;\n  lib?: () => unknown;\n}) => {\n  return isLoaded(shared) || isLoading(shared);\n};\n\nfunction findSingletonVersionOrderByLoaded(\n  shareScopeMap: ShareScopeMap,\n  scope: string,\n  pkgName: string,\n  treeShaking?: TreeShakingArgs,\n): {\n  version: string;\n  useTreesShaking: boolean;\n} {\n  const versions = shareScopeMap[scope][pkgName];\n  let version = '';\n  let useTreesShaking = shouldUseTreeShaking(treeShaking);\n\n  // return false means use prev version\n  const callback = function (prev: string, cur: string): boolean {\n    if (useTreesShaking) {\n      if (!versions[prev].treeShaking) {\n        return true;\n      }\n      if (!versions[cur].treeShaking) {\n        return false;\n      }\n      if (isLoadingOrLoaded(versions[cur].treeShaking)) {\n        if (isLoadingOrLoaded(versions[prev].treeShaking)) {\n          return Boolean(versionLt(prev, cur));\n        } else {\n          return true;\n        }\n      }\n      if (isLoadingOrLoaded(versions[prev].treeShaking)) {\n        return false;\n      }\n    }\n\n    if (isLoadingOrLoaded(versions[cur])) {\n      if (isLoadingOrLoaded(versions[prev])) {\n        return Boolean(versionLt(prev, cur));\n      } else {\n        return true;\n      }\n    }\n    if (isLoadingOrLoaded(versions[prev])) {\n      return false;\n    }\n    return versionLt(prev, cur);\n  };\n\n  if (useTreesShaking) {\n    version = findVersion(shareScopeMap[scope][pkgName], callback);\n    if (version) {\n      return {\n        version,\n        useTreesShaking,\n      };\n    }\n    useTreesShaking = false;\n  }\n\n  return {\n    version: findVersion(shareScopeMap[scope][pkgName], callback),\n    useTreesShaking,\n  };\n}\n\nfunction getFindShareFunction(strategy: Shared['strategy']) {\n  if (strategy === 'loaded-first') {\n    return findSingletonVersionOrderByLoaded;\n  }\n  return findSingletonVersionOrderByVersion;\n}\n\nexport function getRegisteredShare(\n  localShareScopeMap: ShareScopeMap,\n  pkgName: string,\n  shareInfo: Shared,\n  resolveShare: SyncWaterfallHook<{\n    shareScopeMap: ShareScopeMap;\n    scope: string;\n    pkgName: string;\n    version: string;\n    shareInfo: Shared;\n    GlobalFederation: Federation;\n    resolver: () => { shared: Shared; useTreesShaking: boolean } | undefined;\n  }>,\n): { shared: Shared; useTreesShaking: boolean } | void {\n  if (!localShareScopeMap) {\n    return;\n  }\n  const {\n    shareConfig,\n    scope = DEFAULT_SCOPE,\n    strategy,\n    treeShaking,\n  } = shareInfo;\n  const scopes = Array.isArray(scope) ? scope : [scope];\n  for (const sc of scopes) {\n    if (\n      shareConfig &&\n      localShareScopeMap[sc] &&\n      localShareScopeMap[sc][pkgName]\n    ) {\n      const { requiredVersion } = shareConfig;\n      const findShareFunction = getFindShareFunction(strategy);\n      const { version: maxOrSingletonVersion, useTreesShaking } =\n        findShareFunction(localShareScopeMap, sc, pkgName, treeShaking);\n\n      const defaultResolver = () => {\n        const shared = localShareScopeMap[sc][pkgName][maxOrSingletonVersion];\n        if (shareConfig.singleton) {\n          if (\n            typeof requiredVersion === 'string' &&\n            !satisfy(maxOrSingletonVersion, requiredVersion)\n          ) {\n            const msg = `Version ${maxOrSingletonVersion} from ${\n              maxOrSingletonVersion && shared.from\n            } of shared singleton module ${pkgName} does not satisfy the requirement of ${\n              shareInfo.from\n            } which needs ${requiredVersion})`;\n\n            if (shareConfig.strictVersion) {\n              error(msg);\n            } else {\n              warn(msg);\n            }\n          }\n          return {\n            shared,\n            useTreesShaking,\n          };\n        } else {\n          if (requiredVersion === false || requiredVersion === '*') {\n            return {\n              shared,\n              useTreesShaking,\n            };\n          }\n          if (satisfy(maxOrSingletonVersion, requiredVersion)) {\n            return {\n              shared,\n              useTreesShaking,\n            };\n          }\n\n          const _usedTreeShaking = shouldUseTreeShaking(treeShaking);\n          if (_usedTreeShaking) {\n            for (const [versionKey, versionValue] of Object.entries(\n              localShareScopeMap[sc][pkgName],\n            )) {\n              if (\n                !shouldUseTreeShaking(\n                  versionValue.treeShaking,\n                  treeShaking?.usedExports,\n                )\n              ) {\n                continue;\n              }\n\n              if (satisfy(versionKey, requiredVersion)) {\n                return {\n                  shared: versionValue,\n                  useTreesShaking: _usedTreeShaking,\n                };\n              }\n            }\n          }\n          for (const [versionKey, versionValue] of Object.entries(\n            localShareScopeMap[sc][pkgName],\n          )) {\n            if (satisfy(versionKey, requiredVersion)) {\n              return {\n                shared: versionValue,\n                useTreesShaking: false,\n              };\n            }\n          }\n        }\n        return;\n      };\n      const params = {\n        shareScopeMap: localShareScopeMap,\n        scope: sc,\n        pkgName,\n        version: maxOrSingletonVersion,\n        GlobalFederation: Global.__FEDERATION__,\n        shareInfo,\n        resolver: defaultResolver,\n      };\n      const resolveShared = resolveShare.emit(params) || params;\n      return resolveShared.resolver();\n    }\n  }\n}\n\nexport function getGlobalShareScope(): GlobalShareScopeMap {\n  return Global.__FEDERATION__.__SHARE__;\n}\n\nexport function getTargetSharedOptions(options: {\n  pkgName: string;\n  extraOptions?: LoadShareExtraOptions;\n  shareInfos: ShareInfos;\n}) {\n  const { pkgName, extraOptions, shareInfos } = options;\n  const defaultResolver = (sharedOptions: ShareInfos[string]) => {\n    if (!sharedOptions) {\n      return undefined;\n    }\n    const shareVersionMap: ShareScopeMap[string][string] = {};\n    sharedOptions.forEach((shared) => {\n      shareVersionMap[shared.version] = shared;\n    });\n    const callback = function (prev: string, cur: string): boolean {\n      return (\n        // TODO: consider multiple treeShaking shared scenes\n        !isLoaded(shareVersionMap[prev]) && versionLt(prev, cur)\n      );\n    };\n\n    const maxVersion = findVersion(shareVersionMap, callback);\n    return shareVersionMap[maxVersion];\n  };\n\n  const resolver = extraOptions?.resolver ?? defaultResolver;\n  const isPlainObject = (val: unknown): val is Record<string, any> => {\n    return val !== null && typeof val === 'object' && !Array.isArray(val);\n  };\n\n  const merge = <T extends Record<string, any>>(\n    ...sources: Array<Partial<T> | undefined>\n  ): T => {\n    const out = {} as T;\n    for (const src of sources) {\n      if (!src) continue;\n      for (const [key, value] of Object.entries(src)) {\n        const prev = (out as any)[key];\n        if (isPlainObject(prev) && isPlainObject(value)) {\n          (out as any)[key] = merge(prev, value);\n        } else if (value !== undefined) {\n          (out as any)[key] = value;\n        }\n      }\n    }\n    return out;\n  };\n\n  return merge(resolver(shareInfos[pkgName]), extraOptions?.customShareInfo);\n}\n\nexport const addUseIn = (\n  shared: { useIn?: Array<string> },\n  from: string,\n): void => {\n  if (!shared.useIn) {\n    shared.useIn = [];\n  }\n  addUniqueItem(shared.useIn, from);\n};\n\nexport function directShare(\n  shared: Shared,\n  useTreesShaking?: boolean,\n): Shared | TreeShakingArgs {\n  if (useTreesShaking && shared.treeShaking) {\n    return shared.treeShaking;\n  }\n\n  return shared;\n}\n"],"mappings":"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"}