packageList

tcmts.cli.package_pages.packageList · #lbuuvbfc · term · runs anywhere

Every package the codebase locks, by name, its ranges newest first; @types packages fold into theirs.

import type { Codebase } from "#codebase/tcmts/cli/codebase";
import type { PackageRange } from "#codebase/tcmts/cli/package_pages";
import { usersOf } from "#codebase/tcmts/cli/upgrade";
import { compareVersions } from "#codebase/tcmts/core/semver";

export function packageList(cb: Codebase): { name: string; ranges: PackageRange[] }[] {
  const locked = cb.store.lockedPackages();
  const byName = new Map<string, PackageRange[]>();
  for (const l of locked) {
    if (l.name.startsWith("@types/")) continue;
    const types = locked.find((t) => t.name === `@types/${l.name.replace(/^@/, "").replace("/", "__")}` && t.range === l.range)?.version;
    const r: PackageRange = { range: l.range, version: l.version, users: usersOf(cb, l.name, l.range).size, ...(l.integrity ? { integrity: l.integrity } : {}), ...(types ? { types } : {}) };
    byName.set(l.name, [...(byName.get(l.name) ?? []), r]);
  }
  const pad = (r: string) => (r.split(".").length === 1 ? `${r}.0.0` : r.split(".").length === 2 ? `${r}.0` : r);
  return [...byName].map(([name, ranges]) => ({ name, ranges: ranges.sort((a, b) => compareVersions(pad(b.range), pad(a.range))) }));
}

uses

used by