candidates
uses tcmts.loader.packages.registryView, which uses node:child_process
import { compareVersions, isExactVersion } from "#codebase/tcmts/core/semver"; import { registryView, viewed } from "#codebase/tcmts/loader/packages"; import type { Candidate } from "#codebase/tcmts/loader/packages"; export function candidates(name: string, range: string): Candidate[] { const key = `${name}@${range}`; const hit = viewed.get(key); if (hit) return hit; const r = registryView([key, "version", "peerDependencies", "types", "typings", "--json"]); let out: Candidate[] = []; if (r.status === 0 && r.stdout.trim()) { const parsed = JSON.parse(r.stdout) as unknown; const list = (Array.isArray(parsed) ? parsed : [parsed]) as ( | { version?: string; peerDependencies?: Record<string, string>; types?: string; typings?: string; } | string )[]; out = list .map((x) => typeof x === "string" ? { version: x, peers: {} } : { version: x.version ?? "", peers: x.peerDependencies ?? {}, typed: !!(x.types || x.typings), }, ) .filter((c) => c.version && (isExactVersion(range) || !c.version.includes("-"))) .sort((a, b) => compareVersions(b.version, a.version)); } // (a registry that didn't answer is asked again next time) if (r.status === 0) viewed.set(key, out); return out; }
uses
- tcmts.core.semver.compareVersions
- tcmts.core.semver.isExactVersion
- tcmts.loader.packages.Candidate
- tcmts.loader.packages.registryView
- tcmts.loader.packages.viewed