@testivai/witness 1.7.0 → 1.8.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/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +10 -1
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/exit-codes.d.ts +16 -5
- package/dist/commands/exit-codes.d.ts.map +1 -1
- package/dist/commands/exit-codes.js +6 -5
- package/dist/commands/exit-codes.js.map +1 -1
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +69 -2
- package/dist/commands/report.js.map +1 -1
- package/dist/config/local-config.d.ts +18 -0
- package/dist/config/local-config.d.ts.map +1 -1
- package/dist/config/local-config.js +1 -0
- package/dist/config/local-config.js.map +1 -1
- package/dist/report/compare.d.ts.map +1 -1
- package/dist/report/compare.js +5 -0
- package/dist/report/compare.js.map +1 -1
- package/dist/report/generator.d.ts +27 -4
- package/dist/report/generator.d.ts.map +1 -1
- package/dist/report/generator.js +64 -6
- package/dist/report/generator.js.map +1 -1
- package/dist/report/results.d.ts +14 -0
- package/dist/report/results.d.ts.map +1 -1
- package/dist/report/template.d.ts +6 -4
- package/dist/report/template.d.ts.map +1 -1
- package/dist/report/template.js +270 -91
- package/dist/report/template.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,WAAW,SAoHpB,CAAC"}
|
package/dist/commands/auth.js
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.authCommand = void 0;
|
|
4
7
|
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
5
9
|
const common_1 = require("@testivai/common");
|
|
6
10
|
const logger_1 = require("../utils/logger");
|
|
7
11
|
exports.authCommand = new commander_1.Command('auth')
|
|
8
|
-
.description('Authenticate with
|
|
12
|
+
.description('[DEPRECATED] Authenticate with a TestivAI API key (the hosted service is discontinued)')
|
|
9
13
|
.argument('[api-key]', 'Your TestivAI API key (optional if TESTIVAI_API_KEY env var is set)')
|
|
10
14
|
.option('--check', 'Check if you are authenticated')
|
|
11
15
|
.option('--show', 'Show current API key')
|
|
12
16
|
.option('--delete', 'Delete stored credentials')
|
|
13
17
|
.action(async (apiKey, options) => {
|
|
18
|
+
// TestivAI is local-first and no longer operates a hosted service; auth
|
|
19
|
+
// serves no purpose and will be removed in the next major version.
|
|
20
|
+
console.log(chalk_1.default.yellow('⚠ `testivai auth` is deprecated — TestivAI runs fully locally, no account or API key needed.'));
|
|
21
|
+
console.log(chalk_1.default.gray(' It will be removed in the next major release. Use `--delete` to clear any stored credentials.'));
|
|
22
|
+
console.log();
|
|
14
23
|
try {
|
|
15
24
|
// Check authentication status
|
|
16
25
|
if (options.check) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The `testivai report` exit-code contract (public, agent-facing).
|
|
3
3
|
*
|
|
4
|
-
* 0 pass
|
|
5
|
-
* 1 changed
|
|
6
|
-
* 2 new-only
|
|
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
|
+
* 3 missing-only — no changes, but baselines exist that received NO
|
|
8
|
+
* capture this run (coverage loss: a deleted/renamed
|
|
9
|
+
* test silently stopped guarding its page)
|
|
7
10
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
11
|
+
* Precedence: changed (1) > missing (3) > new (2).
|
|
12
|
+
*
|
|
13
|
+
* Codes 1/2 are enforced when the gate is on (`--fail-on-diff` or config
|
|
14
|
+
* `failOnDiff`). Code 3 is enforced only by the separate opt-in
|
|
15
|
+
* `--fail-on-missing` / config `failOnMissing` — filtered runs (`--grep`)
|
|
16
|
+
* legitimately skip most baselines, so missing must never gate by default.
|
|
17
|
+
* With neither gate the command is report-only and exits 0.
|
|
10
18
|
*/
|
|
11
19
|
export interface ExitSummary {
|
|
12
20
|
changed: number;
|
|
13
21
|
newSnapshots: number;
|
|
22
|
+
missing?: number;
|
|
14
23
|
}
|
|
15
24
|
export declare const EXIT_PASS = 0;
|
|
16
25
|
export declare const EXIT_CHANGED = 1;
|
|
17
26
|
export declare const EXIT_NEW_ONLY = 2;
|
|
27
|
+
export declare const EXIT_MISSING_ONLY = 3;
|
|
18
28
|
export declare function reportExitCode(summary: ExitSummary, opts: {
|
|
19
29
|
gate: boolean;
|
|
20
30
|
allowNew?: boolean;
|
|
31
|
+
failOnMissing?: boolean;
|
|
21
32
|
}): number;
|
|
22
33
|
//# sourceMappingURL=exit-codes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/commands/exit-codes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/commands/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GACnE,MAAM,CAKR"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EXIT_NEW_ONLY = exports.EXIT_CHANGED = exports.EXIT_PASS = void 0;
|
|
3
|
+
exports.EXIT_MISSING_ONLY = exports.EXIT_NEW_ONLY = exports.EXIT_CHANGED = exports.EXIT_PASS = void 0;
|
|
4
4
|
exports.reportExitCode = reportExitCode;
|
|
5
5
|
exports.EXIT_PASS = 0;
|
|
6
6
|
exports.EXIT_CHANGED = 1;
|
|
7
7
|
exports.EXIT_NEW_ONLY = 2;
|
|
8
|
+
exports.EXIT_MISSING_ONLY = 3;
|
|
8
9
|
function reportExitCode(summary, opts) {
|
|
9
|
-
if (
|
|
10
|
-
return exports.EXIT_PASS;
|
|
11
|
-
if (summary.changed > 0)
|
|
10
|
+
if (opts.gate && summary.changed > 0)
|
|
12
11
|
return exports.EXIT_CHANGED;
|
|
13
|
-
if (summary.
|
|
12
|
+
if (opts.failOnMissing && (summary.missing ?? 0) > 0)
|
|
13
|
+
return exports.EXIT_MISSING_ONLY;
|
|
14
|
+
if (opts.gate && summary.newSnapshots > 0 && !opts.allowNew)
|
|
14
15
|
return exports.EXIT_NEW_ONLY;
|
|
15
16
|
return exports.EXIT_PASS;
|
|
16
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/commands/exit-codes.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/commands/exit-codes.ts"],"names":[],"mappings":";;;AA6BA,wCAQC;AAbY,QAAA,SAAS,GAAG,CAAC,CAAC;AACd,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,aAAa,GAAG,CAAC,CAAC;AAClB,QAAA,iBAAiB,GAAG,CAAC,CAAC;AAEnC,SAAgB,cAAc,CAC5B,OAAoB,EACpB,IAAoE;IAEpE,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC;QAAE,OAAO,oBAAY,CAAC;IAC1D,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,yBAAiB,CAAC;IAC/E,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,qBAAa,CAAC;IAClF,OAAO,iBAAS,CAAC;AACnB,CAAC"}
|
|
@@ -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;AAQpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa,SAkGtB,CAAC"}
|
package/dist/commands/report.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -6,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
39
|
exports.reportCommand = void 0;
|
|
7
40
|
const commander_1 = require("commander");
|
|
8
41
|
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
9
43
|
const generator_1 = require("../report/generator");
|
|
10
44
|
const local_config_1 = require("../config/local-config");
|
|
11
45
|
const logger_1 = require("../utils/logger");
|
|
@@ -36,6 +70,9 @@ exports.reportCommand = new commander_1.Command('report')
|
|
|
36
70
|
'For non-JS adapters: write .testivai/temp/<name>/screenshot.png (+ dom.html), then run this.')
|
|
37
71
|
.option('--fail-on-diff', 'Exit non-zero on changes (1) / new-only (2); overrides config failOnDiff')
|
|
38
72
|
.option('--allow-new', 'Treat new snapshots as passing (exit 0) — for first runs before baselines exist')
|
|
73
|
+
.option('--fail-on-missing', 'Force the missing-baselines gate on (exit 3), overriding config failOnMissing:false')
|
|
74
|
+
.option('--allow-missing', 'Skip the missing-baselines gate for this run — use with filtered test runs (--grep) where skipped baselines are expected')
|
|
75
|
+
.option('--share', 'Also write share.html — a single self-contained file with all images inlined, ready to drop into Slack/issues')
|
|
39
76
|
.option('--json', 'Print the machine-readable results.json payload to stdout instead of the pretty summary')
|
|
40
77
|
.option('--open', 'Open the HTML report in a browser (overrides config autoOpen)')
|
|
41
78
|
.action(async (options) => {
|
|
@@ -53,9 +90,30 @@ exports.reportCommand = new commander_1.Command('report')
|
|
|
53
90
|
// results.json files labeled 1.3.1. Omitted → schema default.
|
|
54
91
|
});
|
|
55
92
|
const { summary } = report;
|
|
56
|
-
//
|
|
93
|
+
// Optional single-file share bundle (images inlined as data URIs),
|
|
94
|
+
// plus the storage-agnostic upload hook when configured.
|
|
95
|
+
let sharePath = null;
|
|
96
|
+
let shareUrl = null;
|
|
97
|
+
if (options.share) {
|
|
98
|
+
const reportDir = config.reportDir ?? 'visual-report';
|
|
99
|
+
sharePath = (0, generator_1.generateShareFile)(path.isAbsolute(reportDir) ? reportDir : path.join(projectRoot, reportDir));
|
|
100
|
+
if (config.shareUploadCommand) {
|
|
101
|
+
try {
|
|
102
|
+
shareUrl = (0, generator_1.uploadShareFile)(config.shareUploadCommand, sharePath);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
logger_1.logger.error(`Share upload command failed (local file kept at ${sharePath}):`, err);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Exit-code contract. The missing-baselines gate is ON by default
|
|
110
|
+
// (a baseline nobody compares is silent coverage loss); disable via
|
|
111
|
+
// config failOnMissing:false or per-run --allow-missing.
|
|
57
112
|
const gate = options.failOnDiff ?? config.failOnDiff ?? false;
|
|
58
|
-
const
|
|
113
|
+
const failOnMissing = options.allowMissing
|
|
114
|
+
? false
|
|
115
|
+
: (options.failOnMissing || (config.failOnMissing ?? true));
|
|
116
|
+
const exitCode = (0, exit_codes_1.reportExitCode)(summary, { gate, allowNew: options.allowNew, failOnMissing });
|
|
59
117
|
if (options.json) {
|
|
60
118
|
// `report` IS the results.json schema — emit it verbatim so agents get
|
|
61
119
|
// one stable, parseable contract (summary + per-snapshot regions).
|
|
@@ -71,6 +129,15 @@ exports.reportCommand = new commander_1.Command('report')
|
|
|
71
129
|
if (summary.changed > 0) {
|
|
72
130
|
console.log(chalk_1.default.gray(` Review: ${config.reportDir ?? 'visual-report'}/index.html — approve with: npx testivai approve <name>`));
|
|
73
131
|
}
|
|
132
|
+
if ((summary.missing ?? 0) > 0) {
|
|
133
|
+
console.log(chalk_1.default.yellow(` Missing: ${summary.missing} baseline(s) received no capture this run — ${(report.missingBaselines ?? []).slice(0, 5).join(', ')}${(report.missingBaselines ?? []).length > 5 ? ', …' : ''}`));
|
|
134
|
+
}
|
|
135
|
+
if (sharePath) {
|
|
136
|
+
console.log(chalk_1.default.gray(` Share: ${sharePath} (single file, images inlined)`));
|
|
137
|
+
}
|
|
138
|
+
if (shareUrl) {
|
|
139
|
+
console.log(chalk_1.default.cyan(` Shared: ${shareUrl}`));
|
|
140
|
+
}
|
|
74
141
|
}
|
|
75
142
|
// exitCode is already 0 when the gate is off (report-only).
|
|
76
143
|
process.exitCode = exitCode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,24 @@ export interface LocalConfig {
|
|
|
13
13
|
autoOpen: boolean;
|
|
14
14
|
/** Fail the test run if any diffs are detected. Default: false */
|
|
15
15
|
failOnDiff: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Exit 3 from `testivai report` when baselines received no capture this
|
|
18
|
+
* run (coverage-loss gate). Default: true — a baseline nobody compares
|
|
19
|
+
* is silent coverage loss. Set false in config (or pass
|
|
20
|
+
* `--allow-missing` per run) for filtered runs that skip baselines.
|
|
21
|
+
*/
|
|
22
|
+
failOnMissing?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Storage-agnostic upload hook for `report --share`: a shell command
|
|
25
|
+
* template run after share.html is written, with `{file}` replaced by
|
|
26
|
+
* the share file's absolute path. The command's last stdout line is
|
|
27
|
+
* treated as the shared URL. Examples:
|
|
28
|
+
* "aws s3 cp {file} s3://bucket/reports/ && echo https://…"
|
|
29
|
+
* "gsutil cp {file} gs://bucket/ && echo https://…"
|
|
30
|
+
* "rclone copyto {file} remote:reports/share.html && echo …"
|
|
31
|
+
* Local file only when unset (the default).
|
|
32
|
+
*/
|
|
33
|
+
shareUploadCommand?: string;
|
|
16
34
|
/** Directory for baselines relative to project root. Default: '.testivai/baselines' */
|
|
17
35
|
baselinesDir?: string;
|
|
18
36
|
/** Directory for report output. Default: 'visual-report' */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-config.d.ts","sourceRoot":"","sources":["../../src/config/local-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,QAAQ,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAC;IACpB,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IACvD;;;;OAIG;IACH,WAAW,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;
|
|
1
|
+
{"version":3,"file":"local-config.d.ts","sourceRoot":"","sources":["../../src/config/local-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,QAAQ,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;;;OASG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IACvD;;;;OAIG;IACH,WAAW,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAiBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAiBhE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC/B,WAAW,CAab;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAYxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CAE9C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-config.js","sourceRoot":"","sources":["../../src/config/local-config.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"local-config.js","sourceRoot":"","sources":["../../src/config/local-config.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;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,
|
|
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,CAgHpE"}
|
package/dist/report/compare.js
CHANGED
|
@@ -118,6 +118,11 @@ function compareAll(options) {
|
|
|
118
118
|
capturedRects: captureMeta.maskRects,
|
|
119
119
|
regionOptions: diffRegions,
|
|
120
120
|
});
|
|
121
|
+
// Baseline provenance: when this baseline was last approved/added.
|
|
122
|
+
const baselineMeta = store.readMetadata(name);
|
|
123
|
+
if (baselineMeta) {
|
|
124
|
+
result.baselineApprovedAt = baselineMeta.updatedAt ?? baselineMeta.createdAt;
|
|
125
|
+
}
|
|
121
126
|
// DOM-level noise hint. Only meaningful when both sides captured DOM.
|
|
122
127
|
// For 'passed' (pixel-identical) we skip the work — it's already the
|
|
123
128
|
// strongest possible signal.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/report/compare.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuFH,
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/report/compare.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,15 +36,38 @@ export interface GenerateReportOptions {
|
|
|
36
36
|
* @returns The report data
|
|
37
37
|
*/
|
|
38
38
|
/**
|
|
39
|
-
* results.json schema version. 2.
|
|
40
|
-
* (
|
|
41
|
-
*
|
|
39
|
+
* results.json schema version. 2.3.0 adds top-level `missingBaselines[]`
|
|
40
|
+
* and `summary.missing` (baselines that received no capture this run — the
|
|
41
|
+
* coverage-loss signal). 2.2.0 added per-snapshot `regions[]` (clustered
|
|
42
|
+
* diff bounding boxes), `masks[]` (applied masks with their source — the
|
|
43
|
+
* audit trail), and `maskWarnings[]`. All additive.
|
|
42
44
|
*/
|
|
43
|
-
export declare const RESULTS_SCHEMA_VERSION = "2.
|
|
45
|
+
export declare const RESULTS_SCHEMA_VERSION = "2.3.0";
|
|
44
46
|
/**
|
|
45
47
|
* Write results.json for an already-computed set of snapshot results.
|
|
46
48
|
* Exposed for callers that manage comparison and rendering separately.
|
|
47
49
|
*/
|
|
48
50
|
export declare function generateResults(results: SnapshotResult[], reportDir: string, version?: string): void;
|
|
49
51
|
export declare function generateReport(options: GenerateReportOptions): ReportData;
|
|
52
|
+
/**
|
|
53
|
+
* Build a single-file, shareable copy of the report: every report-relative
|
|
54
|
+
* image reference (`src` and the region-chip `data-diff` attributes) is
|
|
55
|
+
* inlined as a base64 data URI, so the resulting HTML can be dropped into
|
|
56
|
+
* Slack, an issue, or an email with nothing else attached.
|
|
57
|
+
*
|
|
58
|
+
* Reads `<reportDir>/index.html`, writes `<reportDir>/share.html`, and
|
|
59
|
+
* returns the absolute path of the share file.
|
|
60
|
+
*/
|
|
61
|
+
export declare function generateShareFile(reportDir: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* Storage-agnostic share upload: run the user's configured shell command
|
|
64
|
+
* (from `.testivai/config.json` `shareUploadCommand`) with `{file}` replaced
|
|
65
|
+
* by the share file's path. The last non-empty stdout line is returned as
|
|
66
|
+
* the shared URL — so `aws s3 cp … && echo https://…`, `gsutil`, `rclone`,
|
|
67
|
+
* or a plain `curl` all work without TestivAI shipping any cloud SDK.
|
|
68
|
+
*
|
|
69
|
+
* Returns the URL string, or null when the command produced no output.
|
|
70
|
+
* Throws on a non-zero exit (caller decides how loud to be).
|
|
71
|
+
*/
|
|
72
|
+
export declare function uploadShareFile(commandTemplate: string, sharePath: string): string | null;
|
|
50
73
|
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/report/generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAA8B,YAAY,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,UAAU,EAAiB,cAAc,EAAC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/report/generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAA8B,YAAY,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,UAAU,EAAiB,cAAc,EAAC,MAAM,WAAW,CAAC;AAKrE,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EAAE,EACzB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAA+B,GACvC,IAAI,CAGN;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,UAAU,CA6DzE;AAwBD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAoB3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOzF"}
|
package/dist/report/generator.js
CHANGED
|
@@ -42,12 +42,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
42
42
|
exports.RESULTS_SCHEMA_VERSION = void 0;
|
|
43
43
|
exports.generateResults = generateResults;
|
|
44
44
|
exports.generateReport = generateReport;
|
|
45
|
+
exports.generateShareFile = generateShareFile;
|
|
46
|
+
exports.uploadShareFile = uploadShareFile;
|
|
45
47
|
const fs = __importStar(require("fs"));
|
|
46
48
|
const path = __importStar(require("path"));
|
|
47
49
|
const child_process_1 = require("child_process");
|
|
48
50
|
const compare_1 = require("./compare");
|
|
49
51
|
const template_1 = require("./template");
|
|
50
52
|
const local_config_1 = require("../config/local-config");
|
|
53
|
+
const store_1 = require("../baselines/store");
|
|
51
54
|
/**
|
|
52
55
|
* Generate a complete visual regression report.
|
|
53
56
|
*
|
|
@@ -60,11 +63,13 @@ const local_config_1 = require("../config/local-config");
|
|
|
60
63
|
* @returns The report data
|
|
61
64
|
*/
|
|
62
65
|
/**
|
|
63
|
-
* results.json schema version. 2.
|
|
64
|
-
* (
|
|
65
|
-
*
|
|
66
|
+
* results.json schema version. 2.3.0 adds top-level `missingBaselines[]`
|
|
67
|
+
* and `summary.missing` (baselines that received no capture this run — the
|
|
68
|
+
* coverage-loss signal). 2.2.0 added per-snapshot `regions[]` (clustered
|
|
69
|
+
* diff bounding boxes), `masks[]` (applied masks with their source — the
|
|
70
|
+
* audit trail), and `maskWarnings[]`. All additive.
|
|
66
71
|
*/
|
|
67
|
-
exports.RESULTS_SCHEMA_VERSION = '2.
|
|
72
|
+
exports.RESULTS_SCHEMA_VERSION = '2.3.0';
|
|
68
73
|
/**
|
|
69
74
|
* Write results.json for an already-computed set of snapshot results.
|
|
70
75
|
* Exposed for callers that manage comparison and rendering separately.
|
|
@@ -98,8 +103,15 @@ function generateReport(options) {
|
|
|
98
103
|
diffRegions: localConfig.diffRegions,
|
|
99
104
|
};
|
|
100
105
|
const snapshots = (0, compare_1.compareAll)(compareOptions);
|
|
106
|
+
// 1.5. Coverage-loss signal: baselines that received no capture this run
|
|
107
|
+
// (a deleted/renamed test silently stops guarding its page). Reported
|
|
108
|
+
// always; gated only via `--fail-on-missing` / config `failOnMissing`,
|
|
109
|
+
// because filtered runs (`--grep`) legitimately skip most baselines.
|
|
110
|
+
const store = new store_1.BaselineStore(projectRoot);
|
|
111
|
+
const capturedNames = new Set(store.listTemp());
|
|
112
|
+
const missingBaselines = store.list().filter((n) => !capturedNames.has(n));
|
|
101
113
|
// 2-3. Build summary + report data
|
|
102
|
-
const reportData = buildReportData(snapshots, version);
|
|
114
|
+
const reportData = buildReportData(snapshots, version, missingBaselines);
|
|
103
115
|
// 4. Write results.json
|
|
104
116
|
const resultsPath = path.join(reportDir, 'results.json');
|
|
105
117
|
fs.writeFileSync(resultsPath, JSON.stringify(reportData, null, 2));
|
|
@@ -114,20 +126,66 @@ function generateReport(options) {
|
|
|
114
126
|
return reportData;
|
|
115
127
|
}
|
|
116
128
|
/** Assemble the ReportData envelope for a set of snapshot results. */
|
|
117
|
-
function buildReportData(snapshots, version) {
|
|
129
|
+
function buildReportData(snapshots, version, missingBaselines = []) {
|
|
118
130
|
const summary = {
|
|
119
131
|
total: snapshots.length,
|
|
120
132
|
passed: snapshots.filter((s) => s.status === 'passed').length,
|
|
121
133
|
changed: snapshots.filter((s) => s.status === 'changed').length,
|
|
122
134
|
newSnapshots: snapshots.filter((s) => s.status === 'new').length,
|
|
135
|
+
missing: missingBaselines.length,
|
|
123
136
|
};
|
|
124
137
|
return {
|
|
125
138
|
version,
|
|
126
139
|
timestamp: new Date().toISOString(),
|
|
127
140
|
summary,
|
|
128
141
|
snapshots,
|
|
142
|
+
missingBaselines,
|
|
129
143
|
};
|
|
130
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Build a single-file, shareable copy of the report: every report-relative
|
|
147
|
+
* image reference (`src` and the region-chip `data-diff` attributes) is
|
|
148
|
+
* inlined as a base64 data URI, so the resulting HTML can be dropped into
|
|
149
|
+
* Slack, an issue, or an email with nothing else attached.
|
|
150
|
+
*
|
|
151
|
+
* Reads `<reportDir>/index.html`, writes `<reportDir>/share.html`, and
|
|
152
|
+
* returns the absolute path of the share file.
|
|
153
|
+
*/
|
|
154
|
+
function generateShareFile(reportDir) {
|
|
155
|
+
const indexPath = path.join(reportDir, 'index.html');
|
|
156
|
+
const html = fs.readFileSync(indexPath, 'utf-8');
|
|
157
|
+
const inlined = html.replace(/(src|data-diff)="(images\/[^"]+)"/g, (match, attr, rel) => {
|
|
158
|
+
try {
|
|
159
|
+
const abs = path.join(reportDir, rel);
|
|
160
|
+
const data = fs.readFileSync(abs);
|
|
161
|
+
return `${attr}="data:image/png;base64,${data.toString('base64')}"`;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return match; // missing image: leave the reference as-is
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
const sharePath = path.join(reportDir, 'share.html');
|
|
168
|
+
fs.writeFileSync(sharePath, inlined);
|
|
169
|
+
return sharePath;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Storage-agnostic share upload: run the user's configured shell command
|
|
173
|
+
* (from `.testivai/config.json` `shareUploadCommand`) with `{file}` replaced
|
|
174
|
+
* by the share file's path. The last non-empty stdout line is returned as
|
|
175
|
+
* the shared URL — so `aws s3 cp … && echo https://…`, `gsutil`, `rclone`,
|
|
176
|
+
* or a plain `curl` all work without TestivAI shipping any cloud SDK.
|
|
177
|
+
*
|
|
178
|
+
* Returns the URL string, or null when the command produced no output.
|
|
179
|
+
* Throws on a non-zero exit (caller decides how loud to be).
|
|
180
|
+
*/
|
|
181
|
+
function uploadShareFile(commandTemplate, sharePath) {
|
|
182
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
183
|
+
const { execSync } = require('child_process');
|
|
184
|
+
const command = commandTemplate.split('{file}').join(JSON.stringify(sharePath));
|
|
185
|
+
const stdout = execSync(command, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'inherit'] });
|
|
186
|
+
const lines = stdout.split('\n').map((l) => l.trim()).filter(Boolean);
|
|
187
|
+
return lines.length > 0 ? lines[lines.length - 1] : null;
|
|
188
|
+
}
|
|
131
189
|
/**
|
|
132
190
|
* Open a file in the default browser.
|
|
133
191
|
* Best-effort — does not throw on failure.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/report/generator.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/report/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/report/results.d.ts
CHANGED
|
@@ -79,17 +79,31 @@ export interface SnapshotResult {
|
|
|
79
79
|
* with noiseAutoPass enabled). The diff image is still written.
|
|
80
80
|
*/
|
|
81
81
|
autoPassed?: 'threshold' | 'noise';
|
|
82
|
+
/**
|
|
83
|
+
* ISO timestamp of when the compared baseline was last approved/added
|
|
84
|
+
* (from the baseline's metadata.json). Provenance for reviewers: a
|
|
85
|
+
* months-old baseline deserves a closer look than yesterday's.
|
|
86
|
+
*/
|
|
87
|
+
baselineApprovedAt?: string;
|
|
82
88
|
}
|
|
83
89
|
export interface ReportSummary {
|
|
84
90
|
total: number;
|
|
85
91
|
passed: number;
|
|
86
92
|
changed: number;
|
|
87
93
|
newSnapshots: number;
|
|
94
|
+
/**
|
|
95
|
+
* Baselines that received NO capture this run (baseline exists, nothing to
|
|
96
|
+
* compare). Coverage-loss signal: a deleted/renamed test silently stops
|
|
97
|
+
* guarding its page. Present (possibly 0) from schema 2.3.0.
|
|
98
|
+
*/
|
|
99
|
+
missing?: number;
|
|
88
100
|
}
|
|
89
101
|
export interface ReportData {
|
|
90
102
|
version: string;
|
|
91
103
|
timestamp: string;
|
|
92
104
|
summary: ReportSummary;
|
|
93
105
|
snapshots: SnapshotResult[];
|
|
106
|
+
/** Names of baselines with no capture this run (schema 2.3.0+). */
|
|
107
|
+
missingBaselines?: string[];
|
|
94
108
|
}
|
|
95
109
|
//# sourceMappingURL=results.d.ts.map
|
|
@@ -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;;;;;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;
|
|
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;IACnC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;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;IAC5B,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TestivAI Report — HTML Template
|
|
3
3
|
*
|
|
4
|
-
* Single-file HTML with inlined CSS/JS.
|
|
5
|
-
*
|
|
6
|
-
* Changed → New → Passed sections,
|
|
7
|
-
*
|
|
4
|
+
* Single-file HTML with inlined CSS/JS. Light theme by default with a
|
|
5
|
+
* persisted dark-mode toggle (CSS custom properties). Sidebar + summary
|
|
6
|
+
* cards, Changed → New → Passed sections, a per-snapshot "Layered analysis"
|
|
7
|
+
* panel (verdict + DOM/style signal + attributed regions + page-shift +
|
|
8
|
+
* masks — the same evidence agents get via @testivai/mcp explain_snapshot),
|
|
9
|
+
* 3-column diff view, approve command copy button, image zoom overlay.
|
|
8
10
|
*/
|
|
9
11
|
import { ReportData } from './results';
|
|
10
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AAEvD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAoUnD"}
|
package/dist/report/template.js
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* TestivAI Report — HTML Template
|
|
4
4
|
*
|
|
5
|
-
* Single-file HTML with inlined CSS/JS.
|
|
6
|
-
*
|
|
7
|
-
* Changed → New → Passed sections,
|
|
8
|
-
*
|
|
5
|
+
* Single-file HTML with inlined CSS/JS. Light theme by default with a
|
|
6
|
+
* persisted dark-mode toggle (CSS custom properties). Sidebar + summary
|
|
7
|
+
* cards, Changed → New → Passed sections, a per-snapshot "Layered analysis"
|
|
8
|
+
* panel (verdict + DOM/style signal + attributed regions + page-shift +
|
|
9
|
+
* masks — the same evidence agents get via @testivai/mcp explain_snapshot),
|
|
10
|
+
* 3-column diff view, approve command copy button, image zoom overlay.
|
|
9
11
|
*/
|
|
10
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
13
|
exports.renderHtml = renderHtml;
|
|
@@ -17,6 +19,7 @@ function renderHtml(data) {
|
|
|
17
19
|
const changed = snapshots.filter((s) => s.status === 'changed');
|
|
18
20
|
const newSnapshots = snapshots.filter((s) => s.status === 'new');
|
|
19
21
|
const passed = snapshots.filter((s) => s.status === 'passed');
|
|
22
|
+
const missing = data.missingBaselines ?? [];
|
|
20
23
|
return `<!DOCTYPE html>
|
|
21
24
|
<html lang="en">
|
|
22
25
|
<head>
|
|
@@ -24,62 +27,128 @@ function renderHtml(data) {
|
|
|
24
27
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
25
28
|
<title>TestivAI Visual Report</title>
|
|
26
29
|
<style>
|
|
30
|
+
/* ── Theme tokens ─────────────────────────────────────────────────────
|
|
31
|
+
Light is the default (no attribute); html[data-theme="dark"] overrides.
|
|
32
|
+
The toggle persists to localStorage("testivai-theme"). */
|
|
33
|
+
:root {
|
|
34
|
+
--bg: #f6f8fa;
|
|
35
|
+
--surface: #ffffff;
|
|
36
|
+
--surface-2: #eef1f4;
|
|
37
|
+
--border: #d0d7de;
|
|
38
|
+
--border-soft: #e4e8ec;
|
|
39
|
+
--text: #1f2328;
|
|
40
|
+
--text-muted: #59636e;
|
|
41
|
+
--accent: #0e7490;
|
|
42
|
+
--accent-contrast: #ffffff;
|
|
43
|
+
--link: #0969da;
|
|
44
|
+
--changed: #cf222e; --changed-bg: #cf222e14;
|
|
45
|
+
--new: #bc4c00; --new-bg: #bc4c0014;
|
|
46
|
+
--passed: #1a7f37; --passed-bg: #1a7f3714;
|
|
47
|
+
--info: #0969da; --info-bg: #0969da12;
|
|
48
|
+
--code-bg: #eff2f5;
|
|
49
|
+
--shadow: 0 1px 3px rgba(31,35,40,0.06), 0 8px 24px rgba(31,35,40,0.04);
|
|
50
|
+
--sidebar-bg: #ffffff;
|
|
51
|
+
--hatch-a: #eef1f4; --hatch-b: #e4e8ec;
|
|
52
|
+
}
|
|
53
|
+
html[data-theme="dark"] {
|
|
54
|
+
--bg: #0d1117;
|
|
55
|
+
--surface: #161b22;
|
|
56
|
+
--surface-2: #1c2129;
|
|
57
|
+
--border: #30363d;
|
|
58
|
+
--border-soft: #21262d;
|
|
59
|
+
--text: #e6edf3;
|
|
60
|
+
--text-muted: #8b949e;
|
|
61
|
+
--accent: #00d4ff;
|
|
62
|
+
--accent-contrast: #08111f;
|
|
63
|
+
--link: #58a6ff;
|
|
64
|
+
--changed: #f85149; --changed-bg: #f8514922;
|
|
65
|
+
--new: #f0883e; --new-bg: #f0883e22;
|
|
66
|
+
--passed: #3fb950; --passed-bg: #3fb95022;
|
|
67
|
+
--info: #79c0ff; --info-bg: #1f6feb1a;
|
|
68
|
+
--code-bg: #0d1117;
|
|
69
|
+
--shadow: none;
|
|
70
|
+
--sidebar-bg: #08111f;
|
|
71
|
+
--hatch-a: #161b22; --hatch-b: #1c2129;
|
|
72
|
+
}
|
|
73
|
+
|
|
27
74
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
28
|
-
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background:
|
|
75
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--text); display: flex; min-height: 100vh; }
|
|
76
|
+
code, .mono { font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace; }
|
|
29
77
|
|
|
30
78
|
/* Sidebar */
|
|
31
|
-
.sidebar { width:
|
|
32
|
-
.
|
|
33
|
-
.sidebar
|
|
34
|
-
.
|
|
79
|
+
.sidebar { width: 264px; background: var(--sidebar-bg); padding: 24px 16px; flex-shrink: 0; border-right: 1px solid var(--border-soft); position: fixed; height: 100vh; overflow-y: auto; display: flex; flex-direction: column; }
|
|
80
|
+
.brand-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
|
|
81
|
+
.sidebar h1 { font-size: 18px; color: var(--accent); letter-spacing: -0.2px; }
|
|
82
|
+
.theme-toggle { background: var(--surface-2); border: 1px solid var(--border); color: var(--text); border-radius: 999px; padding: 4px 10px; font-size: 12px; cursor: pointer; transition: all .15s; }
|
|
83
|
+
.theme-toggle:hover { border-color: var(--accent); }
|
|
84
|
+
.sidebar .version { font-size: 12px; color: var(--text-muted); margin-bottom: 2px; }
|
|
85
|
+
.sidebar .timestamp { font-size: 11px; color: var(--text-muted); margin-bottom: 20px; }
|
|
35
86
|
|
|
36
87
|
/* Summary cards */
|
|
37
|
-
.summary-cards { display:
|
|
38
|
-
.card { padding: 12px; border-radius:
|
|
39
|
-
.card .label { font-size:
|
|
40
|
-
.card .value { font-size:
|
|
41
|
-
.card.total .value { color:
|
|
42
|
-
.card.changed .value { color:
|
|
43
|
-
.card.new .value { color:
|
|
44
|
-
.card.passed .value { color:
|
|
88
|
+
.summary-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 20px; }
|
|
89
|
+
.card { padding: 12px; border-radius: 10px; background: var(--surface); border: 1px solid var(--border-soft); box-shadow: var(--shadow); }
|
|
90
|
+
.card .label { font-size: 10px; text-transform: uppercase; color: var(--text-muted); letter-spacing: 0.6px; }
|
|
91
|
+
.card .value { font-size: 22px; font-weight: 700; margin-top: 4px; }
|
|
92
|
+
.card.total .value { color: var(--text); }
|
|
93
|
+
.card.changed .value { color: var(--changed); }
|
|
94
|
+
.card.new .value { color: var(--new); }
|
|
95
|
+
.card.passed .value { color: var(--passed); }
|
|
45
96
|
|
|
46
97
|
/* Nav */
|
|
47
|
-
.nav { list-style: none; margin-bottom:
|
|
98
|
+
.nav { list-style: none; margin-bottom: 20px; }
|
|
48
99
|
.nav li { margin-bottom: 2px; }
|
|
49
|
-
.nav a { display: block; padding: 8px 12px; border-radius:
|
|
50
|
-
.nav a:hover { background:
|
|
51
|
-
.nav a .count { float: right; background:
|
|
100
|
+
.nav a { display: block; padding: 8px 12px; border-radius: 8px; color: var(--text-muted); text-decoration: none; font-size: 13px; transition: all 0.15s; }
|
|
101
|
+
.nav a:hover { background: var(--surface-2); color: var(--text); }
|
|
102
|
+
.nav a .count { float: right; background: var(--surface-2); border: 1px solid var(--border-soft); padding: 1px 8px; border-radius: 10px; font-size: 11px; }
|
|
52
103
|
|
|
53
|
-
/* CTA */
|
|
54
|
-
.cta { background:
|
|
55
|
-
.cta h3 { font-size: 13px; color:
|
|
56
|
-
.cta p { font-size: 11px; color:
|
|
57
|
-
.cta
|
|
104
|
+
/* Agent CTA */
|
|
105
|
+
.cta { background: var(--surface); border: 1px solid var(--border-soft); padding: 14px; border-radius: 10px; box-shadow: var(--shadow); }
|
|
106
|
+
.cta h3 { font-size: 13px; color: var(--text); margin-bottom: 6px; }
|
|
107
|
+
.cta p { font-size: 11px; color: var(--text-muted); line-height: 1.55; }
|
|
108
|
+
.cta code { background: var(--code-bg); border-radius: 4px; padding: 1px 4px; font-size: 10px; }
|
|
109
|
+
.cta a { display: inline-block; margin-top: 8px; padding: 6px 14px; background: var(--accent); color: var(--accent-contrast); border-radius: 6px; text-decoration: none; font-size: 12px; font-weight: 600; }
|
|
58
110
|
|
|
59
111
|
/* Main content */
|
|
60
|
-
.main { margin-left:
|
|
61
|
-
.section { margin-bottom:
|
|
62
|
-
.section-title { font-size:
|
|
63
|
-
.section-title
|
|
64
|
-
.section-title.
|
|
65
|
-
.section-title.
|
|
112
|
+
.main { margin-left: 264px; flex: 1; padding: 32px 36px; max-width: 1280px; }
|
|
113
|
+
.section { margin-bottom: 44px; }
|
|
114
|
+
.section-title { font-size: 18px; font-weight: 700; margin-bottom: 14px; display: flex; align-items: center; gap: 10px; }
|
|
115
|
+
.section-title::before { content: ''; width: 8px; height: 8px; border-radius: 50%; }
|
|
116
|
+
.section-title.changed { color: var(--changed); } .section-title.changed::before { background: var(--changed); }
|
|
117
|
+
.section-title.new { color: var(--new); } .section-title.new::before { background: var(--new); }
|
|
118
|
+
.section-title.passed { color: var(--passed); } .section-title.passed::before { background: var(--passed); }
|
|
66
119
|
|
|
67
120
|
/* Snapshot card */
|
|
68
|
-
.snapshot { background:
|
|
69
|
-
.snapshot-header { display: flex; justify-content: space-between; align-items: center; margin-bottom:
|
|
70
|
-
.snapshot-name { font-size:
|
|
71
|
-
.snapshot-badge { padding:
|
|
72
|
-
.badge-changed { background:
|
|
73
|
-
.badge-new { background:
|
|
74
|
-
.badge-passed { background:
|
|
75
|
-
.snapshot-stats { font-size: 12px; color:
|
|
121
|
+
.snapshot { background: var(--surface); border: 1px solid var(--border-soft); border-radius: 14px; padding: 20px; margin-bottom: 16px; box-shadow: var(--shadow); }
|
|
122
|
+
.snapshot-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }
|
|
123
|
+
.snapshot-name { font-size: 15px; font-weight: 650; }
|
|
124
|
+
.snapshot-badge { padding: 3px 12px; border-radius: 999px; font-size: 12px; font-weight: 600; text-transform: capitalize; }
|
|
125
|
+
.badge-changed { background: var(--changed-bg); color: var(--changed); }
|
|
126
|
+
.badge-new { background: var(--new-bg); color: var(--new); }
|
|
127
|
+
.badge-passed { background: var(--passed-bg); color: var(--passed); }
|
|
128
|
+
.snapshot-stats { font-size: 12px; color: var(--text-muted); margin-bottom: 10px; }
|
|
129
|
+
|
|
130
|
+
/* Layered analysis panel — the same evidence agents get via MCP */
|
|
131
|
+
.analysis { border: 1px solid var(--border-soft); background: var(--surface-2); border-radius: 10px; padding: 12px 14px; margin-bottom: 14px; }
|
|
132
|
+
.analysis-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px; }
|
|
133
|
+
.analysis-title { font-size: 11px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase; color: var(--text-muted); }
|
|
134
|
+
.analysis-mcp { font-size: 10px; color: var(--text-muted); }
|
|
135
|
+
.analysis-mcp code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; }
|
|
136
|
+
.verdict { display: flex; gap: 8px; align-items: flex-start; padding: 10px 12px; border-radius: 8px; font-size: 13px; line-height: 1.5; font-weight: 550; margin-bottom: 8px; }
|
|
137
|
+
.verdict .v-icon { flex-shrink: 0; }
|
|
138
|
+
.verdict.v-noise { background: var(--info-bg); color: var(--info); border: 1px solid var(--info); border-color: color-mix(in srgb, var(--info) 30%, transparent); }
|
|
139
|
+
.verdict.v-style { background: var(--new-bg); color: var(--new); border: 1px solid color-mix(in srgb, var(--new) 30%, transparent); }
|
|
140
|
+
.verdict.v-structural { background: var(--changed-bg); color: var(--changed); border: 1px solid color-mix(in srgb, var(--changed) 30%, transparent); }
|
|
141
|
+
.verdict.v-shift { background: var(--info-bg); color: var(--info); border: 1px solid color-mix(in srgb, var(--info) 30%, transparent); }
|
|
142
|
+
.verdict.v-new { background: var(--new-bg); color: var(--new); border: 1px solid color-mix(in srgb, var(--new) 30%, transparent); }
|
|
143
|
+
.verdict.v-pass { background: var(--passed-bg); color: var(--passed); border: 1px solid color-mix(in srgb, var(--passed) 30%, transparent); }
|
|
144
|
+
.verdict code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; font-size: 12px; }
|
|
76
145
|
|
|
77
146
|
/* DOM noise hint */
|
|
78
|
-
.dom-hint { display: flex; align-items: center; gap: 8px; margin-top: 8px; padding:
|
|
79
|
-
.dom-hint.noise { background:
|
|
80
|
-
.dom-hint.changed { background:
|
|
81
|
-
.dom-hint.style-changed { background:
|
|
82
|
-
.dom-hint.style-changed code { background:
|
|
147
|
+
.dom-hint { display: flex; align-items: center; gap: 8px; margin-top: 8px; padding: 9px 12px; border-radius: 8px; font-size: 12px; line-height: 1.5; }
|
|
148
|
+
.dom-hint.noise { background: var(--info-bg); color: var(--info); }
|
|
149
|
+
.dom-hint.changed { background: var(--surface); border: 1px solid var(--border-soft); color: var(--text); }
|
|
150
|
+
.dom-hint.style-changed { background: var(--new-bg); color: var(--new); }
|
|
151
|
+
.dom-hint.style-changed code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; font-size: 11px; }
|
|
83
152
|
.dom-hint .label { font-weight: 600; }
|
|
84
153
|
.dom-hint .summary { color: inherit; opacity: 0.85; }
|
|
85
154
|
|
|
@@ -88,52 +157,60 @@ function renderHtml(data) {
|
|
|
88
157
|
.diff-view.two-col { grid-template-columns: 1fr 1fr; }
|
|
89
158
|
.diff-view.one-col { grid-template-columns: 1fr; }
|
|
90
159
|
.diff-col { text-align: center; }
|
|
91
|
-
.diff-col label { display: block; font-size: 11px; color:
|
|
92
|
-
.diff-col img { max-width: 100%; border-radius:
|
|
160
|
+
.diff-col label { display: block; font-size: 11px; color: var(--text-muted); text-transform: uppercase; margin-bottom: 8px; letter-spacing: 0.5px; }
|
|
161
|
+
.diff-col img { max-width: 100%; border-radius: 8px; border: 1px solid var(--border); cursor: zoom-in; transition: transform 0.2s; background: #fff; }
|
|
93
162
|
.diff-col img:hover { transform: scale(1.02); }
|
|
94
163
|
|
|
95
164
|
/* Approve command */
|
|
96
|
-
.approve-cmd { margin-top: 16px; background:
|
|
97
|
-
.approve-cmd code { font-
|
|
98
|
-
.approve-cmd button { background:
|
|
99
|
-
.approve-cmd button:hover {
|
|
100
|
-
.approve-cmd button.copied { background:
|
|
165
|
+
.approve-cmd { margin-top: 16px; background: var(--surface-2); border: 1px solid var(--border-soft); border-radius: 8px; padding: 12px 16px; display: flex; justify-content: space-between; align-items: center; }
|
|
166
|
+
.approve-cmd code { font-size: 13px; color: var(--accent); }
|
|
167
|
+
.approve-cmd button { background: var(--surface); border: 1px solid var(--border); color: var(--text); padding: 6px 14px; border-radius: 6px; cursor: pointer; font-size: 12px; transition: all 0.15s; }
|
|
168
|
+
.approve-cmd button:hover { border-color: var(--accent); }
|
|
169
|
+
.approve-cmd button.copied { background: var(--passed); border-color: var(--passed); color: #fff; }
|
|
101
170
|
|
|
102
171
|
/* Regions */
|
|
103
|
-
.regions { margin-top: 8px; padding: 10px 12px; background:
|
|
104
|
-
.regions .regions-title { color:
|
|
172
|
+
.regions { margin-top: 8px; padding: 10px 12px; background: var(--surface); border: 1px solid var(--border-soft); border-radius: 8px; font-size: 12px; }
|
|
173
|
+
.regions .regions-title { color: var(--text-muted); font-weight: 600; margin-bottom: 6px; }
|
|
105
174
|
.regions ul { list-style: none; display: flex; flex-wrap: wrap; gap: 6px; }
|
|
106
|
-
.regions li a { display: inline-block; padding: 3px 10px; border-radius: 10px; background:
|
|
107
|
-
.regions li a:hover {
|
|
108
|
-
.regions li a.region-shift { background:
|
|
109
|
-
.
|
|
110
|
-
.page-shift { margin-top: 8px; padding: 8px 10px; background: #1f6feb1a; border: 1px solid #1f6feb44; border-radius: 6px; font-size: 12px; color: #79c0ff; }
|
|
175
|
+
.regions li a { display: inline-block; padding: 3px 10px; border-radius: 10px; background: var(--changed-bg); color: var(--changed); text-decoration: none; font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace; font-size: 11px; }
|
|
176
|
+
.regions li a:hover { filter: brightness(0.95); }
|
|
177
|
+
.regions li a.region-shift { background: var(--info-bg); color: var(--info); }
|
|
178
|
+
.page-shift { margin-top: 8px; padding: 8px 10px; background: var(--info-bg); border-radius: 6px; font-size: 12px; color: var(--info); }
|
|
111
179
|
|
|
112
180
|
/* Masks (audit trail) */
|
|
113
|
-
.masks { margin-top: 8px; padding: 10px 12px; background: repeating-linear-gradient(45deg,
|
|
114
|
-
.masks .label { font-weight: 600; color:
|
|
115
|
-
.masks code { color:
|
|
116
|
-
.mask-warning { margin-top: 8px; padding: 10px 12px; background:
|
|
181
|
+
.masks { margin-top: 8px; padding: 10px 12px; background: repeating-linear-gradient(45deg, var(--hatch-a), var(--hatch-a) 6px, var(--hatch-b) 6px, var(--hatch-b) 8px); border: 1px solid var(--border); border-radius: 8px; font-size: 12px; color: var(--text-muted); }
|
|
182
|
+
.masks .label { font-weight: 600; color: var(--text); }
|
|
183
|
+
.masks code { color: var(--link); font-size: 11px; }
|
|
184
|
+
.mask-warning { margin-top: 8px; padding: 10px 12px; background: var(--new-bg); border-radius: 8px; font-size: 12px; color: var(--new); }
|
|
117
185
|
|
|
118
186
|
/* Zoom overlay */
|
|
119
187
|
.zoom-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.9); z-index: 100; justify-content: center; align-items: center; cursor: zoom-out; }
|
|
120
188
|
.zoom-overlay.active { display: flex; }
|
|
121
189
|
.zoom-overlay img { max-width: 95%; max-height: 95%; border-radius: 8px; }
|
|
122
190
|
|
|
123
|
-
/*
|
|
124
|
-
.
|
|
125
|
-
.
|
|
191
|
+
/* Missing-baselines notice (coverage loss) */
|
|
192
|
+
.missing-notice { background: var(--new-bg); border: 1px solid color-mix(in srgb, var(--new) 30%, transparent); border-radius: 10px; padding: 14px 16px; margin-bottom: 24px; font-size: 13px; color: var(--new); }
|
|
193
|
+
.missing-notice .m-title { font-weight: 700; margin-bottom: 4px; }
|
|
194
|
+
.missing-notice code { background: var(--code-bg); border-radius: 3px; padding: 1px 5px; font-size: 12px; }
|
|
195
|
+
.missing-notice .m-hint { color: var(--text-muted); font-size: 12px; margin-top: 6px; }
|
|
196
|
+
|
|
197
|
+
/* Notices / empty state */
|
|
198
|
+
.oss-notice { margin-top: 14px; padding: 12px 14px; background: var(--surface); border: 1px solid var(--border-soft); border-radius: 8px; font-size: 11px; color: var(--text-muted); line-height: 1.6; box-shadow: var(--shadow); }
|
|
199
|
+
.oss-notice h4 { margin: 0 0 8px; font-size: 11px; color: var(--text); }
|
|
126
200
|
.oss-notice p { margin: 0 0 6px; }
|
|
127
201
|
.oss-notice p:last-child { margin-bottom: 0; }
|
|
128
|
-
.oss-notice code { background:
|
|
129
|
-
.oss-notice a { color:
|
|
130
|
-
.empty { text-align: center; padding: 48px; color:
|
|
202
|
+
.oss-notice code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; font-size: 10px; }
|
|
203
|
+
.oss-notice a { color: var(--link); }
|
|
204
|
+
.empty { text-align: center; padding: 48px; color: var(--text-muted); }
|
|
131
205
|
.empty .icon { font-size: 48px; margin-bottom: 16px; }
|
|
132
206
|
</style>
|
|
133
207
|
</head>
|
|
134
208
|
<body>
|
|
135
209
|
<aside class="sidebar">
|
|
136
|
-
<
|
|
210
|
+
<div class="brand-row">
|
|
211
|
+
<h1>TestivAI</h1>
|
|
212
|
+
<button class="theme-toggle" id="themeToggle" title="Switch between light and dark theme">🌙 Dark</button>
|
|
213
|
+
</div>
|
|
137
214
|
<div class="version">Visual Report v${escapeHtml(version)}</div>
|
|
138
215
|
<div class="timestamp">${escapeHtml(new Date(timestamp).toLocaleString())}</div>
|
|
139
216
|
|
|
@@ -151,28 +228,34 @@ function renderHtml(data) {
|
|
|
151
228
|
</ul>
|
|
152
229
|
|
|
153
230
|
<div class="cta">
|
|
154
|
-
<h3>
|
|
155
|
-
<p>
|
|
156
|
-
<a href="https://
|
|
231
|
+
<h3>Reviewing with an AI agent?</h3>
|
|
232
|
+
<p>The <code>@testivai/mcp</code> server gives Claude Code, Cursor, and any MCP client this report as structured data — including <code>explain_snapshot</code>, which attributes each diff to selectors and explains why it happened.</p>
|
|
233
|
+
<a href="https://github.com/mcbuddy/testivai-oss/blob/main/docs/guides/ai-agents.md" target="_blank">Agent setup guide</a>
|
|
157
234
|
</div>
|
|
158
235
|
|
|
159
236
|
<div class="oss-notice">
|
|
160
|
-
<h4>⚠️
|
|
237
|
+
<h4>⚠️ Pixel-exact mode</h4>
|
|
161
238
|
<p>Dynamic content (images, fonts, animations) may cause false positives. The <strong>💡 DOM unchanged</strong> hint identifies likely render noise.</p>
|
|
162
239
|
<p>To reduce noise:<br>
|
|
163
240
|
• Raise <code>threshold</code> in <code>.testivai/config.json</code><br>
|
|
164
|
-
• Add <code>ignoreSelectors</code> for dynamic elements
|
|
241
|
+
• Add <code>ignoreSelectors</code> for dynamic elements<br>
|
|
242
|
+
• Use <code>mode: "collapse"</code> for variable-height regions
|
|
165
243
|
</p>
|
|
166
|
-
<p><a href="https://testiv.ai" target="_blank">TestivAI Cloud</a> uses AI-powered noise filtering.</p>
|
|
167
244
|
</div>
|
|
168
245
|
</aside>
|
|
169
246
|
|
|
170
247
|
<main class="main">
|
|
248
|
+
${missing.length > 0 ? `
|
|
249
|
+
<div class="missing-notice">
|
|
250
|
+
<div class="m-title">⚠️ ${missing.length} baseline${missing.length === 1 ? '' : 's'} received no capture this run</div>
|
|
251
|
+
${missing.map((n) => `<code>${escapeHtml(n)}</code>`).join(' ')}
|
|
252
|
+
<div class="m-hint">A deleted or renamed test silently stops guarding its page. If intentional, remove the baseline (and commit); if this was a filtered run (<code>--grep</code>), ignore this notice.</div>
|
|
253
|
+
</div>` : ''}
|
|
171
254
|
${summary.total === 0 ? `
|
|
172
255
|
<div class="empty">
|
|
173
256
|
<div class="icon">📸</div>
|
|
174
257
|
<h2>No snapshots found</h2>
|
|
175
|
-
<p>Run your tests to
|
|
258
|
+
<p>Run your tests to capture snapshots, then re-run the report.</p>
|
|
176
259
|
</div>` : ''}
|
|
177
260
|
|
|
178
261
|
${changed.length > 0 ? `
|
|
@@ -194,15 +277,31 @@ function renderHtml(data) {
|
|
|
194
277
|
</section>` : ''}
|
|
195
278
|
</main>
|
|
196
279
|
|
|
197
|
-
<div class="zoom-overlay" id="zoomOverlay">
|
|
198
|
-
<img id="zoomImage" src="" alt="Zoomed">
|
|
199
|
-
</div>
|
|
280
|
+
<div class="zoom-overlay" id="zoomOverlay"><img id="zoomImg" src="" alt="Zoomed"></div>
|
|
200
281
|
|
|
201
282
|
<script>
|
|
202
|
-
//
|
|
283
|
+
// Theme: light is the default; a stored preference of "dark" overrides.
|
|
284
|
+
(function () {
|
|
285
|
+
const KEY = 'testivai-theme';
|
|
286
|
+
const btn = document.getElementById('themeToggle');
|
|
287
|
+
const apply = (theme) => {
|
|
288
|
+
if (theme === 'dark') document.documentElement.setAttribute('data-theme', 'dark');
|
|
289
|
+
else document.documentElement.removeAttribute('data-theme');
|
|
290
|
+
btn.textContent = theme === 'dark' ? '☀️ Light' : '🌙 Dark';
|
|
291
|
+
};
|
|
292
|
+
let theme = 'light';
|
|
293
|
+
try { theme = localStorage.getItem(KEY) === 'dark' ? 'dark' : 'light'; } catch {}
|
|
294
|
+
apply(theme);
|
|
295
|
+
btn.addEventListener('click', () => {
|
|
296
|
+
theme = theme === 'dark' ? 'light' : 'dark';
|
|
297
|
+
try { localStorage.setItem(KEY, theme); } catch {}
|
|
298
|
+
apply(theme);
|
|
299
|
+
});
|
|
300
|
+
})();
|
|
301
|
+
|
|
203
302
|
document.querySelectorAll('.diff-col img').forEach(img => {
|
|
204
303
|
img.addEventListener('click', () => {
|
|
205
|
-
document.getElementById('
|
|
304
|
+
document.getElementById('zoomImg').src = img.src;
|
|
206
305
|
document.getElementById('zoomOverlay').classList.add('active');
|
|
207
306
|
});
|
|
208
307
|
});
|
|
@@ -210,18 +309,17 @@ function renderHtml(data) {
|
|
|
210
309
|
document.getElementById('zoomOverlay').classList.remove('active');
|
|
211
310
|
});
|
|
212
311
|
|
|
213
|
-
// Region chips zoom the diff image for inspection
|
|
214
312
|
document.querySelectorAll('.region-chip').forEach(chip => {
|
|
215
313
|
chip.addEventListener('click', (e) => {
|
|
216
314
|
e.preventDefault();
|
|
217
315
|
const diff = chip.dataset.diff;
|
|
218
|
-
if (
|
|
219
|
-
|
|
220
|
-
|
|
316
|
+
if (diff) {
|
|
317
|
+
document.getElementById('zoomImg').src = diff;
|
|
318
|
+
document.getElementById('zoomOverlay').classList.add('active');
|
|
319
|
+
}
|
|
221
320
|
});
|
|
222
321
|
});
|
|
223
322
|
|
|
224
|
-
// Copy approve command
|
|
225
323
|
document.querySelectorAll('.copy-btn').forEach(btn => {
|
|
226
324
|
btn.addEventListener('click', () => {
|
|
227
325
|
const cmd = btn.dataset.cmd;
|
|
@@ -257,10 +355,8 @@ function renderSnapshot(snapshot) {
|
|
|
257
355
|
<span class="snapshot-name">${escapeHtml(snapshot.name)}</span>
|
|
258
356
|
<span class="snapshot-badge ${badgeClass}">${snapshot.status}</span>
|
|
259
357
|
</div>
|
|
260
|
-
${
|
|
261
|
-
${
|
|
262
|
-
${renderRegions(snapshot)}
|
|
263
|
-
${renderMasks(snapshot)}
|
|
358
|
+
${renderStats(snapshot)}
|
|
359
|
+
${renderAnalysis(snapshot)}
|
|
264
360
|
<div class="${gridClass}">
|
|
265
361
|
${hasBaseline ? `<div class="diff-col"><label>Baseline</label><img src="${snapshot.baselinePath}" alt="Baseline"></div>` : ''}
|
|
266
362
|
${hasDiff ? `<div class="diff-col"><label>Diff</label><img src="${snapshot.diffPath}" alt="Diff"></div>` : ''}
|
|
@@ -273,6 +369,89 @@ function renderSnapshot(snapshot) {
|
|
|
273
369
|
</div>` : ''}
|
|
274
370
|
</div>`;
|
|
275
371
|
}
|
|
372
|
+
/**
|
|
373
|
+
* Stats line: diff numbers (for changed/auto-passed) plus baseline
|
|
374
|
+
* provenance — when the compared baseline was last approved. A months-old
|
|
375
|
+
* baseline deserves a closer look than yesterday's.
|
|
376
|
+
*/
|
|
377
|
+
function renderStats(snapshot) {
|
|
378
|
+
const parts = [];
|
|
379
|
+
if (snapshot.status === 'changed' || snapshot.autoPassed) {
|
|
380
|
+
parts.push(`Diff: ${snapshot.diffPercent.toFixed(2)}% (${snapshot.diffCount} pixels)${snapshot.autoPassed ? ` — auto-passed: ${snapshot.autoPassed === 'noise' ? 'DOM unchanged, within noise tolerance' : 'within configured diff tolerance'}` : ''}`);
|
|
381
|
+
}
|
|
382
|
+
if (snapshot.baselineApprovedAt) {
|
|
383
|
+
const d = new Date(snapshot.baselineApprovedAt);
|
|
384
|
+
if (!isNaN(d.getTime())) {
|
|
385
|
+
parts.push(`baseline approved ${d.toISOString().slice(0, 10)}`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (parts.length === 0)
|
|
389
|
+
return '';
|
|
390
|
+
return `<div class="snapshot-stats">${parts.join(' · ')}</div>`;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* The "Layered analysis" panel: a synthesized verdict headline followed by
|
|
394
|
+
* the individual evidence layers (DOM/style signal, attributed regions,
|
|
395
|
+
* page shift, masks). This is the human-facing view of the same layered
|
|
396
|
+
* evidence @testivai/mcp's explain_snapshot serves to AI agents.
|
|
397
|
+
*/
|
|
398
|
+
function renderAnalysis(snapshot) {
|
|
399
|
+
const verdict = renderVerdict(snapshot);
|
|
400
|
+
const layers = [renderDomHint(snapshot), renderRegions(snapshot), renderMasks(snapshot)].filter(Boolean).join('');
|
|
401
|
+
if (!verdict && !layers)
|
|
402
|
+
return '';
|
|
403
|
+
return `
|
|
404
|
+
<div class="analysis">
|
|
405
|
+
<div class="analysis-head">
|
|
406
|
+
<span class="analysis-title">Layered analysis</span>
|
|
407
|
+
<span class="analysis-mcp">agents get this via <code>@testivai/mcp</code> · <code>explain_snapshot</code></span>
|
|
408
|
+
</div>
|
|
409
|
+
${verdict}
|
|
410
|
+
${layers}
|
|
411
|
+
</div>`;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Verdict headline: one plain-language line synthesizing the layers, in
|
|
415
|
+
* priority order — style-only change (real) > page shift (injected content)
|
|
416
|
+
* > structural DOM change > render noise > new snapshot > auto-pass.
|
|
417
|
+
*/
|
|
418
|
+
function renderVerdict(snapshot) {
|
|
419
|
+
if (snapshot.status === 'passed' && !snapshot.autoPassed)
|
|
420
|
+
return '';
|
|
421
|
+
if (snapshot.status === 'new') {
|
|
422
|
+
return `<div class="verdict v-new"><span class="v-icon">🆕</span><span>First capture — no baseline yet. Review the image, then approve to make it the baseline.</span></div>`;
|
|
423
|
+
}
|
|
424
|
+
if (snapshot.dom?.styleCheck === 'mismatch' && snapshot.dom.styleChanges) {
|
|
425
|
+
const n = snapshot.dom.styleChanges.count;
|
|
426
|
+
const first = snapshot.dom.styleChanges.elements[0];
|
|
427
|
+
const el = first ? `<code>${escapeHtml(first.split(' > ').slice(-1)[0])}</code>` : '';
|
|
428
|
+
return `<div class="verdict v-style"><span class="v-icon">🎨</span><span>Style-only change — a real change, not noise: ${n} element${n === 1 ? '' : 's'} restyled with identical DOM${el ? ` (${el}${n > 1 ? ', …' : ''})` : ''}. Confirm it's intended before approving.</span></div>`;
|
|
429
|
+
}
|
|
430
|
+
if (snapshot.pageShift) {
|
|
431
|
+
const p = snapshot.pageShift;
|
|
432
|
+
return `<div class="verdict v-shift"><span class="v-icon">↕️</span><span>Layout shift — everything below y=${p.belowY} moved ${p.dy > 0 ? 'down' : 'up'} ${Math.abs(p.dy)}px (${p.count} elements together). Look <em>above</em> that line for inserted or removed content; the moved elements themselves are unchanged.</span></div>`;
|
|
433
|
+
}
|
|
434
|
+
if (snapshot.dom?.changed && snapshot.dom.summary) {
|
|
435
|
+
const s = snapshot.dom.summary;
|
|
436
|
+
const parts = [];
|
|
437
|
+
if (s.added > 0)
|
|
438
|
+
parts.push(`${s.added} added`);
|
|
439
|
+
if (s.removed > 0)
|
|
440
|
+
parts.push(`${s.removed} removed`);
|
|
441
|
+
if (s.attributeChanges > 0)
|
|
442
|
+
parts.push(`${s.attributeChanges} attribute`);
|
|
443
|
+
if (s.textChanges)
|
|
444
|
+
parts.push(`${s.textChanges} text`);
|
|
445
|
+
return `<div class="verdict v-structural"><span class="v-icon">🧱</span><span>Structural change — the DOM differs (${escapeHtml(parts.join(', ') || 'structural difference')}). Review the diff and confirm the change is intended before approving.</span></div>`;
|
|
446
|
+
}
|
|
447
|
+
if (snapshot.dom?.noiseHint) {
|
|
448
|
+
return `<div class="verdict v-noise"><span class="v-icon">💡</span><span>Likely render noise — pixels differ but the DOM${snapshot.dom.styleCheck === 'match' ? ' and computed styles are' : ' is'} identical (anti-aliasing, font hinting). Worth a glance, not a block.</span></div>`;
|
|
449
|
+
}
|
|
450
|
+
if (snapshot.autoPassed) {
|
|
451
|
+
return `<div class="verdict v-pass"><span class="v-icon">✅</span><span>Auto-passed via the <code>${snapshot.autoPassed}</code> criterion — reported for transparency, no action needed.</span></div>`;
|
|
452
|
+
}
|
|
453
|
+
return '';
|
|
454
|
+
}
|
|
276
455
|
/**
|
|
277
456
|
* Render the DOM noise-hint badge for a snapshot.
|
|
278
457
|
*
|
|
@@ -1 +1 @@
|
|
|
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"}
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":"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"}
|