Files
siftlode/frontend/src/components/ui/tailwindScan.contract.test.ts
T
peter 4aaaaa7860 chore(comments): drop epic, sprint and review-round ids from the code
The code cited its plan instead of saying why: `E28 review J4`, `(R6 S3b)`, `S1 justified…`,
`deep-review round 5`. That plan lives in the private ops repo, so for every reader of this one the
citation was noise, and a sentence whose subject was the plan step ("round 2 showed…") hid its
lesson behind an id. Each one is gone and the "why" kept: a bare citation is deleted, a sentence
carrying a lesson is reworded around it ("a later attempt showed…").

Measured (`scripts/audit_metrics.py`, product code): 652 lines in 270 files carried an epic code by
the definition the next commit holds (507 / 241 by the old, two-digit-only one) -> 0. Across all
code, tests, scripts and configs: ~1100 epic-code lines plus ~320 sprint/round ids.

Behaviour unchanged, checked mechanically: every changed .py file has the same AST once docstrings
are blanked; css/sh/toml/yml/json files are identical once comments are stripped; the only
non-comment changes in TS/JS are test titles, one description string in a contract table, and five
ESLint messages, whose text is all the gates snapshot diff holds. Not touched: Markdown (docs and
the changelog keep their history), Alembic migrations, TV episode notation (`S2 · E5`), DESIGN.md
ids (`C1`, `B4`, `S3h`), tracker ids (`SEC-16`, `DX-17`).

One stale claim fixed on the way: test_hls_reaper's docstring said the player checkpoints "every
10 s whether or not it is playing", which plex/stream.py calls wrong; it now says what the code does.
2026-10-05 00:19:39 +02:00

64 lines
2.8 KiB
TypeScript

import { readFileSync } from "node:fs";
import { describe, expect, it } from "vitest";
import {
type ButtonSize,
type ButtonVariant,
buttonClass,
type IconButtonSize,
type IconButtonVariant,
iconButtonClass,
} from "./buttonStyles";
import { type ChipSize, type ChipVariant, chipClass } from "./chipStyles";
// Tailwind generates CSS only for the class names it FINDS in the source, token by token. A class
// assembled at runtime (`${ACT}hover:text-fg`) is never found whole, so it ships with no rule at all:
// every hover colour of Button, IconButton and Chip was dead that way, found in an audit by
// reading the stylesheet (0 rules for `not-aria-disabled`). So: every class a primitive can emit has
// to stand in its source file whole, between the delimiters the scanner splits on.
const tokens = (file: string) =>
new Set(readFileSync(new URL(file, import.meta.url), "utf8").split(/[\s"'`{}$]+/));
// Records, so a new variant or size that is not listed here fails to compile.
const keys = <K extends string>(r: Record<K, true>) => Object.keys(r) as K[];
const BV = keys<ButtonVariant>({
primary: true, danger: true, warn: true, outline: true, "outline-accent": true,
"outline-danger": true, "outline-warn": true, ghost: true, glass: true, overlay: true,
media: true, "danger-soft": true, link: true, "link-muted": true,
}); // prettier-ignore
const BS = keys<ButtonSize>({ xs: true, sm: true, md: true, lg: true, none: true });
const IV = keys<IconButtonVariant>({
ghost: true, "ghost-accent": true, primary: true, outline: true, "outline-accent": true,
"outline-danger": true, "outline-warn": true, danger: true, "danger-soft": true, glass: true,
media: true, overlay: true,
}); // prettier-ignore
const IS = keys<IconButtonSize>({ sm: true, md: true, lg: true, player: true });
const CV = keys<ChipVariant>({ filter: true, token: true, tag: true, suggest: true, ghost: true });
const CS = keys<ChipSize>({ md: true, sm: true, xs: true });
const missing = (emitted: string[], file: string) => {
const found = tokens(file);
return [...new Set(emitted.flatMap((c) => c.split(/\s+/)).filter(Boolean))].filter(
(c) => !found.has(c),
);
};
describe("every class a primitive emits is visible to the Tailwind scanner", () => {
it("Button and IconButton", () => {
const emitted: string[] = [];
for (const pressed of [undefined, true]) {
for (const variant of BV)
for (const size of BS) emitted.push(buttonClass({ variant, size, pressed, round: true }));
for (const variant of IV)
for (const size of IS) emitted.push(iconButtonClass({ variant, size, pressed }));
}
expect(missing(emitted, "./buttonStyles.ts")).toEqual([]);
});
it("Chip", () => {
const emitted = CV.flatMap((v) => CS.map((s) => chipClass(v, s)));
expect(missing(emitted, "./chipStyles.ts")).toEqual([]);
});
});