vitest-plugin-vis 4.0.0 → 4.2.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/auto_snapshots/_ctx.mjs +15 -0
- package/dist/auto_snapshots/_ctx.mjs.map +1 -0
- package/dist/auto_snapshots/_extract_auto_snapshot_options.mjs +23 -0
- package/dist/auto_snapshots/_extract_auto_snapshot_options.mjs.map +1 -0
- package/dist/{auto_snapshot_options-CaQCXDdi.d.mts → auto_snapshots/auto_snapshot_options.d.mts} +5 -4
- package/dist/auto_snapshots/auto_snapshot_options.d.mts.map +1 -0
- package/dist/{auto_snapshot_options-CAD43Zkp.mjs → auto_snapshots/auto_snapshot_options.mjs} +6 -42
- package/dist/auto_snapshots/auto_snapshot_options.mjs.map +1 -0
- package/dist/auto_snapshots/snapshot_meta.d.mts +15 -0
- package/dist/auto_snapshots/snapshot_meta.d.mts.map +1 -0
- package/dist/client/actions/has_image_snapshot_action.d.mts +8 -0
- package/dist/client/actions/has_image_snapshot_action.d.mts.map +1 -0
- package/dist/client/actions/has_image_snapshot_action.mjs +9 -0
- package/dist/client/actions/has_image_snapshot_action.mjs.map +1 -0
- package/dist/client/actions/load_image_snapshot_results_action.d.mts +7 -0
- package/dist/client/actions/load_image_snapshot_results_action.d.mts.map +1 -0
- package/dist/client/actions/load_image_snapshot_results_action.mjs +8 -0
- package/dist/client/actions/load_image_snapshot_results_action.mjs.map +1 -0
- package/dist/client/actions/match_image_snapshot_action.d.mts +9 -0
- package/dist/client/actions/match_image_snapshot_action.d.mts.map +1 -0
- package/dist/client/actions/match_image_snapshot_action.mjs +20 -0
- package/dist/client/actions/match_image_snapshot_action.mjs.map +1 -0
- package/dist/client/actions/match_page_image_snapshot_action.d.mts +9 -0
- package/dist/client/actions/match_page_image_snapshot_action.d.mts.map +1 -0
- package/dist/client/actions/match_page_image_snapshot_action.mjs +14 -0
- package/dist/client/actions/match_page_image_snapshot_action.mjs.map +1 -0
- package/dist/client/expect/_ctx.mjs +15 -0
- package/dist/client/expect/_ctx.mjs.map +1 -0
- package/dist/client/expect/augment.d.mts +10 -0
- package/dist/client/expect/augment.d.mts.map +1 -0
- package/dist/client/expect/expectation_result.d.mts +7 -0
- package/dist/client/expect/expectation_result.d.mts.map +1 -0
- package/dist/client/expect/expectation_result.mjs +9 -0
- package/dist/client/expect/expectation_result.mjs.map +1 -0
- package/dist/client/expect/extend.d.mts +1 -0
- package/dist/client/expect/extend.mjs +9 -0
- package/dist/client/expect/extend.mjs.map +1 -0
- package/dist/client/expect/to_match_image_snapshot.mjs +16 -0
- package/dist/client/expect/to_match_image_snapshot.mjs.map +1 -0
- package/dist/{to_match_image_snapshot.types-p-zilA_M.d.mts → client/expect/to_match_image_snapshot.types.d.mts} +3 -3
- package/dist/client/expect/to_match_image_snapshot.types.d.mts.map +1 -0
- package/dist/client/external/browser/has_render_content.mjs +8 -0
- package/dist/client/external/browser/has_render_content.mjs.map +1 -0
- package/dist/client/external/browser/image_data.mjs +37 -0
- package/dist/client/external/browser/image_data.mjs.map +1 -0
- package/dist/client/external/browser/image_resizer.mjs +32 -0
- package/dist/client/external/browser/image_resizer.mjs.map +1 -0
- package/dist/client/external/browser/selector.mjs +57 -0
- package/dist/client/external/browser/selector.mjs.map +1 -0
- package/dist/client/external/vitest/vitest_browser_context_proxy.mjs +12 -0
- package/dist/client/external/vitest/vitest_browser_context_proxy.mjs.map +1 -0
- package/dist/client/external/vitest/vitest_suite_proxy.d.mts +3 -0
- package/dist/client/external/vitest/vitest_suite_proxy.mjs +11 -0
- package/dist/client/external/vitest/vitest_suite_proxy.mjs.map +1 -0
- package/dist/client/image/align_images.mjs +14 -0
- package/dist/client/image/align_images.mjs.map +1 -0
- package/dist/client/page/_ctx.d.mts +3 -0
- package/dist/client/page/_ctx.mjs +15 -0
- package/dist/client/page/_ctx.mjs.map +1 -0
- package/dist/client/page/augment.d.mts +9 -0
- package/dist/client/page/augment.d.mts.map +1 -0
- package/dist/client/page/extend.d.mts +1 -0
- package/dist/client/page/extend.mjs +13 -0
- package/dist/client/page/extend.mjs.map +1 -0
- package/dist/client/page/has_image_snapshot.d.mts +13 -0
- package/dist/client/page/has_image_snapshot.d.mts.map +1 -0
- package/dist/client/page/has_image_snapshot.mjs +15 -0
- package/dist/client/page/has_image_snapshot.mjs.map +1 -0
- package/dist/client/page/to_match_image_snapshot.d.mts +9 -0
- package/dist/client/page/to_match_image_snapshot.d.mts.map +1 -0
- package/dist/client/page/to_match_image_snapshot.mjs +15 -0
- package/dist/client/page/to_match_image_snapshot.mjs.map +1 -0
- package/dist/client/snapshot/compare_image_snapshot.logic.mjs +14 -0
- package/dist/client/snapshot/compare_image_snapshot.logic.mjs.map +1 -0
- package/dist/client/snapshot/compare_image_snapshot.mjs +63 -0
- package/dist/client/snapshot/compare_image_snapshot.mjs.map +1 -0
- package/dist/client/snapshot/should_take_snapshot.mjs +10 -0
- package/dist/client/snapshot/should_take_snapshot.mjs.map +1 -0
- package/dist/client/suite/_ctx.mjs +13 -0
- package/dist/client/suite/_ctx.mjs.map +1 -0
- package/dist/client/suite/auto_snapshot_matcher.d.mts +12 -0
- package/dist/client/suite/auto_snapshot_matcher.d.mts.map +1 -0
- package/dist/client/suite/auto_snapshot_matcher.mjs +50 -0
- package/dist/client/suite/auto_snapshot_matcher.mjs.map +1 -0
- package/dist/client/task/task_id.d.mts +9 -0
- package/dist/client/task/task_id.d.mts.map +1 -0
- package/dist/client/task/task_id.mjs +15 -0
- package/dist/client/task/task_id.mjs.map +1 -0
- package/dist/client-api.d.mts +13 -141
- package/dist/client-api.mjs +10 -13
- package/dist/{types-Do1N7g4c.d.mts → config/types.d.mts} +8 -9
- package/dist/config/types.d.mts.map +1 -0
- package/dist/config/vis.d.mts +27 -0
- package/dist/config/vis.d.mts.map +1 -0
- package/dist/config/vis.mjs +31 -0
- package/dist/config/vis.mjs.map +1 -0
- package/dist/config.d.mts +5 -28
- package/dist/config.mjs +3 -411
- package/dist/index.d.mts +5 -5
- package/dist/index.mjs +1 -4
- package/dist/presets/auto.mjs +4 -7
- package/dist/presets/auto.mjs.map +1 -1
- package/dist/presets/enable.mjs +2 -6
- package/dist/presets/enable.mjs.map +1 -1
- package/dist/presets/manual.mjs +2 -6
- package/dist/presets/manual.mjs.map +1 -1
- package/dist/server/browser_provider/browser_api.mjs +13 -0
- package/dist/server/browser_provider/browser_api.mjs.map +1 -0
- package/dist/server/browser_provider/playwright.mjs +24 -0
- package/dist/server/browser_provider/playwright.mjs.map +1 -0
- package/dist/server/browser_provider/webdriverio.mjs +16 -0
- package/dist/server/browser_provider/webdriverio.mjs.map +1 -0
- package/dist/server/commands/_assertions.mjs +10 -0
- package/dist/server/commands/_assertions.mjs.map +1 -0
- package/dist/server/commands/augment.d.mts +8 -0
- package/dist/server/commands/augment.d.mts.map +1 -0
- package/dist/server/commands/commands.mjs +20 -0
- package/dist/server/commands/commands.mjs.map +1 -0
- package/dist/server/commands/has_image_snapshot.mjs +12 -0
- package/dist/server/commands/has_image_snapshot.mjs.map +1 -0
- package/dist/server/commands/image_snapshot_next_index.mjs +12 -0
- package/dist/server/commands/image_snapshot_next_index.mjs.map +1 -0
- package/dist/server/commands/load_image_snapshot_results.mjs +12 -0
- package/dist/server/commands/load_image_snapshot_results.mjs.map +1 -0
- package/dist/server/commands/prepare_image_snapshot_comparison.mjs +37 -0
- package/dist/server/commands/prepare_image_snapshot_comparison.mjs.map +1 -0
- package/dist/server/commands/prepare_page_image_snapshot_comparison.mjs +27 -0
- package/dist/server/commands/prepare_page_image_snapshot_comparison.mjs.map +1 -0
- package/dist/server/commands/setup_vis_suite.mjs +12 -0
- package/dist/server/commands/setup_vis_suite.mjs.map +1 -0
- package/dist/server/externals/file.mjs +23 -0
- package/dist/server/externals/file.mjs.map +1 -0
- package/dist/server/project.mjs +13 -0
- package/dist/server/project.mjs.map +1 -0
- package/dist/server/snapshot.mjs +29 -0
- package/dist/server/snapshot.mjs.map +1 -0
- package/dist/server/snapshot_path.d.mts +17 -0
- package/dist/server/snapshot_path.d.mts.map +1 -0
- package/dist/{snapshot_path-7GliOSH_.mjs → server/snapshot_path.mjs} +7 -25
- package/dist/server/snapshot_path.mjs.map +1 -0
- package/dist/server/snapshot_writer.mjs +21 -0
- package/dist/server/snapshot_writer.mjs.map +1 -0
- package/dist/server/suite.mjs +82 -0
- package/dist/server/suite.mjs.map +1 -0
- package/dist/server/vis_options.mjs +19 -0
- package/dist/server/vis_options.mjs.map +1 -0
- package/dist/server/vis_server_context.deps.mjs +16 -0
- package/dist/server/vis_server_context.deps.mjs.map +1 -0
- package/dist/server/vis_server_context.logic.mjs +82 -0
- package/dist/server/vis_server_context.logic.mjs.map +1 -0
- package/dist/server/vis_server_context.mjs +8 -0
- package/dist/server/vis_server_context.mjs.map +1 -0
- package/dist/server/vis_server_context.types.d.mts +2 -0
- package/dist/server-utils.d.mts +4 -19
- package/dist/server-utils.mjs +3 -2
- package/dist/setup/create_vis.d.mts +108 -0
- package/dist/setup/create_vis.d.mts.map +1 -0
- package/dist/setup/create_vis.mjs +58 -0
- package/dist/setup/create_vis.mjs.map +1 -0
- package/dist/setup/vis.d.mts +10 -0
- package/dist/setup/vis.d.mts.map +1 -0
- package/dist/setup/vis.mjs +12 -0
- package/dist/setup/vis.mjs.map +1 -0
- package/dist/setup-api.d.mts +4 -0
- package/dist/setup-api.mjs +5 -0
- package/dist/setup.d.mts +8 -105
- package/dist/setup.d.mts.map +1 -1
- package/dist/setup.mjs +12 -7
- package/dist/setup.mjs.map +1 -0
- package/dist/{asserts--HSSlgPD.mjs → shared/asserts.mjs} +2 -2
- package/dist/shared/asserts.mjs.map +1 -0
- package/dist/{base64-CHSENEAO.mjs → shared/base64.mjs} +2 -2
- package/dist/shared/base64.mjs.map +1 -0
- package/dist/shared/commands.types.d.mts +51 -0
- package/dist/shared/commands.types.d.mts.map +1 -0
- package/dist/shared/compare_image.mjs +46 -0
- package/dist/shared/compare_image.mjs.map +1 -0
- package/dist/shared/constants.d.mts +9 -0
- package/dist/shared/constants.d.mts.map +1 -0
- package/dist/{constants-CTBaz8Ml.mjs → shared/constants.mjs} +2 -2
- package/dist/shared/constants.mjs.map +1 -0
- package/dist/shared/convert_threshold_unit.mjs +12 -0
- package/dist/shared/convert_threshold_unit.mjs.map +1 -0
- package/dist/shared/get_max_size.mjs +11 -0
- package/dist/shared/get_max_size.mjs.map +1 -0
- package/dist/shared/is_same_size.mjs +8 -0
- package/dist/shared/is_same_size.mjs.map +1 -0
- package/dist/{trim_common_folder-ModiubEJ.d.mts → shared/trim_common_folder.d.mts} +2 -2
- package/dist/shared/trim_common_folder.d.mts.map +1 -0
- package/dist/shared/trim_common_folder.mjs +23 -0
- package/dist/shared/trim_common_folder.mjs.map +1 -0
- package/dist/{types-DFb23VE1.d.mts → shared/types.d.mts} +39 -20
- package/dist/shared/types.d.mts.map +1 -0
- package/dist/testing/constants.d.mts +12 -0
- package/dist/testing/constants.d.mts.map +1 -0
- package/dist/testing/constants.mjs +65550 -0
- package/dist/{testing.mjs.map → testing/constants.mjs.map} +1 -1
- package/dist/testing.d.mts +2 -12
- package/dist/testing.mjs +2 -65549
- package/package.json +24 -17
- package/readme.md +48 -3
- package/src/{client/ctx.ts → auto_snapshots/_ctx.ts} +1 -3
- package/src/auto_snapshots/_extract_auto_snapshot_options.ts +26 -0
- package/src/{client → auto_snapshots}/auto_snapshot_options.mdx +1 -2
- package/src/{client → auto_snapshots}/auto_snapshot_options.ts +1 -23
- package/src/client/actions/has_image_snapshot_action.ts +1 -1
- package/src/client/actions/load_image_snapshot_results_action.ts +1 -1
- package/src/client/actions/match_image_snapshot_action.ts +6 -6
- package/src/client/actions/match_page_image_snapshot_action.ts +5 -3
- package/src/client/expect/_ctx.ts +10 -0
- package/src/client/expect/to_match_image_snapshot.ts +3 -4
- package/src/client/external/browser/has_render_content.ts +3 -0
- package/src/client/{image_resizer.ts → external/browser/image_resizer.ts} +1 -1
- package/src/client/{vitest_suite_proxy.ts → external/vitest/vitest_suite_proxy.ts} +1 -1
- package/src/client/{align_images.ts → image/align_images.ts} +3 -3
- package/src/client/page/_ctx.ts +12 -0
- package/src/client/page/has_image_snapshot.ts +4 -4
- package/src/client/page/to_match_image_snapshot.ts +3 -4
- package/src/client/{compare_image_snapshot.logic.ts → snapshot/compare_image_snapshot.logic.ts} +2 -2
- package/src/client/{compare_image_snapshot.ts → snapshot/compare_image_snapshot.ts} +23 -10
- package/src/client/snapshot/should_take_snapshot.ts +6 -0
- package/src/client/suite/_ctx.ts +8 -0
- package/src/client/suite/auto_snapshot_matcher.ts +67 -0
- package/src/client-api.ts +3 -2
- package/src/config/overview.mdx +145 -0
- package/src/{shared → config}/trim_common_folder.mdx +1 -1
- package/src/config/types.ts +5 -6
- package/src/config/vis.mdx +313 -0
- package/src/index.ts +1 -1
- package/src/overview.mdx +66 -28
- package/src/server/commands/augment.ts +8 -6
- package/src/server/commands/has_image_snapshot.ts +1 -4
- package/src/server/commands/image_snapshot_next_index.ts +1 -7
- package/src/server/commands/load_image_snapshot_results.ts +1 -20
- package/src/server/commands/prepare_image_snapshot_comparison.ts +10 -56
- package/src/server/commands/prepare_page_image_snapshot_comparison.ts +2 -49
- package/src/server/commands/setup_vis_suite.ts +0 -24
- package/src/server/snapshot_path.ts +3 -1
- package/src/server/vis_server_context.logic.ts +1 -1
- package/src/{setup.create_vis.mdx → setup/create_vis.mdx} +4 -5
- package/src/{client/setup → setup}/create_vis.ts +31 -83
- package/src/setup/overview.mdx +17 -0
- package/src/setup/readme.md +7 -0
- package/src/{setup.vis.mdx → setup/vis.mdx} +15 -18
- package/src/setup-api.ts +5 -0
- package/src/setup.ts +9 -5
- package/src/shared/commands.types.ts +71 -0
- package/src/shared/types.ts +54 -1
- package/dist/asserts--HSSlgPD.mjs.map +0 -1
- package/dist/augment-BJmy1S7i.d.mts +0 -31
- package/dist/augment-BJmy1S7i.d.mts.map +0 -1
- package/dist/auto_snapshot_options-CAD43Zkp.mjs.map +0 -1
- package/dist/auto_snapshot_options-CaQCXDdi.d.mts.map +0 -1
- package/dist/base64-CHSENEAO.mjs.map +0 -1
- package/dist/client-api.d.mts.map +0 -1
- package/dist/client-api.mjs.map +0 -1
- package/dist/config.d.mts.map +0 -1
- package/dist/config.mjs.map +0 -1
- package/dist/constants-CTBaz8Ml.mjs.map +0 -1
- package/dist/server-utils.d.mts.map +0 -1
- package/dist/setup-BWgIDtv-.mjs +0 -141
- package/dist/setup-BWgIDtv-.mjs.map +0 -1
- package/dist/setup_vis_suite-C6JGGT7B.d.mts +0 -17
- package/dist/setup_vis_suite-C6JGGT7B.d.mts.map +0 -1
- package/dist/snapshot_path-7GliOSH_.mjs.map +0 -1
- package/dist/src-CSQnlFa9.mjs +0 -1
- package/dist/task_id-DnS9_4Ub.mjs +0 -316
- package/dist/task_id-DnS9_4Ub.mjs.map +0 -1
- package/dist/testing.d.mts.map +0 -1
- package/dist/to_match_image_snapshot.types-p-zilA_M.d.mts.map +0 -1
- package/dist/trim_common_folder-ModiubEJ.d.mts.map +0 -1
- package/dist/types-DFb23VE1.d.mts.map +0 -1
- package/dist/types-Do1N7g4c.d.mts.map +0 -1
- package/dist/vis_server_context.types-Ce1f9vOO.d.mts +0 -1
- package/src/client/image_snapshot_options.ts +0 -6
- package/src/client/setup/vis.ctx.ts +0 -34
- package/src/client/should_take_snapshot.ts +0 -5
- package/src/config.vis.mdx +0 -76
- package/src/server/commands/types.ts +0 -9
- /package/src/{client → auto_snapshots}/snapshot_meta.ts +0 -0
- /package/src/client/{image_data.ts → external/browser/image_data.ts} +0 -0
- /package/src/client/{selector.ts → external/browser/selector.ts} +0 -0
- /package/src/client/{vitest_browser_context_proxy.ts → external/vitest/vitest_browser_context_proxy.ts} +0 -0
- /package/src/client/{task_id.ts → task/task_id.ts} +0 -0
- /package/src/{client/setup → setup}/vis.ts +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { resolve } from "pathe";
|
|
2
|
+
|
|
3
|
+
//#region src/server/browser_provider/playwright.ts
|
|
4
|
+
function playwright(context) {
|
|
5
|
+
const { page, iframe } = context;
|
|
6
|
+
return {
|
|
7
|
+
async takeScreenshot(projectRoot, relativeFilePath, selector, options) {
|
|
8
|
+
return iframe.locator(selector).screenshot({
|
|
9
|
+
path: resolve(projectRoot, relativeFilePath),
|
|
10
|
+
...options
|
|
11
|
+
});
|
|
12
|
+
},
|
|
13
|
+
async takePageScreenshot(projectRoot, relativeFilePath, options) {
|
|
14
|
+
return page.screenshot({
|
|
15
|
+
path: resolve(projectRoot, relativeFilePath),
|
|
16
|
+
...options
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { playwright };
|
|
24
|
+
//# sourceMappingURL=playwright.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.mjs","names":[],"sources":["../../../src/server/browser_provider/playwright.ts"],"sourcesContent":["import { resolve } from 'pathe'\nimport type { ExtendedBrowserCommandContext } from '../vis_server_context.types.ts'\nimport type { BrowserApi } from './types.ts'\n\nexport function playwright(context: ExtendedBrowserCommandContext): BrowserApi {\n\tconst { page, iframe } = context\n\n\treturn {\n\t\tasync takeScreenshot(projectRoot, relativeFilePath, selector, options) {\n\t\t\tconst subject = iframe.locator(selector)\n\t\t\treturn subject.screenshot({\n\t\t\t\tpath: resolve(projectRoot, relativeFilePath),\n\t\t\t\t...options,\n\t\t\t})\n\t\t},\n\t\tasync takePageScreenshot(projectRoot, relativeFilePath, options) {\n\t\t\treturn page.screenshot({\n\t\t\t\tpath: resolve(projectRoot, relativeFilePath),\n\t\t\t\t...options,\n\t\t\t})\n\t\t},\n\t}\n}\n"],"mappings":";;;AAIA,SAAgB,WAAW,SAAoD;CAC9E,MAAM,EAAE,MAAM,WAAW;AAEzB,QAAO;EACN,MAAM,eAAe,aAAa,kBAAkB,UAAU,SAAS;AAEtE,UADgB,OAAO,QAAQ,SAAS,CACzB,WAAW;IACzB,MAAM,QAAQ,aAAa,iBAAiB;IAC5C,GAAG;IACH,CAAC;;EAEH,MAAM,mBAAmB,aAAa,kBAAkB,SAAS;AAChE,UAAO,KAAK,WAAW;IACtB,MAAM,QAAQ,aAAa,iBAAiB;IAC5C,GAAG;IACH,CAAC;;EAEH"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/server/browser_provider/webdriverio.ts
|
|
2
|
+
function webdriverio(context) {
|
|
3
|
+
const { browser } = context;
|
|
4
|
+
return {
|
|
5
|
+
async takeScreenshot(_projectRoot, relativeFilePath, selector) {
|
|
6
|
+
return (await browser.$(`${selector}`)).saveScreenshot(relativeFilePath);
|
|
7
|
+
},
|
|
8
|
+
async takePageScreenshot(_projectRoot, relativeFilePath, options) {
|
|
9
|
+
return browser.saveScreenshot(relativeFilePath, options);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { webdriverio };
|
|
16
|
+
//# sourceMappingURL=webdriverio.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webdriverio.mjs","names":[],"sources":["../../../src/server/browser_provider/webdriverio.ts"],"sourcesContent":["import type { ExtendedBrowserCommandContext } from '../vis_server_context.types.ts'\nimport type { BrowserApi } from './types.ts'\n\nexport function webdriverio(context: ExtendedBrowserCommandContext): BrowserApi {\n\tconst { browser } = context\n\treturn {\n\t\tasync takeScreenshot(_projectRoot, relativeFilePath, selector) {\n\t\t\tconst element = await browser.$(`${selector}`)\n\t\t\treturn element.saveScreenshot(relativeFilePath)\n\t\t},\n\t\tasync takePageScreenshot(_projectRoot, relativeFilePath, options) {\n\t\t\treturn browser.saveScreenshot(relativeFilePath, options)\n\t\t},\n\t}\n}\n"],"mappings":";AAGA,SAAgB,YAAY,SAAoD;CAC/E,MAAM,EAAE,YAAY;AACpB,QAAO;EACN,MAAM,eAAe,cAAc,kBAAkB,UAAU;AAE9D,WADgB,MAAM,QAAQ,EAAE,GAAG,WAAW,EAC/B,eAAe,iBAAiB;;EAEhD,MAAM,mBAAmB,cAAc,kBAAkB,SAAS;AACjE,UAAO,QAAQ,eAAe,kBAAkB,QAAQ;;EAEzD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import "pathe";
|
|
2
|
+
|
|
3
|
+
//#region src/server/commands/_assertions.ts
|
|
4
|
+
function assertTestPathDefined(context, commandName) {
|
|
5
|
+
if (!context.testPath) throw new Error(`'commands.${commandName}' requires testPath to be defined`);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
9
|
+
export { assertTestPathDefined };
|
|
10
|
+
//# sourceMappingURL=_assertions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_assertions.mjs","names":[],"sources":["../../../src/server/commands/_assertions.ts"],"sourcesContent":["import { isAbsolute } from 'pathe'\nimport type { RequiredPick } from 'type-plus'\nimport type { ExtendedBrowserCommandContext } from '../vis_server_context.types.ts'\n\nexport function assertTestPathDefined(\n\tcontext: ExtendedBrowserCommandContext,\n\tcommandName: string,\n): asserts context is RequiredPick<ExtendedBrowserCommandContext, 'testPath'> {\n\tif (!context.testPath) {\n\t\tthrow new Error(`'commands.${commandName}' requires testPath to be defined`)\n\t}\n}\n\nexport function assertIsRelativePath(relativeFilePath: string, propName: string) {\n\tif (isAbsolute(relativeFilePath)) {\n\t\tthrow new Error(`'${propName}' must be a relative path`)\n\t}\n}\n"],"mappings":";;;AAIA,SAAgB,sBACf,SACA,aAC6E;AAC7E,KAAI,CAAC,QAAQ,SACZ,OAAM,IAAI,MAAM,aAAa,YAAY,mCAAmC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HasImageSnapshotCommand, ImageSnapshotNextIndexCommand, LoadImageSnapshotResultsCommand, PrepareImageSnapshotComparisonCommand, PreparePageImageSnapshotComparisonCommand, SetupVisSuiteCommand } from "../../shared/commands.types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/server/commands/augment.d.ts
|
|
4
|
+
declare module 'vitest/browser' {
|
|
5
|
+
interface BrowserCommands extends SetupVisSuiteCommand, ImageSnapshotNextIndexCommand, HasImageSnapshotCommand, PreparePageImageSnapshotComparisonCommand, PrepareImageSnapshotComparisonCommand, LoadImageSnapshotResultsCommand {}
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=augment.d.ts.map
|
|
8
|
+
//# sourceMappingURL=augment.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"augment.d.mts","names":[],"sources":["../../../src/server/commands/augment.ts"],"sourcesContent":[],"mappings":";;;;oCAWU,sBACP,+BACA,yBACA,2CACA,uCACA,iCAToC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { hasImageSnapshot } from "./has_image_snapshot.mjs";
|
|
2
|
+
import { imageSnapshotNextIndex } from "./image_snapshot_next_index.mjs";
|
|
3
|
+
import { loadImageSnapshotResults } from "./load_image_snapshot_results.mjs";
|
|
4
|
+
import { prepareImageSnapshotComparison } from "./prepare_image_snapshot_comparison.mjs";
|
|
5
|
+
import { preparePageImageSnapshotComparison } from "./prepare_page_image_snapshot_comparison.mjs";
|
|
6
|
+
import { setupVisSuite } from "./setup_vis_suite.mjs";
|
|
7
|
+
|
|
8
|
+
//#region src/server/commands/commands.ts
|
|
9
|
+
const commands = {
|
|
10
|
+
setupVisSuite,
|
|
11
|
+
imageSnapshotNextIndex,
|
|
12
|
+
hasImageSnapshot,
|
|
13
|
+
preparePageImageSnapshotComparison,
|
|
14
|
+
prepareImageSnapshotComparison,
|
|
15
|
+
loadImageSnapshotResults
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
export { commands };
|
|
20
|
+
//# sourceMappingURL=commands.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.mjs","names":[],"sources":["../../../src/server/commands/commands.ts"],"sourcesContent":["import { hasImageSnapshot } from './has_image_snapshot.ts'\nimport { imageSnapshotNextIndex } from './image_snapshot_next_index.ts'\nimport { loadImageSnapshotResults } from './load_image_snapshot_results.ts'\nimport { prepareImageSnapshotComparison } from './prepare_image_snapshot_comparison.ts'\nimport { preparePageImageSnapshotComparison } from './prepare_page_image_snapshot_comparison.ts'\nimport { setupVisSuite } from './setup_vis_suite.ts'\n\nexport const commands = {\n\tsetupVisSuite,\n\timageSnapshotNextIndex,\n\thasImageSnapshot,\n\tpreparePageImageSnapshotComparison,\n\tprepareImageSnapshotComparison,\n\tloadImageSnapshotResults,\n}\n"],"mappings":";;;;;;;;AAOA,MAAa,WAAW;CACvB;CACA;CACA;CACA;CACA;CACA;CACA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { visServerContext } from "../vis_server_context.mjs";
|
|
2
|
+
import { assertTestPathDefined } from "./_assertions.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/server/commands/has_image_snapshot.ts
|
|
5
|
+
const hasImageSnapshot = async (context, taskId, snapshotKey) => {
|
|
6
|
+
assertTestPathDefined(context, "hasImageSnapshot");
|
|
7
|
+
return visServerContext.hasImageSnapshot(context, taskId, snapshotKey);
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { hasImageSnapshot };
|
|
12
|
+
//# sourceMappingURL=has_image_snapshot.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"has_image_snapshot.mjs","names":[],"sources":["../../../src/server/commands/has_image_snapshot.ts"],"sourcesContent":["import type { HasImageSnapshotCommand } from '../../shared/commands.types.ts'\nimport { visServerContext } from '../vis_server_context.ts'\nimport type { ExtendedBrowserCommand } from '../vis_server_context.types.ts'\nimport { assertTestPathDefined } from './_assertions.ts'\n\nexport const hasImageSnapshot: ExtendedBrowserCommand<Parameters<HasImageSnapshotCommand['hasImageSnapshot']>> = async (\n\tcontext,\n\ttaskId,\n\tsnapshotKey,\n) => {\n\tassertTestPathDefined(context, 'hasImageSnapshot')\n\n\treturn visServerContext.hasImageSnapshot(context as any, taskId, snapshotKey)\n}\n"],"mappings":";;;;AAKA,MAAa,mBAAoG,OAChH,SACA,QACA,gBACI;AACJ,uBAAsB,SAAS,mBAAmB;AAElD,QAAO,iBAAiB,iBAAiB,SAAgB,QAAQ,YAAY"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { visServerContext } from "../vis_server_context.mjs";
|
|
2
|
+
import { assertTestPathDefined } from "./_assertions.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/server/commands/image_snapshot_next_index.ts
|
|
5
|
+
const imageSnapshotNextIndex = async (context, taskId) => {
|
|
6
|
+
assertTestPathDefined(context, "imageSnapshotNextIndex");
|
|
7
|
+
return visServerContext.getTaskCount(context, taskId);
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { imageSnapshotNextIndex };
|
|
12
|
+
//# sourceMappingURL=image_snapshot_next_index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image_snapshot_next_index.mjs","names":[],"sources":["../../../src/server/commands/image_snapshot_next_index.ts"],"sourcesContent":["import type { ImageSnapshotNextIndexCommand } from '../../shared/commands.types.ts'\nimport { visServerContext } from '../vis_server_context.ts'\nimport type { ExtendedBrowserCommand } from '../vis_server_context.types.ts'\nimport { assertTestPathDefined } from './_assertions.ts'\n\nexport const imageSnapshotNextIndex: ExtendedBrowserCommand<\n\tParameters<ImageSnapshotNextIndexCommand['imageSnapshotNextIndex']>\n> = async (context, taskId) => {\n\tassertTestPathDefined(context, 'imageSnapshotNextIndex')\n\n\treturn visServerContext.getTaskCount(context, taskId)\n}\n"],"mappings":";;;;AAKA,MAAa,yBAET,OAAO,SAAS,WAAW;AAC9B,uBAAsB,SAAS,yBAAyB;AAExD,QAAO,iBAAiB,aAAa,SAAS,OAAO"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { visServerContext } from "../vis_server_context.mjs";
|
|
2
|
+
import { assertTestPathDefined } from "./_assertions.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/server/commands/load_image_snapshot_results.ts
|
|
5
|
+
const loadImageSnapshotResults = async (context, taskId) => {
|
|
6
|
+
assertTestPathDefined(context, "loadImageSnapshotResults");
|
|
7
|
+
return visServerContext.getSnapshotResults(context, taskId);
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { loadImageSnapshotResults };
|
|
12
|
+
//# sourceMappingURL=load_image_snapshot_results.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load_image_snapshot_results.mjs","names":[],"sources":["../../../src/server/commands/load_image_snapshot_results.ts"],"sourcesContent":["import type { ImageSnapshotResult } from '../../shared/commands.types.ts'\nimport { visServerContext } from '../vis_server_context.ts'\nimport type { ExtendedBrowserCommand } from '../vis_server_context.types.ts'\nimport { assertTestPathDefined } from './_assertions.ts'\n\nexport const loadImageSnapshotResults: ExtendedBrowserCommand<[taskId: string]> = async (\n\tcontext,\n\ttaskId,\n): Promise<ImageSnapshotResult[]> => {\n\tassertTestPathDefined(context, 'loadImageSnapshotResults')\n\treturn visServerContext.getSnapshotResults(context, taskId)\n}\n"],"mappings":";;;;AAKA,MAAa,2BAAqE,OACjF,SACA,WACoC;AACpC,uBAAsB,SAAS,2BAA2B;AAC1D,QAAO,iBAAiB,mBAAmB,SAAS,OAAO"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { file } from "../externals/file.mjs";
|
|
2
|
+
import { getProjectRoot } from "../project.mjs";
|
|
3
|
+
import { visServerContext } from "../vis_server_context.mjs";
|
|
4
|
+
import { assertTestPathDefined } from "./_assertions.mjs";
|
|
5
|
+
import { isBase64String } from "../../shared/base64.mjs";
|
|
6
|
+
import { snapshotWriter } from "../snapshot_writer.mjs";
|
|
7
|
+
import { takeSnapshot } from "../snapshot.mjs";
|
|
8
|
+
import { resolve } from "pathe";
|
|
9
|
+
|
|
10
|
+
//#region src/server/commands/prepare_image_snapshot_comparison.ts
|
|
11
|
+
const prepareImageSnapshotComparison = async (context, taskId, subject, options) => {
|
|
12
|
+
assertTestPathDefined(context, "prepareImageSnapshotComparison");
|
|
13
|
+
if (!options) options = {};
|
|
14
|
+
options.timeout = options.timeout ?? 3e4;
|
|
15
|
+
const projectRoot = getProjectRoot(context);
|
|
16
|
+
const info = await visServerContext.getSnapshotInfo(context, taskId, options);
|
|
17
|
+
const baselineBuffer = await file.tryReadFile(resolve(projectRoot, info.baselinePath));
|
|
18
|
+
if (!baselineBuffer && isBase64String(subject)) {
|
|
19
|
+
await snapshotWriter.writeBase64(resolve(projectRoot, info.resultPath), subject);
|
|
20
|
+
return {
|
|
21
|
+
...info,
|
|
22
|
+
projectRoot,
|
|
23
|
+
result: subject
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const resultBuffer = await takeSnapshot(context, projectRoot, info.resultPath, subject, options);
|
|
27
|
+
return {
|
|
28
|
+
...info,
|
|
29
|
+
projectRoot,
|
|
30
|
+
baseline: baselineBuffer?.toString("base64"),
|
|
31
|
+
result: resultBuffer.toString("base64")
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
export { prepareImageSnapshotComparison };
|
|
37
|
+
//# sourceMappingURL=prepare_image_snapshot_comparison.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare_image_snapshot_comparison.mjs","names":[],"sources":["../../../src/server/commands/prepare_image_snapshot_comparison.ts"],"sourcesContent":["import { resolve } from 'pathe'\nimport { isBase64String } from '../../shared/base64.ts'\nimport type { PrepareImageSnapshotComparisonCommand } from '../../shared/commands.types.ts'\nimport type { ImageSnapshotComparisonInfo } from '../../shared/types.ts'\nimport { file } from '../externals/file.ts'\nimport { getProjectRoot } from '../project.ts'\nimport { takeSnapshot } from '../snapshot.ts'\nimport { snapshotWriter } from '../snapshot_writer.ts'\nimport { visServerContext } from '../vis_server_context.ts'\nimport type { ExtendedBrowserCommand } from '../vis_server_context.types.ts'\nimport { assertTestPathDefined } from './_assertions.ts'\n\nexport const prepareImageSnapshotComparison: ExtendedBrowserCommand<\n\tParameters<PrepareImageSnapshotComparisonCommand['prepareImageSnapshotComparison']>\n> = async (context, taskId, subject, options): Promise<ImageSnapshotComparisonInfo | undefined> => {\n\tassertTestPathDefined(context, 'prepareImageSnapshotComparison')\n\t// vitest:browser passes in `null` when not defined\n\tif (!options) options = {}\n\toptions.timeout = options.timeout ?? 30000\n\n\tconst projectRoot = getProjectRoot(context)\n\tconst info = await visServerContext.getSnapshotInfo(context, taskId, options)\n\n\tconst baselineBuffer = await file.tryReadFile(resolve(projectRoot, info.baselinePath))\n\tif (!baselineBuffer && isBase64String(subject)) {\n\t\tawait snapshotWriter.writeBase64(resolve(projectRoot, info.resultPath), subject)\n\t\treturn {\n\t\t\t...info,\n\t\t\tprojectRoot,\n\t\t\tresult: subject,\n\t\t}\n\t}\n\n\tconst resultBuffer = await takeSnapshot(context, projectRoot, info.resultPath, subject, options)\n\treturn {\n\t\t...info,\n\t\tprojectRoot,\n\t\tbaseline: baselineBuffer?.toString('base64'),\n\t\tresult: resultBuffer.toString('base64'),\n\t}\n}\n"],"mappings":";;;;;;;;;;AAYA,MAAa,iCAET,OAAO,SAAS,QAAQ,SAAS,YAA8D;AAClG,uBAAsB,SAAS,iCAAiC;AAEhE,KAAI,CAAC,QAAS,WAAU,EAAE;AAC1B,SAAQ,UAAU,QAAQ,WAAW;CAErC,MAAM,cAAc,eAAe,QAAQ;CAC3C,MAAM,OAAO,MAAM,iBAAiB,gBAAgB,SAAS,QAAQ,QAAQ;CAE7E,MAAM,iBAAiB,MAAM,KAAK,YAAY,QAAQ,aAAa,KAAK,aAAa,CAAC;AACtF,KAAI,CAAC,kBAAkB,eAAe,QAAQ,EAAE;AAC/C,QAAM,eAAe,YAAY,QAAQ,aAAa,KAAK,WAAW,EAAE,QAAQ;AAChF,SAAO;GACN,GAAG;GACH;GACA,QAAQ;GACR;;CAGF,MAAM,eAAe,MAAM,aAAa,SAAS,aAAa,KAAK,YAAY,SAAS,QAAQ;AAChG,QAAO;EACN,GAAG;EACH;EACA,UAAU,gBAAgB,SAAS,SAAS;EAC5C,QAAQ,aAAa,SAAS,SAAS;EACvC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { file } from "../externals/file.mjs";
|
|
2
|
+
import { getProjectRoot } from "../project.mjs";
|
|
3
|
+
import { visServerContext } from "../vis_server_context.mjs";
|
|
4
|
+
import { assertTestPathDefined } from "./_assertions.mjs";
|
|
5
|
+
import { takePageSnapshot } from "../snapshot.mjs";
|
|
6
|
+
import { resolve } from "pathe";
|
|
7
|
+
|
|
8
|
+
//#region src/server/commands/prepare_page_image_snapshot_comparison.ts
|
|
9
|
+
const preparePageImageSnapshotComparison = async (context, taskId, options) => {
|
|
10
|
+
assertTestPathDefined(context, "preparePageImageSnapshotComparison");
|
|
11
|
+
if (!options) options = {};
|
|
12
|
+
options.timeout = options.timeout ?? 3e4;
|
|
13
|
+
const projectRoot = getProjectRoot(context);
|
|
14
|
+
const info = await visServerContext.getSnapshotInfo(context, taskId, options);
|
|
15
|
+
const baselineBuffer = await file.tryReadFile(resolve(projectRoot, info.baselinePath));
|
|
16
|
+
const resultBuffer = await takePageSnapshot(context, projectRoot, info.resultPath, options);
|
|
17
|
+
return {
|
|
18
|
+
...info,
|
|
19
|
+
projectRoot,
|
|
20
|
+
baseline: baselineBuffer?.toString("base64"),
|
|
21
|
+
result: resultBuffer.toString("base64")
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
export { preparePageImageSnapshotComparison };
|
|
27
|
+
//# sourceMappingURL=prepare_page_image_snapshot_comparison.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare_page_image_snapshot_comparison.mjs","names":[],"sources":["../../../src/server/commands/prepare_page_image_snapshot_comparison.ts"],"sourcesContent":["import { resolve } from 'pathe'\nimport type { PreparePageImageSnapshotComparisonCommand } from '../../shared/commands.types.ts'\nimport { file } from '../externals/file.ts'\nimport { getProjectRoot } from '../project.ts'\nimport { takePageSnapshot } from '../snapshot.ts'\nimport { visServerContext } from '../vis_server_context.ts'\nimport type { ExtendedBrowserCommand } from '../vis_server_context.types.ts'\nimport { assertTestPathDefined } from './_assertions.ts'\n\nexport const preparePageImageSnapshotComparison: ExtendedBrowserCommand<\n\tParameters<PreparePageImageSnapshotComparisonCommand['preparePageImageSnapshotComparison']>\n> = async (context, taskId, options) => {\n\tassertTestPathDefined(context, 'preparePageImageSnapshotComparison')\n\t// vitest:browser passes in `null` when not defined\n\tif (!options) options = {}\n\toptions.timeout = options.timeout ?? 30000\n\n\tconst projectRoot = getProjectRoot(context)\n\tconst info = await visServerContext.getSnapshotInfo(context, taskId, options)\n\tconst baselineBuffer = await file.tryReadFile(resolve(projectRoot, info.baselinePath))\n\tconst resultBuffer = await takePageSnapshot(context, projectRoot, info.resultPath, options)\n\treturn {\n\t\t...info,\n\t\tprojectRoot,\n\t\tbaseline: baselineBuffer?.toString('base64'),\n\t\tresult: resultBuffer.toString('base64'),\n\t}\n}\n"],"mappings":";;;;;;;;AASA,MAAa,qCAET,OAAO,SAAS,QAAQ,YAAY;AACvC,uBAAsB,SAAS,qCAAqC;AAEpE,KAAI,CAAC,QAAS,WAAU,EAAE;AAC1B,SAAQ,UAAU,QAAQ,WAAW;CAErC,MAAM,cAAc,eAAe,QAAQ;CAC3C,MAAM,OAAO,MAAM,iBAAiB,gBAAgB,SAAS,QAAQ,QAAQ;CAC7E,MAAM,iBAAiB,MAAM,KAAK,YAAY,QAAQ,aAAa,KAAK,aAAa,CAAC;CACtF,MAAM,eAAe,MAAM,iBAAiB,SAAS,aAAa,KAAK,YAAY,QAAQ;AAC3F,QAAO;EACN,GAAG;EACH;EACA,UAAU,gBAAgB,SAAS,SAAS;EAC5C,QAAQ,aAAa,SAAS,SAAS;EACvC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { setupSuite } from "../suite.mjs";
|
|
2
|
+
import { assertTestPathDefined } from "./_assertions.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/server/commands/setup_vis_suite.ts
|
|
5
|
+
const setupVisSuite = async (context) => {
|
|
6
|
+
assertTestPathDefined(context, "setupVisSuite");
|
|
7
|
+
return setupSuite(context);
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { setupVisSuite };
|
|
12
|
+
//# sourceMappingURL=setup_vis_suite.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup_vis_suite.mjs","names":[],"sources":["../../../src/server/commands/setup_vis_suite.ts"],"sourcesContent":["import { setupSuite } from '../suite.ts'\nimport type { ExtendedBrowserCommand, ExtendedBrowserCommandContext } from '../vis_server_context.types.ts'\nimport { assertTestPathDefined } from './_assertions.ts'\n\nexport const setupVisSuite: ExtendedBrowserCommand<[]> = async (context): Promise<{ subject: string | undefined }> => {\n\tassertTestPathDefined(context, 'setupVisSuite')\n\treturn setupSuite(context as unknown as ExtendedBrowserCommandContext)\n}\n"],"mappings":";;;;AAIA,MAAa,gBAA4C,OAAO,YAAsD;AACrH,uBAAsB,SAAS,gBAAgB;AAC/C,QAAO,WAAW,QAAoD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { glob } from "glob";
|
|
2
|
+
import { mkdirp } from "mkdirp";
|
|
3
|
+
import { readFile, stat, writeFile } from "node:fs/promises";
|
|
4
|
+
|
|
5
|
+
//#region src/server/externals/file.ts
|
|
6
|
+
const file = {
|
|
7
|
+
existFile(filePath) {
|
|
8
|
+
return stat(filePath).then((s) => s.isFile()).catch(() => false);
|
|
9
|
+
},
|
|
10
|
+
glob(pattern, options) {
|
|
11
|
+
return glob(pattern, options);
|
|
12
|
+
},
|
|
13
|
+
mkdirp,
|
|
14
|
+
async tryReadFile(filePath) {
|
|
15
|
+
if (!filePath) return void 0;
|
|
16
|
+
return readFile(filePath).catch(() => void 0);
|
|
17
|
+
},
|
|
18
|
+
writeFile
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { file };
|
|
23
|
+
//# sourceMappingURL=file.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.mjs","names":[],"sources":["../../../src/server/externals/file.ts"],"sourcesContent":["import { glob, type GlobOptionsWithFileTypesUnset } from 'glob'\nimport { mkdirp } from 'mkdirp'\nimport { readFile, stat, writeFile } from 'node:fs/promises'\n\nexport const file = {\n\texistFile(filePath: string) {\n\t\treturn stat(filePath)\n\t\t\t.then((s) => s.isFile())\n\t\t\t.catch(() => false)\n\t},\n\tglob(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined) {\n\t\treturn glob(pattern, options)\n\t},\n\tmkdirp: mkdirp as (path: string) => Promise<string | undefined>,\n\tasync tryReadFile(filePath: string | undefined): Promise<Buffer | undefined> {\n\t\tif (!filePath) return undefined\n\n\t\treturn readFile(filePath).catch(() => undefined)\n\t},\n\twriteFile,\n}\n"],"mappings":";;;;;AAIA,MAAa,OAAO;CACnB,UAAU,UAAkB;AAC3B,SAAO,KAAK,SAAS,CACnB,MAAM,MAAM,EAAE,QAAQ,CAAC,CACvB,YAAY,MAAM;;CAErB,KAAK,SAA4B,SAAqD;AACrF,SAAO,KAAK,SAAS,QAAQ;;CAEtB;CACR,MAAM,YAAY,UAA2D;AAC5E,MAAI,CAAC,SAAU,QAAO;AAEtB,SAAO,SAAS,SAAS,CAAC,YAAY,OAAU;;CAEjD;CACA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/server/project.ts
|
|
2
|
+
function getProjectName(context) {
|
|
3
|
+
const { runner } = context.project;
|
|
4
|
+
const name = runner.config.name;
|
|
5
|
+
if (typeof name === "string") return name;
|
|
6
|
+
}
|
|
7
|
+
function getProjectRoot(context) {
|
|
8
|
+
return context.project.config.root;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
//#endregion
|
|
12
|
+
export { getProjectName, getProjectRoot };
|
|
13
|
+
//# sourceMappingURL=project.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.mjs","names":[],"sources":["../../src/server/project.ts"],"sourcesContent":["import type { ExtendedBrowserCommandContext } from './vis_server_context.types.ts'\n\nexport function getProjectName(context: ExtendedBrowserCommandContext) {\n\tconst { runner } = context.project\n\tconst name = runner.config.name\n\tif (typeof name === 'string') {\n\t\treturn name\n\t}\n\t// if (typeof name === 'object' && 'label' in name) {\n\t// \treturn (name as { label: string }).label\n\t// }\n\treturn undefined\n}\n\nexport function getProjectRoot(context: { project: { config: { root: string } } }) {\n\treturn context.project.config.root\n}\n"],"mappings":";AAEA,SAAgB,eAAe,SAAwC;CACtE,MAAM,EAAE,WAAW,QAAQ;CAC3B,MAAM,OAAO,OAAO,OAAO;AAC3B,KAAI,OAAO,SAAS,SACnB,QAAO;;AAQT,SAAgB,eAAe,SAAoD;AAClF,QAAO,QAAQ,QAAQ,OAAO"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { isBase64String } from "../shared/base64.mjs";
|
|
2
|
+
import { browserApi } from "./browser_provider/browser_api.mjs";
|
|
3
|
+
import { snapshotWriter } from "./snapshot_writer.mjs";
|
|
4
|
+
import { dirname, resolve } from "pathe";
|
|
5
|
+
import { mkdirp } from "mkdirp";
|
|
6
|
+
|
|
7
|
+
//#region src/server/snapshot.ts
|
|
8
|
+
async function takeSnapshot(context, projectRoot, relativeFilePath, subject, options) {
|
|
9
|
+
if (isBase64String(subject)) {
|
|
10
|
+
await snapshotWriter.writeBase64(resolve(projectRoot, relativeFilePath), subject);
|
|
11
|
+
return Buffer.from(subject, "base64");
|
|
12
|
+
}
|
|
13
|
+
return takeSnapshotByBrowser(context, projectRoot, relativeFilePath, subject, options);
|
|
14
|
+
}
|
|
15
|
+
async function takeSnapshotByBrowser(context, projectRoot, relativeFilePath, subject, options) {
|
|
16
|
+
await mkdirp(dirname(resolve(projectRoot, relativeFilePath)));
|
|
17
|
+
return browserApi(context).takeScreenshot(projectRoot, relativeFilePath, subject ?? "body", { timeout: options?.timeout });
|
|
18
|
+
}
|
|
19
|
+
async function takePageSnapshot(context, projectRoot, relativeFilePath, options) {
|
|
20
|
+
await mkdirp(dirname(resolve(projectRoot, relativeFilePath)));
|
|
21
|
+
return browserApi(context).takePageScreenshot(projectRoot, relativeFilePath, {
|
|
22
|
+
timeout: options?.timeout,
|
|
23
|
+
fullPage: options?.fullPage
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
export { takePageSnapshot, takeSnapshot };
|
|
29
|
+
//# sourceMappingURL=snapshot.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.mjs","names":[],"sources":["../../src/server/snapshot.ts"],"sourcesContent":["import { mkdirp } from 'mkdirp'\nimport { dirname, resolve } from 'pathe'\nimport { isBase64String } from '../shared/base64.ts'\nimport type { ImageSnapshotTimeoutOptions, PageImageSnapshotOptions } from '../shared/types.ts'\nimport { browserApi } from './browser_provider/browser_api.ts'\nimport { snapshotWriter } from './snapshot_writer.ts'\nimport type { ExtendedBrowserCommandContext } from './vis_server_context.types.ts'\n\nexport async function takeSnapshot(\n\tcontext: ExtendedBrowserCommandContext,\n\tprojectRoot: string,\n\trelativeFilePath: string,\n\tsubject: string,\n\toptions: ImageSnapshotTimeoutOptions | undefined,\n) {\n\tif (isBase64String(subject)) {\n\t\tawait snapshotWriter.writeBase64(resolve(projectRoot, relativeFilePath), subject)\n\t\treturn Buffer.from(subject, 'base64')\n\t}\n\treturn takeSnapshotByBrowser(context, projectRoot, relativeFilePath, subject, options)\n}\n\nexport async function takeSnapshotByBrowser(\n\tcontext: ExtendedBrowserCommandContext,\n\tprojectRoot: string,\n\trelativeFilePath: string,\n\tsubject: string,\n\toptions: ImageSnapshotTimeoutOptions | undefined,\n) {\n\tconst filePath = resolve(projectRoot, relativeFilePath)\n\tawait mkdirp(dirname(filePath))\n\tconst browser = browserApi(context)\n\treturn browser.takeScreenshot(projectRoot, relativeFilePath, subject ?? 'body', {\n\t\ttimeout: options?.timeout,\n\t})\n}\n\nexport async function takePageSnapshot(\n\tcontext: ExtendedBrowserCommandContext,\n\tprojectRoot: string,\n\trelativeFilePath: string,\n\toptions: (PageImageSnapshotOptions & ImageSnapshotTimeoutOptions) | undefined,\n) {\n\tconst filePath = resolve(projectRoot, relativeFilePath)\n\tawait mkdirp(dirname(filePath))\n\tconst browser = browserApi(context)\n\treturn browser.takePageScreenshot(projectRoot, relativeFilePath, {\n\t\ttimeout: options?.timeout,\n\t\tfullPage: options?.fullPage,\n\t})\n}\n"],"mappings":";;;;;;;AAQA,eAAsB,aACrB,SACA,aACA,kBACA,SACA,SACC;AACD,KAAI,eAAe,QAAQ,EAAE;AAC5B,QAAM,eAAe,YAAY,QAAQ,aAAa,iBAAiB,EAAE,QAAQ;AACjF,SAAO,OAAO,KAAK,SAAS,SAAS;;AAEtC,QAAO,sBAAsB,SAAS,aAAa,kBAAkB,SAAS,QAAQ;;AAGvF,eAAsB,sBACrB,SACA,aACA,kBACA,SACA,SACC;AAED,OAAM,OAAO,QADI,QAAQ,aAAa,iBAAiB,CACzB,CAAC;AAE/B,QADgB,WAAW,QAAQ,CACpB,eAAe,aAAa,kBAAkB,WAAW,QAAQ,EAC/E,SAAS,SAAS,SAClB,CAAC;;AAGH,eAAsB,iBACrB,SACA,aACA,kBACA,SACC;AAED,OAAM,OAAO,QADI,QAAQ,aAAa,iBAAiB,CACzB,CAAC;AAE/B,QADgB,WAAW,QAAQ,CACpB,mBAAmB,aAAa,kBAAkB;EAChE,SAAS,SAAS;EAClB,UAAU,SAAS;EACnB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import "../config/types.mjs";
|
|
2
|
+
import "./vis_server_context.types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/server/snapshot_path.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Gets the root directory for storing snapshots.
|
|
8
|
+
*
|
|
9
|
+
* @param snapshotRootDir - Base directory for snapshots. Defaults to `__vis__`.
|
|
10
|
+
* @returns The full snapshot root directory path, which includes a platform-specific subdirectory:
|
|
11
|
+
* - When running in CI: `<snapshotRootDir>/<platform>` (e.g. `__vis__/linux`)
|
|
12
|
+
* - When running locally: `<snapshotRootDir>/local`
|
|
13
|
+
*/
|
|
14
|
+
declare function getSnapshotRootDir(snapshotRootDir?: string): string;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { getSnapshotRootDir };
|
|
17
|
+
//# sourceMappingURL=snapshot_path.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot_path.d.mts","names":[],"sources":["../../src/server/snapshot_path.ts"],"sourcesContent":[],"mappings":";;;;;;AAgCA;;;;;;;iBAAgB,kBAAA"}
|
|
@@ -1,36 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SNAPSHOT_ROOT_DIR } from "../shared/constants.mjs";
|
|
2
|
+
import { trimCommonFolder } from "../shared/trim_common_folder.mjs";
|
|
2
3
|
import ci from "is-ci";
|
|
3
4
|
import { platform } from "node:process";
|
|
4
5
|
|
|
5
|
-
//#region src/shared/trim_common_folder.ts
|
|
6
|
-
/**
|
|
7
|
-
* Trim off common folder such as `src` or `tests` from the test file path.
|
|
8
|
-
* This is used to generate the default snapshot sub-path.
|
|
9
|
-
*/
|
|
10
|
-
function trimCommonFolder(suiteName) {
|
|
11
|
-
suiteName = suiteName.replaceAll("..", "__");
|
|
12
|
-
const suiteDir = suiteName.split("/", 1)[0];
|
|
13
|
-
if ([
|
|
14
|
-
"tests",
|
|
15
|
-
"test",
|
|
16
|
-
"src",
|
|
17
|
-
"source",
|
|
18
|
-
"js",
|
|
19
|
-
"ts",
|
|
20
|
-
"lib"
|
|
21
|
-
].includes(suiteDir)) return suiteName.slice(suiteDir.length + 1);
|
|
22
|
-
return suiteName;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
//#endregion
|
|
26
6
|
//#region src/server/snapshot_path.ts
|
|
27
7
|
function resolveSnapshotRootDir(browserCommandContext, options) {
|
|
28
|
-
if (!options.snapshotRootDir) return getSnapshotRootDir(
|
|
8
|
+
if (!options.snapshotRootDir) return getSnapshotRootDir();
|
|
29
9
|
const snapshotRootDir = options.snapshotRootDir;
|
|
30
10
|
if (typeof snapshotRootDir === "string") return getSnapshotRootDir(snapshotRootDir);
|
|
31
11
|
const { config } = browserCommandContext.project.browser;
|
|
32
12
|
return snapshotRootDir({
|
|
33
13
|
ci,
|
|
14
|
+
rootDir: SNAPSHOT_ROOT_DIR,
|
|
15
|
+
projectName: browserCommandContext.project.name,
|
|
34
16
|
browserName: config.browser.name,
|
|
35
17
|
providerName: browserCommandContext.provider.name,
|
|
36
18
|
platform,
|
|
@@ -54,5 +36,5 @@ function getSnapshotSubpath(suiteName, options) {
|
|
|
54
36
|
}
|
|
55
37
|
|
|
56
38
|
//#endregion
|
|
57
|
-
export {
|
|
58
|
-
//# sourceMappingURL=snapshot_path
|
|
39
|
+
export { getSnapshotRootDir, getSnapshotSubpath, resolveSnapshotRootDir };
|
|
40
|
+
//# sourceMappingURL=snapshot_path.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot_path.mjs","names":[],"sources":["../../src/server/snapshot_path.ts"],"sourcesContent":["import ci from 'is-ci'\nimport { platform } from 'node:process'\nimport type { VisOptions } from '../config/types.ts'\nimport { SNAPSHOT_ROOT_DIR } from '../shared/constants.ts'\nimport { trimCommonFolder } from '../shared/trim_common_folder.ts'\nimport type { ExtendedBrowserCommandContext } from './vis_server_context.types.ts'\n\nexport function resolveSnapshotRootDir(browserCommandContext: ExtendedBrowserCommandContext, options: VisOptions) {\n\tif (!options.snapshotRootDir) return getSnapshotRootDir()\n\tconst snapshotRootDir = options.snapshotRootDir\n\tif (typeof snapshotRootDir === 'string') return getSnapshotRootDir(snapshotRootDir)\n\tconst { config } = browserCommandContext.project.browser\n\treturn snapshotRootDir({\n\t\tci,\n\t\trootDir: SNAPSHOT_ROOT_DIR,\n\t\tprojectName: browserCommandContext.project.name,\n\t\tbrowserName: config.browser.name,\n\t\tproviderName: browserCommandContext.provider.name,\n\t\tplatform,\n\t\tscreenshotFailures: config.browser.screenshotFailures,\n\t\tscreenshotDirectory: config.browser.screenshotDirectory,\n\t})\n}\n\n/**\n * Gets the root directory for storing snapshots.\n *\n * @param snapshotRootDir - Base directory for snapshots. Defaults to `__vis__`.\n * @returns The full snapshot root directory path, which includes a platform-specific subdirectory:\n * - When running in CI: `<snapshotRootDir>/<platform>` (e.g. `__vis__/linux`)\n * - When running locally: `<snapshotRootDir>/local`\n */\nexport function getSnapshotRootDir(snapshotRootDir = SNAPSHOT_ROOT_DIR) {\n\treturn `${snapshotRootDir}/${ci ? platform : 'local'}`\n}\n\nexport function getSnapshotSubpath(suiteName: string, options: Pick<VisOptions, 'snapshotSubpath'>) {\n\tconst snapshotSubpath = options.snapshotSubpath ?? (({ subpath }) => trimCommonFolder(subpath))\n\treturn snapshotSubpath({ subpath: suiteName })\n}\n"],"mappings":";;;;;;AAOA,SAAgB,uBAAuB,uBAAsD,SAAqB;AACjH,KAAI,CAAC,QAAQ,gBAAiB,QAAO,oBAAoB;CACzD,MAAM,kBAAkB,QAAQ;AAChC,KAAI,OAAO,oBAAoB,SAAU,QAAO,mBAAmB,gBAAgB;CACnF,MAAM,EAAE,WAAW,sBAAsB,QAAQ;AACjD,QAAO,gBAAgB;EACtB;EACA,SAAS;EACT,aAAa,sBAAsB,QAAQ;EAC3C,aAAa,OAAO,QAAQ;EAC5B,cAAc,sBAAsB,SAAS;EAC7C;EACA,oBAAoB,OAAO,QAAQ;EACnC,qBAAqB,OAAO,QAAQ;EACpC,CAAC;;;;;;;;;;AAWH,SAAgB,mBAAmB,kBAAkB,mBAAmB;AACvE,QAAO,GAAG,gBAAgB,GAAG,KAAK,WAAW;;AAG9C,SAAgB,mBAAmB,WAAmB,SAA8C;AAEnG,SADwB,QAAQ,qBAAqB,EAAE,cAAc,iBAAiB,QAAQ,GACvE,EAAE,SAAS,WAAW,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { file } from "./externals/file.mjs";
|
|
2
|
+
import { dirname } from "pathe";
|
|
3
|
+
|
|
4
|
+
//#region src/server/snapshot_writer.ts
|
|
5
|
+
function createSnapshotWriter({ mkdirp, writeFile } = file) {
|
|
6
|
+
return {
|
|
7
|
+
async writeBase64(filePath, data) {
|
|
8
|
+
await mkdirp(dirname(filePath));
|
|
9
|
+
await writeFile(filePath, data, { encoding: "base64" });
|
|
10
|
+
},
|
|
11
|
+
async writeBuffer(filePath, data) {
|
|
12
|
+
await mkdirp(dirname(filePath));
|
|
13
|
+
await writeFile(filePath, data);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const snapshotWriter = createSnapshotWriter();
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
export { snapshotWriter };
|
|
21
|
+
//# sourceMappingURL=snapshot_writer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot_writer.mjs","names":[],"sources":["../../src/server/snapshot_writer.ts"],"sourcesContent":["import { dirname } from 'pathe'\nimport { file } from './externals/file.ts'\n\nexport interface SnapshotWriter {\n\twriteBase64(filePath: string, data: string): Promise<void>\n\twriteBuffer(filePath: string, data: Buffer): Promise<void>\n}\n\nexport function createSnapshotWriter({ mkdirp, writeFile } = file): SnapshotWriter {\n\treturn {\n\t\tasync writeBase64(filePath: string, data: string) {\n\t\t\tawait mkdirp(dirname(filePath))\n\t\t\tawait writeFile(filePath, data, { encoding: 'base64' })\n\t\t},\n\t\tasync writeBuffer(filePath, data) {\n\t\t\tawait mkdirp(dirname(filePath))\n\t\t\tawait writeFile(filePath, data)\n\t\t},\n\t}\n}\n\nexport const snapshotWriter = createSnapshotWriter()\n"],"mappings":";;;;AAQA,SAAgB,qBAAqB,EAAE,QAAQ,cAAc,MAAsB;AAClF,QAAO;EACN,MAAM,YAAY,UAAkB,MAAc;AACjD,SAAM,OAAO,QAAQ,SAAS,CAAC;AAC/B,SAAM,UAAU,UAAU,MAAM,EAAE,UAAU,UAAU,CAAC;;EAExD,MAAM,YAAY,UAAU,MAAM;AACjC,SAAM,OAAO,QAAQ,SAAS,CAAC;AAC/B,SAAM,UAAU,UAAU,KAAK;;EAEhC;;AAGF,MAAa,iBAAiB,sBAAsB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { BASELINE_DIR, DIFF_DIR, RESULT_DIR } from "../shared/constants.mjs";
|
|
2
|
+
import { getProjectName, getProjectRoot } from "./project.mjs";
|
|
3
|
+
import { getSnapshotSubpath, resolveSnapshotRootDir } from "./snapshot_path.mjs";
|
|
4
|
+
import { getVisOption } from "./vis_options.mjs";
|
|
5
|
+
import { deps } from "./vis_server_context.deps.mjs";
|
|
6
|
+
import { join, relative } from "pathe";
|
|
7
|
+
|
|
8
|
+
//#region src/server/suite.ts
|
|
9
|
+
const suites = {};
|
|
10
|
+
/**
|
|
11
|
+
* Setup suite is called on each test file's beforeAll hook.
|
|
12
|
+
* Test files include vitest test files and storybook story files.
|
|
13
|
+
* It needs to make sure there is no race condition between the test files.
|
|
14
|
+
*/
|
|
15
|
+
async function setupSuite(browserContext) {
|
|
16
|
+
const suiteId = getSuiteId(browserContext);
|
|
17
|
+
const visOptions = getVisOption(browserContext);
|
|
18
|
+
if (!suites[suiteId]) suites[suiteId] = createSuite(browserContext, visOptions);
|
|
19
|
+
const suite = await suites[suiteId];
|
|
20
|
+
const { taskSubpath, baselineDir, diffDir, resultDir, tasks } = createModule(suite, browserContext.testPath, visOptions);
|
|
21
|
+
suite.modules[taskSubpath] = {
|
|
22
|
+
baselineDir,
|
|
23
|
+
diffDir,
|
|
24
|
+
resultDir,
|
|
25
|
+
tasks
|
|
26
|
+
};
|
|
27
|
+
await Promise.allSettled([deps.rimraf(diffDir), deps.rimraf(resultDir)]);
|
|
28
|
+
return {
|
|
29
|
+
comparisonMethod: visOptions.comparisonMethod,
|
|
30
|
+
diffOptions: visOptions.diffOptions,
|
|
31
|
+
failureThreshold: visOptions.failureThreshold,
|
|
32
|
+
failureThresholdType: visOptions.failureThresholdType,
|
|
33
|
+
snapshotKey: visOptions.snapshotKey,
|
|
34
|
+
subject: visOptions.subject,
|
|
35
|
+
timeout: visOptions.timeout
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Suite ID also contains the project name to make it unique
|
|
40
|
+
* across different projects.
|
|
41
|
+
*/
|
|
42
|
+
function getSuiteId(context) {
|
|
43
|
+
return `${getProjectName(context)}/${context.project.config.name}`;
|
|
44
|
+
}
|
|
45
|
+
async function createSuite(browserContext, visOptions) {
|
|
46
|
+
const snapshotRootDir = resolveSnapshotRootDir(browserContext, visOptions);
|
|
47
|
+
const projectRoot = getProjectRoot(browserContext);
|
|
48
|
+
const state = {
|
|
49
|
+
projectRoot,
|
|
50
|
+
testTimeout: browserContext.project.config.testTimeout,
|
|
51
|
+
hookTimeout: browserContext.project.config.hookTimeout,
|
|
52
|
+
snapshotRootDir,
|
|
53
|
+
snapshotBaselineDir: join(snapshotRootDir, BASELINE_DIR),
|
|
54
|
+
snapshotResultDir: join(snapshotRootDir, RESULT_DIR),
|
|
55
|
+
snapshotDiffDir: join(snapshotRootDir, DIFF_DIR),
|
|
56
|
+
snapshotRootPath: join(projectRoot, snapshotRootDir),
|
|
57
|
+
subject: visOptions.subject,
|
|
58
|
+
modules: {}
|
|
59
|
+
};
|
|
60
|
+
await Promise.allSettled([deps.rimraf(join(state.snapshotDiffDir)), deps.rimraf(join(state.snapshotResultDir))]);
|
|
61
|
+
return state;
|
|
62
|
+
}
|
|
63
|
+
function createModule(state, testPath, options) {
|
|
64
|
+
const taskSubpath = getTaskSubpath(state, testPath, options);
|
|
65
|
+
return {
|
|
66
|
+
taskSubpath,
|
|
67
|
+
baselineDir: join(state.snapshotBaselineDir, taskSubpath),
|
|
68
|
+
resultDir: join(state.snapshotResultDir, taskSubpath),
|
|
69
|
+
diffDir: join(state.snapshotDiffDir, taskSubpath),
|
|
70
|
+
tasks: {}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function getTaskSubpath(state, testPath, options) {
|
|
74
|
+
return getSnapshotSubpath(relative(state.projectRoot, testPath), options);
|
|
75
|
+
}
|
|
76
|
+
function getSuite(context) {
|
|
77
|
+
return suites[getSuiteId(context)];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
//#endregion
|
|
81
|
+
export { getSuite, getTaskSubpath, setupSuite };
|
|
82
|
+
//# sourceMappingURL=suite.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suite.mjs","names":[],"sources":["../../src/server/suite.ts"],"sourcesContent":["import { join, relative } from 'pathe'\nimport type { VisOptions } from '../config/types.ts'\nimport { BASELINE_DIR, DIFF_DIR, RESULT_DIR } from '../shared/constants.ts'\nimport { getProjectName, getProjectRoot } from './project.ts'\nimport { getSnapshotSubpath, resolveSnapshotRootDir } from './snapshot_path.ts'\nimport { getVisOption } from './vis_options.ts'\nimport { deps } from './vis_server_context.deps.ts'\nimport type { ExtendedBrowserCommandContext, VisSuite, VisSuites } from './vis_server_context.types.ts'\n\nconst suites: VisSuites = {}\n\n/**\n * Setup suite is called on each test file's beforeAll hook.\n * Test files include vitest test files and storybook story files.\n * It needs to make sure there is no race condition between the test files.\n */\nexport async function setupSuite(browserContext: ExtendedBrowserCommandContext) {\n\tconst suiteId = getSuiteId(browserContext)\n\tconst visOptions = getVisOption(browserContext)\n\n\tif (!suites[suiteId]) {\n\t\tsuites[suiteId] = createSuite(browserContext, visOptions)\n\t}\n\n\tconst suite = await suites[suiteId]\n\n\tconst { taskSubpath, baselineDir, diffDir, resultDir, tasks } = createModule(\n\t\tsuite,\n\t\tbrowserContext.testPath!,\n\t\tvisOptions,\n\t)\n\tsuite.modules[taskSubpath] = { baselineDir, diffDir, resultDir, tasks }\n\n\tawait Promise.allSettled([deps.rimraf(diffDir), deps.rimraf(resultDir)])\n\treturn {\n\t\tcomparisonMethod: visOptions.comparisonMethod,\n\t\tdiffOptions: visOptions.diffOptions,\n\t\tfailureThreshold: visOptions.failureThreshold,\n\t\tfailureThresholdType: visOptions.failureThresholdType,\n\t\tsnapshotKey: visOptions.snapshotKey,\n\t\tsubject: visOptions.subject,\n\t\ttimeout: visOptions.timeout,\n\t}\n}\n\n/**\n * Suite ID also contains the project name to make it unique\n * across different projects.\n */\nexport function getSuiteId(context: ExtendedBrowserCommandContext) {\n\treturn `${getProjectName(context)}/${context.project.config.name}`\n}\n\nasync function createSuite(\n\tbrowserContext: ExtendedBrowserCommandContext,\n\tvisOptions: Pick<VisOptions, 'snapshotRootDir' | 'subject'>,\n) {\n\t// console.log('visOptions', visOptions)\n\tconst snapshotRootDir = resolveSnapshotRootDir(browserContext, visOptions)\n\tconst projectRoot = getProjectRoot(browserContext)\n\n\tconst state = {\n\t\tprojectRoot,\n\t\ttestTimeout: browserContext.project.config.testTimeout,\n\t\thookTimeout: browserContext.project.config.hookTimeout,\n\t\tsnapshotRootDir,\n\t\tsnapshotBaselineDir: join(snapshotRootDir, BASELINE_DIR),\n\t\tsnapshotResultDir: join(snapshotRootDir, RESULT_DIR),\n\t\tsnapshotDiffDir: join(snapshotRootDir, DIFF_DIR),\n\t\tsnapshotRootPath: join(projectRoot, snapshotRootDir),\n\t\tsubject: visOptions.subject,\n\t\tmodules: {},\n\t}\n\tawait Promise.allSettled([deps.rimraf(join(state.snapshotDiffDir)), deps.rimraf(join(state.snapshotResultDir))])\n\treturn state\n}\n\nexport function createModule(state: VisSuite, testPath: string, options: Pick<VisOptions, 'snapshotSubpath'>) {\n\tconst taskSubpath = getTaskSubpath(state, testPath, options)\n\treturn {\n\t\ttaskSubpath,\n\t\tbaselineDir: join(state.snapshotBaselineDir, taskSubpath),\n\t\tresultDir: join(state.snapshotResultDir, taskSubpath),\n\t\tdiffDir: join(state.snapshotDiffDir, taskSubpath),\n\t\ttasks: {},\n\t}\n}\n\nexport function getTaskSubpath(state: VisSuite, testPath: string, options: Pick<VisOptions, 'snapshotSubpath'>) {\n\treturn getSnapshotSubpath(relative(state.projectRoot, testPath), options)\n}\n\nexport function getSuite(context: ExtendedBrowserCommandContext) {\n\treturn suites[getSuiteId(context)]!\n}\n"],"mappings":";;;;;;;;AASA,MAAM,SAAoB,EAAE;;;;;;AAO5B,eAAsB,WAAW,gBAA+C;CAC/E,MAAM,UAAU,WAAW,eAAe;CAC1C,MAAM,aAAa,aAAa,eAAe;AAE/C,KAAI,CAAC,OAAO,SACX,QAAO,WAAW,YAAY,gBAAgB,WAAW;CAG1D,MAAM,QAAQ,MAAM,OAAO;CAE3B,MAAM,EAAE,aAAa,aAAa,SAAS,WAAW,UAAU,aAC/D,OACA,eAAe,UACf,WACA;AACD,OAAM,QAAQ,eAAe;EAAE;EAAa;EAAS;EAAW;EAAO;AAEvE,OAAM,QAAQ,WAAW,CAAC,KAAK,OAAO,QAAQ,EAAE,KAAK,OAAO,UAAU,CAAC,CAAC;AACxE,QAAO;EACN,kBAAkB,WAAW;EAC7B,aAAa,WAAW;EACxB,kBAAkB,WAAW;EAC7B,sBAAsB,WAAW;EACjC,aAAa,WAAW;EACxB,SAAS,WAAW;EACpB,SAAS,WAAW;EACpB;;;;;;AAOF,SAAgB,WAAW,SAAwC;AAClE,QAAO,GAAG,eAAe,QAAQ,CAAC,GAAG,QAAQ,QAAQ,OAAO;;AAG7D,eAAe,YACd,gBACA,YACC;CAED,MAAM,kBAAkB,uBAAuB,gBAAgB,WAAW;CAC1E,MAAM,cAAc,eAAe,eAAe;CAElD,MAAM,QAAQ;EACb;EACA,aAAa,eAAe,QAAQ,OAAO;EAC3C,aAAa,eAAe,QAAQ,OAAO;EAC3C;EACA,qBAAqB,KAAK,iBAAiB,aAAa;EACxD,mBAAmB,KAAK,iBAAiB,WAAW;EACpD,iBAAiB,KAAK,iBAAiB,SAAS;EAChD,kBAAkB,KAAK,aAAa,gBAAgB;EACpD,SAAS,WAAW;EACpB,SAAS,EAAE;EACX;AACD,OAAM,QAAQ,WAAW,CAAC,KAAK,OAAO,KAAK,MAAM,gBAAgB,CAAC,EAAE,KAAK,OAAO,KAAK,MAAM,kBAAkB,CAAC,CAAC,CAAC;AAChH,QAAO;;AAGR,SAAgB,aAAa,OAAiB,UAAkB,SAA8C;CAC7G,MAAM,cAAc,eAAe,OAAO,UAAU,QAAQ;AAC5D,QAAO;EACN;EACA,aAAa,KAAK,MAAM,qBAAqB,YAAY;EACzD,WAAW,KAAK,MAAM,mBAAmB,YAAY;EACrD,SAAS,KAAK,MAAM,iBAAiB,YAAY;EACjD,OAAO,EAAE;EACT;;AAGF,SAAgB,eAAe,OAAiB,UAAkB,SAA8C;AAC/G,QAAO,mBAAmB,SAAS,MAAM,aAAa,SAAS,EAAE,QAAQ;;AAG1E,SAAgB,SAAS,SAAwC;AAChE,QAAO,OAAO,WAAW,QAAQ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { assertSnapshotKeyWithoutDash } from "../shared/asserts.mjs";
|
|
2
|
+
import { getProjectName } from "./project.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/server/vis_options.ts
|
|
5
|
+
const DEFAULT_PROJECT_NAME = "__default";
|
|
6
|
+
const visOptions = {};
|
|
7
|
+
function setVisOption(userConfig, options) {
|
|
8
|
+
assertSnapshotKeyWithoutDash(options?.snapshotKey);
|
|
9
|
+
const name = userConfig.test?.name;
|
|
10
|
+
const id = typeof name === "string" ? name : typeof name === "object" ? name?.label : DEFAULT_PROJECT_NAME;
|
|
11
|
+
visOptions[id] = options;
|
|
12
|
+
}
|
|
13
|
+
function getVisOption(context) {
|
|
14
|
+
return visOptions[getProjectName(context) ?? DEFAULT_PROJECT_NAME] ?? {};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { getVisOption, setVisOption };
|
|
19
|
+
//# sourceMappingURL=vis_options.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vis_options.mjs","names":[],"sources":["../../src/server/vis_options.ts"],"sourcesContent":["import type { TestUserConfig } from 'vitest/node'\nimport type { VisOptions } from '../config/types.ts'\nimport { assertSnapshotKeyWithoutDash } from '../shared/asserts.ts'\nimport { getProjectName } from './project.ts'\nimport type { ExtendedBrowserCommandContext } from './vis_server_context.types.ts'\n\nconst DEFAULT_PROJECT_NAME = '__default'\n\nconst visOptions: Record<string, VisOptions<any> | undefined> = {}\n\nexport function setVisOption(\n\tuserConfig: { test?: { name?: TestUserConfig['name'] | undefined } },\n\toptions: VisOptions<any> | undefined,\n) {\n\tassertSnapshotKeyWithoutDash(options?.snapshotKey)\n\n\tconst name = userConfig.test?.name\n\tconst id = typeof name === 'string' ? name : typeof name === 'object' ? name?.label : DEFAULT_PROJECT_NAME\n\tvisOptions[id] = options\n}\n\nexport function getVisOption(context: ExtendedBrowserCommandContext) {\n\tconst id = getProjectName(context) ?? DEFAULT_PROJECT_NAME\n\treturn visOptions[id] ?? {}\n}\n"],"mappings":";;;;AAMA,MAAM,uBAAuB;AAE7B,MAAM,aAA0D,EAAE;AAElE,SAAgB,aACf,YACA,SACC;AACD,8BAA6B,SAAS,YAAY;CAElD,MAAM,OAAO,WAAW,MAAM;CAC9B,MAAM,KAAK,OAAO,SAAS,WAAW,OAAO,OAAO,SAAS,WAAW,MAAM,QAAQ;AACtF,YAAW,MAAM;;AAGlB,SAAgB,aAAa,SAAwC;AAEpE,QAAO,WADI,eAAe,QAAQ,IAAI,yBACb,EAAE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import ci from "is-ci";
|
|
2
|
+
import { rimraf } from "rimraf";
|
|
3
|
+
|
|
4
|
+
//#region src/server/vis_server_context.deps.ts
|
|
5
|
+
/* v8 ignore start */
|
|
6
|
+
const deps = {
|
|
7
|
+
rimraf,
|
|
8
|
+
getSnapshotPlatform() {
|
|
9
|
+
return ci ? process.platform : "local";
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
/* v8 ignore end */
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { deps };
|
|
16
|
+
//# sourceMappingURL=vis_server_context.deps.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vis_server_context.deps.mjs","names":[],"sources":["../../src/server/vis_server_context.deps.ts"],"sourcesContent":["/* v8 ignore start */\nimport ci from 'is-ci'\nimport { rimraf } from 'rimraf'\n\nexport const deps = {\n\trimraf,\n\tgetSnapshotPlatform() {\n\t\treturn ci ? process.platform : 'local'\n\t},\n}\n/* v8 ignore end */\n"],"mappings":";;;;;AAIA,MAAa,OAAO;CACnB;CACA,sBAAsB;AACrB,SAAO,KAAK,QAAQ,WAAW;;CAEhC"}
|