vitest-plugin-vis 3.5.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/asserts--HSSlgPD.mjs +8 -0
- package/dist/asserts--HSSlgPD.mjs.map +1 -0
- package/dist/augment-BJmy1S7i.d.mts +31 -0
- package/dist/augment-BJmy1S7i.d.mts.map +1 -0
- package/dist/auto_snapshot_options-CAD43Zkp.mjs +90 -0
- package/dist/auto_snapshot_options-CAD43Zkp.mjs.map +1 -0
- package/dist/auto_snapshot_options-CaQCXDdi.d.mts +45 -0
- package/dist/auto_snapshot_options-CaQCXDdi.d.mts.map +1 -0
- package/dist/base64-CHSENEAO.mjs +8 -0
- package/dist/base64-CHSENEAO.mjs.map +1 -0
- package/dist/client-api.d.mts +141 -0
- package/dist/client-api.d.mts.map +1 -0
- package/dist/client-api.mjs +14 -0
- package/dist/client-api.mjs.map +1 -0
- package/dist/config.d.mts +28 -0
- package/dist/config.d.mts.map +1 -0
- package/dist/config.mjs +412 -0
- package/dist/config.mjs.map +1 -0
- package/dist/constants-CTBaz8Ml.mjs +10 -0
- package/dist/constants-CTBaz8Ml.mjs.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.mjs +6 -0
- package/dist/presets/auto.d.mts +1 -0
- package/dist/presets/auto.mjs +19 -0
- package/dist/presets/auto.mjs.map +1 -0
- package/dist/presets/enable.d.mts +1 -0
- package/dist/presets/enable.mjs +15 -0
- package/dist/presets/enable.mjs.map +1 -0
- package/dist/presets/manual.d.mts +1 -0
- package/dist/presets/manual.mjs +15 -0
- package/dist/presets/manual.mjs.map +1 -0
- package/dist/server-utils.d.mts +19 -0
- package/dist/server-utils.d.mts.map +1 -0
- package/dist/server-utils.mjs +4 -0
- package/dist/setup-BWgIDtv-.mjs +141 -0
- package/dist/setup-BWgIDtv-.mjs.map +1 -0
- package/dist/setup.d.mts +110 -0
- package/dist/setup.d.mts.map +1 -0
- package/dist/setup.mjs +8 -0
- package/dist/setup_vis_suite-C6JGGT7B.d.mts +17 -0
- package/dist/setup_vis_suite-C6JGGT7B.d.mts.map +1 -0
- package/dist/snapshot_path-7GliOSH_.mjs +58 -0
- package/dist/snapshot_path-7GliOSH_.mjs.map +1 -0
- package/dist/src-CSQnlFa9.mjs +1 -0
- package/dist/task_id-DnS9_4Ub.mjs +316 -0
- package/dist/task_id-DnS9_4Ub.mjs.map +1 -0
- package/dist/testing.d.mts +12 -0
- package/dist/testing.d.mts.map +1 -0
- package/dist/testing.mjs +65550 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/to_match_image_snapshot.types-p-zilA_M.d.mts +9 -0
- package/dist/to_match_image_snapshot.types-p-zilA_M.d.mts.map +1 -0
- package/dist/trim_common_folder-ModiubEJ.d.mts +9 -0
- package/dist/trim_common_folder-ModiubEJ.d.mts.map +1 -0
- package/dist/types-DFb23VE1.d.mts +110 -0
- package/dist/types-DFb23VE1.d.mts.map +1 -0
- package/dist/types-Do1N7g4c.d.mts +63 -0
- package/dist/types-Do1N7g4c.d.mts.map +1 -0
- package/dist/vis_server_context.types-Ce1f9vOO.d.mts +1 -0
- package/package.json +55 -39
- package/readme.md +58 -6
- package/src/client/actions/match_image_snapshot_action.ts +1 -1
- package/src/client/actions/match_page_image_snapshot_action.ts +1 -1
- package/src/client/auto_snapshot_options.ts +16 -1
- package/src/client/compare_image_snapshot.ts +1 -1
- package/src/client/expect/to_match_image_snapshot.ts +1 -1
- package/src/client/page/extend.ts +1 -1
- package/src/client/page/has_image_snapshot.mdx +1 -1
- package/src/client/page/has_image_snapshot.ts +1 -1
- package/src/client/page/to_match_image_snapshot.mdx +1 -1
- package/src/client/page/to_match_image_snapshot.ts +1 -1
- package/src/client/setup/create_vis.ts +16 -14
- package/src/client/setup/vis.ctx.ts +4 -3
- package/src/client/setup/vis.ts +1 -1
- package/src/client/snapshot_meta.ts +5 -0
- package/src/client/vitest_browser_context_proxy.ts +3 -3
- package/src/config/vis.ts +4 -4
- package/src/server/browser_provider/browser_api.ts +2 -2
- package/src/server/browser_provider/playwright.ts +6 -4
- package/src/server/browser_provider/webdriverio.ts +3 -3
- package/src/server/commands/_assertions.ts +3 -3
- package/src/server/commands/augment.ts +1 -1
- package/src/server/commands/has_image_snapshot.ts +2 -2
- package/src/server/commands/image_snapshot_next_index.ts +2 -2
- package/src/server/commands/load_image_snapshot_results.ts +2 -3
- package/src/server/commands/prepare_image_snapshot_comparison.ts +2 -2
- package/src/server/commands/prepare_page_image_snapshot_comparison.ts +2 -2
- package/src/server/commands/setup_vis_suite.ts +3 -3
- package/src/server/project.ts +8 -7
- package/src/server/snapshot.ts +4 -4
- package/src/server/snapshot_path.ts +6 -5
- package/src/server/suite.ts +7 -12
- package/src/server/testing/stubBrowserCommandContext.ts +16 -0
- package/src/{testing → server/testing}/stubSuite.ts +7 -9
- package/src/server/testing/stubUserConfig.ts +6 -0
- package/src/server/vis_options.ts +4 -5
- package/src/server/vis_server_context.logic.ts +7 -7
- package/src/server/vis_server_context.types.ts +31 -26
- package/src/shared/types.ts +2 -0
- package/src/testing.ts +0 -1
- package/esm/client/actions/has_image_snapshot_action.d.ts +0 -4
- package/esm/client/actions/has_image_snapshot_action.d.ts.map +0 -1
- package/esm/client/actions/has_image_snapshot_action.js +0 -6
- package/esm/client/actions/load_image_snapshot_results_action.d.ts +0 -3
- package/esm/client/actions/load_image_snapshot_results_action.d.ts.map +0 -1
- package/esm/client/actions/load_image_snapshot_results_action.js +0 -3
- package/esm/client/actions/match_image_snapshot_action.d.ts +0 -6
- package/esm/client/actions/match_image_snapshot_action.d.ts.map +0 -1
- package/esm/client/actions/match_image_snapshot_action.js +0 -20
- package/esm/client/actions/match_page_image_snapshot_action.d.ts +0 -6
- package/esm/client/actions/match_page_image_snapshot_action.d.ts.map +0 -1
- package/esm/client/actions/match_page_image_snapshot_action.js +0 -9
- package/esm/client/align_images.d.ts +0 -2
- package/esm/client/align_images.d.ts.map +0 -1
- package/esm/client/align_images.js +0 -10
- package/esm/client/auto_snapshot_options.d.ts +0 -29
- package/esm/client/auto_snapshot_options.d.ts.map +0 -1
- package/esm/client/auto_snapshot_options.js +0 -49
- package/esm/client/compare_image_snapshot.d.ts +0 -6
- package/esm/client/compare_image_snapshot.d.ts.map +0 -1
- package/esm/client/compare_image_snapshot.js +0 -52
- package/esm/client/compare_image_snapshot.logic.d.ts +0 -3
- package/esm/client/compare_image_snapshot.logic.d.ts.map +0 -1
- package/esm/client/compare_image_snapshot.logic.js +0 -12
- package/esm/client/ctx.d.ts +0 -7
- package/esm/client/ctx.d.ts.map +0 -1
- package/esm/client/ctx.js +0 -11
- package/esm/client/expect/augment.d.ts +0 -8
- package/esm/client/expect/augment.d.ts.map +0 -1
- package/esm/client/expect/augment.js +0 -1
- package/esm/client/expect/expectation_result.d.ts +0 -3
- package/esm/client/expect/expectation_result.d.ts.map +0 -1
- package/esm/client/expect/expectation_result.js +0 -5
- package/esm/client/expect/extend.d.ts +0 -2
- package/esm/client/expect/extend.d.ts.map +0 -1
- package/esm/client/expect/extend.js +0 -4
- package/esm/client/expect/to_match_image_snapshot.d.ts +0 -9
- package/esm/client/expect/to_match_image_snapshot.d.ts.map +0 -1
- package/esm/client/expect/to_match_image_snapshot.js +0 -21
- package/esm/client/expect/to_match_image_snapshot.types.d.ts +0 -5
- package/esm/client/expect/to_match_image_snapshot.types.d.ts.map +0 -1
- package/esm/client/expect/to_match_image_snapshot.types.js +0 -1
- package/esm/client/image_data.d.ts +0 -3
- package/esm/client/image_data.d.ts.map +0 -1
- package/esm/client/image_data.js +0 -33
- package/esm/client/image_resizer.d.ts +0 -9
- package/esm/client/image_resizer.d.ts.map +0 -1
- package/esm/client/image_resizer.js +0 -49
- package/esm/client/image_snapshot_options.d.ts +0 -2
- package/esm/client/image_snapshot_options.d.ts.map +0 -1
- package/esm/client/image_snapshot_options.js +0 -6
- package/esm/client/page/augment.d.ts +0 -7
- package/esm/client/page/augment.d.ts.map +0 -1
- package/esm/client/page/augment.js +0 -1
- package/esm/client/page/extend.d.ts +0 -2
- package/esm/client/page/extend.d.ts.map +0 -1
- package/esm/client/page/extend.js +0 -5
- package/esm/client/page/has_image_snapshot.d.ts +0 -10
- package/esm/client/page/has_image_snapshot.d.ts.map +0 -1
- package/esm/client/page/has_image_snapshot.js +0 -15
- package/esm/client/page/to_match_image_snapshot.d.ts +0 -6
- package/esm/client/page/to_match_image_snapshot.d.ts.map +0 -1
- package/esm/client/page/to_match_image_snapshot.js +0 -15
- package/esm/client/selector.d.ts +0 -7
- package/esm/client/selector.d.ts.map +0 -1
- package/esm/client/selector.js +0 -97
- package/esm/client/setup/create_vis.d.ts +0 -96
- package/esm/client/setup/create_vis.d.ts.map +0 -1
- package/esm/client/setup/create_vis.js +0 -109
- package/esm/client/setup/vis.ctx.d.ts +0 -12
- package/esm/client/setup/vis.ctx.d.ts.map +0 -1
- package/esm/client/setup/vis.ctx.js +0 -32
- package/esm/client/setup/vis.d.ts +0 -5
- package/esm/client/setup/vis.d.ts.map +0 -1
- package/esm/client/setup/vis.js +0 -6
- package/esm/client/should_take_snapshot.d.ts +0 -3
- package/esm/client/should_take_snapshot.d.ts.map +0 -1
- package/esm/client/should_take_snapshot.js +0 -3
- package/esm/client/snapshot_meta.d.ts +0 -6
- package/esm/client/snapshot_meta.d.ts.map +0 -1
- package/esm/client/snapshot_meta.js +0 -1
- package/esm/client/task_id.d.ts +0 -7
- package/esm/client/task_id.d.ts.map +0 -1
- package/esm/client/task_id.js +0 -10
- package/esm/client/vitest_browser_context_proxy.d.ts +0 -32
- package/esm/client/vitest_browser_context_proxy.d.ts.map +0 -1
- package/esm/client/vitest_browser_context_proxy.js +0 -11
- package/esm/client/vitest_suite_proxy.d.ts +0 -7
- package/esm/client/vitest_suite_proxy.d.ts.map +0 -1
- package/esm/client/vitest_suite_proxy.js +0 -8
- package/esm/client-api.d.ts +0 -12
- package/esm/client-api.d.ts.map +0 -1
- package/esm/client-api.js +0 -9
- package/esm/commands.d.ts +0 -5
- package/esm/commands.d.ts.map +0 -1
- package/esm/commands.js +0 -4
- package/esm/config/types.d.ts +0 -60
- package/esm/config/types.d.ts.map +0 -1
- package/esm/config/types.js +0 -1
- package/esm/config/vis.d.ts +0 -28
- package/esm/config/vis.d.ts.map +0 -1
- package/esm/config/vis.js +0 -27
- package/esm/config.d.ts +0 -4
- package/esm/config.d.ts.map +0 -1
- package/esm/config.js +0 -2
- package/esm/index.d.ts +0 -5
- package/esm/index.d.ts.map +0 -1
- package/esm/index.js +0 -4
- package/esm/presets/auto.d.ts +0 -2
- package/esm/presets/auto.d.ts.map +0 -1
- package/esm/presets/auto.js +0 -8
- package/esm/presets/enable.d.ts +0 -2
- package/esm/presets/enable.d.ts.map +0 -1
- package/esm/presets/enable.js +0 -4
- package/esm/presets/manual.d.ts +0 -2
- package/esm/presets/manual.d.ts.map +0 -1
- package/esm/presets/manual.js +0 -4
- package/esm/server/browser_provider/browser_api.d.ts +0 -3
- package/esm/server/browser_provider/browser_api.d.ts.map +0 -1
- package/esm/server/browser_provider/browser_api.js +0 -11
- package/esm/server/browser_provider/playwright.d.ts +0 -4
- package/esm/server/browser_provider/playwright.d.ts.map +0 -1
- package/esm/server/browser_provider/playwright.js +0 -18
- package/esm/server/browser_provider/types.d.ts +0 -10
- package/esm/server/browser_provider/types.d.ts.map +0 -1
- package/esm/server/browser_provider/types.js +0 -1
- package/esm/server/browser_provider/webdriverio.d.ts +0 -4
- package/esm/server/browser_provider/webdriverio.d.ts.map +0 -1
- package/esm/server/browser_provider/webdriverio.js +0 -12
- package/esm/server/commands/_assertions.d.ts +0 -5
- package/esm/server/commands/_assertions.d.ts.map +0 -1
- package/esm/server/commands/_assertions.js +0 -11
- package/esm/server/commands/augment.d.ts +0 -11
- package/esm/server/commands/augment.d.ts.map +0 -1
- package/esm/server/commands/augment.js +0 -1
- package/esm/server/commands/commands.d.ts +0 -9
- package/esm/server/commands/commands.d.ts.map +0 -1
- package/esm/server/commands/commands.js +0 -14
- package/esm/server/commands/has_image_snapshot.d.ts +0 -6
- package/esm/server/commands/has_image_snapshot.d.ts.map +0 -1
- package/esm/server/commands/has_image_snapshot.js +0 -6
- package/esm/server/commands/image_snapshot_next_index.d.ts +0 -9
- package/esm/server/commands/image_snapshot_next_index.d.ts.map +0 -1
- package/esm/server/commands/image_snapshot_next_index.js +0 -6
- package/esm/server/commands/load_image_snapshot_results.d.ts +0 -21
- package/esm/server/commands/load_image_snapshot_results.d.ts.map +0 -1
- package/esm/server/commands/load_image_snapshot_results.js +0 -6
- package/esm/server/commands/prepare_image_snapshot_comparison.d.ts +0 -38
- package/esm/server/commands/prepare_image_snapshot_comparison.d.ts.map +0 -1
- package/esm/server/commands/prepare_image_snapshot_comparison.js +0 -34
- package/esm/server/commands/prepare_page_image_snapshot_comparison.d.ts +0 -35
- package/esm/server/commands/prepare_page_image_snapshot_comparison.d.ts.map +0 -1
- package/esm/server/commands/prepare_page_image_snapshot_comparison.js +0 -27
- package/esm/server/commands/setup_vis_suite.d.ts +0 -15
- package/esm/server/commands/setup_vis_suite.d.ts.map +0 -1
- package/esm/server/commands/setup_vis_suite.js +0 -6
- package/esm/server/commands/types.d.ts +0 -3
- package/esm/server/commands/types.d.ts.map +0 -1
- package/esm/server/commands/types.js +0 -1
- package/esm/server/externals/file.d.ts +0 -10
- package/esm/server/externals/file.d.ts.map +0 -1
- package/esm/server/externals/file.js +0 -20
- package/esm/server/project.d.ts +0 -21
- package/esm/server/project.d.ts.map +0 -1
- package/esm/server/project.js +0 -13
- package/esm/server/snapshot.d.ts +0 -6
- package/esm/server/snapshot.d.ts.map +0 -1
- package/esm/server/snapshot.js +0 -29
- package/esm/server/snapshot_path.d.ts +0 -14
- package/esm/server/snapshot_path.d.ts.map +0 -1
- package/esm/server/snapshot_path.js +0 -34
- package/esm/server/snapshot_writer.d.ts +0 -13
- package/esm/server/snapshot_writer.d.ts.map +0 -1
- package/esm/server/snapshot_writer.js +0 -15
- package/esm/server/suite.d.ts +0 -54
- package/esm/server/suite.d.ts.map +0 -1
- package/esm/server/suite.js +0 -73
- package/esm/server/vis_options.d.ts +0 -19
- package/esm/server/vis_options.d.ts.map +0 -1
- package/esm/server/vis_options.js +0 -14
- package/esm/server/vis_server_context.d.ts +0 -50
- package/esm/server/vis_server_context.d.ts.map +0 -1
- package/esm/server/vis_server_context.deps.d.ts +0 -29
- package/esm/server/vis_server_context.deps.d.ts.map +0 -1
- package/esm/server/vis_server_context.deps.js +0 -10
- package/esm/server/vis_server_context.js +0 -2
- package/esm/server/vis_server_context.logic.d.ts +0 -53
- package/esm/server/vis_server_context.logic.d.ts.map +0 -1
- package/esm/server/vis_server_context.logic.js +0 -79
- package/esm/server/vis_server_context.types.d.ts +0 -54
- package/esm/server/vis_server_context.types.d.ts.map +0 -1
- package/esm/server/vis_server_context.types.js +0 -1
- package/esm/server-utils.d.ts +0 -4
- package/esm/server-utils.d.ts.map +0 -1
- package/esm/server-utils.js +0 -3
- package/esm/setup.d.ts +0 -5
- package/esm/setup.d.ts.map +0 -1
- package/esm/setup.js +0 -5
- package/esm/shared/asserts.d.ts +0 -2
- package/esm/shared/asserts.d.ts.map +0 -1
- package/esm/shared/asserts.js +0 -5
- package/esm/shared/base64.d.ts +0 -2
- package/esm/shared/base64.d.ts.map +0 -1
- package/esm/shared/base64.js +0 -3
- package/esm/shared/compare_image.d.ts +0 -6
- package/esm/shared/compare_image.d.ts.map +0 -1
- package/esm/shared/compare_image.js +0 -42
- package/esm/shared/constants.d.ts +0 -6
- package/esm/shared/constants.d.ts.map +0 -1
- package/esm/shared/constants.js +0 -5
- package/esm/shared/convert_threshold_unit.d.ts +0 -6
- package/esm/shared/convert_threshold_unit.d.ts.map +0 -1
- package/esm/shared/convert_threshold_unit.js +0 -10
- package/esm/shared/get_max_size.d.ts +0 -11
- package/esm/shared/get_max_size.d.ts.map +0 -1
- package/esm/shared/get_max_size.js +0 -5
- package/esm/shared/is_same_size.d.ts +0 -8
- package/esm/shared/is_same_size.d.ts.map +0 -1
- package/esm/shared/is_same_size.js +0 -3
- package/esm/shared/trim_common_folder.d.ts +0 -6
- package/esm/shared/trim_common_folder.d.ts.map +0 -1
- package/esm/shared/trim_common_folder.js +0 -11
- package/esm/shared/types.d.ts +0 -90
- package/esm/shared/types.d.ts.map +0 -1
- package/esm/shared/types.js +0 -1
- package/esm/testing/constants.d.ts +0 -9
- package/esm/testing/constants.d.ts.map +0 -1
- package/esm/testing/constants.js +0 -1933
- package/esm/testing/stubBrowserCommandContext.d.ts +0 -8
- package/esm/testing/stubBrowserCommandContext.d.ts.map +0 -1
- package/esm/testing/stubBrowserCommandContext.js +0 -12
- package/esm/testing/stubSuite.d.ts +0 -10
- package/esm/testing/stubSuite.d.ts.map +0 -1
- package/esm/testing/stubSuite.js +0 -27
- package/esm/testing/stubUserConfig.d.ts +0 -7
- package/esm/testing/stubUserConfig.d.ts.map +0 -1
- package/esm/testing/stubUserConfig.js +0 -4
- package/esm/testing.d.ts +0 -3
- package/esm/testing.d.ts.map +0 -1
- package/esm/testing.js +0 -2
- package/src/testing/stubBrowserCommandContext.ts +0 -16
- package/src/testing/stubUserConfig.ts +0 -6
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { t as assertSnapshotKeyWithoutDash } from "./asserts--HSSlgPD.mjs";
|
|
2
|
+
import { t as isBase64String } from "./base64-CHSENEAO.mjs";
|
|
3
|
+
import { resolve } from "pathe";
|
|
4
|
+
import dedent from "dedent";
|
|
5
|
+
import pixelMatch from "pixelmatch";
|
|
6
|
+
import { ssim } from "ssim.js";
|
|
7
|
+
|
|
8
|
+
//#region src/client/actions/has_image_snapshot_action.ts
|
|
9
|
+
function hasImageSnapshotAction(commands, taskId, options) {
|
|
10
|
+
if (options?.snapshotKey?.includes("-")) throw new Error("Snapshot key cannot contain dash");
|
|
11
|
+
return commands.hasImageSnapshot(taskId, options?.snapshotKey);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
//#region src/shared/convert_threshold_unit.ts
|
|
16
|
+
function convertThresholdUnit({ failureThresholdType, width, height }, pixelDiff) {
|
|
17
|
+
switch (failureThresholdType) {
|
|
18
|
+
case "pixel": return pixelDiff;
|
|
19
|
+
case "percent": return pixelDiff / (width * height) * 100;
|
|
20
|
+
default: throw new Error(`Unsupported failureThresholdType: ${failureThresholdType}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/shared/compare_image.ts
|
|
26
|
+
function compareImage(img1, img2, output, width, height, options = {}) {
|
|
27
|
+
const pixelDiff = options.comparisonMethod === "ssim" ? compareWithSsim(img1, img2, output, width, height, options.diffOptions) : pixelMatch(img1, img2, output, width, height, options.diffOptions);
|
|
28
|
+
const diffAmount = convertThresholdUnit({
|
|
29
|
+
failureThresholdType: options.failureThresholdType ?? "pixel",
|
|
30
|
+
width,
|
|
31
|
+
height
|
|
32
|
+
}, pixelDiff);
|
|
33
|
+
return {
|
|
34
|
+
pass: diffAmount <= (options.failureThreshold ?? 0),
|
|
35
|
+
diffAmount
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @author This code is based on `jest-image-snapshot` implementation.
|
|
40
|
+
*/
|
|
41
|
+
function compareWithSsim(img1, img2, output, width, height, diffOptions) {
|
|
42
|
+
const { ssim_map, mssim } = ssim({
|
|
43
|
+
data: img1,
|
|
44
|
+
width,
|
|
45
|
+
height
|
|
46
|
+
}, {
|
|
47
|
+
data: img2,
|
|
48
|
+
width,
|
|
49
|
+
height
|
|
50
|
+
}, {
|
|
51
|
+
ssim: "bezkrovny",
|
|
52
|
+
...diffOptions
|
|
53
|
+
});
|
|
54
|
+
const diffPixels = Math.round((1 - mssim) * width * height);
|
|
55
|
+
const diffRgbaPixels = new DataView(output.buffer, output.byteOffset);
|
|
56
|
+
for (let ln = 0; ln !== height; ++ln) for (let pos = 0; pos !== width; ++pos) {
|
|
57
|
+
const rPos = ln * width + pos;
|
|
58
|
+
const diffValue = 4278190080 + Math.floor(255 * (1 - ssim_map.data[ssim_map.width * Math.round(ssim_map.height * ln / height) + Math.round(ssim_map.width * pos / width)]));
|
|
59
|
+
diffRgbaPixels.setUint32(rPos * 4, diffValue);
|
|
60
|
+
}
|
|
61
|
+
return diffPixels;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/shared/get_max_size.ts
|
|
66
|
+
function getMaxSize(image1, image2) {
|
|
67
|
+
return {
|
|
68
|
+
width: Math.max(image1.width, image2.width),
|
|
69
|
+
height: Math.max(image1.height, image2.height)
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/shared/is_same_size.ts
|
|
75
|
+
function isSameSize(image1, image2) {
|
|
76
|
+
return image1.width === image2.width && image1.height === image2.height;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/client/image_resizer.ts
|
|
81
|
+
const createImageResizer = ({ width, height }) => (image) => {
|
|
82
|
+
if (isSameSize(image, {
|
|
83
|
+
width,
|
|
84
|
+
height
|
|
85
|
+
})) return image;
|
|
86
|
+
const inArea = (x, y) => y <= image.height && x <= image.width;
|
|
87
|
+
const data = new Uint8ClampedArray(width * height * 4);
|
|
88
|
+
const result = new ImageData(data, width, height, { colorSpace: image.colorSpace });
|
|
89
|
+
for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) {
|
|
90
|
+
const idx = width * y + x << 2;
|
|
91
|
+
if (inArea(x, y)) {
|
|
92
|
+
const old = image.width * y + x << 2;
|
|
93
|
+
result.data[idx] = image.data[old];
|
|
94
|
+
result.data[idx + 1] = image.data[old + 1];
|
|
95
|
+
result.data[idx + 2] = image.data[old + 2];
|
|
96
|
+
result.data[idx + 3] = image.data[old + 3];
|
|
97
|
+
} else {
|
|
98
|
+
result.data[idx] = 0;
|
|
99
|
+
result.data[idx + 1] = 0;
|
|
100
|
+
result.data[idx + 2] = 0;
|
|
101
|
+
result.data[idx + 3] = 64;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
//#endregion
|
|
108
|
+
//#region src/client/align_images.ts
|
|
109
|
+
function alignImagesToSameSize(image1, image2) {
|
|
110
|
+
if (isSameSize(image1, image2)) return [image1, image2];
|
|
111
|
+
const resize = createImageResizer(getMaxSize(image1, image2));
|
|
112
|
+
return [resize(image1), resize(image2)];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
//#endregion
|
|
116
|
+
//#region src/client/compare_image_snapshot.logic.ts
|
|
117
|
+
function prettifyOptions(options) {
|
|
118
|
+
if (!options) return "none";
|
|
119
|
+
return [
|
|
120
|
+
`failureThreshold: ${options.failureThreshold ?? 0} ${options.failureThresholdType ?? "pixels"}`,
|
|
121
|
+
options.timeout ? `timeout: ${options.timeout} ms` : "",
|
|
122
|
+
`comparisonMethod: ${options.comparisonMethod ?? "pixel"}`,
|
|
123
|
+
options.diffOptions ? `diffOptions: ${JSON.stringify(options.diffOptions)}` : ""
|
|
124
|
+
].filter(Boolean).join("\n ");
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
//#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
|
|
174
|
+
async function compareImageSnapshot(commands, taskId, info, options) {
|
|
175
|
+
options = {
|
|
176
|
+
...info,
|
|
177
|
+
...options
|
|
178
|
+
};
|
|
179
|
+
const baselineImage = await toImageData(info.baseline);
|
|
180
|
+
const resultImage = await toImageData(info.result);
|
|
181
|
+
const [baselineAlignedImage, resultAlignedImage] = alignImagesToSameSize(baselineImage, resultImage);
|
|
182
|
+
const { width, height } = baselineAlignedImage;
|
|
183
|
+
const diffImage = new ImageData(width, height);
|
|
184
|
+
const { pass, diffAmount } = compareImage(baselineAlignedImage.data, resultAlignedImage.data, diffImage.data, width, height, options);
|
|
185
|
+
if (pass) {
|
|
186
|
+
if (options?.expectToFail) throw new Error(dedent`Snapshot \`${taskId}\` matched but expected to fail.
|
|
187
|
+
|
|
188
|
+
Options: ${prettifyOptions(options)}
|
|
189
|
+
Diff: ${options.failureThresholdType === "percent" ? `${diffAmount}%` : `${diffAmount} pixels`}
|
|
190
|
+
|
|
191
|
+
Expected: ${resolve(info.projectRoot, info.baselinePath)}
|
|
192
|
+
Actual: ${resolve(info.projectRoot, info.resultPath)}`);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (server.config.snapshotOptions.updateSnapshot === "all" && !options?.expectToFail) {
|
|
196
|
+
await writeSnapshot(commands, resolve(info.projectRoot, info.baselinePath), resultImage);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
await writeSnapshot(commands, resolve(info.projectRoot, info.diffPath), diffImage);
|
|
200
|
+
throw new Error(dedent`Snapshot \`${taskId}\` mismatched
|
|
201
|
+
|
|
202
|
+
${options?.failureThreshold ? options?.failureThresholdType === "percent" ? `Expected image to match within ${options.failureThreshold}% but was differ by ${diffAmount}%.` : `Expected image to match within ${options.failureThreshold} pixels but was differ by ${diffAmount} pixels.` : `Expected image to match but was differ by ${options?.failureThresholdType === "percent" ? `${diffAmount}%` : `${diffAmount} pixels`}.`}${baselineImage.width !== resultImage.width || baselineImage.height !== resultImage.height ? `\nThe image size changed from ${baselineImage.width}x${baselineImage.height} to ${resultImage.width}x${resultImage.height}.` : ""}
|
|
203
|
+
|
|
204
|
+
Options: ${prettifyOptions(options)}
|
|
205
|
+
|
|
206
|
+
Expected: ${resolve(info.projectRoot, info.baselinePath)}
|
|
207
|
+
Actual: ${resolve(info.projectRoot, info.resultPath)}
|
|
208
|
+
Difference: ${resolve(info.projectRoot, info.diffPath)}`);
|
|
209
|
+
}
|
|
210
|
+
async function writeSnapshot(commands, path, image) {
|
|
211
|
+
const content = (await toDataURL(image)).split(",")[1];
|
|
212
|
+
return commands.writeFile(path, content, { encoding: "base64" });
|
|
213
|
+
}
|
|
214
|
+
|
|
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
|
+
//#endregion
|
|
271
|
+
//#region src/client/actions/match_image_snapshot_action.ts
|
|
272
|
+
async function matchImageSnapshotAction(commands, taskId, subject, options) {
|
|
273
|
+
assertSnapshotKeyWithoutDash(options?.snapshotKey);
|
|
274
|
+
const info = await commands.prepareImageSnapshotComparison(taskId, parseImageSnapshotSubject(subject), options);
|
|
275
|
+
if (!info) return;
|
|
276
|
+
return compareImageSnapshot(commands, taskId, info, options);
|
|
277
|
+
}
|
|
278
|
+
function parseImageSnapshotSubject(subject) {
|
|
279
|
+
if (subject instanceof Element) return convertElementToCssSelector(subject);
|
|
280
|
+
if (subject?.["selector"]) return subject["selector"];
|
|
281
|
+
if (isBase64String(subject)) return subject;
|
|
282
|
+
throw new Error(`'toMatchImageSnapshot()' expects the subject to be an element, locator, or image encoded in base64 string, but got: ${subject}`);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
//#endregion
|
|
286
|
+
//#region src/client/actions/match_page_image_snapshot_action.ts
|
|
287
|
+
async function matchPageImageSnapshotAction(commands, taskId, options) {
|
|
288
|
+
assertSnapshotKeyWithoutDash(options?.snapshotKey);
|
|
289
|
+
const info = await commands.preparePageImageSnapshotComparison(taskId, options);
|
|
290
|
+
if (!info) return;
|
|
291
|
+
return compareImageSnapshot(commands, taskId, info, options);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
//#endregion
|
|
295
|
+
//#region src/client/expect/expectation_result.ts
|
|
296
|
+
const success = {
|
|
297
|
+
pass: true,
|
|
298
|
+
message: () => ""
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
//#endregion
|
|
302
|
+
//#region src/client/task_id.ts
|
|
303
|
+
function toTaskId(task) {
|
|
304
|
+
const l = [];
|
|
305
|
+
let t = task;
|
|
306
|
+
while (t?.suite) {
|
|
307
|
+
l.unshift(t.suite.name.replace(/[^a-z0-9]/gi, "-").toLowerCase());
|
|
308
|
+
t = t.suite;
|
|
309
|
+
}
|
|
310
|
+
l.push(task.name.replace(/[^a-z0-9]/gi, "-").toLowerCase());
|
|
311
|
+
return l.join("/");
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
//#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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task_id-DnS9_4Ub.mjs","names":["pixelmatch","ctx","ctx: Awaited<typeof import('vitest/browser')>","parent: null | ParentNode","success: SyncExpectationResult","l: any[]"],"sources":["../src/client/actions/has_image_snapshot_action.ts","../src/shared/convert_threshold_unit.ts","../src/shared/compare_image.ts","../src/shared/get_max_size.ts","../src/shared/is_same_size.ts","../src/client/image_resizer.ts","../src/client/align_images.ts","../src/client/compare_image_snapshot.logic.ts","../src/client/image_data.ts","../src/client/vitest_browser_context_proxy.ts","../src/client/compare_image_snapshot.ts","../src/client/selector.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/task_id.ts"],"sourcesContent":["import type { HasImageSnapshotCommand, ImageSnapshotNextIndexCommand } from '../../commands.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","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 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 './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","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","import type { BrowserCommands } from 'vitest/browser'\nimport dedent from 'dedent'\nimport { resolve } from 'pathe'\nimport type { ImageSnapshotNextIndexCommand } from '../commands.ts'\nimport type {\n\tImageSnapshotComparisonInfo,\n\tPrepareImageSnapshotComparisonCommand,\n} from '../server/commands/prepare_image_snapshot_comparison.ts'\nimport { compareImage } from '../shared/compare_image.ts'\nimport type { ToMatchImageSnapshotOptions } from '../shared/types.ts'\nimport { alignImagesToSameSize } from './align_images.ts'\nimport { prettifyOptions } from './compare_image_snapshot.logic.ts'\nimport { toDataURL, toImageData } from './image_data.ts'\nimport { server } from './vitest_browser_context_proxy.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","/**\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","import type { BrowserCommands } from 'vitest/browser'\nimport type { ImageSnapshotNextIndexCommand } from '../../commands.ts'\nimport type { PrepareImageSnapshotComparisonCommand } from '../../server/commands/prepare_image_snapshot_comparison.ts'\nimport { assertSnapshotKeyWithoutDash } from '../../shared/asserts.ts'\nimport { isBase64String } from '../../shared/base64.ts'\nimport type { ToMatchImageSnapshotOptions } from '../../shared/types.ts'\nimport { compareImageSnapshot } from '../compare_image_snapshot.ts'\nimport { convertElementToCssSelector } from '../selector.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 type { ImageSnapshotNextIndexCommand } from '../../commands.ts'\nimport type { PrepareImageSnapshotComparisonCommand } from '../../server/commands/prepare_image_snapshot_comparison.ts'\nimport { assertSnapshotKeyWithoutDash } from '../../shared/asserts.ts'\nimport type { ToMatchImageSnapshotOptions } from '../../shared/types.ts'\nimport { compareImageSnapshot } from '../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","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"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/testing/constants.d.ts
|
|
2
|
+
declare const UNI_PNG_BASE64 = "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";
|
|
3
|
+
declare const UNI_PNG_URL = "data:image/png;base64,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";
|
|
4
|
+
declare const UNI_IMAGE_DATA: {
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
colorSpace: PredefinedColorSpace;
|
|
8
|
+
data: Uint8ClampedArray<ArrayBuffer>;
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { UNI_IMAGE_DATA, UNI_PNG_BASE64, UNI_PNG_URL };
|
|
12
|
+
//# sourceMappingURL=testing.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing/constants.ts"],"sourcesContent":[],"mappings":";cAAa,cAAA;AAAA,cAGA,WAAA,GAHc,wrGAAA;AAGd,cAEA,cAFW,EAAA;EAEX,KAAA,EAAA,MAAA;EAGU,MAAA,EAAA,MAAA;cAAA"}
|