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

@@ -1,18 +1,18 @@
{
"generatedAt": "2026-05-18T18:22:54.558Z",
"commit": "c298f39",
"generatedAt": "2026-05-18T18:25:58.074Z",
"commit": "a94e803",
"repo": {
"statements": 96.34,
"branches": 91.4,
"functions": 96.75,
"branches": 91.41,
"functions": 96.76,
"lines": 96.34,
"counts": {
"lf": 4100,
"lh": 3950,
"brf": 767,
"brh": 701,
"fnf": 246,
"fnh": 238
"brf": 768,
"brh": 702,
"fnf": 247,
"fnh": 239
}
},
"byPackage": {
@@ -60,16 +60,16 @@
},
"@repo/core-shared": {
"statements": 97.75,
"branches": 95.52,
"functions": 91.49,
"branches": 95.54,
"functions": 91.58,
"lines": 97.75,
"counts": {
"lf": 935,
"lh": 914,
"brf": 268,
"brh": 256,
"fnf": 94,
"fnh": 86
"brf": 269,
"brh": 257,
"fnf": 95,
"fnh": 87
}
},
"@repo/marketing-pages": {

View File

@@ -16,8 +16,6 @@ export default mergeConfig(nodeVitestConfig, {
"src/trpc/context.ts",
// Sentry client init — browser/node SDK init, tested in apps
"src/instrumentation/sentry/**",
// Pure type-alias file — no executable code
"src/payload/retention-types.ts",
],
},
},

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([