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
@@ -2,83 +2,69 @@ import React from 'react';
|
|
2
2
|
import { Button, Icons } from '@storybook/components';
|
3
3
|
import { noop } from '../../../../types';
|
4
4
|
import { styled } from '@storybook/theming';
|
5
|
-
|
5
|
+
const StyledButton = styled(Button)({
|
6
6
|
transform: 'none',
|
7
7
|
marginLeft: '8px'
|
8
8
|
});
|
9
9
|
export function Paging(props) {
|
10
|
-
|
10
|
+
const renderItem = (item, index) => {
|
11
11
|
switch (item) {
|
12
12
|
case '.':
|
13
13
|
{
|
14
14
|
return /*#__PURE__*/React.createElement(StyledButton, {
|
15
15
|
disabled: true,
|
16
|
-
key:
|
16
|
+
key: `dots${index < 5 ? 'Left' : 'Right'}`
|
17
17
|
}, '...');
|
18
18
|
}
|
19
|
-
|
20
19
|
case 'forward':
|
21
20
|
{
|
22
|
-
|
21
|
+
const disabled = props.activePage === props.pagesCount;
|
23
22
|
return /*#__PURE__*/React.createElement(StyledButton, {
|
24
23
|
outline: true,
|
25
24
|
disabled: disabled,
|
26
|
-
onClick: disabled ? noop :
|
27
|
-
return goToPage(props.activePage + 1);
|
28
|
-
},
|
25
|
+
onClick: disabled ? noop : () => goToPage(props.activePage + 1),
|
29
26
|
key: "forward"
|
30
27
|
}, /*#__PURE__*/React.createElement("span", null, "Next ", /*#__PURE__*/React.createElement(Icons, {
|
31
28
|
icon: "arrowright"
|
32
29
|
})));
|
33
30
|
}
|
34
|
-
|
35
31
|
default:
|
36
32
|
{
|
37
33
|
return /*#__PURE__*/React.createElement(StyledButton, {
|
38
34
|
outline: true,
|
39
35
|
secondary: props.activePage === item,
|
40
36
|
key: item,
|
41
|
-
onClick:
|
42
|
-
return goToPage(item);
|
43
|
-
}
|
37
|
+
onClick: () => goToPage(item)
|
44
38
|
}, item);
|
45
39
|
}
|
46
40
|
}
|
47
41
|
};
|
48
|
-
|
49
|
-
var goToPage = function goToPage(pageNumber) {
|
42
|
+
const goToPage = pageNumber => {
|
50
43
|
if (1 <= pageNumber && pageNumber !== props.activePage && pageNumber <= props.pagesCount) {
|
51
44
|
props.onPageChange(pageNumber);
|
52
45
|
}
|
53
46
|
};
|
54
|
-
|
55
47
|
return /*#__PURE__*/React.createElement("div", null, getItems(props.activePage, props.pagesCount).map(renderItem));
|
56
48
|
}
|
57
|
-
|
58
49
|
function getItems(active, total) {
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
50
|
+
const result = [];
|
51
|
+
const left = Math.max(Math.min(active - 2, total - 4), 1);
|
52
|
+
const right = Math.min(Math.max(5, active + 2), total);
|
53
|
+
const hasLeftDots = left > 3;
|
54
|
+
const from = hasLeftDots ? left : 1;
|
55
|
+
const hasRightDots = right < total - 2;
|
56
|
+
const to = hasRightDots ? right : total;
|
67
57
|
if (hasLeftDots) {
|
68
58
|
result.push(1, '.');
|
69
59
|
}
|
70
|
-
|
71
|
-
for (var i = from; i <= to; ++i) {
|
60
|
+
for (let i = from; i <= to; ++i) {
|
72
61
|
result.push(i);
|
73
62
|
}
|
74
|
-
|
75
63
|
if (hasRightDots) {
|
76
64
|
result.push('.');
|
77
65
|
}
|
78
|
-
|
79
66
|
if (hasRightDots && isFinite(total)) {
|
80
67
|
result.push(total);
|
81
68
|
}
|
82
|
-
|
83
69
|
return result.concat('forward');
|
84
70
|
}
|
@@ -1,9 +1,11 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { styled, withTheme } from '@storybook/theming';
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
const IMG_SIZE = 64;
|
4
|
+
const DIAG_LENGTH = (2 * (IMG_SIZE - 8) ** 2) ** (1 / 2);
|
5
|
+
const Button = styled.button(_ref => {
|
6
|
+
let {
|
7
|
+
borderColor
|
8
|
+
} = _ref;
|
7
9
|
return {
|
8
10
|
appearance: 'none',
|
9
11
|
background: 'none',
|
@@ -20,38 +22,51 @@ var Button = styled.button(function (_ref) {
|
|
20
22
|
}
|
21
23
|
};
|
22
24
|
});
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
const Image = withTheme(styled.img(_ref2 => {
|
26
|
+
let {
|
27
|
+
hasBorder,
|
28
|
+
backgroundColor,
|
29
|
+
theme
|
30
|
+
} = _ref2;
|
27
31
|
return {
|
28
|
-
maxHeight:
|
29
|
-
width:
|
32
|
+
maxHeight: `${IMG_SIZE}px`,
|
33
|
+
width: `${IMG_SIZE}px`,
|
30
34
|
overflow: 'hidden',
|
31
35
|
transform: hasBorder ? 'translateY(2px)' : undefined,
|
32
36
|
'&::before': {
|
33
37
|
content: "' '",
|
34
38
|
display: 'block',
|
35
|
-
height:
|
36
|
-
width:
|
39
|
+
height: `${IMG_SIZE - 8}px`,
|
40
|
+
width: `${IMG_SIZE - 8}px`,
|
37
41
|
margin: '4px',
|
38
42
|
backgroundColor: backgroundColor,
|
39
|
-
backgroundImage:
|
43
|
+
backgroundImage: `linear-gradient(
|
44
|
+
45deg,
|
45
|
+
rgba(0, 0, 0, 0) ${DIAG_LENGTH / 2 - 0.5}px,
|
46
|
+
${theme.color.medium} ${DIAG_LENGTH / 2 - 0.5}px,
|
47
|
+
${theme.color.medium} ${DIAG_LENGTH / 2 + 0.5}px,
|
48
|
+
rgba(0, 0, 0, 0) ${DIAG_LENGTH / 2 + 0.5}px
|
49
|
+
),
|
50
|
+
linear-gradient(
|
51
|
+
315deg,
|
52
|
+
rgba(0, 0, 0, 0) ${DIAG_LENGTH / 2 + 0.2}px,
|
53
|
+
${theme.color.medium} ${DIAG_LENGTH / 2 + 0.2}px,
|
54
|
+
${theme.color.medium} ${DIAG_LENGTH / 2 + 1.2}px,
|
55
|
+
rgba(0, 0, 0, 0) ${DIAG_LENGTH / 2 + 1.2}px
|
56
|
+
)`
|
40
57
|
}
|
41
58
|
};
|
42
59
|
}));
|
43
|
-
export
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
};
|
54
|
-
|
60
|
+
export const ImagePreview = withTheme(_ref3 => {
|
61
|
+
let {
|
62
|
+
isActive,
|
63
|
+
onClick,
|
64
|
+
imageName,
|
65
|
+
url,
|
66
|
+
theme,
|
67
|
+
error
|
68
|
+
} = _ref3;
|
69
|
+
const handleClick = () => onClick(imageName);
|
55
70
|
return /*#__PURE__*/React.createElement(Button, {
|
56
71
|
onClick: handleClick,
|
57
72
|
borderColor: isActive ? theme.barSelectedColor : error ? theme.color.negative : undefined
|
@@ -1,26 +1,16 @@
|
|
1
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
2
|
-
|
3
|
-
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."); }
|
4
|
-
|
5
|
-
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); }
|
6
|
-
|
7
|
-
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; }
|
8
|
-
|
9
|
-
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; }
|
10
|
-
|
11
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
12
|
-
|
13
1
|
import React, { useState } from 'react';
|
14
2
|
import { getImageUrl } from '../../helpers';
|
15
3
|
import { Icons, Tabs } from '@storybook/components';
|
16
4
|
import { styled, withTheme } from '@storybook/theming';
|
17
5
|
import { ImagePreview } from './ImagePreview';
|
18
6
|
import { viewModes } from '../../viewMode';
|
19
|
-
|
7
|
+
const Container = styled.div({
|
20
8
|
margin: '24px 44px 0'
|
21
9
|
});
|
22
|
-
|
23
|
-
|
10
|
+
const ErrorContainer = withTheme(styled.div(_ref => {
|
11
|
+
let {
|
12
|
+
theme
|
13
|
+
} = _ref;
|
24
14
|
return {
|
25
15
|
marginTop: '8px',
|
26
16
|
padding: '8px',
|
@@ -41,66 +31,50 @@ var ErrorContainer = withTheme(styled.div(function (_ref) {
|
|
41
31
|
}
|
42
32
|
};
|
43
33
|
}));
|
44
|
-
|
34
|
+
const H1 = styled.h1({
|
45
35
|
margin: 0,
|
46
36
|
marginBottom: '8px'
|
47
37
|
});
|
48
|
-
|
49
|
-
|
38
|
+
const HeaderDivider = withTheme(styled.span(_ref2 => {
|
39
|
+
let {
|
40
|
+
theme
|
41
|
+
} = _ref2;
|
50
42
|
return {
|
51
43
|
padding: '0 8px',
|
52
44
|
color: theme.color.mediumdark
|
53
45
|
};
|
54
46
|
}));
|
55
|
-
|
47
|
+
const ImagesEntriesContainer = styled.div({
|
56
48
|
display: 'flex',
|
57
49
|
margin: '16px 0 8px'
|
58
50
|
});
|
59
51
|
export function PageHeader(_ref3) {
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
var handleImageChange = function handleImageChange(name) {
|
81
|
-
return setImageName(name), onImageChange(name);
|
82
|
-
};
|
83
|
-
|
84
|
-
var handleViewModeChange = function handleViewModeChange(mode) {
|
85
|
-
return onViewModeChange(mode);
|
86
|
-
};
|
87
|
-
|
88
|
-
var error = errorMessage || imagesWithError.includes(imageName) ? ((_images$imageName = images[imageName]) === null || _images$imageName === void 0 ? void 0 : _images$imageName.error) || errorMessage : null;
|
89
|
-
return showTitle || error || imageEntires.length > 1 || showViewModes ? /*#__PURE__*/React.createElement(Container, null, showTitle && /*#__PURE__*/React.createElement(H1, null, title.flatMap(function (token) {
|
90
|
-
return [token, /*#__PURE__*/React.createElement(HeaderDivider, {
|
91
|
-
key: token
|
92
|
-
}, "/")];
|
93
|
-
}).slice(0, -1)), error && /*#__PURE__*/React.createElement(ErrorContainer, null, /*#__PURE__*/React.createElement(Icons, {
|
52
|
+
let {
|
53
|
+
title,
|
54
|
+
images = {},
|
55
|
+
errorMessage,
|
56
|
+
showViewModes,
|
57
|
+
showTitle,
|
58
|
+
viewMode,
|
59
|
+
imagesWithError = [],
|
60
|
+
onImageChange,
|
61
|
+
onViewModeChange
|
62
|
+
} = _ref3;
|
63
|
+
const imageEntires = Object.entries(images);
|
64
|
+
const [imageName, setImageName] = useState((imageEntires[0] ?? [])[0] ?? '');
|
65
|
+
const handleImageChange = name => (setImageName(name), onImageChange(name));
|
66
|
+
const handleViewModeChange = mode => onViewModeChange(mode);
|
67
|
+
const error = errorMessage || imagesWithError.includes(imageName) ? images[imageName]?.error || errorMessage : null;
|
68
|
+
return showTitle || error || imageEntires.length > 1 || showViewModes ? /*#__PURE__*/React.createElement(Container, null, showTitle && /*#__PURE__*/React.createElement(H1, null, title.flatMap(token => [token, /*#__PURE__*/React.createElement(HeaderDivider, {
|
69
|
+
key: token
|
70
|
+
}, "/")]).slice(0, -1)), error && /*#__PURE__*/React.createElement(ErrorContainer, null, /*#__PURE__*/React.createElement(Icons, {
|
94
71
|
icon: "closeAlt"
|
95
|
-
}), /*#__PURE__*/React.createElement("pre", null, error)), imageEntires.length > 1 ? /*#__PURE__*/React.createElement(ImagesEntriesContainer, null, imageEntires.map(
|
96
|
-
|
97
|
-
name = _ref5[0],
|
98
|
-
image = _ref5[1];
|
99
|
-
|
72
|
+
}), /*#__PURE__*/React.createElement("pre", null, error)), imageEntires.length > 1 ? /*#__PURE__*/React.createElement(ImagesEntriesContainer, null, imageEntires.map(_ref4 => {
|
73
|
+
let [name, image] = _ref4;
|
100
74
|
return /*#__PURE__*/React.createElement(ImagePreview, {
|
101
75
|
key: name,
|
102
76
|
imageName: name,
|
103
|
-
url:
|
77
|
+
url: `${getImageUrl(title, name)}/${image.actual}`,
|
104
78
|
isActive: name === imageName,
|
105
79
|
onClick: handleImageChange,
|
106
80
|
error: imagesWithError.includes(name)
|
@@ -110,11 +84,9 @@ export function PageHeader(_ref3) {
|
|
110
84
|
actions: {
|
111
85
|
onSelect: handleViewModeChange
|
112
86
|
}
|
113
|
-
}, viewModes.map(
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
});
|
119
|
-
}))) : null;
|
87
|
+
}, viewModes.map(x => /*#__PURE__*/React.createElement("div", {
|
88
|
+
key: x,
|
89
|
+
id: x,
|
90
|
+
title: x
|
91
|
+
})))) : null;
|
120
92
|
}
|
@@ -1,15 +1,3 @@
|
|
1
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
2
|
-
|
3
|
-
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."); }
|
4
|
-
|
5
|
-
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); }
|
6
|
-
|
7
|
-
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; }
|
8
|
-
|
9
|
-
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; }
|
10
|
-
|
11
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
12
|
-
|
13
1
|
import React, { useState, useEffect } from 'react';
|
14
2
|
import { ImagesView } from './ImagesView/ImagesView';
|
15
3
|
import { PageHeader } from './PageHeader/PageHeader';
|
@@ -18,39 +6,43 @@ import { getImageUrl } from '../helpers';
|
|
18
6
|
import { styled, withTheme } from '@storybook/theming';
|
19
7
|
import { Placeholder, ScrollArea } from '@storybook/components';
|
20
8
|
import { getViewMode, VIEW_MODE_KEY } from '../viewMode';
|
21
|
-
|
9
|
+
const Wrapper = styled.div({
|
22
10
|
width: '100%',
|
23
11
|
height: '100%',
|
24
12
|
boxSizing: 'border-box',
|
25
13
|
display: 'flex',
|
26
14
|
flexDirection: 'column'
|
27
15
|
});
|
28
|
-
|
29
|
-
|
16
|
+
const ImagesViewContainer = styled.div(_ref => {
|
17
|
+
let {
|
18
|
+
theme
|
19
|
+
} = _ref;
|
30
20
|
return {
|
31
21
|
background: theme.base == 'light' ? theme.color.mediumlight : theme.color.darker,
|
32
22
|
flexGrow: 1,
|
33
23
|
padding: '20px 0'
|
34
24
|
};
|
35
25
|
});
|
36
|
-
|
26
|
+
const HeaderContainer = styled.div({
|
37
27
|
position: 'sticky',
|
38
28
|
top: 0,
|
39
29
|
zIndex: 1
|
40
30
|
});
|
41
|
-
|
42
|
-
flexGrow: 1
|
31
|
+
const BodyContainer = styled.div({
|
32
|
+
flexGrow: 1,
|
33
|
+
minHeight: 0
|
43
34
|
});
|
44
|
-
|
35
|
+
const FooterContainer = styled.div({
|
45
36
|
position: 'sticky',
|
46
37
|
bottom: 0,
|
47
38
|
zIndex: 1
|
48
39
|
});
|
49
|
-
|
50
|
-
|
51
|
-
|
40
|
+
const Container = styled.div(_ref2 => {
|
41
|
+
let {
|
42
|
+
height = '100vh'
|
43
|
+
} = _ref2;
|
52
44
|
return {
|
53
|
-
height
|
45
|
+
height,
|
54
46
|
width: '100%',
|
55
47
|
overflowY: 'hidden',
|
56
48
|
display: 'flex',
|
@@ -58,59 +50,31 @@ var Container = styled.div(function (_ref2) {
|
|
58
50
|
};
|
59
51
|
});
|
60
52
|
export function ResultsPageInternal(_ref3) {
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
84
|
-
imageName = _useState4[0],
|
85
|
-
setImageName = _useState4[1];
|
86
|
-
|
87
|
-
var _useState5 = useState(getViewMode()),
|
88
|
-
_useState6 = _slicedToArray(_useState5, 2),
|
89
|
-
viewMode = _useState6[0],
|
90
|
-
setViewMode = _useState6[1];
|
91
|
-
|
92
|
-
useEffect(function () {
|
93
|
-
return setRetry(results.length);
|
94
|
-
}, [results.length]);
|
95
|
-
var url = getImageUrl(path, imageName);
|
96
|
-
var image = (_result$images2 = result.images) === null || _result$images2 === void 0 ? void 0 : _result$images2[imageName];
|
97
|
-
var canApprove = Boolean(image && approved[imageName] != retry - 1 && result.status != 'success');
|
98
|
-
var hasDiffAndExpect = canApprove && Boolean((image === null || image === void 0 ? void 0 : image.diff) && image.expect);
|
99
|
-
var imagesWithError = result.images ? Object.keys(result.images).filter(function (imageName) {
|
100
|
-
var _imageName;
|
101
|
-
|
102
|
-
return result.status != 'success' && approved[imageName] != retry - 1 && ((_imageName = (result.images || {})[imageName]) === null || _imageName === void 0 ? void 0 : _imageName.error) != null;
|
103
|
-
}) : [];
|
104
|
-
|
105
|
-
var handleApprove = function handleApprove() {
|
106
|
-
return onImageApprove(id, retry - 1, imageName);
|
107
|
-
};
|
108
|
-
|
109
|
-
var handleChangeViewMode = function handleChangeViewMode(mode) {
|
53
|
+
let {
|
54
|
+
id,
|
55
|
+
path,
|
56
|
+
results = [],
|
57
|
+
approved = {},
|
58
|
+
theme,
|
59
|
+
onImageApprove,
|
60
|
+
showTitle = false,
|
61
|
+
height
|
62
|
+
} = _ref3;
|
63
|
+
const [retry, setRetry] = useState(results.length);
|
64
|
+
const result = results[retry - 1] ?? {};
|
65
|
+
const [imageName, setImageName] = useState(Object.keys(result.images ?? {})[0] ?? '');
|
66
|
+
const [viewMode, setViewMode] = useState(getViewMode());
|
67
|
+
useEffect(() => setRetry(results.length), [results.length]);
|
68
|
+
const url = getImageUrl(path, imageName);
|
69
|
+
const image = result.images?.[imageName];
|
70
|
+
const canApprove = Boolean(image && approved[imageName] != retry - 1 && result.status != 'success');
|
71
|
+
const hasDiffAndExpect = canApprove && Boolean(image?.diff && image.expect);
|
72
|
+
const imagesWithError = result.images ? Object.keys(result.images).filter(imageName => result.status != 'success' && approved[imageName] != retry - 1 && (result.images || {})[imageName]?.error != null) : [];
|
73
|
+
const handleApprove = () => onImageApprove(id, retry - 1, imageName);
|
74
|
+
const handleChangeViewMode = mode => {
|
110
75
|
localStorage.setItem(VIEW_MODE_KEY, mode);
|
111
76
|
setViewMode(mode);
|
112
77
|
};
|
113
|
-
|
114
78
|
return /*#__PURE__*/React.createElement(Container, {
|
115
79
|
height: height
|
116
80
|
}, /*#__PURE__*/React.createElement(HeaderContainer, null, /*#__PURE__*/React.createElement(PageHeader, {
|
@@ -132,7 +96,7 @@ export function ResultsPageInternal(_ref3) {
|
|
132
96
|
image: image,
|
133
97
|
canApprove: canApprove,
|
134
98
|
mode: viewMode
|
135
|
-
}) : /*#__PURE__*/React.createElement(Placeholder, null,
|
99
|
+
}) : /*#__PURE__*/React.createElement(Placeholder, null, `Image ${imageName} not found`))))), results.length ? /*#__PURE__*/React.createElement(FooterContainer, null, /*#__PURE__*/React.createElement(PageFooter, {
|
136
100
|
canApprove: canApprove,
|
137
101
|
retry: retry,
|
138
102
|
retriesCount: results.length,
|
@@ -140,4 +104,4 @@ export function ResultsPageInternal(_ref3) {
|
|
140
104
|
onApprove: handleApprove
|
141
105
|
})) : null);
|
142
106
|
}
|
143
|
-
export
|
107
|
+
export const ResultsPage = withTheme(ResultsPageInternal);
|
@@ -1,94 +1,60 @@
|
|
1
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
2
|
-
|
3
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
4
|
-
|
5
1
|
import { noop } from '../../types';
|
6
2
|
import { getConnectionUrl } from './helpers';
|
7
|
-
export function initCreeveyClientApi() {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
},
|
50
|
-
onUpdate: function onUpdate(fn) {
|
51
|
-
updateListeners.add(fn);
|
52
|
-
return function () {
|
53
|
-
return updateListeners.delete(fn);
|
54
|
-
};
|
55
|
-
},
|
56
|
-
|
57
|
-
get status() {
|
58
|
-
if (statusRequest) return statusRequest;
|
59
|
-
send({
|
60
|
-
type: 'status'
|
61
|
-
});
|
62
|
-
return statusRequest = new Promise(function (resolve) {
|
63
|
-
return statusResolver = resolve;
|
64
|
-
});
|
65
|
-
}
|
66
|
-
|
67
|
-
});
|
68
|
-
});
|
69
|
-
ws.addEventListener('message', function (message) {
|
70
|
-
var data = JSON.parse(message.data);
|
71
|
-
if (data.type == 'update') updateListeners.forEach(function (fn) {
|
72
|
-
return fn(data.payload);
|
73
|
-
});
|
74
|
-
|
75
|
-
if (data.type == 'status') {
|
76
|
-
statusResolver(data.payload);
|
77
|
-
statusResolver = noop;
|
78
|
-
statusRequest = null;
|
79
|
-
}
|
80
|
-
}); // TODO Reconnect
|
81
|
-
|
82
|
-
return _context.abrupt("return", new Promise(function (resolve) {
|
83
|
-
return clientApiResolver = resolve;
|
84
|
-
}));
|
85
|
-
|
86
|
-
case 9:
|
87
|
-
case "end":
|
88
|
-
return _context.stop();
|
89
|
-
}
|
3
|
+
export async function initCreeveyClientApi() {
|
4
|
+
let clientApiResolver = noop;
|
5
|
+
const updateListeners = new Set();
|
6
|
+
let statusRequest = null;
|
7
|
+
let statusResolver = noop;
|
8
|
+
const ws = new WebSocket(`ws://${getConnectionUrl()}`);
|
9
|
+
function send(request) {
|
10
|
+
ws.send(JSON.stringify(request));
|
11
|
+
}
|
12
|
+
ws.addEventListener('open', () => {
|
13
|
+
clientApiResolver({
|
14
|
+
start(ids) {
|
15
|
+
send({
|
16
|
+
type: 'start',
|
17
|
+
payload: ids
|
18
|
+
});
|
19
|
+
},
|
20
|
+
stop() {
|
21
|
+
send({
|
22
|
+
type: 'stop'
|
23
|
+
});
|
24
|
+
},
|
25
|
+
approve(id, retry, image) {
|
26
|
+
send({
|
27
|
+
type: 'approve',
|
28
|
+
payload: {
|
29
|
+
id,
|
30
|
+
retry,
|
31
|
+
image
|
32
|
+
}
|
33
|
+
});
|
34
|
+
},
|
35
|
+
onUpdate(fn) {
|
36
|
+
updateListeners.add(fn);
|
37
|
+
return () => updateListeners.delete(fn);
|
38
|
+
},
|
39
|
+
get status() {
|
40
|
+
if (statusRequest) return statusRequest;
|
41
|
+
send({
|
42
|
+
type: 'status'
|
43
|
+
});
|
44
|
+
return statusRequest = new Promise(resolve => statusResolver = resolve);
|
90
45
|
}
|
91
|
-
}
|
92
|
-
})
|
93
|
-
|
46
|
+
});
|
47
|
+
});
|
48
|
+
ws.addEventListener('message', message => {
|
49
|
+
const data = JSON.parse(message.data);
|
50
|
+
if (data.type == 'update') updateListeners.forEach(fn => fn(data.payload));
|
51
|
+
if (data.type == 'status') {
|
52
|
+
statusResolver(data.payload);
|
53
|
+
statusResolver = noop;
|
54
|
+
statusRequest = null;
|
55
|
+
}
|
56
|
+
});
|
57
|
+
// TODO Reconnect
|
58
|
+
|
59
|
+
return new Promise(resolve => clientApiResolver = resolve);
|
94
60
|
}
|