@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.
Files changed (94) hide show
  1. package/.trailmark/current-run.json +136 -0
  2. package/dist/artifacts/artifactManager.d.ts +31 -0
  3. package/dist/artifacts/artifactManager.d.ts.map +1 -0
  4. package/dist/artifacts/artifactManager.js +140 -0
  5. package/dist/artifacts/artifactManager.js.map +1 -0
  6. package/dist/artifacts/capture.d.ts +4 -0
  7. package/dist/artifacts/capture.d.ts.map +1 -0
  8. package/dist/artifacts/capture.js +16 -0
  9. package/dist/artifacts/capture.js.map +1 -0
  10. package/dist/artifacts/options.d.ts +11 -0
  11. package/dist/artifacts/options.d.ts.map +1 -0
  12. package/dist/artifacts/options.js +55 -0
  13. package/dist/artifacts/options.js.map +1 -0
  14. package/dist/artifacts/registry.d.ts +24 -0
  15. package/dist/artifacts/registry.d.ts.map +1 -0
  16. package/dist/artifacts/registry.js +99 -0
  17. package/dist/artifacts/registry.js.map +1 -0
  18. package/dist/constants.d.ts +2 -0
  19. package/dist/constants.d.ts.map +1 -0
  20. package/dist/constants.js +5 -0
  21. package/dist/constants.js.map +1 -0
  22. package/dist/fixture.d.ts +7 -0
  23. package/dist/fixture.d.ts.map +1 -0
  24. package/dist/fixture.js +193 -0
  25. package/dist/fixture.js.map +1 -0
  26. package/dist/index.d.ts +4 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +7 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/mode.d.ts +3 -0
  31. package/dist/mode.d.ts.map +1 -0
  32. package/dist/mode.js +9 -0
  33. package/dist/mode.js.map +1 -0
  34. package/dist/reporter/attachments.d.ts +4 -0
  35. package/dist/reporter/attachments.d.ts.map +1 -0
  36. package/dist/reporter/attachments.js +112 -0
  37. package/dist/reporter/attachments.js.map +1 -0
  38. package/dist/reporter/errors.d.ts +4 -0
  39. package/dist/reporter/errors.d.ts.map +1 -0
  40. package/dist/reporter/errors.js +11 -0
  41. package/dist/reporter/errors.js.map +1 -0
  42. package/dist/reporter/index.d.ts +33 -0
  43. package/dist/reporter/index.d.ts.map +1 -0
  44. package/dist/reporter/index.js +407 -0
  45. package/dist/reporter/index.js.map +1 -0
  46. package/dist/reporter/io.d.ts +15 -0
  47. package/dist/reporter/io.d.ts.map +1 -0
  48. package/dist/reporter/io.js +34 -0
  49. package/dist/reporter/io.js.map +1 -0
  50. package/dist/reporter/normalization.d.ts +13 -0
  51. package/dist/reporter/normalization.d.ts.map +1 -0
  52. package/dist/reporter/normalization.js +91 -0
  53. package/dist/reporter/normalization.js.map +1 -0
  54. package/dist/reporter/output.d.ts +5 -0
  55. package/dist/reporter/output.d.ts.map +1 -0
  56. package/dist/reporter/output.js +90 -0
  57. package/dist/reporter/output.js.map +1 -0
  58. package/dist/reporter/run.d.ts +4 -0
  59. package/dist/reporter/run.d.ts.map +1 -0
  60. package/dist/reporter/run.js +18 -0
  61. package/dist/reporter/run.js.map +1 -0
  62. package/dist/types.d.ts +48 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +3 -0
  65. package/dist/types.js.map +1 -0
  66. package/integration/app/base.html +16 -0
  67. package/integration/app/extra.html +17 -0
  68. package/integration/playwright.config.ts +44 -0
  69. package/integration/specs/sample.spec.ts +15 -0
  70. package/integration/tmp/baseline.json +46 -0
  71. package/integration/tmp/report.json +97 -0
  72. package/package.json +35 -0
  73. package/src/artifacts/artifactManager.ts +178 -0
  74. package/src/artifacts/capture.ts +18 -0
  75. package/src/artifacts/options.ts +79 -0
  76. package/src/artifacts/registry.ts +143 -0
  77. package/src/constants.ts +1 -0
  78. package/src/fixture.ts +239 -0
  79. package/src/index.ts +3 -0
  80. package/src/mode.ts +7 -0
  81. package/src/reporter/attachments.ts +139 -0
  82. package/src/reporter/errors.ts +6 -0
  83. package/src/reporter/index.ts +572 -0
  84. package/src/reporter/io.ts +33 -0
  85. package/src/reporter/normalization.ts +122 -0
  86. package/src/reporter/output.ts +103 -0
  87. package/src/reporter/run.ts +17 -0
  88. package/src/types.ts +53 -0
  89. package/test/artifactManager.unit.test.ts +141 -0
  90. package/test/reporter.integration.test.ts +153 -0
  91. package/test/reporter.unit.test.ts +337 -0
  92. package/test-results/.last-run.json +4 -0
  93. package/trailmark-playwright-0.1.0.tgz +0 -0
  94. 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"}