listPackages
uses tcmts.cli.style.dim, which uses node:util
tcm packages: what the codebase runs, and what uses it.
import type { Codebase } from "#codebase/tcmts/cli/codebase"; import { TOOLS } from "#codebase/tcmts/cli/lint"; import { dim } from "#codebase/tcmts/cli/style"; import { usersOf } from "#codebase/tcmts/cli/upgrade"; export function listPackages(cb: Codebase) { const locked = cb.store.lockedPackages(); if (!locked.length) return console.log(dim("no packages yet: import one in a scratch file")); const users = new Map<string, number>(); for (const l of locked) users.set(`${l.name}@${l.range}`, usersOf(cb, l.name, l.range).size); const width = Math.max(...locked.map((l) => l.name.length)); for (const l of locked) { const n = users.get(`${l.name}@${l.range}`) ?? 0; const tool = TOOLS.has(l.name) && (cb.store.getSetting(`tool.${l.name}`) ?? l.range) === l.range; const note = l.name.startsWith("@types/") ? "types" : n ? `${n} definition${n === 1 ? "" : "s"}` : tool ? "tool" : "unused"; console.log(`${l.name.padEnd(width)} ${dim(l.range.padEnd(6))} ${l.version.padEnd(10)} ${dim(note)}`); } }