@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.
Files changed (73) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/README.md +15 -20
  3. package/dist/automation/abort.js +8 -18
  4. package/dist/automation/close.js +8 -27
  5. package/dist/automation/get-results.js +3 -11
  6. package/dist/automation/utils/make-environment-loggers.js +39 -0
  7. package/dist/automation/utils/to-environment-key.js +6 -1
  8. package/dist/classic/check-and-close.js +26 -69
  9. package/dist/classic/check.js +85 -354
  10. package/dist/classic/get-base-eyes.js +15 -54
  11. package/dist/classic/open-eyes.js +17 -10
  12. package/dist/classic/utils/capture.js +209 -0
  13. package/dist/get-typed-eyes.js +2 -2
  14. package/dist/offline/run-offline-snapshots.js +3 -1
  15. package/dist/open-eyes.js +5 -1
  16. package/dist/tasks/abort.js +32 -0
  17. package/dist/tasks/aborted-check.js +14 -0
  18. package/dist/tasks/classic/capture.js +54 -0
  19. package/dist/tasks/classic/steps.js +51 -0
  20. package/dist/tasks/classic/upload.js +40 -0
  21. package/dist/tasks/close.js +31 -0
  22. package/dist/tasks/fill.js +13 -0
  23. package/dist/tasks/get-results.js +29 -0
  24. package/dist/tasks/graph.js +6 -0
  25. package/dist/tasks/index.js +20 -0
  26. package/dist/tasks/lifecycle.js +101 -0
  27. package/dist/tasks/match.js +109 -0
  28. package/dist/tasks/open.js +38 -0
  29. package/dist/tasks/queries.js +39 -0
  30. package/dist/tasks/types.js +2 -0
  31. package/dist/tasks/ufg/create-render-target.js +16 -0
  32. package/dist/tasks/ufg/recheck.js +49 -0
  33. package/dist/tasks/ufg/render.js +66 -0
  34. package/dist/tasks/ufg/steps.js +51 -0
  35. package/dist/tasks/upload-target.js +10 -0
  36. package/dist/ufg/check-and-close.js +32 -137
  37. package/dist/ufg/check.js +39 -175
  38. package/dist/ufg/get-base-eyes.js +34 -72
  39. package/dist/ufg/open-eyes.js +14 -8
  40. package/dist/utils/extract-git-info.js +9 -2
  41. package/package.json +20 -19
  42. package/types/automation/abort.d.ts +2 -3
  43. package/types/automation/close.d.ts +2 -3
  44. package/types/automation/types.d.ts +13 -16
  45. package/types/automation/utils/make-environment-loggers.d.ts +3 -0
  46. package/types/classic/get-base-eyes.d.ts +5 -9
  47. package/types/classic/open-eyes.d.ts +4 -3
  48. package/types/classic/types.d.ts +1 -1
  49. package/types/classic/utils/capture.d.ts +21 -0
  50. package/types/tasks/abort.d.ts +11 -0
  51. package/types/tasks/aborted-check.d.ts +9 -0
  52. package/types/tasks/classic/capture.d.ts +10 -0
  53. package/types/tasks/classic/steps.d.ts +17 -0
  54. package/types/tasks/classic/upload.d.ts +14 -0
  55. package/types/tasks/close.d.ts +9 -0
  56. package/types/tasks/fill.d.ts +8 -0
  57. package/types/tasks/get-results.d.ts +6 -0
  58. package/types/tasks/graph.d.ts +3 -0
  59. package/types/tasks/index.d.ts +3 -0
  60. package/types/tasks/lifecycle.d.ts +23 -0
  61. package/types/tasks/match.d.ts +13 -0
  62. package/types/tasks/open.d.ts +10 -0
  63. package/types/tasks/queries.d.ts +15 -0
  64. package/types/tasks/types.d.ts +187 -0
  65. package/types/tasks/ufg/create-render-target.d.ts +11 -0
  66. package/types/tasks/ufg/recheck.d.ts +20 -0
  67. package/types/tasks/ufg/render.d.ts +15 -0
  68. package/types/tasks/ufg/steps.d.ts +15 -0
  69. package/types/tasks/upload-target.d.ts +5 -0
  70. package/types/ufg/get-base-eyes.d.ts +5 -10
  71. package/types/ufg/open-eyes.d.ts +4 -3
  72. package/types/ufg/types.d.ts +1 -1
  73. package/types/utils/extract-git-info.d.ts +2 -1
@@ -1,15 +1,16 @@
1
- import type { DriverTarget, Core, Eyes, EyesStorage, OpenSettings } from './types';
1
+ import type { DriverTarget, Core, Eyes, OpenSettings } from './types';
2
2
  import { type Logger } from '@applitools/logger';
3
3
  import { type SpecType, type SpecDriver } from '@applitools/driver';
4
+ import { type Session } from '../tasks';
4
5
  type Options<TSpec extends SpecType> = {
5
6
  core: Core<TSpec>;
6
7
  spec?: SpecDriver<TSpec>;
7
8
  logger: Logger;
8
9
  };
9
- export declare function makeOpenEyes<TSpec extends SpecType>({ core, spec, logger: mainLogger }: Options<TSpec>): ({ target, settings, storage, logger, }: {
10
+ export declare function makeOpenEyes<TSpec extends SpecType>({ core, spec, logger: mainLogger }: Options<TSpec>): ({ target, settings, session, logger, }: {
10
11
  target?: DriverTarget<TSpec> | undefined;
11
12
  settings: OpenSettings;
12
- storage?: EyesStorage | undefined;
13
+ session?: object | undefined;
13
14
  logger?: Logger | undefined;
14
15
  }) => Promise<Eyes<TSpec>>;
15
16
  export {};
@@ -7,7 +7,7 @@ export interface Core<TSpec extends SpecType> extends AutomationCore.Core<TSpec>
7
7
  openEyes(options: {
8
8
  target?: AutomationCore.DriverTarget<TSpec>;
9
9
  settings: OpenSettings;
10
- storage?: AutomationCore.EyesStorage;
10
+ session?: AutomationCore.Session;
11
11
  logger?: Logger;
12
12
  }): Promise<Eyes<TSpec>>;
13
13
  }
@@ -0,0 +1,21 @@
1
+ import type { CheckSettings, Eyes, Environment, ExactEnvironment } from '../types';
2
+ import type { Target as BaseTarget, CheckSettings as BaseCheckSettings } from '@applitools/core-base';
3
+ import { type Logger } from '@applitools/logger';
4
+ import type { SpecType, Driver } from '@applitools/driver';
5
+ export type Captured = {
6
+ baseTarget: BaseTarget;
7
+ baseSetting: BaseCheckSettings;
8
+ exactEnvironment: ExactEnvironment;
9
+ };
10
+ type DriverEnvironment = Awaited<ReturnType<Driver<SpecType>['getEnvironment']>>;
11
+ /** Whether the capture keeps `environment` as its exact environment, at the same index. */
12
+ export declare function isCapturedAsRequested(settings: CheckSettings<SpecType>, driverEnvironment: DriverEnvironment, environment: Environment): boolean;
13
+ /**
14
+ * create base targets (array of screenshots) and base settings (array of check settings) for each environment
15
+ */
16
+ export declare function generateBaseScreenshotsAndSettings<TSpec extends SpecType>(settings: CheckSettings<TSpec>, uniqueEnvironments: Environment[], eyes: Eyes<TSpec>, logger: Logger, driver: Driver<TSpec>): Promise<{
17
+ baseTarget: BaseTarget;
18
+ baseSetting: BaseCheckSettings;
19
+ exactEnvironment: ExactEnvironment;
20
+ }[]>;
21
+ export {};
@@ -0,0 +1,11 @@
1
+ import type { AbortInputs, Labels, Graph } from './types';
2
+ /**
3
+ * Aborts the environment's session as soon as it is open, without waiting for its steps (they read the
4
+ * abort signal), unless an abort is already queued. A pending close or matchAndEnd still gets it; core-base ends a
5
+ * session only once. Kind `dismiss`: if the open is still lazy (nothing needed it), it's discarded and no session
6
+ * opens.
7
+ */
8
+ export declare function add(graph: Graph, { inputs, labels }: {
9
+ inputs: AbortInputs;
10
+ labels: Labels;
11
+ }): import("@applitools/task-manager").Task<void, AbortInputs, Labels>;
@@ -0,0 +1,9 @@
1
+ import type { Labels, Graph, AbortedCheckInputs } from './types';
2
+ /**
3
+ * A check the test was aborted during, before it added its steps: it fails with the abort and is kept by its
4
+ * session, so the environment's getResults rejects with it.
5
+ */
6
+ export declare function add(graph: Graph, { inputs, labels }: {
7
+ inputs: AbortedCheckInputs;
8
+ labels: Labels;
9
+ }): import("@applitools/task-manager").Task<never, AbortedCheckInputs, Labels>;
@@ -0,0 +1,10 @@
1
+ import { type Captured } from '../../classic/utils/capture';
2
+ import type { Labels, Graph, CaptureInputs } from '../types';
3
+ /**
4
+ * A classic check's capture of every environment in one pass — they share the driver, whose viewport
5
+ * it resizes per environment. The check awaits it, so the page stays untouched until it's done.
6
+ */
7
+ export declare function add(graph: Graph, { inputs, labels }: {
8
+ inputs: CaptureInputs;
9
+ labels: Labels;
10
+ }): import("@applitools/task-manager").Task<Captured[], CaptureInputs, Labels>;
@@ -0,0 +1,17 @@
1
+ import type { Captured } from '../../classic/utils/capture';
2
+ import type { Session, OpenInputs, CaptureInputs, UploadInputs, MatchInputs, CloseInputs, GraphTask } from '../types';
3
+ /** A classic step uploads its target, read by index from the check's capture. */
4
+ export type Step = {
5
+ open: OpenInputs;
6
+ upload: UploadInputs;
7
+ capture?: GraphTask<Captured[]>;
8
+ inputs: MatchInputs;
9
+ };
10
+ /** A check step: its upload, then its match after the environment's previous one. */
11
+ export declare function addCheck(session: Session, env: string, step: Step): import("@applitools/task-manager").Task<import("../types").MatchResult, MatchInputs, import("../types").Labels>;
12
+ /** A check step and the close it fuses into: one `matchAndEnd`. */
13
+ export declare function addCheckAndClose(session: Session, env: string, { settings, ...step }: Step & {
14
+ settings?: CloseInputs['settings'];
15
+ }): void;
16
+ /** A classic check's capture; its steps read their targets from it by index. */
17
+ export declare function addCapture(session: Session, inputs: CaptureInputs): import("@applitools/task-manager").Task<Captured[], CaptureInputs, import("../types").Labels>;
@@ -0,0 +1,14 @@
1
+ import type { Eyes as BaseEyes } from '@applitools/core-base';
2
+ import type { Captured } from '../../classic/utils/capture';
3
+ import type { MatchTarget, Labels, Graph, UploadInputs, GraphTask } from '../types';
4
+ type UploadDeps = {
5
+ open: GraphTask<BaseEyes>;
6
+ capture?: GraphTask<Captured[]>;
7
+ };
8
+ /** The slow leg of a classic check step: normalize the captured target and upload its resources. */
9
+ export declare function add(graph: Graph, { deps, inputs, labels }: {
10
+ deps: Omit<UploadDeps, 'open'>;
11
+ inputs: UploadInputs;
12
+ labels: Labels;
13
+ }): import("@applitools/task-manager").Task<MatchTarget | undefined, UploadInputs, Labels>;
14
+ export {};
@@ -0,0 +1,9 @@
1
+ import type { CloseInputs, Labels, Graph } from './types';
2
+ /**
3
+ * The environment's terminal close, unless a close, abort or fused match already ends it. Kind `dismiss`: if the
4
+ * open is still lazy (nothing needed it), it's discarded and no session opens.
5
+ */
6
+ export declare function add(graph: Graph, { inputs, labels }: {
7
+ inputs: CloseInputs;
8
+ labels: Labels;
9
+ }): import("@applitools/task-manager").Task<void | import("./types").MatchResult, import("./types").MatchAndEndInputs | CloseInputs | import("./types").AbortInputs, Labels>;
@@ -0,0 +1,8 @@
1
+ import type { Labels, Graph } from './types';
2
+ /**
3
+ * An empty test's environment that still gets a session: as a normal dependent, it activates the lazy open, so
4
+ * the close or abort resting on it can't dismiss it.
5
+ */
6
+ export declare function add(graph: Graph, { labels }: {
7
+ labels: Labels;
8
+ }): import("@applitools/task-manager").Task<void, undefined, Labels>;
@@ -0,0 +1,6 @@
1
+ import type { Labels, Graph, GetResultsInputs } from './types';
2
+ /** The environment's result, once everything else in it has settled. */
3
+ export declare function add(graph: Graph, { inputs, labels }: {
4
+ inputs: GetResultsInputs;
5
+ labels: Labels;
6
+ }): import("@applitools/task-manager").Task<import("./types").EnvironmentResult, GetResultsInputs, Labels>;
@@ -0,0 +1,3 @@
1
+ import type { Graph } from './types';
2
+ /** Core's one task graph — every test is a disjoint tree in it. */
3
+ export declare const graph: Graph;
@@ -0,0 +1,3 @@
1
+ export * from './lifecycle';
2
+ export { activeEnvironmentKeys } from './queries';
3
+ export type { Session, MatchInputs, GraphTask } from './types';
@@ -0,0 +1,23 @@
1
+ import type { Logger } from '@applitools/logger';
2
+ import type { Session, OpenInputs, CloseInputs, AbortInputs, GetResultsInputs, EnvironmentResult } from './types';
3
+ /**
4
+ * Declares the opens of the environments known at openEyes, lazy: the first check needing one opens it,
5
+ * and a close that finds it still unneeded dismisses it, so no empty session is created.
6
+ */
7
+ export declare function declareOpens(eyes: OpenInputs['eyes'], environments: OpenInputs['environment'][], driver: OpenInputs['driver'], logger: Logger): void;
8
+ /**
9
+ * Fills an empty test's environments, so it still has a session per environment: the ones its close names
10
+ * (declared here), or else a classic test's declared ones. An empty ufg test that names none opens nothing.
11
+ * Returns the filled environments' opens.
12
+ */
13
+ export declare function declareFillers(eyes: OpenInputs['eyes'], environments: OpenInputs['environment'][] | undefined, logger: Logger): import("@applitools/task-manager").Task<import("@applitools/core-base").Eyes, OpenInputs, import("./types").Labels>[];
14
+ /** Closes every environment of the session; a still-unstarted last match fuses into its close. */
15
+ export declare function closeSession(session: Session, inputs: CloseInputs): void;
16
+ /** Aborts every environment of the session as soon as it is open, without waiting for its steps. */
17
+ export declare function abortSession(session: Session, inputs: AbortInputs): void;
18
+ /** Closes the environment after its last step. */
19
+ export declare function addClose(session: Session, env: string, inputs: CloseInputs): void;
20
+ /** The environment's result, after every unfinished task of it — its last match, close or abort. */
21
+ export declare function getResults(session: Session, env: string, inputs: GetResultsInputs): Promise<EnvironmentResult>;
22
+ /** Records a check the test was aborted during, before it added its steps (see `aborted-check.ts`). */
23
+ export declare function addAbortedCheck(eyes: OpenInputs['eyes'], environments: OpenInputs['environment'][], message: string, logger: Logger): void;
@@ -0,0 +1,13 @@
1
+ import type { Eyes as BaseEyes } from '@applitools/core-base';
2
+ import type { MatchTarget, MatchResult, MatchInputs, Labels, Graph, GraphTask } from './types';
3
+ type MatchDeps = {
4
+ open: GraphTask<BaseEyes>;
5
+ upload: GraphTask<MatchTarget | undefined>;
6
+ };
7
+ /** A check step. While still unstarted, it fuses with a `close` added after it into one `matchAndEnd`. */
8
+ export declare function add(graph: Graph, { deps, inputs, labels }: {
9
+ deps: Omit<MatchDeps, 'open'>;
10
+ inputs: MatchInputs;
11
+ labels: Labels;
12
+ }): import("@applitools/task-manager").Task<MatchResult, MatchInputs, Labels>;
13
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { Eyes as BaseEyes } from '@applitools/core-base';
2
+ import type { OpenInputs, Labels, Graph } from './types';
3
+ /**
4
+ * An environment's base-session open — the root of its chain, one per environment: the environment's existing
5
+ * open, or a new one. Lazy until a dependent needs it.
6
+ */
7
+ export declare function add(graph: Graph, { inputs, labels }: {
8
+ inputs: OpenInputs;
9
+ labels: Labels;
10
+ }): import("@applitools/task-manager").Task<BaseEyes, OpenInputs, Labels>;
@@ -0,0 +1,15 @@
1
+ import type { Session, Labels, TaskType, Result, Inputs } from './types';
2
+ export declare function queryTasks<K extends TaskType>({ session, type, env }: {
3
+ session: Session;
4
+ type: K;
5
+ env?: string;
6
+ }): import("@applitools/task-manager").Task<Result<K>, Inputs<K>, Labels>[];
7
+ /** The environment's newest open — every task of the environment rests on it. */
8
+ export declare function environmentOpen({ session, env }: Labels): import("@applitools/task-manager").Task<import("@applitools/core-base").Eyes, import("./types").OpenInputs, Labels>;
9
+ /** The environment's newest unfinished step — its match, or the recheck after it. */
10
+ export declare function lastStep(session: Session, env: string): import("@applitools/task-manager").Task<import("./types").MatchResult, import("./types").MatchInputs, Labels> | import("@applitools/task-manager").Task<void, import("./types").RecheckInputs, Labels> | undefined;
11
+ export declare function environmentKeys(session: Session): string[];
12
+ /** The environment keys whose open was demanded, not just speculatively pre-created. */
13
+ export declare function openedEnvironmentKeys(session: Session): string[];
14
+ /** The environments getResults reports: the opened ones, and those of a check the test was aborted during. */
15
+ export declare function activeEnvironmentKeys(session: Session): string[];
@@ -0,0 +1,187 @@
1
+ import type { Eyes as BaseEyes, Target, CheckSettings, CloseSettings, AbortSettings, GetResultsSettings, TestResult } from '@applitools/core-base';
2
+ import type { Snapshot } from '../ufg/types';
3
+ import type { Eyes, Environment } from '../automation/types';
4
+ import type { Eyes as ClassicEyes, CheckSettings as ClassicCheckSettings } from '../classic/types';
5
+ import type { Captured } from '../classic/utils/capture';
6
+ import type { Driver } from '@applitools/driver';
7
+ import type { UFGClient, RenderTarget, Environment as UFGEnvironment } from '@applitools/ufg-client';
8
+ import type { Logger } from '@applitools/logger';
9
+ import type { Task, TaskManager, TaskSpec, Deps } from '@applitools/task-manager';
10
+ import type { AbortSignal } from 'abort-controller';
11
+ import type { buildAccessibilityReportOptions } from '../ufg/build-accessibility-report-options';
12
+ /** A test's identity in the graph: its tasks carry it in their labels, and it keeps their opens queryable. */
13
+ export type Session = object;
14
+ /** Where a task belongs: its test and environment. */
15
+ export type Labels = {
16
+ session: Session;
17
+ env: string;
18
+ };
19
+ export type MatchTarget = {
20
+ target: Target;
21
+ settings: CheckSettings;
22
+ };
23
+ export type MatchResult = {
24
+ asExpected: boolean;
25
+ };
26
+ export type EnvironmentResult = TestResult & {
27
+ environment: BaseEyes['test']['environment'];
28
+ };
29
+ /** An environment's open. `eyes.type` picks the opener. */
30
+ export type OpenInputs = {
31
+ eyes: Eyes<any>;
32
+ environment: Environment;
33
+ driver?: Driver<any>;
34
+ logger: Logger;
35
+ };
36
+ /** A classic check's capture of every environment. */
37
+ export type CaptureInputs = {
38
+ eyes: ClassicEyes<any>;
39
+ driver: Driver<any>;
40
+ settings: ClassicCheckSettings<any>;
41
+ environments: Environment[];
42
+ /** A `matchTimeout` check's first capture: it waits for the opens (`deps`), and this long more on a new test. */
43
+ newTestDelay?: number;
44
+ logger: Logger;
45
+ };
46
+ /** A classic step's target: captured already, or its `index` in the check's still-running capture. */
47
+ export type UploadInputs = (MatchTarget | {
48
+ index: number;
49
+ }) & {
50
+ signal?: AbortSignal;
51
+ logger: Logger;
52
+ };
53
+ export type CreateRenderTargetInputs = {
54
+ ufgClient: UFGClient;
55
+ snapshot: Snapshot;
56
+ logger: Logger;
57
+ };
58
+ export type RenderInputs = {
59
+ ufgClient: UFGClient;
60
+ snapshot: Snapshot;
61
+ environment: UFGEnvironment;
62
+ /** Set only when the check configures an accessibility standard; each render then mints its own report URL. */
63
+ accessibility?: Parameters<typeof buildAccessibilityReportOptions>[0];
64
+ signal?: AbortSignal;
65
+ logger: Logger;
66
+ };
67
+ export type MatchInputs = {
68
+ canFuse: boolean;
69
+ /** Set when the check's target assumes mutability: the step logs that. */
70
+ mutability?: {
71
+ eyes: Eyes<any>;
72
+ checkName?: string;
73
+ };
74
+ signal?: AbortSignal;
75
+ onError?: (error: any, baseEyes: BaseEyes) => void;
76
+ logger: Logger;
77
+ };
78
+ export type RecheckInputs = {
79
+ /** The step's render, retargeted at the previous browser version. */
80
+ render: RenderInputs;
81
+ /** Sessions whose backend stopped expecting old-infra retries. */
82
+ disabled: WeakSet<BaseEyes>;
83
+ logger: Logger;
84
+ };
85
+ export type MatchAndEndInputs = {
86
+ match: MatchInputs;
87
+ settings?: CloseSettings;
88
+ };
89
+ export type CloseInputs = {
90
+ settings?: CloseSettings;
91
+ logger: Logger;
92
+ };
93
+ export type AbortInputs = {
94
+ settings?: AbortSettings;
95
+ logger: Logger;
96
+ };
97
+ export type GetResultsInputs = {
98
+ settings?: GetResultsSettings;
99
+ logger: Logger;
100
+ };
101
+ export type AbortedCheckInputs = {
102
+ error: Error;
103
+ };
104
+ /** Each core task type's result and inputs. */
105
+ interface TaskContracts {
106
+ open: {
107
+ result: BaseEyes;
108
+ inputs: OpenInputs;
109
+ };
110
+ capture: {
111
+ result: Captured[];
112
+ inputs: CaptureInputs;
113
+ };
114
+ upload: {
115
+ result: MatchTarget | undefined;
116
+ inputs: UploadInputs;
117
+ };
118
+ createRenderTarget: {
119
+ result: RenderTarget;
120
+ inputs: CreateRenderTargetInputs;
121
+ };
122
+ render: {
123
+ result: MatchTarget;
124
+ inputs: RenderInputs;
125
+ };
126
+ match: {
127
+ result: MatchResult;
128
+ inputs: MatchInputs;
129
+ };
130
+ matchAndEnd: {
131
+ result: MatchResult;
132
+ inputs: MatchAndEndInputs;
133
+ };
134
+ recheck: {
135
+ result: void;
136
+ inputs: RecheckInputs;
137
+ };
138
+ fill: {
139
+ result: void;
140
+ inputs: undefined;
141
+ };
142
+ close: {
143
+ result: void;
144
+ inputs: CloseInputs;
145
+ };
146
+ abort: {
147
+ result: void;
148
+ inputs: AbortInputs;
149
+ };
150
+ getResults: {
151
+ result: EnvironmentResult;
152
+ inputs: GetResultsInputs;
153
+ };
154
+ abortedCheck: {
155
+ result: never;
156
+ inputs: AbortedCheckInputs;
157
+ };
158
+ }
159
+ export type TaskType = keyof TaskContracts;
160
+ export type Result<K extends TaskType> = TaskContracts[K]['result'];
161
+ export type Inputs<K extends TaskType> = TaskContracts[K]['inputs'];
162
+ /** A task of core's graph, by its result. */
163
+ export type GraphTask<TResult = unknown> = Task<TResult, unknown, Labels>;
164
+ /** Any core task, discriminated by `type`. */
165
+ type CoreTask = {
166
+ [K in TaskType]: Task<Result<K>, Inputs<K>, Labels> & {
167
+ readonly type: K;
168
+ };
169
+ }[TaskType];
170
+ /** A collapse replacement for a `K` task: a task of a type whose result the fused originals settle with. */
171
+ type Replacement<K extends TaskType, TDeps extends Deps<Labels>> = {
172
+ [R in TaskType]: Result<R> extends Result<K> ? Omit<TaskSpec<Result<R>, Inputs<R>, Labels, TDeps>, 'deps' | 'after'> & {
173
+ type: R;
174
+ } : never;
175
+ }[TaskType];
176
+ /**
177
+ * Core's graph. `add` holds every task, and every collapse replacement, to its type's contract, so a query by type
178
+ * can rely on it, and a `collapse` can tell its successor apart by type.
179
+ */
180
+ export interface Graph {
181
+ add<K extends TaskType, TDeps extends Deps<Labels> = Deps<Labels>>(spec: Omit<TaskSpec<Result<K>, Inputs<K>, Labels, TDeps>, 'collapse'> & {
182
+ type: K;
183
+ collapse?(successor: CoreTask): Replacement<K, TDeps> | undefined;
184
+ }): Task<Result<K>, Inputs<K>, Labels>;
185
+ filter: TaskManager<Labels>['filter'];
186
+ }
187
+ export {};
@@ -0,0 +1,11 @@
1
+ import type { RenderTarget } from '@applitools/ufg-client';
2
+ import type { Labels, Graph, CreateRenderTargetInputs } from '../types';
3
+ /**
4
+ * Processes a ufg snapshot's resources as soon as the check is called, before its session opens: it fills the
5
+ * UFG client's resource cache, which the next snapshot reads as its skip-list, so an already-fetched (e.g.
6
+ * ephemeral) resource is not re-requested and the renders stay identical.
7
+ */
8
+ export declare function add(graph: Graph, { inputs, labels }: {
9
+ inputs: CreateRenderTargetInputs;
10
+ labels: Labels;
11
+ }): import("@applitools/task-manager").Task<RenderTarget, CreateRenderTargetInputs, Labels>;
@@ -0,0 +1,20 @@
1
+ import type { Eyes as BaseEyes } from '@applitools/core-base';
2
+ import type { RenderTarget } from '@applitools/ufg-client';
3
+ import type { MatchResult, Labels, Graph, RecheckInputs, GraphTask } from '../types';
4
+ type RecheckDeps = {
5
+ open: GraphTask<BaseEyes>;
6
+ match: GraphTask<MatchResult>;
7
+ renderTarget: GraphTask<RenderTarget>;
8
+ };
9
+ /**
10
+ * The old-infra retry of a ufg check step: when the backend asks for it, re-checks a mismatch against the
11
+ * previous browser version before the next step, and stops once a retry fails (the backend then stops
12
+ * expecting retries). Best-effort: a failed retry must not abort the environment — the primary match
13
+ * already recorded its step.
14
+ */
15
+ export declare function add(graph: Graph, { deps, inputs, labels }: {
16
+ deps: Omit<RecheckDeps, 'open'>;
17
+ inputs: RecheckInputs;
18
+ labels: Labels;
19
+ }): import("@applitools/task-manager").Task<void, RecheckInputs, Labels>;
20
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { Eyes as BaseEyes } from '@applitools/core-base';
2
+ import type { RenderTarget } from '@applitools/ufg-client';
3
+ import type { MatchTarget, Labels, Graph, RenderInputs, GraphTask } from '../types';
4
+ type RenderDeps = {
5
+ open: GraphTask<BaseEyes>;
6
+ renderTarget: GraphTask<RenderTarget>;
7
+ };
8
+ /** The slow leg of a ufg check step: render the snapshot, then normalize and upload the result. */
9
+ export declare function add(graph: Graph, { deps, inputs, labels }: {
10
+ deps: Omit<RenderDeps, 'open'>;
11
+ inputs: RenderInputs;
12
+ labels: Labels;
13
+ }): import("@applitools/task-manager").Task<MatchTarget, RenderInputs, Labels>;
14
+ export declare function render(baseEyes: BaseEyes, renderTarget: RenderTarget, { ufgClient, snapshot, environment, accessibility, signal, logger }: RenderInputs): Promise<MatchTarget>;
15
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { Session, OpenInputs, CreateRenderTargetInputs, RenderInputs, RecheckInputs, MatchInputs, CloseInputs } from '../types';
2
+ /** A ufg step renders its snapshot, and may recheck its match. */
3
+ export type Step = {
4
+ open: OpenInputs;
5
+ renderTarget: CreateRenderTargetInputs;
6
+ render: RenderInputs;
7
+ recheck?: RecheckInputs;
8
+ inputs: MatchInputs;
9
+ };
10
+ /** A check step: its render, then its match after the environment's previous one, then its old-infra recheck. */
11
+ export declare function addCheck(session: Session, env: string, step: Step): import("@applitools/task-manager").Task<import("../types").MatchResult, MatchInputs, import("../types").Labels>;
12
+ /** A check step and the close it fuses into: one `matchAndEnd`. */
13
+ export declare function addCheckAndClose(session: Session, env: string, { settings, ...step }: Step & {
14
+ settings?: CloseInputs['settings'];
15
+ }): void;
@@ -0,0 +1,5 @@
1
+ import { type Eyes as BaseEyes } from '@applitools/core-base';
2
+ import type { Logger } from '@applitools/logger';
3
+ import type { MatchTarget } from './types';
4
+ /** Normalizes a step's target and uploads its resources — the tail shared by `upload` and `render`. */
5
+ export declare function uploadTarget(baseEyes: BaseEyes, step: MatchTarget, logger: Logger): Promise<MatchTarget>;
@@ -1,15 +1,10 @@
1
- import type { Eyes, GetBaseEyesSettings, OpenSettings } from './types';
1
+ import type { Eyes } from './types';
2
2
  import type { Eyes as BaseEyes } from '@applitools/core-base';
3
3
  import { type SpecType } from '@applitools/driver';
4
4
  import { type Logger } from '@applitools/logger';
5
- type Options<TSpec extends SpecType> = {
6
- settings: OpenSettings;
5
+ import type { OpenInputs } from '../tasks/types';
6
+ export declare function getBaseEyes<TSpec extends SpecType>({ eyes, settings, logger, }: {
7
7
  eyes: Eyes<TSpec>;
8
- base?: BaseEyes[];
8
+ settings: Pick<OpenInputs, 'environment' | 'driver'>;
9
9
  logger: Logger;
10
- };
11
- export declare function makeGetBaseEyes<TSpec extends SpecType>({ settings: defaultSettings, eyes, logger: mainLogger, }: Options<TSpec>): ({ settings, logger, }: {
12
- settings: GetBaseEyesSettings<TSpec>;
13
- logger?: Logger | undefined;
14
- }) => Promise<BaseEyes>;
15
- export {};
10
+ }): Promise<BaseEyes>;
@@ -1,15 +1,16 @@
1
- import type { DriverTarget, Core, Eyes, EyesStorage, OpenSettings } from './types';
1
+ import type { DriverTarget, Core, Eyes, OpenSettings } from './types';
2
2
  import { type Logger } from '@applitools/logger';
3
3
  import { type SpecType, type SpecDriver } from '@applitools/driver';
4
+ import { type Session } from '../tasks';
4
5
  type Options<TSpec extends SpecType> = {
5
6
  core: Core<TSpec>;
6
7
  spec?: SpecDriver<TSpec>;
7
8
  logger: Logger;
8
9
  };
9
- export declare function makeOpenEyes<TSpec extends SpecType>({ core, spec, logger: mainLogger }: Options<TSpec>): ({ target, settings, storage, logger, }: {
10
+ export declare function makeOpenEyes<TSpec extends SpecType>({ core, spec, logger: mainLogger }: Options<TSpec>): ({ target, settings, session, logger, }: {
10
11
  target?: DriverTarget<TSpec> | undefined;
11
12
  settings: OpenSettings;
12
- storage?: EyesStorage | undefined;
13
+ session?: object | undefined;
13
14
  logger?: Logger | undefined;
14
15
  }) => Promise<Eyes<TSpec>>;
15
16
  export {};
@@ -32,7 +32,7 @@ export interface Core<TSpec extends SpecType> extends AutomationCore.Core<TSpec>
32
32
  openEyes(options: {
33
33
  target?: AutomationCore.DriverTarget<TSpec>;
34
34
  settings: AutomationCore.OpenSettings;
35
- storage?: AutomationCore.EyesStorage;
35
+ session?: AutomationCore.Session;
36
36
  logger?: Logger;
37
37
  }): Promise<Eyes<TSpec>>;
38
38
  }
@@ -16,6 +16,7 @@ type ExtractGitBranchingTimestampOptions = {
16
16
  type ExtractCurrentCommitTimestampOptions = {
17
17
  execOptions?: ExecOptions;
18
18
  logger?: Logger;
19
+ ignoreGitBranching?: boolean;
19
20
  };
20
21
  export declare const cacheKey = "default";
21
22
  /** Primary remote name (cached). Prefers `origin`, else the first remote. */
@@ -114,7 +115,7 @@ export declare const extractDefaultBranch: (({ execOptions, logger }: {
114
115
  clearCache(): void;
115
116
  TTL?: number | undefined;
116
117
  };
117
- export declare const extractLatestCommitInfo: (({ execOptions, logger, }: ExtractCurrentCommitTimestampOptions) => Promise<{
118
+ export declare const extractLatestCommitInfo: (({ execOptions, logger, ignoreGitBranching, }: ExtractCurrentCommitTimestampOptions) => Promise<{
118
119
  timestamp: string;
119
120
  sha: string;
120
121
  } | undefined>) & {