{
  "version": 3,
  "sources": ["../../../../../src/packages/plugin-commands-installation/update/getUpdateChoices.ts"],
  "sourcesContent": ["import colorizeSemverDiff from '@pnpm/colorize-semver-diff';\nimport type { OutdatedPackage } from '../../outdated/outdated.ts';\nimport semverDiff from '@pnpm/semver-diff';\nimport { getBorderCharacters, table } from '@zkochan/table';\nimport { pipe, groupBy, pluck, uniqBy, pickBy, and } from 'ramda';\nimport isEmpty from 'ramda/src/isEmpty';\n\nexport type ChoiceRow = {\n  name: string;\n  value: string;\n  disabled?: boolean | undefined;\n};\n\ntype ChoiceGroup = Array<{\n  name: string;\n  message: string;\n  choices: ChoiceRow[];\n  disabled?: boolean | undefined;\n}>;\n\nexport function getUpdateChoices(\n  outdatedPkgsOfProjects: OutdatedPackage[],\n  workspacesEnabled: boolean\n): ChoiceGroup {\n  if (isEmpty.default(outdatedPkgsOfProjects)) {\n    return [];\n  }\n\n  function pkgUniqueKey(outdatedPkg: OutdatedPackage): string {\n    return JSON.stringify([\n      outdatedPkg.packageName,\n      outdatedPkg.latestManifest?.version,\n      outdatedPkg.current,\n    ]);\n  }\n\n  const dedupeAndGroupPkgs = pipe(\n    uniqBy((outdatedPkg: OutdatedPackage): string => {\n      return pkgUniqueKey(outdatedPkg);\n    }),\n    groupBy((outdatedPkg: OutdatedPackage): string => {\n      return outdatedPkg.belongsTo;\n    })\n  );\n\n  const groupPkgsByType = dedupeAndGroupPkgs(outdatedPkgsOfProjects);\n\n  const headerRow = {\n    Package: true,\n    Current: true,\n    ' ': true,\n    Target: true,\n    Workspace: workspacesEnabled,\n    URL: true,\n  };\n\n  // returns only the keys that are true\n  const header: string[] = Object.keys(pickBy(and, headerRow));\n\n  const finalChoices: ChoiceGroup = [];\n\n  for (const [depGroup, choiceRows] of Object.entries(groupPkgsByType)) {\n    if (typeof choiceRows === 'undefined' || choiceRows.length === 0) {\n      continue;\n    }\n\n    const rawChoices = choiceRows.map(\n      (\n        choice: OutdatedPackage\n      ): { raw: string[]; name: string; disabled?: boolean | undefined } => {\n        return buildPkgChoice(choice, workspacesEnabled);\n      }\n    );\n\n    // add in a header row for each group\n    rawChoices.unshift({\n      raw: header,\n      name: '',\n      disabled: true,\n    });\n\n    const renderedTable = alignColumns(pluck('raw', rawChoices)).filter(\n      Boolean\n    );\n\n    const choices = rawChoices.map(\n      (\n        outdatedPkg,\n        i\n      ):\n        | {\n            name: string;\n            value: string;\n            disabled: boolean;\n            hint: string;\n            message?: never;\n          }\n        | {\n            name: string;\n            message: string | undefined;\n            value: string;\n            disabled?: never;\n            hint?: never;\n          } => {\n        if (i === 0) {\n          return {\n            name: renderedTable[i] ?? '',\n            value: '',\n            disabled: true,\n            hint: '',\n          };\n        }\n\n        return {\n          name: outdatedPkg.name,\n          message: renderedTable[i],\n          value: outdatedPkg.name,\n        };\n      }\n    );\n\n    // To filter out selected \"dependencies\" or \"devDependencies\" in the final output,\n    // we rename it here to \"[dependencies]\" or \"[devDependencies]\",\n    // which will be filtered out in the format function of the prompt.\n    finalChoices.push({ name: `[${depGroup}]`, choices, message: depGroup });\n  }\n  return finalChoices;\n}\n\nfunction buildPkgChoice(\n  outdatedPkg: OutdatedPackage,\n  workspacesEnabled: boolean\n): { raw: string[]; name: string; disabled?: boolean } {\n  const sdiff = semverDiff.default(\n    outdatedPkg.wanted,\n    outdatedPkg.latestManifest?.version ?? ''\n  );\n\n  const nextVersion =\n    sdiff.change === null\n      ? outdatedPkg.latestManifest?.version\n      : colorizeSemverDiff.default(\n          sdiff as {\n            change: semverDiff.SEMVER_CHANGE;\n            diff: [string[], string[]];\n          }\n        );\n\n  const label = outdatedPkg.packageName;\n\n  const lineParts: {\n    label: string;\n    current?: string | undefined;\n    arrow: string;\n    nextVersion: string;\n    workspace?: string | undefined;\n    url: string;\n  } = {\n    label,\n    current: outdatedPkg.current,\n    arrow: '\u276F',\n    nextVersion,\n    workspace: outdatedPkg.workspace,\n    url: getPkgUrl(outdatedPkg),\n  };\n\n  if (workspacesEnabled !== true) {\n    // biome-ignore lint/performance/noDelete: <explanation>\n    delete lineParts.workspace;\n  }\n\n  return {\n    raw: Object.values(lineParts).filter(Boolean),\n    name: outdatedPkg.packageName,\n  };\n}\n\nfunction getPkgUrl(pkg: OutdatedPackage): string {\n  if (typeof pkg.latestManifest?.homepage === 'string') {\n    return pkg.latestManifest.homepage;\n  }\n\n  if (typeof pkg.latestManifest?.repository !== 'string') {\n    if (typeof pkg.latestManifest?.repository?.url === 'string') {\n      return pkg.latestManifest.repository.url;\n    }\n  }\n\n  return '';\n}\n\nfunction alignColumns(rows: string[][]): string[] {\n  return table(rows, {\n    border: getBorderCharacters('void'),\n    columnDefault: {\n      paddingLeft: 0,\n      paddingRight: 1,\n      wrapWord: true,\n    },\n    columns: {\n      0: { width: 50, truncate: 100 },\n      1: { width: 15, alignment: 'right' },\n      3: { width: 15 },\n      4: { paddingLeft: 2 },\n      5: { paddingLeft: 2 },\n    },\n    drawHorizontalLine: () => false,\n  }).split('\\n');\n}\n"],
  "mappings": "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",
  "names": []
}
