candidates

tcmts.loader.packages.candidates · #rizfyk5x · term · runs on the server

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

used by