@skastr0/pulsar-core 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-facts.d.ts +212 -0
- package/dist/ai-facts.d.ts.map +1 -0
- package/dist/ai-facts.js +109 -0
- package/dist/ai-facts.js.map +1 -0
- package/dist/architectural-tier.d.ts +34 -0
- package/dist/architectural-tier.d.ts.map +1 -0
- package/dist/architectural-tier.js +77 -0
- package/dist/architectural-tier.js.map +1 -0
- package/dist/baseline.d.ts +2 -2
- package/dist/calibration-fingerprint.d.ts.map +1 -1
- package/dist/calibration-fingerprint.js +1 -0
- package/dist/calibration-fingerprint.js.map +1 -1
- package/dist/calibration-model.d.ts +4 -4
- package/dist/calibration-model.d.ts.map +1 -1
- package/dist/calibration-model.js +2 -0
- package/dist/calibration-model.js.map +1 -1
- package/dist/calibration-slot-values.d.ts +51 -1
- package/dist/calibration-slot-values.d.ts.map +1 -1
- package/dist/calibration.d.ts +1 -0
- package/dist/calibration.d.ts.map +1 -1
- package/dist/calibration.js +1 -0
- package/dist/calibration.js.map +1 -1
- package/dist/composite.d.ts +68 -0
- package/dist/composite.d.ts.map +1 -0
- package/dist/composite.js +94 -0
- package/dist/composite.js.map +1 -0
- package/dist/contract-freshness.d.ts +74 -0
- package/dist/contract-freshness.d.ts.map +1 -0
- package/dist/contract-freshness.js +290 -0
- package/dist/contract-freshness.js.map +1 -0
- package/dist/coverage-facts.d.ts +43 -0
- package/dist/coverage-facts.d.ts.map +1 -0
- package/dist/coverage-facts.js +82 -0
- package/dist/coverage-facts.js.map +1 -0
- package/dist/coverage-istanbul.d.ts +3 -0
- package/dist/coverage-istanbul.d.ts.map +1 -0
- package/dist/coverage-istanbul.js +20 -0
- package/dist/coverage-istanbul.js.map +1 -0
- package/dist/coverage-lcov.d.ts +7 -0
- package/dist/coverage-lcov.d.ts.map +1 -0
- package/dist/coverage-lcov.js +91 -0
- package/dist/coverage-lcov.js.map +1 -0
- package/dist/domain-construction.d.ts +139 -0
- package/dist/domain-construction.d.ts.map +1 -0
- package/dist/domain-construction.js +314 -0
- package/dist/domain-construction.js.map +1 -0
- package/dist/glossary.d.ts +5 -5
- package/dist/observer-json.d.ts +1 -0
- package/dist/observer-json.d.ts.map +1 -1
- package/dist/observer-json.js +1 -0
- package/dist/observer-json.js.map +1 -1
- package/dist/presets.d.ts +4 -0
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +27 -1
- package/dist/presets.js.map +1 -1
- package/dist/reference-data-loader.d.ts.map +1 -1
- package/dist/reference-data-loader.js +51 -0
- package/dist/reference-data-loader.js.map +1 -1
- package/dist/reference-data.d.ts +8 -0
- package/dist/reference-data.d.ts.map +1 -1
- package/dist/reference-data.js +4 -0
- package/dist/reference-data.js.map +1 -1
- package/dist/registry.js +1 -3
- package/dist/registry.js.map +1 -1
- package/dist/scoring-engine-contract.d.ts.map +1 -1
- package/dist/scoring-engine-contract.js +29 -7
- package/dist/scoring-engine-contract.js.map +1 -1
- package/dist/scoring-engine-git-paths.d.ts.map +1 -1
- package/dist/scoring-engine-git-paths.js +6 -1
- package/dist/scoring-engine-git-paths.js.map +1 -1
- package/dist/scoring-engine-observer-cache.d.ts.map +1 -1
- package/dist/scoring-engine-observer-cache.js +37 -0
- package/dist/scoring-engine-observer-cache.js.map +1 -1
- package/dist/scoring-engine-runtime.d.ts.map +1 -1
- package/dist/scoring-engine-runtime.js +2 -6
- package/dist/scoring-engine-runtime.js.map +1 -1
- package/dist/scoring-engine-score-execution.d.ts.map +1 -1
- package/dist/scoring-engine-score-execution.js +23 -3
- package/dist/scoring-engine-score-execution.js.map +1 -1
- package/dist/shared-churn-02.d.ts +33 -0
- package/dist/shared-churn-02.d.ts.map +1 -0
- package/dist/shared-churn-02.js +110 -0
- package/dist/shared-churn-02.js.map +1 -0
- package/dist/shared-cochange-01.d.ts +38 -0
- package/dist/shared-cochange-01.d.ts.map +1 -0
- package/dist/shared-cochange-01.js +148 -0
- package/dist/shared-cochange-01.js.map +1 -0
- package/dist/shared-history-commits.d.ts +8 -0
- package/dist/shared-history-commits.d.ts.map +1 -0
- package/dist/shared-history-commits.js +52 -0
- package/dist/shared-history-commits.js.map +1 -0
- package/dist/shared-signals.d.ts +2 -0
- package/dist/shared-signals.d.ts.map +1 -1
- package/dist/shared-signals.js +2 -0
- package/dist/shared-signals.js.map +1 -1
- package/dist/signal-api.d.ts +4 -1
- package/dist/signal-api.d.ts.map +1 -1
- package/dist/signal-api.js +2 -0
- package/dist/signal-api.js.map +1 -1
- package/dist/signal.d.ts +7 -0
- package/dist/signal.d.ts.map +1 -1
- package/dist/time-series-model.d.ts +1 -0
- package/dist/time-series-model.d.ts.map +1 -1
- package/dist/vector-schema.d.ts +36 -16
- package/dist/vector-schema.d.ts.map +1 -1
- package/dist/vector-schema.js +8 -0
- package/dist/vector-schema.js.map +1 -1
- package/package.json +5 -1
- package/presets/ai-slop-defense.json +6 -1
- package/presets/domain-purist.json +6 -1
- package/presets/refactor-friendly.json +6 -1
- package/presets/security-paranoid.json +6 -1
- package/presets/strict-type-safety.json +6 -1
- package/presets/velocity-first.json +6 -1
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
4
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
5
|
+
import { Schema } from "effect";
|
|
6
|
+
export const CONTRACT_FRESHNESS_REFERENCE_DATA_KEY = "contract-freshness";
|
|
7
|
+
export const CANONICAL_CONTRACT_FRESHNESS_RELATIVE_PATH = ".pulsar/contract-freshness.json";
|
|
8
|
+
const ContractFreshnessContract = Schema.Struct({
|
|
9
|
+
id: Schema.String,
|
|
10
|
+
group_id: Schema.optional(Schema.String),
|
|
11
|
+
source_paths: Schema.Array(Schema.String),
|
|
12
|
+
artifact_path: Schema.String,
|
|
13
|
+
source_hashes: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.String })),
|
|
14
|
+
artifact_sha256: Schema.optional(Schema.String),
|
|
15
|
+
generator: Schema.optional(Schema.String),
|
|
16
|
+
provenance_path: Schema.optional(Schema.String),
|
|
17
|
+
});
|
|
18
|
+
export const ContractFreshnessManifest = Schema.Struct({
|
|
19
|
+
schema_version: Schema.Literal(1),
|
|
20
|
+
generated_artifact_globs: Schema.optional(Schema.Array(Schema.String)),
|
|
21
|
+
exclude_globs: Schema.optional(Schema.Array(Schema.String)),
|
|
22
|
+
contracts: Schema.Array(ContractFreshnessContract),
|
|
23
|
+
});
|
|
24
|
+
const DEFAULT_EXCLUDE_GLOBS = [
|
|
25
|
+
"**/.git/**",
|
|
26
|
+
"**/node_modules/**",
|
|
27
|
+
"**/dist/**",
|
|
28
|
+
"**/build/**",
|
|
29
|
+
"**/coverage/**",
|
|
30
|
+
"**/.turbo/**",
|
|
31
|
+
"**/target/**",
|
|
32
|
+
"**/vendor/**",
|
|
33
|
+
"**/fixtures/**",
|
|
34
|
+
];
|
|
35
|
+
const FINDING_WEIGHT = {
|
|
36
|
+
"missing-provenance": 2,
|
|
37
|
+
"stale-artifact": 5,
|
|
38
|
+
"missing-generated-artifact": 4,
|
|
39
|
+
"orphan-generated-artifact": 3,
|
|
40
|
+
};
|
|
41
|
+
export const decodeContractFreshnessManifestSync = Schema.decodeUnknownSync(ContractFreshnessManifest);
|
|
42
|
+
export const loadContractFreshnessFacts = async (repoRoot) => {
|
|
43
|
+
const checkedPaths = [CANONICAL_CONTRACT_FRESHNESS_RELATIVE_PATH];
|
|
44
|
+
const sourcePath = join(repoRoot, CANONICAL_CONTRACT_FRESHNESS_RELATIVE_PATH);
|
|
45
|
+
if (!existsSync(sourcePath))
|
|
46
|
+
return buildNotConfiguredContractFreshnessFacts(checkedPaths);
|
|
47
|
+
try {
|
|
48
|
+
const raw = await readFile(sourcePath, "utf8");
|
|
49
|
+
const parsed = JSON.parse(raw);
|
|
50
|
+
const manifest = decodeContractFreshnessManifestSync(parsed);
|
|
51
|
+
return await collectContractFreshnessFacts(repoRoot, sourcePath, checkedPaths, manifest);
|
|
52
|
+
}
|
|
53
|
+
catch (cause) {
|
|
54
|
+
return buildUnknownContractFreshnessFacts(checkedPaths, `Failed to load contract freshness reference data: ${String(cause)}`, sourcePath);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
export const buildNotConfiguredContractFreshnessFacts = (checkedPaths) => ({
|
|
58
|
+
state: "not_configured",
|
|
59
|
+
checkedPaths,
|
|
60
|
+
contracts: [],
|
|
61
|
+
findings: [],
|
|
62
|
+
sourceFingerprint: fingerprint({ checkedPaths, state: "not_configured" }),
|
|
63
|
+
message: "Contract freshness reference data was not configured",
|
|
64
|
+
});
|
|
65
|
+
export const buildUnknownContractFreshnessFacts = (checkedPaths, message, sourcePath) => ({
|
|
66
|
+
state: "unknown",
|
|
67
|
+
...(sourcePath === undefined ? {} : { sourcePath }),
|
|
68
|
+
checkedPaths,
|
|
69
|
+
contracts: [],
|
|
70
|
+
findings: [],
|
|
71
|
+
sourceFingerprint: fingerprint({ checkedPaths, message, state: "unknown" }),
|
|
72
|
+
message,
|
|
73
|
+
});
|
|
74
|
+
const collectContractFreshnessFacts = async (repoRoot, sourcePath, checkedPaths, manifest) => {
|
|
75
|
+
const contracts = [];
|
|
76
|
+
const findings = [];
|
|
77
|
+
const checkedPathSet = new Set(checkedPaths);
|
|
78
|
+
const declaredArtifacts = new Set(manifest.contracts.map((contract) => normalizePath(contract.artifact_path)));
|
|
79
|
+
for (const contract of manifest.contracts) {
|
|
80
|
+
const groupId = contract.group_id ?? "default";
|
|
81
|
+
const expectedSourceHashes = normalizeHashRecord(contract.source_hashes ?? {});
|
|
82
|
+
const normalizedSourcePaths = contract.source_paths.map(normalizePath);
|
|
83
|
+
for (const source of normalizedSourcePaths)
|
|
84
|
+
checkedPathSet.add(source);
|
|
85
|
+
const artifactPath = normalizePath(contract.artifact_path);
|
|
86
|
+
checkedPathSet.add(artifactPath);
|
|
87
|
+
const sourceHashes = await currentSourceHashes(repoRoot, normalizedSourcePaths);
|
|
88
|
+
const artifactAbsolutePath = safeResolve(repoRoot, artifactPath);
|
|
89
|
+
const artifactExists = artifactAbsolutePath !== undefined && existsSync(artifactAbsolutePath);
|
|
90
|
+
const artifactHash = artifactExists ? await fileHash(artifactAbsolutePath) : undefined;
|
|
91
|
+
contracts.push({
|
|
92
|
+
contractId: contract.id,
|
|
93
|
+
groupId,
|
|
94
|
+
artifactPath,
|
|
95
|
+
sourcePaths: normalizedSourcePaths,
|
|
96
|
+
sourceHashes,
|
|
97
|
+
expectedSourceHashes,
|
|
98
|
+
...(artifactHash === undefined ? {} : { artifactHash }),
|
|
99
|
+
...(contract.artifact_sha256 === undefined ? {} : { expectedArtifactHash: contract.artifact_sha256.toLowerCase() }),
|
|
100
|
+
...(contract.generator === undefined ? {} : { generator: contract.generator }),
|
|
101
|
+
});
|
|
102
|
+
if (!artifactExists) {
|
|
103
|
+
findings.push(makeFinding({
|
|
104
|
+
contractId: contract.id,
|
|
105
|
+
groupId,
|
|
106
|
+
kind: "missing-generated-artifact",
|
|
107
|
+
file: artifactPath,
|
|
108
|
+
artifactFile: artifactPath,
|
|
109
|
+
evidence: ["declared generated artifact is missing"],
|
|
110
|
+
}));
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (Object.keys(expectedSourceHashes).length === 0 && contract.artifact_sha256 === undefined) {
|
|
114
|
+
findings.push(makeFinding({
|
|
115
|
+
contractId: contract.id,
|
|
116
|
+
groupId,
|
|
117
|
+
kind: "missing-provenance",
|
|
118
|
+
file: artifactPath,
|
|
119
|
+
artifactFile: artifactPath,
|
|
120
|
+
evidence: ["declared generated artifact has no recorded source or artifact hash provenance"],
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
for (const source of normalizedSourcePaths) {
|
|
124
|
+
if (sourceHashes[source] !== undefined)
|
|
125
|
+
continue;
|
|
126
|
+
findings.push(makeFinding({
|
|
127
|
+
contractId: contract.id,
|
|
128
|
+
groupId,
|
|
129
|
+
kind: "stale-artifact",
|
|
130
|
+
file: artifactPath,
|
|
131
|
+
sourceFile: source,
|
|
132
|
+
artifactFile: artifactPath,
|
|
133
|
+
evidence: ["declared source contract is missing"],
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
for (const [source, expectedHash] of Object.entries(expectedSourceHashes)) {
|
|
137
|
+
const actualHash = sourceHashes[source];
|
|
138
|
+
if (actualHash !== undefined && actualHash !== expectedHash) {
|
|
139
|
+
findings.push(makeFinding({
|
|
140
|
+
contractId: contract.id,
|
|
141
|
+
groupId,
|
|
142
|
+
kind: "stale-artifact",
|
|
143
|
+
file: artifactPath,
|
|
144
|
+
sourceFile: source,
|
|
145
|
+
artifactFile: artifactPath,
|
|
146
|
+
evidence: [
|
|
147
|
+
`expected source hash ${expectedHash}`,
|
|
148
|
+
`current source hash ${actualHash}`,
|
|
149
|
+
],
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (contract.artifact_sha256 !== undefined &&
|
|
154
|
+
artifactHash !== undefined &&
|
|
155
|
+
artifactHash !== contract.artifact_sha256.toLowerCase()) {
|
|
156
|
+
findings.push(makeFinding({
|
|
157
|
+
contractId: contract.id,
|
|
158
|
+
groupId,
|
|
159
|
+
kind: "stale-artifact",
|
|
160
|
+
file: artifactPath,
|
|
161
|
+
artifactFile: artifactPath,
|
|
162
|
+
evidence: [
|
|
163
|
+
`expected artifact hash ${contract.artifact_sha256.toLowerCase()}`,
|
|
164
|
+
`current artifact hash ${artifactHash}`,
|
|
165
|
+
],
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const orphanArtifacts = await collectOrphanArtifacts(repoRoot, manifest.generated_artifact_globs ?? [], [...DEFAULT_EXCLUDE_GLOBS, ...(manifest.exclude_globs ?? [])], declaredArtifacts);
|
|
170
|
+
for (const artifact of orphanArtifacts)
|
|
171
|
+
checkedPathSet.add(artifact);
|
|
172
|
+
findings.push(...orphanArtifacts.map((artifact) => makeFinding({
|
|
173
|
+
contractId: artifact,
|
|
174
|
+
groupId: "detected",
|
|
175
|
+
kind: "orphan-generated-artifact",
|
|
176
|
+
file: artifact,
|
|
177
|
+
artifactFile: artifact,
|
|
178
|
+
evidence: ["generated artifact matched contract freshness globs but is not declared in provenance data"],
|
|
179
|
+
})));
|
|
180
|
+
findings.sort(compareFindings);
|
|
181
|
+
const state = findings.length > 0 ? "present" : "zero";
|
|
182
|
+
return {
|
|
183
|
+
state,
|
|
184
|
+
sourcePath,
|
|
185
|
+
checkedPaths: [...checkedPathSet].sort(),
|
|
186
|
+
contracts,
|
|
187
|
+
findings,
|
|
188
|
+
sourceFingerprint: fingerprint({ contracts, findings, manifest, state }),
|
|
189
|
+
};
|
|
190
|
+
};
|
|
191
|
+
const currentSourceHashes = async (repoRoot, sourcePaths) => {
|
|
192
|
+
const result = {};
|
|
193
|
+
for (const sourcePath of sourcePaths.map(normalizePath)) {
|
|
194
|
+
const absolutePath = safeResolve(repoRoot, sourcePath);
|
|
195
|
+
if (absolutePath === undefined || !existsSync(absolutePath))
|
|
196
|
+
continue;
|
|
197
|
+
result[sourcePath] = await fileHash(absolutePath);
|
|
198
|
+
}
|
|
199
|
+
return result;
|
|
200
|
+
};
|
|
201
|
+
const collectOrphanArtifacts = async (repoRoot, artifactGlobs, excludeGlobs, declaredArtifacts) => {
|
|
202
|
+
if (artifactGlobs.length === 0)
|
|
203
|
+
return [];
|
|
204
|
+
const files = await listFiles(repoRoot, excludeGlobs);
|
|
205
|
+
return files
|
|
206
|
+
.filter((path) => matchesAnyGlob(path, artifactGlobs))
|
|
207
|
+
.filter((path) => !declaredArtifacts.has(path))
|
|
208
|
+
.sort();
|
|
209
|
+
};
|
|
210
|
+
const listFiles = async (root, excludeGlobs) => {
|
|
211
|
+
const files = [];
|
|
212
|
+
const visit = async (dir) => {
|
|
213
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
214
|
+
for (const entry of entries) {
|
|
215
|
+
const absolutePath = resolve(dir, entry.name);
|
|
216
|
+
const path = normalizePath(relative(root, absolutePath));
|
|
217
|
+
if (path === "" || matchesAnyGlob(path, excludeGlobs))
|
|
218
|
+
continue;
|
|
219
|
+
if (entry.isDirectory()) {
|
|
220
|
+
await visit(absolutePath);
|
|
221
|
+
}
|
|
222
|
+
else if (entry.isFile()) {
|
|
223
|
+
files.push(path);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
await visit(root);
|
|
228
|
+
return files;
|
|
229
|
+
};
|
|
230
|
+
const makeFinding = (args) => ({
|
|
231
|
+
findingId: `${args.contractId}:${args.kind}:${args.file}`,
|
|
232
|
+
contractId: args.contractId,
|
|
233
|
+
groupId: args.groupId,
|
|
234
|
+
kind: args.kind,
|
|
235
|
+
file: args.file,
|
|
236
|
+
...(args.sourceFile === undefined ? {} : { sourceFile: args.sourceFile }),
|
|
237
|
+
...(args.artifactFile === undefined ? {} : { artifactFile: args.artifactFile }),
|
|
238
|
+
severity: args.kind === "missing-provenance" ? "info" : "warn",
|
|
239
|
+
weight: FINDING_WEIGHT[args.kind],
|
|
240
|
+
evidence: args.evidence,
|
|
241
|
+
});
|
|
242
|
+
const normalizeHashRecord = (record) => Object.fromEntries(Object.entries(record).map(([path, hash]) => [normalizePath(path), hash.toLowerCase()]));
|
|
243
|
+
const safeResolve = (repoRoot, path) => {
|
|
244
|
+
const root = resolve(repoRoot);
|
|
245
|
+
const resolved = resolve(root, path);
|
|
246
|
+
const rel = relative(root, resolved);
|
|
247
|
+
return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel))
|
|
248
|
+
? resolved
|
|
249
|
+
: undefined;
|
|
250
|
+
};
|
|
251
|
+
const fileHash = async (path) => sha256(await readFile(path));
|
|
252
|
+
const sha256 = (content) => createHash("sha256").update(content).digest("hex");
|
|
253
|
+
const fingerprint = (value) => sha256(stableStringify(value));
|
|
254
|
+
const stableStringify = (value) => JSON.stringify(sortJson(value));
|
|
255
|
+
const sortJson = (value) => {
|
|
256
|
+
if (Array.isArray(value))
|
|
257
|
+
return value.map(sortJson);
|
|
258
|
+
if (value !== null && typeof value === "object") {
|
|
259
|
+
return Object.fromEntries(Object.entries(value)
|
|
260
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
261
|
+
.map(([key, nested]) => [key, sortJson(nested)]));
|
|
262
|
+
}
|
|
263
|
+
return value;
|
|
264
|
+
};
|
|
265
|
+
const matchesAnyGlob = (path, globs) => globs.some((glob) => globMatches(path, glob));
|
|
266
|
+
const globMatches = (path, glob) => globToRegex(glob).test(normalizePath(path));
|
|
267
|
+
const globToRegex = (glob) => {
|
|
268
|
+
const escaped = normalizePath(glob)
|
|
269
|
+
.replace(/[.+^${}()|[\]\\]/gu, "\\$&")
|
|
270
|
+
.replace(/\*\*/gu, "<<<GLOBSTAR>>>")
|
|
271
|
+
.replace(/\*/gu, "[^/]*")
|
|
272
|
+
.replace(/<<<GLOBSTAR>>>/gu, ".*");
|
|
273
|
+
return new RegExp(`^${escaped}$`, "u");
|
|
274
|
+
};
|
|
275
|
+
const normalizePath = (path) => path.replace(/\\/gu, "/");
|
|
276
|
+
const compareFindings = (left, right) => {
|
|
277
|
+
const bySeverity = severityRank(right.severity) - severityRank(left.severity);
|
|
278
|
+
if (bySeverity !== 0)
|
|
279
|
+
return bySeverity;
|
|
280
|
+
const byWeight = right.weight - left.weight;
|
|
281
|
+
if (byWeight !== 0)
|
|
282
|
+
return byWeight;
|
|
283
|
+
if (left.groupId !== right.groupId)
|
|
284
|
+
return left.groupId.localeCompare(right.groupId);
|
|
285
|
+
if (left.file !== right.file)
|
|
286
|
+
return left.file.localeCompare(right.file);
|
|
287
|
+
return left.kind.localeCompare(right.kind);
|
|
288
|
+
};
|
|
289
|
+
const severityRank = (severity) => severity === "warn" ? 1 : 0;
|
|
290
|
+
//# sourceMappingURL=contract-freshness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-freshness.js","sourceRoot":"","sources":["../src/contract-freshness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
export declare const COVERAGE_REFERENCE_DATA_KEY: "coverage";
|
|
3
|
+
export declare const CANONICAL_LCOV_RELATIVE_PATH: "coverage/lcov.info";
|
|
4
|
+
export declare const CANONICAL_ISTANBUL_RELATIVE_PATH: "coverage/coverage-final.json";
|
|
5
|
+
export declare const CoverageFactState: Schema.Literal<["present", "zero", "absent", "unknown", "not_configured", "not_applicable"]>;
|
|
6
|
+
export type CoverageFactState = typeof CoverageFactState.Type;
|
|
7
|
+
export interface CoverageMetric {
|
|
8
|
+
readonly covered: number;
|
|
9
|
+
readonly total: number;
|
|
10
|
+
readonly pct: number;
|
|
11
|
+
}
|
|
12
|
+
export interface CoverageFileFact {
|
|
13
|
+
readonly file: string;
|
|
14
|
+
readonly lines: CoverageMetric;
|
|
15
|
+
readonly functions: CoverageMetric;
|
|
16
|
+
readonly branches: CoverageMetric;
|
|
17
|
+
}
|
|
18
|
+
export interface CoverageFacts {
|
|
19
|
+
readonly state: CoverageFactState;
|
|
20
|
+
readonly tool?: "lcov" | "istanbul";
|
|
21
|
+
readonly sourcePath?: string;
|
|
22
|
+
readonly checkedPaths: ReadonlyArray<string>;
|
|
23
|
+
readonly files: ReadonlyArray<CoverageFileFact>;
|
|
24
|
+
readonly summary: {
|
|
25
|
+
readonly lines: CoverageMetric;
|
|
26
|
+
readonly functions: CoverageMetric;
|
|
27
|
+
readonly branches: CoverageMetric;
|
|
28
|
+
};
|
|
29
|
+
readonly message?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface CoverageCandidate {
|
|
32
|
+
readonly relativePath: string;
|
|
33
|
+
readonly content: string;
|
|
34
|
+
}
|
|
35
|
+
export declare const emptyCoverageMetric: () => CoverageMetric;
|
|
36
|
+
export declare const coverageMetric: (covered: number, total: number) => CoverageMetric;
|
|
37
|
+
export declare const summarizeCoverageFiles: (files: ReadonlyArray<CoverageFileFact>) => CoverageFacts["summary"];
|
|
38
|
+
export declare const determineCoverageState: (summary: CoverageFacts["summary"], files: ReadonlyArray<CoverageFileFact>) => CoverageFactState;
|
|
39
|
+
export declare const buildAbsentCoverageFacts: (checkedPaths: ReadonlyArray<string>) => CoverageFacts;
|
|
40
|
+
export declare const buildUnknownCoverageFacts: (checkedPaths: ReadonlyArray<string>, message: string, sourcePath?: string) => CoverageFacts;
|
|
41
|
+
export declare const parseCoverageCandidate: (repoRoot: string, candidate: CoverageCandidate, checkedPaths: ReadonlyArray<string>) => CoverageFacts;
|
|
42
|
+
export declare const resolveCoveragePath: (repoRoot: string, path: string) => string;
|
|
43
|
+
//# sourceMappingURL=coverage-facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-facts.d.ts","sourceRoot":"","sources":["../src/coverage-facts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAI/B,eAAO,MAAM,2BAA2B,EAAG,UAAmB,CAAA;AAC9D,eAAO,MAAM,4BAA4B,EAAG,oBAA6B,CAAA;AACzE,eAAO,MAAM,gCAAgC,EAAG,8BAAuC,CAAA;AAEvF,eAAO,MAAM,iBAAiB,8FAO7B,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAE7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAA;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;IAC/C,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;QAC9B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;QAClC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;KAClC,CAAA;IACD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,eAAO,MAAM,mBAAmB,QAAO,cAIrC,CAAA;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,cAI9D,CAAA;AAEF,eAAO,MAAM,sBAAsB,GACjC,OAAO,aAAa,CAAC,gBAAgB,CAAC,KACrC,aAAa,CAAC,SAAS,CAWzB,CAAA;AAED,eAAO,MAAM,sBAAsB,GACjC,SAAS,aAAa,CAAC,SAAS,CAAC,EACjC,OAAO,aAAa,CAAC,gBAAgB,CAAC,KACrC,iBAQF,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,cAAc,aAAa,CAAC,MAAM,CAAC,KAClC,aAUD,CAAA;AAEF,eAAO,MAAM,yBAAyB,GACpC,cAAc,aAAa,CAAC,MAAM,CAAC,EACnC,SAAS,MAAM,EACf,aAAa,MAAM,KAClB,aAWD,CAAA;AAEF,eAAO,MAAM,sBAAsB,GACjC,UAAU,MAAM,EAChB,WAAW,iBAAiB,EAC5B,cAAc,aAAa,CAAC,MAAM,CAAC,KAClC,aAkBF,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,EAAE,MAAM,MAAM,KAAG,MACN,CAAA"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { join, normalize } from "node:path";
|
|
2
|
+
import { Schema } from "effect";
|
|
3
|
+
import { parseIstanbulCoverage } from "./coverage-istanbul.js";
|
|
4
|
+
import { parseLcovCoverage } from "./coverage-lcov.js";
|
|
5
|
+
export const COVERAGE_REFERENCE_DATA_KEY = "coverage";
|
|
6
|
+
export const CANONICAL_LCOV_RELATIVE_PATH = "coverage/lcov.info";
|
|
7
|
+
export const CANONICAL_ISTANBUL_RELATIVE_PATH = "coverage/coverage-final.json";
|
|
8
|
+
export const CoverageFactState = Schema.Literal("present", "zero", "absent", "unknown", "not_configured", "not_applicable");
|
|
9
|
+
export const emptyCoverageMetric = () => ({
|
|
10
|
+
covered: 0,
|
|
11
|
+
total: 0,
|
|
12
|
+
pct: 1,
|
|
13
|
+
});
|
|
14
|
+
export const coverageMetric = (covered, total) => ({
|
|
15
|
+
covered,
|
|
16
|
+
total,
|
|
17
|
+
pct: total === 0 ? 1 : covered / total,
|
|
18
|
+
});
|
|
19
|
+
export const summarizeCoverageFiles = (files) => {
|
|
20
|
+
const sum = (select) => {
|
|
21
|
+
const covered = files.reduce((total, file) => total + select(file).covered, 0);
|
|
22
|
+
const denominator = files.reduce((total, file) => total + select(file).total, 0);
|
|
23
|
+
return coverageMetric(covered, denominator);
|
|
24
|
+
};
|
|
25
|
+
return {
|
|
26
|
+
lines: sum((file) => file.lines),
|
|
27
|
+
functions: sum((file) => file.functions),
|
|
28
|
+
branches: sum((file) => file.branches),
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export const determineCoverageState = (summary, files) => {
|
|
32
|
+
const denominator = summary.lines.total + summary.functions.total + summary.branches.total;
|
|
33
|
+
const covered = summary.lines.covered + summary.functions.covered + summary.branches.covered;
|
|
34
|
+
if (files.length === 0 || denominator === 0)
|
|
35
|
+
return "zero";
|
|
36
|
+
if (covered === 0)
|
|
37
|
+
return "zero";
|
|
38
|
+
return "present";
|
|
39
|
+
};
|
|
40
|
+
export const buildAbsentCoverageFacts = (checkedPaths) => ({
|
|
41
|
+
state: "absent",
|
|
42
|
+
checkedPaths,
|
|
43
|
+
files: [],
|
|
44
|
+
summary: {
|
|
45
|
+
lines: emptyCoverageMetric(),
|
|
46
|
+
functions: emptyCoverageMetric(),
|
|
47
|
+
branches: emptyCoverageMetric(),
|
|
48
|
+
},
|
|
49
|
+
message: "No supported coverage report found",
|
|
50
|
+
});
|
|
51
|
+
export const buildUnknownCoverageFacts = (checkedPaths, message, sourcePath) => ({
|
|
52
|
+
state: "unknown",
|
|
53
|
+
...(sourcePath !== undefined ? { sourcePath } : {}),
|
|
54
|
+
checkedPaths,
|
|
55
|
+
files: [],
|
|
56
|
+
summary: {
|
|
57
|
+
lines: emptyCoverageMetric(),
|
|
58
|
+
functions: emptyCoverageMetric(),
|
|
59
|
+
branches: emptyCoverageMetric(),
|
|
60
|
+
},
|
|
61
|
+
message,
|
|
62
|
+
});
|
|
63
|
+
export const parseCoverageCandidate = (repoRoot, candidate, checkedPaths) => {
|
|
64
|
+
const sourcePath = join(repoRoot, candidate.relativePath);
|
|
65
|
+
const extension = candidate.relativePath.endsWith(".json") ? "json" : "lcov";
|
|
66
|
+
const parsed = extension === "json"
|
|
67
|
+
? parseIstanbulCoverage(repoRoot, candidate.content)
|
|
68
|
+
: parseLcovCoverage(repoRoot, candidate.content);
|
|
69
|
+
const summary = summarizeCoverageFiles(parsed.files);
|
|
70
|
+
const state = determineCoverageState(summary, parsed.files);
|
|
71
|
+
return {
|
|
72
|
+
state,
|
|
73
|
+
tool: parsed.tool,
|
|
74
|
+
sourcePath,
|
|
75
|
+
checkedPaths,
|
|
76
|
+
files: parsed.files,
|
|
77
|
+
summary,
|
|
78
|
+
...(state === "zero" ? { message: "Coverage report contains zero covered items" } : {}),
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
export const resolveCoveragePath = (repoRoot, path) => normalize(path.startsWith("/") ? path : join(repoRoot, path));
|
|
82
|
+
//# sourceMappingURL=coverage-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-facts.js","sourceRoot":"","sources":["../src/coverage-facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-istanbul.d.ts","sourceRoot":"","sources":["../src/coverage-istanbul.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AASxD,eAAO,MAAM,qBAAqB,GAChC,UAAU,MAAM,EAChB,SAAS,MAAM,KACd,cA2BF,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { coverageMetric, resolveCoveragePath } from "./coverage-facts.js";
|
|
2
|
+
export const parseIstanbulCoverage = (repoRoot, content) => {
|
|
3
|
+
const parsed = JSON.parse(content);
|
|
4
|
+
const files = [];
|
|
5
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
6
|
+
if (value === null || typeof value !== "object")
|
|
7
|
+
continue;
|
|
8
|
+
const statementHits = Object.values(value.s ?? {});
|
|
9
|
+
const functionHits = Object.values(value.f ?? {});
|
|
10
|
+
const branchHits = Object.values(value.b ?? {}).flat();
|
|
11
|
+
files.push({
|
|
12
|
+
file: resolveCoveragePath(repoRoot, value.path ?? key),
|
|
13
|
+
lines: coverageMetric(statementHits.filter((hitCount) => hitCount > 0).length, statementHits.length),
|
|
14
|
+
functions: coverageMetric(functionHits.filter((hitCount) => hitCount > 0).length, functionHits.length),
|
|
15
|
+
branches: coverageMetric(branchHits.filter((hitCount) => hitCount > 0).length, branchHits.length),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return { tool: "istanbul", files };
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=coverage-istanbul.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-istanbul.js","sourceRoot":"","sources":["../src/coverage-istanbul.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAUzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAAgB,EAChB,OAAe,EACC,EAAE;IAClB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAyC,CAAA;IAC1E,MAAM,KAAK,GAA4B,EAAE,CAAA;IAEzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAQ;QACzD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACjD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACtD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;YACtD,KAAK,EAAE,cAAc,CACnB,aAAa,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,EACvD,aAAa,CAAC,MAAM,CACrB;YACD,SAAS,EAAE,cAAc,CACvB,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,EACtD,YAAY,CAAC,MAAM,CACpB;YACD,QAAQ,EAAE,cAAc,CACtB,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,EACpD,UAAU,CAAC,MAAM,CAClB;SACF,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;AACpC,CAAC,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CoverageFileFact } from "./coverage-facts.js";
|
|
2
|
+
export interface ParsedCoverage {
|
|
3
|
+
readonly tool: "lcov" | "istanbul";
|
|
4
|
+
readonly files: ReadonlyArray<CoverageFileFact>;
|
|
5
|
+
}
|
|
6
|
+
export declare const parseLcovCoverage: (repoRoot: string, content: string) => ParsedCoverage;
|
|
7
|
+
//# sourceMappingURL=coverage-lcov.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-lcov.d.ts","sourceRoot":"","sources":["../src/coverage-lcov.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAG3D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;IAClC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;CAChD;AAYD,eAAO,MAAM,iBAAiB,GAC5B,UAAU,MAAM,EAChB,SAAS,MAAM,KACd,cA+EF,CAAA"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { coverageMetric, resolveCoveragePath } from "./coverage-facts.js";
|
|
2
|
+
export const parseLcovCoverage = (repoRoot, content) => {
|
|
3
|
+
const records = [];
|
|
4
|
+
let current = emptyRecord();
|
|
5
|
+
const flush = () => {
|
|
6
|
+
if (current.file === undefined) {
|
|
7
|
+
current = emptyRecord();
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
records.push({
|
|
11
|
+
file: resolveCoveragePath(repoRoot, current.file),
|
|
12
|
+
lines: coverageMetric(current.linesHit, current.linesFound),
|
|
13
|
+
functions: coverageMetric(current.functionsHit, current.functionsFound),
|
|
14
|
+
branches: coverageMetric(current.branchesHit, current.branchesFound),
|
|
15
|
+
});
|
|
16
|
+
current = emptyRecord();
|
|
17
|
+
};
|
|
18
|
+
for (const rawLine of content.split(/\r?\n/u)) {
|
|
19
|
+
const line = rawLine.trim();
|
|
20
|
+
if (line.length === 0)
|
|
21
|
+
continue;
|
|
22
|
+
if (line.startsWith("SF:")) {
|
|
23
|
+
current.file = line.slice("SF:".length);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (line.startsWith("DA:")) {
|
|
27
|
+
current.linesFound += 1;
|
|
28
|
+
const [, hitCount] = line.slice("DA:".length).split(",");
|
|
29
|
+
if (Number.parseInt(hitCount ?? "0", 10) > 0)
|
|
30
|
+
current.linesHit += 1;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (line.startsWith("FNDA:")) {
|
|
34
|
+
current.functionsFound += 1;
|
|
35
|
+
const [hitCount] = line.slice("FNDA:".length).split(",");
|
|
36
|
+
if (Number.parseInt(hitCount ?? "0", 10) > 0)
|
|
37
|
+
current.functionsHit += 1;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (line.startsWith("BRDA:")) {
|
|
41
|
+
current.branchesFound += 1;
|
|
42
|
+
const parts = line.slice("BRDA:".length).split(",");
|
|
43
|
+
const hitCount = parts[3];
|
|
44
|
+
if (hitCount !== undefined && hitCount !== "-" && Number.parseInt(hitCount, 10) > 0) {
|
|
45
|
+
current.branchesHit += 1;
|
|
46
|
+
}
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (line.startsWith("LF:")) {
|
|
50
|
+
current.linesFound = Number.parseInt(line.slice("LF:".length), 10) || current.linesFound;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (line.startsWith("LH:")) {
|
|
54
|
+
current.linesHit = Number.parseInt(line.slice("LH:".length), 10) || current.linesHit;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (line.startsWith("FNF:")) {
|
|
58
|
+
current.functionsFound =
|
|
59
|
+
Number.parseInt(line.slice("FNF:".length), 10) || current.functionsFound;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (line.startsWith("FNH:")) {
|
|
63
|
+
current.functionsHit =
|
|
64
|
+
Number.parseInt(line.slice("FNH:".length), 10) || current.functionsHit;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (line.startsWith("BRF:")) {
|
|
68
|
+
current.branchesFound =
|
|
69
|
+
Number.parseInt(line.slice("BRF:".length), 10) || current.branchesFound;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (line.startsWith("BRH:")) {
|
|
73
|
+
current.branchesHit =
|
|
74
|
+
Number.parseInt(line.slice("BRH:".length), 10) || current.branchesHit;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (line === "end_of_record")
|
|
78
|
+
flush();
|
|
79
|
+
}
|
|
80
|
+
flush();
|
|
81
|
+
return { tool: "lcov", files: records };
|
|
82
|
+
};
|
|
83
|
+
const emptyRecord = () => ({
|
|
84
|
+
linesFound: 0,
|
|
85
|
+
linesHit: 0,
|
|
86
|
+
functionsFound: 0,
|
|
87
|
+
functionsHit: 0,
|
|
88
|
+
branchesFound: 0,
|
|
89
|
+
branchesHit: 0,
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=coverage-lcov.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-lcov.js","sourceRoot":"","sources":["../src/coverage-lcov.ts"],"names":[],"mappings":"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"}
|