@testivai/witness 1.12.0 → 1.13.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/capture/settle.d.ts +78 -0
- package/dist/capture/settle.d.ts.map +1 -0
- package/dist/capture/settle.js +117 -0
- package/dist/capture/settle.js.map +1 -0
- package/dist/capture/shard.d.ts +51 -0
- package/dist/capture/shard.d.ts.map +1 -0
- package/dist/capture/shard.js +113 -0
- package/dist/capture/shard.js.map +1 -0
- package/dist/commands/merge-captures.d.ts +4 -0
- package/dist/commands/merge-captures.d.ts.map +1 -1
- package/dist/commands/merge-captures.js +8 -0
- package/dist/commands/merge-captures.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page-settled probe — "has this page stopped changing?" answered without
|
|
3
|
+
* screenshotting repeatedly.
|
|
4
|
+
*
|
|
5
|
+
* WHY NOT NETWORK IDLE
|
|
6
|
+
* --------------------
|
|
7
|
+
* Playwright's own docs mark `networkidle` **DISCOURAGED**: "Don't use this
|
|
8
|
+
* method for testing, rely on web assertions to assess readiness instead." It
|
|
9
|
+
* is the wrong signal for a visual snapshot anyway — a page with analytics
|
|
10
|
+
* beacons or long-polling never goes quiet yet is perfectly settled, while a
|
|
11
|
+
* page can be network-idle with a CSS animation still running.
|
|
12
|
+
*
|
|
13
|
+
* WHY NOT A SETTLE LOOP
|
|
14
|
+
* ---------------------
|
|
15
|
+
* Playwright's built-in screenshots repeatedly until two consecutive images
|
|
16
|
+
* match. That costs a capture per attempt. TestivAI already absorbs render
|
|
17
|
+
* jitter through the DOM/style layer (identical DOM + identical styles reads as
|
|
18
|
+
* noise, not a change), so the only gap left is content that had not *loaded*
|
|
19
|
+
* yet — which is a load question, not a pixel question.
|
|
20
|
+
*
|
|
21
|
+
* WHAT THIS DOES
|
|
22
|
+
* --------------
|
|
23
|
+
* A cheap synchronous probe the adapter polls from the host language, exactly
|
|
24
|
+
* like the existing fonts wait. It reports whether the document is complete,
|
|
25
|
+
* whether images have finished, and how long the DOM has been quiet — the last
|
|
26
|
+
* measured with a MutationObserver, which observes rather than monkey-patching
|
|
27
|
+
* `fetch`/`XHR` and so cannot alter the behaviour of the page under test.
|
|
28
|
+
*
|
|
29
|
+
* SELF-CONTAINED on purpose: no imports, no closures, so it can be serialised
|
|
30
|
+
* into the page and shipped to the Python, Java and Ruby adapters as a
|
|
31
|
+
* generated asset — the same approach as the element-map collector.
|
|
32
|
+
*/
|
|
33
|
+
export interface SettleState {
|
|
34
|
+
/** document.readyState === 'complete' */
|
|
35
|
+
ready: boolean;
|
|
36
|
+
/** Images still decoding. `complete` is true for failed loads, so a 404 never hangs us. */
|
|
37
|
+
imagesPending: number;
|
|
38
|
+
/** Web fonts still loading, when the Font Loading API is available. */
|
|
39
|
+
fontsPending: boolean;
|
|
40
|
+
/** Milliseconds since the last DOM mutation. */
|
|
41
|
+
quietFor: number;
|
|
42
|
+
/** Everything above satisfied, including the quiet threshold. */
|
|
43
|
+
settled: boolean;
|
|
44
|
+
}
|
|
45
|
+
/** Global key holding the observer state between polls. */
|
|
46
|
+
export declare const SETTLE_STATE_KEY = "__testivaiSettleState";
|
|
47
|
+
/**
|
|
48
|
+
* One poll. Installs the MutationObserver on first call and reuses it after,
|
|
49
|
+
* so repeated polls are cheap.
|
|
50
|
+
*/
|
|
51
|
+
export declare function settleProbe(doc: {
|
|
52
|
+
readyState: string;
|
|
53
|
+
documentElement: unknown;
|
|
54
|
+
images: ArrayLike<{
|
|
55
|
+
complete: boolean;
|
|
56
|
+
}>;
|
|
57
|
+
fonts?: {
|
|
58
|
+
status?: string;
|
|
59
|
+
};
|
|
60
|
+
}, win: Record<string, unknown> & {
|
|
61
|
+
MutationObserver?: new (cb: () => void) => {
|
|
62
|
+
observe: (t: unknown, o: unknown) => void;
|
|
63
|
+
};
|
|
64
|
+
}, quietMs: number): SettleState;
|
|
65
|
+
/** Default DOM-quiet threshold. Long enough to span a render, short enough not to be felt. */
|
|
66
|
+
export declare const DEFAULT_QUIET_MS = 150;
|
|
67
|
+
/** Default ceiling on waiting. A page that never settles must not hang the suite. */
|
|
68
|
+
export declare const DEFAULT_SETTLE_TIMEOUT_MS = 5000;
|
|
69
|
+
/** The expression an adapter evaluates for one poll. */
|
|
70
|
+
export declare function buildSettleProbeExpression(quietMs?: number): string;
|
|
71
|
+
/**
|
|
72
|
+
* Disconnect the observer and drop the global. Adapters call this in the same
|
|
73
|
+
* `finally` that removes the injected CSS — leaving an observer attached to
|
|
74
|
+
* someone else's page would be rude and would keep firing for the rest of the
|
|
75
|
+
* test.
|
|
76
|
+
*/
|
|
77
|
+
export declare const SETTLE_STOP_EXPRESSION = "(function (w) {\n try {\n var s = w['__testivaiSettleState'];\n if (s && s.observer && typeof s.observer.disconnect === 'function') s.observer.disconnect();\n } catch (e) {}\n try { delete w['__testivaiSettleState']; } catch (e) { w['__testivaiSettleState'] = undefined; }\n})(window)";
|
|
78
|
+
//# sourceMappingURL=settle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle.d.ts","sourceRoot":"","sources":["../../src/capture/settle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,2FAA2F;IAC3F,aAAa,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,YAAY,EAAE,OAAO,CAAC;IACtB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAExD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B,EACD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,IAAI,KAAK;QAAE,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAAA;CAAE,EAC3H,OAAO,EAAE,MAAM,GACd,WAAW,CAoDb;AAED,8FAA8F;AAC9F,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,wDAAwD;AACxD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAErF;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,0SAMxB,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Page-settled probe — "has this page stopped changing?" answered without
|
|
4
|
+
* screenshotting repeatedly.
|
|
5
|
+
*
|
|
6
|
+
* WHY NOT NETWORK IDLE
|
|
7
|
+
* --------------------
|
|
8
|
+
* Playwright's own docs mark `networkidle` **DISCOURAGED**: "Don't use this
|
|
9
|
+
* method for testing, rely on web assertions to assess readiness instead." It
|
|
10
|
+
* is the wrong signal for a visual snapshot anyway — a page with analytics
|
|
11
|
+
* beacons or long-polling never goes quiet yet is perfectly settled, while a
|
|
12
|
+
* page can be network-idle with a CSS animation still running.
|
|
13
|
+
*
|
|
14
|
+
* WHY NOT A SETTLE LOOP
|
|
15
|
+
* ---------------------
|
|
16
|
+
* Playwright's built-in screenshots repeatedly until two consecutive images
|
|
17
|
+
* match. That costs a capture per attempt. TestivAI already absorbs render
|
|
18
|
+
* jitter through the DOM/style layer (identical DOM + identical styles reads as
|
|
19
|
+
* noise, not a change), so the only gap left is content that had not *loaded*
|
|
20
|
+
* yet — which is a load question, not a pixel question.
|
|
21
|
+
*
|
|
22
|
+
* WHAT THIS DOES
|
|
23
|
+
* --------------
|
|
24
|
+
* A cheap synchronous probe the adapter polls from the host language, exactly
|
|
25
|
+
* like the existing fonts wait. It reports whether the document is complete,
|
|
26
|
+
* whether images have finished, and how long the DOM has been quiet — the last
|
|
27
|
+
* measured with a MutationObserver, which observes rather than monkey-patching
|
|
28
|
+
* `fetch`/`XHR` and so cannot alter the behaviour of the page under test.
|
|
29
|
+
*
|
|
30
|
+
* SELF-CONTAINED on purpose: no imports, no closures, so it can be serialised
|
|
31
|
+
* into the page and shipped to the Python, Java and Ruby adapters as a
|
|
32
|
+
* generated asset — the same approach as the element-map collector.
|
|
33
|
+
*/
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.SETTLE_STOP_EXPRESSION = exports.DEFAULT_SETTLE_TIMEOUT_MS = exports.DEFAULT_QUIET_MS = exports.SETTLE_STATE_KEY = void 0;
|
|
36
|
+
exports.settleProbe = settleProbe;
|
|
37
|
+
exports.buildSettleProbeExpression = buildSettleProbeExpression;
|
|
38
|
+
/** Global key holding the observer state between polls. */
|
|
39
|
+
exports.SETTLE_STATE_KEY = '__testivaiSettleState';
|
|
40
|
+
/**
|
|
41
|
+
* One poll. Installs the MutationObserver on first call and reuses it after,
|
|
42
|
+
* so repeated polls are cheap.
|
|
43
|
+
*/
|
|
44
|
+
function settleProbe(doc, win, quietMs) {
|
|
45
|
+
var KEY = '__testivaiSettleState';
|
|
46
|
+
var state = win[KEY];
|
|
47
|
+
if (!state) {
|
|
48
|
+
state = { last: Date.now() };
|
|
49
|
+
try {
|
|
50
|
+
if (typeof win.MutationObserver === 'function') {
|
|
51
|
+
var observer = new win.MutationObserver(function () {
|
|
52
|
+
win[KEY].last = Date.now();
|
|
53
|
+
});
|
|
54
|
+
observer.observe(doc.documentElement, {
|
|
55
|
+
subtree: true,
|
|
56
|
+
childList: true,
|
|
57
|
+
attributes: true,
|
|
58
|
+
characterData: true,
|
|
59
|
+
});
|
|
60
|
+
state.observer = observer;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
// No MutationObserver (or a hostile document): quietness degrades to
|
|
65
|
+
// "always quiet" rather than blocking the capture.
|
|
66
|
+
}
|
|
67
|
+
win[KEY] = state;
|
|
68
|
+
}
|
|
69
|
+
var imagesPending = 0;
|
|
70
|
+
try {
|
|
71
|
+
for (var i = 0; i < doc.images.length; i++) {
|
|
72
|
+
if (!doc.images[i].complete)
|
|
73
|
+
imagesPending++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
imagesPending = 0;
|
|
78
|
+
}
|
|
79
|
+
var fontsPending = false;
|
|
80
|
+
try {
|
|
81
|
+
fontsPending = !!(doc.fonts && doc.fonts.status && doc.fonts.status !== 'loaded');
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
fontsPending = false;
|
|
85
|
+
}
|
|
86
|
+
var ready = doc.readyState === 'complete';
|
|
87
|
+
var quietFor = Date.now() - state.last;
|
|
88
|
+
return {
|
|
89
|
+
ready: ready,
|
|
90
|
+
imagesPending: imagesPending,
|
|
91
|
+
fontsPending: fontsPending,
|
|
92
|
+
quietFor: quietFor,
|
|
93
|
+
settled: ready && imagesPending === 0 && !fontsPending && quietFor >= quietMs,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Default DOM-quiet threshold. Long enough to span a render, short enough not to be felt. */
|
|
97
|
+
exports.DEFAULT_QUIET_MS = 150;
|
|
98
|
+
/** Default ceiling on waiting. A page that never settles must not hang the suite. */
|
|
99
|
+
exports.DEFAULT_SETTLE_TIMEOUT_MS = 5000;
|
|
100
|
+
/** The expression an adapter evaluates for one poll. */
|
|
101
|
+
function buildSettleProbeExpression(quietMs = exports.DEFAULT_QUIET_MS) {
|
|
102
|
+
return `(${settleProbe.toString()})(document, window, ${quietMs})`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Disconnect the observer and drop the global. Adapters call this in the same
|
|
106
|
+
* `finally` that removes the injected CSS — leaving an observer attached to
|
|
107
|
+
* someone else's page would be rude and would keep firing for the rest of the
|
|
108
|
+
* test.
|
|
109
|
+
*/
|
|
110
|
+
exports.SETTLE_STOP_EXPRESSION = `(function (w) {
|
|
111
|
+
try {
|
|
112
|
+
var s = w['${exports.SETTLE_STATE_KEY}'];
|
|
113
|
+
if (s && s.observer && typeof s.observer.disconnect === 'function') s.observer.disconnect();
|
|
114
|
+
} catch (e) {}
|
|
115
|
+
try { delete w['${exports.SETTLE_STATE_KEY}']; } catch (e) { w['${exports.SETTLE_STATE_KEY}'] = undefined; }
|
|
116
|
+
})(window)`;
|
|
117
|
+
//# sourceMappingURL=settle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settle.js","sourceRoot":"","sources":["../../src/capture/settle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shard participation — the framework-agnostic half of parallel runs.
|
|
3
|
+
*
|
|
4
|
+
* Playwright can tell its reporter `--shard=i/N`; pytest, JUnit, RSpec and a
|
|
5
|
+
* bare Selenium script cannot. So the mechanism is environment, not framework
|
|
6
|
+
* API, and every adapter honours the same two variables:
|
|
7
|
+
*
|
|
8
|
+
* TESTIVAI_CAPTURE_ONLY=1 capture, do not compare or write a report
|
|
9
|
+
* TESTIVAI_SHARD=3/8 this process is shard 3 of 8
|
|
10
|
+
*
|
|
11
|
+
* A framework that happens to know its own shard (Playwright) may fill these in
|
|
12
|
+
* itself, but the env var is the contract — that is what keeps a Selenium or
|
|
13
|
+
* pytest suite a first-class citizen of the same sharded CI flow.
|
|
14
|
+
*/
|
|
15
|
+
export interface ShardInfo {
|
|
16
|
+
current: number;
|
|
17
|
+
total: number;
|
|
18
|
+
}
|
|
19
|
+
export declare const SHARD_MANIFEST = "testivai-shard.json";
|
|
20
|
+
/** Parse `TESTIVAI_SHARD` in either `3/8` or `3of8` form. Invalid → null. */
|
|
21
|
+
export declare function parseShardEnv(value: string | undefined): ShardInfo | null;
|
|
22
|
+
/**
|
|
23
|
+
* Capture-only resolution shared by every JS adapter.
|
|
24
|
+
* An explicit argument wins; then the env var; then "are we a shard of many".
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveCaptureOnly(explicit: boolean | undefined, shard: ShardInfo | null, env?: NodeJS.ProcessEnv): boolean;
|
|
27
|
+
export interface ShardManifest {
|
|
28
|
+
shard: ShardInfo;
|
|
29
|
+
captures: string[];
|
|
30
|
+
/**
|
|
31
|
+
* True once the run finished. Adapters with a run-end hook (Playwright,
|
|
32
|
+
* pytest, JUnit) set it; adapters without one (a bare Selenium script, RSpec)
|
|
33
|
+
* write the manifest per capture and leave it false. `merge-captures` uses it
|
|
34
|
+
* to tell "this shard finished" from "this shard started and vanished".
|
|
35
|
+
*/
|
|
36
|
+
complete: boolean;
|
|
37
|
+
status?: string;
|
|
38
|
+
timestamp: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Write (or refresh) the manifest for this shard.
|
|
42
|
+
*
|
|
43
|
+
* Safe to call on every capture: it rewrites the file with the captures present
|
|
44
|
+
* so far, which is what makes it usable by adapters that have no end-of-run
|
|
45
|
+
* hook to attach to.
|
|
46
|
+
*/
|
|
47
|
+
export declare function writeShardManifest(tempRoot: string, shard: ShardInfo, options?: {
|
|
48
|
+
complete?: boolean;
|
|
49
|
+
status?: string;
|
|
50
|
+
}): void;
|
|
51
|
+
//# sourceMappingURL=shard.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shard participation — the framework-agnostic half of parallel runs.
|
|
4
|
+
*
|
|
5
|
+
* Playwright can tell its reporter `--shard=i/N`; pytest, JUnit, RSpec and a
|
|
6
|
+
* bare Selenium script cannot. So the mechanism is environment, not framework
|
|
7
|
+
* API, and every adapter honours the same two variables:
|
|
8
|
+
*
|
|
9
|
+
* TESTIVAI_CAPTURE_ONLY=1 capture, do not compare or write a report
|
|
10
|
+
* TESTIVAI_SHARD=3/8 this process is shard 3 of 8
|
|
11
|
+
*
|
|
12
|
+
* A framework that happens to know its own shard (Playwright) may fill these in
|
|
13
|
+
* itself, but the env var is the contract — that is what keeps a Selenium or
|
|
14
|
+
* pytest suite a first-class citizen of the same sharded CI flow.
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.SHARD_MANIFEST = void 0;
|
|
51
|
+
exports.parseShardEnv = parseShardEnv;
|
|
52
|
+
exports.resolveCaptureOnly = resolveCaptureOnly;
|
|
53
|
+
exports.writeShardManifest = writeShardManifest;
|
|
54
|
+
const fs = __importStar(require("fs"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
exports.SHARD_MANIFEST = 'testivai-shard.json';
|
|
57
|
+
/** Parse `TESTIVAI_SHARD` in either `3/8` or `3of8` form. Invalid → null. */
|
|
58
|
+
function parseShardEnv(value) {
|
|
59
|
+
if (!value)
|
|
60
|
+
return null;
|
|
61
|
+
const m = /^\s*(\d+)\s*(?:\/|of)\s*(\d+)\s*$/i.exec(value);
|
|
62
|
+
if (!m)
|
|
63
|
+
return null;
|
|
64
|
+
const current = parseInt(m[1], 10);
|
|
65
|
+
const total = parseInt(m[2], 10);
|
|
66
|
+
if (!Number.isFinite(current) || !Number.isFinite(total))
|
|
67
|
+
return null;
|
|
68
|
+
if (total < 1 || current < 1 || current > total)
|
|
69
|
+
return null;
|
|
70
|
+
return { current, total };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Capture-only resolution shared by every JS adapter.
|
|
74
|
+
* An explicit argument wins; then the env var; then "are we a shard of many".
|
|
75
|
+
*/
|
|
76
|
+
function resolveCaptureOnly(explicit, shard, env = process.env) {
|
|
77
|
+
if (typeof explicit === 'boolean')
|
|
78
|
+
return explicit;
|
|
79
|
+
const raw = env.TESTIVAI_CAPTURE_ONLY;
|
|
80
|
+
if (raw !== undefined && raw !== '')
|
|
81
|
+
return raw !== '0' && raw.toLowerCase() !== 'false';
|
|
82
|
+
return !!(shard && shard.total > 1);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Write (or refresh) the manifest for this shard.
|
|
86
|
+
*
|
|
87
|
+
* Safe to call on every capture: it rewrites the file with the captures present
|
|
88
|
+
* so far, which is what makes it usable by adapters that have no end-of-run
|
|
89
|
+
* hook to attach to.
|
|
90
|
+
*/
|
|
91
|
+
function writeShardManifest(tempRoot, shard, options = {}) {
|
|
92
|
+
try {
|
|
93
|
+
fs.mkdirSync(tempRoot, { recursive: true });
|
|
94
|
+
const captures = fs
|
|
95
|
+
.readdirSync(tempRoot, { withFileTypes: true })
|
|
96
|
+
.filter((e) => e.isDirectory())
|
|
97
|
+
.map((e) => e.name)
|
|
98
|
+
.sort();
|
|
99
|
+
const manifest = {
|
|
100
|
+
shard,
|
|
101
|
+
captures,
|
|
102
|
+
complete: options.complete ?? false,
|
|
103
|
+
status: options.status,
|
|
104
|
+
timestamp: new Date().toISOString(),
|
|
105
|
+
};
|
|
106
|
+
fs.writeFileSync(path.join(tempRoot, exports.SHARD_MANIFEST), JSON.stringify(manifest, null, 2));
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// A manifest we cannot write must never fail a capture. The merge step
|
|
110
|
+
// degrades to "no completeness check" and says so.
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=shard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shard.js","sourceRoot":"","sources":["../../src/capture/shard.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaH,sCASC;AAMD,gDASC;AAuBD,gDAyBC;AAnFD,uCAAyB;AACzB,2CAA6B;AAOhB,QAAA,cAAc,GAAG,qBAAqB,CAAC;AAEpD,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"}
|
|
@@ -31,6 +31,8 @@ export interface ShardManifest {
|
|
|
31
31
|
total: number;
|
|
32
32
|
};
|
|
33
33
|
captures?: string[];
|
|
34
|
+
/** False when a shard wrote captures but never reached end of run. */
|
|
35
|
+
complete?: boolean;
|
|
34
36
|
status?: string;
|
|
35
37
|
}
|
|
36
38
|
export interface MergeResult {
|
|
@@ -45,6 +47,8 @@ export interface MergeResult {
|
|
|
45
47
|
shardTotal: number | null;
|
|
46
48
|
/** Expected-but-absent shard indices — a crashed or lost node. */
|
|
47
49
|
shardsMissing: number[];
|
|
50
|
+
/** Shards that captured but never signalled end of run. */
|
|
51
|
+
shardsIncomplete: number[];
|
|
48
52
|
}
|
|
49
53
|
/**
|
|
50
54
|
* Collect capture directories from `sources` into `destTemp`.
|
|
@@ -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;AAqBpC,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,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;
|
|
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;AAqBpC,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,CAwEb;AAED,eAAO,MAAM,oBAAoB,SAiE7B,CAAC"}
|
|
@@ -146,6 +146,13 @@ function mergeCaptures(sources, destTemp, options = {}) {
|
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
const shardsSeen = [...new Set(manifests.map((m) => m.shard.current))].sort((a, b) => a - b);
|
|
149
|
+
// `complete === false` means the adapter had no end-of-run hook, OR the run
|
|
150
|
+
// died partway. Only flag it when some shard proved completion is trackable,
|
|
151
|
+
// otherwise every Selenium/RSpec run would warn about itself.
|
|
152
|
+
const tracksCompletion = manifests.some((m) => m.complete === true);
|
|
153
|
+
const shardsIncomplete = tracksCompletion
|
|
154
|
+
? [...new Set(manifests.filter((m) => m.complete !== true).map((m) => m.shard.current))].sort((a, b) => a - b)
|
|
155
|
+
: [];
|
|
149
156
|
// A shard that ran zero tests uploads no captures, so completeness cannot be
|
|
150
157
|
// inferred from file counts — the manifests are the only reliable evidence.
|
|
151
158
|
// They also self-describe the total, so --expect is an optional override.
|
|
@@ -161,6 +168,7 @@ function mergeCaptures(sources, destTemp, options = {}) {
|
|
|
161
168
|
shardsSeen,
|
|
162
169
|
shardTotal,
|
|
163
170
|
shardsMissing,
|
|
171
|
+
shardsIncomplete,
|
|
164
172
|
};
|
|
165
173
|
}
|
|
166
174
|
exports.mergeCapturesCommand = new commander_1.Command('merge-captures')
|
|
@@ -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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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,10 @@ export { FrameworkDetector } from './utils/framework-detect';
|
|
|
14
14
|
export * from './diff';
|
|
15
15
|
export { collectElementMap, buildElementMapExpression, DEFAULT_MAX_ELEMENTS } from './capture/element-map';
|
|
16
16
|
export type { CollectedElement } from './capture/element-map';
|
|
17
|
+
export { parseShardEnv, resolveCaptureOnly, writeShardManifest, SHARD_MANIFEST } from './capture/shard';
|
|
18
|
+
export type { ShardInfo, ShardManifest } from './capture/shard';
|
|
19
|
+
export { settleProbe, buildSettleProbeExpression, SETTLE_STOP_EXPRESSION, SETTLE_STATE_KEY, DEFAULT_QUIET_MS, DEFAULT_SETTLE_TIMEOUT_MS, } from './capture/settle';
|
|
20
|
+
export type { SettleState } from './capture/settle';
|
|
17
21
|
export { BaselineStore } from './baselines';
|
|
18
22
|
export type { BaselineMetadata } from './baselines';
|
|
19
23
|
export { loadLocalConfig, createDefaultConfig, localConfigExists, isLocalMode, getConfigPath, getDefaultConfig, } from './config';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnI,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,cAAc,QAAQ,CAAC;AAIvB,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC3G,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnI,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,cAAc,QAAQ,CAAC;AAIvB,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC3G,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhE,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAClE,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGjI,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,cAAc,EACd,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAI1B,eAAO,MAAM,OAAO,KAAqC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
18
18
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
19
|
};
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.
|
|
21
|
+
exports.deleteCredentials = exports.loadCredentials = exports.saveCredentials = exports.DEFAULT_CORE_API_URL = exports.CoreApiClient = exports.approveCommand = exports.witnessCommand = exports.runCommand = exports.initCommand = exports.authCommand = exports.renderHtml = exports.compareAll = exports.generateReport = exports.getDefaultConfig = exports.getConfigPath = exports.isLocalMode = exports.localConfigExists = exports.createDefaultConfig = exports.loadLocalConfig = exports.BaselineStore = exports.DEFAULT_SETTLE_TIMEOUT_MS = exports.DEFAULT_QUIET_MS = exports.SETTLE_STATE_KEY = exports.SETTLE_STOP_EXPRESSION = exports.buildSettleProbeExpression = exports.settleProbe = exports.SHARD_MANIFEST = exports.writeShardManifest = exports.resolveCaptureOnly = exports.parseShardEnv = exports.DEFAULT_MAX_ELEMENTS = exports.buildElementMapExpression = exports.collectElementMap = exports.FrameworkDetector = exports.commandExists = exports.setupSignalHandlers = exports.spawnProcess = exports.ProcessManager = exports.isSafeFilename = exports.sanitizeTestName = exports.extractNameFromUrl = exports.generateUniqueFilename = exports.toSafeFilename = exports.createLogger = exports.logger = exports.BrowserDiscoveryError = exports.BrowserDiscovery = exports.BrowserBinding = exports.BrowserCapture = exports.BrowserClient = void 0;
|
|
22
|
+
exports.VERSION = exports.compressionHelper = exports.CompressionHelper = exports.getOutputDir = exports.configExists = exports.loadConfig = exports.findConfigFile = exports.isAuthenticated = exports.getApiKey = void 0;
|
|
22
23
|
// Export types
|
|
23
24
|
__exportStar(require("./types"), exports);
|
|
24
25
|
// Export browser modules
|
|
@@ -56,6 +57,20 @@ var element_map_1 = require("./capture/element-map");
|
|
|
56
57
|
Object.defineProperty(exports, "collectElementMap", { enumerable: true, get: function () { return element_map_1.collectElementMap; } });
|
|
57
58
|
Object.defineProperty(exports, "buildElementMapExpression", { enumerable: true, get: function () { return element_map_1.buildElementMapExpression; } });
|
|
58
59
|
Object.defineProperty(exports, "DEFAULT_MAX_ELEMENTS", { enumerable: true, get: function () { return element_map_1.DEFAULT_MAX_ELEMENTS; } });
|
|
60
|
+
// Shard participation — the env-var contract every adapter honours.
|
|
61
|
+
var shard_1 = require("./capture/shard");
|
|
62
|
+
Object.defineProperty(exports, "parseShardEnv", { enumerable: true, get: function () { return shard_1.parseShardEnv; } });
|
|
63
|
+
Object.defineProperty(exports, "resolveCaptureOnly", { enumerable: true, get: function () { return shard_1.resolveCaptureOnly; } });
|
|
64
|
+
Object.defineProperty(exports, "writeShardManifest", { enumerable: true, get: function () { return shard_1.writeShardManifest; } });
|
|
65
|
+
Object.defineProperty(exports, "SHARD_MANIFEST", { enumerable: true, get: function () { return shard_1.SHARD_MANIFEST; } });
|
|
66
|
+
// Page-settled probe — shared by every adapter.
|
|
67
|
+
var settle_1 = require("./capture/settle");
|
|
68
|
+
Object.defineProperty(exports, "settleProbe", { enumerable: true, get: function () { return settle_1.settleProbe; } });
|
|
69
|
+
Object.defineProperty(exports, "buildSettleProbeExpression", { enumerable: true, get: function () { return settle_1.buildSettleProbeExpression; } });
|
|
70
|
+
Object.defineProperty(exports, "SETTLE_STOP_EXPRESSION", { enumerable: true, get: function () { return settle_1.SETTLE_STOP_EXPRESSION; } });
|
|
71
|
+
Object.defineProperty(exports, "SETTLE_STATE_KEY", { enumerable: true, get: function () { return settle_1.SETTLE_STATE_KEY; } });
|
|
72
|
+
Object.defineProperty(exports, "DEFAULT_QUIET_MS", { enumerable: true, get: function () { return settle_1.DEFAULT_QUIET_MS; } });
|
|
73
|
+
Object.defineProperty(exports, "DEFAULT_SETTLE_TIMEOUT_MS", { enumerable: true, get: function () { return settle_1.DEFAULT_SETTLE_TIMEOUT_MS; } });
|
|
59
74
|
var baselines_1 = require("./baselines");
|
|
60
75
|
Object.defineProperty(exports, "BaselineStore", { enumerable: true, get: function () { return baselines_1.BaselineStore; } });
|
|
61
76
|
// Export local config
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,0CAAwB;AAExB,yBAAyB;AACzB,2CAAiD;AAAxC,uGAAA,aAAa,OAAA;AACtB,6CAAmD;AAA1C,yGAAA,cAAc,OAAA;AACvB,6CAAmD;AAA1C,yGAAA,cAAc,OAAA;AACvB,iDAA8E;AAArE,6GAAA,gBAAgB,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AAEhD,mBAAmB;AACnB,yCAAsD;AAA7C,gGAAA,MAAM,OAAA;AAAE,sGAAA,YAAY,OAAA;AAC7B,mDAAmI;AAA1H,6GAAA,cAAc,OAAA;AAAE,qHAAA,sBAAsB,OAAA;AAAE,iHAAA,kBAAkB,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AAAE,6GAAA,cAAc,OAAA;AACrG,2CAAmG;AAA1F,yGAAA,cAAc,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AAAE,wGAAA,aAAa,OAAA;AACzE,6DAA6D;AAApD,qHAAA,iBAAiB,OAAA;AAE1B,qBAAqB;AACrB,yCAAuB;AAEvB,mBAAmB;AACnB,yEAAyE;AACzE,qDAA2G;AAAlG,gHAAA,iBAAiB,OAAA;AAAE,wHAAA,yBAAyB,OAAA;AAAE,mHAAA,oBAAoB,OAAA;AAG3E,oEAAoE;AACpE,yCAAwG;AAA/F,sGAAA,aAAa,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAAE,uGAAA,cAAc,OAAA;AAG9E,gDAAgD;AAChD,2CAO0B;AANxB,qGAAA,WAAW,OAAA;AACX,oHAAA,0BAA0B,OAAA;AAC1B,gHAAA,sBAAsB,OAAA;AACtB,0GAAA,gBAAgB,OAAA;AAChB,0GAAA,gBAAgB,OAAA;AAChB,mHAAA,yBAAyB,OAAA;AAI3B,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAGtB,sBAAsB;AACtB,mCAOkB;AANhB,yGAAA,eAAe,OAAA;AACf,6GAAA,mBAAmB,OAAA;AACnB,2GAAA,iBAAiB,OAAA;AACjB,qGAAA,WAAW,OAAA;AACX,uGAAA,aAAa,OAAA;AACb,0GAAA,gBAAgB,OAAA;AAIlB,0BAA0B;AAC1B,mCAAkE;AAAzD,wGAAA,cAAc,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,oGAAA,UAAU,OAAA;AAG/C,yCAAyC;AACzC,wCAA8C;AAArC,mGAAA,WAAW,OAAA;AACpB,wCAA8C;AAArC,mGAAA,WAAW,OAAA;AACpB,sCAA4C;AAAnC,iGAAA,UAAU,OAAA;AACnB,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AACvB,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AAEvB,6BAA6B;AAC7B,2CAc0B;AAbxB,uGAAA,aAAa,OAAA;AACb,8GAAA,oBAAoB,OAAA;AACpB,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,2GAAA,iBAAiB,OAAA;AACjB,mGAAA,SAAS,OAAA;AACT,yGAAA,eAAe,OAAA;AACf,wGAAA,cAAc,OAAA;AACd,oGAAA,UAAU,OAAA;AACV,sGAAA,YAAY,OAAA;AACZ,sGAAA,YAAY,OAAA;AACZ,2GAAA,iBAAiB,OAAA;AACjB,2GAAA,iBAAiB,OAAA;AAGnB,UAAU;AACV,8DAA8D;AACjD,QAAA,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testivai/witness",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.13.0",
|
|
4
4
|
"description": "Local-first visual regression testing: CLI, diff engine, baselines and self-contained HTML report. No account, nothing uploaded.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|