blockers

tcmts.cli.releases.blockers · #np4m5efl · term · runs anywhere

Why a package can't be released as it stands (work left in tcm todo; for a tcm library, code it uses from outside itself), if so.

import { needsFixing } from "#codebase/tcmts/cli/codebase";
import type { Codebase } from "#codebase/tcmts/cli/codebase";
import { owns } from "#codebase/tcmts/cli/manifests";
import type { Pkg } from "#codebase/tcmts/cli/manifests";
import { outsideUses } from "#codebase/tcmts/cli/releases";
import { isConflicted } from "#codebase/tcmts/core/types";
import type { DefKind } from "#codebase/tcmts/core/types";
import type { NameRow } from "#codebase/tcmts/store";

export function blockers(cb: Codebase, pkg: Pkg, all: Pkg[], rows: NameRow[]): string | undefined {
  const kinds = new Map<string, DefKind[]>();
  for (const n of rows)
    if (owns(pkg, all, n.path)) kinds.set(n.path, [...(kinds.get(n.path) ?? []), n.kind]);
  const broken = needsFixing(cb).filter((t) =>
    cb.store.pathsOf(t.hash).some((p) => owns(pkg, all, p)),
  );
  if ([...kinds.values()].some(isConflicted) || broken.length)
    return `${pkg.name} has work left (\`tcm todo\`): release it when that's done, or --force`;
  if (pkg.manifest.npm === false) {
    const outside = outsideUses(cb, pkg, all, rows);
    if (outside.length)
      return `${pkg.name} is a tcm library, and it uses what isn't its own: ${outside.slice(0, 8).join(", ")}${outside.length > 8 ? `, and ${outside.length - 8} more` : ""}. A codebase that adds it would have those unnamed: move them into it, or pass them in`;
  }
  return undefined;
}

uses

used by