{
  "version": 3,
  "sources": ["../../../../src/packages/workspace.pkgs-graph/index.ts"],
  "sourcesContent": ["import path from 'node:path';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport npa from '@pnpm/npm-package-arg';\nimport { resolveWorkspaceRange } from '../resolve-workspace-range/index.ts';\nimport { parsePref, workspacePrefToNpm } from '../npm-resolver/index.ts';\nimport type { ProjectRootDir, BaseManifest } from '../types/index.ts';\nimport mapValues from 'ramda/src/map';\n\nexport type Package = {\n  manifest: BaseManifest;\n  rootDir: ProjectRootDir;\n};\n\nexport type PackageNode<Pkg extends Package> = {\n  package: Pkg;\n  dependencies: ProjectRootDir[];\n};\n\nexport function createPkgGraph<Pkg extends Package>(\n  pkgs: Pkg[],\n  opts?:\n    | {\n        ignoreDevDeps?: boolean | undefined;\n        linkWorkspacePackages?: boolean | undefined;\n      }\n    | undefined\n): {\n  graph: Record<\n    ProjectRootDir,\n    {\n      dependencies: ProjectRootDir[];\n      package: Pkg;\n    }\n  >;\n\n  unmatched: Array<{ pkgName: string; range: string }>;\n} {\n  const pkgMap = createPkgMap<Pkg>(pkgs);\n\n  const pkgMapValues = Object.values(pkgMap);\n\n  let pkgMapByManifestName: Record<string, Pkg[] | undefined> | undefined;\n\n  let pkgMapByDir: Record<string, Pkg | undefined> | undefined;\n\n  const unmatched: Array<{ pkgName: string; range: string }> = [];\n\n  const graph = mapValues.default(\n    (\n      pkg: Pkg\n    ): {\n      dependencies: ProjectRootDir[];\n      package: Pkg;\n    } => {\n      return {\n        dependencies: createNode(pkg),\n        package: pkg,\n      };\n    },\n    pkgMap\n  );\n\n  // as Record<ProjectRootDir, PackageNode<Pkg>>;\n\n  return { graph, unmatched };\n\n  function createNode(pkg: Package): ProjectRootDir[] {\n    const dependencies = {\n      ...pkg.manifest.peerDependencies,\n      ...(opts?.ignoreDevDeps !== true && pkg.manifest.devDependencies),\n      ...pkg.manifest.optionalDependencies,\n      ...pkg.manifest.dependencies,\n    };\n\n    return Object.entries(dependencies)\n      .map(([depName, rawSpec]) => {\n        let spec!: { fetchSpec: string; type: string };\n\n        const isWorkspaceSpec = rawSpec.startsWith('workspace:');\n\n        try {\n          if (isWorkspaceSpec) {\n            const pref = parsePref(\n              workspacePrefToNpm(rawSpec),\n              depName,\n              'latest',\n              ''\n            );\n\n            if (pref == null) {\n              return null;\n            }\n\n            rawSpec = pref.fetchSpec;\n            depName = pref.name;\n          }\n\n          spec = npa.resolve(depName, rawSpec, pkg.rootDir);\n        } catch {\n          return '';\n        }\n\n        if (spec.type === 'directory') {\n          pkgMapByDir ??= getPkgMapByDir<Pkg>(pkgMapValues);\n\n          const resolvedPath = path.resolve(pkg.rootDir, spec.fetchSpec);\n\n          const found = pkgMapByDir[resolvedPath];\n\n          if (found) {\n            return found.rootDir;\n          }\n\n          // Slow path; only needed when there are case mismatches on case-insensitive filesystems.\n          const matchedPkg = pkgMapValues.find(\n            (pkg) => path.relative(pkg.rootDir, spec.fetchSpec) === ''\n          );\n\n          if (matchedPkg == null) {\n            return '';\n          }\n\n          pkgMapByDir[resolvedPath] = matchedPkg;\n\n          return matchedPkg.rootDir;\n        }\n\n        if (spec.type !== 'version' && spec.type !== 'range') return '';\n\n        pkgMapByManifestName ??= getPkgMapByManifestName(pkgMapValues);\n\n        const pkgs = pkgMapByManifestName[depName];\n\n        if (!pkgs || pkgs.length === 0) return '';\n\n        const versions = pkgs\n          .filter(({ manifest }) => manifest.version)\n          .map((pkg) => pkg.manifest.version) as string[];\n\n        // explicitly check if false, backwards-compatibility (can be undefined)\n        const strictWorkspaceMatching =\n          opts?.linkWorkspacePackages === false && !isWorkspaceSpec;\n\n        if (strictWorkspaceMatching) {\n          unmatched.push({ pkgName: depName, range: rawSpec });\n\n          return '';\n        }\n\n        if (isWorkspaceSpec && versions.length === 0) {\n          const matchedPkg = pkgs.find((pkg) => pkg.manifest.name === depName);\n\n          return matchedPkg?.rootDir;\n        }\n\n        if (versions.includes(rawSpec)) {\n          const matchedPkg = pkgs.find((pkg: Package): boolean => {\n            return (\n              pkg.manifest.name === depName && pkg.manifest.version === rawSpec\n            );\n          });\n\n          return matchedPkg?.rootDir;\n        }\n\n        const matched = resolveWorkspaceRange(rawSpec, versions);\n\n        if (matched === null) {\n          unmatched.push({ pkgName: depName, range: rawSpec });\n\n          return '';\n        }\n\n        const matchedPkg = pkgs.find((pkg: Package): boolean => {\n          return (\n            pkg.manifest.name === depName && pkg.manifest.version === matched\n          );\n        });\n\n        return matchedPkg?.rootDir;\n      })\n      .filter(Boolean);\n  }\n}\n\nfunction createPkgMap<Pkg extends Package>(\n  pkgs: Pkg[]\n): Record<ProjectRootDir, Pkg> {\n  const pkgMap: Record<ProjectRootDir, Pkg> = {};\n\n  for (const pkg of pkgs) {\n    pkgMap[pkg.rootDir] = pkg;\n  }\n\n  return pkgMap;\n}\n\nfunction getPkgMapByManifestName<Pkg extends Package>(\n  pkgMapValues: Pkg[]\n): Record<string, Pkg[] | undefined> {\n  const pkgMapByManifestName: Record<string, Pkg[] | undefined> = {};\n\n  for (const pkg of pkgMapValues) {\n    if (pkg.manifest.name) {\n      if (typeof pkgMapByManifestName[pkg.manifest.name] === 'undefined') {\n        pkgMapByManifestName[pkg.manifest.name] = [];\n      }\n\n      pkgMapByManifestName[pkg.manifest.name]?.push(pkg);\n    }\n  }\n\n  return pkgMapByManifestName;\n}\n\nfunction getPkgMapByDir<Pkg extends Package>(\n  pkgMapValues: Pkg[]\n): Record<string, Pkg | undefined> {\n  const pkgMapByDir: Record<string, Pkg | undefined> = {};\n\n  for (const pkg of pkgMapValues) {\n    pkgMapByDir[path.resolve(pkg.rootDir)] = pkg;\n  }\n\n  return pkgMapByDir;\n}\n"],
  "mappings": "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",
  "names": ["matchedPkg", "pkg", "pkgs"]
}
