@applitools/core 4.74.1 → 4.75.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/CHANGELOG.md +112 -0
- package/README.md +15 -20
- package/dist/automation/abort.js +8 -18
- package/dist/automation/close.js +8 -27
- package/dist/automation/get-results.js +3 -11
- package/dist/automation/utils/make-environment-loggers.js +39 -0
- package/dist/automation/utils/to-environment-key.js +6 -1
- package/dist/classic/check-and-close.js +26 -69
- package/dist/classic/check.js +85 -354
- package/dist/classic/get-base-eyes.js +15 -54
- package/dist/classic/open-eyes.js +17 -10
- package/dist/classic/utils/capture.js +209 -0
- package/dist/get-typed-eyes.js +2 -2
- package/dist/offline/run-offline-snapshots.js +3 -1
- package/dist/open-eyes.js +5 -1
- package/dist/tasks/abort.js +32 -0
- package/dist/tasks/aborted-check.js +14 -0
- package/dist/tasks/classic/capture.js +54 -0
- package/dist/tasks/classic/steps.js +51 -0
- package/dist/tasks/classic/upload.js +40 -0
- package/dist/tasks/close.js +31 -0
- package/dist/tasks/fill.js +13 -0
- package/dist/tasks/get-results.js +29 -0
- package/dist/tasks/graph.js +6 -0
- package/dist/tasks/index.js +20 -0
- package/dist/tasks/lifecycle.js +101 -0
- package/dist/tasks/match.js +109 -0
- package/dist/tasks/open.js +38 -0
- package/dist/tasks/queries.js +39 -0
- package/dist/tasks/types.js +2 -0
- package/dist/tasks/ufg/create-render-target.js +16 -0
- package/dist/tasks/ufg/recheck.js +49 -0
- package/dist/tasks/ufg/render.js +66 -0
- package/dist/tasks/ufg/steps.js +51 -0
- package/dist/tasks/upload-target.js +10 -0
- package/dist/ufg/check-and-close.js +32 -137
- package/dist/ufg/check.js +39 -175
- package/dist/ufg/get-base-eyes.js +34 -72
- package/dist/ufg/open-eyes.js +14 -8
- package/dist/utils/extract-git-info.js +9 -2
- package/package.json +20 -19
- package/types/automation/abort.d.ts +2 -3
- package/types/automation/close.d.ts +2 -3
- package/types/automation/types.d.ts +13 -16
- package/types/automation/utils/make-environment-loggers.d.ts +3 -0
- package/types/classic/get-base-eyes.d.ts +5 -9
- package/types/classic/open-eyes.d.ts +4 -3
- package/types/classic/types.d.ts +1 -1
- package/types/classic/utils/capture.d.ts +21 -0
- package/types/tasks/abort.d.ts +11 -0
- package/types/tasks/aborted-check.d.ts +9 -0
- package/types/tasks/classic/capture.d.ts +10 -0
- package/types/tasks/classic/steps.d.ts +17 -0
- package/types/tasks/classic/upload.d.ts +14 -0
- package/types/tasks/close.d.ts +9 -0
- package/types/tasks/fill.d.ts +8 -0
- package/types/tasks/get-results.d.ts +6 -0
- package/types/tasks/graph.d.ts +3 -0
- package/types/tasks/index.d.ts +3 -0
- package/types/tasks/lifecycle.d.ts +23 -0
- package/types/tasks/match.d.ts +13 -0
- package/types/tasks/open.d.ts +10 -0
- package/types/tasks/queries.d.ts +15 -0
- package/types/tasks/types.d.ts +187 -0
- package/types/tasks/ufg/create-render-target.d.ts +11 -0
- package/types/tasks/ufg/recheck.d.ts +20 -0
- package/types/tasks/ufg/render.d.ts +15 -0
- package/types/tasks/ufg/steps.d.ts +15 -0
- package/types/tasks/upload-target.d.ts +5 -0
- package/types/ufg/get-base-eyes.d.ts +5 -10
- package/types/ufg/open-eyes.d.ts +4 -3
- package/types/ufg/types.d.ts +1 -1
- package/types/utils/extract-git-info.d.ts +2 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.add = void 0;
|
|
4
|
+
const abort_error_1 = require("../errors/abort-error");
|
|
5
|
+
const queries_1 = require("./queries");
|
|
6
|
+
/** A check step. While still unstarted, it fuses with a `close` added after it into one `matchAndEnd`. */
|
|
7
|
+
function add(graph, { deps, inputs, labels }) {
|
|
8
|
+
// After the environment's previous step, so steps reach the backend in order.
|
|
9
|
+
const after = [(0, queries_1.lastStep)(labels.session, labels.env)];
|
|
10
|
+
return graph.add({
|
|
11
|
+
type: 'match',
|
|
12
|
+
deps: { ...deps, open: (0, queries_1.environmentOpen)(labels) },
|
|
13
|
+
after,
|
|
14
|
+
inputs,
|
|
15
|
+
labels,
|
|
16
|
+
logger: inputs.logger,
|
|
17
|
+
run,
|
|
18
|
+
collapse: successor => successor.type === 'close' && inputs.canFuse
|
|
19
|
+
? {
|
|
20
|
+
type: 'matchAndEnd',
|
|
21
|
+
inputs: { match: inputs, settings: successor.inputs.settings },
|
|
22
|
+
labels,
|
|
23
|
+
logger: inputs.logger,
|
|
24
|
+
run: runMatchAndEnd,
|
|
25
|
+
}
|
|
26
|
+
: undefined,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
exports.add = add;
|
|
30
|
+
async function run(deps, inputs) {
|
|
31
|
+
var _a;
|
|
32
|
+
const baseEyes = deps.open;
|
|
33
|
+
logMutability(baseEyes, inputs);
|
|
34
|
+
try {
|
|
35
|
+
if (((_a = inputs.signal) === null || _a === void 0 ? void 0 : _a.aborted) || !baseEyes.running) {
|
|
36
|
+
throw new abort_error_1.AbortError('Command "check" was aborted during one of the previous steps');
|
|
37
|
+
}
|
|
38
|
+
const target = deps.upload;
|
|
39
|
+
if (!target)
|
|
40
|
+
return { asExpected: true };
|
|
41
|
+
return await baseEyes.match({ target: target.target, settings: target.settings, logger: inputs.logger });
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
throw reportFailure(baseEyes, inputs, error);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function runMatchAndEnd(deps, { match, settings }) {
|
|
48
|
+
var _a, _b;
|
|
49
|
+
const baseEyes = deps.open;
|
|
50
|
+
logMutability(baseEyes, match);
|
|
51
|
+
try {
|
|
52
|
+
if (((_a = match.signal) === null || _a === void 0 ? void 0 : _a.aborted) || !baseEyes.running) {
|
|
53
|
+
throw new abort_error_1.AbortError('Command "check" was aborted during one of the previous steps');
|
|
54
|
+
}
|
|
55
|
+
const target = deps.upload;
|
|
56
|
+
if (target) {
|
|
57
|
+
await baseEyes.matchAndEnd({ ...target, settings: { ...target.settings, ...settings }, logger: match.logger });
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
await baseEyes.close({ settings, logger: match.logger });
|
|
61
|
+
}
|
|
62
|
+
return { asExpected: true };
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
throw reportFailure(baseEyes, match, error);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
(_b = baseEyes.release) === null || _b === void 0 ? void 0 : _b.call(baseEyes);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function logMutability(baseEyes, { mutability, logger }) {
|
|
72
|
+
var _a;
|
|
73
|
+
if (!mutability)
|
|
74
|
+
return;
|
|
75
|
+
const { eyes } = mutability;
|
|
76
|
+
void eyes.core.logEvent({
|
|
77
|
+
settings: {
|
|
78
|
+
level: 'Notice',
|
|
79
|
+
event: {
|
|
80
|
+
type: 'eyes.check',
|
|
81
|
+
message: 'Assuming mutability for check Target',
|
|
82
|
+
test: {
|
|
83
|
+
checkName: mutability.checkName,
|
|
84
|
+
batchId: baseEyes.test.batchId,
|
|
85
|
+
sessionId: baseEyes.test.sessionId,
|
|
86
|
+
testName: baseEyes.test.testName,
|
|
87
|
+
testId: baseEyes.test.testId,
|
|
88
|
+
userTestId: baseEyes.test.userTestId,
|
|
89
|
+
appId: baseEyes.test.appId,
|
|
90
|
+
baselineId: baseEyes.test.baselineId,
|
|
91
|
+
environmentId: (_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId,
|
|
92
|
+
},
|
|
93
|
+
isNew: baseEyes.test.isNew,
|
|
94
|
+
resultsUrl: baseEyes.test.resultsUrl,
|
|
95
|
+
},
|
|
96
|
+
...eyes.test.eyesServer,
|
|
97
|
+
},
|
|
98
|
+
logger,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/** Aborts the session on a failed step and reports the error, returning it for the caller to throw. */
|
|
102
|
+
function reportFailure(baseEyes, inputs, error) {
|
|
103
|
+
var _a, _b;
|
|
104
|
+
if (baseEyes.running && !((_a = inputs.signal) === null || _a === void 0 ? void 0 : _a.aborted)) {
|
|
105
|
+
void baseEyes.abort({ settings: { reason: error }, logger: inputs.logger });
|
|
106
|
+
}
|
|
107
|
+
(_b = inputs.onError) === null || _b === void 0 ? void 0 : _b.call(inputs, error, baseEyes);
|
|
108
|
+
return error;
|
|
109
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.add = void 0;
|
|
4
|
+
const get_base_eyes_1 = require("../classic/get-base-eyes");
|
|
5
|
+
const get_base_eyes_2 = require("../ufg/get-base-eyes");
|
|
6
|
+
const queries_1 = require("./queries");
|
|
7
|
+
/**
|
|
8
|
+
* An environment's base-session open — the root of its chain, one per environment: the environment's existing
|
|
9
|
+
* open, or a new one. Lazy until a dependent needs it.
|
|
10
|
+
*/
|
|
11
|
+
function add(graph, { inputs, labels }) {
|
|
12
|
+
const open = (0, queries_1.environmentOpen)(labels);
|
|
13
|
+
// A check that runs after close or abort dismissed the open gets a new one.
|
|
14
|
+
if (open && open.status !== 'dismissed')
|
|
15
|
+
return open;
|
|
16
|
+
// Kept by its session: later steps, closes and getResults look it up after it settles.
|
|
17
|
+
return graph.add({
|
|
18
|
+
type: 'open',
|
|
19
|
+
kind: 'lazy',
|
|
20
|
+
inputs,
|
|
21
|
+
labels,
|
|
22
|
+
keep: labels.session,
|
|
23
|
+
logger: inputs.logger,
|
|
24
|
+
run,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
exports.add = add;
|
|
28
|
+
async function run(_deps, { eyes, environment, driver, logger }) {
|
|
29
|
+
try {
|
|
30
|
+
return eyes.type === 'ufg'
|
|
31
|
+
? await (0, get_base_eyes_2.getBaseEyes)({ eyes: eyes, settings: { environment, driver }, logger })
|
|
32
|
+
: await (0, get_base_eyes_1.getBaseEyes)({ eyes: eyes, settings: { environment, driver }, logger });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
error.info = { ...error.info, userTestId: eyes.test.userTestId, environment };
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.activeEnvironmentKeys = exports.openedEnvironmentKeys = exports.environmentKeys = exports.lastStep = exports.environmentOpen = exports.queryTasks = void 0;
|
|
4
|
+
const graph_1 = require("./graph");
|
|
5
|
+
// The graph is the session's only state: every task carries `{session, env}` labels, and the session
|
|
6
|
+
// keeps its opens and aborted checks queryable after they settle (everything else leaves the graph once settled).
|
|
7
|
+
// `graph.add` holds each type to its contract, so a query by type can type its results.
|
|
8
|
+
function queryTasks({ session, type, env }) {
|
|
9
|
+
return graph_1.graph.filter(task => task.type === type && task.labels.session === session && (env === undefined || task.labels.env === env), session);
|
|
10
|
+
}
|
|
11
|
+
exports.queryTasks = queryTasks;
|
|
12
|
+
/** The environment's newest open — every task of the environment rests on it. */
|
|
13
|
+
function environmentOpen({ session, env }) {
|
|
14
|
+
const opens = queryTasks({ session, type: 'open', env });
|
|
15
|
+
return opens[opens.length - 1];
|
|
16
|
+
}
|
|
17
|
+
exports.environmentOpen = environmentOpen;
|
|
18
|
+
/** The environment's newest unfinished step — its match, or the recheck after it. */
|
|
19
|
+
function lastStep(session, env) {
|
|
20
|
+
return [...queryTasks({ session, type: 'match', env }), ...queryTasks({ session, type: 'recheck', env })].find(task => task.dependents.size === 0);
|
|
21
|
+
}
|
|
22
|
+
exports.lastStep = lastStep;
|
|
23
|
+
function environmentKeys(session) {
|
|
24
|
+
return [...new Set(queryTasks({ session, type: 'open' }).map(task => task.labels.env))];
|
|
25
|
+
}
|
|
26
|
+
exports.environmentKeys = environmentKeys;
|
|
27
|
+
/** The environment keys whose open was demanded, not just speculatively pre-created. */
|
|
28
|
+
function openedEnvironmentKeys(session) {
|
|
29
|
+
return queryTasks({ session, type: 'open' })
|
|
30
|
+
.filter(task => task.status !== 'pending' && task.status !== 'dismissed')
|
|
31
|
+
.map(task => task.labels.env);
|
|
32
|
+
}
|
|
33
|
+
exports.openedEnvironmentKeys = openedEnvironmentKeys;
|
|
34
|
+
/** The environments getResults reports: the opened ones, and those of a check the test was aborted during. */
|
|
35
|
+
function activeEnvironmentKeys(session) {
|
|
36
|
+
const aborted = queryTasks({ session, type: 'abortedCheck' }).map(task => task.labels.env);
|
|
37
|
+
return [...new Set([...openedEnvironmentKeys(session), ...aborted])];
|
|
38
|
+
}
|
|
39
|
+
exports.activeEnvironmentKeys = activeEnvironmentKeys;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.add = void 0;
|
|
4
|
+
const create_render_target_from_snapshot_1 = require("../../ufg/create-render-target-from-snapshot");
|
|
5
|
+
/**
|
|
6
|
+
* Processes a ufg snapshot's resources as soon as the check is called, before its session opens: it fills the
|
|
7
|
+
* UFG client's resource cache, which the next snapshot reads as its skip-list, so an already-fetched (e.g.
|
|
8
|
+
* ephemeral) resource is not re-requested and the renders stay identical.
|
|
9
|
+
*/
|
|
10
|
+
function add(graph, { inputs, labels }) {
|
|
11
|
+
return graph.add({ type: 'createRenderTarget', inputs, labels, logger: inputs.logger, run });
|
|
12
|
+
}
|
|
13
|
+
exports.add = add;
|
|
14
|
+
function run(_deps, inputs) {
|
|
15
|
+
return (0, create_render_target_from_snapshot_1.createRenderTargetFromSnapshot)(inputs);
|
|
16
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.add = void 0;
|
|
4
|
+
const render_1 = require("./render");
|
|
5
|
+
const queries_1 = require("../queries");
|
|
6
|
+
/**
|
|
7
|
+
* The old-infra retry of a ufg check step: when the backend asks for it, re-checks a mismatch against the
|
|
8
|
+
* previous browser version before the next step, and stops once a retry fails (the backend then stops
|
|
9
|
+
* expecting retries). Best-effort: a failed retry must not abort the environment — the primary match
|
|
10
|
+
* already recorded its step.
|
|
11
|
+
*/
|
|
12
|
+
function add(graph, { deps, inputs, labels }) {
|
|
13
|
+
return graph.add({
|
|
14
|
+
type: 'recheck',
|
|
15
|
+
deps: { ...deps, open: (0, queries_1.environmentOpen)(labels) },
|
|
16
|
+
inputs,
|
|
17
|
+
labels,
|
|
18
|
+
logger: inputs.logger,
|
|
19
|
+
run,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
exports.add = add;
|
|
23
|
+
async function run(deps, { render: inputs, disabled: oldInfraRetryDisabled, logger }) {
|
|
24
|
+
var _a;
|
|
25
|
+
let result;
|
|
26
|
+
let baseEyes;
|
|
27
|
+
try {
|
|
28
|
+
result = deps.match;
|
|
29
|
+
baseEyes = deps.open;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (((_a = inputs.signal) === null || _a === void 0 ? void 0 : _a.aborted) || !baseEyes.running)
|
|
35
|
+
return;
|
|
36
|
+
if (!baseEyes.test.shouldRetryWithOldInfra || result.asExpected || oldInfraRetryDisabled.has(baseEyes))
|
|
37
|
+
return;
|
|
38
|
+
try {
|
|
39
|
+
const { target, settings } = await (0, render_1.render)(baseEyes, deps.renderTarget, inputs);
|
|
40
|
+
settings.oldInfraRetry = true;
|
|
41
|
+
const retry = await baseEyes.match({ target, settings, logger });
|
|
42
|
+
if (!retry.asExpected)
|
|
43
|
+
oldInfraRetryDisabled.add(baseEyes);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
oldInfraRetryDisabled.add(baseEyes);
|
|
47
|
+
logger.warn('Old-infra retry failed; keeping the primary check result', error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.render = exports.add = void 0;
|
|
4
|
+
const to_base_check_settings_1 = require("../../automation/utils/to-base-check-settings");
|
|
5
|
+
const build_accessibility_report_options_1 = require("../../ufg/build-accessibility-report-options");
|
|
6
|
+
const abort_error_1 = require("../../errors/abort-error");
|
|
7
|
+
const upload_target_1 = require("../upload-target");
|
|
8
|
+
const queries_1 = require("../queries");
|
|
9
|
+
/** The slow leg of a ufg check step: render the snapshot, then normalize and upload the result. */
|
|
10
|
+
function add(graph, { deps, inputs, labels }) {
|
|
11
|
+
return graph.add({
|
|
12
|
+
type: 'render',
|
|
13
|
+
deps: { ...deps, open: (0, queries_1.environmentOpen)(labels) },
|
|
14
|
+
inputs,
|
|
15
|
+
labels,
|
|
16
|
+
logger: inputs.logger,
|
|
17
|
+
run,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
exports.add = add;
|
|
21
|
+
async function run(deps, inputs) {
|
|
22
|
+
var _a;
|
|
23
|
+
const baseEyes = deps.open;
|
|
24
|
+
if (((_a = inputs.signal) === null || _a === void 0 ? void 0 : _a.aborted) || !baseEyes.running)
|
|
25
|
+
throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
|
|
26
|
+
return (0, upload_target_1.uploadTarget)(baseEyes, await render(baseEyes, deps.renderTarget, inputs), inputs.logger);
|
|
27
|
+
}
|
|
28
|
+
async function render(baseEyes, renderTarget, { ufgClient, snapshot, environment, accessibility, signal, logger }) {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
const accessibilityReportOptions = accessibility && (0, build_accessibility_report_options_1.buildAccessibilityReportOptions)(accessibility);
|
|
31
|
+
const { elementReferences: selectors, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
|
|
32
|
+
settings: snapshot.settings,
|
|
33
|
+
});
|
|
34
|
+
const { renderId, selectorRegions, ...target } = await ufgClient.render({
|
|
35
|
+
target: renderTarget,
|
|
36
|
+
settings: {
|
|
37
|
+
...snapshot.settings,
|
|
38
|
+
region: (_a = selectors.target) !== null && _a !== void 0 ? _a : snapshot.settings.region,
|
|
39
|
+
scrollRootElement: selectors.scrolling,
|
|
40
|
+
selectorsToCalculate: selectors.calculate,
|
|
41
|
+
includeFullPageSize: Boolean(snapshot.settings.pageId),
|
|
42
|
+
environment: { ...environment, environmentId: baseEyes.test.environment.environmentId },
|
|
43
|
+
uploadUrl: baseEyes.test.uploadUrl,
|
|
44
|
+
stitchingServiceUrl: baseEyes.test.stitchingServiceUrl,
|
|
45
|
+
accessibilityReportOptions,
|
|
46
|
+
},
|
|
47
|
+
signal,
|
|
48
|
+
logger,
|
|
49
|
+
});
|
|
50
|
+
const checkSettings = getBaseCheckSettings({
|
|
51
|
+
calculatedRegions: selectors.calculate.map((_, index) => {
|
|
52
|
+
var _a;
|
|
53
|
+
return ({
|
|
54
|
+
regions: (_a = selectorRegions === null || selectorRegions === void 0 ? void 0 : selectorRegions[index]) !== null && _a !== void 0 ? _a : [],
|
|
55
|
+
});
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
checkSettings.renderId = renderId;
|
|
59
|
+
target.source = snapshot.url;
|
|
60
|
+
target.name = snapshot.title;
|
|
61
|
+
// Fall back to the minted upload URL when the render result carries no report location.
|
|
62
|
+
if (accessibilityReportOptions === null || accessibilityReportOptions === void 0 ? void 0 : accessibilityReportOptions.uploadUrl)
|
|
63
|
+
(_b = target.accessibilityReportLocation) !== null && _b !== void 0 ? _b : (target.accessibilityReportLocation = accessibilityReportOptions.uploadUrl);
|
|
64
|
+
return { target: { ...target, isTransformed: true }, settings: checkSettings };
|
|
65
|
+
}
|
|
66
|
+
exports.render = render;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.addCheckAndClose = exports.addCheck = void 0;
|
|
27
|
+
const graph_1 = require("../graph");
|
|
28
|
+
const openTask = __importStar(require("../open"));
|
|
29
|
+
const createRenderTargetTask = __importStar(require("./create-render-target"));
|
|
30
|
+
const renderTask = __importStar(require("./render"));
|
|
31
|
+
const matchTask = __importStar(require("../match"));
|
|
32
|
+
const recheckTask = __importStar(require("./recheck"));
|
|
33
|
+
const lifecycle_1 = require("../lifecycle");
|
|
34
|
+
/** A check step: its render, then its match after the environment's previous one, then its old-infra recheck. */
|
|
35
|
+
function addCheck(session, env, step) {
|
|
36
|
+
const labels = { session, env };
|
|
37
|
+
openTask.add(graph_1.graph, { inputs: step.open, labels });
|
|
38
|
+
const renderTarget = createRenderTargetTask.add(graph_1.graph, { inputs: step.renderTarget, labels });
|
|
39
|
+
const upload = renderTask.add(graph_1.graph, { deps: { renderTarget }, inputs: step.render, labels });
|
|
40
|
+
const match = matchTask.add(graph_1.graph, { deps: { upload }, inputs: step.inputs, labels });
|
|
41
|
+
if (step.recheck)
|
|
42
|
+
recheckTask.add(graph_1.graph, { deps: { match, renderTarget }, inputs: step.recheck, labels });
|
|
43
|
+
return match;
|
|
44
|
+
}
|
|
45
|
+
exports.addCheck = addCheck;
|
|
46
|
+
/** A check step and the close it fuses into: one `matchAndEnd`. */
|
|
47
|
+
function addCheckAndClose(session, env, { settings, ...step }) {
|
|
48
|
+
addCheck(session, env, step);
|
|
49
|
+
(0, lifecycle_1.addClose)(session, env, { settings, logger: step.inputs.logger });
|
|
50
|
+
}
|
|
51
|
+
exports.addCheckAndClose = addCheckAndClose;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.uploadTarget = void 0;
|
|
4
|
+
const core_base_1 = require("@applitools/core-base");
|
|
5
|
+
/** Normalizes a step's target and uploads its resources — the tail shared by `upload` and `render`. */
|
|
6
|
+
async function uploadTarget(baseEyes, step, logger) {
|
|
7
|
+
const { target, settings } = await (0, core_base_1.prepareBaseTarget)({ account: baseEyes.test.account, ...step, logger });
|
|
8
|
+
return baseEyes.uploadTarget({ target, settings, logger });
|
|
9
|
+
}
|
|
10
|
+
exports.uploadTarget = uploadTarget;
|
|
@@ -28,16 +28,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.makeCheckAndClose = void 0;
|
|
30
30
|
const driver_1 = require("@applitools/driver");
|
|
31
|
-
const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
|
|
32
31
|
const uniquify_environments_1 = require("../automation/utils/uniquify-environments");
|
|
33
32
|
const to_environment_key_1 = require("../automation/utils/to-environment-key");
|
|
34
33
|
const abort_error_1 = require("../errors/abort-error");
|
|
34
|
+
const tasks_1 = require("../tasks");
|
|
35
|
+
const steps_1 = require("../tasks/ufg/steps");
|
|
35
36
|
const utils = __importStar(require("@applitools/utils"));
|
|
36
37
|
const lang = __importStar(require("../lang"));
|
|
37
38
|
const chalk_1 = __importDefault(require("chalk"));
|
|
38
39
|
const take_snapshots_1 = require("./take-snapshots");
|
|
39
|
-
const create_render_target_from_snapshot_1 = require("./create-render-target-from-snapshot");
|
|
40
|
-
const build_accessibility_report_options_1 = require("./build-accessibility-report-options");
|
|
41
40
|
function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultEnvironments = [], spec, signal, logger: mainLogger, }) {
|
|
42
41
|
return async function checkAndClose({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
|
|
43
42
|
var _a;
|
|
@@ -72,147 +71,43 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
|
|
|
72
71
|
// TODO (amit)
|
|
73
72
|
snapshots = !utils.types.isArray(target) ? Array(uniqueEnvironments.length).fill(target) : target;
|
|
74
73
|
}
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
const environmentLogger = logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
|
|
78
|
-
const { target } = snapshot;
|
|
74
|
+
const mutability = settings.assumesMutability ? { eyes, checkName: settings.name } : undefined;
|
|
75
|
+
snapshots.forEach((snapshot, i) => {
|
|
79
76
|
const environment = uniqueEnvironments[i];
|
|
77
|
+
const environmentLogger = eyes.getEnvironmentLogger(environment, logger);
|
|
80
78
|
if (utils.types.has(environment, 'name') && environment.name === 'edge') {
|
|
81
79
|
environmentLogger.console.log(chalk_1.default.yellow(lang.edgeUfgEnvironmentDeprecatedWarning));
|
|
82
80
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const renderTargetPromise = (0, create_render_target_from_snapshot_1.createRenderTargetFromSnapshot)({
|
|
81
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
82
|
+
return (0, tasks_1.addAbortedCheck)(eyes, [environment], 'Command "check" was aborted before rendering', environmentLogger);
|
|
83
|
+
}
|
|
84
|
+
const open = { eyes, environment, driver, logger: environmentLogger };
|
|
85
|
+
(0, steps_1.addCheckAndClose)(eyes.session, (0, to_environment_key_1.toEnvironmentKey)(environment), {
|
|
86
|
+
open,
|
|
87
|
+
renderTarget: { ufgClient, snapshot, logger: environmentLogger },
|
|
88
|
+
render: {
|
|
92
89
|
ufgClient,
|
|
93
90
|
snapshot,
|
|
94
|
-
|
|
95
|
-
urlWithCredentials: snapshot.url,
|
|
96
|
-
});
|
|
97
|
-
const baseEyes = await eyes.getBaseEyes({ settings: { environment, driver }, logger });
|
|
98
|
-
try {
|
|
99
|
-
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
100
|
-
environmentLogger.warn('Command "check" was aborted before rendering');
|
|
101
|
-
throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
|
|
102
|
-
}
|
|
103
|
-
else if (!baseEyes.running) {
|
|
104
|
-
environmentLogger.warn(`Render on environment with id "${(_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId}" was aborted during one of the previous steps`);
|
|
105
|
-
throw new abort_error_1.AbortError(`Render on environment with id "${(_b = baseEyes.test.environment) === null || _b === void 0 ? void 0 : _b.environmentId}" was aborted during one of the previous steps`);
|
|
106
|
-
}
|
|
107
|
-
const renderTarget = await renderTargetPromise;
|
|
108
|
-
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
109
|
-
environmentLogger.warn('Command "check" was aborted before rendering');
|
|
110
|
-
throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
|
|
111
|
-
}
|
|
112
|
-
else if (!baseEyes.running) {
|
|
113
|
-
environmentLogger.warn(`Render on environment with id "${(_c = baseEyes.test.environment) === null || _c === void 0 ? void 0 : _c.environmentId}" was aborted during one of the previous steps`);
|
|
114
|
-
throw new abort_error_1.AbortError(`Render on environment with id "${(_d = baseEyes.test.environment) === null || _d === void 0 ? void 0 : _d.environmentId}" was aborted during one of the previous steps`);
|
|
115
|
-
}
|
|
116
|
-
const { elementReferences: selectors, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
|
|
117
|
-
settings: snapshot.settings,
|
|
118
|
-
});
|
|
91
|
+
environment,
|
|
119
92
|
// Only request a report when the check configures an accessibility standard.
|
|
120
|
-
|
|
121
|
-
?
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
},
|
|
139
|
-
signal,
|
|
140
|
-
logger: environmentLogger,
|
|
141
|
-
});
|
|
142
|
-
const baseSettings = getBaseCheckSettings({
|
|
143
|
-
calculatedRegions: selectors.calculate.map((_, index) => {
|
|
144
|
-
var _a;
|
|
145
|
-
return ({
|
|
146
|
-
regions: (_a = selectorRegions === null || selectorRegions === void 0 ? void 0 : selectorRegions[index]) !== null && _a !== void 0 ? _a : [],
|
|
147
|
-
});
|
|
148
|
-
}),
|
|
149
|
-
});
|
|
150
|
-
baseSettings.renderId = renderId;
|
|
151
|
-
baseTarget.source = snapshot.url;
|
|
152
|
-
baseTarget.name = snapshot.title;
|
|
153
|
-
// Fall back to the minted upload URL when the render result carries no report location.
|
|
154
|
-
if (accessibilityReportOptions === null || accessibilityReportOptions === void 0 ? void 0 : accessibilityReportOptions.uploadUrl)
|
|
155
|
-
(_f = baseTarget.accessibilityReportLocation) !== null && _f !== void 0 ? _f : (baseTarget.accessibilityReportLocation = accessibilityReportOptions.uploadUrl);
|
|
156
|
-
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
157
|
-
environmentLogger.warn('Command "check" was aborted after rendering');
|
|
158
|
-
throw new abort_error_1.AbortError('Command "check" was aborted after rendering');
|
|
159
|
-
}
|
|
160
|
-
else if (!baseEyes.running) {
|
|
161
|
-
environmentLogger.warn(`Render on environment with id "${(_g = baseEyes.test.environment) === null || _g === void 0 ? void 0 : _g.environmentId}" was aborted during one of the previous steps`);
|
|
162
|
-
throw new abort_error_1.AbortError(`Render on environment with id "${(_h = baseEyes.test.environment) === null || _h === void 0 ? void 0 : _h.environmentId}" was aborted during one of the previous steps`);
|
|
163
|
-
}
|
|
164
|
-
if (settings.assumesMutability) {
|
|
165
|
-
void eyes.core.logEvent({
|
|
166
|
-
settings: {
|
|
167
|
-
level: 'Notice',
|
|
168
|
-
event: {
|
|
169
|
-
type: 'eyes.check',
|
|
170
|
-
message: 'Assuming mutability for check Target',
|
|
171
|
-
test: {
|
|
172
|
-
checkName: settings.name,
|
|
173
|
-
batchId: baseEyes.test.batchId,
|
|
174
|
-
sessionId: baseEyes.test.sessionId,
|
|
175
|
-
testName: baseEyes.test.testName,
|
|
176
|
-
testId: baseEyes.test.testId,
|
|
177
|
-
userTestId: baseEyes.test.userTestId,
|
|
178
|
-
appId: baseEyes.test.appId,
|
|
179
|
-
baselineId: baseEyes.test.baselineId,
|
|
180
|
-
environmentId: (_j = baseEyes.test.environment) === null || _j === void 0 ? void 0 : _j.environmentId,
|
|
181
|
-
},
|
|
182
|
-
isNew: baseEyes.test.isNew,
|
|
183
|
-
resultsUrl: baseEyes.test.resultsUrl,
|
|
184
|
-
},
|
|
185
|
-
...eyes.test.eyesServer,
|
|
186
|
-
},
|
|
187
|
-
logger: environmentLogger,
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
await baseEyes.checkAndClose({
|
|
191
|
-
target: { ...baseTarget, isTransformed: true },
|
|
192
|
-
settings: baseSettings,
|
|
193
|
-
logger: environmentLogger,
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
environmentLogger.error(`Render on environment with id "${(_k = baseEyes.test.environment) === null || _k === void 0 ? void 0 : _k.environmentId}" failed due to an error`, error);
|
|
198
|
-
if (baseEyes.running && !(signal === null || signal === void 0 ? void 0 : signal.aborted))
|
|
199
|
-
await baseEyes.abort({ logger: environmentLogger, settings: { reason: error } });
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
catch (error) {
|
|
203
|
-
environmentLogger.error(`Environment with id ${environment.environmentId} failed before rendering started due to an error`, error);
|
|
204
|
-
error.info = { ...error.info, userTestId: eyes.test.userTestId, environment };
|
|
205
|
-
throw error;
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
uniqueEnvironments.forEach((environment, index) => {
|
|
209
|
-
const key = (0, to_environment_key_1.toEnvironmentKey)(environment);
|
|
210
|
-
let item = eyes.storage.get(key);
|
|
211
|
-
if (!item) {
|
|
212
|
-
item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
|
|
213
|
-
eyes.storage.set(key, item);
|
|
214
|
-
}
|
|
215
|
-
item.jobs.push(promises[index]);
|
|
93
|
+
accessibility: settings.accessibilitySettings
|
|
94
|
+
? { accountOptions: eyes.test.account.accessibilityOptions, runOptions: settings.accessibilityRunOptions }
|
|
95
|
+
: undefined,
|
|
96
|
+
signal,
|
|
97
|
+
logger: environmentLogger,
|
|
98
|
+
},
|
|
99
|
+
inputs: {
|
|
100
|
+
canFuse: true,
|
|
101
|
+
mutability,
|
|
102
|
+
signal,
|
|
103
|
+
onError: (error, baseEyes) => {
|
|
104
|
+
var _a;
|
|
105
|
+
environmentLogger.error(`Render on environment with id "${(_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId}" failed due to an error`, error);
|
|
106
|
+
error.info = { ...error.info, userTestId: eyes.test.userTestId, environment };
|
|
107
|
+
},
|
|
108
|
+
logger: environmentLogger,
|
|
109
|
+
},
|
|
110
|
+
});
|
|
216
111
|
});
|
|
217
112
|
};
|
|
218
113
|
}
|