{
  "version": 3,
  "sources": ["../../../../src/packages/render-peer-issues/index.ts"],
  "sourcesContent": ["import { PnpmError } from '../error/index.ts';\nimport { createMatcher } from '../matcher/index.ts';\nimport type {\n  BadPeerDependencyIssue,\n  PeerDependencyIssuesByProjects,\n  PeerDependencyRules,\n} from '../types/index.ts';\nimport {\n  parseOverrides,\n  type PackageSelector,\n  type VersionOverride,\n} from '../parse-overrides/index.ts';\nimport archy from 'archy';\nimport chalk from 'chalk';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport cliColumns from 'cli-columns';\nimport semver from 'semver';\n\nexport function renderPeerIssues(\n  peerDependencyIssuesByProjects: PeerDependencyIssuesByProjects,\n  opts?:\n    | {\n        rules?: PeerDependencyRules | undefined;\n        width?: number | undefined;\n      }\n    | undefined\n): string {\n  const ignoreMissingPatterns = [...new Set(opts?.rules?.ignoreMissing ?? [])];\n\n  const ignoreMissingMatcher = createMatcher(ignoreMissingPatterns);\n\n  const allowAnyPatterns = [...new Set(opts?.rules?.allowAny ?? [])];\n\n  const allowAnyMatcher = createMatcher(allowAnyPatterns);\n\n  const { allowedVersionsMatchAll, allowedVersionsByParentPkgName } =\n    parseAllowedVersions(opts?.rules?.allowedVersions ?? {});\n\n  const projects = {} as Record<string, PkgNode>;\n\n  for (const [\n    projectId,\n    { bad, missing, conflicts, intersections },\n  ] of Object.entries(peerDependencyIssuesByProjects)) {\n    projects[projectId] = { dependencies: {}, peerIssues: [] };\n\n    for (const [peerName, issues] of Object.entries(missing)) {\n      if (\n        (!conflicts.includes(peerName) && intersections[peerName] == null) ||\n        ignoreMissingMatcher(peerName)\n      ) {\n        continue;\n      }\n\n      for (const issue of issues) {\n        createTree(\n          projects[projectId],\n          issue.parents,\n          `${chalk.red('\u2715 missing peer')} ${formatNameAndRange(peerName, issue.wantedRange)}`\n        );\n      }\n    }\n\n    for (const [peerName, issues] of Object.entries(bad)) {\n      if (allowAnyMatcher(peerName)) {\n        continue;\n      }\n\n      for (const issue of issues) {\n        if (\n          allowedVersionsMatchAll[peerName]?.some((range) => {\n            return semver.satisfies(issue.foundVersion, range);\n          }) === true\n        ) {\n          continue;\n        }\n\n        const currentParentPkg = issue.parents.at(-1);\n\n        if (\n          currentParentPkg &&\n          allowedVersionsByParentPkgName[peerName]?.[currentParentPkg.name]\n        ) {\n          const allowedVersionsByParent: Record<string, string[]> = {};\n\n          for (const {\n            targetPkg,\n            parentPkg,\n            ranges,\n          } of allowedVersionsByParentPkgName[peerName][\n            currentParentPkg.name\n          ] ?? []) {\n            if (\n              typeof parentPkg.pref === 'undefined' ||\n              (currentParentPkg.version &&\n                (isSubRange(parentPkg.pref, currentParentPkg.version) ||\n                  semver.satisfies(currentParentPkg.version, parentPkg.pref)))\n            ) {\n              allowedVersionsByParent[targetPkg.name] = ranges;\n            }\n          }\n\n          if (\n            allowedVersionsByParent[peerName]?.some((range) =>\n              semver.satisfies(issue.foundVersion, range)\n            ) === true\n          ) {\n            continue;\n          }\n        }\n\n        createTree(\n          projects[projectId],\n          issue.parents,\n          formatUnmetPeerMessage({\n            peerName,\n            ...issue,\n          })\n        );\n      }\n    }\n  }\n\n  const cliColumnsOptions = {\n    newline: '\\n  ',\n    width: (opts?.width ?? process.stdout.columns) - 2,\n  };\n\n  return Object.entries(projects)\n    .filter(([, project]: [string, PkgNode]): boolean => {\n      return Object.keys(project.dependencies).length > 0;\n    })\n    .sort(\n      (\n        [projectKey1]: [string, PkgNode],\n        [projectKey2]: [string, PkgNode]\n      ): number => {\n        return projectKey1.localeCompare(projectKey2);\n      }\n    )\n    .map(([projectKey, project]: [string, PkgNode]): string => {\n      const summaries = [];\n\n      const peerDependencyIssues = peerDependencyIssuesByProjects[projectKey];\n\n      if (typeof peerDependencyIssues === 'undefined') {\n        return '';\n      }\n\n      const { conflicts, intersections } = peerDependencyIssues;\n\n      if (conflicts.length) {\n        summaries.push(\n          chalk.red(\n            `\u2715 Conflicting peer dependencies:\\n  ${cliColumns(conflicts, cliColumnsOptions).trimEnd()}`\n          )\n        );\n      }\n\n      if (Object.keys(intersections).length) {\n        summaries.push(\n          `Peer dependencies that should be installed:\\n  ${cliColumns(\n            Object.entries(intersections).map(([name, version]) =>\n              formatNameAndRange(name, version)\n            ),\n            cliColumnsOptions\n          )}`\n        );\n      }\n\n      const title = chalk.reset(projectKey);\n\n      const summariesConcatenated = summaries.join('\\n');\n\n      return `${archy(toArchyData(title, project))}${summariesConcatenated}`.trimEnd();\n    })\n    .join('\\n\\n');\n}\n\nfunction formatUnmetPeerMessage({\n  foundVersion,\n  peerName,\n  wantedRange,\n  resolvedFrom,\n}: BadPeerDependencyIssue & {\n  peerName: string;\n}): string {\n  const nameAndRange = formatNameAndRange(peerName, wantedRange);\n\n  if (Array.isArray(resolvedFrom) && resolvedFrom.length > 0) {\n    return `\u2715 unmet peer ${nameAndRange}: found ${foundVersion} in ${resolvedFrom[resolvedFrom.length - 1]?.name ?? ''}`;\n  }\n\n  return `${chalk.yellowBright('\u2715 unmet peer')} ${nameAndRange}: found ${foundVersion}`;\n}\n\nfunction formatNameAndRange(name: string, range: string): string {\n  if (range.includes(' ') || range === '*') {\n    return `${name}@\"${range}\"`;\n  }\n\n  return `${name}@${range}`;\n}\n\ntype PkgNode = {\n  peerIssues: string[];\n  dependencies: Record<string, PkgNode>;\n};\n\nfunction createTree(\n  pkgNode: PkgNode,\n  pkgs: Array<{ name: string; version: string }>,\n  issueText: string\n): void {\n  let newPkgs: Array<{ name: string; version: string }> = [];\n\n  if (pkgs.length === 0) {\n    // This will happen if incorrect data is passed to the reporter.\n    // It is better to print something instead of crashing.\n    newPkgs = [{ name: '<unknown>', version: '<unknown>' }];\n  }\n\n  const [pkg, ...rest] = newPkgs;\n\n  if (typeof pkg === 'undefined') {\n    return;\n  }\n\n  const label = `${pkg.name} ${chalk.grey(pkg.version)}`;\n\n  if (!pkgNode.dependencies[label]) {\n    pkgNode.dependencies[label] = { dependencies: {}, peerIssues: [] };\n  }\n\n  if (rest.length === 0) {\n    pkgNode.dependencies[label].peerIssues.push(issueText);\n    return;\n  }\n\n  createTree(pkgNode.dependencies[label], rest, issueText);\n}\n\nfunction toArchyData(depName: string, pkgNode: PkgNode): archy.Data {\n  const result: Required<archy.Data> = {\n    label: depName,\n    nodes: [],\n  };\n\n  for (const wantedPeer of pkgNode.peerIssues) {\n    result.nodes?.push(wantedPeer);\n  }\n\n  for (const [depName, node] of Object.entries(pkgNode.dependencies)) {\n    result.nodes?.push(toArchyData(depName, node));\n  }\n\n  return result;\n}\n\ntype AllowedVersionsByParentPkgName = Record<\n  string,\n  Record<\n    string,\n    Array<\n      Required<Pick<VersionOverride, 'parentPkg' | 'targetPkg'>> & {\n        ranges: string[];\n      }\n    >\n  >\n>;\n\ninterface ParsedAllowedVersions {\n  allowedVersionsMatchAll: Record<string, string[]>;\n  allowedVersionsByParentPkgName: AllowedVersionsByParentPkgName;\n}\n\nfunction parseAllowedVersions(\n  allowedVersions: Record<string, string>\n): ParsedAllowedVersions {\n  const overrides = tryParseAllowedVersions(allowedVersions);\n\n  const allowedVersionsMatchAll: Record<string, string[]> = {};\n\n  const allowedVersionsByParentPkgName: AllowedVersionsByParentPkgName = {};\n\n  for (const override of overrides) {\n    const ranges = parseVersions(override.newPref);\n\n    if (!('parentPkg' in override)) {\n      allowedVersionsMatchAll[override.targetPkg.name] = ranges;\n\n      continue;\n    }\n\n    const allowedPkgs = allowedVersionsByParentPkgName[override.targetPkg.name];\n\n    if (typeof allowedPkgs === 'undefined') {\n      allowedVersionsByParentPkgName[override.targetPkg.name] = {};\n    }\n\n    if (\n      typeof allowedPkgs !== 'undefined' &&\n      typeof allowedPkgs[override.parentPkg.name] === 'undefined'\n    ) {\n      allowedPkgs[override.parentPkg.name] = [];\n    }\n\n    allowedPkgs?.[override.parentPkg.name]?.push({\n      parentPkg: override.parentPkg,\n      targetPkg: override.targetPkg,\n      ranges,\n    });\n  }\n\n  return {\n    allowedVersionsMatchAll,\n    allowedVersionsByParentPkgName,\n  };\n}\n\nfunction tryParseAllowedVersions(\n  allowedVersions: Record<string, string>\n): Array<\n  | {\n      parentPkg: PackageSelector;\n      targetPkg: PackageSelector;\n      selector: string;\n      newPref: string;\n    }\n  | {\n      targetPkg: PackageSelector;\n      selector: string;\n      newPref: string;\n    }\n> {\n  try {\n    return parseOverrides(allowedVersions);\n  } catch (err) {\n    throw new PnpmError(\n      'INVALID_ALLOWED_VERSION_SELECTOR',\n      `${(err as PnpmError).message} in pnpm.peerDependencyRules.allowedVersions`\n    );\n  }\n}\n\nfunction parseVersions(versions: string): string[] {\n  return versions.split('||').map((v) => v.trim());\n}\n\nfunction isSubRange(superRange: string | undefined, subRange: string): boolean {\n  return (\n    typeof superRange === 'undefined' ||\n    subRange === superRange ||\n    (semver.validRange(subRange) != null &&\n      semver.validRange(superRange) != null &&\n      semver.subset(subRange, superRange))\n  );\n}\n"],
  "mappings": "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",
  "names": ["depName"]
}
