{
  "version": 3,
  "sources": ["../../../../src/packages/list/renderTree.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport type { PackageNode } from '../reviewing.dependencies-hierarchy/index.ts';\nimport { DEPENDENCIES_FIELDS, type DependenciesField } from '../types/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 sortBy from 'ramda/src/sortBy';\nimport ramdaPath from 'ramda/src/path';\nimport type { Ord } from 'ramda';\nimport { getPkgInfo } from './getPkgInfo.ts';\nimport type { PackageDependencyHierarchy } from './types.ts';\n\nconst sortPackages = sortBy.default(\n  ramdaPath.default(['name']) as (pkg: PackageNode) => Ord\n);\n\nconst DEV_DEP_ONLY_CLR = chalk.yellow;\n\nconst PROD_DEP_CLR = (s: string): string => s; // just use the default color\n\nconst OPTIONAL_DEP_CLR = chalk.blue;\n\nconst NOT_SAVED_DEP_CLR = chalk.red;\n\nconst LEGEND = `Legend: ${PROD_DEP_CLR('production dependency')}, ${OPTIONAL_DEP_CLR('optional only')}, ${DEV_DEP_ONLY_CLR('dev only')}\\n\\n`;\n\nexport type RenderTreeOptions = {\n  alwaysPrintRootPackage?: boolean | undefined;\n  depth?: number | undefined;\n  long?: boolean | undefined;\n  search: boolean;\n  showExtraneous: boolean;\n};\n\nexport async function renderTree(\n  packages: PackageDependencyHierarchy[],\n  opts: RenderTreeOptions\n): Promise<string> {\n  const output = (\n    await Promise.all(\n      packages.map(async (pkg) => renderTreeForPackage(pkg, opts))\n    )\n  )\n    .filter(Boolean)\n    .join('\\n\\n');\n  return `${typeof opts.depth === 'number' && opts.depth > -1 && output ? LEGEND : ''}${output}`;\n}\n\nasync function renderTreeForPackage(\n  pkg: PackageDependencyHierarchy,\n  opts: RenderTreeOptions\n): Promise<string> {\n  if (\n    opts.alwaysPrintRootPackage !== true &&\n    typeof pkg.dependencies?.length === 'undefined' &&\n    typeof pkg.devDependencies?.length === 'undefined' &&\n    typeof pkg.optionalDependencies?.length === 'undefined' &&\n    (!opts.showExtraneous ||\n      typeof pkg.unsavedDependencies?.length === 'undefined')\n  ) {\n    return '';\n  }\n\n  let label = '';\n\n  if (typeof pkg.name === 'string') {\n    label += pkg.name;\n\n    if (typeof pkg.version === 'string') {\n      label += `@${pkg.version}`;\n    }\n\n    label += ' ';\n  }\n\n  label += pkg.path;\n\n  if (pkg.private === true) {\n    label += ' (PRIVATE)';\n  }\n\n  const useColumns = opts.depth === 0 && opts.long !== true && !opts.search;\n\n  const dependenciesFields: Array<DependenciesField | 'unsavedDependencies'> = [\n    ...DEPENDENCIES_FIELDS.sort(),\n  ];\n\n  if (opts.showExtraneous) {\n    dependenciesFields.push('unsavedDependencies');\n  }\n\n  const output = (\n    await Promise.all(\n      dependenciesFields.map(async (dependenciesField) => {\n        if (typeof pkg[dependenciesField]?.length !== 'undefined') {\n          const depsLabel = chalk.cyanBright(\n            dependenciesField === 'unsavedDependencies'\n              ? 'not saved (you should add these dependencies to package.json if you need them):'\n              : `${dependenciesField}:`\n          );\n\n          let output = `${depsLabel}\\n`;\n\n          const gPkgColor =\n            dependenciesField === 'unsavedDependencies'\n              ? () => NOT_SAVED_DEP_CLR\n              : getPkgColor;\n\n          if (useColumns && pkg[dependenciesField].length > 10) {\n            output += `${cliColumns(\n              pkg[dependenciesField].map(printLabel.bind(printLabel, gPkgColor))\n            )}\\n`;\n\n            return output;\n          }\n\n          const data = await toArchyTree(gPkgColor, pkg[dependenciesField], {\n            long: opts.long,\n            modules: path.join(pkg.path, 'node_modules'),\n          });\n\n          for (const d of data) {\n            output += archy(d);\n          }\n\n          return output;\n        }\n\n        return null;\n      })\n    )\n  )\n    .filter(Boolean)\n    .join('\\n');\n\n  return `${chalk.bold.underline(label)}\\n\\n${output}`.replace(/(\\n)+$/, '');\n}\n\ntype GetPkgColor = (node: PackageNode) => (s: string) => string;\n\nexport async function toArchyTree(\n  getPkgColor: GetPkgColor,\n  entryNodes: PackageNode[],\n  opts: {\n    long?: boolean | undefined;\n    modules: string;\n  }\n): Promise<archy.Data[]> {\n  return Promise.all(\n    sortPackages(entryNodes).map(async (node) => {\n      const nodes = await toArchyTree(\n        getPkgColor,\n        node.dependencies ?? [],\n        opts\n      );\n\n      if (opts.long === true) {\n        const pkg = await getPkgInfo(node);\n\n        const labelLines = [printLabel(getPkgColor, node), pkg.description];\n\n        if (typeof pkg.repository === 'string') {\n          labelLines.push(pkg.repository);\n        }\n\n        if (typeof pkg.homepage === 'string') {\n          labelLines.push(pkg.homepage);\n        }\n\n        if (typeof pkg.path === 'string') {\n          labelLines.push(pkg.path);\n        }\n\n        return {\n          label: labelLines.join('\\n'),\n          nodes,\n        };\n      }\n\n      return {\n        label: printLabel(getPkgColor, node),\n        nodes,\n      };\n    })\n  );\n}\n\nfunction printLabel(getPkgColor: GetPkgColor, node: PackageNode): string {\n  const color = getPkgColor(node);\n\n  let txt = `${color(node.name)} ${chalk.gray(node.version)}`;\n\n  if (node.isPeer) {\n    txt += ' peer';\n  }\n\n  if (node.isSkipped) {\n    txt += ' skipped';\n  }\n\n  return node.searched ? chalk.bold(txt) : txt;\n}\n\nfunction getPkgColor(node: PackageNode): (text: string) => string {\n  if (node.dev === true) {\n    return DEV_DEP_ONLY_CLR;\n  }\n\n  if (node.optional) {\n    return OPTIONAL_DEP_CLR;\n  }\n\n  return PROD_DEP_CLR;\n}\n"],
  "mappings": "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",
  "names": ["output", "getPkgColor"]
}
