@trailmark/playwright 0.1.0
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/.trailmark/current-run.json +136 -0
- package/dist/artifacts/artifactManager.d.ts +31 -0
- package/dist/artifacts/artifactManager.d.ts.map +1 -0
- package/dist/artifacts/artifactManager.js +140 -0
- package/dist/artifacts/artifactManager.js.map +1 -0
- package/dist/artifacts/capture.d.ts +4 -0
- package/dist/artifacts/capture.d.ts.map +1 -0
- package/dist/artifacts/capture.js +16 -0
- package/dist/artifacts/capture.js.map +1 -0
- package/dist/artifacts/options.d.ts +11 -0
- package/dist/artifacts/options.d.ts.map +1 -0
- package/dist/artifacts/options.js +55 -0
- package/dist/artifacts/options.js.map +1 -0
- package/dist/artifacts/registry.d.ts +24 -0
- package/dist/artifacts/registry.d.ts.map +1 -0
- package/dist/artifacts/registry.js +99 -0
- package/dist/artifacts/registry.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +5 -0
- package/dist/constants.js.map +1 -0
- package/dist/fixture.d.ts +7 -0
- package/dist/fixture.d.ts.map +1 -0
- package/dist/fixture.js +193 -0
- package/dist/fixture.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mode.d.ts +3 -0
- package/dist/mode.d.ts.map +1 -0
- package/dist/mode.js +9 -0
- package/dist/mode.js.map +1 -0
- package/dist/reporter/attachments.d.ts +4 -0
- package/dist/reporter/attachments.d.ts.map +1 -0
- package/dist/reporter/attachments.js +112 -0
- package/dist/reporter/attachments.js.map +1 -0
- package/dist/reporter/errors.d.ts +4 -0
- package/dist/reporter/errors.d.ts.map +1 -0
- package/dist/reporter/errors.js +11 -0
- package/dist/reporter/errors.js.map +1 -0
- package/dist/reporter/index.d.ts +33 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +407 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/reporter/io.d.ts +15 -0
- package/dist/reporter/io.d.ts.map +1 -0
- package/dist/reporter/io.js +34 -0
- package/dist/reporter/io.js.map +1 -0
- package/dist/reporter/normalization.d.ts +13 -0
- package/dist/reporter/normalization.d.ts.map +1 -0
- package/dist/reporter/normalization.js +91 -0
- package/dist/reporter/normalization.js.map +1 -0
- package/dist/reporter/output.d.ts +5 -0
- package/dist/reporter/output.d.ts.map +1 -0
- package/dist/reporter/output.js +90 -0
- package/dist/reporter/output.js.map +1 -0
- package/dist/reporter/run.d.ts +4 -0
- package/dist/reporter/run.d.ts.map +1 -0
- package/dist/reporter/run.js +18 -0
- package/dist/reporter/run.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/integration/app/base.html +16 -0
- package/integration/app/extra.html +17 -0
- package/integration/playwright.config.ts +44 -0
- package/integration/specs/sample.spec.ts +15 -0
- package/integration/tmp/baseline.json +46 -0
- package/integration/tmp/report.json +97 -0
- package/package.json +35 -0
- package/src/artifacts/artifactManager.ts +178 -0
- package/src/artifacts/capture.ts +18 -0
- package/src/artifacts/options.ts +79 -0
- package/src/artifacts/registry.ts +143 -0
- package/src/constants.ts +1 -0
- package/src/fixture.ts +239 -0
- package/src/index.ts +3 -0
- package/src/mode.ts +7 -0
- package/src/reporter/attachments.ts +139 -0
- package/src/reporter/errors.ts +6 -0
- package/src/reporter/index.ts +572 -0
- package/src/reporter/io.ts +33 -0
- package/src/reporter/normalization.ts +122 -0
- package/src/reporter/output.ts +103 -0
- package/src/reporter/run.ts +17 -0
- package/src/types.ts +53 -0
- package/test/artifactManager.unit.test.ts +141 -0
- package/test/reporter.integration.test.ts +153 -0
- package/test/reporter.unit.test.ts +337 -0
- package/test-results/.last-run.json +4 -0
- package/trailmark-playwright-0.1.0.tgz +0 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CURRENT_RUN_PATH = exports.DEFAULT_REPORT_PATH = exports.DEFAULT_BASELINE_PATH = void 0;
|
|
4
|
+
const core_1 = require("@trailmark/core");
|
|
5
|
+
const options_1 = require("../artifacts/options");
|
|
6
|
+
const attachments_1 = require("./attachments");
|
|
7
|
+
const io_1 = require("./io");
|
|
8
|
+
const normalization_1 = require("./normalization");
|
|
9
|
+
const output_1 = require("./output");
|
|
10
|
+
const run_1 = require("./run");
|
|
11
|
+
const mode_1 = require("../mode");
|
|
12
|
+
const errors_1 = require("./errors");
|
|
13
|
+
exports.DEFAULT_BASELINE_PATH = ".trailmark/baseline.json";
|
|
14
|
+
exports.DEFAULT_REPORT_PATH = ".trailmark/report.json";
|
|
15
|
+
exports.CURRENT_RUN_PATH = ".trailmark/current-run.json";
|
|
16
|
+
function isRecord(value) {
|
|
17
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
18
|
+
}
|
|
19
|
+
function toStringArray(value) {
|
|
20
|
+
if (!Array.isArray(value)) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
return value.filter((entry) => typeof entry === "string");
|
|
24
|
+
}
|
|
25
|
+
function toAttachments(value) {
|
|
26
|
+
if (!Array.isArray(value)) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
return value
|
|
30
|
+
.filter((entry) => isRecord(entry))
|
|
31
|
+
.map((entry) => ({
|
|
32
|
+
kind: typeof entry.kind === "string" ? entry.kind : "unknown",
|
|
33
|
+
path: typeof entry.path === "string" ? entry.path : undefined,
|
|
34
|
+
error: typeof entry.error === "string" ? entry.error : undefined,
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
function toArtifactIndex(value) {
|
|
38
|
+
if (!isRecord(value)) {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
const byOccurrenceId = {};
|
|
42
|
+
const byIssueId = {};
|
|
43
|
+
if (isRecord(value.byOccurrenceId)) {
|
|
44
|
+
for (const key of Object.keys(value.byOccurrenceId).sort((a, b) => a.localeCompare(b))) {
|
|
45
|
+
byOccurrenceId[key] = toAttachments(value.byOccurrenceId[key]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (isRecord(value.byIssueId)) {
|
|
49
|
+
for (const key of Object.keys(value.byIssueId).sort((a, b) => a.localeCompare(b))) {
|
|
50
|
+
byIssueId[key] = toAttachments(value.byIssueId[key]);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
byOccurrenceId,
|
|
55
|
+
byIssueId,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function mergeArtifactIndex(left, right) {
|
|
59
|
+
const byOccurrenceId = {
|
|
60
|
+
...left.byOccurrenceId,
|
|
61
|
+
...right.byOccurrenceId,
|
|
62
|
+
};
|
|
63
|
+
const byIssueId = {
|
|
64
|
+
...left.byIssueId,
|
|
65
|
+
...right.byIssueId,
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
byOccurrenceId,
|
|
69
|
+
byIssueId,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function uniqueStrings(values) {
|
|
73
|
+
return Array.from(new Set(values)).sort((left, right) => left.localeCompare(right));
|
|
74
|
+
}
|
|
75
|
+
function summarizeImpactCounts(counts) {
|
|
76
|
+
const orderedImpacts = ["critical", "serious", "moderate", "minor", "unknown"];
|
|
77
|
+
const orderedEntries = [];
|
|
78
|
+
for (const impact of orderedImpacts) {
|
|
79
|
+
const count = counts[impact];
|
|
80
|
+
if (!count) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
orderedEntries.push([impact, count]);
|
|
84
|
+
}
|
|
85
|
+
for (const impact of Object.keys(counts).sort((left, right) => left.localeCompare(right))) {
|
|
86
|
+
if (orderedImpacts.includes(impact)) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const count = counts[impact];
|
|
90
|
+
if (!count) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
orderedEntries.push([impact, count]);
|
|
94
|
+
}
|
|
95
|
+
if (orderedEntries.length === 0) {
|
|
96
|
+
return "none";
|
|
97
|
+
}
|
|
98
|
+
return orderedEntries.map(([impact, count]) => `${impact}=${count}`).join(", ");
|
|
99
|
+
}
|
|
100
|
+
class TrailmarkReporter {
|
|
101
|
+
constructor(options = {}) {
|
|
102
|
+
this.sourceRuns = 0;
|
|
103
|
+
this.seenRunHashes = new Set();
|
|
104
|
+
this.mergedRun = this.createMergedRun();
|
|
105
|
+
const mode = (0, mode_1.resolveMode)(options);
|
|
106
|
+
const envVerbose = process.env.TRAILMARK_VERBOSE;
|
|
107
|
+
const verboseFromEnv = envVerbose === "1" || envVerbose === "true";
|
|
108
|
+
this.options = {
|
|
109
|
+
baselinePath: options.baselinePath ?? exports.DEFAULT_BASELINE_PATH,
|
|
110
|
+
reportPath: options.reportPath ?? exports.DEFAULT_REPORT_PATH,
|
|
111
|
+
mode,
|
|
112
|
+
failOnImpact: options.failOnImpact ?? ["serious", "critical"],
|
|
113
|
+
failOnScanError: options.failOnScanError ?? true,
|
|
114
|
+
onConfigMismatch: options.onConfigMismatch ?? "warn",
|
|
115
|
+
verbose: options.verbose ?? verboseFromEnv,
|
|
116
|
+
url: options.url ?? {
|
|
117
|
+
stripHash: true,
|
|
118
|
+
stripQuery: true,
|
|
119
|
+
},
|
|
120
|
+
artifacts: (0, options_1.resolveArtifactOptions)(mode, options.artifacts),
|
|
121
|
+
};
|
|
122
|
+
this.syncFixtureEnv();
|
|
123
|
+
}
|
|
124
|
+
syncFixtureEnv() {
|
|
125
|
+
process.env.TRAILMARK_MODE = this.options.mode;
|
|
126
|
+
process.env.TRAILMARK_BASELINE_PATH = this.options.baselinePath;
|
|
127
|
+
process.env.TRAILMARK_ARTIFACTS_ENABLED = String(this.options.artifacts.enabled);
|
|
128
|
+
process.env.TRAILMARK_ARTIFACTS_OUTPUT_DIR = this.options.artifacts.outputDir;
|
|
129
|
+
process.env.TRAILMARK_ARTIFACTS_LIMIT_PER_RUN = String(this.options.artifacts.limitPerRun);
|
|
130
|
+
process.env.TRAILMARK_ARTIFACTS_CAPTURE = this.options.artifacts.capture;
|
|
131
|
+
process.env.TRAILMARK_ARTIFACTS_INCLUDE_VIEWPORT = String(this.options.artifacts.includeViewport);
|
|
132
|
+
process.env.TRAILMARK_ARTIFACTS_INCLUDE_ELEMENT = String(this.options.artifacts.includeElement);
|
|
133
|
+
}
|
|
134
|
+
createMergedRun() {
|
|
135
|
+
return (0, run_1.withRunShape)((0, core_1.createEmptyRun)({
|
|
136
|
+
metadata: {
|
|
137
|
+
sourceRuns: 0,
|
|
138
|
+
artifactRunIds: [],
|
|
139
|
+
artifactWarnings: [],
|
|
140
|
+
artifactIndex: {},
|
|
141
|
+
},
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
debug(message, context) {
|
|
145
|
+
if (!this.options.verbose) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const suffix = context ? ` ${JSON.stringify(context)}` : "";
|
|
149
|
+
console.log(`trailmark:debug ${message}${suffix}`);
|
|
150
|
+
}
|
|
151
|
+
appendRun(run) {
|
|
152
|
+
const runHash = (0, core_1.hashObject)({
|
|
153
|
+
version: run.version,
|
|
154
|
+
startedAt: run.startedAt,
|
|
155
|
+
finishedAt: run.finishedAt,
|
|
156
|
+
tool: run.tool,
|
|
157
|
+
findings: run.findings,
|
|
158
|
+
scanErrors: run.scanErrors,
|
|
159
|
+
metadata: run.metadata,
|
|
160
|
+
});
|
|
161
|
+
if (this.seenRunHashes.has(runHash)) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
this.seenRunHashes.add(runHash);
|
|
165
|
+
this.sourceRuns += 1;
|
|
166
|
+
this.mergedRun.findings.push(...run.findings);
|
|
167
|
+
this.mergedRun.scanErrors.push(...run.scanErrors);
|
|
168
|
+
const previousMetadata = isRecord(this.mergedRun.metadata) ? this.mergedRun.metadata : {};
|
|
169
|
+
const runMetadata = isRecord(run.metadata) ? run.metadata : {};
|
|
170
|
+
const mergedArtifactIndex = mergeArtifactIndex(toArtifactIndex(previousMetadata.artifactIndex), toArtifactIndex(runMetadata.artifactIndex));
|
|
171
|
+
const artifactRunIds = uniqueStrings([
|
|
172
|
+
...toStringArray(previousMetadata.artifactRunIds),
|
|
173
|
+
...toStringArray(runMetadata.artifactRunIds),
|
|
174
|
+
...(typeof runMetadata.artifactRunId === "string" ? [runMetadata.artifactRunId] : []),
|
|
175
|
+
]);
|
|
176
|
+
const artifactWarnings = uniqueStrings([
|
|
177
|
+
...toStringArray(previousMetadata.artifactWarnings),
|
|
178
|
+
...toStringArray(runMetadata.artifactWarnings),
|
|
179
|
+
]);
|
|
180
|
+
this.mergedRun.metadata = {
|
|
181
|
+
...previousMetadata,
|
|
182
|
+
sourceRuns: this.sourceRuns,
|
|
183
|
+
scanCount: Number(previousMetadata.scanCount ?? 0) + Number(runMetadata.scanCount ?? 0),
|
|
184
|
+
skippedScanCount: Number(previousMetadata.skippedScanCount ?? 0) + Number(runMetadata.skippedScanCount ?? 0),
|
|
185
|
+
artifactRunIds,
|
|
186
|
+
artifactWarnings,
|
|
187
|
+
artifactIndex: mergedArtifactIndex,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
currentRunPayloadBase(configHash, run) {
|
|
191
|
+
return {
|
|
192
|
+
generatedAt: new Date().toISOString(),
|
|
193
|
+
mode: this.options.mode,
|
|
194
|
+
configHash,
|
|
195
|
+
run,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
computeConfigHash() {
|
|
199
|
+
return (0, core_1.computeConfigHash)({
|
|
200
|
+
failOnImpact: this.options.failOnImpact,
|
|
201
|
+
failOnScanError: this.options.failOnScanError,
|
|
202
|
+
onConfigMismatch: this.options.onConfigMismatch,
|
|
203
|
+
url: this.options.url,
|
|
204
|
+
projects: this.config?.projects.map((project) => project.name) ?? [],
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
emitCollisionWarnings(finalizedRun, warnings) {
|
|
208
|
+
const collisions = (0, normalization_1.detectIdentityCollisions)(finalizedRun.findings);
|
|
209
|
+
if (collisions.length === 0) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const collisionSummary = collisions
|
|
213
|
+
.slice(0, 5)
|
|
214
|
+
.map((entry) => `${entry.scopeKey}:${entry.ruleId}:${entry.pageKey} x${entry.count}`)
|
|
215
|
+
.join(", ");
|
|
216
|
+
const warning = "trailmark: detected potential target-hash collisions in current run. " +
|
|
217
|
+
`Repeated elements may merge into one issue identity (${collisionSummary}).`;
|
|
218
|
+
warnings.push(warning);
|
|
219
|
+
console.warn(warning);
|
|
220
|
+
}
|
|
221
|
+
emitArtifactWarnings(finalizedRun, warnings) {
|
|
222
|
+
if (!isRecord(finalizedRun.metadata)) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
for (const warning of toStringArray(finalizedRun.metadata.artifactWarnings)) {
|
|
226
|
+
if (warnings.includes(warning)) {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
warnings.push(warning);
|
|
230
|
+
console.warn(warning);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
handleScanErrors(finalizedRun) {
|
|
234
|
+
if (finalizedRun.scanErrors.length === 0) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
(0, output_1.summarizeScanErrors)(finalizedRun.scanErrors);
|
|
238
|
+
return this.options.failOnScanError;
|
|
239
|
+
}
|
|
240
|
+
runDiff(finalizedRun, configHash, warnings, errors) {
|
|
241
|
+
let shouldFail = false;
|
|
242
|
+
let diff;
|
|
243
|
+
let configMismatch;
|
|
244
|
+
try {
|
|
245
|
+
const { data: baseline, error, message } = (0, io_1.readBaseline)(this.options.baselinePath);
|
|
246
|
+
if (error) {
|
|
247
|
+
throw new errors_1.ReporterBaselineError(message);
|
|
248
|
+
}
|
|
249
|
+
if (baseline.configHash !== configHash) {
|
|
250
|
+
configMismatch = {
|
|
251
|
+
baselineConfigHash: baseline.configHash,
|
|
252
|
+
currentConfigHash: configHash,
|
|
253
|
+
action: this.options.onConfigMismatch,
|
|
254
|
+
};
|
|
255
|
+
const mismatchMessage = "trailmark: baseline config hash mismatch detected. " +
|
|
256
|
+
`baseline=${baseline.configHash} current=${configHash}. ` +
|
|
257
|
+
"Diff classification may shift if normalization/gating settings changed.";
|
|
258
|
+
if (this.options.onConfigMismatch === "warn") {
|
|
259
|
+
warnings.push(mismatchMessage);
|
|
260
|
+
console.warn(mismatchMessage);
|
|
261
|
+
}
|
|
262
|
+
else if (this.options.onConfigMismatch === "error") {
|
|
263
|
+
errors.push(mismatchMessage);
|
|
264
|
+
console.error(mismatchMessage);
|
|
265
|
+
shouldFail = true;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
diff = (0, core_1.diffRuns)(baseline, finalizedRun, {
|
|
269
|
+
failOnImpact: this.options.failOnImpact,
|
|
270
|
+
onDebug: this.options.verbose ? this.debug.bind(this) : undefined,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
const message = error instanceof Error
|
|
275
|
+
? error.message
|
|
276
|
+
: `trailmark: failed to process baseline at ${this.options.baselinePath}.`;
|
|
277
|
+
errors.push(message);
|
|
278
|
+
console.error(message);
|
|
279
|
+
shouldFail = true;
|
|
280
|
+
}
|
|
281
|
+
return { diff, configMismatch, shouldFail };
|
|
282
|
+
}
|
|
283
|
+
updateBaseline(playwrightStatus, finalizedRun, configHash, errors, shouldFail) {
|
|
284
|
+
if (playwrightStatus !== "passed") {
|
|
285
|
+
const errorMessage = "trailmark: skipping baseline update because Playwright run did not pass.";
|
|
286
|
+
errors.push(errorMessage);
|
|
287
|
+
console.error(errorMessage);
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
if (this.options.failOnScanError && finalizedRun.scanErrors.length > 0) {
|
|
291
|
+
const errorMessage = "trailmark: skipping baseline update because scan errors were captured in this run.";
|
|
292
|
+
errors.push(errorMessage);
|
|
293
|
+
console.error(errorMessage);
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
const baselineRead = (0, io_1.readBaseline)(this.options.baselinePath);
|
|
297
|
+
if (baselineRead.error && baselineRead.error !== "file-missing") {
|
|
298
|
+
errors.push(baselineRead.message);
|
|
299
|
+
console.error(baselineRead.message);
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
const previousBaseline = baselineRead.data ?? undefined;
|
|
303
|
+
if (shouldFail) {
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
let baselineDelta;
|
|
307
|
+
if (previousBaseline) {
|
|
308
|
+
baselineDelta = (0, core_1.diffRuns)(previousBaseline, finalizedRun, {
|
|
309
|
+
failOnImpact: this.options.failOnImpact,
|
|
310
|
+
onDebug: this.options.verbose ? this.debug.bind(this) : undefined,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
const baseline = (0, core_1.buildBaselineFromRun)(finalizedRun, {
|
|
314
|
+
configHash,
|
|
315
|
+
previousBaseline,
|
|
316
|
+
});
|
|
317
|
+
(0, io_1.writeJsonAtomic)(this.options.baselinePath, baseline);
|
|
318
|
+
console.log(`trailmark: baseline updated at ${this.options.baselinePath} with ${Object.keys(baseline.findings).length} issue(s).`);
|
|
319
|
+
if (baselineDelta) {
|
|
320
|
+
const exactMatches = baselineDelta.existing.filter((entry) => entry.matchedBy === "exact").length;
|
|
321
|
+
const relaxedMatches = baselineDelta.existing.length - exactMatches;
|
|
322
|
+
console.log("trailmark: baseline delta vs previous | " +
|
|
323
|
+
`new=${baselineDelta.stats.newCount} ` +
|
|
324
|
+
`resolved=${baselineDelta.stats.resolvedCount} ` +
|
|
325
|
+
`existing=${baselineDelta.stats.existingCount} ` +
|
|
326
|
+
`(exact=${exactMatches}, relaxed=${relaxedMatches}) ` +
|
|
327
|
+
`blocking=${baselineDelta.blockingNew.length} ` +
|
|
328
|
+
`total previous=${baselineDelta.stats.totalBaseline} ` +
|
|
329
|
+
`total current=${baselineDelta.stats.totalCurrent}`);
|
|
330
|
+
console.log(`trailmark: baseline delta impacts (new): ${summarizeImpactCounts(baselineDelta.stats.newByImpact)}`);
|
|
331
|
+
}
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
reportArtifactIndex(finalizedRun) {
|
|
335
|
+
if (!isRecord(finalizedRun.metadata)) {
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
return toArtifactIndex(finalizedRun.metadata.artifactIndex);
|
|
339
|
+
}
|
|
340
|
+
onBegin(config) {
|
|
341
|
+
this.config = config;
|
|
342
|
+
this.sourceRuns = 0;
|
|
343
|
+
this.seenRunHashes = new Set();
|
|
344
|
+
this.mergedRun = this.createMergedRun();
|
|
345
|
+
}
|
|
346
|
+
onTestEnd(_test, result) {
|
|
347
|
+
for (const run of (0, attachments_1.readAttachmentPayload)(result)) {
|
|
348
|
+
this.appendRun(run);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
async onEnd(result) {
|
|
352
|
+
const playwrightStatus = typeof result.status === "string" ? result.status : "passed";
|
|
353
|
+
const finalizedRun = (0, normalization_1.applyUrlNormalization)((0, run_1.withRunShape)({
|
|
354
|
+
...this.mergedRun,
|
|
355
|
+
finishedAt: new Date().toISOString(),
|
|
356
|
+
}), this.options.url, this.options.verbose ? this.debug.bind(this) : undefined);
|
|
357
|
+
const configHash = this.computeConfigHash();
|
|
358
|
+
const warnings = [];
|
|
359
|
+
const errors = [];
|
|
360
|
+
let shouldFail = this.handleScanErrors(finalizedRun);
|
|
361
|
+
this.emitCollisionWarnings(finalizedRun, warnings);
|
|
362
|
+
this.emitArtifactWarnings(finalizedRun, warnings);
|
|
363
|
+
let diff;
|
|
364
|
+
let configMismatch;
|
|
365
|
+
if (this.options.mode === "baseline") {
|
|
366
|
+
shouldFail = this.updateBaseline(playwrightStatus, finalizedRun, configHash, errors, shouldFail);
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
const diffResult = this.runDiff(finalizedRun, configHash, warnings, errors);
|
|
370
|
+
shouldFail ||= diffResult.shouldFail;
|
|
371
|
+
diff = diffResult.diff;
|
|
372
|
+
configMismatch = diffResult.configMismatch;
|
|
373
|
+
if (diff?.blockingNew.length) {
|
|
374
|
+
shouldFail = true;
|
|
375
|
+
console.error(`trailmark: ${diff.blockingNew.length} blocking new issue(s) found for impacts ${this.options.failOnImpact.join(", ")}.`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
const report = (0, core_1.buildReport)({
|
|
379
|
+
run: finalizedRun,
|
|
380
|
+
mode: this.options.mode,
|
|
381
|
+
configHash,
|
|
382
|
+
diff,
|
|
383
|
+
artifacts: this.reportArtifactIndex(finalizedRun),
|
|
384
|
+
});
|
|
385
|
+
(0, io_1.writeJsonAtomic)(this.options.reportPath, report);
|
|
386
|
+
console.log((0, core_1.formatConsoleReport)(report, {
|
|
387
|
+
failOnImpact: this.options.failOnImpact,
|
|
388
|
+
}));
|
|
389
|
+
(0, io_1.writeJsonAtomic)(exports.CURRENT_RUN_PATH, {
|
|
390
|
+
...this.currentRunPayloadBase(configHash, finalizedRun),
|
|
391
|
+
configMismatch,
|
|
392
|
+
diff,
|
|
393
|
+
reportPath: this.options.reportPath,
|
|
394
|
+
warnings,
|
|
395
|
+
errors,
|
|
396
|
+
});
|
|
397
|
+
if (this.options.failOnScanError && finalizedRun.scanErrors.length > 0) {
|
|
398
|
+
return { status: "failed" };
|
|
399
|
+
}
|
|
400
|
+
if (shouldFail) {
|
|
401
|
+
return { status: "failed" };
|
|
402
|
+
}
|
|
403
|
+
return undefined;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
exports.default = TrailmarkReporter;
|
|
407
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporter/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function writeJsonAtomic(filePath: string, payload: unknown): void;
|
|
2
|
+
export declare function readBaseline(baselinePath: string): {
|
|
3
|
+
data: null;
|
|
4
|
+
error: true;
|
|
5
|
+
message: string;
|
|
6
|
+
} | {
|
|
7
|
+
error: false;
|
|
8
|
+
data: import("@trailmark/core").BaselineFile;
|
|
9
|
+
message?: undefined;
|
|
10
|
+
} | {
|
|
11
|
+
data: null;
|
|
12
|
+
error: "file-missing";
|
|
13
|
+
message: string;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/reporter/io.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAYxE;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM;;;;;;;;;;;;EAUhD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.writeJsonAtomic = writeJsonAtomic;
|
|
4
|
+
exports.readBaseline = readBaseline;
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const core_1 = require("@trailmark/core");
|
|
8
|
+
function ensureParentDir(filePath) {
|
|
9
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(filePath), { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
function writeJsonAtomic(filePath, payload) {
|
|
12
|
+
ensureParentDir(filePath);
|
|
13
|
+
const tempPath = `${filePath}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
14
|
+
try {
|
|
15
|
+
(0, node_fs_1.writeFileSync)(tempPath, JSON.stringify(payload, null, 2), "utf8");
|
|
16
|
+
(0, node_fs_1.renameSync)(tempPath, filePath);
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
if ((0, node_fs_1.existsSync)(tempPath)) {
|
|
20
|
+
(0, node_fs_1.rmSync)(tempPath, { force: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function readBaseline(baselinePath) {
|
|
25
|
+
if (!(0, node_fs_1.existsSync)(baselinePath)) {
|
|
26
|
+
return {
|
|
27
|
+
data: null,
|
|
28
|
+
error: "file-missing",
|
|
29
|
+
message: `trailmark: baseline file not found at ${baselinePath}. Run in baseline mode first.`,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return (0, core_1.parseBaselineFile)((0, node_fs_1.readFileSync)(baselinePath, "utf8"));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/reporter/io.ts"],"names":[],"mappings":";;AAQA,0CAYC;AAED,oCAUC;AAhCD,qCAAgG;AAChG,yCAAmC;AACnC,0CAAmD;AAEnD,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAA,mBAAS,EAAC,IAAA,mBAAO,EAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACnD,CAAC;AAED,SAAgB,eAAe,CAAC,QAAgB,EAAE,OAAgB;IAChE,eAAe,CAAC,QAAQ,CAAC,CAAA;IACzB,MAAM,QAAQ,GAAG,GAAG,QAAQ,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IAEtG,IAAI,CAAC;QACH,IAAA,uBAAa,EAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACjE,IAAA,oBAAU,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAChC,CAAC;YAAS,CAAC;QACT,IAAI,IAAA,oBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAA,gBAAM,EAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,YAAoB;IAC/C,IAAI,CAAC,IAAA,oBAAU,EAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,cAAuB;YAC9B,OAAO,EAAE,yCAAyC,YAAY,+BAA+B;SAC9F,CAAA;IACH,CAAC;IAED,OAAO,IAAA,wBAAiB,EAAC,IAAA,sBAAY,EAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;AAC9D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { TrailmarkFinding, TrailmarkRun } from "@trailmark/core";
|
|
2
|
+
import { TrailmarkReporterOptions } from "../types";
|
|
3
|
+
export interface IdentityCollision {
|
|
4
|
+
count: number;
|
|
5
|
+
scopeKey: string;
|
|
6
|
+
ruleId: string;
|
|
7
|
+
pageKey: string;
|
|
8
|
+
targetHash: string;
|
|
9
|
+
issueIds: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function applyUrlNormalization(run: TrailmarkRun, options: TrailmarkReporterOptions["url"], onDebug?: (message: string, context?: Record<string, unknown>) => void): TrailmarkRun;
|
|
12
|
+
export declare function detectIdentityCollisions(findings: TrailmarkFinding[]): IdentityCollision[];
|
|
13
|
+
//# sourceMappingURL=normalization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalization.d.ts","sourceRoot":"","sources":["../../src/reporter/normalization.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,YAAY,EAKb,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAKnD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,wBAAwB,CAAC,KAAK,CAAC,EACxC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GACrE,YAAY,CAkEd;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,EAAE,CA2B1F"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyUrlNormalization = applyUrlNormalization;
|
|
4
|
+
exports.detectIdentityCollisions = detectIdentityCollisions;
|
|
5
|
+
const core_1 = require("@trailmark/core");
|
|
6
|
+
const run_1 = require("./run");
|
|
7
|
+
const GLOBAL_HASH_INPUT_DEBUG_SEEN = new Set();
|
|
8
|
+
function applyUrlNormalization(run, options, onDebug) {
|
|
9
|
+
const seenHashInputDebugs = new Set();
|
|
10
|
+
const findings = run.findings.map((finding) => {
|
|
11
|
+
const pageKey = (0, core_1.normalizeUrlToPageKey)(finding.pageUrl, options);
|
|
12
|
+
const scopeKey = (0, run_1.scopeKeyFromMetaLocal)(finding.meta);
|
|
13
|
+
const relaxedIssueId = (0, core_1.buildRelaxedIssueId)({
|
|
14
|
+
ruleId: finding.ruleId,
|
|
15
|
+
pageKey,
|
|
16
|
+
targetHash: finding.targetHash,
|
|
17
|
+
});
|
|
18
|
+
const issueId = (0, core_1.buildIssueId)({
|
|
19
|
+
ruleId: finding.ruleId,
|
|
20
|
+
pageKey,
|
|
21
|
+
targetHash: finding.targetHash,
|
|
22
|
+
failureHint: finding.failureHint,
|
|
23
|
+
});
|
|
24
|
+
const debugKey = (0, core_1.hashObject)({
|
|
25
|
+
ruleId: finding.ruleId,
|
|
26
|
+
pageKey,
|
|
27
|
+
targetHash: finding.targetHash,
|
|
28
|
+
failureHint: finding.failureHint,
|
|
29
|
+
issueId,
|
|
30
|
+
relaxedIssueId,
|
|
31
|
+
scopeKey,
|
|
32
|
+
});
|
|
33
|
+
if (!seenHashInputDebugs.has(debugKey) && !GLOBAL_HASH_INPUT_DEBUG_SEEN.has(debugKey)) {
|
|
34
|
+
seenHashInputDebugs.add(debugKey);
|
|
35
|
+
GLOBAL_HASH_INPUT_DEBUG_SEEN.add(debugKey);
|
|
36
|
+
onDebug?.("hash-input", {
|
|
37
|
+
scopeKey,
|
|
38
|
+
ruleId: finding.ruleId,
|
|
39
|
+
pageKey,
|
|
40
|
+
targetHash: finding.targetHash,
|
|
41
|
+
failureHint: finding.failureHint,
|
|
42
|
+
issueId,
|
|
43
|
+
relaxedIssueId,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
...finding,
|
|
48
|
+
pageKey,
|
|
49
|
+
issueId,
|
|
50
|
+
relaxedIssueId,
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
const scanErrors = run.scanErrors.map((scanError) => {
|
|
54
|
+
const pageKey = scanError.pageKey ??
|
|
55
|
+
(scanError.pageUrl ? (0, core_1.normalizeUrlToPageKey)(scanError.pageUrl, options) : undefined);
|
|
56
|
+
return {
|
|
57
|
+
...scanError,
|
|
58
|
+
pageKey,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
...run,
|
|
63
|
+
findings,
|
|
64
|
+
scanErrors,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function detectIdentityCollisions(findings) {
|
|
68
|
+
const map = new Map();
|
|
69
|
+
for (const finding of findings) {
|
|
70
|
+
const scopeKey = (0, run_1.scopeKeyFromMetaLocal)(finding.meta);
|
|
71
|
+
const collisionKey = `${scopeKey}|${finding.ruleId}|${finding.pageKey}|${finding.targetHash}`;
|
|
72
|
+
const existing = map.get(collisionKey);
|
|
73
|
+
if (existing) {
|
|
74
|
+
existing.count += 1;
|
|
75
|
+
existing.issueIds.push(finding.issueId);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
map.set(collisionKey, {
|
|
79
|
+
count: 1,
|
|
80
|
+
scopeKey,
|
|
81
|
+
ruleId: finding.ruleId,
|
|
82
|
+
pageKey: finding.pageKey,
|
|
83
|
+
targetHash: finding.targetHash,
|
|
84
|
+
issueIds: [finding.issueId],
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return Array.from(map.values())
|
|
88
|
+
.filter((entry) => new Set(entry.issueIds).size > 1)
|
|
89
|
+
.sort((left, right) => right.count - left.count);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=normalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalization.js","sourceRoot":"","sources":["../../src/reporter/normalization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DiffResult, TrailmarkRun } from "@trailmark/core";
|
|
2
|
+
export declare function summarizeRunEnvelope(sourceRuns: number, findingsCount: number): void;
|
|
3
|
+
export declare function summarizeScanErrors(scanErrors: TrailmarkRun["scanErrors"]): void;
|
|
4
|
+
export declare function summarizeNewFindings(diff: DiffResult): void;
|
|
5
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/reporter/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAiB1D,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CASpF;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI,CAUhF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CA8D3D"}
|