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>
54 lines
2 KiB
TypeScript
54 lines
2 KiB
TypeScript
import path from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
import { defineConfig } from "vitest/config";
|
|
import {
|
|
NO_RETRY_SETUP,
|
|
TIMEOUTS,
|
|
vitestSharedPaths,
|
|
} from "../../vitest.shared.mts";
|
|
|
|
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
const { projectResolve } = vitestSharedPaths(dirname);
|
|
|
|
export default defineConfig({
|
|
resolve: projectResolve,
|
|
test: {
|
|
globals: false,
|
|
environment: "node",
|
|
include: ["__tests__/**/*.test.{ts,tsx}"],
|
|
setupFiles: ["./__tests__/setup.ts", NO_RETRY_SETUP],
|
|
// Shared budgets (#2323). Ink renders through React, so every assertion
|
|
// here waits on a React commit under v8 instrumentation — the shape behind
|
|
// the poll-budget raises in #1742 and #1942.
|
|
...TIMEOUTS,
|
|
coverage: {
|
|
provider: "v8",
|
|
reporter: ["text", "html", "json-summary"],
|
|
// The entire React surface — App.tsx, every Ink component, and the
|
|
// useSelectableList hook — is under the gate via ink-testing-library
|
|
// renderer tests (#1501): components mount through the ink-scroll-view /
|
|
// ink-form passthrough doubles in __tests__/helpers/, App.tsx mounts
|
|
// against a controllable mock of the @inspector/core surface, and
|
|
// keypresses are driven through stdin. No React-surface exclusions
|
|
// remain; all new logic under src/ is automatically held to the gate.
|
|
include: ["src/**/*.{ts,tsx}"],
|
|
exclude: [
|
|
// Pure re-export + type alias of core's server resolver (no runtime
|
|
// statements of its own — the logic is measured in core via the web
|
|
// suite). tui-servers.test.ts still exercises it behaviorally; it's
|
|
// excluded here only so it doesn't surface as a misleading 0/0 row.
|
|
"src/tui-servers.ts",
|
|
"**/*.test.ts",
|
|
"**/*.test.tsx",
|
|
"**/*.d.ts",
|
|
],
|
|
thresholds: {
|
|
perFile: true,
|
|
lines: 90,
|
|
statements: 90,
|
|
functions: 90,
|
|
branches: 90,
|
|
},
|
|
},
|
|
},
|
|
});
|