@testivai/witness 1.4.0 → 1.7.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/dist/baselines/store.d.ts.map +1 -1
- package/dist/baselines/store.js +13 -0
- package/dist/baselines/store.js.map +1 -1
- package/dist/bin/testivai.js +6 -1
- package/dist/bin/testivai.js.map +1 -1
- package/dist/commands/approve.d.ts.map +1 -1
- package/dist/commands/approve.js +33 -11
- package/dist/commands/approve.js.map +1 -1
- package/dist/commands/exit-codes.d.ts +22 -0
- package/dist/commands/exit-codes.d.ts.map +1 -0
- package/dist/commands/exit-codes.js +17 -0
- package/dist/commands/exit-codes.js.map +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +74 -11
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/report.d.ts +10 -0
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +41 -14
- package/dist/commands/report.js.map +1 -1
- package/dist/diff/attribution.d.ts +88 -0
- package/dist/diff/attribution.d.ts.map +1 -0
- package/dist/diff/attribution.js +189 -0
- package/dist/diff/attribution.js.map +1 -0
- package/dist/report/compare.d.ts.map +1 -1
- package/dist/report/compare.js +35 -0
- package/dist/report/compare.js.map +1 -1
- package/dist/report/results.d.ts +23 -4
- package/dist/report/results.d.ts.map +1 -1
- package/dist/report/template.d.ts.map +1 -1
- package/dist/report/template.js +50 -3
- package/dist/report/template.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/baselines/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ,CAAC,WAAW;IAHxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEJ,WAAW,EAAE,MAAM;IAKhD;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK7B;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQjC;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IASnD;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAuBjG;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMpC;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/baselines/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ,CAAC,WAAW;IAHxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEJ,WAAW,EAAE,MAAM;IAKhD;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK7B;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQjC;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IASnD;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAuBjG;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMpC;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA8D3B;;;OAGG;IACH,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAmBnC;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAsCxB;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAUhB;;;;;OAKG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAS/D;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQrC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMxC;;OAEG;IACH,QAAQ,IAAI,MAAM,EAAE;IAUpB;;OAEG;IACH,SAAS,IAAI,IAAI;IAQjB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIpC,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI/C,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI7C,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIxC,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI3C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIpC,eAAe,IAAI,MAAM;IAIzB,UAAU,IAAI,MAAM;CAGrB"}
|
package/dist/baselines/store.js
CHANGED
|
@@ -136,6 +136,8 @@ class BaselineStore {
|
|
|
136
136
|
const currentMetadata = this.getBaselineMetadataPath(name);
|
|
137
137
|
const currentDom = this.getBaselineDomPath(name);
|
|
138
138
|
const tempDom = this.getTempDomPath(name);
|
|
139
|
+
const currentElements = path.join(this.getBaselineDir(name), 'elements.json');
|
|
140
|
+
const tempElements = path.join(this.getTempDir(), name, 'elements.json');
|
|
139
141
|
// Backup current baseline if it exists
|
|
140
142
|
if (fs.existsSync(currentScreenshot)) {
|
|
141
143
|
fs.mkdirSync(previousDir, { recursive: true });
|
|
@@ -146,6 +148,9 @@ class BaselineStore {
|
|
|
146
148
|
if (fs.existsSync(currentDom)) {
|
|
147
149
|
fs.copyFileSync(currentDom, path.join(previousDir, 'dom.html'));
|
|
148
150
|
}
|
|
151
|
+
if (fs.existsSync(currentElements)) {
|
|
152
|
+
fs.copyFileSync(currentElements, path.join(previousDir, 'elements.json'));
|
|
153
|
+
}
|
|
149
154
|
}
|
|
150
155
|
// Copy temp to baseline
|
|
151
156
|
fs.mkdirSync(baselineDir, { recursive: true });
|
|
@@ -158,6 +163,14 @@ class BaselineStore {
|
|
|
158
163
|
// than keep an inconsistent pair.
|
|
159
164
|
fs.rmSync(currentDom);
|
|
160
165
|
}
|
|
166
|
+
if (fs.existsSync(tempElements)) {
|
|
167
|
+
fs.copyFileSync(tempElements, currentElements);
|
|
168
|
+
}
|
|
169
|
+
else if (fs.existsSync(currentElements)) {
|
|
170
|
+
// Same stale-drop semantics as dom.html: an element map from an
|
|
171
|
+
// older approval must not attribute regions against a new baseline.
|
|
172
|
+
fs.rmSync(currentElements);
|
|
173
|
+
}
|
|
161
174
|
// Update metadata
|
|
162
175
|
const now = new Date().toISOString();
|
|
163
176
|
const existingMeta = this.readMetadata(name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/baselines/store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/baselines/store.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/testivai.js
CHANGED
|
@@ -26,7 +26,12 @@ program
|
|
|
26
26
|
.description('TestivAI Witness SDK - Framework-agnostic visual regression testing')
|
|
27
27
|
.version(packageJson.version, '-V, --version', 'Display version number')
|
|
28
28
|
.hook('preAction', () => {
|
|
29
|
-
|
|
29
|
+
// Keep stdout clean for machine-readable output: no banner under --json
|
|
30
|
+
// (or --quiet/-q). Agents parse stdout as a single JSON document.
|
|
31
|
+
const quiet = process.argv.includes('--quiet') ||
|
|
32
|
+
process.argv.includes('-q') ||
|
|
33
|
+
process.argv.includes('--json');
|
|
34
|
+
if (!quiet) {
|
|
30
35
|
showBanner();
|
|
31
36
|
}
|
|
32
37
|
});
|
package/dist/bin/testivai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testivai.js","sourceRoot":"","sources":["../../src/bin/testivai.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,2CAA+C;AAC/C,2CAA+C;AAC/C,yCAA6C;AAC7C,iDAAqD;AACrD,iDAAqD;AACrD,+CAAmD;AAEnD,MAAM,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,iBAAiB;AACjB,MAAM,UAAU,GAAG,GAAG,EAAE;IACtB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC;AAEF,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,qEAAqE,CAAC;KAClF,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,wBAAwB,CAAC;KACvE,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IACtB,
|
|
1
|
+
{"version":3,"file":"testivai.js","sourceRoot":"","sources":["../../src/bin/testivai.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,2CAA+C;AAC/C,2CAA+C;AAC/C,yCAA6C;AAC7C,iDAAqD;AACrD,iDAAqD;AACrD,+CAAmD;AAEnD,MAAM,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,iBAAiB;AACjB,MAAM,UAAU,GAAG,GAAG,EAAE;IACtB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC;AAEF,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,qEAAqE,CAAC;KAClF,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,wBAAwB,CAAC;KACvE,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IACtB,wEAAwE;IACxE,kEAAkE;IAClE,MAAM,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,EAAE,CAAC;IACf,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,iBAAiB;AACjB,OAAO;KACJ,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC;KAChD,MAAM,CAAC,aAAa,EAAE,gCAAgC,CAAC;KACvD,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;AAE1C,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,gBAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAElC,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,mCAAmC;AACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,cAAc,SA2HvB,CAAC"}
|
package/dist/commands/approve.js
CHANGED
|
@@ -14,6 +14,7 @@ exports.approveCommand = new commander_1.Command('approve')
|
|
|
14
14
|
.option('--all', 'Approve all changed/new snapshots')
|
|
15
15
|
.option('--undo', 'Undo the last approval (restore previous baseline)')
|
|
16
16
|
.option('--dry-run', 'Show what would be approved without modifying any files')
|
|
17
|
+
.option('--json', 'Print a machine-readable result to stdout instead of the pretty output')
|
|
17
18
|
.action(async (name, options) => {
|
|
18
19
|
try {
|
|
19
20
|
const cwd = process.cwd();
|
|
@@ -61,34 +62,55 @@ exports.approveCommand = new commander_1.Command('approve')
|
|
|
61
62
|
if (options.all) {
|
|
62
63
|
const tempNames = store.listTemp();
|
|
63
64
|
if (tempNames.length === 0) {
|
|
64
|
-
|
|
65
|
+
if (options.json)
|
|
66
|
+
process.stdout.write(JSON.stringify({ approved: [], failed: [] }) + '\n');
|
|
67
|
+
else
|
|
68
|
+
console.log(chalk_1.default.yellow(' No temp snapshots found. Run your tests first.'));
|
|
65
69
|
return;
|
|
66
70
|
}
|
|
67
|
-
|
|
71
|
+
const approvedNames = [];
|
|
72
|
+
const failed = [];
|
|
68
73
|
for (const snapName of tempNames) {
|
|
69
74
|
try {
|
|
70
75
|
store.approve(snapName);
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
approvedNames.push(snapName);
|
|
77
|
+
if (!options.json)
|
|
78
|
+
console.log(chalk_1.default.green(` ✓ Approved: ${snapName}`));
|
|
73
79
|
}
|
|
74
80
|
catch (err) {
|
|
75
|
-
|
|
81
|
+
failed.push({ name: snapName, error: err.message });
|
|
82
|
+
if (!options.json)
|
|
83
|
+
logger_1.logger.error(` ✗ Failed to approve "${snapName}": ${err.message}`);
|
|
76
84
|
}
|
|
77
85
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
86
|
+
if (options.json) {
|
|
87
|
+
process.stdout.write(JSON.stringify({ approved: approvedNames, failed }) + '\n');
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.log();
|
|
91
|
+
console.log(chalk_1.default.cyan(` ${approvedNames.length}/${tempNames.length} snapshot(s) approved.`));
|
|
92
|
+
console.log(chalk_1.default.gray(' git add .testivai/baselines/'));
|
|
93
|
+
}
|
|
94
|
+
if (failed.length > 0)
|
|
95
|
+
process.exitCode = 1;
|
|
81
96
|
return;
|
|
82
97
|
}
|
|
83
98
|
// ── Approve specific name ─────────────────────────────────────────────
|
|
84
99
|
if (name) {
|
|
85
100
|
try {
|
|
86
101
|
store.approve(name);
|
|
87
|
-
|
|
88
|
-
|
|
102
|
+
if (options.json)
|
|
103
|
+
process.stdout.write(JSON.stringify({ approved: [name], failed: [] }) + '\n');
|
|
104
|
+
else {
|
|
105
|
+
console.log(chalk_1.default.green(` ✓ Approved: ${name}`));
|
|
106
|
+
console.log(chalk_1.default.gray(` git add .testivai/baselines/${name}/`));
|
|
107
|
+
}
|
|
89
108
|
}
|
|
90
109
|
catch (err) {
|
|
91
|
-
|
|
110
|
+
if (options.json)
|
|
111
|
+
process.stdout.write(JSON.stringify({ approved: [], failed: [{ name, error: err.message }] }) + '\n');
|
|
112
|
+
else
|
|
113
|
+
logger_1.logger.error(err.message);
|
|
92
114
|
process.exit(1);
|
|
93
115
|
}
|
|
94
116
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAmD;AACnD,4CAAyC;AAE5B,QAAA,cAAc,GAAG,IAAI,mBAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,2CAA2C,CAAC;KACxD,QAAQ,CAAC,QAAQ,EAAE,sDAAsD,CAAC;KAC1E,MAAM,CAAC,OAAO,EAAE,mCAAmC,CAAC;KACpD,MAAM,CAAC,QAAQ,EAAE,oDAAoD,CAAC;KACtE,MAAM,CAAC,WAAW,EAAE,yDAAyD,CAAC;KAC9E,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,
|
|
1
|
+
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAmD;AACnD,4CAAyC;AAE5B,QAAA,cAAc,GAAG,IAAI,mBAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,2CAA2C,CAAC;KACxD,QAAQ,CAAC,QAAQ,EAAE,sDAAsD,CAAC;KAC1E,MAAM,CAAC,OAAO,EAAE,mCAAmC,CAAC;KACpD,MAAM,CAAC,QAAQ,EAAE,oDAAoD,CAAC;KACtE,MAAM,CAAC,WAAW,EAAE,yDAAyD,CAAC;KAC9E,MAAM,CAAC,QAAQ,EAAE,wEAAwE,CAAC;KAC1F,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAA4E,EAAE,EAAE;IACvH,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,qBAAa,CAAC,GAAG,CAAC,CAAC;QAErC,yEAAyE;QACzE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,IAAI,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;YACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,CAAC;gBACnE,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uCAAuC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,eAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QAED,yEAAyE;QACzE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,IAAI,EAAE,CAAC;gBACT,oCAAoC;gBACpC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBAClC,eAAM,CAAC,KAAK,CAAC,iCAAiC,IAAI,0BAA0B,CAAC,CAAC;oBAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;gBAC9E,OAAO;YACT,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,IAAI,OAAO,CAAC,IAAI;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;;oBACvF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;gBACnF,OAAO;YACT,CAAC;YAED,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,MAAM,MAAM,GAA2C,EAAE,CAAC;YAC1D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACxB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC7B,IAAI,CAAC,OAAO,CAAC,IAAI;wBAAE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC3E,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACpD,IAAI,CAAC,OAAO,CAAC,IAAI;wBAAE,eAAM,CAAC,KAAK,CAAC,0BAA0B,QAAQ,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACnF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,wBAAwB,CAAC,CAAC,CAAC;gBAC/F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,yEAAyE;QACzE,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACpB,IAAI,OAAO,CAAC,IAAI;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;qBAC3F,CAAC;oBACJ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC;oBAClD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,IAAI,GAAG,CAAC,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,OAAO,CAAC,IAAI;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;;oBACnH,eAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC/D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAEtE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,eAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `testivai report` exit-code contract (public, agent-facing).
|
|
3
|
+
*
|
|
4
|
+
* 0 pass — no changes (and no new snapshots, or --allow-new)
|
|
5
|
+
* 1 changed — at least one snapshot differs from its baseline
|
|
6
|
+
* 2 new-only — no changes, but new snapshots exist (no baseline yet)
|
|
7
|
+
*
|
|
8
|
+
* Codes are only enforced when the gate is on (`--fail-on-diff` or config
|
|
9
|
+
* `failOnDiff`); otherwise the command is report-only and exits 0.
|
|
10
|
+
*/
|
|
11
|
+
export interface ExitSummary {
|
|
12
|
+
changed: number;
|
|
13
|
+
newSnapshots: number;
|
|
14
|
+
}
|
|
15
|
+
export declare const EXIT_PASS = 0;
|
|
16
|
+
export declare const EXIT_CHANGED = 1;
|
|
17
|
+
export declare const EXIT_NEW_ONLY = 2;
|
|
18
|
+
export declare function reportExitCode(summary: ExitSummary, opts: {
|
|
19
|
+
gate: boolean;
|
|
20
|
+
allowNew?: boolean;
|
|
21
|
+
}): number;
|
|
22
|
+
//# sourceMappingURL=exit-codes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/commands/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1C,MAAM,CAKR"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EXIT_NEW_ONLY = exports.EXIT_CHANGED = exports.EXIT_PASS = void 0;
|
|
4
|
+
exports.reportExitCode = reportExitCode;
|
|
5
|
+
exports.EXIT_PASS = 0;
|
|
6
|
+
exports.EXIT_CHANGED = 1;
|
|
7
|
+
exports.EXIT_NEW_ONLY = 2;
|
|
8
|
+
function reportExitCode(summary, opts) {
|
|
9
|
+
if (!opts.gate)
|
|
10
|
+
return exports.EXIT_PASS;
|
|
11
|
+
if (summary.changed > 0)
|
|
12
|
+
return exports.EXIT_CHANGED;
|
|
13
|
+
if (summary.newSnapshots > 0 && !opts.allowNew)
|
|
14
|
+
return exports.EXIT_NEW_ONLY;
|
|
15
|
+
return exports.EXIT_PASS;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=exit-codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/commands/exit-codes.ts"],"names":[],"mappings":";;;AAmBA,wCAQC;AAZY,QAAA,SAAS,GAAG,CAAC,CAAC;AACd,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,aAAa,GAAG,CAAC,CAAC;AAE/B,SAAgB,cAAc,CAC5B,OAAoB,EACpB,IAA2C;IAE3C,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,iBAAS,CAAC;IACjC,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC;QAAE,OAAO,oBAAY,CAAC;IAC7C,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,qBAAa,CAAC;IACrE,OAAO,iBAAS,CAAC;AACnB,CAAC"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
export declare function isPlaywrightProject(cwd: string): boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Scaffold a Playwright + local-mode project: `.testivai/config.json`
|
|
5
|
+
* (mode: local), the baselines directory, and the .gitignore entries.
|
|
6
|
+
*
|
|
7
|
+
* This is the local-first, no-account setup — deliberately NOT the CDP
|
|
8
|
+
* `browserPort` sidecar config, which does not apply to the Playwright
|
|
9
|
+
* reporter flow. Idempotent: an existing config is left untouched unless
|
|
10
|
+
* `force` is set. Returns the list of paths created/updated.
|
|
11
|
+
*/
|
|
12
|
+
export declare function scaffoldPlaywrightLocal(cwd: string, force?: boolean): string[];
|
|
2
13
|
export declare const initCommand: Command;
|
|
3
14
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuEpC,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAcxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,MAAM,EAAE,CA+B5E;AAYD,eAAO,MAAM,WAAW,SA4NpB,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -37,6 +37,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.initCommand = void 0;
|
|
40
|
+
exports.isPlaywrightProject = isPlaywrightProject;
|
|
41
|
+
exports.scaffoldPlaywrightLocal = scaffoldPlaywrightLocal;
|
|
40
42
|
const commander_1 = require("commander");
|
|
41
43
|
const chalk_1 = __importDefault(require("chalk"));
|
|
42
44
|
const fs = __importStar(require("fs"));
|
|
@@ -114,6 +116,44 @@ function isPlaywrightProject(cwd) {
|
|
|
114
116
|
return false;
|
|
115
117
|
}
|
|
116
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Scaffold a Playwright + local-mode project: `.testivai/config.json`
|
|
121
|
+
* (mode: local), the baselines directory, and the .gitignore entries.
|
|
122
|
+
*
|
|
123
|
+
* This is the local-first, no-account setup — deliberately NOT the CDP
|
|
124
|
+
* `browserPort` sidecar config, which does not apply to the Playwright
|
|
125
|
+
* reporter flow. Idempotent: an existing config is left untouched unless
|
|
126
|
+
* `force` is set. Returns the list of paths created/updated.
|
|
127
|
+
*/
|
|
128
|
+
function scaffoldPlaywrightLocal(cwd, force = false) {
|
|
129
|
+
const created = [];
|
|
130
|
+
if (force || !(0, local_config_1.localConfigExists)(cwd)) {
|
|
131
|
+
(0, local_config_1.createDefaultConfig)(cwd, { mode: 'local' });
|
|
132
|
+
created.push('.testivai/config.json');
|
|
133
|
+
}
|
|
134
|
+
// Race-free: mkdir recursive never throws on an existing dir and returns the
|
|
135
|
+
// first path it created (undefined if it already existed) — no check-then-act.
|
|
136
|
+
const baselinesDir = path.join(cwd, '.testivai', 'baselines');
|
|
137
|
+
if (fs.mkdirSync(baselinesDir, { recursive: true })) {
|
|
138
|
+
created.push('.testivai/baselines/');
|
|
139
|
+
}
|
|
140
|
+
// Race-free: read-or-empty instead of exists-then-read; appendFileSync
|
|
141
|
+
// creates the file when it's absent, so no separate write branch is needed.
|
|
142
|
+
const gitignorePath = path.join(cwd, '.gitignore');
|
|
143
|
+
const block = '\n# TestivAI local mode\n.testivai/temp/\nvisual-report/\n';
|
|
144
|
+
let existing = '';
|
|
145
|
+
try {
|
|
146
|
+
existing = fs.readFileSync(gitignorePath, 'utf-8');
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
existing = '';
|
|
150
|
+
}
|
|
151
|
+
if (!existing.includes('.testivai/temp/')) {
|
|
152
|
+
fs.appendFileSync(gitignorePath, block);
|
|
153
|
+
created.push('.gitignore');
|
|
154
|
+
}
|
|
155
|
+
return created;
|
|
156
|
+
}
|
|
117
157
|
function printBox(lines) {
|
|
118
158
|
const width = Math.max(...lines.map((l) => l.length)) + 4;
|
|
119
159
|
console.log(chalk_1.default.cyan(' ┌' + '─'.repeat(width) + '┐'));
|
|
@@ -127,9 +167,43 @@ exports.initCommand = new commander_1.Command('init')
|
|
|
127
167
|
.description('Initialize TestivAI Witness SDK in your project')
|
|
128
168
|
.option('-f, --force', 'Overwrite existing configuration files')
|
|
129
169
|
.option('-y, --yes', 'Skip prompts and use auto-detected framework')
|
|
170
|
+
.option('--json', 'Print a machine-readable result to stdout (Playwright projects)')
|
|
130
171
|
.action(async (options) => {
|
|
131
172
|
try {
|
|
132
173
|
const cwd = process.cwd();
|
|
174
|
+
// ── Playwright projects: dedicated reporter + local mode ──────────────
|
|
175
|
+
// Detect FIRST — before --yes / framework detection — so a Playwright
|
|
176
|
+
// repo always gets the reporter flow and .testivai/config.json, never
|
|
177
|
+
// the CDP browserPort sidecar config.
|
|
178
|
+
if (isPlaywrightProject(cwd)) {
|
|
179
|
+
const created = scaffoldPlaywrightLocal(cwd, options.force ?? false);
|
|
180
|
+
if (options.json) {
|
|
181
|
+
process.stdout.write(JSON.stringify({ framework: 'playwright', mode: 'local', created }) + '\n');
|
|
182
|
+
return; // exit 0
|
|
183
|
+
}
|
|
184
|
+
console.log();
|
|
185
|
+
console.log(chalk_1.default.green.bold(' ✓ TestivAI is set up for Playwright (local mode).'));
|
|
186
|
+
if (created.length > 0) {
|
|
187
|
+
created.forEach((f) => console.log(chalk_1.default.green(` ✓ ${f}`)));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
console.log(chalk_1.default.gray(' (already configured — nothing to change)'));
|
|
191
|
+
}
|
|
192
|
+
console.log();
|
|
193
|
+
console.log(chalk_1.default.cyan(' 1. Add the reporter to playwright.config.ts:'));
|
|
194
|
+
console.log(chalk_1.default.gray(' reporter: [') + chalk_1.default.white("['list'], ['@testivai/witness-playwright/reporter']") + chalk_1.default.gray('],'));
|
|
195
|
+
console.log();
|
|
196
|
+
console.log(chalk_1.default.cyan(' 2. Capture a snapshot in a test:'));
|
|
197
|
+
console.log(chalk_1.default.gray(" import { snapshot } from '@testivai/witness-playwright';"));
|
|
198
|
+
console.log(chalk_1.default.gray(" await snapshot(page, testInfo, 'homepage');"));
|
|
199
|
+
console.log();
|
|
200
|
+
console.log(chalk_1.default.cyan(' 3. Run, review, approve:'));
|
|
201
|
+
console.log(chalk_1.default.gray(' npx playwright test'));
|
|
202
|
+
console.log(chalk_1.default.gray(' open visual-report/index.html'));
|
|
203
|
+
console.log(chalk_1.default.gray(' npx testivai approve --all # then commit .testivai/baselines/'));
|
|
204
|
+
console.log();
|
|
205
|
+
return; // exit 0
|
|
206
|
+
}
|
|
133
207
|
// ── Auto-detect mode (--yes flag) ─────────────────────────────────────
|
|
134
208
|
if (options.yes) {
|
|
135
209
|
logger_1.logger.info('Initializing TestivAI Witness SDK...');
|
|
@@ -154,17 +228,6 @@ ${chalk_1.default.gray('For more information, see: https://docs.testiv.ai')}
|
|
|
154
228
|
logger_1.logger.success('Initialization complete!');
|
|
155
229
|
return;
|
|
156
230
|
}
|
|
157
|
-
// ── Playwright early-exit ──────────────────────────────────────────────
|
|
158
|
-
if (isPlaywrightProject(cwd)) {
|
|
159
|
-
console.log();
|
|
160
|
-
console.log(chalk_1.default.yellow('⚠ Playwright detected in this project.'));
|
|
161
|
-
console.log();
|
|
162
|
-
console.log('For Playwright, use the dedicated SDK instead:');
|
|
163
|
-
console.log(chalk_1.default.cyan(' npm install @testivai/witness-playwright'));
|
|
164
|
-
console.log(chalk_1.default.gray(' Docs: https://testiv.ai/docs#playwright'));
|
|
165
|
-
console.log();
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
231
|
// ── Interactive wizard ─────────────────────────────────────────────────
|
|
169
232
|
console.log();
|
|
170
233
|
console.log(chalk_1.default.cyan.bold(' ╔══════════════════════════════════════╗'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,16 @@ import { Command } from 'commander';
|
|
|
9
9
|
* then shells out to this command for diffing, tolerances, the report, and
|
|
10
10
|
* CI exit codes. The JS adapters call generateReport() in-process; this is
|
|
11
11
|
* the same pipeline behind a CLI.
|
|
12
|
+
*
|
|
13
|
+
* Exit codes (a public contract, applied when the gate is on — `--fail-on-diff`
|
|
14
|
+
* or config `failOnDiff`):
|
|
15
|
+
* 0 pass — nothing changed (and no new snapshots, unless --allow-new)
|
|
16
|
+
* 1 changed — at least one snapshot differs from its baseline
|
|
17
|
+
* 2 new-only — no changes, but new snapshots exist (no baseline yet).
|
|
18
|
+
* Distinct from failures so first runs / added tests aren't
|
|
19
|
+
* mistaken for regressions. Pass `--allow-new` to treat new
|
|
20
|
+
* snapshots as passing (exit 0).
|
|
21
|
+
* Without the gate, the command always exits 0 (report-only).
|
|
12
22
|
*/
|
|
13
23
|
export declare const reportCommand: Command;
|
|
14
24
|
//# sourceMappingURL=report.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa,SA6DtB,CAAC"}
|
package/dist/commands/report.js
CHANGED
|
@@ -9,6 +9,7 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
9
9
|
const generator_1 = require("../report/generator");
|
|
10
10
|
const local_config_1 = require("../config/local-config");
|
|
11
11
|
const logger_1 = require("../utils/logger");
|
|
12
|
+
const exit_codes_1 = require("./exit-codes");
|
|
12
13
|
/**
|
|
13
14
|
* `testivai report` — compare temp captures against baselines and write the
|
|
14
15
|
* HTML report + results.json.
|
|
@@ -19,11 +20,23 @@ const logger_1 = require("../utils/logger");
|
|
|
19
20
|
* then shells out to this command for diffing, tolerances, the report, and
|
|
20
21
|
* CI exit codes. The JS adapters call generateReport() in-process; this is
|
|
21
22
|
* the same pipeline behind a CLI.
|
|
23
|
+
*
|
|
24
|
+
* Exit codes (a public contract, applied when the gate is on — `--fail-on-diff`
|
|
25
|
+
* or config `failOnDiff`):
|
|
26
|
+
* 0 pass — nothing changed (and no new snapshots, unless --allow-new)
|
|
27
|
+
* 1 changed — at least one snapshot differs from its baseline
|
|
28
|
+
* 2 new-only — no changes, but new snapshots exist (no baseline yet).
|
|
29
|
+
* Distinct from failures so first runs / added tests aren't
|
|
30
|
+
* mistaken for regressions. Pass `--allow-new` to treat new
|
|
31
|
+
* snapshots as passing (exit 0).
|
|
32
|
+
* Without the gate, the command always exits 0 (report-only).
|
|
22
33
|
*/
|
|
23
34
|
exports.reportCommand = new commander_1.Command('report')
|
|
24
35
|
.description('Compare captured temp snapshots against baselines and generate the visual report. ' +
|
|
25
36
|
'For non-JS adapters: write .testivai/temp/<name>/screenshot.png (+ dom.html), then run this.')
|
|
26
|
-
.option('--fail-on-diff', 'Exit non-zero
|
|
37
|
+
.option('--fail-on-diff', 'Exit non-zero on changes (1) / new-only (2); overrides config failOnDiff')
|
|
38
|
+
.option('--allow-new', 'Treat new snapshots as passing (exit 0) — for first runs before baselines exist')
|
|
39
|
+
.option('--json', 'Print the machine-readable results.json payload to stdout instead of the pretty summary')
|
|
27
40
|
.option('--open', 'Open the HTML report in a browser (overrides config autoOpen)')
|
|
28
41
|
.action(async (options) => {
|
|
29
42
|
try {
|
|
@@ -33,28 +46,42 @@ exports.reportCommand = new commander_1.Command('report')
|
|
|
33
46
|
projectRoot,
|
|
34
47
|
reportDir: config.reportDir ?? 'visual-report',
|
|
35
48
|
threshold: config.threshold,
|
|
36
|
-
|
|
49
|
+
// Never pop a browser open while emitting machine output.
|
|
50
|
+
autoOpen: options.json ? false : (options.open ?? config.autoOpen),
|
|
37
51
|
// NOTE: `version` here is the results.json SCHEMA version (a public
|
|
38
52
|
// contract), not the package version — conflating them shipped
|
|
39
53
|
// results.json files labeled 1.3.1. Omitted → schema default.
|
|
40
54
|
});
|
|
41
55
|
const { summary } = report;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
console.log(chalk_1.default.gray(` Review: ${config.reportDir ?? 'visual-report'}/index.html — approve with: npx testivai approve <name>`));
|
|
56
|
+
// Exit-code contract (only enforced when the gate is on).
|
|
57
|
+
const gate = options.failOnDiff ?? config.failOnDiff ?? false;
|
|
58
|
+
const exitCode = (0, exit_codes_1.reportExitCode)(summary, { gate, allowNew: options.allowNew });
|
|
59
|
+
if (options.json) {
|
|
60
|
+
// `report` IS the results.json schema — emit it verbatim so agents get
|
|
61
|
+
// one stable, parseable contract (summary + per-snapshot regions).
|
|
62
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
50
63
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
64
|
+
else {
|
|
65
|
+
console.log();
|
|
66
|
+
console.log(chalk_1.default.cyan.bold(' ═══ TestivAI Visual Report ═══'));
|
|
67
|
+
console.log(` Total: ${summary.total} | Passed: ${summary.passed} | Changed: ${summary.changed} | New: ${summary.newSnapshots}`);
|
|
68
|
+
if (summary.newSnapshots > 0) {
|
|
69
|
+
console.log(chalk_1.default.gray(' New baselines: npx testivai approve --all (then commit .testivai/baselines/)'));
|
|
70
|
+
}
|
|
71
|
+
if (summary.changed > 0) {
|
|
72
|
+
console.log(chalk_1.default.gray(` Review: ${config.reportDir ?? 'visual-report'}/index.html — approve with: npx testivai approve <name>`));
|
|
73
|
+
}
|
|
54
74
|
}
|
|
75
|
+
// exitCode is already 0 when the gate is off (report-only).
|
|
76
|
+
process.exitCode = exitCode;
|
|
55
77
|
}
|
|
56
78
|
catch (error) {
|
|
57
|
-
|
|
79
|
+
if (options.json) {
|
|
80
|
+
process.stdout.write(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }) + '\n');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
logger_1.logger.error('Report generation failed:', error);
|
|
84
|
+
}
|
|
58
85
|
process.exit(1);
|
|
59
86
|
}
|
|
60
87
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,mDAAqD;AACrD,yDAAyD;AACzD,4CAAyC;
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestivAI Diff Engine — Element attribution + shift classification
|
|
3
|
+
*
|
|
4
|
+
* Adapters capture an element map alongside each screenshot
|
|
5
|
+
* (`elements.json`: [{path, x, y, width, height, styleHash}], document
|
|
6
|
+
* coordinates). Attribution intersects clustered diff regions with the
|
|
7
|
+
* map to answer the reviewer's real question: WHICH element changed?
|
|
8
|
+
*
|
|
9
|
+
* Shift classification is layout-derived, not pixel math: an element
|
|
10
|
+
* present in both maps with the same size and the same computed-style
|
|
11
|
+
* digest but a different position is a pure translation — (dx, dy) is
|
|
12
|
+
* exact. A moved element's diff region spans its old AND new position,
|
|
13
|
+
* so region↔element matching scores against the union of the baseline
|
|
14
|
+
* and candidate rects.
|
|
15
|
+
*
|
|
16
|
+
* Everything degrades gracefully: no maps → regions pass through
|
|
17
|
+
* untouched (image-only inputs, older captures, adapters without
|
|
18
|
+
* element-map support yet).
|
|
19
|
+
*/
|
|
20
|
+
import { DiffRegion } from './types';
|
|
21
|
+
export interface ElementMapEntry {
|
|
22
|
+
/** Deterministic CSS-ish path (tag.class:nth-of-type chain). */
|
|
23
|
+
path: string;
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
/** Digest of a normalized computed-style subset (adapter-generated). */
|
|
29
|
+
styleHash: string;
|
|
30
|
+
}
|
|
31
|
+
export interface RegionElement {
|
|
32
|
+
selector: string;
|
|
33
|
+
role: 'shifted' | 'changed';
|
|
34
|
+
}
|
|
35
|
+
/** DiffRegion augmented with attribution (all fields additive/optional). */
|
|
36
|
+
export interface AttributedRegion extends DiffRegion {
|
|
37
|
+
/** Elements this region maps to, smallest first (max 3). */
|
|
38
|
+
elements?: RegionElement[];
|
|
39
|
+
/** 'shift' = pure translation of the primary element; else 'change'. */
|
|
40
|
+
classification?: 'shift' | 'change';
|
|
41
|
+
/** Exact displacement when classification is 'shift'. */
|
|
42
|
+
shift?: {
|
|
43
|
+
dx: number;
|
|
44
|
+
dy: number;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export interface PageShift {
|
|
48
|
+
/** Uniform vertical displacement in px. */
|
|
49
|
+
dy: number;
|
|
50
|
+
/** Everything at or below this baseline y moved. */
|
|
51
|
+
belowY: number;
|
|
52
|
+
/** How many elements moved together. */
|
|
53
|
+
count: number;
|
|
54
|
+
}
|
|
55
|
+
/** Parse an element map, dropping malformed entries. Never throws. */
|
|
56
|
+
export declare function parseElementMap(raw: unknown): ElementMapEntry[];
|
|
57
|
+
/**
|
|
58
|
+
* Attribute diff regions to elements and classify pure translations.
|
|
59
|
+
*
|
|
60
|
+
* Matching: a candidate element matches a region when the union of its
|
|
61
|
+
* baseline and candidate rects covers ≥50% of the region, or contains
|
|
62
|
+
* the region's center. The primary element is the smallest match; its
|
|
63
|
+
* role decides the region's classification.
|
|
64
|
+
*/
|
|
65
|
+
export declare function attributeRegions(regions: DiffRegion[], baselineMap: ElementMapEntry[], candidateMap: ElementMapEntry[]): AttributedRegion[];
|
|
66
|
+
export interface StyleComparison {
|
|
67
|
+
status: 'match' | 'mismatch' | 'unavailable';
|
|
68
|
+
/** Paths whose computed-style digest changed (mismatch only). */
|
|
69
|
+
changed: string[];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Compare computed-style digests between the two element maps.
|
|
73
|
+
*
|
|
74
|
+
* Only paths present on BOTH sides are compared — structural additions
|
|
75
|
+
* and removals are the DOM diff's job, not the style fingerprint's.
|
|
76
|
+
* Either side missing a map → 'unavailable' (the noise hint falls back
|
|
77
|
+
* to its legacy DOM-only behavior, visibly labeled).
|
|
78
|
+
*/
|
|
79
|
+
export declare function compareStyleHashes(baselineMap: ElementMapEntry[], candidateMap: ElementMapEntry[]): StyleComparison;
|
|
80
|
+
/**
|
|
81
|
+
* Whole-page pass: detect "everything below y=N moved by dy" — the
|
|
82
|
+
* classic injected-banner signature. Elements matched by path with
|
|
83
|
+
* identical size and style digest are compared positionally; a dominant
|
|
84
|
+
* group (≥80% of all vertically-moved elements, at least `minElements`)
|
|
85
|
+
* sharing one exact dy with dx=0 is reported.
|
|
86
|
+
*/
|
|
87
|
+
export declare function detectPageShift(baselineMap: ElementMapEntry[], candidateMap: ElementMapEntry[], minElements?: number): PageShift | null;
|
|
88
|
+
//# sourceMappingURL=attribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/diff/attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;CAC7B;AAED,4EAA4E;AAC5E,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,wEAAwE;IACxE,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACpC,yDAAyD;IACzD,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,EAAE,CAyB/D;AAkCD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,UAAU,EAAE,EACrB,WAAW,EAAE,eAAe,EAAE,EAC9B,YAAY,EAAE,eAAe,EAAE,GAC9B,gBAAgB,EAAE,CAmDpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;IAC7C,iEAAiE;IACjE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,eAAe,EAAE,EAC9B,YAAY,EAAE,eAAe,EAAE,GAC9B,eAAe,CAWjB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,eAAe,EAAE,EAC9B,YAAY,EAAE,eAAe,EAAE,EAC/B,WAAW,SAAI,GACd,SAAS,GAAG,IAAI,CAgClB"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TestivAI Diff Engine — Element attribution + shift classification
|
|
4
|
+
*
|
|
5
|
+
* Adapters capture an element map alongside each screenshot
|
|
6
|
+
* (`elements.json`: [{path, x, y, width, height, styleHash}], document
|
|
7
|
+
* coordinates). Attribution intersects clustered diff regions with the
|
|
8
|
+
* map to answer the reviewer's real question: WHICH element changed?
|
|
9
|
+
*
|
|
10
|
+
* Shift classification is layout-derived, not pixel math: an element
|
|
11
|
+
* present in both maps with the same size and the same computed-style
|
|
12
|
+
* digest but a different position is a pure translation — (dx, dy) is
|
|
13
|
+
* exact. A moved element's diff region spans its old AND new position,
|
|
14
|
+
* so region↔element matching scores against the union of the baseline
|
|
15
|
+
* and candidate rects.
|
|
16
|
+
*
|
|
17
|
+
* Everything degrades gracefully: no maps → regions pass through
|
|
18
|
+
* untouched (image-only inputs, older captures, adapters without
|
|
19
|
+
* element-map support yet).
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.parseElementMap = parseElementMap;
|
|
23
|
+
exports.attributeRegions = attributeRegions;
|
|
24
|
+
exports.compareStyleHashes = compareStyleHashes;
|
|
25
|
+
exports.detectPageShift = detectPageShift;
|
|
26
|
+
/** Parse an element map, dropping malformed entries. Never throws. */
|
|
27
|
+
function parseElementMap(raw) {
|
|
28
|
+
if (!Array.isArray(raw))
|
|
29
|
+
return [];
|
|
30
|
+
const out = [];
|
|
31
|
+
for (const item of raw) {
|
|
32
|
+
if (item &&
|
|
33
|
+
typeof item === 'object' &&
|
|
34
|
+
typeof item.path === 'string' &&
|
|
35
|
+
typeof item.x === 'number' &&
|
|
36
|
+
typeof item.y === 'number' &&
|
|
37
|
+
typeof item.width === 'number' &&
|
|
38
|
+
typeof item.height === 'number') {
|
|
39
|
+
const e = item;
|
|
40
|
+
out.push({
|
|
41
|
+
path: e.path,
|
|
42
|
+
x: e.x,
|
|
43
|
+
y: e.y,
|
|
44
|
+
width: e.width,
|
|
45
|
+
height: e.height,
|
|
46
|
+
styleHash: typeof e.styleHash === 'string' ? e.styleHash : '',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
function overlapArea(a, b) {
|
|
53
|
+
const w = Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x);
|
|
54
|
+
const h = Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y);
|
|
55
|
+
return w > 0 && h > 0 ? w * h : 0;
|
|
56
|
+
}
|
|
57
|
+
function containsPoint(r, px, py) {
|
|
58
|
+
return px >= r.x && px < r.x + r.width && py >= r.y && py < r.y + r.height;
|
|
59
|
+
}
|
|
60
|
+
/** Bounding box of two rects. */
|
|
61
|
+
function bbox(a, b) {
|
|
62
|
+
const x = Math.min(a.x, b.x);
|
|
63
|
+
const y = Math.min(a.y, b.y);
|
|
64
|
+
return {
|
|
65
|
+
x,
|
|
66
|
+
y,
|
|
67
|
+
width: Math.max(a.x + a.width, b.x + b.width) - x,
|
|
68
|
+
height: Math.max(a.y + a.height, b.y + b.height) - y,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const MATCH_COVERAGE = 0.5;
|
|
72
|
+
const MAX_ELEMENTS_PER_REGION = 3;
|
|
73
|
+
/**
|
|
74
|
+
* Attribute diff regions to elements and classify pure translations.
|
|
75
|
+
*
|
|
76
|
+
* Matching: a candidate element matches a region when the union of its
|
|
77
|
+
* baseline and candidate rects covers ≥50% of the region, or contains
|
|
78
|
+
* the region's center. The primary element is the smallest match; its
|
|
79
|
+
* role decides the region's classification.
|
|
80
|
+
*/
|
|
81
|
+
function attributeRegions(regions, baselineMap, candidateMap) {
|
|
82
|
+
if (baselineMap.length === 0 || candidateMap.length === 0) {
|
|
83
|
+
return regions;
|
|
84
|
+
}
|
|
85
|
+
const baselineByPath = new Map(baselineMap.map((e) => [e.path, e]));
|
|
86
|
+
return regions.map((region) => {
|
|
87
|
+
const cx = region.x + region.width / 2;
|
|
88
|
+
const cy = region.y + region.height / 2;
|
|
89
|
+
const regionArea = region.width * region.height;
|
|
90
|
+
const matches = candidateMap
|
|
91
|
+
.map((el) => {
|
|
92
|
+
const b = baselineByPath.get(el.path);
|
|
93
|
+
const span = b ? bbox(b, el) : el;
|
|
94
|
+
const coverage = regionArea > 0 ? overlapArea(span, region) / regionArea : 0;
|
|
95
|
+
return { el, baseline: b, coverage, center: containsPoint(span, cx, cy) };
|
|
96
|
+
})
|
|
97
|
+
.filter((m) => m.coverage >= MATCH_COVERAGE || m.center)
|
|
98
|
+
.sort((a, b) => a.el.width * a.el.height - b.el.width * b.el.height)
|
|
99
|
+
.slice(0, MAX_ELEMENTS_PER_REGION);
|
|
100
|
+
if (matches.length === 0)
|
|
101
|
+
return region;
|
|
102
|
+
const roleOf = (m) => {
|
|
103
|
+
const b = m.baseline;
|
|
104
|
+
if (b &&
|
|
105
|
+
b.width === m.el.width &&
|
|
106
|
+
b.height === m.el.height &&
|
|
107
|
+
b.styleHash === m.el.styleHash &&
|
|
108
|
+
(b.x !== m.el.x || b.y !== m.el.y)) {
|
|
109
|
+
return { role: 'shifted', dx: m.el.x - b.x, dy: m.el.y - b.y };
|
|
110
|
+
}
|
|
111
|
+
return { role: 'changed', dx: 0, dy: 0 };
|
|
112
|
+
};
|
|
113
|
+
const attributed = { ...region };
|
|
114
|
+
attributed.elements = matches.map((m) => ({ selector: m.el.path, role: roleOf(m).role }));
|
|
115
|
+
const primary = roleOf(matches[0]);
|
|
116
|
+
if (primary.role === 'shifted') {
|
|
117
|
+
attributed.classification = 'shift';
|
|
118
|
+
attributed.shift = { dx: primary.dx, dy: primary.dy };
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
attributed.classification = 'change';
|
|
122
|
+
}
|
|
123
|
+
return attributed;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Compare computed-style digests between the two element maps.
|
|
128
|
+
*
|
|
129
|
+
* Only paths present on BOTH sides are compared — structural additions
|
|
130
|
+
* and removals are the DOM diff's job, not the style fingerprint's.
|
|
131
|
+
* Either side missing a map → 'unavailable' (the noise hint falls back
|
|
132
|
+
* to its legacy DOM-only behavior, visibly labeled).
|
|
133
|
+
*/
|
|
134
|
+
function compareStyleHashes(baselineMap, candidateMap) {
|
|
135
|
+
if (baselineMap.length === 0 || candidateMap.length === 0) {
|
|
136
|
+
return { status: 'unavailable', changed: [] };
|
|
137
|
+
}
|
|
138
|
+
const baselineByPath = new Map(baselineMap.map((e) => [e.path, e.styleHash]));
|
|
139
|
+
const changed = [];
|
|
140
|
+
for (const el of candidateMap) {
|
|
141
|
+
const b = baselineByPath.get(el.path);
|
|
142
|
+
if (b !== undefined && b !== el.styleHash)
|
|
143
|
+
changed.push(el.path);
|
|
144
|
+
}
|
|
145
|
+
return changed.length > 0 ? { status: 'mismatch', changed } : { status: 'match', changed: [] };
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Whole-page pass: detect "everything below y=N moved by dy" — the
|
|
149
|
+
* classic injected-banner signature. Elements matched by path with
|
|
150
|
+
* identical size and style digest are compared positionally; a dominant
|
|
151
|
+
* group (≥80% of all vertically-moved elements, at least `minElements`)
|
|
152
|
+
* sharing one exact dy with dx=0 is reported.
|
|
153
|
+
*/
|
|
154
|
+
function detectPageShift(baselineMap, candidateMap, minElements = 3) {
|
|
155
|
+
if (baselineMap.length === 0 || candidateMap.length === 0)
|
|
156
|
+
return null;
|
|
157
|
+
const baselineByPath = new Map(baselineMap.map((e) => [e.path, e]));
|
|
158
|
+
const moved = [];
|
|
159
|
+
for (const el of candidateMap) {
|
|
160
|
+
const b = baselineByPath.get(el.path);
|
|
161
|
+
if (!b || b.width !== el.width || b.height !== el.height || b.styleHash !== el.styleHash) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const dx = el.x - b.x;
|
|
165
|
+
const dy = el.y - b.y;
|
|
166
|
+
if (dx === 0 && dy !== 0)
|
|
167
|
+
moved.push({ dy, baselineY: b.y });
|
|
168
|
+
}
|
|
169
|
+
if (moved.length < minElements)
|
|
170
|
+
return null;
|
|
171
|
+
const groups = new Map();
|
|
172
|
+
for (const m of moved) {
|
|
173
|
+
const g = groups.get(m.dy) ?? [];
|
|
174
|
+
g.push(m);
|
|
175
|
+
groups.set(m.dy, g);
|
|
176
|
+
}
|
|
177
|
+
let best = [];
|
|
178
|
+
for (const g of groups.values())
|
|
179
|
+
if (g.length > best.length)
|
|
180
|
+
best = g;
|
|
181
|
+
if (best.length < minElements || best.length / moved.length < 0.8)
|
|
182
|
+
return null;
|
|
183
|
+
return {
|
|
184
|
+
dy: best[0].dy,
|
|
185
|
+
belowY: Math.min(...best.map((m) => m.baselineY)),
|
|
186
|
+
count: best.length,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=attribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution.js","sourceRoot":"","sources":["../../src/diff/attribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/report/compare.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAqB,cAAc,EAAkB,MAAM,WAAW,CAAC;AAC9E,OAAO,EAEL,QAAQ,EAET,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/report/compare.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAqB,cAAc,EAAkB,MAAM,WAAW,CAAC;AAC9E,OAAO,EAEL,QAAQ,EAET,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAS9C,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,yDAAyD;IACzD,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B;AA+BD,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+FAA+F;IAC/F,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,EAAE,CA0GpE"}
|
package/dist/report/compare.js
CHANGED
|
@@ -46,6 +46,16 @@ const diff_1 = require("../diff");
|
|
|
46
46
|
const dom_diff_1 = require("../diff/dom-diff");
|
|
47
47
|
const store_1 = require("../baselines/store");
|
|
48
48
|
const mask_1 = require("../diff/mask");
|
|
49
|
+
const attribution_1 = require("../diff/attribution");
|
|
50
|
+
function readElementMap(projectRoot, kind, name) {
|
|
51
|
+
const p = path.join(projectRoot, '.testivai', kind, name, 'elements.json');
|
|
52
|
+
try {
|
|
53
|
+
return (0, attribution_1.parseElementMap)(JSON.parse(fs.readFileSync(p, 'utf-8')));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return []; // absent or malformed map never breaks the compare
|
|
57
|
+
}
|
|
58
|
+
}
|
|
49
59
|
function readTempMaskMetadata(projectRoot, name) {
|
|
50
60
|
const metaPath = path.join(projectRoot, '.testivai', 'temp', name, 'metadata.json');
|
|
51
61
|
try {
|
|
@@ -115,9 +125,34 @@ function compareAll(options) {
|
|
|
115
125
|
const baselineDom = store.readDom(name);
|
|
116
126
|
const candidateDom = store.readTempDom(name);
|
|
117
127
|
const domSignal = computeDomSignal(baselineDom, candidateDom);
|
|
128
|
+
// Element attribution + shift classification (element maps are
|
|
129
|
+
// optional; without them regions pass through untouched).
|
|
130
|
+
const baselineElements = readElementMap(projectRoot, 'baselines', name);
|
|
131
|
+
const candidateElements = readElementMap(projectRoot, 'temp', name);
|
|
132
|
+
// Style fingerprint: a stylesheet-only change has an identical DOM
|
|
133
|
+
// but different computed styles — pixels + identical DOM used to
|
|
134
|
+
// read as "likely render noise" (a documented false negative).
|
|
135
|
+
// The hint now requires the style digests to match; a mismatch is
|
|
136
|
+
// surfaced as an explicit, attributed "styles changed" signal.
|
|
118
137
|
if (domSignal) {
|
|
138
|
+
const styleComparison = (0, attribution_1.compareStyleHashes)(baselineElements, candidateElements);
|
|
139
|
+
domSignal.styleCheck = styleComparison.status;
|
|
140
|
+
if (styleComparison.status === 'mismatch') {
|
|
141
|
+
domSignal.styleChanges = {
|
|
142
|
+
count: styleComparison.changed.length,
|
|
143
|
+
elements: styleComparison.changed.slice(0, 10),
|
|
144
|
+
};
|
|
145
|
+
domSignal.noiseHint = false;
|
|
146
|
+
}
|
|
119
147
|
result.dom = domSignal;
|
|
120
148
|
}
|
|
149
|
+
if (result.regions && result.regions.length > 0) {
|
|
150
|
+
result.regions = (0, attribution_1.attributeRegions)(result.regions, baselineElements, candidateElements);
|
|
151
|
+
}
|
|
152
|
+
const pageShift = (0, attribution_1.detectPageShift)(baselineElements, candidateElements);
|
|
153
|
+
if (pageShift) {
|
|
154
|
+
result.pageShift = pageShift;
|
|
155
|
+
}
|
|
121
156
|
applyPassCriteria(result, passCriteria);
|
|
122
157
|
}
|
|
123
158
|
results.push(result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/report/compare.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/report/compare.ts"],"names":[],"mappings":"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"}
|
package/dist/report/results.d.ts
CHANGED
|
@@ -15,11 +15,24 @@ export interface SnapshotDomSignal {
|
|
|
15
15
|
textChanges?: number;
|
|
16
16
|
} | null;
|
|
17
17
|
/**
|
|
18
|
-
* Noise hint: pixel diff is non-zero but DOM is structurally unchanged
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* Noise hint: pixel diff is non-zero but DOM is structurally unchanged
|
|
19
|
+
* AND (when element maps exist) computed-style digests match. Suggests
|
|
20
|
+
* render noise (anti-aliasing, font hinting, sub-pixel layout) rather
|
|
21
|
+
* than a real visual regression.
|
|
21
22
|
*/
|
|
22
23
|
noiseHint: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Style-fingerprint verdict: 'match' (digests equal — the hint is
|
|
26
|
+
* trustworthy), 'mismatch' (styles changed with identical DOM — a REAL
|
|
27
|
+
* change; the noise hint is suppressed), 'unavailable' (no element
|
|
28
|
+
* maps — legacy DOM-only hint, labeled).
|
|
29
|
+
*/
|
|
30
|
+
styleCheck?: 'match' | 'mismatch' | 'unavailable';
|
|
31
|
+
/** Present on mismatch: how many elements changed styles, and which. */
|
|
32
|
+
styleChanges?: {
|
|
33
|
+
count: number;
|
|
34
|
+
elements: string[];
|
|
35
|
+
};
|
|
23
36
|
}
|
|
24
37
|
export interface SnapshotResult {
|
|
25
38
|
name: string;
|
|
@@ -45,7 +58,7 @@ export interface SnapshotResult {
|
|
|
45
58
|
* Changed-pixel clusters as bounding boxes (top-left sorted). Present
|
|
46
59
|
* for 'changed' results (and auto-passed ones — the boxes stay useful).
|
|
47
60
|
*/
|
|
48
|
-
regions?: import('../diff/
|
|
61
|
+
regions?: import('../diff/attribution').AttributedRegion[];
|
|
49
62
|
/**
|
|
50
63
|
* Masks applied to this comparison (resolved to pixels, with their
|
|
51
64
|
* source) — the audit trail for excluded areas. Present when non-empty.
|
|
@@ -53,6 +66,12 @@ export interface SnapshotResult {
|
|
|
53
66
|
masks?: import('../diff/mask').MaskRect[];
|
|
54
67
|
/** Mask specs that could not be applied (e.g. selector without captured geometry). */
|
|
55
68
|
maskWarnings?: string[];
|
|
69
|
+
/**
|
|
70
|
+
* Whole-page uniform displacement (the injected-banner signature):
|
|
71
|
+
* everything at or below `belowY` moved by `dy` px. Derived from the
|
|
72
|
+
* element maps — present only when both captures carried one.
|
|
73
|
+
*/
|
|
74
|
+
pageShift?: import('../diff/attribution').PageShift;
|
|
56
75
|
/**
|
|
57
76
|
* Present when the snapshot's pixels differed but a pass criterion
|
|
58
77
|
* reported it as passed: 'threshold' (within maxDiffPercent /
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../src/report/results.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnG
|
|
1
|
+
{"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../src/report/results.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnG;;;;;OAKG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;IAClD,wEAAwE;IACxE,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACtD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,qBAAqB,EAAE,gBAAgB,EAAE,CAAC;IAC3D;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,cAAc,EAAE,QAAQ,EAAE,CAAC;IAC1C,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,qBAAqB,EAAE,SAAS,CAAC;IACpD;;;;;OAKG;IACH,UAAU,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AAEvD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AAEvD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAoOnD"}
|
package/dist/report/template.js
CHANGED
|
@@ -78,6 +78,8 @@ function renderHtml(data) {
|
|
|
78
78
|
.dom-hint { display: flex; align-items: center; gap: 8px; margin-top: 8px; padding: 10px 12px; border-radius: 8px; font-size: 12px; line-height: 1.5; }
|
|
79
79
|
.dom-hint.noise { background: #1f6feb1a; border: 1px solid #1f6feb44; color: #79c0ff; }
|
|
80
80
|
.dom-hint.changed { background: #6e768166; border: 1px solid #8b949e44; color: #c9d1d9; }
|
|
81
|
+
.dom-hint.style-changed { background: #f0883e1a; border: 1px solid #f0883e44; color: #f0883e; }
|
|
82
|
+
.dom-hint.style-changed code { background: #0d1117; border-radius: 3px; padding: 1px 4px; font-size: 11px; }
|
|
81
83
|
.dom-hint .label { font-weight: 600; }
|
|
82
84
|
.dom-hint .summary { color: inherit; opacity: 0.85; }
|
|
83
85
|
|
|
@@ -103,6 +105,9 @@ function renderHtml(data) {
|
|
|
103
105
|
.regions ul { list-style: none; display: flex; flex-wrap: wrap; gap: 6px; }
|
|
104
106
|
.regions li a { display: inline-block; padding: 3px 10px; border-radius: 10px; background: #f8514922; color: #f85149; text-decoration: none; font-family: 'SF Mono', 'Fira Code', monospace; font-size: 11px; }
|
|
105
107
|
.regions li a:hover { background: #f8514944; }
|
|
108
|
+
.regions li a.region-shift { background: #1f6feb22; color: #79c0ff; }
|
|
109
|
+
.regions li a.region-shift:hover { background: #1f6feb44; }
|
|
110
|
+
.page-shift { margin-top: 8px; padding: 8px 10px; background: #1f6feb1a; border: 1px solid #1f6feb44; border-radius: 6px; font-size: 12px; color: #79c0ff; }
|
|
106
111
|
|
|
107
112
|
/* Masks (audit trail) */
|
|
108
113
|
.masks { margin-top: 8px; padding: 10px 12px; background: repeating-linear-gradient(45deg, #161b22, #161b22 6px, #1c2129 6px, #1c2129 8px); border: 1px solid #30363d; border-radius: 8px; font-size: 12px; color: #8b949e; }
|
|
@@ -283,11 +288,30 @@ function renderSnapshot(snapshot) {
|
|
|
283
288
|
function renderDomHint(snapshot) {
|
|
284
289
|
if (!snapshot.dom)
|
|
285
290
|
return '';
|
|
291
|
+
// Style fingerprint verdict: identical DOM but changed computed styles
|
|
292
|
+
// is a REAL change (the stylesheet-only case) — never noise.
|
|
293
|
+
if (snapshot.dom.styleCheck === 'mismatch' && snapshot.dom.styleChanges) {
|
|
294
|
+
const els = snapshot.dom.styleChanges.elements
|
|
295
|
+
.slice(0, 3)
|
|
296
|
+
.map((p) => `<code>${escapeHtml(p.split(' > ').slice(-1)[0])}</code>`)
|
|
297
|
+
.join(', ');
|
|
298
|
+
const n = snapshot.dom.styleChanges.count;
|
|
299
|
+
return `
|
|
300
|
+
<div class="dom-hint style-changed" title="DOM structure is identical but computed styles differ — a stylesheet-level change, not render noise.">
|
|
301
|
+
<span class="label">Styles changed</span>
|
|
302
|
+
<span class="summary">— ${n} element${n === 1 ? '' : 's'} restyled with identical DOM: ${els}${n > 3 ? ', …' : ''}.</span>
|
|
303
|
+
</div>`;
|
|
304
|
+
}
|
|
286
305
|
if (snapshot.dom.noiseHint) {
|
|
306
|
+
const styleNote = snapshot.dom.styleCheck === 'match'
|
|
307
|
+
? ' Styles verified unchanged.'
|
|
308
|
+
: snapshot.dom.styleCheck === 'unavailable'
|
|
309
|
+
? ' (Style check unavailable — no element maps on both sides.)'
|
|
310
|
+
: '';
|
|
287
311
|
return `
|
|
288
312
|
<div class="dom-hint noise" title="DOM tree is identical between baseline and candidate; the pixel diff is likely render noise.">
|
|
289
313
|
<span class="label">DOM unchanged</span>
|
|
290
|
-
<span class="summary">— pixel diff is likely render noise (anti-aliasing, font hinting)
|
|
314
|
+
<span class="summary">— pixel diff is likely render noise (anti-aliasing, font hinting).${styleNote}</span>
|
|
291
315
|
</div>`;
|
|
292
316
|
}
|
|
293
317
|
const s = snapshot.dom.summary;
|
|
@@ -316,13 +340,36 @@ function renderRegions(snapshot) {
|
|
|
316
340
|
const regions = snapshot.regions ?? [];
|
|
317
341
|
if (regions.length === 0 || snapshot.status === 'new')
|
|
318
342
|
return '';
|
|
343
|
+
const describe = (r) => {
|
|
344
|
+
const el = r.elements?.[0];
|
|
345
|
+
if (!el)
|
|
346
|
+
return `${r.width}×${r.height} @ (${r.x}, ${r.y})`;
|
|
347
|
+
const selector = escapeHtml(el.selector.split(' > ').slice(-1)[0]);
|
|
348
|
+
if (r.classification === 'shift' && r.shift) {
|
|
349
|
+
const parts = [];
|
|
350
|
+
if (r.shift.dy !== 0)
|
|
351
|
+
parts.push(`${r.shift.dy > 0 ? '+' : ''}${r.shift.dy}px vertically`);
|
|
352
|
+
if (r.shift.dx !== 0)
|
|
353
|
+
parts.push(`${r.shift.dx > 0 ? '+' : ''}${r.shift.dx}px horizontally`);
|
|
354
|
+
return `${selector} shifted ${parts.join(', ')} — content unchanged`;
|
|
355
|
+
}
|
|
356
|
+
return `${selector} changed (${r.width}×${r.height} @ ${r.x}, ${r.y})`;
|
|
357
|
+
};
|
|
319
358
|
const chips = regions
|
|
320
|
-
.map((r, i) => `<li><a href="#" class="region-chip" data-diff="${snapshot.diffPath ?? ''}" title="${r.diffPixels} changed pixels">#${i + 1} · ${
|
|
359
|
+
.map((r, i) => `<li><a href="#" class="region-chip${r.classification === 'shift' ? ' region-shift' : ''}" data-diff="${snapshot.diffPath ?? ''}" title="${r.diffPixels} changed pixels${r.elements?.[0] ? ' — ' + escapeHtml(r.elements[0].selector) : ''}">#${i + 1} · ${describe(r)}</a></li>`)
|
|
321
360
|
.join('');
|
|
361
|
+
const shifted = regions.filter((r) => r.classification === 'shift').length;
|
|
362
|
+
const title = shifted > 0
|
|
363
|
+
? `${regions.length} changed region${regions.length === 1 ? '' : 's'} (${shifted} shifted)`
|
|
364
|
+
: `${regions.length} changed region${regions.length === 1 ? '' : 's'}`;
|
|
365
|
+
const pageShift = snapshot.pageShift
|
|
366
|
+
? `<div class="page-shift">↕ Everything below y=${snapshot.pageShift.belowY} shifted ${snapshot.pageShift.dy > 0 ? '+' : ''}${snapshot.pageShift.dy}px (${snapshot.pageShift.count} elements moved together — typically an inserted banner or expanded section above).</div>`
|
|
367
|
+
: '';
|
|
322
368
|
return `
|
|
323
369
|
<div class="regions">
|
|
324
|
-
<div class="regions-title">${
|
|
370
|
+
<div class="regions-title">${title}</div>
|
|
325
371
|
<ul>${chips}</ul>
|
|
372
|
+
${pageShift}
|
|
326
373
|
</div>`;
|
|
327
374
|
}
|
|
328
375
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAOH,
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAOH,gCAoOC;AAvOD;;GAEG;AACH,SAAgB,UAAU,CAAC,IAAgB;IACzC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAExD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IAE9D,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CAqHiC,UAAU,CAAC,OAAO,CAAC;6BAChC,UAAU,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;;;iFAGI,OAAO,CAAC,KAAK;qFACT,OAAO,CAAC,OAAO;6EACvB,OAAO,CAAC,YAAY;mFACd,OAAO,CAAC,MAAM;;;;QAIzF,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,sDAAsD,OAAO,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,EAAE;QAClH,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,8CAA8C,OAAO,CAAC,YAAY,kBAAkB,CAAC,CAAC,CAAC,EAAE;QACpH,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oDAAoD,OAAO,CAAC,MAAM,kBAAkB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;MAqBhH,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC;;;;;WAKjB,CAAC,CAAC,CAAC,EAAE;;MAEV,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;mDAEwB,OAAO,CAAC,MAAM;QACzD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;eACzC,CAAC,CAAC,CAAC,EAAE;;MAEd,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;2CAEW,YAAY,CAAC,MAAM;QACtD,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;eAC9C,CAAC,CAAC,CAAC,EAAE;;MAEd,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;iDAEuB,MAAM,CAAC,MAAM;QACtD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;eACxC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA8CZ,CAAC;AACT,CAAC;AAED,SAAS,cAAc,CAAC,QAAwB;IAC9C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;IAE9H,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;IAC5C,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACpC,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IAE1C,IAAI,SAAS,GAAG,WAAW,CAAC;IAC5B,IAAI,WAAW,IAAI,OAAO,IAAI,UAAU;QAAE,SAAS,IAAI,EAAE,CAAC;SACrD,IAAI,UAAU,IAAI,CAAC,WAAW;QAAE,SAAS,IAAI,UAAU,CAAC;;QACxD,SAAS,IAAI,UAAU,CAAC;IAE7B,OAAO;;;sCAG6B,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;sCACzB,UAAU,KAAK,QAAQ,CAAC,MAAM;;QAE5D,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,qCAAqC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,SAAS,WAAW,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,QAAQ,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE;QACzU,aAAa,CAAC,QAAQ,CAAC;QACvB,aAAa,CAAC,QAAQ,CAAC;QACvB,WAAW,CAAC,QAAQ,CAAC;oBACT,SAAS;UACnB,WAAW,CAAC,CAAC,CAAC,0DAA0D,QAAQ,CAAC,YAAY,yBAAyB,CAAC,CAAC,CAAC,EAAE;UAC3H,OAAO,CAAC,CAAC,CAAC,sDAAsD,QAAQ,CAAC,QAAQ,qBAAqB,CAAC,CAAC,CAAC,EAAE;UAC3G,UAAU,CAAC,CAAC,CAAC,yDAAyD,QAAQ,CAAC,WAAW,wBAAwB,CAAC,CAAC,CAAC,EAAE;;QAEzH,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC;;qCAEhC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;kEACI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;aAC9E,CAAC,CAAC,CAAC,EAAE;WACP,CAAC;AACZ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,aAAa,CAAC,QAAwB;IAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAE7B,uEAAuE;IACvE,6DAA6D;IAC7D,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,KAAK,UAAU,IAAI,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACxE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ;aAC3C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;aACrE,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1C,OAAO;;;kCAGuB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,iCAAiC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;aAC5G,CAAC;IACZ,CAAC;IAED,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GACb,QAAQ,CAAC,GAAG,CAAC,UAAU,KAAK,OAAO;YACjC,CAAC,CAAC,6BAA6B;YAC/B,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,KAAK,aAAa;gBACzC,CAAC,CAAC,6DAA6D;gBAC/D,CAAC,CAAC,EAAE,CAAC;QACX,OAAO;;;kGAGuF,SAAS;aAC9F,CAAC;IACZ,CAAC;IAED,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,oBAAoB,CAAC,CAAC,gBAAgB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACvH,IAAI,CAAC,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,eAAe,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/F,OAAO;;;gCAGuB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC;WAC5E,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,QAAwB;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAEjE,MAAM,QAAQ,GAAG,CAAC,CAAiD,EAAU,EAAE;QAC7E,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,EAAE;YAAE,OAAO,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,CAAC,cAAc,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC,CAAC;YAC3F,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAC7F,OAAO,GAAG,QAAQ,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC;QACvE,CAAC;QACD,OAAO,GAAG,QAAQ,aAAa,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IACzE,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO;SAClB,GAAG,CACF,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,qCAAqC,CAAC,CAAC,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,gBAAgB,QAAQ,CAAC,QAAQ,IAAI,EAAE,YAAY,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,WAAW,CACpR;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,KAAK,GACT,OAAO,GAAG,CAAC;QACT,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,kBAAkB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,WAAW;QAC3F,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,kBAAkB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAE3E,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS;QAClC,CAAC,CAAC,gDAAgD,QAAQ,CAAC,SAAS,CAAC,MAAM,YAAY,QAAQ,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,QAAQ,CAAC,SAAS,CAAC,KAAK,2FAA2F;QAC7Q,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;qCAE4B,KAAK;cAC5B,KAAK;UACT,SAAS;aACN,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,QAAwB;IAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE3D,MAAM,QAAQ,GAAG,CAAC,CAA+C,EAAU,EAAE;QAC3E,MAAM,GAAG,GACP,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU;YAC1B,CAAC,CAAC,kBAAkB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS;YAC9D,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM;gBACxB,CAAC,CAAC,cAAc,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS;gBAClE,CAAC,CAAC,gBAAgB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;QAC3E,OAAO,GAAG,GAAG,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,MAAM,QAAQ,CAAC;IAC5F,CAAC,CAAC;IAEF,MAAM,SAAS,GACb,KAAK,CAAC,MAAM,GAAG,CAAC;QACd,CAAC,CAAC;;iCAEyB,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;YACtE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7B;QACP,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,YAAY,GAChB,QAAQ,CAAC,MAAM,GAAG,CAAC;QACjB,CAAC,CAAC;qCAC6B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;QACtF,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,SAAS,GAAG,YAAY,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|