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