@testivai/witness 2.5.0 → 2.6.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/README.md +9 -2
- package/dist/baselines/store.d.ts +14 -0
- package/dist/baselines/store.d.ts.map +1 -1
- package/dist/baselines/store.js +12 -4
- package/dist/baselines/store.js.map +1 -1
- package/dist/capture/element-map.d.ts +23 -2
- package/dist/capture/element-map.d.ts.map +1 -1
- package/dist/capture/element-map.js +102 -4
- package/dist/capture/element-map.js.map +1 -1
- package/dist/capture/environment.d.ts +26 -0
- package/dist/capture/environment.d.ts.map +1 -1
- package/dist/capture/environment.js +4 -0
- package/dist/capture/environment.js.map +1 -1
- package/dist/capture/health-limits.d.ts +14 -0
- package/dist/capture/health-limits.d.ts.map +1 -0
- package/dist/capture/health-limits.js +17 -0
- package/dist/capture/health-limits.js.map +1 -0
- package/dist/capture/health.d.ts +124 -0
- package/dist/capture/health.d.ts.map +1 -0
- package/dist/capture/health.js +327 -0
- package/dist/capture/health.js.map +1 -0
- package/dist/capture/native-app.d.ts +77 -0
- package/dist/capture/native-app.d.ts.map +1 -0
- package/dist/capture/native-app.js +172 -0
- package/dist/capture/native-app.js.map +1 -0
- package/dist/capture/shard.d.ts +17 -0
- package/dist/capture/shard.d.ts.map +1 -1
- package/dist/capture/shard.js +8 -1
- package/dist/capture/shard.js.map +1 -1
- package/dist/commands/approve.d.ts.map +1 -1
- package/dist/commands/approve.js +20 -0
- package/dist/commands/approve.js.map +1 -1
- package/dist/commands/merge-captures.d.ts.map +1 -1
- package/dist/commands/merge-captures.js +10 -0
- package/dist/commands/merge-captures.js.map +1 -1
- package/dist/config/local-config.d.ts +13 -0
- package/dist/config/local-config.d.ts.map +1 -1
- package/dist/config/local-config.js.map +1 -1
- package/dist/config/validate-config.d.ts.map +1 -1
- package/dist/config/validate-config.js +10 -0
- package/dist/config/validate-config.js.map +1 -1
- package/dist/diff/attribution.d.ts +16 -2
- package/dist/diff/attribution.d.ts.map +1 -1
- package/dist/diff/attribution.js +5 -4
- package/dist/diff/attribution.js.map +1 -1
- package/dist/diff/dom-diff.d.ts.map +1 -1
- package/dist/diff/dom-diff.js +7 -1
- package/dist/diff/dom-diff.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -2
- package/dist/index.js.map +1 -1
- package/dist/report/compare.d.ts +11 -1
- package/dist/report/compare.d.ts.map +1 -1
- package/dist/report/compare.js +86 -15
- package/dist/report/compare.js.map +1 -1
- package/dist/report/environment.d.ts.map +1 -1
- package/dist/report/environment.js +25 -2
- package/dist/report/environment.js.map +1 -1
- package/dist/report/generator.d.ts +15 -2
- package/dist/report/generator.d.ts.map +1 -1
- package/dist/report/generator.js +15 -2
- package/dist/report/generator.js.map +1 -1
- package/dist/report/health.d.ts +115 -0
- package/dist/report/health.d.ts.map +1 -0
- package/dist/report/health.js +279 -0
- package/dist/report/health.js.map +1 -0
- package/dist/report/index.d.ts +5 -1
- package/dist/report/index.d.ts.map +1 -1
- package/dist/report/index.js +15 -1
- package/dist/report/index.js.map +1 -1
- package/dist/report/results.d.ts +40 -1
- package/dist/report/results.d.ts.map +1 -1
- package/dist/report/shift-check.d.ts +40 -0
- package/dist/report/shift-check.d.ts.map +1 -0
- package/dist/report/shift-check.js +109 -0
- package/dist/report/shift-check.js.map +1 -0
- package/dist/report/template.d.ts.map +1 -1
- package/dist/report/template.js +53 -2
- package/dist/report/template.js.map +1 -1
- package/dist/report/thumbnail.d.ts +76 -0
- package/dist/report/thumbnail.d.ts.map +1 -0
- package/dist/report/thumbnail.js +166 -0
- package/dist/report/thumbnail.js.map +1 -0
- package/dist/report/validate.d.ts +5 -2
- package/dist/report/validate.d.ts.map +1 -1
- package/dist/report/validate.js +42 -2
- package/dist/report/validate.js.map +1 -1
- package/dist/standalone/run.d.ts +27 -1
- package/dist/standalone/run.d.ts.map +1 -1
- package/dist/standalone/run.js +105 -2
- package/dist/standalone/run.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Native app captures (experimental): what an Appium session's capabilities
|
|
4
|
+
* say about the device a native screen was captured on.
|
|
5
|
+
*
|
|
6
|
+
* A native screen has no page, so nothing is measured in it: the device, its
|
|
7
|
+
* OS, its screen and the status bar come from the capabilities. Appium answers
|
|
8
|
+
* a new session with unprefixed keys (`platformVersion`, `deviceModel`) and
|
|
9
|
+
* keeps what was asked for under `desired`; a session started with W3C keys
|
|
10
|
+
* has them prefixed (`appium:deviceName`). Every reader here accepts both.
|
|
11
|
+
* Whatever the capabilities do not say is left out, never guessed.
|
|
12
|
+
*
|
|
13
|
+
* The Android readings are what Appium 3.9 + UiAutomator2 8.7 returned on an
|
|
14
|
+
* Android 14 emulator; the iOS ones follow XCUITest's documented
|
|
15
|
+
* capabilities and are not verified on a simulator in this repository's CI.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.mobilePlatform = mobilePlatform;
|
|
19
|
+
exports.namesBrowser = namesBrowser;
|
|
20
|
+
exports.isNativeAppCapabilities = isNativeAppCapabilities;
|
|
21
|
+
exports.nativeAppDevice = nativeAppDevice;
|
|
22
|
+
exports.nativeAppVariant = nativeAppVariant;
|
|
23
|
+
exports.statusBarFromCapabilities = statusBarFromCapabilities;
|
|
24
|
+
exports.statusBarFromViewportRect = statusBarFromViewportRect;
|
|
25
|
+
exports.statusBarFromSystemBars = statusBarFromSystemBars;
|
|
26
|
+
exports.appiumEnvironment = appiumEnvironment;
|
|
27
|
+
const environment_1 = require("./environment");
|
|
28
|
+
const asRecord = (v) => (v && typeof v === 'object' && !Array.isArray(v) ? v : null);
|
|
29
|
+
/** A capability as the session returned it, else as it was asked for. */
|
|
30
|
+
function returned(caps, key) {
|
|
31
|
+
return caps[key] ?? caps[`appium:${key}`];
|
|
32
|
+
}
|
|
33
|
+
function requested(caps, key) {
|
|
34
|
+
const desired = asRecord(caps.desired);
|
|
35
|
+
return desired?.[key] ?? desired?.[`appium:${key}`] ?? caps[`appium:${key}`];
|
|
36
|
+
}
|
|
37
|
+
const text = (v) => (typeof v === 'string' && v.trim().length > 0 ? v.trim() : undefined);
|
|
38
|
+
function positive(v) {
|
|
39
|
+
const n = typeof v === 'string' ? Number(v) : v;
|
|
40
|
+
return typeof n === 'number' && Number.isFinite(n) && n > 0 ? n : undefined;
|
|
41
|
+
}
|
|
42
|
+
/** android / ios, or null for anything else (a desktop browser, no capabilities). */
|
|
43
|
+
function mobilePlatform(capabilities) {
|
|
44
|
+
const caps = asRecord(capabilities);
|
|
45
|
+
const name = caps ? text(returned(caps, 'platformName'))?.toLowerCase() : undefined;
|
|
46
|
+
return name === 'android' || name === 'ios' ? name : null;
|
|
47
|
+
}
|
|
48
|
+
/** Whether the session names a browser (a mobile or desktop browser session). */
|
|
49
|
+
function namesBrowser(capabilities) {
|
|
50
|
+
const caps = asRecord(capabilities);
|
|
51
|
+
return Boolean(caps && text(caps.browserName));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* An Appium session started on an app: Android or iOS, no browser, and an
|
|
55
|
+
* `app`, `appPackage` or `bundleId`. A mobile session that names neither is
|
|
56
|
+
* decided by its current context (the adapter asks).
|
|
57
|
+
*/
|
|
58
|
+
function isNativeAppCapabilities(capabilities) {
|
|
59
|
+
const caps = asRecord(capabilities);
|
|
60
|
+
if (!caps || !mobilePlatform(caps) || namesBrowser(caps))
|
|
61
|
+
return false;
|
|
62
|
+
return ['app', 'appPackage', 'bundleId'].some((key) => text(returned(caps, key)) !== undefined);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The device from the capabilities. The name is the one the session asked for:
|
|
66
|
+
* on Android, Appium puts the device serial (`emulator-5554`) in the
|
|
67
|
+
* deviceName it returns.
|
|
68
|
+
*/
|
|
69
|
+
function nativeAppDevice(capabilities) {
|
|
70
|
+
const caps = asRecord(capabilities) ?? {};
|
|
71
|
+
const platform = mobilePlatform(caps) ?? 'unknown';
|
|
72
|
+
const device = { platform };
|
|
73
|
+
const osVersion = text(returned(caps, 'platformVersion'));
|
|
74
|
+
if (osVersion)
|
|
75
|
+
device.osVersion = osVersion;
|
|
76
|
+
const model = text(returned(caps, 'deviceModel'));
|
|
77
|
+
if (model)
|
|
78
|
+
device.model = model;
|
|
79
|
+
const name = text(requested(caps, 'deviceName')) ?? (platform === 'ios' ? text(returned(caps, 'deviceName')) : undefined);
|
|
80
|
+
if (name)
|
|
81
|
+
device.name = name;
|
|
82
|
+
const automation = text(returned(caps, 'automationName'));
|
|
83
|
+
if (automation)
|
|
84
|
+
device.automation = automation;
|
|
85
|
+
const screen = text(returned(caps, 'deviceScreenSize'));
|
|
86
|
+
if (screen && /^\d+x\d+$/.test(screen))
|
|
87
|
+
device.screen = screen;
|
|
88
|
+
const density = positive(returned(caps, 'deviceScreenDensity'));
|
|
89
|
+
if (density)
|
|
90
|
+
device.density = density;
|
|
91
|
+
return device;
|
|
92
|
+
}
|
|
93
|
+
/** Lowercase, every run of other characters one `_`, none leading or trailing. */
|
|
94
|
+
function segment(s) {
|
|
95
|
+
let out = s.toLowerCase().replace(/[^a-z0-9]+/g, '_');
|
|
96
|
+
// Runs are collapsed above, so at most one `_` sits at either end.
|
|
97
|
+
if (out.startsWith('_'))
|
|
98
|
+
out = out.slice(1);
|
|
99
|
+
if (out.endsWith('_'))
|
|
100
|
+
out = out.slice(0, -1);
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The snapshot key for a device, `<platform>-<device>-<osMajor>`: the model
|
|
105
|
+
* the device reports, else the name the session asked for, and the OS major
|
|
106
|
+
* version. A part the capabilities do not give is left out.
|
|
107
|
+
*/
|
|
108
|
+
function nativeAppVariant(device) {
|
|
109
|
+
const who = device.model ?? device.name;
|
|
110
|
+
const major = device.osVersion?.split('.')[0];
|
|
111
|
+
return [device.platform, who, major]
|
|
112
|
+
.filter((p) => Boolean(p))
|
|
113
|
+
.map(segment)
|
|
114
|
+
.filter((p) => p.length > 0)
|
|
115
|
+
.join('-');
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The status bar's height in screenshot pixels from the session's
|
|
119
|
+
* capabilities (UiAutomator2 returns `viewportRect` and `statBarHeight`), or
|
|
120
|
+
* null. UiAutomator2 reads it once, when the session starts, from a resource
|
|
121
|
+
* of its own server app, so it can be short (63 px for a 136 px bar on an
|
|
122
|
+
* Android 14 emulator) and does not follow a rotation: on Android the
|
|
123
|
+
* adapters prefer the window manager's frame (`statusBarFromSystemBars`).
|
|
124
|
+
*/
|
|
125
|
+
function statusBarFromCapabilities(capabilities) {
|
|
126
|
+
const caps = asRecord(capabilities) ?? {};
|
|
127
|
+
return statusBarFromViewportRect(returned(caps, 'viewportRect')) ?? positive(returned(caps, 'statBarHeight')) ?? null;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The top of a viewport rectangle (`mobile: viewportRect`), or null. On
|
|
131
|
+
* UiAutomator2 its top is the session-start reading above; on XCUITest it is
|
|
132
|
+
* the iOS source.
|
|
133
|
+
*/
|
|
134
|
+
function statusBarFromViewportRect(rect) {
|
|
135
|
+
const top = asRecord(rect)?.top;
|
|
136
|
+
return typeof top === 'number' && Number.isFinite(top) && top > 0 ? Math.round(top) : null;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The bottom of the status bar's window frame in screenshot pixels, from
|
|
140
|
+
* Appium's Android `mobile: getSystemBars` (`{ statusBar: { visible, x, y,
|
|
141
|
+
* width, height }, navigationBar }`, read from the window manager when it is
|
|
142
|
+
* called), or null when the bar is not visible, the driver found none
|
|
143
|
+
* (it answers a zero frame), or the answer is not that shape.
|
|
144
|
+
*/
|
|
145
|
+
function statusBarFromSystemBars(bars) {
|
|
146
|
+
const bar = asRecord(asRecord(bars)?.statusBar);
|
|
147
|
+
if (!bar || bar.visible === false)
|
|
148
|
+
return null;
|
|
149
|
+
const { y, height } = bar;
|
|
150
|
+
if (typeof y !== 'number' || typeof height !== 'number' || !Number.isFinite(y) || !Number.isFinite(height))
|
|
151
|
+
return null;
|
|
152
|
+
const bottom = Math.ceil(y + height);
|
|
153
|
+
return height > 0 && bottom > 0 ? bottom : null;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The environment block of a native app capture: the machine the tests ran on
|
|
157
|
+
* (`os`), `browser.name: "native-app"` so every reader of the contract still
|
|
158
|
+
* reads it, the device, and the pixel ratio as the device scale.
|
|
159
|
+
*/
|
|
160
|
+
function appiumEnvironment(input) {
|
|
161
|
+
const caps = asRecord(input.capabilities) ?? {};
|
|
162
|
+
const scale = positive(returned(caps, 'pixelRatio'));
|
|
163
|
+
return (0, environment_1.buildCaptureEnvironment)({
|
|
164
|
+
host: input.host ?? (0, environment_1.collectHostEnvironment)(),
|
|
165
|
+
browser: { name: 'native-app', version: null },
|
|
166
|
+
framework: { ...input.framework },
|
|
167
|
+
adapter: input.adapter,
|
|
168
|
+
render: scale ? { deviceScaleFactor: scale } : undefined,
|
|
169
|
+
device: nativeAppDevice(caps),
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=native-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-app.js","sourceRoot":"","sources":["../../src/capture/native-app.ts"],"names":[],"mappings":"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"}
|
package/dist/capture/shard.d.ts
CHANGED
|
@@ -17,6 +17,23 @@ export interface ShardInfo {
|
|
|
17
17
|
total: number;
|
|
18
18
|
}
|
|
19
19
|
export declare const SHARD_MANIFEST = "testivai-shard.json";
|
|
20
|
+
/**
|
|
21
|
+
* Written by `merge-captures` beside the captures it merged: whether every
|
|
22
|
+
* shard reported. When one did not, the merge fails and the comparison after
|
|
23
|
+
* it does not run; the GitHub Action, which runs after a failure too, reads
|
|
24
|
+
* this so it never compares part of the suite as if it were the whole.
|
|
25
|
+
*/
|
|
26
|
+
export declare const MERGE_RECORD = "testivai-merge.json";
|
|
27
|
+
export interface MergeRecord {
|
|
28
|
+
/** The shard total the manifests declare (or --expect); null for an unsharded merge. */
|
|
29
|
+
shardTotal: number | null;
|
|
30
|
+
shardsSeen: number[];
|
|
31
|
+
/** Shards that never reported: the merged captures are part of the suite. */
|
|
32
|
+
shardsMissing: number[];
|
|
33
|
+
/** How many captures were merged. */
|
|
34
|
+
merged: number;
|
|
35
|
+
timestamp: string;
|
|
36
|
+
}
|
|
20
37
|
/** Parse `TESTIVAI_SHARD` in either `3/8` or `3of8` form. Invalid → null. */
|
|
21
38
|
export declare function parseShardEnv(value: string | undefined): ShardInfo | null;
|
|
22
39
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shard.d.ts","sourceRoot":"","sources":["../../src/capture/shard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,cAAc,wBAAwB,CAAC;AAEpD,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CASzE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,OAAO,GAAG,SAAS,EAC7B,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAKT;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,IAAI,CAqBN"}
|
|
1
|
+
{"version":3,"file":"shard.d.ts","sourceRoot":"","sources":["../../src/capture/shard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,cAAc,wBAAwB,CAAC;AAEpD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,wFAAwF;IACxF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,6EAA6E;IAC7E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CASzE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,OAAO,GAAG,SAAS,EAC7B,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAKT;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,IAAI,CAqBN"}
|
package/dist/capture/shard.js
CHANGED
|
@@ -47,13 +47,20 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
47
47
|
};
|
|
48
48
|
})();
|
|
49
49
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
-
exports.SHARD_MANIFEST = void 0;
|
|
50
|
+
exports.MERGE_RECORD = exports.SHARD_MANIFEST = void 0;
|
|
51
51
|
exports.parseShardEnv = parseShardEnv;
|
|
52
52
|
exports.resolveCaptureOnly = resolveCaptureOnly;
|
|
53
53
|
exports.writeShardManifest = writeShardManifest;
|
|
54
54
|
const fs = __importStar(require("fs"));
|
|
55
55
|
const path = __importStar(require("path"));
|
|
56
56
|
exports.SHARD_MANIFEST = 'testivai-shard.json';
|
|
57
|
+
/**
|
|
58
|
+
* Written by `merge-captures` beside the captures it merged: whether every
|
|
59
|
+
* shard reported. When one did not, the merge fails and the comparison after
|
|
60
|
+
* it does not run; the GitHub Action, which runs after a failure too, reads
|
|
61
|
+
* this so it never compares part of the suite as if it were the whole.
|
|
62
|
+
*/
|
|
63
|
+
exports.MERGE_RECORD = 'testivai-merge.json';
|
|
57
64
|
/** Parse `TESTIVAI_SHARD` in either `3/8` or `3of8` form. Invalid → null. */
|
|
58
65
|
function parseShardEnv(value) {
|
|
59
66
|
if (!value)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shard.js","sourceRoot":"","sources":["../../src/capture/shard.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"shard.js","sourceRoot":"","sources":["../../src/capture/shard.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCH,sCASC;AAMD,gDASC;AAuBD,gDAyBC;AAtGD,uCAAyB;AACzB,2CAA6B;AAOhB,QAAA,cAAc,GAAG,qBAAqB,CAAC;AAEpD;;;;;GAKG;AACU,QAAA,YAAY,GAAG,qBAAqB,CAAC;AAalD,6EAA6E;AAC7E,SAAgB,aAAa,CAAC,KAAyB;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtE,IAAI,KAAK,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAChC,QAA6B,EAC7B,KAAuB,EACvB,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,OAAO,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,qBAAqB,CAAC;IACtC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;IACzF,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC;AAgBD;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAChC,QAAgB,EAChB,KAAgB,EAChB,UAAmD,EAAE;IAErD,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,EAAE;aAChB,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC9C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,EAAE,CAAC;QAEV,MAAM,QAAQ,GAAkB;YAC9B,KAAK;YACL,QAAQ;YACR,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,mDAAmD;IACrD,CAAC;AACH,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;
|
|
1
|
+
{"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,eAAO,MAAM,cAAc,SA6HvB,CAAC"}
|
package/dist/commands/approve.js
CHANGED
|
@@ -7,7 +7,25 @@ exports.approveCommand = void 0;
|
|
|
7
7
|
const commander_1 = require("commander");
|
|
8
8
|
const chalk_1 = __importDefault(require("chalk"));
|
|
9
9
|
const store_1 = require("../baselines/store");
|
|
10
|
+
const health_1 = require("../capture/health");
|
|
11
|
+
const health_2 = require("../report/health");
|
|
10
12
|
const logger_1 = require("../utils/logger");
|
|
13
|
+
/**
|
|
14
|
+
* Warn when the capture about to become the baseline is unhealthy (a font or
|
|
15
|
+
* stylesheet failed to load): every compare against it would say so. It is
|
|
16
|
+
* still approved. With --json the warning goes to stderr, so stdout stays the
|
|
17
|
+
* JSON result.
|
|
18
|
+
*/
|
|
19
|
+
function warnIfUnhealthy(store, name, json) {
|
|
20
|
+
const warning = (0, health_2.approveHealthWarning)((0, health_1.parseHealth)(store.readTempMetadata(name)?.health));
|
|
21
|
+
if (!warning)
|
|
22
|
+
return;
|
|
23
|
+
const line = ` ⚠ ${name}: ${warning}.`;
|
|
24
|
+
if (json)
|
|
25
|
+
process.stderr.write(`${line}\n`);
|
|
26
|
+
else
|
|
27
|
+
console.log(chalk_1.default.yellow(line));
|
|
28
|
+
}
|
|
11
29
|
exports.approveCommand = new commander_1.Command('approve')
|
|
12
30
|
.description('Approve visual snapshots as new baselines')
|
|
13
31
|
.argument('[name]', 'Snapshot name to approve (omit for interactive list)')
|
|
@@ -72,6 +90,7 @@ exports.approveCommand = new commander_1.Command('approve')
|
|
|
72
90
|
const failed = [];
|
|
73
91
|
for (const snapName of tempNames) {
|
|
74
92
|
try {
|
|
93
|
+
warnIfUnhealthy(store, snapName, options.json);
|
|
75
94
|
store.approve(snapName);
|
|
76
95
|
approvedNames.push(snapName);
|
|
77
96
|
if (!options.json)
|
|
@@ -98,6 +117,7 @@ exports.approveCommand = new commander_1.Command('approve')
|
|
|
98
117
|
// ── Approve specific name ─────────────────────────────────────────────
|
|
99
118
|
if (name) {
|
|
100
119
|
try {
|
|
120
|
+
warnIfUnhealthy(store, name, options.json);
|
|
101
121
|
store.approve(name);
|
|
102
122
|
if (options.json)
|
|
103
123
|
process.stdout.write(JSON.stringify({ approved: [name], failed: [] }) + '\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAmD;AACnD,4CAAyC;
|
|
1
|
+
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-captures.d.ts","sourceRoot":"","sources":["../../src/commands/merge-captures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"merge-captures.d.ts","sourceRoot":"","sources":["../../src/commands/merge-captures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,iEAAiE;IACjE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gDAAgD;IAChD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kEAAkE;IAClE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,2DAA2D;IAC3D,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAgBD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,WAAW,CAkFb;AAED,eAAO,MAAM,oBAAoB,SAiE7B,CAAC"}
|
|
@@ -67,6 +67,7 @@ const commander_1 = require("commander");
|
|
|
67
67
|
const chalk_1 = __importDefault(require("chalk"));
|
|
68
68
|
const fs = __importStar(require("fs"));
|
|
69
69
|
const path = __importStar(require("path"));
|
|
70
|
+
const shard_1 = require("../capture/shard");
|
|
70
71
|
/** A directory is a capture if it holds the file every capture must have. */
|
|
71
72
|
function isCaptureDir(dir) {
|
|
72
73
|
return fs.existsSync(path.join(dir, 'screenshot.png'));
|
|
@@ -161,6 +162,15 @@ function mergeCaptures(sources, destTemp, options = {}) {
|
|
|
161
162
|
const shardsMissing = shardTotal === null
|
|
162
163
|
? []
|
|
163
164
|
: Array.from({ length: shardTotal }, (_, i) => i + 1).filter((i) => !shardsSeen.includes(i));
|
|
165
|
+
// Say whether the merge is the whole suite, beside the captures (shard.ts).
|
|
166
|
+
const record = {
|
|
167
|
+
shardTotal,
|
|
168
|
+
shardsSeen,
|
|
169
|
+
shardsMissing,
|
|
170
|
+
merged: seen.size,
|
|
171
|
+
timestamp: new Date().toISOString(),
|
|
172
|
+
};
|
|
173
|
+
fs.writeFileSync(path.join(destTemp, shard_1.MERGE_RECORD), JSON.stringify(record, null, 2));
|
|
164
174
|
return {
|
|
165
175
|
merged: [...seen.keys()].sort(),
|
|
166
176
|
conflicts: [...new Set(conflicts)].sort(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-captures.js","sourceRoot":"","sources":["../../src/commands/merge-captures.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"merge-captures.js","sourceRoot":"","sources":["../../src/commands/merge-captures.ts"],"names":[],"mappings":"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"}
|
|
@@ -149,6 +149,19 @@ export interface LocalConfig {
|
|
|
149
149
|
* changed, whatever its pixels say (exit 1 with --fail-on-diff).
|
|
150
150
|
*/
|
|
151
151
|
environmentPolicy?: EnvironmentPolicy;
|
|
152
|
+
/**
|
|
153
|
+
* Opt-in: attribute names (e.g. ["data-testid"]) that anchor element
|
|
154
|
+
* paths in the element map. An element's path then starts at its nearest
|
|
155
|
+
* ancestor-or-self carrying one of them with a value unique in the page:
|
|
156
|
+
* `div[data-testid="board"] > div.css-146c3p1` instead of a
|
|
157
|
+
* `div.css-…:nth-of-type(4)` chain from body. Content inserted above an
|
|
158
|
+
* anchored element no longer renames it, so a moved element reads as a
|
|
159
|
+
* shift. Listed order is the precedence; a value used twice is not an
|
|
160
|
+
* anchor. Unset (the default): paths are unchanged. Changing it changes
|
|
161
|
+
* the paths, so styles are not compared against baselines captured with
|
|
162
|
+
* another setting until they are re-approved.
|
|
163
|
+
*/
|
|
164
|
+
elementIdAttributes?: string[];
|
|
152
165
|
}
|
|
153
166
|
/**
|
|
154
167
|
* Load local config from `.testivai/config.json`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-config.d.ts","sourceRoot":"","sources":["../../src/config/local-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,+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;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B;;;;;;;;;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;;;;;;;;;;;;;;OAcG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;;;OAIG;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;IAC7C;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"local-config.d.ts","sourceRoot":"","sources":["../../src/config/local-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,+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;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B;;;;;;;;;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;;;;;;;;;;;;;;OAcG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;;;OAIG;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;IAC7C;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;;;;;;;;;;OAWG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAqChE;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;;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":"validate-config.d.ts","sourceRoot":"","sources":["../../src/config/validate-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"validate-config.d.ts","sourceRoot":"","sources":["../../src/config/validate-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA6CH,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAQD,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAexD;AAoBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAyDrE"}
|
|
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.levenshtein = levenshtein;
|
|
16
16
|
exports.validateLocalConfig = validateLocalConfig;
|
|
17
17
|
const environment_1 = require("../capture/environment");
|
|
18
|
+
const element_map_1 = require("../capture/element-map");
|
|
18
19
|
/** Expected JSON type for every known LocalConfig field. */
|
|
19
20
|
const KNOWN_FIELDS = {
|
|
20
21
|
threshold: 'number',
|
|
@@ -39,6 +40,7 @@ const KNOWN_FIELDS = {
|
|
|
39
40
|
viewport: 'object',
|
|
40
41
|
mcpApprovalPrompt: 'boolean',
|
|
41
42
|
environmentPolicy: 'string',
|
|
43
|
+
elementIdAttributes: 'array',
|
|
42
44
|
};
|
|
43
45
|
/** String fields that only take one of a fixed set of values; the first is the default. */
|
|
44
46
|
const ENUM_FIELDS = {
|
|
@@ -131,6 +133,14 @@ function validateLocalConfig(parsed) {
|
|
|
131
133
|
if (actual !== expected) {
|
|
132
134
|
warnings.push(`config key "${key}" should be a ${expected}, got ${actual} (${JSON.stringify(value)}) — using the default instead.`);
|
|
133
135
|
invalidKeys.push(key);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (key === 'elementIdAttributes') {
|
|
139
|
+
for (const name of value) {
|
|
140
|
+
if (typeof name !== 'string' || !element_map_1.ID_ATTRIBUTE_NAME.test(name)) {
|
|
141
|
+
warnings.push(`elementIdAttributes entry ${JSON.stringify(name)} is not a plain attribute name (letters, digits, "-" and "_") — it is being ignored.`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
134
144
|
}
|
|
135
145
|
}
|
|
136
146
|
return { warnings, invalidKeys };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-config.js","sourceRoot":"","sources":["../../src/config/validate-config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;
|
|
1
|
+
{"version":3,"file":"validate-config.js","sourceRoot":"","sources":["../../src/config/validate-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,19 @@ export interface PageShift {
|
|
|
54
54
|
}
|
|
55
55
|
/** Parse an element map, dropping malformed entries. Never throws. */
|
|
56
56
|
export declare function parseElementMap(raw: unknown): ElementMapEntry[];
|
|
57
|
+
interface Rect {
|
|
58
|
+
x: number;
|
|
59
|
+
y: number;
|
|
60
|
+
width: number;
|
|
61
|
+
height: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Confirms that a pair the maps call a pure move is the same content, moved
|
|
65
|
+
* (report/shift-check.ts checks the pixels). Paths renumbered by inserted
|
|
66
|
+
* content can pair an element with a look-alike neighbour: same size and
|
|
67
|
+
* styles, different content. Without a check the maps' claim stands.
|
|
68
|
+
*/
|
|
69
|
+
export type ShiftCheck = (baseline: Rect, candidate: Rect) => boolean;
|
|
57
70
|
/**
|
|
58
71
|
* Attribute diff regions to elements and classify pure translations.
|
|
59
72
|
*
|
|
@@ -62,7 +75,7 @@ export declare function parseElementMap(raw: unknown): ElementMapEntry[];
|
|
|
62
75
|
* the region's center. The primary element is the smallest match; its
|
|
63
76
|
* role decides the region's classification.
|
|
64
77
|
*/
|
|
65
|
-
export declare function attributeRegions(regions: DiffRegion[], baselineMap: ElementMapEntry[], candidateMap: ElementMapEntry[]): AttributedRegion[];
|
|
78
|
+
export declare function attributeRegions(regions: DiffRegion[], baselineMap: ElementMapEntry[], candidateMap: ElementMapEntry[], confirmShift?: ShiftCheck): AttributedRegion[];
|
|
66
79
|
export interface StyleComparison {
|
|
67
80
|
status: 'match' | 'mismatch' | 'unavailable';
|
|
68
81
|
/** Paths whose computed-style digest changed (mismatch only). */
|
|
@@ -102,5 +115,6 @@ export declare function compareStyleHashes(baselineMap: ElementMapEntry[], candi
|
|
|
102
115
|
* group (≥80% of all vertically-moved elements, at least `minElements`)
|
|
103
116
|
* sharing one exact dy with dx=0 is reported.
|
|
104
117
|
*/
|
|
105
|
-
export declare function detectPageShift(baselineMap: ElementMapEntry[], candidateMap: ElementMapEntry[], minElements?: number): PageShift | null;
|
|
118
|
+
export declare function detectPageShift(baselineMap: ElementMapEntry[], candidateMap: ElementMapEntry[], minElements?: number, confirmShift?: ShiftCheck): PageShift | null;
|
|
119
|
+
export {};
|
|
106
120
|
//# sourceMappingURL=attribution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/diff/attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,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;
|
|
1
|
+
{"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/diff/attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,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;AAED,UAAU,IAAI;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAwBD;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,KAAK,OAAO,CAAC;AAKtE;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,UAAU,EAAE,EACrB,WAAW,EAAE,eAAe,EAAE,EAC9B,YAAY,EAAE,eAAe,EAAE,EAC/B,YAAY,CAAC,EAAE,UAAU,GACxB,gBAAgB,EAAE,CAoDpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;IAC7C,iEAAiE;IACjE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,eAAe,EAAE,EAC9B,YAAY,EAAE,eAAe,EAAE,GAC9B,eAAe,CAiBjB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,eAAe,EAAE,EAC9B,YAAY,EAAE,eAAe,EAAE,EAC/B,WAAW,SAAI,EACf,YAAY,CAAC,EAAE,UAAU,GACxB,SAAS,GAAG,IAAI,CAgClB"}
|
package/dist/diff/attribution.js
CHANGED
|
@@ -78,7 +78,7 @@ const MAX_ELEMENTS_PER_REGION = 3;
|
|
|
78
78
|
* the region's center. The primary element is the smallest match; its
|
|
79
79
|
* role decides the region's classification.
|
|
80
80
|
*/
|
|
81
|
-
function attributeRegions(regions, baselineMap, candidateMap) {
|
|
81
|
+
function attributeRegions(regions, baselineMap, candidateMap, confirmShift) {
|
|
82
82
|
if (baselineMap.length === 0 || candidateMap.length === 0) {
|
|
83
83
|
return regions;
|
|
84
84
|
}
|
|
@@ -105,7 +105,8 @@ function attributeRegions(regions, baselineMap, candidateMap) {
|
|
|
105
105
|
b.width === m.el.width &&
|
|
106
106
|
b.height === m.el.height &&
|
|
107
107
|
b.styleHash === m.el.styleHash &&
|
|
108
|
-
(b.x !== m.el.x || b.y !== m.el.y)
|
|
108
|
+
(b.x !== m.el.x || b.y !== m.el.y) &&
|
|
109
|
+
(!confirmShift || confirmShift(b, m.el))) {
|
|
109
110
|
return { role: 'shifted', dx: m.el.x - b.x, dy: m.el.y - b.y };
|
|
110
111
|
}
|
|
111
112
|
return { role: 'changed', dx: 0, dy: 0 };
|
|
@@ -178,7 +179,7 @@ function compareStyleHashes(baselineMap, candidateMap) {
|
|
|
178
179
|
* group (≥80% of all vertically-moved elements, at least `minElements`)
|
|
179
180
|
* sharing one exact dy with dx=0 is reported.
|
|
180
181
|
*/
|
|
181
|
-
function detectPageShift(baselineMap, candidateMap, minElements = 3) {
|
|
182
|
+
function detectPageShift(baselineMap, candidateMap, minElements = 3, confirmShift) {
|
|
182
183
|
if (baselineMap.length === 0 || candidateMap.length === 0)
|
|
183
184
|
return null;
|
|
184
185
|
const baselineByPath = new Map(baselineMap.map((e) => [e.path, e]));
|
|
@@ -190,7 +191,7 @@ function detectPageShift(baselineMap, candidateMap, minElements = 3) {
|
|
|
190
191
|
}
|
|
191
192
|
const dx = el.x - b.x;
|
|
192
193
|
const dy = el.y - b.y;
|
|
193
|
-
if (dx === 0 && dy !== 0)
|
|
194
|
+
if (dx === 0 && dy !== 0 && (!confirmShift || confirmShift(b, el)))
|
|
194
195
|
moved.push({ dy, baselineY: b.y });
|
|
195
196
|
}
|
|
196
197
|
if (moved.length < minElements)
|