@applitools/core 1.4.5 → 1.4.7
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/automation/get-viewport-size.js +1 -1
- package/dist/automation/locate.js +1 -1
- package/dist/automation/set-viewport-size.js +1 -1
- package/dist/automation/utils/take-screenshot.js +2 -2
- package/dist/{utils → automation/utils}/to-base-check-settings.js +3 -2
- package/dist/{utils → automation/utils}/wait-for-lazy-load.js +2 -2
- package/dist/check-and-close.js +7 -5
- package/dist/check.js +7 -5
- package/dist/classic/abort.js +1 -1
- package/dist/classic/check-and-close.js +9 -5
- package/dist/classic/check.js +12 -8
- package/dist/classic/close.js +1 -1
- package/dist/classic/core.js +5 -5
- package/dist/classic/extract-text.js +11 -5
- package/dist/classic/locate-text.js +2 -0
- package/dist/classic/open-eyes.js +16 -14
- package/dist/classic/utils/take-dom-capture.js +35 -54
- package/dist/close-manager.js +4 -3
- package/dist/core.js +5 -5
- package/dist/get-typed-eyes.js +1 -4
- package/dist/make-ec-client.js +1 -9
- package/dist/make-manager.js +25 -27
- package/dist/troubleshoot/check-network.js +41 -34
- package/dist/troubleshoot/eyes.js +2 -2
- package/dist/troubleshoot/ufg.js +3 -2
- package/dist/troubleshoot/utils.js +1 -25
- package/dist/ufg/abort.js +2 -7
- package/dist/ufg/check-and-close.js +50 -46
- package/dist/ufg/check.js +31 -24
- package/dist/ufg/core.js +5 -5
- package/dist/ufg/get-base-eyes.js +2 -0
- package/dist/ufg/open-eyes.js +11 -2
- package/dist/ufg/utils/extract-broker-url.js +52 -0
- package/dist/ufg/utils/generate-safe-selectors.js +10 -5
- package/dist/ufg/utils/take-dom-snapshot.js +37 -36
- package/dist/ufg/utils/take-dom-snapshots.js +13 -17
- package/dist/ufg/utils/take-snapshots.js +3 -3
- package/dist/ufg/utils/take-vhses.js +60 -166
- package/dist/utils/format-results.js +37 -37
- package/package.json +20 -37
- package/types/automation/get-viewport-size.d.ts +2 -2
- package/types/automation/locate.d.ts +3 -3
- package/types/automation/set-viewport-size.d.ts +2 -2
- package/types/automation/types.d.ts +7 -7
- package/types/automation/utils/take-screenshot.d.ts +6 -6
- package/types/automation/utils/to-base-check-settings.d.ts +24 -0
- package/types/{utils → automation/utils}/wait-for-lazy-load.d.ts +0 -0
- package/types/check-and-close.d.ts +7 -7
- package/types/check.d.ts +6 -6
- package/types/classic/abort.d.ts +2 -2
- package/types/classic/check-and-close.d.ts +8 -4
- package/types/classic/check.d.ts +4 -4
- package/types/classic/close.d.ts +2 -2
- package/types/classic/core.d.ts +1 -1
- package/types/classic/extract-text.d.ts +3 -3
- package/types/classic/get-base-eyes.d.ts +4 -4
- package/types/classic/locate-text.d.ts +3 -3
- package/types/classic/open-eyes.d.ts +4 -4
- package/types/classic/utils/take-dom-capture.d.ts +3 -3
- package/types/close-batch.d.ts +1 -1
- package/types/close-manager.d.ts +4 -4
- package/types/close.d.ts +3 -3
- package/types/delete-test.d.ts +1 -1
- package/types/errors/abort-error.d.ts +0 -1
- package/types/extract-text.d.ts +3 -3
- package/types/get-typed-eyes.d.ts +3 -3
- package/types/locate-text.d.ts +3 -3
- package/types/locate.d.ts +4 -4
- package/types/make-ec-client.d.ts +3 -3
- package/types/make-manager.d.ts +8 -8
- package/types/open-eyes.d.ts +6 -6
- package/types/troubleshoot/check-network.d.ts +3 -3
- package/types/troubleshoot/utils.d.ts +0 -2
- package/types/types.d.ts +6 -4
- package/types/ufg/abort.d.ts +3 -4
- package/types/ufg/check-and-close.d.ts +20 -8
- package/types/ufg/check.d.ts +4 -4
- package/types/ufg/close.d.ts +2 -2
- package/types/ufg/get-base-eyes.d.ts +6 -6
- package/types/ufg/open-eyes.d.ts +4 -4
- package/types/ufg/types.d.ts +2 -2
- package/types/ufg/utils/extract-broker-url.d.ts +6 -0
- package/types/ufg/utils/generate-safe-selectors.d.ts +9 -5
- package/types/ufg/utils/take-dom-snapshot.d.ts +31 -6
- package/types/ufg/utils/take-snapshots.d.ts +1 -1
- package/types/ufg/utils/take-vhses.d.ts +1 -1
- package/types/utils/format-results.d.ts +1 -1
- package/dist/utils/extract-broker-url.js +0 -19
- package/types/utils/extract-broker-url.d.ts +0 -2
- package/types/utils/to-base-check-settings.d.ts +0 -18
package/dist/make-manager.js
CHANGED
|
@@ -42,34 +42,32 @@ function makeMakeManager({ spec, core, concurrency: defaultConcurrency = utils.g
|
|
|
42
42
|
classic: (0, core_1.makeCore)({ spec, core, logger }),
|
|
43
43
|
};
|
|
44
44
|
const storage = [];
|
|
45
|
-
// open eyes with result storage
|
|
46
|
-
const openEyes = utils.general.wrap((0, open_eyes_1.makeOpenEyes)({ type, batch, spec, core, cores, logger }), async (openEyes, options) => {
|
|
47
|
-
const eyes = await openEyes(options);
|
|
48
|
-
const item = { eyes };
|
|
49
|
-
storage.push(item);
|
|
50
|
-
return utils.general.extend(eyes, {
|
|
51
|
-
close(options) {
|
|
52
|
-
var _a;
|
|
53
|
-
const promise = eyes.close(options);
|
|
54
|
-
(_a = item.promise) !== null && _a !== void 0 ? _a : (item.promise = promise);
|
|
55
|
-
return promise;
|
|
56
|
-
},
|
|
57
|
-
checkAndClose(options) {
|
|
58
|
-
var _a;
|
|
59
|
-
const promise = eyes.checkAndClose(options);
|
|
60
|
-
(_a = item.promise) !== null && _a !== void 0 ? _a : (item.promise = promise);
|
|
61
|
-
return promise;
|
|
62
|
-
},
|
|
63
|
-
abort(options) {
|
|
64
|
-
var _a;
|
|
65
|
-
const promise = eyes.abort(options);
|
|
66
|
-
(_a = item.promise) !== null && _a !== void 0 ? _a : (item.promise = promise);
|
|
67
|
-
return promise;
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
45
|
return {
|
|
72
|
-
openEyes,
|
|
46
|
+
openEyes: utils.general.wrap((0, open_eyes_1.makeOpenEyes)({ type, batch, spec, core, cores, logger }), async (openEyes, options) => {
|
|
47
|
+
const eyes = await openEyes(options);
|
|
48
|
+
const item = { eyes };
|
|
49
|
+
storage.push(item);
|
|
50
|
+
return utils.general.extend(eyes, {
|
|
51
|
+
checkAndClose: utils.general.wrap(eyes.checkAndClose, (checkAndClose, options) => {
|
|
52
|
+
var _a;
|
|
53
|
+
const promise = checkAndClose(options);
|
|
54
|
+
(_a = item.promise) !== null && _a !== void 0 ? _a : (item.promise = promise);
|
|
55
|
+
return promise;
|
|
56
|
+
}),
|
|
57
|
+
close: utils.general.wrap(eyes.close, (close, options) => {
|
|
58
|
+
var _a;
|
|
59
|
+
const promise = close(options);
|
|
60
|
+
(_a = item.promise) !== null && _a !== void 0 ? _a : (item.promise = promise);
|
|
61
|
+
return promise;
|
|
62
|
+
}),
|
|
63
|
+
abort: utils.general.wrap(eyes.abort, (abort, options) => {
|
|
64
|
+
var _a;
|
|
65
|
+
const promise = abort(options);
|
|
66
|
+
(_a = item.promise) !== null && _a !== void 0 ? _a : (item.promise = promise);
|
|
67
|
+
return promise;
|
|
68
|
+
}),
|
|
69
|
+
});
|
|
70
|
+
}),
|
|
73
71
|
closeManager: (0, close_manager_1.makeCloseManager)({ core, storage, logger }),
|
|
74
72
|
};
|
|
75
73
|
};
|
|
@@ -29,46 +29,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
30
|
exports.checkNetwork = void 0;
|
|
31
31
|
const chalk_1 = __importDefault(require("chalk"));
|
|
32
|
-
const utils_1 = require("./utils");
|
|
33
32
|
const eyes_1 = __importDefault(require("./eyes"));
|
|
34
33
|
const ufg_1 = __importDefault(require("./ufg"));
|
|
35
34
|
const utils = __importStar(require("@applitools/utils"));
|
|
36
35
|
const TIMEOUT = 15000;
|
|
37
36
|
const config = utils.config.getConfig({ params: ['apiKey', 'serverUrl', 'proxy'] });
|
|
38
37
|
async function checkNetwork({ stream = process.stdout, eyes = eyes_1.default, ufg = ufg_1.default } = {}) {
|
|
39
|
-
const hasClearLine = stream.clearLine && stream.cursorTo;
|
|
40
|
-
async function doTest(func, name) {
|
|
41
|
-
const delimiterLength = 30 - name.length;
|
|
42
|
-
const delimiter = new Array(delimiterLength).join(' ');
|
|
43
|
-
hasClearLine && printSuccess(name, delimiter, '[ ? ]');
|
|
44
|
-
const start = Date.now();
|
|
45
|
-
const funcWithTimeout = (0, utils_1.ptimeoutWithError)(func(), TIMEOUT, new Error('request timeout!'));
|
|
46
|
-
const [err] = await (0, utils_1.presult)(funcWithTimeout);
|
|
47
|
-
const end = (Date.now() - start) / 1000;
|
|
48
|
-
clearLine();
|
|
49
|
-
if (err) {
|
|
50
|
-
printErr(name, delimiter, `[ X ] +${end}`, err.message, err.message[err.message.length - 1] !== '\n' ? '\n' : '');
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
printSuccess(name, delimiter, `[ OK ] +${end}`, '\n');
|
|
54
|
-
}
|
|
55
|
-
return !!err;
|
|
56
|
-
}
|
|
57
|
-
function print(...msg) {
|
|
58
|
-
stream.write((0, chalk_1.default)(...msg));
|
|
59
|
-
}
|
|
60
|
-
function printErr(...msg) {
|
|
61
|
-
stream.write(chalk_1.default.red(...msg));
|
|
62
|
-
}
|
|
63
|
-
function printSuccess(...msg) {
|
|
64
|
-
stream.write(chalk_1.default.green(...msg));
|
|
65
|
-
}
|
|
66
|
-
function clearLine() {
|
|
67
|
-
if (hasClearLine) {
|
|
68
|
-
stream.clearLine(0);
|
|
69
|
-
stream.cursorTo(0);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
38
|
+
const hasClearLine = !!stream.clearLine && !!stream.cursorTo;
|
|
72
39
|
if (!config.apiKey) {
|
|
73
40
|
printErr('Missing "apiKey". Add APPLITOOLS_API_KEY as an env variable or add "apiKey" in applitools.config.js\n');
|
|
74
41
|
return;
|
|
@@ -102,6 +69,46 @@ async function checkNetwork({ stream = process.stdout, eyes = eyes_1.default, uf
|
|
|
102
69
|
else if (curlVgErr) {
|
|
103
70
|
printErr(proxyMsg, '\n', await ufg.getCmd());
|
|
104
71
|
}
|
|
72
|
+
async function doTest(func, name) {
|
|
73
|
+
const delimiterLength = 30 - name.length;
|
|
74
|
+
const delimiter = new Array(delimiterLength).join(' ');
|
|
75
|
+
hasClearLine && printSuccess(name, delimiter, '[ ? ]');
|
|
76
|
+
const start = Date.now();
|
|
77
|
+
const [err] = await ptimeoutWithError(func(), TIMEOUT, new Error('request timeout!'));
|
|
78
|
+
const end = (Date.now() - start) / 1000;
|
|
79
|
+
clearLine();
|
|
80
|
+
if (err) {
|
|
81
|
+
printErr(name, delimiter, `[ X ] +${end}`, err.message, err.message[err.message.length - 1] !== '\n' ? '\n' : '');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
printSuccess(name, delimiter, `[ OK ] +${end}`, '\n');
|
|
85
|
+
}
|
|
86
|
+
return !!err;
|
|
87
|
+
}
|
|
88
|
+
function print(...msg) {
|
|
89
|
+
stream.write((0, chalk_1.default)(...msg));
|
|
90
|
+
}
|
|
91
|
+
function printErr(...msg) {
|
|
92
|
+
stream.write(chalk_1.default.red(...msg));
|
|
93
|
+
}
|
|
94
|
+
function printSuccess(...msg) {
|
|
95
|
+
stream.write(chalk_1.default.green(...msg));
|
|
96
|
+
}
|
|
97
|
+
function clearLine() {
|
|
98
|
+
if (hasClearLine) {
|
|
99
|
+
stream.clearLine(0);
|
|
100
|
+
stream.cursorTo(0);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async function ptimeoutWithError(promise, timeout, err) {
|
|
104
|
+
let timer;
|
|
105
|
+
return Promise.race([
|
|
106
|
+
promise.then(v => (timer && clearTimeout(timer), [undefined, v]), err => (timer && clearTimeout(timer), [err])),
|
|
107
|
+
new Promise(res => {
|
|
108
|
+
timer = setTimeout(() => res([err]), timeout);
|
|
109
|
+
}),
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
105
112
|
}
|
|
106
113
|
exports.checkNetwork = checkNetwork;
|
|
107
114
|
checkNetwork();
|
|
@@ -34,12 +34,12 @@ const utils = __importStar(require("@applitools/utils"));
|
|
|
34
34
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
35
35
|
exports.RENDER_INFO_URL = `${utils_1.config.serverUrl}/api/sessions/renderinfo?apiKey=${utils_1.config.apiKey}`;
|
|
36
36
|
exports.CURL_CMD = `curl ${exports.RENDER_INFO_URL} ${(0, utils_1.getProxyCurlArg)()}`;
|
|
37
|
-
const validateRawAccountInfo = res => {
|
|
37
|
+
const validateRawAccountInfo = (res) => {
|
|
38
38
|
if (!res || !res.accessToken || !res.resultsUrl) {
|
|
39
39
|
throw new Error(`bad render info result ${JSON.stringify(res)}`);
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
|
-
const validateAccountInfo = res => {
|
|
42
|
+
const validateAccountInfo = (res) => {
|
|
43
43
|
if (!res || !res.ufg || !res.ufg.accessToken || !res.uploadUrl) {
|
|
44
44
|
throw new Error(`bad render info result ${JSON.stringify(res)}`);
|
|
45
45
|
}
|
package/dist/troubleshoot/ufg.js
CHANGED
|
@@ -29,9 +29,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
29
29
|
exports.getCmd = void 0;
|
|
30
30
|
const https_1 = require("https");
|
|
31
31
|
const crypto_1 = require("crypto");
|
|
32
|
-
const
|
|
32
|
+
const logger_1 = require("@applitools/logger");
|
|
33
33
|
const ufg_client_1 = require("@applitools/ufg-client");
|
|
34
34
|
const utils_1 = require("./utils");
|
|
35
|
+
const eyes_1 = require("./eyes");
|
|
35
36
|
const utils = __importStar(require("@applitools/utils"));
|
|
36
37
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
37
38
|
const value = Buffer.from(JSON.stringify({ resources: {}, domNodes: [] }));
|
|
@@ -91,7 +92,7 @@ exports.default = {
|
|
|
91
92
|
const url = new URL(UFG_PUT_RESOURCE_URL);
|
|
92
93
|
const requests = (0, ufg_client_1.makeUFGRequests)({
|
|
93
94
|
config: { serverUrl: url.origin, accessToken: await accessTokenPromise, uploadUrl: '', stitchingServiceUrl: '' },
|
|
94
|
-
logger:
|
|
95
|
+
logger: (0, logger_1.makeLogger)(),
|
|
95
96
|
});
|
|
96
97
|
await requests.uploadResource({ resource });
|
|
97
98
|
},
|
|
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
26
|
+
exports.getProxyCurlArg = exports.config = void 0;
|
|
27
27
|
const utils = __importStar(require("@applitools/utils"));
|
|
28
28
|
exports.config = {
|
|
29
29
|
serverUrl: 'https://eyesapi.applitools.com',
|
|
@@ -42,27 +42,3 @@ function getProxyCurlArg() {
|
|
|
42
42
|
return proxyUrl ? `-x ${proxyUrl.href}` : '';
|
|
43
43
|
}
|
|
44
44
|
exports.getProxyCurlArg = getProxyCurlArg;
|
|
45
|
-
function presult(promise) {
|
|
46
|
-
return promise.then(v => [undefined, v], err => [err]);
|
|
47
|
-
}
|
|
48
|
-
exports.presult = presult;
|
|
49
|
-
async function ptimeoutWithError(promiseOrPromiseFunc, timeout, err) {
|
|
50
|
-
let promiseResolved = false;
|
|
51
|
-
const hasAborted = () => promiseResolved;
|
|
52
|
-
const promise = promiseOrPromiseFunc.then ? promiseOrPromiseFunc : promiseOrPromiseFunc(hasAborted);
|
|
53
|
-
let cancel;
|
|
54
|
-
const v = await Promise.race([
|
|
55
|
-
promise.then(v => ((promiseResolved = true), cancel && clearTimeout(cancel), v), err => ((promiseResolved = true), cancel && clearTimeout(cancel), Promise.reject(err))),
|
|
56
|
-
new Promise(res => (cancel = setTimeout(() => {
|
|
57
|
-
if (promiseResolved)
|
|
58
|
-
res(undefined);
|
|
59
|
-
else {
|
|
60
|
-
cancel = undefined;
|
|
61
|
-
promiseResolved = true;
|
|
62
|
-
res(Promise.reject(err));
|
|
63
|
-
}
|
|
64
|
-
}, timeout))),
|
|
65
|
-
]);
|
|
66
|
-
return v;
|
|
67
|
-
}
|
|
68
|
-
exports.ptimeoutWithError = ptimeoutWithError;
|
package/dist/ufg/abort.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.makeAbort = void 0;
|
|
4
|
-
const abort_error_1 = require("../errors/abort-error");
|
|
5
4
|
const driver_1 = require("@applitools/driver");
|
|
6
5
|
function makeAbort({ storage, target, spec, controller, logger: defaultLogger, }) {
|
|
7
6
|
return async function ({ settings, logger = defaultLogger, } = {}) {
|
|
@@ -20,12 +19,8 @@ function makeAbort({ storage, target, spec, controller, logger: defaultLogger, }
|
|
|
20
19
|
catch (error) {
|
|
21
20
|
eyes = error.info.eyes;
|
|
22
21
|
renderer = error.info.renderer;
|
|
23
|
-
if (!eyes)
|
|
24
|
-
|
|
25
|
-
return error.info;
|
|
26
|
-
else
|
|
27
|
-
throw error;
|
|
28
|
-
}
|
|
22
|
+
if (!eyes)
|
|
23
|
+
throw error;
|
|
29
24
|
}
|
|
30
25
|
const driver = (0, driver_1.isDriver)(target, spec) ? await (0, driver_1.makeDriver)({ spec, driver: target, logger }) : null;
|
|
31
26
|
const testMetadata = await (driver === null || driver === void 0 ? void 0 : driver.getSessionMetadata());
|
|
@@ -29,22 +29,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
29
29
|
exports.makeCheckAndClose = void 0;
|
|
30
30
|
const driver_1 = require("@applitools/driver");
|
|
31
31
|
const take_snapshots_1 = require("./utils/take-snapshots");
|
|
32
|
-
const wait_for_lazy_load_1 = require("../utils/wait-for-lazy-load");
|
|
33
|
-
const to_base_check_settings_1 = require("../utils/to-base-check-settings");
|
|
32
|
+
const wait_for_lazy_load_1 = require("../automation/utils/wait-for-lazy-load");
|
|
33
|
+
const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
|
|
34
34
|
const generate_safe_selectors_1 = require("./utils/generate-safe-selectors");
|
|
35
35
|
const uniquify_renderers_1 = require("./utils/uniquify-renderers");
|
|
36
36
|
const abort_error_1 = require("../errors/abort-error");
|
|
37
37
|
const utils = __importStar(require("@applitools/utils"));
|
|
38
38
|
const chalk_1 = __importDefault(require("chalk"));
|
|
39
39
|
function makeCheckAndClose({ spec, eyes, client, signal, target: defaultTarget, logger: defaultLogger, }) {
|
|
40
|
-
return async function checkAndClose({ target = defaultTarget, settings = {}, logger = defaultLogger,
|
|
40
|
+
return async function checkAndClose({ target = defaultTarget, settings = {}, logger = defaultLogger, }) {
|
|
41
41
|
var _a, _b, _c;
|
|
42
42
|
logger.log('Command "checkAndClose" is called with settings', settings);
|
|
43
|
-
if (signal.aborted) {
|
|
43
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
44
44
|
logger.warn('Command "checkAndClose" was called after test was already aborted');
|
|
45
45
|
throw new abort_error_1.AbortError('Command "checkAndClose" was called after test was already aborted');
|
|
46
46
|
}
|
|
47
|
-
const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
|
|
47
|
+
const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
|
|
48
|
+
settings,
|
|
49
|
+
});
|
|
50
|
+
let snapshots;
|
|
48
51
|
let snapshotUrl;
|
|
49
52
|
let snapshotTitle;
|
|
50
53
|
let userAgent;
|
|
@@ -67,13 +70,16 @@ function makeCheckAndClose({ spec, eyes, client, signal, target: defaultTarget,
|
|
|
67
70
|
userAgent = driver.userAgent;
|
|
68
71
|
const generated = await (0, generate_safe_selectors_1.generateSafeSelectors)({
|
|
69
72
|
context: driver.currentContext,
|
|
70
|
-
elementReferences: [
|
|
73
|
+
elementReferences: [
|
|
74
|
+
...(elementReferenceToTarget ? [elementReferenceToTarget] : []),
|
|
75
|
+
...elementReferencesToCalculate,
|
|
76
|
+
],
|
|
71
77
|
});
|
|
72
78
|
cleanupGeneratedSelectors = generated.cleanupGeneratedSelectors;
|
|
73
79
|
if (elementReferenceToTarget) {
|
|
74
|
-
|
|
75
|
-
if (!regionToTarget)
|
|
80
|
+
if (!((_b = generated.selectors[0]) === null || _b === void 0 ? void 0 : _b.safeSelector))
|
|
76
81
|
throw new Error('Target element not found');
|
|
82
|
+
regionToTarget = generated.selectors[0].safeSelector;
|
|
77
83
|
selectorsToCalculate = generated.selectors.slice(1);
|
|
78
84
|
}
|
|
79
85
|
else {
|
|
@@ -81,42 +87,40 @@ function makeCheckAndClose({ spec, eyes, client, signal, target: defaultTarget,
|
|
|
81
87
|
}
|
|
82
88
|
}
|
|
83
89
|
const currentContext = driver.currentContext;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
provides: {
|
|
107
|
-
getChromeEmulationDevices: client.getChromeEmulationDevices,
|
|
108
|
-
getIOSDevices: client.getIOSDevices,
|
|
90
|
+
snapshots = await (0, take_snapshots_1.takeSnapshots)({
|
|
91
|
+
driver,
|
|
92
|
+
settings: {
|
|
93
|
+
...eyes.test.server,
|
|
94
|
+
waitBeforeCapture: settings.waitBeforeCapture,
|
|
95
|
+
disableBrowserFetching: settings.disableBrowserFetching,
|
|
96
|
+
layoutBreakpoints: settings.layoutBreakpoints,
|
|
97
|
+
renderers: uniqueRenderers,
|
|
98
|
+
skipResources: client.getCachedResourceUrls(),
|
|
99
|
+
},
|
|
100
|
+
hooks: {
|
|
101
|
+
async beforeSnapshots() {
|
|
102
|
+
if (settings.lazyLoad && driver.isWeb) {
|
|
103
|
+
await (0, wait_for_lazy_load_1.waitForLazyLoad)({
|
|
104
|
+
context: driver.currentContext,
|
|
105
|
+
settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
|
|
106
|
+
logger,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
109
|
},
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
},
|
|
111
|
+
provides: {
|
|
112
|
+
getChromeEmulationDevices: client.getChromeEmulationDevices,
|
|
113
|
+
getIOSDevices: client.getIOSDevices,
|
|
114
|
+
},
|
|
115
|
+
logger,
|
|
116
|
+
});
|
|
113
117
|
await currentContext.focus();
|
|
114
118
|
snapshotUrl = await driver.getUrl();
|
|
115
119
|
snapshotTitle = await driver.getTitle();
|
|
116
120
|
await (cleanupGeneratedSelectors === null || cleanupGeneratedSelectors === void 0 ? void 0 : cleanupGeneratedSelectors());
|
|
117
121
|
}
|
|
118
122
|
else {
|
|
119
|
-
snapshots = !utils.types.isArray(target) ? Array(
|
|
123
|
+
snapshots = !utils.types.isArray(target) ? Array(uniqueRenderers.length).fill(target) : target;
|
|
120
124
|
snapshotUrl = utils.types.has(snapshots[0], 'url') ? snapshots[0].url : undefined;
|
|
121
125
|
}
|
|
122
126
|
regionToTarget !== null && regionToTarget !== void 0 ? regionToTarget : (regionToTarget = (_c = elementReferenceToTarget) !== null && _c !== void 0 ? _c : settings.region);
|
|
@@ -124,13 +128,13 @@ function makeCheckAndClose({ spec, eyes, client, signal, target: defaultTarget,
|
|
|
124
128
|
originalSelector: selector,
|
|
125
129
|
safeSelector: selector,
|
|
126
130
|
})));
|
|
127
|
-
const promises =
|
|
131
|
+
const promises = uniqueRenderers.map(async (renderer, index) => {
|
|
128
132
|
if (utils.types.has(renderer, 'name') && renderer.name === 'edge') {
|
|
129
133
|
const message = chalk_1.default.yellow(`The 'edge' option that is being used in your browsers' configuration will soon be deprecated. Please change it to either 'edgelegacy' for the legacy version or to 'edgechromium' for the new Chromium-based version. Please note, when using the built-in BrowserType enum, then the values are BrowserType.EDGE_LEGACY and BrowserType.EDGE_CHROMIUM, respectively.`);
|
|
130
134
|
logger.console.log(message);
|
|
131
135
|
}
|
|
132
136
|
try {
|
|
133
|
-
if (signal.aborted) {
|
|
137
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
134
138
|
logger.warn('Command "check" was aborted before rendering');
|
|
135
139
|
throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
|
|
136
140
|
}
|
|
@@ -149,7 +153,7 @@ function makeCheckAndClose({ spec, eyes, client, signal, target: defaultTarget,
|
|
|
149
153
|
});
|
|
150
154
|
const [baseEyes] = await eyes.getBaseEyes({ settings: { renderer, type: snapshotType }, logger });
|
|
151
155
|
try {
|
|
152
|
-
if (signal.aborted) {
|
|
156
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
153
157
|
logger.warn('Command "check" was aborted before rendering');
|
|
154
158
|
throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
|
|
155
159
|
}
|
|
@@ -158,7 +162,7 @@ function makeCheckAndClose({ spec, eyes, client, signal, target: defaultTarget,
|
|
|
158
162
|
throw new abort_error_1.AbortError(`Renderer with id "${baseEyes.test.rendererId}" was aborted during one of the previous steps`);
|
|
159
163
|
}
|
|
160
164
|
const renderTarget = await renderTargetPromise;
|
|
161
|
-
if (signal.aborted) {
|
|
165
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
162
166
|
logger.warn('Command "check" was aborted before rendering');
|
|
163
167
|
throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
|
|
164
168
|
}
|
|
@@ -170,26 +174,26 @@ function makeCheckAndClose({ spec, eyes, client, signal, target: defaultTarget,
|
|
|
170
174
|
target: renderTarget,
|
|
171
175
|
settings: {
|
|
172
176
|
...settings,
|
|
173
|
-
rendererId: baseEyes.test.rendererId,
|
|
174
177
|
region: regionToTarget,
|
|
175
|
-
type: utils.types.has(snapshot, 'cdt') ? 'web' : 'native',
|
|
176
|
-
renderer,
|
|
177
178
|
selectorsToCalculate: selectorsToCalculate.flatMap(({ safeSelector }) => safeSelector !== null && safeSelector !== void 0 ? safeSelector : []),
|
|
178
179
|
includeFullPageSize: Boolean(settings.pageId),
|
|
180
|
+
type: snapshotType,
|
|
181
|
+
renderer,
|
|
182
|
+
rendererId: baseEyes.test.rendererId,
|
|
179
183
|
},
|
|
180
184
|
signal,
|
|
181
185
|
});
|
|
182
186
|
let offset = 0;
|
|
183
187
|
const baseSettings = getBaseCheckSettings({
|
|
184
188
|
calculatedRegions: selectorsToCalculate.map(({ originalSelector, safeSelector }) => ({
|
|
185
|
-
selector: originalSelector,
|
|
189
|
+
selector: originalSelector !== null && originalSelector !== void 0 ? originalSelector : undefined,
|
|
186
190
|
regions: safeSelector ? selectorRegions[offset++] : [],
|
|
187
191
|
})),
|
|
188
192
|
});
|
|
189
193
|
baseSettings.renderId = renderId;
|
|
190
194
|
baseTarget.source = snapshotUrl;
|
|
191
195
|
baseTarget.name = snapshotTitle;
|
|
192
|
-
if (signal.aborted) {
|
|
196
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
193
197
|
logger.warn('Command "check" was aborted after rendering');
|
|
194
198
|
throw new abort_error_1.AbortError('Command "check" was aborted after rendering');
|
|
195
199
|
}
|
package/dist/ufg/check.js
CHANGED
|
@@ -29,8 +29,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
29
29
|
exports.makeCheck = void 0;
|
|
30
30
|
const driver_1 = require("@applitools/driver");
|
|
31
31
|
const take_snapshots_1 = require("./utils/take-snapshots");
|
|
32
|
-
const wait_for_lazy_load_1 = require("../utils/wait-for-lazy-load");
|
|
33
|
-
const to_base_check_settings_1 = require("../utils/to-base-check-settings");
|
|
32
|
+
const wait_for_lazy_load_1 = require("../automation/utils/wait-for-lazy-load");
|
|
33
|
+
const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
|
|
34
34
|
const generate_safe_selectors_1 = require("./utils/generate-safe-selectors");
|
|
35
35
|
const uniquify_renderers_1 = require("./utils/uniquify-renderers");
|
|
36
36
|
const abort_error_1 = require("../errors/abort-error");
|
|
@@ -38,13 +38,15 @@ const utils = __importStar(require("@applitools/utils"));
|
|
|
38
38
|
const chalk_1 = __importDefault(require("chalk"));
|
|
39
39
|
function makeCheck({ eyes, client, target: defaultTarget, spec, signal, logger: defaultLogger, }) {
|
|
40
40
|
return async function check({ target = defaultTarget, settings = {}, logger = defaultLogger, }) {
|
|
41
|
-
var _a, _b, _c, _d;
|
|
42
|
-
logger.log('Command "check" is called with settings', settings);
|
|
43
|
-
if (signal.aborted) {
|
|
44
|
-
logger.warn('Command "check" was called after test was already aborted');
|
|
41
|
+
var _a, _b, _c, _d, _e;
|
|
42
|
+
logger === null || logger === void 0 ? void 0 : logger.log('Command "check" is called with settings', settings);
|
|
43
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
44
|
+
logger === null || logger === void 0 ? void 0 : logger.warn('Command "check" was called after test was already aborted');
|
|
45
45
|
throw new abort_error_1.AbortError('Command "check" was called after test was already aborted');
|
|
46
46
|
}
|
|
47
|
-
const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
|
|
47
|
+
const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
|
|
48
|
+
settings,
|
|
49
|
+
});
|
|
48
50
|
let snapshots;
|
|
49
51
|
let snapshotUrl;
|
|
50
52
|
let snapshotTitle;
|
|
@@ -52,8 +54,8 @@ function makeCheck({ eyes, client, target: defaultTarget, spec, signal, logger:
|
|
|
52
54
|
let regionToTarget;
|
|
53
55
|
let selectorsToCalculate;
|
|
54
56
|
const uniqueRenderers = (0, uniquify_renderers_1.uniquifyRenderers)((_a = settings.renderers) !== null && _a !== void 0 ? _a : []);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
const driver = spec && (0, driver_1.isDriver)(target, spec) ? await (0, driver_1.makeDriver)({ spec, driver: target, logger }) : null;
|
|
58
|
+
if (driver) {
|
|
57
59
|
await driver.currentContext.setScrollingElement((_b = settings.scrollRootElement) !== null && _b !== void 0 ? _b : null);
|
|
58
60
|
if (uniqueRenderers.length === 0) {
|
|
59
61
|
if (driver.isWeb) {
|
|
@@ -69,13 +71,16 @@ function makeCheck({ eyes, client, target: defaultTarget, spec, signal, logger:
|
|
|
69
71
|
userAgent = driver.userAgent;
|
|
70
72
|
const generated = await (0, generate_safe_selectors_1.generateSafeSelectors)({
|
|
71
73
|
context: driver.currentContext,
|
|
72
|
-
elementReferences: [
|
|
74
|
+
elementReferences: [
|
|
75
|
+
...(elementReferenceToTarget ? [elementReferenceToTarget] : []),
|
|
76
|
+
...elementReferencesToCalculate,
|
|
77
|
+
],
|
|
73
78
|
});
|
|
74
79
|
cleanupGeneratedSelectors = generated.cleanupGeneratedSelectors;
|
|
75
80
|
if (elementReferenceToTarget) {
|
|
76
|
-
|
|
77
|
-
if (!regionToTarget)
|
|
81
|
+
if (!((_c = generated.selectors[0]) === null || _c === void 0 ? void 0 : _c.safeSelector))
|
|
78
82
|
throw new Error('Target element not found');
|
|
83
|
+
regionToTarget = (_d = generated.selectors[0]) === null || _d === void 0 ? void 0 : _d.safeSelector;
|
|
79
84
|
selectorsToCalculate = generated.selectors.slice(1);
|
|
80
85
|
}
|
|
81
86
|
else {
|
|
@@ -119,7 +124,7 @@ function makeCheck({ eyes, client, target: defaultTarget, spec, signal, logger:
|
|
|
119
124
|
snapshots = !utils.types.isArray(target) ? Array(uniqueRenderers.length).fill(target) : target;
|
|
120
125
|
snapshotUrl = utils.types.has(snapshots[0], 'url') ? snapshots[0].url : undefined;
|
|
121
126
|
}
|
|
122
|
-
regionToTarget !== null && regionToTarget !== void 0 ? regionToTarget : (regionToTarget = (
|
|
127
|
+
regionToTarget !== null && regionToTarget !== void 0 ? regionToTarget : (regionToTarget = (_e = elementReferenceToTarget) !== null && _e !== void 0 ? _e : settings.region);
|
|
123
128
|
selectorsToCalculate !== null && selectorsToCalculate !== void 0 ? selectorsToCalculate : (selectorsToCalculate = elementReferencesToCalculate.map(selector => ({
|
|
124
129
|
originalSelector: selector,
|
|
125
130
|
safeSelector: selector,
|
|
@@ -127,11 +132,11 @@ function makeCheck({ eyes, client, target: defaultTarget, spec, signal, logger:
|
|
|
127
132
|
const promises = uniqueRenderers.map(async (renderer, index) => {
|
|
128
133
|
if (utils.types.has(renderer, 'name') && renderer.name === 'edge') {
|
|
129
134
|
const message = chalk_1.default.yellow(`The 'edge' option that is being used in your browsers' configuration will soon be deprecated. Please change it to either 'edgelegacy' for the legacy version or to 'edgechromium' for the new Chromium-based version. Please note, when using the built-in BrowserType enum, then the values are BrowserType.EDGE_LEGACY and BrowserType.EDGE_CHROMIUM, respectively.`);
|
|
130
|
-
logger.console.log(message);
|
|
135
|
+
logger === null || logger === void 0 ? void 0 : logger.console.log(message);
|
|
131
136
|
}
|
|
132
137
|
try {
|
|
133
|
-
if (signal.aborted) {
|
|
134
|
-
logger.warn('Command "check" was aborted before rendering');
|
|
138
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
139
|
+
logger === null || logger === void 0 ? void 0 : logger.warn('Command "check" was aborted before rendering');
|
|
135
140
|
throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
|
|
136
141
|
}
|
|
137
142
|
const { cookies, ...snapshot } = snapshots[index];
|
|
@@ -149,7 +154,7 @@ function makeCheck({ eyes, client, target: defaultTarget, spec, signal, logger:
|
|
|
149
154
|
});
|
|
150
155
|
const [baseEyes] = await eyes.getBaseEyes({ settings: { renderer, type: snapshotType }, logger });
|
|
151
156
|
try {
|
|
152
|
-
if (signal.aborted) {
|
|
157
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
153
158
|
logger.warn('Command "check" was aborted before rendering');
|
|
154
159
|
throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
|
|
155
160
|
}
|
|
@@ -158,7 +163,7 @@ function makeCheck({ eyes, client, target: defaultTarget, spec, signal, logger:
|
|
|
158
163
|
throw new abort_error_1.AbortError(`Renderer with id "${baseEyes.test.rendererId}" was aborted during one of the previous steps`);
|
|
159
164
|
}
|
|
160
165
|
const renderTarget = await renderTargetPromise;
|
|
161
|
-
if (signal.aborted) {
|
|
166
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
162
167
|
logger.warn('Command "check" was aborted before rendering');
|
|
163
168
|
throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
|
|
164
169
|
}
|
|
@@ -182,14 +187,14 @@ function makeCheck({ eyes, client, target: defaultTarget, spec, signal, logger:
|
|
|
182
187
|
let offset = 0;
|
|
183
188
|
const baseSettings = getBaseCheckSettings({
|
|
184
189
|
calculatedRegions: selectorsToCalculate.map(({ originalSelector, safeSelector }) => ({
|
|
185
|
-
selector: originalSelector,
|
|
190
|
+
selector: originalSelector !== null && originalSelector !== void 0 ? originalSelector : undefined,
|
|
186
191
|
regions: safeSelector ? selectorRegions[offset++] : [],
|
|
187
192
|
})),
|
|
188
193
|
});
|
|
189
194
|
baseSettings.renderId = renderId;
|
|
190
195
|
baseTarget.source = snapshotUrl;
|
|
191
196
|
baseTarget.name = snapshotTitle;
|
|
192
|
-
if (signal.aborted) {
|
|
197
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
193
198
|
logger.warn('Command "check" was aborted after rendering');
|
|
194
199
|
throw new abort_error_1.AbortError('Command "check" was aborted after rendering');
|
|
195
200
|
}
|
|
@@ -197,7 +202,11 @@ function makeCheck({ eyes, client, target: defaultTarget, spec, signal, logger:
|
|
|
197
202
|
logger.warn(`Renderer with id ${baseEyes.test.rendererId} was aborted during one of the previous steps`);
|
|
198
203
|
throw new abort_error_1.AbortError(`Renderer with id "${baseEyes.test.rendererId}" was aborted during one of the previous steps`);
|
|
199
204
|
}
|
|
200
|
-
const [result] = await baseEyes.check({
|
|
205
|
+
const [result] = await baseEyes.check({
|
|
206
|
+
target: { ...baseTarget, isTransformed: true },
|
|
207
|
+
settings: baseSettings,
|
|
208
|
+
logger,
|
|
209
|
+
});
|
|
201
210
|
if (baseEyes.aborted) {
|
|
202
211
|
logger.warn(`Renderer with id ${baseEyes.test.rendererId} was aborted during one of the previous steps`);
|
|
203
212
|
throw new abort_error_1.AbortError(`Renderer with id "${baseEyes.test.rendererId}" was aborted during one of the previous steps`);
|
|
@@ -205,9 +214,7 @@ function makeCheck({ eyes, client, target: defaultTarget, spec, signal, logger:
|
|
|
205
214
|
return { ...result, eyes: baseEyes, renderer };
|
|
206
215
|
}
|
|
207
216
|
catch (error) {
|
|
208
|
-
|
|
209
|
-
const testMetadata = await (driver === null || driver === void 0 ? void 0 : driver.getSessionMetadata());
|
|
210
|
-
await baseEyes.abort({ settings: { testMetadata } });
|
|
217
|
+
await baseEyes.abort({ settings: { testMetadata: await (driver === null || driver === void 0 ? void 0 : driver.getSessionMetadata()) } });
|
|
211
218
|
error.info = { eyes: baseEyes };
|
|
212
219
|
throw error;
|
|
213
220
|
}
|
package/dist/ufg/core.js
CHANGED
|
@@ -68,11 +68,11 @@ function makeCore({ concurrency, spec, client, core, agentId = 'core-ufg', cwd =
|
|
|
68
68
|
});
|
|
69
69
|
return utils.general.extend(core, {
|
|
70
70
|
type: 'ufg',
|
|
71
|
-
isDriver: spec
|
|
72
|
-
isElement: spec
|
|
73
|
-
isSelector: spec
|
|
74
|
-
getViewportSize: (0, get_viewport_size_1.makeGetViewportSize)({ spec, logger }),
|
|
75
|
-
setViewportSize: (0, set_viewport_size_1.makeSetViewportSize)({ spec, logger }),
|
|
71
|
+
isDriver: spec && spec.isDriver,
|
|
72
|
+
isElement: spec && spec.isElement,
|
|
73
|
+
isSelector: spec && spec.isSelector,
|
|
74
|
+
getViewportSize: spec && (0, get_viewport_size_1.makeGetViewportSize)({ spec, logger }),
|
|
75
|
+
setViewportSize: spec && (0, set_viewport_size_1.makeSetViewportSize)({ spec, logger }),
|
|
76
76
|
locate: (0, locate_1.makeLocate)({ spec, core, logger }),
|
|
77
77
|
openEyes: (0, open_eyes_1.makeOpenEyes)({ spec, client, core, logger }),
|
|
78
78
|
});
|
|
@@ -32,6 +32,8 @@ function makeGetBaseEyes({ settings: defaultSettings, core, client, eyes, logger
|
|
|
32
32
|
return getBaseEyesWithCache;
|
|
33
33
|
async function getBaseEyes({ settings, logger = defaultLogger, } = {}) {
|
|
34
34
|
logger.log(`Command "getBaseEyes" is called with settings`, settings);
|
|
35
|
+
if (!settings)
|
|
36
|
+
throw new Error('');
|
|
35
37
|
const environment = await client.bookRenderer({ settings });
|
|
36
38
|
const eyes = await core.openEyes({
|
|
37
39
|
settings: { ...defaultSettings, environment: { ...defaultSettings.environment, ...environment } },
|
package/dist/ufg/open-eyes.js
CHANGED
|
@@ -82,7 +82,7 @@ function makeOpenEyes({ core, client, spec, logger: defaultLogger, }) {
|
|
|
82
82
|
},
|
|
83
83
|
getBaseEyes,
|
|
84
84
|
// check with indexing and storage
|
|
85
|
-
check: utils.general.wrap((0, check_1.makeCheck)({ eyes, client, target: driver, spec, signal: controller.signal, logger }), async (check, options = {}) => {
|
|
85
|
+
check: utils.general.wrap((0, check_1.makeCheck)({ eyes, client: client, target: driver, spec, signal: controller.signal, logger }), async (check, options = {}) => {
|
|
86
86
|
const results = await check(options);
|
|
87
87
|
storage.push(...results.map(result => ({
|
|
88
88
|
promise: result.promise,
|
|
@@ -90,7 +90,16 @@ function makeOpenEyes({ core, client, spec, logger: defaultLogger, }) {
|
|
|
90
90
|
})));
|
|
91
91
|
return results;
|
|
92
92
|
}),
|
|
93
|
-
checkAndClose: (0, check_and_close_1.makeCheckAndClose)({
|
|
93
|
+
checkAndClose: (0, check_and_close_1.makeCheckAndClose)({
|
|
94
|
+
eyes,
|
|
95
|
+
client: client,
|
|
96
|
+
target: driver,
|
|
97
|
+
spec,
|
|
98
|
+
signal: controller.signal,
|
|
99
|
+
logger,
|
|
100
|
+
}),
|
|
101
|
+
locateText: null,
|
|
102
|
+
extractText: null,
|
|
94
103
|
// close only once
|
|
95
104
|
close: utils.general.wrap((0, close_1.makeClose)({ storage, target: driver, logger }), async (close, options) => {
|
|
96
105
|
if (closed || aborted)
|