Adds the three high-ROI tools the planning conversation identified:
vitest 4.x — fast TS-native unit test runner. Runs against pure
functions (calculators, validators, prompt builders). Playwright
stays for e2e. package.json `npm test` now runs Vitest;
`npm run test:node` preserves the old `node --test` runner
for the 3 legacy tests under test/.
zod 4.x — runtime request-body validation at API boundaries. The
new shared/schemas.ts exports a schema per endpoint request
(LoginRequestSchema, SoapRequestSchema, PeNarrativeRequestSchema,
ExtensionCreateSchema, etc.). Routes will adopt these one at a
time post-migration — usage pattern:
const body = SoapRequestSchema.parse(req.body);
Invalid input becomes a structured 400 instead of a silent
undefined-access crash.
knip 6.x — dead-code / unused-export detector. knip.json scopes
it to the backend (client/ excluded since it lives in its own
workspace). Run with `npm run lint:dead`. Catches the class of
bug that kept public/js/adminMilestones.js dead-loaded for a
year — a future orphaned file would fail the lint.
@vitest/coverage-v8 — coverage reporter backed by v8 profiler.
Shipped schemas.test.ts with 8 example cases to prove the toolchain
(`npx vitest run` green).
Not done on day 5 (punted to post-migration): flipping tsconfig to
`strict: true`. That cascade would light up hundreds of implicit-
any errors in handler signatures that would cost more commit bandwidth
than available in this pass. The Day 4 permissive mode is already
catching the big wins (wrong response shapes, orphan refs, undefined
destructures). Post-migration, Codex/vendor model can flip strict flags
one at a time and fix handler-by-handler.
20 lines
703 B
TypeScript
20 lines
703 B
TypeScript
import { defineConfig } from 'vitest/config';
|
|
|
|
// Unit-test runner. Playwright stays for e2e (runs via scripts/e2e.sh).
|
|
// Vitest is for pure functions — calculator formulas (Fenton LMS, AAP
|
|
// bilirubin, Rosner BP), validators, prompt builders. Any module that
|
|
// doesn't need a running Express + Postgres.
|
|
export default defineConfig({
|
|
test: {
|
|
include: ['src/**/*.test.ts', 'shared/**/*.test.ts'],
|
|
exclude: ['node_modules', 'dist', 'e2e', 'client', 'public'],
|
|
environment: 'node',
|
|
globals: false,
|
|
coverage: {
|
|
provider: 'v8',
|
|
reporter: ['text', 'html'],
|
|
include: ['src/**/*.ts', 'shared/**/*.ts'],
|
|
exclude: ['**/*.test.ts', '**/*.d.ts'],
|
|
},
|
|
},
|
|
});
|