Round 8 of the review asked for an AST. That was the right diagnosis of the
wrong problem: the question was never which parser to use, it was why a
test-timeout guard was parsing JavaScript at all.
It got there one reasonable step at a time. The guard enforces two rules no
Vitest config can report — a per-test `retry`, and Testing Library's
`asyncUtilTimeout` — so it read them out of source text, and the review found a
new valid spelling it missed in five consecutive rounds: a trailing comment,
nested parens in `it.each([makeCase()])`, a member-access prefix, the shorthand
`{ retry }`, an aliased import, a non-literal title. Each fix was correct and
each made it more parser-shaped, until it carried eight helpers doing quote
tracking and bracket balancing.
Both rules are observable at runtime, exactly:
- `vitest.setup.shared.mts` is loaded by all six projects and reads
`ctx.task.retry` — the value Vitest resolved for the test. That covers
strictly more than the scan did: a per-test option, a `describe` option
inherited by children, a project-level setting, and a `--retry` flag typed at
a command line, which the scan could never see since it only read npm scripts.
- `clients/web/src/test/asyncUtilTimeout.test.ts` asserts
`getConfig().asyncUtilTimeout`, the value this project's own waitFors read.
Neither has a spelling to anticipate, so neither can be outrun by a new one.
Both were observed firing before being trusted.
The guard keeps only what it can answer by asking Vitest: resolved budgets,
project-level retry, config discovery, and that each project still loads the
setup file — the one thing about the runtime assertion a config CAN report.
868 lines to 361, every scanner helper gone, and 33 of 48 unit tests deleted
because they pinned edge cases of a thing that no longer exists.
storybookSetup.ts goes with it. At the library's own value its configure() call
was a no-op, and the assertion is what pins the number.
AGENTS.md gains the general rule: a rule about what the code DOES is asserted at
runtime, not read out of the source — reach for a verify:* guard when the
question is about configuration, which a tool can be asked to resolve.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PsmUAZ6aLUAFqenjJKSSRp
Signed-off-by: cliffhall <cliff@futurescale.com>
41 lines
2.1 KiB
TypeScript
41 lines
2.1 KiB
TypeScript
/**
|
|
* The one assertion every Vitest project in this repo runs before each test.
|
|
*
|
|
* **`retry` must stay unset** (#2323). A retry converts a load-induced red into
|
|
* a silent green on the only pre-push gate this repo has, and would re-open
|
|
* #1596 by hiding a real race behind a second attempt.
|
|
*
|
|
* ⚠️ This is a *runtime* check, and that is the whole point. An earlier
|
|
* revision of #2334 enforced the same rule by scanning source text for
|
|
* `it("…", { retry: 2 })`, and the review found a new valid JavaScript spelling
|
|
* it missed in five consecutive rounds — a trailing comment, nested parens in
|
|
* `it.each([makeCase()])`, a member-access prefix, the shorthand `{ retry }`, an
|
|
* aliased import, a non-literal title. Each fix was correct and each made the
|
|
* scanner more parser-shaped, until it had eight helpers doing quote tracking
|
|
* and bracket balancing. That is a parser, badly, in a linter.
|
|
*
|
|
* `ctx.task.retry` is the value Vitest actually resolved for this test, so it
|
|
* needs no spelling to be anticipated and cannot be outrun by a new one. It also
|
|
* covers strictly more than the scan ever did: a per-test option, a `describe`
|
|
* option inherited by its children, a project-level `retry`, and a `--retry`
|
|
* flag on the command line all arrive here as the same number.
|
|
*
|
|
* The general lesson, worth keeping: when a rule is about what the code *does*,
|
|
* ask the runtime; reading the source is a guess that has to be right about
|
|
* every way the language can express the same thing.
|
|
*/
|
|
|
|
import { beforeEach } from "vitest";
|
|
|
|
beforeEach((ctx) => {
|
|
const { retry } = ctx.task;
|
|
if (typeof retry === "number" && retry > 0) {
|
|
throw new Error(
|
|
`"${ctx.task.name}" declares retry: ${retry}. Retries are not used in ` +
|
|
`this repo (#2323): a retry turns a load-induced red into a silent ` +
|
|
`green on the only pre-push gate there is, which is how a real race ` +
|
|
`ships (#1596). Fix the test — fake timers, an awaited condition — or ` +
|
|
`raise the shared budget in vitest.shared.mts if it is genuinely slow.`,
|
|
);
|
|
}
|
|
});
|