vitest-plugin-vis 4.0.0 → 4.1.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 (93) hide show
  1. package/dist/{augment-BJmy1S7i.d.mts → augment-C1tjdh5B.d.mts} +5 -3
  2. package/dist/augment-C1tjdh5B.d.mts.map +1 -0
  3. package/dist/{task_id-DnS9_4Ub.mjs → auto_snapshot_matcher-C0y6mAeS.mjs} +172 -107
  4. package/dist/auto_snapshot_matcher-C0y6mAeS.mjs.map +1 -0
  5. package/dist/{auto_snapshot_options-CaQCXDdi.d.mts → auto_snapshot_options-BMRtKmod.d.mts} +3 -3
  6. package/dist/auto_snapshot_options-BMRtKmod.d.mts.map +1 -0
  7. package/dist/{auto_snapshot_options-CAD43Zkp.mjs → auto_snapshot_options-DUOTpF2N.mjs} +5 -7
  8. package/dist/auto_snapshot_options-DUOTpF2N.mjs.map +1 -0
  9. package/dist/client-api.d.mts +13 -110
  10. package/dist/client-api.d.mts.map +1 -1
  11. package/dist/client-api.mjs +3 -3
  12. package/dist/client-api.mjs.map +1 -1
  13. package/dist/commands.types-BVhcnnHw.d.mts +51 -0
  14. package/dist/commands.types-BVhcnnHw.d.mts.map +1 -0
  15. package/dist/config.d.mts +3 -3
  16. package/dist/config.mjs.map +1 -1
  17. package/dist/index.d.mts +5 -5
  18. package/dist/index.mjs +1 -1
  19. package/dist/presets/auto.mjs +3 -3
  20. package/dist/presets/enable.mjs +3 -3
  21. package/dist/presets/manual.mjs +3 -3
  22. package/dist/server-utils.d.mts +4 -4
  23. package/dist/setup-DCytWz48.mjs +124 -0
  24. package/dist/setup-DCytWz48.mjs.map +1 -0
  25. package/dist/setup.d.mts +8 -12
  26. package/dist/setup.d.mts.map +1 -1
  27. package/dist/setup.mjs +3 -3
  28. package/dist/{to_match_image_snapshot.types-p-zilA_M.d.mts → to_match_image_snapshot.types--tTmHoRA.d.mts} +2 -2
  29. package/dist/{to_match_image_snapshot.types-p-zilA_M.d.mts.map → to_match_image_snapshot.types--tTmHoRA.d.mts.map} +1 -1
  30. package/dist/{trim_common_folder-ModiubEJ.d.mts → trim_common_folder-DBThLerp.d.mts} +1 -1
  31. package/dist/trim_common_folder-DBThLerp.d.mts.map +1 -0
  32. package/dist/{types-DFb23VE1.d.mts → types-CEmjj-A9.d.mts} +37 -3
  33. package/dist/types-CEmjj-A9.d.mts.map +1 -0
  34. package/dist/{types-Do1N7g4c.d.mts → types-DJYCbyT8.d.mts} +2 -2
  35. package/dist/{types-Do1N7g4c.d.mts.map → types-DJYCbyT8.d.mts.map} +1 -1
  36. package/package.json +5 -5
  37. package/src/client/actions/has_image_snapshot_action.ts +1 -1
  38. package/src/client/actions/load_image_snapshot_results_action.ts +1 -1
  39. package/src/client/actions/match_image_snapshot_action.ts +6 -4
  40. package/src/client/actions/match_page_image_snapshot_action.ts +5 -3
  41. package/src/client/expect/_ctx.ts +10 -0
  42. package/src/client/expect/to_match_image_snapshot.ts +3 -4
  43. package/src/client/external/browser/has_render_content.ts +3 -0
  44. package/src/client/{image_resizer.ts → external/browser/image_resizer.ts} +1 -1
  45. package/src/client/{vitest_suite_proxy.ts → external/vitest/vitest_suite_proxy.ts} +1 -1
  46. package/src/client/{align_images.ts → image/align_images.ts} +3 -3
  47. package/src/client/page/_ctx.ts +12 -0
  48. package/src/client/page/has_image_snapshot.ts +4 -4
  49. package/src/client/page/to_match_image_snapshot.ts +3 -4
  50. package/src/client/{compare_image_snapshot.logic.ts → snapshot/compare_image_snapshot.logic.ts} +1 -1
  51. package/src/client/{compare_image_snapshot.ts → snapshot/compare_image_snapshot.ts} +8 -9
  52. package/src/client/snapshot/should_take_snapshot.ts +6 -0
  53. package/src/client/suite/_ctx.ts +8 -0
  54. package/src/client/suite/auto_snapshot_matcher.ts +68 -0
  55. package/src/client/{ctx.ts → task/_ctx.ts} +1 -3
  56. package/src/client/{auto_snapshot_options.ts → task/auto_snapshot_options.ts} +4 -4
  57. package/src/client/{snapshot_meta.ts → task/snapshot_meta.ts} +1 -1
  58. package/src/client-api.ts +3 -2
  59. package/src/index.ts +1 -1
  60. package/src/server/commands/augment.ts +8 -6
  61. package/src/server/commands/has_image_snapshot.ts +1 -4
  62. package/src/server/commands/image_snapshot_next_index.ts +1 -7
  63. package/src/server/commands/load_image_snapshot_results.ts +1 -20
  64. package/src/server/commands/prepare_image_snapshot_comparison.ts +2 -48
  65. package/src/server/commands/prepare_page_image_snapshot_comparison.ts +1 -43
  66. package/src/server/commands/setup_vis_suite.ts +0 -24
  67. package/src/server/vis_server_context.logic.ts +1 -1
  68. package/src/{client/setup → setup}/create_vis.ts +22 -79
  69. package/src/setup/readme.md +5 -0
  70. package/src/setup.ts +2 -2
  71. package/src/shared/commands.types.ts +71 -0
  72. package/src/shared/types.ts +53 -1
  73. package/dist/augment-BJmy1S7i.d.mts.map +0 -1
  74. package/dist/auto_snapshot_options-CAD43Zkp.mjs.map +0 -1
  75. package/dist/auto_snapshot_options-CaQCXDdi.d.mts.map +0 -1
  76. package/dist/setup-BWgIDtv-.mjs +0 -141
  77. package/dist/setup-BWgIDtv-.mjs.map +0 -1
  78. package/dist/setup_vis_suite-C6JGGT7B.d.mts +0 -17
  79. package/dist/setup_vis_suite-C6JGGT7B.d.mts.map +0 -1
  80. package/dist/task_id-DnS9_4Ub.mjs.map +0 -1
  81. package/dist/trim_common_folder-ModiubEJ.d.mts.map +0 -1
  82. package/dist/types-DFb23VE1.d.mts.map +0 -1
  83. package/dist/vis_server_context.types-Ce1f9vOO.d.mts +0 -1
  84. package/src/client/image_snapshot_options.ts +0 -6
  85. package/src/client/setup/vis.ctx.ts +0 -34
  86. package/src/client/should_take_snapshot.ts +0 -5
  87. package/src/server/commands/types.ts +0 -9
  88. /package/src/client/{image_data.ts → external/browser/image_data.ts} +0 -0
  89. /package/src/client/{selector.ts → external/browser/selector.ts} +0 -0
  90. /package/src/client/{vitest_browser_context_proxy.ts → external/vitest/vitest_browser_context_proxy.ts} +0 -0
  91. /package/src/client/{auto_snapshot_options.mdx → task/auto_snapshot_options.mdx} +0 -0
  92. /package/src/client/{task_id.ts → task/task_id.ts} +0 -0
  93. /package/src/{client/setup → setup}/vis.ts +0 -0
@@ -1,6 +1,8 @@
1
- import { a as ImageSnapshotKeyOptions, h as ToMatchPageImageSnapshotOptions, n as ComparisonMethod } from "./types-DFb23VE1.mjs";
2
- import { t as ImageSnapshotMatcher } from "./to_match_image_snapshot.types-p-zilA_M.mjs";
1
+ import { n as ComparisonMethod, o as ImageSnapshotKeyOptions, v as ToMatchPageImageSnapshotOptions } from "./types-CEmjj-A9.mjs";
2
+ import { t as ImageSnapshotMatcher } from "./to_match_image_snapshot.types--tTmHoRA.mjs";
3
+ import "vitest";
3
4
  import { BrowserPage } from "vitest/browser";
5
+ import "vitest/suite";
4
6
 
5
7
  //#region src/client/expect/augment.d.ts
6
8
  declare global {
@@ -28,4 +30,4 @@ declare module '@vitest/browser/context' {
28
30
  interface BrowserPage extends HasImageSnapshotAction, ToMatchImageSnapshotAction {}
29
31
  }
30
32
  //# sourceMappingURL=augment.d.ts.map
31
- //# sourceMappingURL=augment-BJmy1S7i.d.mts.map
33
+ //# sourceMappingURL=augment-C1tjdh5B.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"augment-C1tjdh5B.d.mts","names":[],"sources":["../src/client/expect/augment.ts","../src/client/page/has_image_snapshot.ts","../src/client/page/to_match_image_snapshot.ts","../src/client/page/augment.ts"],"sourcesContent":[],"mappings":";;;;;;;;;qCAKmC;;;AAL2C;;;UCM7D,sBAAA;;;;yBAIO,uBAAuB,sCAAsC;ADVP;;;UEK7D,0BAAA;iCACe,sCACpB,gCAAgC,iBACxC;;;;;gCCJ2B,wBAAwB"}
@@ -1,4 +1,5 @@
1
1
  import { t as assertSnapshotKeyWithoutDash } from "./asserts--HSSlgPD.mjs";
2
+ import { r as getCurrentTest, t as extractAutoSnapshotOptions } from "./auto_snapshot_options-DUOTpF2N.mjs";
2
3
  import { t as isBase64String } from "./base64-CHSENEAO.mjs";
3
4
  import { resolve } from "pathe";
4
5
  import dedent from "dedent";
@@ -11,6 +12,61 @@ function hasImageSnapshotAction(commands, taskId, options) {
11
12
  return commands.hasImageSnapshot(taskId, options?.snapshotKey);
12
13
  }
13
14
 
15
+ //#endregion
16
+ //#region src/client/external/browser/selector.ts
17
+ /**
18
+ * Most of the code in this file is copied from Vitest.
19
+ *
20
+ * @see https://github.com/vitest-dev/vitest/blob/main/packages/browser/src/client/utils.ts
21
+ */
22
+ function convertElementToCssSelector(element) {
23
+ if (!element || !(element instanceof Element)) throw new Error(`Expected DOM element to be an instance of Element, received ${typeof element}`);
24
+ return getUniqueCssSelector(element);
25
+ }
26
+ function escapeIdForCSSSelector(id) {
27
+ return id.split("").map((char) => {
28
+ const code = char.charCodeAt(0);
29
+ if (char === " " || char === "#" || char === "." || char === ":" || char === "[" || char === "]" || char === ">" || char === "+" || char === "~" || char === "\\") return `\\${char}`;
30
+ if (code >= 65536) return `\\${code.toString(16).toUpperCase().padStart(6, "0")} `;
31
+ if (code < 32 || code === 127) return `\\${code.toString(16).toUpperCase().padStart(2, "0")} `;
32
+ if (code >= 128) return `\\${code.toString(16).toUpperCase().padStart(2, "0")} `;
33
+ return char;
34
+ }).join("");
35
+ }
36
+ function getUniqueCssSelector(el) {
37
+ const path = [];
38
+ let parent;
39
+ let hasShadowRoot = false;
40
+ while (parent = getParent(el)) {
41
+ if (parent.shadowRoot) hasShadowRoot = true;
42
+ const tag = el.tagName;
43
+ if (el.id) path.push(`#${escapeIdForCSSSelector(el.id)}`);
44
+ else if (!el.nextElementSibling && !el.previousElementSibling) path.push(tag.toLowerCase());
45
+ else {
46
+ let index = 0;
47
+ let sameTagSiblings = 0;
48
+ let elementIndex = 0;
49
+ for (const sibling of parent.children) {
50
+ index++;
51
+ if (sibling.tagName === tag) sameTagSiblings++;
52
+ if (sibling === el) elementIndex = index;
53
+ }
54
+ if (sameTagSiblings > 1) path.push(`${tag.toLowerCase()}:nth-child(${elementIndex})`);
55
+ else path.push(tag.toLowerCase());
56
+ }
57
+ el = parent;
58
+ }
59
+ return `${getBrowserState().provider === "webdriverio" && hasShadowRoot ? ">>>" : ""}${path.reverse().join(" > ")}`;
60
+ }
61
+ function getParent(el) {
62
+ const parent = el.parentNode;
63
+ if (parent instanceof ShadowRoot) return parent.host;
64
+ return parent;
65
+ }
66
+ function getBrowserState() {
67
+ return window.__vitest_browser_runner__;
68
+ }
69
+
14
70
  //#endregion
15
71
  //#region src/shared/convert_threshold_unit.ts
16
72
  function convertThresholdUnit({ failureThresholdType, width, height }, pixelDiff) {
@@ -61,6 +117,51 @@ function compareWithSsim(img1, img2, output, width, height, diffOptions) {
61
117
  return diffPixels;
62
118
  }
63
119
 
120
+ //#endregion
121
+ //#region src/client/external/browser/image_data.ts
122
+ function toImageData(base64) {
123
+ return new Promise((resolve$1, reject) => {
124
+ const img = new Image();
125
+ img.src = `data:image/png;base64,${base64}`;
126
+ img.onload = () => {
127
+ const canvas = document.createElement("canvas");
128
+ canvas.width = img.width;
129
+ canvas.height = img.height;
130
+ const ctx$2 = canvas.getContext("2d");
131
+ ctx$2.drawImage(img, 0, 0);
132
+ resolve$1(ctx$2.getImageData(0, 0, canvas.width, canvas.height));
133
+ };
134
+ img.onerror = () => {
135
+ reject(/* @__PURE__ */ new Error("Failed to load image"));
136
+ };
137
+ });
138
+ }
139
+ async function toDataURL(imageData) {
140
+ const canvas = document.createElement("canvas");
141
+ canvas.width = imageData.width;
142
+ canvas.height = imageData.height;
143
+ canvas.getContext("2d").putImageData(imageData, 0, 0);
144
+ return new Promise((resolve$1) => {
145
+ canvas.toBlob((blob) => {
146
+ const reader = new FileReader();
147
+ reader.onload = () => {
148
+ resolve$1(reader.result);
149
+ };
150
+ reader.readAsDataURL(blob);
151
+ });
152
+ });
153
+ }
154
+
155
+ //#endregion
156
+ //#region src/client/external/vitest/vitest_browser_context_proxy.ts
157
+ let ctx$1;
158
+ if (globalThis.__vitest_browser__) import("vitest/browser").then((m) => {
159
+ ctx$1 = m;
160
+ });
161
+ const server = new Proxy({}, { get(target, prop) {
162
+ return target[prop] ?? (ctx$1?.server)[prop];
163
+ } });
164
+
64
165
  //#endregion
65
166
  //#region src/shared/get_max_size.ts
66
167
  function getMaxSize(image1, image2) {
@@ -77,7 +178,7 @@ function isSameSize(image1, image2) {
77
178
  }
78
179
 
79
180
  //#endregion
80
- //#region src/client/image_resizer.ts
181
+ //#region src/client/external/browser/image_resizer.ts
81
182
  const createImageResizer = ({ width, height }) => (image) => {
82
183
  if (isSameSize(image, {
83
184
  width,
@@ -105,7 +206,7 @@ const createImageResizer = ({ width, height }) => (image) => {
105
206
  };
106
207
 
107
208
  //#endregion
108
- //#region src/client/align_images.ts
209
+ //#region src/client/image/align_images.ts
109
210
  function alignImagesToSameSize(image1, image2) {
110
211
  if (isSameSize(image1, image2)) return [image1, image2];
111
212
  const resize = createImageResizer(getMaxSize(image1, image2));
@@ -113,7 +214,7 @@ function alignImagesToSameSize(image1, image2) {
113
214
  }
114
215
 
115
216
  //#endregion
116
- //#region src/client/compare_image_snapshot.logic.ts
217
+ //#region src/client/snapshot/compare_image_snapshot.logic.ts
117
218
  function prettifyOptions(options) {
118
219
  if (!options) return "none";
119
220
  return [
@@ -125,52 +226,7 @@ function prettifyOptions(options) {
125
226
  }
126
227
 
127
228
  //#endregion
128
- //#region src/client/image_data.ts
129
- function toImageData(base64) {
130
- return new Promise((resolve$1, reject) => {
131
- const img = new Image();
132
- img.src = `data:image/png;base64,${base64}`;
133
- img.onload = () => {
134
- const canvas = document.createElement("canvas");
135
- canvas.width = img.width;
136
- canvas.height = img.height;
137
- const ctx$1 = canvas.getContext("2d");
138
- ctx$1.drawImage(img, 0, 0);
139
- resolve$1(ctx$1.getImageData(0, 0, canvas.width, canvas.height));
140
- };
141
- img.onerror = () => {
142
- reject(/* @__PURE__ */ new Error("Failed to load image"));
143
- };
144
- });
145
- }
146
- async function toDataURL(imageData) {
147
- const canvas = document.createElement("canvas");
148
- canvas.width = imageData.width;
149
- canvas.height = imageData.height;
150
- canvas.getContext("2d").putImageData(imageData, 0, 0);
151
- return new Promise((resolve$1) => {
152
- canvas.toBlob((blob) => {
153
- const reader = new FileReader();
154
- reader.onload = () => {
155
- resolve$1(reader.result);
156
- };
157
- reader.readAsDataURL(blob);
158
- });
159
- });
160
- }
161
-
162
- //#endregion
163
- //#region src/client/vitest_browser_context_proxy.ts
164
- let ctx;
165
- if (globalThis.__vitest_browser__) import("vitest/browser").then((m) => {
166
- ctx = m;
167
- });
168
- const server = new Proxy({}, { get(target, prop) {
169
- return target[prop] ?? (ctx?.server)[prop];
170
- } });
171
-
172
- //#endregion
173
- //#region src/client/compare_image_snapshot.ts
229
+ //#region src/client/snapshot/compare_image_snapshot.ts
174
230
  async function compareImageSnapshot(commands, taskId, info, options) {
175
231
  options = {
176
232
  ...info,
@@ -212,61 +268,6 @@ async function writeSnapshot(commands, path, image) {
212
268
  return commands.writeFile(path, content, { encoding: "base64" });
213
269
  }
214
270
 
215
- //#endregion
216
- //#region src/client/selector.ts
217
- /**
218
- * Most of the code in this file is copied from Vitest.
219
- *
220
- * @see https://github.com/vitest-dev/vitest/blob/main/packages/browser/src/client/utils.ts
221
- */
222
- function convertElementToCssSelector(element) {
223
- if (!element || !(element instanceof Element)) throw new Error(`Expected DOM element to be an instance of Element, received ${typeof element}`);
224
- return getUniqueCssSelector(element);
225
- }
226
- function escapeIdForCSSSelector(id) {
227
- return id.split("").map((char) => {
228
- const code = char.charCodeAt(0);
229
- if (char === " " || char === "#" || char === "." || char === ":" || char === "[" || char === "]" || char === ">" || char === "+" || char === "~" || char === "\\") return `\\${char}`;
230
- if (code >= 65536) return `\\${code.toString(16).toUpperCase().padStart(6, "0")} `;
231
- if (code < 32 || code === 127) return `\\${code.toString(16).toUpperCase().padStart(2, "0")} `;
232
- if (code >= 128) return `\\${code.toString(16).toUpperCase().padStart(2, "0")} `;
233
- return char;
234
- }).join("");
235
- }
236
- function getUniqueCssSelector(el) {
237
- const path = [];
238
- let parent;
239
- let hasShadowRoot = false;
240
- while (parent = getParent(el)) {
241
- if (parent.shadowRoot) hasShadowRoot = true;
242
- const tag = el.tagName;
243
- if (el.id) path.push(`#${escapeIdForCSSSelector(el.id)}`);
244
- else if (!el.nextElementSibling && !el.previousElementSibling) path.push(tag.toLowerCase());
245
- else {
246
- let index = 0;
247
- let sameTagSiblings = 0;
248
- let elementIndex = 0;
249
- for (const sibling of parent.children) {
250
- index++;
251
- if (sibling.tagName === tag) sameTagSiblings++;
252
- if (sibling === el) elementIndex = index;
253
- }
254
- if (sameTagSiblings > 1) path.push(`${tag.toLowerCase()}:nth-child(${elementIndex})`);
255
- else path.push(tag.toLowerCase());
256
- }
257
- el = parent;
258
- }
259
- return `${getBrowserState().provider === "webdriverio" && hasShadowRoot ? ">>>" : ""}${path.reverse().join(" > ")}`;
260
- }
261
- function getParent(el) {
262
- const parent = el.parentNode;
263
- if (parent instanceof ShadowRoot) return parent.host;
264
- return parent;
265
- }
266
- function getBrowserState() {
267
- return window.__vitest_browser_runner__;
268
- }
269
-
270
271
  //#endregion
271
272
  //#region src/client/actions/match_image_snapshot_action.ts
272
273
  async function matchImageSnapshotAction(commands, taskId, subject, options) {
@@ -299,7 +300,19 @@ const success = {
299
300
  };
300
301
 
301
302
  //#endregion
302
- //#region src/client/task_id.ts
303
+ //#region src/client/external/browser/has_render_content.ts
304
+ function hasRenderContent() {
305
+ return document.body.childElementCount > 0;
306
+ }
307
+
308
+ //#endregion
309
+ //#region src/client/snapshot/should_take_snapshot.ts
310
+ function shouldTakeSnapshot(meta) {
311
+ return hasRenderContent() && meta?.enable;
312
+ }
313
+
314
+ //#endregion
315
+ //#region src/client/task/task_id.ts
303
316
  function toTaskId(task) {
304
317
  const l = [];
305
318
  let t = task;
@@ -312,5 +325,57 @@ function toTaskId(task) {
312
325
  }
313
326
 
314
327
  //#endregion
315
- export { hasImageSnapshotAction as a, matchImageSnapshotAction as i, success as n, matchPageImageSnapshotAction as r, toTaskId as t };
316
- //# sourceMappingURL=task_id-DnS9_4Ub.mjs.map
328
+ //#region src/client/suite/_ctx.ts
329
+ const ctx = {
330
+ getCurrentTest,
331
+ __test__reset() {
332
+ ctx.getCurrentTest = getCurrentTest;
333
+ }
334
+ };
335
+
336
+ //#endregion
337
+ //#region src/client/suite/auto_snapshot_matcher.ts
338
+ function autoSnapshotMatcher(commands, expect) {
339
+ let subject;
340
+ return {
341
+ async setup() {
342
+ subject = (await commands.setupVisSuite()).subject;
343
+ },
344
+ createMatcher(themes) {
345
+ return async function matchImageSnapshot() {
346
+ const test = ctx.getCurrentTest();
347
+ if ((test?.result?.errors?.length ?? 0) > 0) return;
348
+ const meta = extractAutoSnapshotOptions(test);
349
+ if (!shouldTakeSnapshot(meta)) return;
350
+ const errors = [];
351
+ for (const themeId in themes) try {
352
+ await new Promise((a) => setTimeout(a, 10));
353
+ const theme = themes[themeId];
354
+ if ((typeof theme === "function" ? await theme(meta) : theme) === false) continue;
355
+ await expect(getSubject(meta?.subject ?? subject)).toMatchImageSnapshot({
356
+ ...meta,
357
+ snapshotKey: meta?.snapshotKey ?? themeId
358
+ });
359
+ } catch (error) {
360
+ errors.push([themeId, error]);
361
+ }
362
+ if (errors.length > 0) {
363
+ if (errors.length === 1) throw errors[0][1];
364
+ const taskId = toTaskId(test);
365
+ throw new AggregateError(errors, dedent`Snapshot \`${taskId}\` mismatched
366
+
367
+ ${errors.map(([themeId, error]) => {
368
+ return `Theme \`${themeId}\` failed: ${error.message}`;
369
+ }).join("\n\n")}`);
370
+ }
371
+ };
372
+ }
373
+ };
374
+ }
375
+ function getSubject(selectors) {
376
+ return selectors ? document.querySelector(selectors) ?? document.body : document.body;
377
+ }
378
+
379
+ //#endregion
380
+ export { matchImageSnapshotAction as a, matchPageImageSnapshotAction as i, toTaskId as n, hasImageSnapshotAction as o, success as r, autoSnapshotMatcher as t };
381
+ //# sourceMappingURL=auto_snapshot_matcher-C0y6mAeS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto_snapshot_matcher-C0y6mAeS.mjs","names":["parent: null | ParentNode","pixelmatch","ctx","ctx: Awaited<typeof import('vitest/browser')>","ctx","success: SyncExpectationResult","l: any[]","subject: string | undefined","errors: Array<[string, Error]>"],"sources":["../src/client/actions/has_image_snapshot_action.ts","../src/client/external/browser/selector.ts","../src/shared/convert_threshold_unit.ts","../src/shared/compare_image.ts","../src/client/external/browser/image_data.ts","../src/client/external/vitest/vitest_browser_context_proxy.ts","../src/shared/get_max_size.ts","../src/shared/is_same_size.ts","../src/client/external/browser/image_resizer.ts","../src/client/image/align_images.ts","../src/client/snapshot/compare_image_snapshot.logic.ts","../src/client/snapshot/compare_image_snapshot.ts","../src/client/actions/match_image_snapshot_action.ts","../src/client/actions/match_page_image_snapshot_action.ts","../src/client/expect/expectation_result.ts","../src/client/external/browser/has_render_content.ts","../src/client/snapshot/should_take_snapshot.ts","../src/client/task/task_id.ts","../src/client/suite/_ctx.ts","../src/client/suite/auto_snapshot_matcher.ts"],"sourcesContent":["import type { HasImageSnapshotCommand, ImageSnapshotNextIndexCommand } from '../../shared/commands.types.ts'\nimport type { ImageSnapshotKeyOptions } from '../../shared/types.ts'\n\nexport function hasImageSnapshotAction(\n\tcommands: ImageSnapshotNextIndexCommand & HasImageSnapshotCommand,\n\ttaskId: string,\n\toptions?: ImageSnapshotKeyOptions | undefined,\n) {\n\tif (options?.snapshotKey?.includes('-')) {\n\t\tthrow new Error('Snapshot key cannot contain dash')\n\t}\n\n\treturn commands.hasImageSnapshot(taskId, options?.snapshotKey)\n}\n","/**\n * Most of the code in this file is copied from Vitest.\n *\n * @see https://github.com/vitest-dev/vitest/blob/main/packages/browser/src/client/utils.ts\n */\n\nexport function convertElementToCssSelector(element: Element) {\n\tif (!element || !(element instanceof Element)) {\n\t\tthrow new Error(`Expected DOM element to be an instance of Element, received ${typeof element}`)\n\t}\n\n\treturn getUniqueCssSelector(element)\n}\n\nfunction escapeIdForCSSSelector(id: string) {\n\treturn id\n\t\t.split('')\n\t\t.map((char) => {\n\t\t\tconst code = char.charCodeAt(0)\n\n\t\t\tif (\n\t\t\t\tchar === ' ' ||\n\t\t\t\tchar === '#' ||\n\t\t\t\tchar === '.' ||\n\t\t\t\tchar === ':' ||\n\t\t\t\tchar === '[' ||\n\t\t\t\tchar === ']' ||\n\t\t\t\tchar === '>' ||\n\t\t\t\tchar === '+' ||\n\t\t\t\tchar === '~' ||\n\t\t\t\tchar === '\\\\'\n\t\t\t) {\n\t\t\t\t// Escape common special characters with backslashes\n\t\t\t\treturn `\\\\${char}`\n\t\t\t}\n\t\t\tif (code >= 0x10000) {\n\t\t\t\t// Unicode escape for characters outside the BMP\n\t\t\t\treturn `\\\\${code.toString(16).toUpperCase().padStart(6, '0')} `\n\t\t\t}\n\t\t\tif (code < 0x20 || code === 0x7f) {\n\t\t\t\t// Non-printable ASCII characters (0x00-0x1F and 0x7F) are escaped\n\t\t\t\treturn `\\\\${code.toString(16).toUpperCase().padStart(2, '0')} `\n\t\t\t}\n\t\t\tif (code >= 0x80) {\n\t\t\t\t// Non-ASCII characters (0x80 and above) are escaped\n\t\t\t\treturn `\\\\${code.toString(16).toUpperCase().padStart(2, '0')} `\n\t\t\t}\n\t\t\t// Allowable characters are used directly\n\t\t\treturn char\n\t\t})\n\t\t.join('')\n}\n\nfunction getUniqueCssSelector(el: Element) {\n\tconst path = []\n\tlet parent: null | ParentNode\n\tlet hasShadowRoot = false\n\t// eslint-disable-next-line no-cond-assign\n\twhile ((parent = getParent(el))) {\n\t\tif ((parent as Element).shadowRoot) {\n\t\t\thasShadowRoot = true\n\t\t}\n\n\t\tconst tag = el.tagName\n\t\tif (el.id) {\n\t\t\tpath.push(`#${escapeIdForCSSSelector(el.id)}`)\n\t\t} else if (!el.nextElementSibling && !el.previousElementSibling) {\n\t\t\tpath.push(tag.toLowerCase())\n\t\t} else {\n\t\t\tlet index = 0\n\t\t\tlet sameTagSiblings = 0\n\t\t\tlet elementIndex = 0\n\n\t\t\tfor (const sibling of parent.children) {\n\t\t\t\tindex++\n\t\t\t\tif (sibling.tagName === tag) {\n\t\t\t\t\tsameTagSiblings++\n\t\t\t\t}\n\t\t\t\tif (sibling === el) {\n\t\t\t\t\telementIndex = index\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sameTagSiblings > 1) {\n\t\t\t\tpath.push(`${tag.toLowerCase()}:nth-child(${elementIndex})`)\n\t\t\t} else {\n\t\t\t\tpath.push(tag.toLowerCase())\n\t\t\t}\n\t\t}\n\t\tel = parent as Element\n\t}\n\treturn `${getBrowserState().provider === 'webdriverio' && hasShadowRoot ? '>>>' : ''}${path.reverse().join(' > ')}`\n}\n\nfunction getParent(el: Element) {\n\tconst parent = el.parentNode\n\tif (parent instanceof ShadowRoot) {\n\t\treturn parent.host\n\t}\n\treturn parent\n}\nfunction getBrowserState(): { provider: 'webdriverio' | 'playwright' } {\n\t// @ts-expect-error not typed global\n\treturn window.__vitest_browser_runner__\n}\n","export function convertThresholdUnit(\n\t{ failureThresholdType, width, height }: { failureThresholdType: 'pixel' | 'percent'; width: number; height: number },\n\tpixelDiff: number,\n): number {\n\tswitch (failureThresholdType) {\n\t\tcase 'pixel':\n\t\t\treturn pixelDiff\n\t\tcase 'percent':\n\t\t\treturn (pixelDiff / (width * height)) * 100\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported failureThresholdType: ${failureThresholdType}`)\n\t}\n}\n","import pixelmatch from 'pixelmatch'\nimport { type Options, ssim } from 'ssim.js'\nimport { convertThresholdUnit } from './convert_threshold_unit.ts'\nimport type { ComparisonMethod, ImageSnapshotCompareOptions } from './types.ts'\n\nexport function compareImage<M extends ComparisonMethod>(\n\timg1: Uint8ClampedArray | Buffer,\n\timg2: Uint8ClampedArray | Buffer,\n\toutput: Uint8ClampedArray | Buffer,\n\twidth: number,\n\theight: number,\n\toptions: ImageSnapshotCompareOptions<M> = {} as any,\n) {\n\tconst pixelDiff =\n\t\toptions.comparisonMethod === 'ssim'\n\t\t\t? compareWithSsim(img1, img2, output, width, height, options.diffOptions)\n\t\t\t: pixelmatch(img1, img2, output, width, height, options.diffOptions)\n\tconst diffAmount = convertThresholdUnit(\n\t\t{ failureThresholdType: options.failureThresholdType ?? 'pixel', width, height },\n\t\tpixelDiff,\n\t)\n\n\treturn {\n\t\tpass: diffAmount <= (options.failureThreshold ?? 0),\n\t\tdiffAmount,\n\t}\n}\n\n/**\n * @author This code is based on `jest-image-snapshot` implementation.\n */\nfunction compareWithSsim(\n\timg1: Uint8ClampedArray | Buffer,\n\timg2: Uint8ClampedArray | Buffer,\n\toutput: Uint8ClampedArray | Buffer,\n\twidth: number,\n\theight: number,\n\tdiffOptions?: Partial<Options>,\n) {\n\tconst newImage = { data: img1, width: width, height: height }\n\tconst baselineImage = { data: img2, width: width, height: height }\n\tconst { ssim_map, mssim } = ssim(newImage as any, baselineImage as any, {\n\t\tssim: 'bezkrovny',\n\t\t...diffOptions,\n\t})\n\t// Converts the SSIM value to different pixels based on image width and height\n\t// conforms to how pixelmatch works.\n\tconst diffPixels = Math.round((1 - mssim) * width * height)\n\tconst diffRgbaPixels = new DataView(output.buffer, output.byteOffset)\n\tfor (let ln = 0; ln !== height; ++ln) {\n\t\tfor (let pos = 0; pos !== width; ++pos) {\n\t\t\tconst rPos = ln * width + pos\n\t\t\t// initial value is transparent. We'll add in the SSIM offset.\n\t\t\t// red (ff) green (00) blue (00) alpha (00)\n\t\t\tconst diffValue =\n\t\t\t\t0xff000000 +\n\t\t\t\tMath.floor(\n\t\t\t\t\t0xff *\n\t\t\t\t\t\t(1 -\n\t\t\t\t\t\t\tssim_map.data[\n\t\t\t\t\t\t\t\tssim_map.width * Math.round((ssim_map.height * ln) / height) +\n\t\t\t\t\t\t\t\t\tMath.round((ssim_map.width * pos) / width)\n\t\t\t\t\t\t\t]!),\n\t\t\t\t)\n\t\t\tdiffRgbaPixels.setUint32(rPos * 4, diffValue)\n\t\t}\n\t}\n\treturn diffPixels\n}\n","export function toImageData(base64: string) {\n\treturn new Promise<ImageData>((resolve, reject) => {\n\t\tconst img = new Image()\n\t\timg.src = `data:image/png;base64,${base64}`\n\n\t\timg.onload = () => {\n\t\t\tconst canvas = document.createElement('canvas')\n\t\t\tcanvas.width = img.width\n\t\t\tcanvas.height = img.height\n\t\t\tconst ctx = canvas.getContext('2d')!\n\t\t\tctx.drawImage(img, 0, 0)\n\t\t\tresolve(ctx.getImageData(0, 0, canvas.width, canvas.height))\n\t\t}\n\n\t\timg.onerror = () => {\n\t\t\treject(new Error('Failed to load image'))\n\t\t}\n\t})\n}\n\nexport async function toDataURL(imageData: ImageData) {\n\tconst canvas = document.createElement('canvas')\n\tcanvas.width = imageData.width\n\tcanvas.height = imageData.height\n\tconst ctx = canvas.getContext('2d')!\n\tctx.putImageData(imageData, 0, 0)\n\treturn new Promise<string>((resolve) => {\n\t\tcanvas.toBlob((blob) => {\n\t\t\tconst reader = new FileReader()\n\t\t\treader.onload = () => {\n\t\t\t\tresolve(reader.result as string)\n\t\t\t}\n\t\t\treader.readAsDataURL(blob!)\n\t\t})\n\t})\n}\n","import type { SerializedConfig } from 'vitest'\nimport type { BrowserCommands, Platform } from 'vitest/browser'\n\nlet ctx: Awaited<typeof import('vitest/browser')>\n\nif ((globalThis as any).__vitest_browser__) {\n\timport('vitest/browser').then((m) => {\n\t\tctx = m\n\t})\n}\n\nexport const server = new Proxy<{\n\t/**\n\t * Platform the Vitest server is running on.\n\t * The same as calling `process.platform` on the server.\n\t */\n\tplatform: Platform\n\t/**\n\t * Runtime version of the Vitest server.\n\t * The same as calling `process.version` on the server.\n\t */\n\tversion: string\n\t/**\n\t * Name of the browser provider.\n\t */\n\tprovider: string\n\t/**\n\t * Name of the current browser.\n\t */\n\tbrowser: string\n\t/**\n\t * Available commands for the browser.\n\t * @see {@link https://vitest.dev/guide/browser/commands}\n\t */\n\tcommands: BrowserCommands\n\t/**\n\t * Serialized test config.\n\t */\n\tconfig: SerializedConfig\n}>({} as any, {\n\tget(target, prop) {\n\t\treturn (target as any)[prop] ?? (ctx?.server as any)[prop]\n\t},\n})\n","export function getMaxSize(image1: { width: number; height: number }, image2: { width: number; height: number }) {\n\tconst width = Math.max(image1.width, image2.width)\n\tconst height = Math.max(image1.height, image2.height)\n\treturn { width, height }\n}\n","export function isSameSize(image1: { width: number; height: number }, image2: { width: number; height: number }) {\n\treturn image1.width === image2.width && image1.height === image2.height\n}\n","import { isSameSize } from '../../../shared/is_same_size.ts'\n\nexport const createImageResizer =\n\t({ width, height }: { width: number; height: number }) =>\n\t(image: ImageData) => {\n\t\tif (isSameSize(image, { width, height })) return image\n\n\t\tconst inArea = (x: number, y: number) => y <= image.height && x <= image.width\n\n\t\tconst data = new Uint8ClampedArray(width * height * 4)\n\t\tconst result = new ImageData(data, width, height, { colorSpace: image.colorSpace })\n\n\t\tfor (let y = 0; y < height; y++) {\n\t\t\tfor (let x = 0; x < width; x++) {\n\t\t\t\tconst idx = (width * y + x) << 2\n\t\t\t\tif (inArea(x, y)) {\n\t\t\t\t\tconst old = (image.width * y + x) << 2\n\t\t\t\t\tresult.data[idx] = image.data[old]!\n\t\t\t\t\tresult.data[idx + 1] = image.data[old + 1]!\n\t\t\t\t\tresult.data[idx + 2] = image.data[old + 2]!\n\t\t\t\t\tresult.data[idx + 3] = image.data[old + 3]!\n\t\t\t\t} else {\n\t\t\t\t\tresult.data[idx] = 0\n\t\t\t\t\tresult.data[idx + 1] = 0\n\t\t\t\t\tresult.data[idx + 2] = 0\n\t\t\t\t\tresult.data[idx + 3] = 64\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result\n\t}\n\n// slower\nexport const createImageResizer2 =\n\t({ width, height }: { width: number; height: number }) =>\n\t(image: ImageData) => {\n\t\tif (isSameSize(image, { width, height })) return image\n\n\t\tconst inArea = (x: number, y: number) => y <= image.height && x <= image.width\n\n\t\tconst data = new Uint8ClampedArray(width * height * 4)\n\t\tconst result = new ImageData(data, width, height, { colorSpace: image.colorSpace })\n\n\t\tconst copyBytes = image.width * 4\n\t\tfor (let y = 0; y < height; y++) {\n\t\t\tresult.data.set(image.data.slice(y * image.width, copyBytes), y * width * 4)\n\t\t\tfor (let x = image.width; x < width; x++) {\n\t\t\t\tconst idx = (width * y + x) << 2\n\t\t\t\tif (!inArea(x, y)) {\n\t\t\t\t\tresult.data[idx] = 0\n\t\t\t\t\tresult.data[idx + 1] = 0\n\t\t\t\t\tresult.data[idx + 2] = 0\n\t\t\t\t\tresult.data[idx + 3] = 64\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n","import { getMaxSize } from '../../shared/get_max_size.ts'\nimport { isSameSize } from '../../shared/is_same_size.ts'\nimport { createImageResizer } from '../external/browser/image_resizer.ts'\n\nexport function alignImagesToSameSize(image1: ImageData, image2: ImageData): [image1: ImageData, image2: ImageData] {\n\tif (isSameSize(image1, image2)) return [image1, image2] as const\n\n\tconst size = getMaxSize(image1, image2)\n\tconst resize = createImageResizer(size)\n\treturn [resize(image1), resize(image2)] as const\n}\n","import type { ToMatchImageSnapshotOptions } from '../../shared/types.ts'\n\nexport function prettifyOptions(options: ToMatchImageSnapshotOptions<any> | undefined) {\n\tif (!options) return 'none'\n\n\treturn [\n\t\t`failureThreshold: ${options.failureThreshold ?? 0} ${options.failureThresholdType ?? 'pixels'}`,\n\t\toptions.timeout ? `timeout: ${options.timeout} ms` : '',\n\t\t`comparisonMethod: ${options.comparisonMethod ?? 'pixel'}`,\n\t\toptions.diffOptions ? `diffOptions: ${JSON.stringify(options.diffOptions)}` : '',\n\t]\n\t\t.filter(Boolean)\n\t\t.join('\\n ')\n}\n","import dedent from 'dedent'\nimport { resolve } from 'pathe'\nimport type { BrowserCommands } from 'vitest/browser'\nimport type {\n\tImageSnapshotNextIndexCommand,\n\tPrepareImageSnapshotComparisonCommand,\n} from '../../shared/commands.types.ts'\nimport { compareImage } from '../../shared/compare_image.ts'\nimport type { ImageSnapshotComparisonInfo, ToMatchImageSnapshotOptions } from '../../shared/types.ts'\nimport { toDataURL, toImageData } from '../external/browser/image_data.ts'\nimport { server } from '../external/vitest/vitest_browser_context_proxy.ts'\nimport { alignImagesToSameSize } from '../image/align_images.ts'\nimport { prettifyOptions } from './compare_image_snapshot.logic.ts'\n\nexport async function compareImageSnapshot(\n\tcommands: BrowserCommands & PrepareImageSnapshotComparisonCommand & ImageSnapshotNextIndexCommand,\n\ttaskId: string,\n\tinfo: ImageSnapshotComparisonInfo,\n\toptions?: ToMatchImageSnapshotOptions<any>,\n) {\n\toptions = { ...info, ...options } as any\n\n\tconst baselineImage = await toImageData(info.baseline)\n\tconst resultImage = await toImageData(info.result)\n\tconst [baselineAlignedImage, resultAlignedImage] = alignImagesToSameSize(baselineImage, resultImage)\n\tconst { width, height } = baselineAlignedImage\n\tconst diffImage = new ImageData(width, height)\n\tconst { pass, diffAmount } = compareImage(\n\t\tbaselineAlignedImage.data,\n\t\tresultAlignedImage.data,\n\t\tdiffImage.data,\n\t\twidth,\n\t\theight,\n\t\toptions,\n\t)\n\tif (pass) {\n\t\tif (options?.expectToFail) {\n\t\t\tthrow new Error(\n\t\t\t\tdedent`Snapshot \\`${taskId}\\` matched but expected to fail.\n\n\t\t\t\t\t\t\tOptions: ${prettifyOptions(options)}\n\t\t\t\t\t\t\tDiff: ${options.failureThresholdType === 'percent' ? `${diffAmount}%` : `${diffAmount} pixels`}\n\n\t\t\t\t\t\t\tExpected: ${resolve(info.projectRoot, info.baselinePath)}\n\t\t\t\t\t\t\tActual: ${resolve(info.projectRoot, info.resultPath)}`,\n\t\t\t)\n\t\t}\n\t\treturn\n\t}\n\tif (server.config.snapshotOptions.updateSnapshot === 'all' && !options?.expectToFail) {\n\t\tawait writeSnapshot(commands, resolve(info.projectRoot, info.baselinePath), resultImage)\n\t\treturn\n\t}\n\n\tawait writeSnapshot(commands, resolve(info.projectRoot, info.diffPath), diffImage)\n\n\tthrow new Error(\n\t\tdedent`Snapshot \\`${taskId}\\` mismatched\n\n\t\t\t\t\t${\n\t\t\t\t\t\toptions?.failureThreshold\n\t\t\t\t\t\t\t? options?.failureThresholdType === 'percent'\n\t\t\t\t\t\t\t\t? `Expected image to match within ${options.failureThreshold}% but was differ by ${diffAmount}%.`\n\t\t\t\t\t\t\t\t: `Expected image to match within ${options.failureThreshold} pixels but was differ by ${diffAmount} pixels.`\n\t\t\t\t\t\t\t: `Expected image to match but was differ by ${options?.failureThresholdType === 'percent' ? `${diffAmount}%` : `${diffAmount} pixels`}.`\n\t\t\t\t\t}${\n\t\t\t\t\t\tbaselineImage.width !== resultImage.width || baselineImage.height !== resultImage.height\n\t\t\t\t\t\t\t? `\\nThe image size changed from ${baselineImage.width}x${baselineImage.height} to ${resultImage.width}x${resultImage.height}.`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\n\t\t\t\t\tOptions: ${prettifyOptions(options)}\n\n\t\t\t\t\tExpected: ${resolve(info.projectRoot, info.baselinePath)}\n\t\t\t\t\tActual: ${resolve(info.projectRoot, info.resultPath)}\n\t\t\t\t\tDifference: ${resolve(info.projectRoot, info.diffPath)}`,\n\t)\n}\n\nasync function writeSnapshot(commands: BrowserCommands, path: string, image: ImageData) {\n\tconst content = (await toDataURL(image)).split(',')[1]!\n\treturn commands.writeFile(path, content, { encoding: 'base64' })\n}\n","import type { BrowserCommands } from 'vitest/browser'\nimport { assertSnapshotKeyWithoutDash } from '../../shared/asserts.ts'\nimport { isBase64String } from '../../shared/base64.ts'\nimport type {\n\tImageSnapshotNextIndexCommand,\n\tPrepareImageSnapshotComparisonCommand,\n} from '../../shared/commands.types.ts'\nimport type { ToMatchImageSnapshotOptions } from '../../shared/types.ts'\nimport { convertElementToCssSelector } from '../external/browser/selector.ts'\nimport { compareImageSnapshot } from '../snapshot/compare_image_snapshot.ts'\n\nexport async function matchImageSnapshotAction(\n\tcommands: BrowserCommands & PrepareImageSnapshotComparisonCommand & ImageSnapshotNextIndexCommand,\n\ttaskId: string,\n\tsubject: any,\n\toptions?: ToMatchImageSnapshotOptions<any>,\n) {\n\tassertSnapshotKeyWithoutDash(options?.snapshotKey)\n\n\tconst info = await commands.prepareImageSnapshotComparison(taskId, parseImageSnapshotSubject(subject), options)\n\n\tif (!info) return\n\n\treturn compareImageSnapshot(commands, taskId, info, options)\n}\n\nfunction parseImageSnapshotSubject(subject: any) {\n\tif (subject instanceof Element) return convertElementToCssSelector(subject)\n\tif (subject?.['selector']) return subject['selector']\n\tif (isBase64String(subject)) return subject\n\tthrow new Error(\n\t\t`'toMatchImageSnapshot()' expects the subject to be an element, locator, or image encoded in base64 string, but got: ${subject}`,\n\t)\n}\n","import type { BrowserCommands } from 'vitest/browser'\nimport { assertSnapshotKeyWithoutDash } from '../../shared/asserts.ts'\nimport type {\n\tImageSnapshotNextIndexCommand,\n\tPrepareImageSnapshotComparisonCommand,\n} from '../../shared/commands.types.ts'\nimport type { ToMatchImageSnapshotOptions } from '../../shared/types.ts'\nimport { compareImageSnapshot } from '../snapshot/compare_image_snapshot.ts'\n\nexport async function matchPageImageSnapshotAction(\n\tcommands: BrowserCommands & PrepareImageSnapshotComparisonCommand & ImageSnapshotNextIndexCommand,\n\ttaskId: string,\n\toptions?: ToMatchImageSnapshotOptions<any>,\n) {\n\tassertSnapshotKeyWithoutDash(options?.snapshotKey)\n\n\tconst info = await commands.preparePageImageSnapshotComparison(taskId, options)\n\n\tif (!info) return\n\n\treturn compareImageSnapshot(commands, taskId, info, options)\n}\n","import type { SyncExpectationResult } from '@vitest/expect'\n\nexport const success: SyncExpectationResult = {\n\tpass: true,\n\t/* v8 ignore next */\n\tmessage: () => '',\n}\n","export function hasRenderContent() {\n\treturn document.body.childElementCount > 0\n}\n","import { hasRenderContent } from '../external/browser/has_render_content.ts'\nimport type { SnapshotMeta } from '../task/snapshot_meta.ts'\n\nexport function shouldTakeSnapshot(meta: SnapshotMeta<any> | undefined) {\n\treturn hasRenderContent() && meta?.enable\n}\n","type Task = {\n\tname: string\n\tsuite?: Task | undefined\n}\n\nexport function toTaskId(task: Task) {\n\tconst l: any[] = []\n\tlet t = task\n\twhile (t?.suite) {\n\t\tl.unshift(t.suite.name.replace(/[^a-z0-9]/gi, '-').toLowerCase())\n\t\tt = t.suite\n\t}\n\n\tl.push(task.name.replace(/[^a-z0-9]/gi, '-').toLowerCase())\n\treturn l.join('/')\n}\n","import { getCurrentTest } from '../external/vitest/vitest_suite_proxy.ts'\n\nexport const ctx = {\n\tgetCurrentTest,\n\t__test__reset() {\n\t\tctx.getCurrentTest = getCurrentTest\n\t},\n}\n","import dedent from 'dedent'\nimport type { SetupVisSuiteCommand } from '../../shared/commands.types.ts'\nimport type { ComparisonMethod } from '../../shared/types.ts'\nimport { shouldTakeSnapshot } from '../snapshot/should_take_snapshot.ts'\nimport { extractAutoSnapshotOptions } from '../task/auto_snapshot_options.ts'\nimport type { SnapshotMeta } from '../task/snapshot_meta.ts'\nimport { toTaskId } from '../task/task_id.ts'\nimport { ctx } from './_ctx.ts'\n\nexport function autoSnapshotMatcher<GM extends Record<string, any> | unknown = unknown>(\n\tcommands: SetupVisSuiteCommand,\n\texpect: any,\n) {\n\tlet subject: string | undefined\n\n\treturn {\n\t\tasync setup() {\n\t\t\tsubject = (await commands.setupVisSuite()).subject\n\t\t},\n\t\tcreateMatcher<C extends ComparisonMethod, M extends Record<string, any> | unknown = unknown>(\n\t\t\tthemes: Record<\n\t\t\t\tstring,\n\t\t\t\tboolean | ((options: SnapshotMeta<C> & M & GM) => Promise<boolean> | Promise<void> | boolean | void)\n\t\t\t>,\n\t\t) {\n\t\t\treturn async function matchImageSnapshot() {\n\t\t\t\tconst test = ctx.getCurrentTest()\n\t\t\t\tif ((test?.result?.errors?.length ?? 0) > 0) return\n\n\t\t\t\tconst meta = extractAutoSnapshotOptions(test)\n\t\t\t\tif (!shouldTakeSnapshot(meta)) return\n\t\t\t\tconst errors: Array<[string, Error]> = []\n\t\t\t\tfor (const themeId in themes) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait new Promise((a) => setTimeout(a, 10))\n\t\t\t\t\t\tconst theme = themes[themeId]\n\t\t\t\t\t\tconst r = typeof theme === 'function' ? await theme(meta! as any) : theme\n\t\t\t\t\t\tif (r === false) continue\n\t\t\t\t\t\tawait expect(getSubject(meta?.subject ?? subject)).toMatchImageSnapshot({\n\t\t\t\t\t\t\t...meta,\n\t\t\t\t\t\t\tsnapshotKey: meta?.snapshotKey ?? themeId,\n\t\t\t\t\t\t})\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\terrors.push([themeId, error as Error])\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\tif (errors.length === 1) throw errors[0]![1]\n\t\t\t\t\tconst taskId = toTaskId(test!)\n\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\terrors,\n\t\t\t\t\t\tdedent`Snapshot \\`${taskId}\\` mismatched\n\n\t\t\t\t\t${errors\n\t\t\t\t\t\t.map(([themeId, error]) => {\n\t\t\t\t\t\t\treturn `Theme \\`${themeId}\\` failed: ${error.message}`\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('\\n\\n')}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n}\n\nfunction getSubject(selectors: string | undefined) {\n\treturn selectors ? (document.querySelector(selectors) ?? document.body) : document.body\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { n as ComparisonMethod, x as SnapshotMeta } from "./types-DFb23VE1.mjs";
1
+ import { n as ComparisonMethod, w as SnapshotMeta } from "./types-CEmjj-A9.mjs";
2
2
 
3
- //#region src/client/auto_snapshot_options.d.ts
3
+ //#region src/client/task/auto_snapshot_options.d.ts
4
4
  type Suite = {
5
5
  meta: Record<string, any>;
6
6
  suite?: Suite | undefined;
@@ -42,4 +42,4 @@ type MetaTask = {
42
42
  declare function setAutoSnapshotOptions<M extends ComparisonMethod>(meta: boolean | SnapshotMeta<M>): void;
43
43
  //#endregion
44
44
  export { setAutoSnapshotOptions as n, MetaTask as t };
45
- //# sourceMappingURL=auto_snapshot_options-CaQCXDdi.d.mts.map
45
+ //# sourceMappingURL=auto_snapshot_options-BMRtKmod.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto_snapshot_options-BMRtKmod.d.mts","names":[],"sources":["../src/client/task/auto_snapshot_options.ts"],"sourcesContent":[],"mappings":";;;KAMK,KAAA;EAAA,IAAA,EAAgB,MAAX,CAAA,MAAA,EAAW,GAAA,CAAA;EAET,KAAA,CAAA,EAFsC,KAE9B,GAAA,SAAA;CAEF;AACP,KAHC,QAAA,GAGD;EACF,IAAA,CAAA,EAAA;IAAM,IAAA,EAFG,MAEH,CAAA,MAAA,EAAA,GAAA,CAAA;EA+BC,CAAA,GAAA,SAAA;EAAiC,KAAA,CAAA,EAhCtC,KAgCsC,GAAA,SAAA;EAA+C,IAAA,EA/BvF,MA+BuF,CAAA,MAAA,EAAA,GAAA,CAAA;CAAb,GAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAnE,iCAAiC,kCAAkC,aAAa"}
@@ -1,7 +1,7 @@
1
1
  import { t as assertSnapshotKeyWithoutDash } from "./asserts--HSSlgPD.mjs";
2
2
  import { r as NAME } from "./constants-CTBaz8Ml.mjs";
3
3
 
4
- //#region src/client/vitest_suite_proxy.ts
4
+ //#region src/client/external/vitest/vitest_suite_proxy.ts
5
5
  let vitestSuite;
6
6
  if (globalThis.__vitest_browser__) import("vitest/suite").then((m) => {
7
7
  vitestSuite = m;
@@ -10,20 +10,18 @@ const getCurrentTest = () => vitestSuite?.getCurrentTest();
10
10
  const getCurrentSuite = () => vitestSuite?.getCurrentSuite();
11
11
 
12
12
  //#endregion
13
- //#region src/client/ctx.ts
13
+ //#region src/client/task/_ctx.ts
14
14
  const ctx = {
15
- autoEnabled: void 0,
16
15
  getCurrentTest,
17
16
  getCurrentSuite,
18
17
  __test__reset() {
19
18
  ctx.getCurrentTest = getCurrentTest;
20
19
  ctx.getCurrentSuite = getCurrentSuite;
21
- ctx.autoEnabled = void 0;
22
20
  }
23
21
  };
24
22
 
25
23
  //#endregion
26
- //#region src/client/auto_snapshot_options.ts
24
+ //#region src/client/task/auto_snapshot_options.ts
27
25
  /**
28
26
  * Set the snapshot options for auto snapshot.
29
27
  *
@@ -86,5 +84,5 @@ function extractAutoSnapshotOptions(task) {
86
84
  }
87
85
 
88
86
  //#endregion
89
- export { setAutoSnapshotOptions as n, ctx as r, extractAutoSnapshotOptions as t };
90
- //# sourceMappingURL=auto_snapshot_options-CAD43Zkp.mjs.map
87
+ export { setAutoSnapshotOptions as n, getCurrentTest as r, extractAutoSnapshotOptions as t };
88
+ //# sourceMappingURL=auto_snapshot_options-DUOTpF2N.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto_snapshot_options-DUOTpF2N.mjs","names":["vitestSuite: Awaited<typeof import('vitest/suite')>","list: any[]"],"sources":["../src/client/external/vitest/vitest_suite_proxy.ts","../src/client/task/_ctx.ts","../src/client/task/auto_snapshot_options.ts"],"sourcesContent":["import type { SnapshotTestMeta } from '../../../shared/types.ts'\n\nlet vitestSuite: Awaited<typeof import('vitest/suite')>\n\nif ((globalThis as any).__vitest_browser__) {\n\timport('vitest/suite').then((m) => {\n\t\tvitestSuite = m\n\t})\n}\n\nexport type CurrentTest = ReturnType<typeof vitestSuite.getCurrentTest> & SnapshotTestMeta\n\nexport const getCurrentTest = () => vitestSuite?.getCurrentTest() as CurrentTest\nexport const getCurrentSuite = () => vitestSuite?.getCurrentSuite()\n","import { getCurrentSuite, getCurrentTest } from '../external/vitest/vitest_suite_proxy.ts'\n\nexport const ctx = {\n\tgetCurrentTest,\n\tgetCurrentSuite,\n\t__test__reset() {\n\t\tctx.getCurrentTest = getCurrentTest\n\t\tctx.getCurrentSuite = getCurrentSuite\n\t},\n}\n","import { assertSnapshotKeyWithoutDash } from '../../shared/asserts.ts'\nimport { NAME } from '../../shared/constants.ts'\nimport type { ComparisonMethod } from '../../shared/types.ts'\nimport { ctx } from './_ctx.ts'\nimport type { SnapshotMeta } from './snapshot_meta.ts'\n\ntype Suite = { meta: Record<string, any>; suite?: Suite | undefined }\n\nexport type MetaTask =\n\t| {\n\t\t\tfile?: { meta: Record<string, any> } | undefined\n\t\t\tsuite?: Suite | undefined\n\t\t\tmeta: Record<string, any>\n\t }\n\t| undefined\n\n/**\n * Set the snapshot options for auto snapshot.\n *\n * You can use it in beforeAll, beforeEach, or individual test cases.\n *\n * @param meta - The snapshot options to set.\n * You can pass a boolean to enable/disable the snapshot, or an object with the snapshot options.\n * When passing an object, the `enable` property will be set to `true` by default unless you explicitly set it to `false`.\n * @param meta.enable - Whether to enable the snapshot.\n * @param meta.snapshotKey - The key to use for the snapshot.\n * @param meta.comparisonMethod - The comparison method to use for the snapshot.\n * @param meta.diffOptions - The diff options to use for the snapshot.\n * @param meta.failureThreshold - The failure threshold to use for the snapshot.\n * @param meta.failureThresholdType - The failure threshold type to use for the snapshot.\n * @param meta.timeout - The timeout to use for the snapshot.\n *\n * @example\n *\n * ```ts\n * beforeAll(() => setAutoSnapshotOptions(...))\n * beforeEach(() => setAutoSnapshotOptions(...))\n *\n * it('...', () => {\n * setAutoSnapshotOptions(...)\n * })\n * ```\n */\nexport function setAutoSnapshotOptions<M extends ComparisonMethod>(meta: boolean | SnapshotMeta<M>): void {\n\tif (typeof meta === 'object') {\n\t\tassertSnapshotKeyWithoutDash(meta.snapshotKey)\n\t}\n\n\tconst task = getTask()\n\tif (!task) return\n\n\ttask.meta[NAME] = {\n\t\t...task.meta[NAME],\n\t\t...parseMeta(meta),\n\t}\n}\n\nfunction getTask(): MetaTask | undefined {\n\treturn ctx.getCurrentTest() ?? (ctx.getCurrentSuite()?.tasks?.[0] as any)?.file\n}\n\nfunction parseMeta<M extends ComparisonMethod>(meta: boolean | SnapshotMeta<M>): SnapshotMeta<M> {\n\treturn typeof meta === 'boolean' ? ({ enable: meta } as any) : { enable: true, ...meta }\n}\n\nexport function extractAutoSnapshotOptions<M extends SnapshotMeta<any> = SnapshotMeta<any>>(\n\ttask: MetaTask,\n): M | undefined {\n\tif (!task) return\n\n\tconst list: any[] = []\n\tlet current = task\n\twhile (current?.suite) {\n\t\tlist.unshift(current.suite.meta)\n\t\tcurrent = current.suite\n\t}\n\tlist.unshift(task.file?.meta)\n\tlist.push(task.meta)\n\treturn list.reduce(\n\t\t(acc, cur) => {\n\t\t\tconst meta = cur?.[NAME]\n\t\t\treturn meta ? Object.assign({}, acc, meta) : acc\n\t\t},\n\t\t{ enable: false },\n\t)\n}\n"],"mappings":";;;;AAEA,IAAIA;AAEJ,IAAK,WAAmB,mBACvB,QAAO,gBAAgB,MAAM,MAAM;AAClC,eAAc;EACb;AAKH,MAAa,uBAAuB,aAAa,gBAAgB;AACjE,MAAa,wBAAwB,aAAa,iBAAiB;;;;ACXnE,MAAa,MAAM;CAClB;CACA;CACA,gBAAgB;AACf,MAAI,iBAAiB;AACrB,MAAI,kBAAkB;;CAEvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkCD,SAAgB,uBAAmD,MAAuC;AACzG,KAAI,OAAO,SAAS,SACnB,8BAA6B,KAAK,YAAY;CAG/C,MAAM,OAAO,SAAS;AACtB,KAAI,CAAC,KAAM;AAEX,MAAK,KAAK,QAAQ;EACjB,GAAG,KAAK,KAAK;EACb,GAAG,UAAU,KAAK;EAClB;;AAGF,SAAS,UAAgC;AACxC,QAAO,IAAI,gBAAgB,KAAK,IAAI,iBAAiB,EAAE,QAAQ,KAAY;;AAG5E,SAAS,UAAsC,MAAkD;AAChG,QAAO,OAAO,SAAS,YAAa,EAAE,QAAQ,MAAM,GAAW;EAAE,QAAQ;EAAM,GAAG;EAAM;;AAGzF,SAAgB,2BACf,MACgB;AAChB,KAAI,CAAC,KAAM;CAEX,MAAMC,OAAc,EAAE;CACtB,IAAI,UAAU;AACd,QAAO,SAAS,OAAO;AACtB,OAAK,QAAQ,QAAQ,MAAM,KAAK;AAChC,YAAU,QAAQ;;AAEnB,MAAK,QAAQ,KAAK,MAAM,KAAK;AAC7B,MAAK,KAAK,KAAK,KAAK;AACpB,QAAO,KAAK,QACV,KAAK,QAAQ;EACb,MAAM,OAAO,MAAM;AACnB,SAAO,OAAO,OAAO,OAAO,EAAE,EAAE,KAAK,KAAK,GAAG;IAE9C,EAAE,QAAQ,OAAO,CACjB"}
@@ -1,114 +1,11 @@
1
- import { _ as DIFF_DIR, a as ImageSnapshotKeyOptions, b as SNAPSHOT_ROOT_DIR, c as PageImageSnapshotOptions, d as SnapshotTestMeta, f as SsimComparisonOptions, g as BASELINE_DIR, h as ToMatchPageImageSnapshotOptions, i as ImageSnapshotCompareOptions, l as PixelComparisonOptions, m as ToMatchImageSnapshotOptions, n as ComparisonMethod, o as ImageSnapshotSubjectOptions, p as SsimDiffOptions, r as FailureThresholdOptions, s as ImageSnapshotTimeoutOptions, t as Awaitable, u as PixelDiffOptions, v as NAME, y as RESULT_DIR } from "./types-DFb23VE1.mjs";
2
- import "./vis_server_context.types-Ce1f9vOO.mjs";
3
- import "./types-Do1N7g4c.mjs";
4
- import { t as SetupVisSuiteCommand } from "./setup_vis_suite-C6JGGT7B.mjs";
5
- import { n as setAutoSnapshotOptions, t as MetaTask } from "./auto_snapshot_options-CaQCXDdi.mjs";
6
- import { t as ImageSnapshotMatcher } from "./to_match_image_snapshot.types-p-zilA_M.mjs";
1
+ import { C as SNAPSHOT_ROOT_DIR, S as RESULT_DIR, _ as ToMatchImageSnapshotOptions, a as ImageSnapshotComparisonInfo, b as DIFF_DIR, c as ImageSnapshotTimeoutOptions, d as PixelComparisonOptions, f as PixelDiffOptions, g as SsimDiffOptions, h as SsimComparisonOptions, i as ImageSnapshotCompareOptions, l as MatchImageSnapshotOptions, m as SnapshotTestMeta, n as ComparisonMethod, o as ImageSnapshotKeyOptions, p as SetupVisOptions, r as FailureThresholdOptions, s as ImageSnapshotSubjectOptions, t as Awaitable, u as PageImageSnapshotOptions, v as ToMatchPageImageSnapshotOptions, w as SnapshotMeta, x as NAME, y as BASELINE_DIR } from "./types-CEmjj-A9.mjs";
2
+ import "./types-DJYCbyT8.mjs";
3
+ import { a as PrepareImageSnapshotComparisonCommand, i as LoadImageSnapshotResultsCommand, n as ImageSnapshotNextIndexCommand, o as PreparePageImageSnapshotComparisonCommand, r as ImageSnapshotResult, s as SetupVisSuiteCommand, t as HasImageSnapshotCommand } from "./commands.types-BVhcnnHw.mjs";
4
+ import { t as ImageSnapshotMatcher } from "./to_match_image_snapshot.types--tTmHoRA.mjs";
5
+ import { n as setAutoSnapshotOptions, t as MetaTask } from "./auto_snapshot_options-BMRtKmod.mjs";
7
6
  import { BrowserCommands } from "vitest/browser";
8
7
  import { SyncExpectationResult } from "@vitest/expect";
9
8
 
10
- //#region src/server/commands/has_image_snapshot.d.ts
11
- interface HasImageSnapshotCommand {
12
- hasImageSnapshot(taskId: string, snapshotKey: string | undefined): Promise<boolean>;
13
- }
14
- //#endregion
15
- //#region src/server/commands/image_snapshot_next_index.d.ts
16
- interface ImageSnapshotNextIndexCommand {
17
- /**
18
- * Get the index of the snapshot image to be created.
19
- */
20
- imageSnapshotNextIndex(taskId: string): Promise<number>;
21
- }
22
- //#endregion
23
- //#region src/server/commands/load_image_snapshot_results.d.ts
24
- interface ImageSnapshotResult {
25
- filename: string;
26
- /**
27
- * The base64 encoded image of the baseline snapshot.
28
- */
29
- baseline?: string | undefined;
30
- /**
31
- * The base64 encoded image of the result snapshot.
32
- */
33
- result?: string | undefined;
34
- /**
35
- * The base64 encoded image of the diff snapshot.
36
- */
37
- diff?: string | undefined;
38
- }
39
- interface LoadImageSnapshotResultsCommand {
40
- loadImageSnapshotResults(taskId: string): Promise<ImageSnapshotResult[]>;
41
- }
42
- //#endregion
43
- //#region src/server/commands/types.d.ts
44
- type MatchImageSnapshotOptions = ImageSnapshotTimeoutOptions & ImageSnapshotCompareOptions<any> & ImageSnapshotKeyOptions;
45
- //#endregion
46
- //#region src/server/commands/prepare_image_snapshot_comparison.d.ts
47
- type ImageSnapshotComparisonInfo$1 = {
48
- /**
49
- * Path to the project root.
50
- */
51
- projectRoot: string;
52
- /**
53
- * Path to the baseline image relative to the project root.
54
- */
55
- baselinePath: string;
56
- /**
57
- * Path to the result image relative to the project root.
58
- */
59
- resultPath: string;
60
- /**
61
- * Path to the diff image relative to the project root.
62
- */
63
- diffPath: string;
64
- /**
65
- * Base64 encoded baseline image.
66
- */
67
- baseline: string;
68
- /**
69
- * Base64 encoded result image.
70
- */
71
- result: string;
72
- /**
73
- * Base64 encoded diff image.
74
- */
75
- diff?: string | undefined;
76
- } & ImageSnapshotTimeoutOptions & FailureThresholdOptions & (SsimComparisonOptions | PixelComparisonOptions);
77
- interface PrepareImageSnapshotComparisonCommand {
78
- prepareImageSnapshotComparison: (taskId: string, subject: string, options?: MatchImageSnapshotOptions | undefined) => Promise<ImageSnapshotComparisonInfo$1 | undefined>;
79
- }
80
- //#endregion
81
- //#region src/server/commands/prepare_page_image_snapshot_comparison.d.ts
82
- type ImageSnapshotComparisonInfo = {
83
- /**
84
- * Path to the project root.
85
- */
86
- projectRoot: string;
87
- /**
88
- * Path to the baseline image relative to the project root.
89
- */
90
- baselinePath: string;
91
- /**
92
- * Path to the result image relative to the project root.
93
- */
94
- resultPath: string;
95
- /**
96
- * Path to the diff image relative to the project root.
97
- */
98
- diffPath: string;
99
- /**
100
- * Base64 encoded baseline image.
101
- */
102
- baseline: string;
103
- /**
104
- * Base64 encoded result image.
105
- */
106
- result: string;
107
- } & ImageSnapshotTimeoutOptions & FailureThresholdOptions & (SsimComparisonOptions | PixelComparisonOptions);
108
- interface PreparePageImageSnapshotComparisonCommand {
109
- preparePageImageSnapshotComparison: (taskId: string, options?: MatchImageSnapshotOptions | undefined) => Promise<ImageSnapshotComparisonInfo | undefined>;
110
- }
111
- //#endregion
112
9
  //#region src/server/commands/augment.d.ts
113
10
  declare module 'vitest/browser' {
114
11
  interface BrowserCommands extends SetupVisSuiteCommand, ImageSnapshotNextIndexCommand, HasImageSnapshotCommand, PreparePageImageSnapshotComparisonCommand, PrepareImageSnapshotComparisonCommand, LoadImageSnapshotResultsCommand {}
@@ -130,12 +27,18 @@ declare function matchPageImageSnapshotAction(commands: BrowserCommands & Prepar
130
27
  //#region src/client/expect/expectation_result.d.ts
131
28
  declare const success: SyncExpectationResult;
132
29
  //#endregion
133
- //#region src/client/task_id.d.ts
30
+ //#region src/client/suite/auto_snapshot_matcher.d.ts
31
+ declare function autoSnapshotMatcher<GM extends Record<string, any> | unknown = unknown>(commands: SetupVisSuiteCommand, expect: any): {
32
+ setup(): Promise<void>;
33
+ createMatcher<C extends ComparisonMethod, M extends Record<string, any> | unknown = unknown>(themes: Record<string, boolean | ((options: SnapshotMeta<C> & M & GM) => Promise<boolean> | Promise<void> | boolean | void)>): () => Promise<void>;
34
+ };
35
+ //#endregion
36
+ //#region src/client/task/task_id.d.ts
134
37
  type Task = {
135
38
  name: string;
136
39
  suite?: Task | undefined;
137
40
  };
138
41
  declare function toTaskId(task: Task): string;
139
42
  //#endregion
140
- export { Awaitable, BASELINE_DIR, ComparisonMethod, DIFF_DIR, FailureThresholdOptions, ImageSnapshotCompareOptions, ImageSnapshotKeyOptions, ImageSnapshotMatcher, ImageSnapshotSubjectOptions, ImageSnapshotTimeoutOptions, type MetaTask, NAME, PageImageSnapshotOptions, PixelComparisonOptions, PixelDiffOptions, RESULT_DIR, SNAPSHOT_ROOT_DIR, SnapshotTestMeta, SsimComparisonOptions, SsimDiffOptions, ToMatchImageSnapshotOptions, ToMatchPageImageSnapshotOptions, hasImageSnapshotAction, loadImageSnapshotResultsAction, matchImageSnapshotAction, matchPageImageSnapshotAction, setAutoSnapshotOptions, success, toTaskId };
43
+ export { Awaitable, BASELINE_DIR, ComparisonMethod, DIFF_DIR, FailureThresholdOptions, ImageSnapshotCompareOptions, ImageSnapshotComparisonInfo, ImageSnapshotKeyOptions, ImageSnapshotMatcher, ImageSnapshotSubjectOptions, ImageSnapshotTimeoutOptions, MatchImageSnapshotOptions, type MetaTask, NAME, PageImageSnapshotOptions, PixelComparisonOptions, PixelDiffOptions, RESULT_DIR, SNAPSHOT_ROOT_DIR, SetupVisOptions, SnapshotTestMeta, SsimComparisonOptions, SsimDiffOptions, ToMatchImageSnapshotOptions, ToMatchPageImageSnapshotOptions, autoSnapshotMatcher, hasImageSnapshotAction, loadImageSnapshotResultsAction, matchImageSnapshotAction, matchPageImageSnapshotAction, setAutoSnapshotOptions, success, toTaskId };
141
44
  //# sourceMappingURL=client-api.d.mts.map