{
  "version": 3,
  "sources": ["../../../../src/packages/outdated/outdated.ts"],
  "sourcesContent": ["import {\n  matchCatalogResolveResult,\n  resolveFromCatalog,\n  type CatalogResolutionFound,\n} from '../catalogs.resolver/index.ts';\nimport type { Catalogs } from '../catalogs.types/index.ts';\nimport { LOCKFILE_VERSION, WANTED_LOCKFILE } from '../constants/index.ts';\nimport { PnpmError } from '../error/index.ts';\nimport { getLockfileImporterId } from '../lockfile.fs/index.ts';\nimport { nameVerFromPkgSnapshot } from '../lockfile.utils/index.ts';\nimport { getAllDependenciesFromManifest } from '../manifest-utils/index.ts';\nimport { parsePref } from '../npm-resolver/index.ts';\nimport { pickRegistryForPackage } from '../pick-registry-for-package/index.ts';\nimport {\n  type DependenciesField,\n  DEPENDENCIES_FIELDS,\n  type IncludedDependencies,\n  type PackageManifest,\n  type ProjectManifest,\n  type Registries,\n  type LockFileDir,\n} from '../types/index.ts';\nimport * as dp from '../dependency-path/index.ts';\nimport semver from 'semver';\nimport { createMatcher } from '../matcher/index.ts';\nimport { createReadPackageHook } from '../hooks.read-package-hook/index.ts';\nimport { parseOverrides } from '../parse-overrides/index.ts';\nimport type { WantedDependency } from '../resolve-dependencies/getWantedDependencies.ts';\nimport type { LockfileObject } from '../lockfile.types/index.ts';\n\nexport * from './createManifestGetter.ts';\n\nexport type GetLatestManifestFunction = (\n  packageName: string,\n  rangeOrTag: string\n) => Promise<PackageManifest | null>;\n\nexport type OutdatedPackage = {\n  alias: string;\n  belongsTo: DependenciesField;\n  current?: string | undefined; // not defined means the package is not installed\n  latestManifest?: PackageManifest | undefined;\n  packageName: string;\n  wanted: string;\n  workspace?: string | undefined;\n};\n\nexport async function outdated(opts: {\n  catalogs?: Catalogs | undefined;\n  compatible?: boolean | undefined;\n  currentLockfile: LockfileObject | null;\n  getLatestManifest: GetLatestManifestFunction;\n  ignoreDependencies?: string[] | undefined;\n  include?: IncludedDependencies | undefined;\n  lockfileDir: LockFileDir;\n  manifest: ProjectManifest;\n  match?: ((dependencyName: string) => boolean) | undefined;\n  prefix: string;\n  registries: Registries;\n  wantedLockfile: LockfileObject | null;\n}): Promise<OutdatedPackage[]> {\n  if (packageHasNoDeps(opts.manifest)) {\n    return [];\n  }\n\n  if (opts.wantedLockfile == null) {\n    throw new PnpmError(\n      'OUTDATED_NO_LOCKFILE',\n      `No lockfile in directory \"${opts.lockfileDir}\". Run \\`pnpm install\\` to generate one.`\n    );\n  }\n\n  async function getOverriddenManifest(): Promise<ProjectManifest> {\n    const overrides =\n      opts.currentLockfile?.overrides ?? opts.wantedLockfile?.overrides;\n\n    if (overrides) {\n      const readPackageHook = createReadPackageHook({\n        lockfileDir: opts.lockfileDir,\n        overrides: parseOverrides(overrides, opts.catalogs ?? {}),\n      });\n\n      const manifest = await readPackageHook?.(opts.manifest, opts.lockfileDir);\n\n      if (manifest) {\n        return manifest;\n      }\n    }\n\n    return opts.manifest;\n  }\n\n  const allDeps = getAllDependenciesFromManifest(await getOverriddenManifest());\n\n  const importerId = getLockfileImporterId(opts.lockfileDir, opts.prefix);\n\n  const currentLockfile: LockfileObject = opts.currentLockfile ?? {\n    lockfileVersion: LOCKFILE_VERSION,\n    importers: { [importerId]: { specifiers: {} } },\n  };\n\n  const outdated: OutdatedPackage[] = [];\n\n  const ignoreDependenciesMatcher =\n    typeof opts.ignoreDependencies?.length === 'number' &&\n    opts.ignoreDependencies.length > 0\n      ? createMatcher(opts.ignoreDependencies)\n      : undefined;\n\n  await Promise.all(\n    DEPENDENCIES_FIELDS.map(\n      async (depType: DependenciesField): Promise<void> => {\n        if (\n          opts.include?.[depType] === false ||\n          opts.wantedLockfile?.importers?.[importerId]?.[depType] == null\n        )\n          return;\n\n        let pkgs = Object.keys(\n          opts.wantedLockfile.importers[importerId][depType]\n        );\n\n        if (opts.match != null) {\n          pkgs = pkgs.filter((pkgName): boolean => {\n            return opts.match?.(pkgName) === true;\n          });\n        }\n\n        const _replaceCatalogProtocolIfNecessary =\n          replaceCatalogProtocolIfNecessary.bind(null, opts.catalogs ?? {});\n\n        await Promise.all(\n          pkgs.map(async (alias) => {\n            if (typeof allDeps[alias] === 'undefined') {\n              return;\n            }\n\n            const ref =\n              opts.wantedLockfile?.importers?.[importerId]?.[depType]?.[alias];\n\n            if (\n              typeof ref === 'undefined' ||\n              ref.startsWith('file:') === true || // ignoring linked packages. (For backward compatibility)\n              ignoreDependenciesMatcher?.(alias) === true\n            ) {\n              return;\n            }\n\n            const relativeDepPath = dp.refToRelative(ref, alias);\n\n            // ignoring linked packages\n            if (relativeDepPath === null) return;\n\n            const pkgSnapshot =\n              opts.wantedLockfile?.packages?.[relativeDepPath];\n\n            if (typeof pkgSnapshot === 'undefined') {\n              throw new Error(\n                `Invalid ${WANTED_LOCKFILE} file. ${relativeDepPath} not found in packages field`\n              );\n            }\n\n            const importer = currentLockfile.importers?.[importerId];\n\n            if (typeof importer === 'undefined') {\n              throw new Error(\n                `Invalid ${WANTED_LOCKFILE} file. importer ${importerId} not found in importers field`\n              );\n            }\n\n            const currentRef = importer[depType]?.[alias];\n\n            if (typeof currentRef !== 'undefined') {\n              const currentRelative = dp.refToRelative(currentRef, alias);\n\n              const current =\n                currentRelative !== null\n                  ? (dp.parse(currentRelative).version ?? currentRef)\n                  : currentRef;\n\n              const wanted = dp.parse(relativeDepPath).version ?? ref;\n\n              const { name: packageName } = nameVerFromPkgSnapshot(\n                relativeDepPath,\n                pkgSnapshot\n              );\n\n              const name = dp.parse(relativeDepPath).name ?? packageName;\n\n              const pref = _replaceCatalogProtocolIfNecessary({\n                alias,\n                pref: allDeps[alias],\n              });\n\n              // If the npm resolve parser cannot parse the spec of the dependency,\n              // it means that the package is not from a npm-compatible registry.\n              // In that case, we can't check whether the package is up-to-date\n              if (\n                typeof pref !== 'undefined' &&\n                parsePref(\n                  pref,\n                  alias,\n                  'latest',\n                  pickRegistryForPackage(opts.registries, name)\n                ) == null\n              ) {\n                if (current !== wanted) {\n                  outdated.push({\n                    alias,\n                    belongsTo: depType,\n                    current,\n                    latestManifest: undefined,\n                    packageName,\n                    wanted,\n                    workspace: opts.manifest.name,\n                  });\n                }\n                return;\n              }\n\n              const latestManifest = await opts.getLatestManifest(\n                name,\n                opts.compatible === true\n                  ? typeof pref === 'string'\n                    ? pref\n                    : 'latest'\n                  : 'latest'\n              );\n\n              if (latestManifest == null) {\n                return;\n              }\n\n              if (!current) {\n                outdated.push({\n                  alias,\n                  belongsTo: depType,\n                  latestManifest,\n                  packageName,\n                  wanted,\n                  workspace: opts.manifest.name,\n                });\n\n                return;\n              }\n\n              if (\n                current !== wanted ||\n                semver.lt(current, latestManifest.version) ||\n                typeof latestManifest.deprecated === 'string'\n              ) {\n                outdated.push({\n                  alias,\n                  belongsTo: depType,\n                  current,\n                  latestManifest,\n                  packageName,\n                  wanted,\n                  workspace: opts.manifest.name,\n                });\n              }\n            }\n          })\n        );\n      }\n    )\n  );\n\n  return outdated.sort(\n    (pkg1: OutdatedPackage, pkg2: OutdatedPackage): number => {\n      return pkg1.packageName.localeCompare(pkg2.packageName);\n    }\n  );\n}\n\nfunction packageHasNoDeps(manifest: ProjectManifest): boolean {\n  return (\n    (manifest.dependencies == null || isEmpty(manifest.dependencies)) &&\n    (manifest.devDependencies == null || isEmpty(manifest.devDependencies)) &&\n    (manifest.optionalDependencies == null ||\n      isEmpty(manifest.optionalDependencies))\n  );\n}\n\nfunction isEmpty(obj: object): boolean {\n  return Object.keys(obj).length === 0;\n}\n\nfunction replaceCatalogProtocolIfNecessary(\n  catalogs: Catalogs,\n  wantedDependency: WantedDependency\n): string | undefined {\n  return matchCatalogResolveResult(\n    resolveFromCatalog(catalogs, wantedDependency),\n    {\n      unused: () => wantedDependency.pref,\n      found: (found: CatalogResolutionFound) => found.resolution.specifier,\n      misconfiguration: (misconfiguration) => {\n        throw misconfiguration.error;\n      },\n    }\n  );\n}\n"],
  "mappings": "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",
  "names": ["outdated"]
}
