{
  "version": 3,
  "sources": ["../../../../src/packages/plugin-commands-licenses/outputRenderer.ts"],
  "sourcesContent": ["import { TABLE_OPTIONS } from '../cli-utils/index.ts';\nimport type { LicensePackage } from '../license-scanner/index.ts';\nimport chalk from 'chalk';\nimport { table } from '@zkochan/table';\nimport { groupBy, sortWith, omit, pick } from 'ramda';\nimport semver from 'semver';\nimport type { LicensesCommandResult } from './LicensesCommandResult.ts';\n\nfunction sortLicensesPackages(\n  licensePackages: readonly LicensePackage[]\n): LicensePackage[] {\n  return sortWith(\n    [\n      (o1: LicensePackage, o2: LicensePackage) =>\n        o1.license.localeCompare(o2.license),\n    ],\n    licensePackages\n  );\n}\n\nfunction renderPackageName({\n  belongsTo,\n  name: packageName,\n}: LicensePackage): string {\n  switch (belongsTo) {\n    case 'devDependencies':\n      return `${packageName} ${chalk.dim('(dev)')}`;\n    case 'optionalDependencies':\n      return `${packageName} ${chalk.dim('(optional)')}`;\n    default:\n      return packageName as string;\n  }\n}\n\nfunction renderPackageLicense({ license }: LicensePackage): string {\n  const output = license || 'Unknown';\n  return output as string;\n}\n\nfunction renderDetails(licensePackage: LicensePackage): string {\n  const outputs = [];\n\n  if (typeof licensePackage.author !== 'undefined') {\n    outputs.push(licensePackage.author);\n  }\n  if (typeof licensePackage.description !== 'undefined') {\n    outputs.push(licensePackage.description);\n  }\n  if (typeof licensePackage.homepage !== 'undefined') {\n    outputs.push(licensePackage.homepage);\n  }\n  return outputs.join('\\n');\n}\n\nexport function renderLicenses(\n  licensesMap: LicensePackage[],\n  opts: { long?: boolean | undefined; json?: boolean | undefined }\n): LicensesCommandResult {\n  if (opts.json === true) {\n    return { output: renderLicensesJson(licensesMap), exitCode: 0 };\n  }\n\n  return { output: renderLicensesTable(licensesMap, opts), exitCode: 0 };\n}\n\nfunction renderLicensesJson(\n  licensePackages: readonly LicensePackage[]\n): string {\n  const data = licensePackages.map(\n    (\n      item: LicensePackage\n    ): Pick<\n      LicensePackage,\n      | 'author'\n      | 'description'\n      | 'homepage'\n      | 'name'\n      | 'version'\n      | 'path'\n      | 'license'\n    > => {\n      return pick(\n        [\n          'name',\n          'version',\n          'path',\n          'license',\n          'author',\n          'homepage',\n          'description',\n        ],\n        item\n      );\n    }\n  );\n\n  const output: Record<string, LicensePackageJson[]> = {};\n\n  const groupedByLicense = groupBy((item) => item.license, data);\n\n  for (const license in groupedByLicense) {\n    const outputList: LicensePackageJson[] = [];\n\n    const groupedByName = groupBy(\n      (\n        item: Pick<\n          LicensePackage,\n          | 'author'\n          | 'description'\n          | 'homepage'\n          | 'name'\n          | 'version'\n          | 'path'\n          | 'license'\n        >\n      ): string => {\n        return item.name;\n      },\n      groupedByLicense[license] ?? []\n    );\n\n    for (const inputList of Object.values(groupedByName)) {\n      if (inputList == null) continue;\n\n      inputList.sort((a, b) => semver.compare(a.version, b.version));\n\n      const versions = inputList.map((item) => item.version);\n\n      const paths = inputList.map((item) => item.path ?? null);\n\n      const lastInputItem = inputList.at(-1); // last item is chosen for its latest information\n\n      if (typeof lastInputItem !== 'undefined') {\n        const outputItem: LicensePackageJson = {\n          name: lastInputItem.name,\n          versions,\n          paths,\n          ...omit(['name', 'version', 'path'], lastInputItem),\n        };\n\n        outputList.push(outputItem);\n      }\n    }\n\n    output[license] = outputList;\n  }\n\n  return JSON.stringify(output, null, 2);\n}\n\nexport type LicensePackageJson = {\n  name: string;\n  versions: string[];\n  license: string;\n  author?: string | undefined;\n  homepage?: string | undefined;\n  paths: Array<string | null>;\n};\n\nfunction renderLicensesTable(\n  licensePackages: readonly LicensePackage[],\n  opts: { long?: boolean | undefined }\n): string {\n  const columnNames = ['Package', 'License'];\n\n  const columnFns = [renderPackageName, renderPackageLicense];\n\n  if (opts.long === true) {\n    columnNames.push('Details');\n    columnFns.push(renderDetails);\n  }\n\n  // Avoid the overhead of allocating a new array caused by calling `array.map()`\n  for (let i = 0; i < columnNames.length; i++) {\n    columnNames[i] = chalk.blueBright(columnNames[i]);\n  }\n\n  const data = [\n    columnNames,\n    ...deduplicateLicensesPackages(sortLicensesPackages(licensePackages)).map(\n      (licensePkg: LicensePackage): string[] => {\n        return columnFns.map(\n          (fn: ({ belongsTo, name }: LicensePackage) => string): string => {\n            return fn(licensePkg);\n          }\n        );\n      }\n    ),\n  ];\n\n  let detailsColumnMaxWidth = 40;\n  let packageColumnMaxWidth = 0;\n  let licenseColumnMaxWidth = 0;\n\n  if (opts.long === true) {\n    // Use the package link to determine the width of the details column\n    detailsColumnMaxWidth = licensePackages.reduce(\n      (max: number, pkg: LicensePackage): number => {\n        return Math.max(max, pkg.homepage?.length ?? 0);\n      },\n      0\n    );\n\n    for (let i = 1; i < data.length; i++) {\n      const row = data[i];\n\n      if (typeof row === 'undefined') {\n        continue;\n      }\n\n      const detailsLineCount = row[2]?.split('\\n').length;\n\n      if (typeof detailsLineCount === 'undefined') {\n        continue;\n      }\n\n      const linesNumber = Math.max(0, detailsLineCount - 1);\n\n      row[0] += '\\n '.repeat(linesNumber); // Add extra spaces to the package column\n\n      row[1] += '\\n '.repeat(linesNumber); // Add extra spaces to the license column\n\n      packageColumnMaxWidth = Math.max(\n        packageColumnMaxWidth,\n        row[0]?.length ?? 0\n      );\n\n      licenseColumnMaxWidth = Math.max(\n        licenseColumnMaxWidth,\n        row[1]?.length ?? 0\n      );\n    }\n\n    const remainColumnWidth =\n      process.stdout.columns -\n      packageColumnMaxWidth -\n      licenseColumnMaxWidth -\n      20;\n\n    if (detailsColumnMaxWidth > remainColumnWidth) {\n      detailsColumnMaxWidth = remainColumnWidth;\n    }\n\n    detailsColumnMaxWidth = Math.max(detailsColumnMaxWidth, 40);\n  }\n\n  try {\n    return table(data, {\n      ...TABLE_OPTIONS,\n      columns: {\n        ...TABLE_OPTIONS.columns,\n        2: {\n          width: detailsColumnMaxWidth,\n          wrapWord: true,\n        },\n      },\n    });\n  } catch {\n    // Fallback to the default table if the details column width is too large, avoiding the error\n    return table(data, TABLE_OPTIONS);\n  }\n}\n\nfunction deduplicateLicensesPackages(\n  licensePackages: LicensePackage[]\n): LicensePackage[] {\n  const result: LicensePackage[] = [];\n\n  function rowEqual(a: LicensePackage, b: LicensePackage): boolean {\n    return a.name === b.name && a.license === b.license;\n  }\n\n  function hasRow(row: LicensePackage): boolean {\n    return result.some((x) => rowEqual(row, x));\n  }\n\n  for (const row of licensePackages.reverse()) {\n    // reverse + unshift to prioritize latest package description\n    if (!hasRow(row)) result.unshift(row);\n  }\n\n  return result;\n}\n"],
  "mappings": "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",
  "names": []
}
