@testivai/witness 1.12.0 → 2.0.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 +5 -10
- package/dist/baselines/store.d.ts +1 -1
- package/dist/baselines/store.d.ts.map +1 -1
- package/dist/baselines/store.js.map +1 -1
- package/dist/bin/testivai.js +0 -2
- package/dist/bin/testivai.js.map +1 -1
- package/dist/browser/binding.d.ts +1 -6
- package/dist/browser/binding.d.ts.map +1 -1
- package/dist/browser/binding.js +6 -139
- package/dist/browser/binding.js.map +1 -1
- package/dist/browser/capture.d.ts +2 -3
- package/dist/browser/capture.d.ts.map +1 -1
- package/dist/browser/capture.js +7 -19
- package/dist/browser/capture.js.map +1 -1
- package/dist/browser/client.d.ts +2 -2
- package/dist/browser/client.d.ts.map +1 -1
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/discovery.d.ts +1 -1
- package/dist/browser/discovery.d.ts.map +1 -1
- package/dist/browser/discovery.js +5 -5
- package/dist/browser/discovery.js.map +1 -1
- 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/capture.js.map +1 -1
- package/dist/commands/init.d.ts +3 -3
- package/dist/commands/init.js +10 -8
- package/dist/commands/init.js.map +1 -1
- 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/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +45 -443
- package/dist/commands/run.js.map +1 -1
- package/dist/config/index.d.ts +3 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/local-config.d.ts +7 -9
- package/dist/config/local-config.d.ts.map +1 -1
- package/dist/config/local-config.js +32 -25
- package/dist/config/local-config.js.map +1 -1
- package/dist/config/validate-config.d.ts +33 -0
- package/dist/config/validate-config.d.ts.map +1 -0
- package/dist/config/validate-config.js +125 -0
- package/dist/config/validate-config.js.map +1 -0
- package/dist/diff/attribution.d.ts +1 -1
- package/dist/diff/attribution.d.ts.map +1 -1
- package/dist/diff/diff.d.ts +1 -1
- package/dist/diff/diff.d.ts.map +1 -1
- package/dist/diff/diff.js +3 -3
- package/dist/diff/diff.js.map +1 -1
- package/dist/diff/dom-diff.js +1 -1
- package/dist/diff/dom-diff.js.map +1 -1
- package/dist/diff/ignore.d.ts +1 -1
- package/dist/diff/ignore.d.ts.map +1 -1
- package/dist/diff/mask.d.ts +2 -2
- package/dist/diff/mask.d.ts.map +1 -1
- package/dist/diff/mask.js +2 -2
- package/dist/diff/mask.js.map +1 -1
- package/dist/diff/regions.d.ts +1 -1
- package/dist/diff/regions.d.ts.map +1 -1
- package/dist/diff/resize.d.ts +1 -1
- package/dist/diff/resize.d.ts.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -19
- package/dist/index.js.map +1 -1
- package/dist/report/compare.d.ts +3 -3
- package/dist/report/compare.d.ts.map +1 -1
- package/dist/report/compare.js +1 -1
- package/dist/report/compare.js.map +1 -1
- package/dist/report/generator.d.ts +2 -2
- package/dist/report/generator.d.ts.map +1 -1
- package/dist/report/generator.js.map +1 -1
- package/dist/report/template.d.ts +1 -1
- package/dist/report/template.d.ts.map +1 -1
- package/dist/report/template.js +16 -17
- package/dist/report/template.js.map +1 -1
- package/dist/standalone/launcher.js.map +1 -1
- package/dist/standalone/run.js.map +1 -1
- package/dist/types.d.ts +13 -136
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/file-naming.d.ts.map +1 -1
- package/dist/utils/file-naming.js +14 -5
- package/dist/utils/file-naming.js.map +1 -1
- package/dist/utils/framework-detect.d.ts +1 -1
- package/dist/utils/framework-detect.d.ts.map +1 -1
- package/dist/utils/framework-detect.js +9 -9
- package/dist/utils/framework-detect.js.map +1 -1
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +10 -15
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/process.d.ts +1 -1
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js.map +1 -1
- package/dist/utils/template-generator.d.ts.map +1 -1
- package/dist/utils/template-generator.js +0 -6
- package/dist/utils/template-generator.js.map +1 -1
- package/package.json +5 -7
- package/dist/ci.d.ts +0 -31
- package/dist/ci.d.ts.map +0 -1
- package/dist/ci.js +0 -118
- package/dist/ci.js.map +0 -1
- package/dist/commands/auth.d.ts +0 -3
- package/dist/commands/auth.d.ts.map +0 -1
- package/dist/commands/auth.js +0 -129
- package/dist/commands/auth.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/browser/client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/browser/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/browser/discovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/browser/discovery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAQtD;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;WACU,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAqCpE;;OAEG;mBACkB,OAAO;IA6C5B;;OAEG;WACU,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5D;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,GAAE,MAAa,GAAG,MAAM,EAAE;CAgC5D;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;;IAM9C;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;CAG5B"}
|
|
@@ -21,7 +21,7 @@ class BrowserDiscovery {
|
|
|
21
21
|
// If port is specified, try only that port
|
|
22
22
|
if (port) {
|
|
23
23
|
logger_1.logger.debug(`Trying specified port: ${port}`);
|
|
24
|
-
const info = await
|
|
24
|
+
const info = await BrowserDiscovery.tryPort(port);
|
|
25
25
|
if (info) {
|
|
26
26
|
return info;
|
|
27
27
|
}
|
|
@@ -31,9 +31,9 @@ class BrowserDiscovery {
|
|
|
31
31
|
const envPort = process.env.TESTIVAI_BROWSER_PORT || process.env.TESTIVAI_CDP_PORT;
|
|
32
32
|
if (envPort) {
|
|
33
33
|
const portNum = parseInt(envPort, 10);
|
|
34
|
-
if (!isNaN(portNum)) {
|
|
34
|
+
if (!Number.isNaN(portNum)) {
|
|
35
35
|
logger_1.logger.debug(`Trying port from environment: ${portNum}`);
|
|
36
|
-
const info = await
|
|
36
|
+
const info = await BrowserDiscovery.tryPort(portNum);
|
|
37
37
|
if (info) {
|
|
38
38
|
return info;
|
|
39
39
|
}
|
|
@@ -42,7 +42,7 @@ class BrowserDiscovery {
|
|
|
42
42
|
// Try default ports
|
|
43
43
|
for (const defaultPort of DEFAULT_PORTS) {
|
|
44
44
|
logger_1.logger.debug(`Trying default port: ${defaultPort}`);
|
|
45
|
-
const info = await
|
|
45
|
+
const info = await BrowserDiscovery.tryPort(defaultPort);
|
|
46
46
|
if (info) {
|
|
47
47
|
return info;
|
|
48
48
|
}
|
|
@@ -78,7 +78,7 @@ class BrowserDiscovery {
|
|
|
78
78
|
id: suitableTab?.id || versionInfoAny.id,
|
|
79
79
|
title: suitableTab?.title,
|
|
80
80
|
url: suitableTab?.url,
|
|
81
|
-
browserVersion: versionInfoAny
|
|
81
|
+
browserVersion: versionInfoAny.Browser,
|
|
82
82
|
protocolVersion: versionInfoAny['Protocol-Version'],
|
|
83
83
|
userAgent: versionInfoAny['User-Agent'],
|
|
84
84
|
v8Version: versionInfoAny['V8-Version'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/browser/discovery.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAyC;AAEzC,kDAA0B;AAE1B;;GAEG;AACH,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE/C;;GAEG;AACH,MAAa,gBAAgB;IAC3B;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAa;QACjC,2CAA2C;QAC3C,IAAI,IAAI,EAAE,CAAC;YACT,eAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/browser/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAkD;AAClD,gDAAoD;AACpD,
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
export declare function isPlaywrightProject(cwd: string): boolean;
|
|
3
3
|
/**
|
|
4
|
-
* Scaffold a Playwright
|
|
5
|
-
*
|
|
4
|
+
* Scaffold a Playwright project: `.testivai/config.json`, the baselines
|
|
5
|
+
* directory, and the .gitignore entries.
|
|
6
6
|
*
|
|
7
|
-
* This is the
|
|
7
|
+
* This is the no-account setup — deliberately NOT the CDP
|
|
8
8
|
* `browserPort` sidecar config, which does not apply to the Playwright
|
|
9
9
|
* reporter flow. Idempotent: an existing config is left untouched unless
|
|
10
10
|
* `force` is set. Returns the list of paths created/updated.
|
package/dist/commands/init.js
CHANGED
|
@@ -117,10 +117,10 @@ function isPlaywrightProject(cwd) {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
/**
|
|
120
|
-
* Scaffold a Playwright
|
|
121
|
-
*
|
|
120
|
+
* Scaffold a Playwright project: `.testivai/config.json`, the baselines
|
|
121
|
+
* directory, and the .gitignore entries.
|
|
122
122
|
*
|
|
123
|
-
* This is the
|
|
123
|
+
* This is the no-account setup — deliberately NOT the CDP
|
|
124
124
|
* `browserPort` sidecar config, which does not apply to the Playwright
|
|
125
125
|
* reporter flow. Idempotent: an existing config is left untouched unless
|
|
126
126
|
* `force` is set. Returns the list of paths created/updated.
|
|
@@ -128,7 +128,7 @@ function isPlaywrightProject(cwd) {
|
|
|
128
128
|
function scaffoldPlaywrightLocal(cwd, force = false) {
|
|
129
129
|
const created = [];
|
|
130
130
|
if (force || !(0, local_config_1.localConfigExists)(cwd)) {
|
|
131
|
-
(0, local_config_1.createDefaultConfig)(cwd
|
|
131
|
+
(0, local_config_1.createDefaultConfig)(cwd);
|
|
132
132
|
created.push('.testivai/config.json');
|
|
133
133
|
}
|
|
134
134
|
// Race-free: mkdir recursive never throws on an existing dir and returns the
|
|
@@ -178,13 +178,14 @@ exports.initCommand = new commander_1.Command('init')
|
|
|
178
178
|
if (isPlaywrightProject(cwd)) {
|
|
179
179
|
const created = scaffoldPlaywrightLocal(cwd, options.force ?? false);
|
|
180
180
|
if (options.json) {
|
|
181
|
-
process.stdout.write(JSON.stringify({ framework: 'playwright',
|
|
181
|
+
process.stdout.write(JSON.stringify({ framework: 'playwright', created }) + '\n');
|
|
182
182
|
return; // exit 0
|
|
183
183
|
}
|
|
184
184
|
console.log();
|
|
185
185
|
console.log(chalk_1.default.green.bold(' ✓ TestivAI is set up for Playwright (local mode).'));
|
|
186
186
|
if (created.length > 0) {
|
|
187
|
-
|
|
187
|
+
for (const f of created)
|
|
188
|
+
console.log(chalk_1.default.green(` ✓ ${f}`));
|
|
188
189
|
}
|
|
189
190
|
else {
|
|
190
191
|
console.log(chalk_1.default.gray(' (already configured — nothing to change)'));
|
|
@@ -214,7 +215,8 @@ exports.initCommand = new commander_1.Command('init')
|
|
|
214
215
|
}
|
|
215
216
|
(0, template_generator_1.generateConfig)(options.force ?? false, cwd);
|
|
216
217
|
console.log(chalk_1.default.cyan('\n=== Framework Setup Instructions ==='));
|
|
217
|
-
|
|
218
|
+
for (const line of detection.instructions)
|
|
219
|
+
console.log(line);
|
|
218
220
|
console.log(chalk_1.default.cyan('\n=== General Setup ==='));
|
|
219
221
|
console.log(`
|
|
220
222
|
1. Run your tests:
|
|
@@ -247,7 +249,7 @@ ${chalk_1.default.gray('For more information, see: https://testiv.ai/docs/')}
|
|
|
247
249
|
]);
|
|
248
250
|
if (mode === 'local') {
|
|
249
251
|
// Create .testivai/config.json and baselines directory
|
|
250
|
-
const
|
|
252
|
+
const _config = (0, local_config_1.createDefaultConfig)(cwd);
|
|
251
253
|
const baselinesDir = path.join(cwd, '.testivai', 'baselines');
|
|
252
254
|
fs.mkdirSync(baselinesDir, { recursive: true });
|
|
253
255
|
// Update .gitignore
|