fix(coverage): exempt .d.ts files from diff coverage gate

Ambient declaration files have no runtime code so v8 coverage
never generates DA records for them. Without an allowlist entry,
coverage:diff reports no-coverage-data for every .d.ts in the
diff. Add /\.d\.ts$/ to ALLOWED_GLOBS with a companion test.

Also configure @vitest/coverage-v8 for core-shared and add
targeted vitest exclusions for infrastructure files that are not
unit-testable (DI symbols, interface files, tRPC context, Sentry
SDK init) — bringing core-shared into the L2 aggregate and making
the L1 diff gate enforce coverage on new executable code.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-18 18:26:50 +00:00
parent a94e8032b5
commit 0d4be0a4f4
4 changed files with 32 additions and 16 deletions

View File

@@ -62,6 +62,7 @@ const ALLOWED_GLOBS = [
/\/integrations\/cms\//,
/\/ui\//,
// Pure type-alias / interface files (no executable code)
/\.d\.ts$/, // ambient declaration files — no runtime code by definition
/\.interface\.ts$/,
/\/index\.ts$/, // barrel re-exports — no executable code
// Build artifacts

View File

@@ -154,6 +154,23 @@ describe("computeDiffCoverage", () => {
assert.equal(result.summary.filesChanged, 4);
});
test("skips TypeScript ambient declaration files (.d.ts)", () => {
const lcov = parseLcov(lcovText);
const diff = new Map([
// Ambient declaration files have no runtime code — v8 coverage never
// sees them, so they must be exempted from the no-coverage-data gate.
[
"packages/core-shared/src/payload/payload-custom-ambient.d.ts",
new Set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
],
["packages/foo/src/bar/some-types.d.ts", new Set([1, 2])],
]);
const result = computeDiffCoverage(diff, lcov);
assert.equal(result.status, "pass");
assert.equal(result.summary.filesGated, 0);
assert.equal(result.summary.filesChanged, 2);
});
test("skips .env template files (.env, .env.example, .env.local)", () => {
const lcov = parseLcov(lcovText);
const diff = new Map([