creevey 0.9.0-beta.2 → 0.9.0-beta.20
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/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +1 -0
- package/CHANGELOG.md +51 -0
- package/README.md +9 -1
- package/addon/README.md +3 -0
- package/addon/package.json +5 -0
- package/docs/config.md +29 -26
- package/jest.config.js +6 -0
- package/lib/cjs/cli.js +1 -0
- package/lib/cjs/client/addon/Manager.js +170 -390
- package/lib/cjs/client/addon/components/Addon.js +17 -45
- package/lib/cjs/client/addon/components/Icons.js +12 -14
- package/lib/cjs/client/addon/components/Panel.js +21 -30
- package/lib/cjs/client/addon/components/TestSelect.js +20 -31
- package/lib/cjs/client/addon/components/Tools.js +35 -65
- package/lib/cjs/client/addon/decorator.js +1 -4
- package/lib/cjs/client/addon/index.js +27 -0
- package/lib/cjs/client/addon/preset.js +3 -76
- package/lib/cjs/client/addon/preview.js +11 -0
- package/lib/cjs/client/addon/readyForCapture.js +1 -4
- package/lib/cjs/client/addon/register.js +43 -82
- package/lib/cjs/client/addon/utils.js +4 -8
- package/lib/cjs/client/addon/withCreevey.js +145 -404
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +25 -35
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +29 -41
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +46 -83
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +39 -67
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -57
- package/lib/cjs/client/shared/components/ImagesView/index.js +9 -14
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +13 -16
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +16 -37
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +42 -34
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +40 -84
- package/lib/cjs/client/shared/components/ResultsPage.js +42 -99
- package/lib/cjs/client/shared/creeveyClientApi.js +56 -93
- package/lib/cjs/client/shared/helpers.js +149 -274
- package/lib/cjs/client/shared/viewMode.js +5 -9
- package/lib/cjs/client/web/192.js +1 -0
- package/lib/cjs/client/web/632.js +43 -0
- package/lib/cjs/client/web/794.js +1 -0
- package/lib/cjs/client/web/main.js +79 -38
- package/lib/cjs/client/web/main.js.LICENSE.txt +34 -0
- package/lib/cjs/creevey.js +15 -30
- package/lib/cjs/index.js +0 -15
- package/lib/cjs/server/config.js +16 -36
- package/lib/cjs/server/docker.js +8 -34
- package/lib/cjs/server/index.js +9 -34
- package/lib/cjs/server/logger.js +7 -20
- package/lib/cjs/server/master/api.js +1 -14
- package/lib/cjs/server/master/index.js +25 -49
- package/lib/cjs/server/master/master.js +6 -21
- package/lib/cjs/server/master/pool.js +10 -53
- package/lib/cjs/server/master/runner.js +65 -105
- package/lib/cjs/server/master/server.js +10 -29
- package/lib/cjs/server/messages.js +14 -62
- package/lib/cjs/server/selenium/browser.js +149 -185
- package/lib/cjs/server/selenium/index.js +0 -4
- package/lib/cjs/server/selenium/selenoid.js +18 -44
- package/lib/cjs/server/stories.js +35 -57
- package/lib/cjs/server/storybook/providers/browser.js +15 -29
- package/lib/cjs/server/storybook/providers/hybrid.js +16 -37
- package/lib/cjs/server/telemetry.js +167 -0
- package/lib/cjs/server/testsFiles/parser.js +3 -19
- package/lib/cjs/server/testsFiles/register.js +8 -14
- package/lib/cjs/server/update.js +4 -25
- package/lib/cjs/server/utils.js +35 -76
- package/lib/cjs/server/worker/chai-image.js +1 -27
- package/lib/cjs/server/worker/helpers.js +2 -12
- package/lib/cjs/server/worker/index.js +1 -3
- package/lib/cjs/server/worker/reporter.js +16 -43
- package/lib/cjs/server/worker/worker.js +32 -72
- package/lib/cjs/shared/index.js +87 -0
- package/lib/cjs/shared/serializeRegExp.js +34 -0
- package/lib/cjs/types.js +11 -20
- package/lib/esm/cli.js +1 -1
- package/lib/esm/client/addon/Manager.js +170 -381
- package/lib/esm/client/addon/components/Addon.js +15 -34
- package/lib/esm/client/addon/components/Icons.js +10 -6
- package/lib/esm/client/addon/components/Panel.js +20 -18
- package/lib/esm/client/addon/components/TestSelect.js +19 -23
- package/lib/esm/client/addon/components/Tools.js +33 -49
- package/lib/esm/client/addon/decorator.js +1 -1
- package/lib/esm/client/addon/index.js +2 -0
- package/lib/esm/client/addon/preset.js +2 -56
- package/lib/esm/client/addon/preview.js +5 -0
- package/lib/esm/client/addon/readyForCapture.js +1 -3
- package/lib/esm/client/addon/register.js +41 -67
- package/lib/esm/client/addon/utils.js +3 -7
- package/lib/esm/client/addon/withCreevey.js +142 -388
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +22 -18
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +27 -25
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +43 -63
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +23 -40
- package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
- package/lib/esm/client/shared/components/PageFooter/Paging.js +15 -29
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +40 -25
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +38 -66
- package/lib/esm/client/shared/components/ResultsPage.js +39 -75
- package/lib/esm/client/shared/creeveyClientApi.js +56 -90
- package/lib/esm/client/shared/helpers.js +133 -230
- package/lib/esm/client/shared/viewMode.js +4 -4
- package/lib/esm/client/web/192.js +1 -0
- package/lib/esm/client/web/632.js +43 -0
- package/lib/esm/client/web/794.js +1 -0
- package/lib/esm/client/web/index.html +19 -0
- package/lib/esm/client/web/main.js +79 -0
- package/lib/esm/client/web/main.js.LICENSE.txt +34 -0
- package/lib/esm/creevey.js +13 -16
- package/lib/esm/index.js +1 -4
- package/lib/esm/server/config.js +9 -16
- package/lib/esm/server/docker.js +6 -14
- package/lib/esm/server/index.js +8 -22
- package/lib/esm/server/logger.js +0 -1
- package/lib/esm/server/master/api.js +0 -9
- package/lib/esm/server/master/index.js +25 -35
- package/lib/esm/server/master/master.js +2 -7
- package/lib/esm/server/master/pool.js +8 -41
- package/lib/esm/server/master/runner.js +64 -90
- package/lib/esm/server/master/server.js +9 -11
- package/lib/esm/server/messages.js +8 -42
- package/lib/esm/server/selenium/browser.js +147 -163
- package/lib/esm/server/selenium/selenoid.js +16 -27
- package/lib/esm/server/stories.js +34 -46
- package/lib/esm/server/storybook/providers/browser.js +12 -17
- package/lib/esm/server/storybook/providers/hybrid.js +11 -22
- package/lib/esm/server/telemetry.js +160 -0
- package/lib/esm/server/testsFiles/parser.js +0 -6
- package/lib/esm/server/testsFiles/register.js +6 -7
- package/lib/esm/server/update.js +1 -13
- package/lib/esm/server/utils.js +20 -41
- package/lib/esm/server/worker/chai-image.js +0 -21
- package/lib/esm/server/worker/helpers.js +2 -9
- package/lib/esm/server/worker/reporter.js +15 -29
- package/lib/esm/server/worker/worker.js +31 -48
- package/lib/esm/shared/index.js +77 -0
- package/lib/esm/shared/serializeRegExp.js +24 -0
- package/lib/esm/types.js +5 -1
- package/lib/types/client/addon/Manager.d.ts +3 -3
- package/lib/types/client/addon/components/Addon.d.ts +1 -0
- package/lib/types/client/addon/components/Icons.d.ts +1 -0
- package/lib/types/client/addon/components/Panel.d.ts +1 -0
- package/lib/types/client/addon/components/Tools.d.ts +1 -0
- package/lib/types/client/addon/decorator.d.ts +1 -1
- package/lib/types/client/addon/index.d.ts +2 -0
- package/lib/types/client/addon/preset.d.ts +2 -24
- package/lib/types/client/addon/preview.d.ts +4 -0
- package/lib/types/client/addon/utils.d.ts +1 -0
- package/lib/types/client/addon/withCreevey.d.ts +4 -3
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -1
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +3 -1
- package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
- package/lib/types/client/web/CreeveyLoader.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +6 -3
- package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
- package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
- package/lib/types/client/web/KeyboardEventsContext.d.ts +4 -2
- package/lib/types/index.d.ts +4 -1
- package/lib/types/server/logger.d.ts +6 -2
- package/lib/types/server/messages.d.ts +14 -12
- package/lib/types/server/selenium/browser.d.ts +5 -3
- package/lib/types/server/storybook/providers/browser.d.ts +2 -4
- package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
- package/lib/types/server/telemetry.d.ts +2 -0
- package/lib/types/server/utils.d.ts +5 -1
- package/lib/types/shared/index.d.ts +7 -0
- package/lib/types/shared/serializeRegExp.d.ts +9 -0
- package/lib/types/types.d.ts +29 -36
- package/package.json +132 -133
- package/types/global.d.ts +5 -0
- package/lib/cjs/client/web/1.js +0 -13
- package/lib/cjs/client/web/2.js +0 -1
- package/lib/cjs/server/extract.js +0 -50
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -88
- package/lib/cjs/server/loaders/babel/helpers.js +0 -479
- package/lib/cjs/server/loaders/babel/register.js +0 -126
- package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
- package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
- package/lib/cjs/server/loaders/webpack/compile.js +0 -286
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -174
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -44
- package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
- package/lib/cjs/server/loaders/webpack/start.js +0 -41
- package/lib/cjs/server/storybook/entry.js +0 -68
- package/lib/cjs/server/storybook/helpers.js +0 -165
- package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
- package/lib/cjs/shared.js +0 -124
- package/lib/esm/server/extract.js +0 -34
- package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -74
- package/lib/esm/server/loaders/babel/helpers.js +0 -462
- package/lib/esm/server/loaders/babel/register.js +0 -105
- package/lib/esm/server/loaders/hooks/mdx.js +0 -15
- package/lib/esm/server/loaders/hooks/svelte.js +0 -49
- package/lib/esm/server/loaders/webpack/compile.js +0 -263
- package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -153
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -36
- package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
- package/lib/esm/server/loaders/webpack/start.js +0 -27
- package/lib/esm/server/storybook/entry.js +0 -44
- package/lib/esm/server/storybook/helpers.js +0 -106
- package/lib/esm/server/storybook/providers/nodejs.js +0 -217
- package/lib/esm/shared.js +0 -93
- package/lib/types/server/extract.d.ts +0 -2
- package/lib/types/server/loaders/babel/creevey-plugin.d.ts +0 -1
- package/lib/types/server/loaders/babel/helpers.d.ts +0 -19
- package/lib/types/server/loaders/babel/register.d.ts +0 -5
- package/lib/types/server/loaders/hooks/mdx.d.ts +0 -1
- package/lib/types/server/loaders/hooks/svelte.d.ts +0 -1
- package/lib/types/server/loaders/webpack/compile.d.ts +0 -2
- package/lib/types/server/loaders/webpack/creevey-loader.d.ts +0 -2
- package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +0 -10
- package/lib/types/server/loaders/webpack/mdx-loader.d.ts +0 -6
- package/lib/types/server/loaders/webpack/start.d.ts +0 -1
- package/lib/types/server/storybook/entry.d.ts +0 -18
- package/lib/types/server/storybook/helpers.d.ts +0 -24
- package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
- package/lib/types/shared.d.ts +0 -16
- package/preset.js +0 -9
- package/storybook-static/stories.json +0 -21
- package/types/mdx.d.ts +0 -6
@@ -1,41 +1,12 @@
|
|
1
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
2
|
-
|
3
|
-
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
4
|
-
|
5
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
6
|
-
|
7
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
8
|
-
|
9
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
10
|
-
|
11
|
-
function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); }
|
12
|
-
|
13
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
14
|
-
|
15
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
16
|
-
|
17
|
-
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
18
|
-
|
19
|
-
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
20
|
-
|
21
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
22
|
-
|
23
|
-
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
24
|
-
|
25
|
-
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
26
|
-
|
27
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
28
|
-
|
29
1
|
import { themes } from '@storybook/theming';
|
30
2
|
import { parse, stringify } from 'qs';
|
31
3
|
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
32
4
|
import { isTest, isDefined } from '../../types';
|
33
|
-
|
34
|
-
|
5
|
+
const statusUpdatesMap = new Map([[undefined, /(unknown|success|failed|pending|running)/], ['unknown', /(success|failed|pending|running)/], ['success', /(failed|pending|running)/], ['failed', /(pending|running)/], ['pending', /running/]]);
|
35
6
|
function makeEmptySuiteNode() {
|
36
|
-
|
7
|
+
let path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
37
8
|
return {
|
38
|
-
path
|
9
|
+
path,
|
39
10
|
skip: true,
|
40
11
|
opened: false,
|
41
12
|
checked: true,
|
@@ -43,199 +14,167 @@ function makeEmptySuiteNode() {
|
|
43
14
|
children: {}
|
44
15
|
};
|
45
16
|
}
|
46
|
-
|
47
17
|
export function calcStatus(oldStatus, newStatus) {
|
48
|
-
|
49
|
-
|
50
|
-
return newStatus && (_statusUpdatesMap$get = statusUpdatesMap.get(oldStatus)) !== null && _statusUpdatesMap$get !== void 0 && _statusUpdatesMap$get.test(newStatus) ? newStatus : oldStatus;
|
18
|
+
return newStatus && statusUpdatesMap.get(oldStatus)?.test(newStatus) ? newStatus : oldStatus;
|
51
19
|
}
|
52
20
|
export function getTestPath(test) {
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
21
|
+
const {
|
22
|
+
browser,
|
23
|
+
testName,
|
24
|
+
storyPath
|
25
|
+
} = test;
|
26
|
+
return [...storyPath, testName, browser].filter(isDefined);
|
57
27
|
}
|
58
28
|
export function getSuiteByPath(suite, path) {
|
59
|
-
return path.reduce(
|
60
|
-
return isTest(suiteOrTest) ? suiteOrTest : suiteOrTest === null || suiteOrTest === void 0 ? void 0 : suiteOrTest.children[pathToken];
|
61
|
-
}, suite);
|
29
|
+
return path.reduce((suiteOrTest, pathToken) => isTest(suiteOrTest) ? suiteOrTest : suiteOrTest?.children[pathToken], suite);
|
62
30
|
}
|
63
31
|
export function getTestByPath(suite, path) {
|
64
|
-
|
65
|
-
|
66
|
-
var test = (_getSuiteByPath = getSuiteByPath(suite, path)) !== null && _getSuiteByPath !== void 0 ? _getSuiteByPath : suite;
|
32
|
+
const test = getSuiteByPath(suite, path) ?? suite;
|
67
33
|
return isTest(test) ? test : null;
|
68
34
|
}
|
69
35
|
export function getTestsByStoryId(suite, storyId) {
|
70
|
-
return Object.values(suite.children).filter(isDefined).flatMap(
|
36
|
+
return Object.values(suite.children).filter(isDefined).flatMap(suiteOrTest => {
|
71
37
|
if (isTest(suiteOrTest)) return suiteOrTest.storyId === storyId ? suiteOrTest : [];
|
72
38
|
return getTestsByStoryId(suiteOrTest, storyId);
|
73
39
|
}).filter(isDefined);
|
74
40
|
}
|
75
|
-
|
76
41
|
function checkTests(suiteOrTest, checked) {
|
77
42
|
suiteOrTest.checked = checked;
|
78
|
-
|
79
43
|
if (!isTest(suiteOrTest)) {
|
80
44
|
suiteOrTest.indeterminate = false;
|
81
|
-
Object.values(suiteOrTest.children).filter(isDefined).forEach(
|
82
|
-
return checkTests(child, checked);
|
83
|
-
});
|
45
|
+
Object.values(suiteOrTest.children).filter(isDefined).forEach(child => checkTests(child, checked));
|
84
46
|
}
|
85
47
|
}
|
86
|
-
|
87
48
|
function updateChecked(suite) {
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
});
|
94
|
-
var checkedSome = children.some(function (test) {
|
95
|
-
return test.checked;
|
96
|
-
});
|
97
|
-
var indeterminate = children.some(function (test) {
|
98
|
-
return isTest(test) ? false : test.indeterminate;
|
99
|
-
}) || !checkedEvery && checkedSome;
|
100
|
-
var checked = indeterminate || suite.checked == checkedEvery ? suite.checked : checkedEvery;
|
49
|
+
const children = Object.values(suite.children).filter(isDefined).filter(child => !child.skip);
|
50
|
+
const checkedEvery = children.every(test => test.checked);
|
51
|
+
const checkedSome = children.some(test => test.checked);
|
52
|
+
const indeterminate = children.some(test => isTest(test) ? false : test.indeterminate) || !checkedEvery && checkedSome;
|
53
|
+
const checked = indeterminate || suite.checked == checkedEvery ? suite.checked : checkedEvery;
|
101
54
|
suite.checked = checked;
|
102
55
|
suite.indeterminate = indeterminate;
|
103
56
|
}
|
104
|
-
|
105
57
|
export function checkSuite(suite, path, checked) {
|
106
|
-
|
58
|
+
const subSuite = getSuiteByPath(suite, path);
|
107
59
|
if (subSuite) checkTests(subSuite, checked);
|
108
|
-
path.slice(0, -1).map(
|
109
|
-
|
110
|
-
}).forEach(function (parentPath) {
|
111
|
-
var parentSuite = getSuiteByPath(suite, parentPath);
|
60
|
+
path.slice(0, -1).map((_, index, tokens) => tokens.slice(0, tokens.length - index)).forEach(parentPath => {
|
61
|
+
const parentSuite = getSuiteByPath(suite, parentPath);
|
112
62
|
if (isTest(parentSuite)) return;
|
113
63
|
if (parentSuite) updateChecked(parentSuite);
|
114
64
|
});
|
115
65
|
updateChecked(suite);
|
116
66
|
}
|
117
67
|
export function treeifyTests(testsById) {
|
118
|
-
|
68
|
+
const rootSuite = makeEmptySuiteNode();
|
119
69
|
rootSuite.opened = true;
|
120
|
-
Object.values(testsById).forEach(
|
70
|
+
Object.values(testsById).forEach(test => {
|
121
71
|
if (!test) return;
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
browser = _getTestPath$reverse2[0],
|
126
|
-
testPath = _getTestPath$reverse2.slice(1);
|
127
|
-
|
128
|
-
var lastSuite = testPath.reverse().reduce(function (suite, token) {
|
129
|
-
var subSuite = suite.children[token] || makeEmptySuiteNode([].concat(_toConsumableArray(suite.path), [token]));
|
72
|
+
const [browser, ...testPath] = getTestPath(test).reverse();
|
73
|
+
const lastSuite = testPath.reverse().reduce((suite, token) => {
|
74
|
+
const subSuite = suite.children[token] || makeEmptySuiteNode([...suite.path, token]);
|
130
75
|
subSuite.status = calcStatus(subSuite.status, test.status);
|
131
76
|
if (!test.skip) subSuite.skip = false;
|
132
77
|
if (!subSuite.skip) suite.skip = false;
|
133
78
|
suite.children[token] = subSuite;
|
134
79
|
suite.status = calcStatus(suite.status, subSuite.status);
|
135
|
-
|
136
80
|
if (isTest(subSuite)) {
|
137
|
-
throw new Error(
|
81
|
+
throw new Error(`Suite and Test should not have same path '${JSON.stringify(getTestPath(subSuite))}'`);
|
138
82
|
}
|
139
|
-
|
140
83
|
return subSuite;
|
141
84
|
}, rootSuite);
|
142
|
-
lastSuite.children[browser] =
|
85
|
+
lastSuite.children[browser] = {
|
86
|
+
...test,
|
143
87
|
checked: true
|
144
|
-
}
|
88
|
+
};
|
145
89
|
});
|
146
90
|
return rootSuite;
|
147
91
|
}
|
148
92
|
export function getCheckedTests(suite) {
|
149
|
-
return Object.values(suite.children).filter(isDefined).flatMap(
|
93
|
+
return Object.values(suite.children).filter(isDefined).flatMap(suiteOrTest => {
|
150
94
|
if (isTest(suiteOrTest)) return suiteOrTest.checked ? suiteOrTest : [];
|
151
95
|
if (!suiteOrTest.checked && !suiteOrTest.indeterminate) return [];
|
152
96
|
return getCheckedTests(suiteOrTest);
|
153
97
|
});
|
154
98
|
}
|
155
99
|
export function updateTestStatus(suite, path, update) {
|
156
|
-
|
157
|
-
|
158
|
-
var title = path.shift();
|
100
|
+
const title = path.shift();
|
159
101
|
if (!title) return;
|
160
|
-
|
102
|
+
const suiteOrTest = suite.children[title] ?? (suite.children[title] = {
|
103
|
+
...(path.length == 0 ? update : makeEmptySuiteNode([...suite.path, title])),
|
161
104
|
checked: suite.checked
|
162
105
|
});
|
163
|
-
|
164
106
|
if (isTest(suiteOrTest)) {
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
107
|
+
const test = suiteOrTest;
|
108
|
+
const {
|
109
|
+
skip,
|
110
|
+
status,
|
111
|
+
results,
|
112
|
+
approved
|
113
|
+
} = update;
|
172
114
|
if (isDefined(skip)) test.skip = skip;
|
173
115
|
if (isDefined(status)) test.status = status;
|
174
|
-
if (isDefined(results)) test.results ?
|
175
|
-
if (isDefined(approved)) Object.entries(approved).forEach(
|
176
|
-
|
177
|
-
image = _ref2[0],
|
178
|
-
retry = _ref2[1];
|
179
|
-
|
116
|
+
if (isDefined(results)) test.results ? test.results.push(...results) : test.results = results;
|
117
|
+
if (isDefined(approved)) Object.entries(approved).forEach(_ref => {
|
118
|
+
let [image, retry] = _ref;
|
180
119
|
return retry !== undefined && ((test.approved = test.approved || {})[image] = retry);
|
181
120
|
});
|
182
121
|
} else {
|
183
|
-
|
122
|
+
const subSuite = suiteOrTest;
|
184
123
|
updateTestStatus(subSuite, path, update);
|
185
124
|
}
|
186
|
-
|
187
|
-
|
188
|
-
|
125
|
+
suite.skip = Object.values(suite.children).filter(isDefined).map(_ref2 => {
|
126
|
+
let {
|
127
|
+
skip
|
128
|
+
} = _ref2;
|
189
129
|
return skip;
|
190
130
|
}).every(Boolean);
|
191
|
-
suite.status = Object.values(suite.children).filter(isDefined).map(
|
192
|
-
|
131
|
+
suite.status = Object.values(suite.children).filter(isDefined).map(_ref3 => {
|
132
|
+
let {
|
133
|
+
status
|
134
|
+
} = _ref3;
|
193
135
|
return status;
|
194
136
|
}).reduce(calcStatus);
|
195
137
|
}
|
196
138
|
export function removeTests(suite, path) {
|
197
|
-
|
198
|
-
|
199
|
-
var title = path.shift();
|
139
|
+
const title = path.shift();
|
200
140
|
if (!title) return;
|
201
|
-
|
141
|
+
const suiteOrTest = suite.children[title];
|
202
142
|
if (suiteOrTest && !isTest(suiteOrTest)) removeTests(suiteOrTest, path);
|
203
|
-
if (isTest(suiteOrTest) || Object.keys(
|
143
|
+
if (isTest(suiteOrTest) || Object.keys(suiteOrTest?.children ?? {}).length == 0) delete suite.children[title];
|
204
144
|
if (Object.keys(suite.children).length == 0) return;
|
205
145
|
updateChecked(suite);
|
206
|
-
suite.skip = Object.values(suite.children).filter(isDefined).map(
|
207
|
-
|
146
|
+
suite.skip = Object.values(suite.children).filter(isDefined).map(_ref4 => {
|
147
|
+
let {
|
148
|
+
skip
|
149
|
+
} = _ref4;
|
208
150
|
return skip;
|
209
151
|
}).every(Boolean);
|
210
|
-
suite.status = Object.values(suite.children).filter(isDefined).map(
|
211
|
-
|
152
|
+
suite.status = Object.values(suite.children).filter(isDefined).map(_ref5 => {
|
153
|
+
let {
|
154
|
+
status
|
155
|
+
} = _ref5;
|
212
156
|
return status;
|
213
157
|
}).reduce(calcStatus);
|
214
158
|
}
|
215
159
|
export function filterTests(suite, filter) {
|
216
|
-
|
217
|
-
|
160
|
+
const {
|
161
|
+
status,
|
162
|
+
subStrings
|
163
|
+
} = filter;
|
218
164
|
if (!status && !subStrings.length) return suite;
|
219
|
-
|
220
|
-
|
165
|
+
const filteredSuite = {
|
166
|
+
...suite,
|
221
167
|
children: {}
|
222
|
-
}
|
223
|
-
|
224
|
-
|
225
|
-
var _ref8 = _slicedToArray(_ref7, 2),
|
226
|
-
title = _ref8[0],
|
227
|
-
suiteOrTest = _ref8[1];
|
228
|
-
|
168
|
+
};
|
169
|
+
Object.entries(suite.children).forEach(_ref6 => {
|
170
|
+
let [title, suiteOrTest] = _ref6;
|
229
171
|
if (!suiteOrTest || suiteOrTest.skip) return;
|
230
|
-
|
231
|
-
if (!status && subStrings.some(function (subString) {
|
232
|
-
return title.toLowerCase().includes(subString);
|
233
|
-
})) {
|
172
|
+
if (!status && subStrings.some(subString => title.toLowerCase().includes(subString))) {
|
234
173
|
filteredSuite.children[title] = suiteOrTest;
|
235
174
|
} else if (isTest(suiteOrTest)) {
|
236
175
|
if (status && suiteOrTest.status && ['pending', 'running', status].includes(suiteOrTest.status)) filteredSuite.children[title] = suiteOrTest;
|
237
176
|
} else {
|
238
|
-
|
177
|
+
const filteredSubSuite = filterTests(suiteOrTest, filter);
|
239
178
|
if (Object.keys(filteredSubSuite.children).length == 0) return;
|
240
179
|
filteredSuite.children[title] = filteredSubSuite;
|
241
180
|
}
|
@@ -243,7 +182,7 @@ export function filterTests(suite, filter) {
|
|
243
182
|
return filteredSuite;
|
244
183
|
}
|
245
184
|
export function openSuite(suite, path, opened) {
|
246
|
-
|
185
|
+
const subSuite = path.reduce((suiteOrTest, pathToken) => {
|
247
186
|
if (suiteOrTest && !isTest(suiteOrTest)) {
|
248
187
|
if (opened) suiteOrTest.opened = opened;
|
249
188
|
return suiteOrTest.children[pathToken];
|
@@ -253,25 +192,21 @@ export function openSuite(suite, path, opened) {
|
|
253
192
|
}
|
254
193
|
export function flattenSuite(suite) {
|
255
194
|
if (!suite.opened) return [];
|
256
|
-
return Object.entries(suite.children).flatMap(
|
257
|
-
|
258
|
-
title = _ref10[0],
|
259
|
-
subSuite = _ref10[1];
|
260
|
-
|
195
|
+
return Object.entries(suite.children).flatMap(_ref7 => {
|
196
|
+
let [title, subSuite] = _ref7;
|
261
197
|
return subSuite ? [{
|
262
|
-
title
|
198
|
+
title,
|
263
199
|
suite: subSuite
|
264
|
-
}
|
200
|
+
}, ...(isTest(subSuite) ? [] : flattenSuite(subSuite))] : [];
|
265
201
|
});
|
266
202
|
}
|
267
203
|
export function countTestsStatus(suite) {
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
204
|
+
let successCount = 0;
|
205
|
+
let failedCount = 0;
|
206
|
+
let skippedCount = 0;
|
207
|
+
let pendingCount = 0;
|
208
|
+
const cases = Object.values(suite.children).filter(isDefined);
|
209
|
+
let suiteOrTest;
|
275
210
|
while (suiteOrTest = cases.pop()) {
|
276
211
|
if (isTest(suiteOrTest)) {
|
277
212
|
if (suiteOrTest.skip) skippedCount++;
|
@@ -279,15 +214,14 @@ export function countTestsStatus(suite) {
|
|
279
214
|
if (suiteOrTest.status === 'failed') failedCount++;
|
280
215
|
if (suiteOrTest.status === 'pending') pendingCount++;
|
281
216
|
} else {
|
282
|
-
cases.push
|
217
|
+
cases.push(...Object.values(suiteOrTest.children).filter(isDefined));
|
283
218
|
}
|
284
219
|
}
|
285
|
-
|
286
220
|
return {
|
287
|
-
successCount
|
288
|
-
failedCount
|
289
|
-
skippedCount
|
290
|
-
pendingCount
|
221
|
+
successCount,
|
222
|
+
failedCount,
|
223
|
+
skippedCount,
|
224
|
+
pendingCount
|
291
225
|
};
|
292
226
|
}
|
293
227
|
export function getConnectionUrl() {
|
@@ -295,130 +229,99 @@ export function getConnectionUrl() {
|
|
295
229
|
}
|
296
230
|
export function getImageUrl(path, imageName) {
|
297
231
|
// path => [kind, story, test, browser]
|
298
|
-
|
299
|
-
|
300
|
-
return imageName == browser ? imagesUrl :
|
232
|
+
const browser = path.slice(-1)[0];
|
233
|
+
const imagesUrl = window.location.host ? `${window.location.protocol}//${getConnectionUrl()}${window.location.pathname == '/' ? '/report' : window.location.pathname.split('/').slice(0, -1).join('/')}/${encodeURI(path.slice(0, -1).join('/'))}` : encodeURI(path.slice(0, -1).join('/'));
|
234
|
+
return imageName == browser ? imagesUrl : `${imagesUrl}/${encodeURI(browser)}`;
|
301
235
|
}
|
302
236
|
export function getBorderSize(element) {
|
303
237
|
// NOTE Firefox returns empty string for `borderWidth` prop
|
304
|
-
|
238
|
+
const borderSize = parseFloat(getComputedStyle(element).borderTopWidth);
|
305
239
|
return Number.isNaN(borderSize) ? 0 : borderSize;
|
306
240
|
}
|
307
241
|
export function useLoadImages(s1, s2, s3) {
|
308
|
-
|
309
|
-
|
310
|
-
loaded = _useState2[0],
|
311
|
-
setLoaded = _useState2[1];
|
312
|
-
|
313
|
-
useEffect(function () {
|
242
|
+
const [loaded, setLoaded] = useState(false);
|
243
|
+
useEffect(() => {
|
314
244
|
setLoaded(false);
|
315
|
-
void Promise.all([s1, s2, s3].map(
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
});
|
322
|
-
})).then(function () {
|
323
|
-
return setLoaded(true);
|
324
|
-
});
|
245
|
+
void Promise.all([s1, s2, s3].map(url => new Promise(resolve => {
|
246
|
+
const image = document.createElement('img');
|
247
|
+
image.src = url;
|
248
|
+
image.onload = resolve;
|
249
|
+
image.onerror = resolve;
|
250
|
+
}))).then(() => setLoaded(true));
|
325
251
|
}, [s1, s2, s3]);
|
326
252
|
return loaded;
|
327
253
|
}
|
254
|
+
|
328
255
|
/**
|
329
256
|
* Uses the ResizeObserver API to observe changes within the given HTML Element DOM Rect.
|
330
257
|
*
|
331
258
|
* @returns dimensions of element's content box (which means without paddings and border width)
|
332
259
|
*/
|
333
|
-
|
334
260
|
export function useResizeObserver(elementRef, onResize) {
|
335
|
-
|
336
|
-
|
337
|
-
useEffect(
|
261
|
+
let debounceTimeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 16;
|
262
|
+
const observerRef = useRef(null);
|
263
|
+
useEffect(() => {
|
338
264
|
if (!elementRef.current) return;
|
339
265
|
observerRef.current = new ResizeObserver(onResize);
|
340
266
|
observerRef.current.observe(elementRef.current);
|
341
|
-
return
|
342
|
-
var _observerRef$current;
|
343
|
-
|
344
|
-
return (_observerRef$current = observerRef.current) === null || _observerRef$current === void 0 ? void 0 : _observerRef$current.disconnect();
|
345
|
-
};
|
267
|
+
return () => observerRef.current?.disconnect();
|
346
268
|
}, [debounceTimeout, elementRef, onResize]);
|
347
269
|
}
|
348
270
|
export function useApplyScale(imageRef, scale, dependency) {
|
349
|
-
useLayoutEffect(
|
271
|
+
useLayoutEffect(() => {
|
350
272
|
if (!imageRef.current) return;
|
351
|
-
|
352
|
-
|
353
|
-
image.style.height =
|
273
|
+
const image = imageRef.current;
|
274
|
+
const borderSize = getBorderSize(image);
|
275
|
+
image.style.height = `${image.naturalHeight * scale + borderSize * 2}px`;
|
354
276
|
}, [imageRef, scale, dependency]);
|
355
277
|
}
|
356
278
|
export function useCalcScale(diffImageRef, loaded) {
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
setScale = _useState4[1];
|
361
|
-
|
362
|
-
var calcScale = useCallback(function () {
|
363
|
-
var diffImage = diffImageRef.current;
|
279
|
+
const [scale, setScale] = useState(1);
|
280
|
+
const calcScale = useCallback(() => {
|
281
|
+
const diffImage = diffImageRef.current;
|
364
282
|
if (!diffImage || !loaded) return setScale(1);
|
365
|
-
|
366
|
-
|
283
|
+
const borderSize = getBorderSize(diffImage);
|
284
|
+
const ratio = (diffImage.getBoundingClientRect().width - borderSize * 2) / diffImage.naturalWidth;
|
367
285
|
setScale(Math.min(1, ratio));
|
368
286
|
}, [diffImageRef, loaded]);
|
369
287
|
useResizeObserver(diffImageRef, calcScale);
|
370
288
|
useLayoutEffect(calcScale, [calcScale]);
|
371
289
|
return scale;
|
372
290
|
}
|
373
|
-
|
374
|
-
|
291
|
+
const CREEVEY_THEME = 'Creevey_theme';
|
375
292
|
function isTheme(theme) {
|
376
293
|
return isDefined(theme) && Object.prototype.hasOwnProperty.call(themes, theme);
|
377
294
|
}
|
378
|
-
|
379
295
|
function initialTheme() {
|
380
|
-
|
296
|
+
const theme = localStorage.getItem(CREEVEY_THEME);
|
381
297
|
return isTheme(theme) ? theme : 'light';
|
382
298
|
}
|
383
|
-
|
384
299
|
export function useTheme() {
|
385
|
-
|
386
|
-
|
387
|
-
theme = _useState6[0],
|
388
|
-
setTheme = _useState6[1];
|
389
|
-
|
390
|
-
useEffect(function () {
|
300
|
+
const [theme, setTheme] = useState(initialTheme());
|
301
|
+
useEffect(() => {
|
391
302
|
localStorage.setItem(CREEVEY_THEME, theme);
|
392
303
|
}, [theme]);
|
393
304
|
return [theme, setTheme];
|
394
305
|
}
|
395
306
|
export function setSearchParams(testPath) {
|
396
|
-
|
397
|
-
testPath
|
398
|
-
})
|
307
|
+
const pageUrl = `?${stringify({
|
308
|
+
testPath
|
309
|
+
})}`;
|
399
310
|
window.history.pushState({
|
400
|
-
testPath
|
311
|
+
testPath
|
401
312
|
}, '', pageUrl);
|
402
313
|
}
|
403
314
|
export function getTestPathFromSearch() {
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
if (Array.isArray(testPath) && testPath.every(
|
409
|
-
return typeof token == 'string';
|
410
|
-
})) {
|
315
|
+
const {
|
316
|
+
testPath
|
317
|
+
} = parse(window.location.search.slice(1));
|
318
|
+
//@ts-expect-error: This expression is not callable.
|
319
|
+
if (Array.isArray(testPath) && testPath.every(token => typeof token == 'string')) {
|
411
320
|
return testPath;
|
412
321
|
}
|
413
|
-
|
414
322
|
return [];
|
415
323
|
}
|
416
324
|
export function useForceUpdate() {
|
417
|
-
|
418
|
-
|
419
|
-
update = _useState8[1];
|
420
|
-
|
421
|
-
return useCallback(function () {
|
422
|
-
return update({});
|
423
|
-
}, []);
|
325
|
+
const [, update] = useState({});
|
326
|
+
return useCallback(() => update({}), []);
|
424
327
|
}
|
@@ -1,6 +1,6 @@
|
|
1
|
-
export
|
2
|
-
export
|
3
|
-
export
|
4
|
-
|
1
|
+
export const VIEW_MODE_KEY = 'Creevey_view_mode';
|
2
|
+
export const viewModes = ['side-by-side', 'swap', 'slide', 'blend'];
|
3
|
+
export const getViewMode = () => {
|
4
|
+
const item = localStorage.getItem(VIEW_MODE_KEY);
|
5
5
|
return item && viewModes.includes(item) ? item : 'side-by-side';
|
6
6
|
};
|
@@ -0,0 +1 @@
|
|
1
|
+
"use strict";(self.webpackChunkcreevey=self.webpackChunkcreevey||[]).push([[192],{8192:(e,r,a)=>{a.r(r),a.d(r,{SyntaxHighlighter:()=>c.d3,createCopyToClipboardFunction:()=>c.xV,default:()=>c.qG});var c=a(23809)}}]);
|