creevey 0.9.0-beta.13 → 0.9.0-beta.14
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/lib/cjs/cli.js +1 -0
- package/lib/cjs/client/addon/Manager.js +151 -223
- package/lib/cjs/client/addon/components/Addon.js +2 -9
- package/lib/cjs/client/addon/components/Icons.js +1 -7
- package/lib/cjs/client/addon/components/Panel.js +5 -18
- package/lib/cjs/client/addon/components/TestSelect.js +12 -25
- package/lib/cjs/client/addon/components/Tools.js +17 -28
- package/lib/cjs/client/addon/decorator.js +1 -4
- package/lib/cjs/client/addon/index.js +0 -4
- package/lib/cjs/client/addon/preset.js +3 -12
- package/lib/cjs/client/addon/preview.js +1 -4
- package/lib/cjs/client/addon/readyForCapture.js +1 -4
- package/lib/cjs/client/addon/register.js +11 -26
- package/lib/cjs/client/addon/utils.js +1 -9
- package/lib/cjs/client/addon/withCreevey.js +55 -134
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +5 -17
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +8 -24
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +7 -23
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +7 -22
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +5 -17
- package/lib/cjs/client/shared/components/ImagesView/index.js +0 -5
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +1 -8
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +2 -19
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +21 -17
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +5 -24
- package/lib/cjs/client/shared/components/ResultsPage.js +9 -37
- package/lib/cjs/client/shared/creeveyClientApi.js +3 -13
- package/lib/cjs/client/shared/helpers.js +21 -75
- package/lib/cjs/client/shared/viewMode.js +2 -6
- 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 +78 -1
- package/lib/cjs/client/web/main.js.LICENSE.txt +0 -15
- package/lib/cjs/creevey.js +5 -21
- package/lib/cjs/index.js +0 -15
- package/lib/cjs/server/config.js +13 -33
- package/lib/cjs/server/docker.js +5 -27
- package/lib/cjs/server/index.js +8 -33
- package/lib/cjs/server/logger.js +5 -19
- package/lib/cjs/server/master/api.js +1 -14
- package/lib/cjs/server/master/index.js +15 -46
- package/lib/cjs/server/master/master.js +6 -21
- package/lib/cjs/server/master/pool.js +2 -37
- package/lib/cjs/server/master/runner.js +15 -42
- package/lib/cjs/server/master/server.js +5 -27
- package/lib/cjs/server/messages.js +7 -53
- package/lib/cjs/server/selenium/browser.js +51 -136
- package/lib/cjs/server/selenium/index.js +0 -4
- package/lib/cjs/server/selenium/selenoid.js +7 -33
- package/lib/cjs/server/stories.js +25 -30
- package/lib/cjs/server/storybook/providers/browser.js +5 -18
- package/lib/cjs/server/storybook/providers/hybrid.js +9 -29
- package/lib/cjs/server/testsFiles/parser.js +3 -19
- package/lib/cjs/server/testsFiles/register.js +7 -9
- package/lib/cjs/server/update.js +3 -20
- package/lib/cjs/server/utils.js +9 -41
- 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 +8 -24
- package/lib/cjs/server/worker/worker.js +5 -49
- package/lib/cjs/shared/index.js +22 -36
- package/lib/cjs/shared/serializeRegExp.js +0 -8
- package/lib/cjs/types.js +4 -14
- package/lib/esm/cli.js +1 -1
- package/lib/esm/client/addon/Manager.js +151 -214
- package/lib/esm/client/addon/components/Panel.js +4 -6
- package/lib/esm/client/addon/components/TestSelect.js +11 -17
- package/lib/esm/client/addon/components/Tools.js +15 -14
- package/lib/esm/client/addon/preset.js +2 -8
- package/lib/esm/client/addon/readyForCapture.js +1 -3
- package/lib/esm/client/addon/register.js +6 -8
- package/lib/esm/client/addon/utils.js +0 -5
- package/lib/esm/client/addon/withCreevey.js +54 -116
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +1 -1
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +6 -8
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +3 -4
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +3 -3
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +1 -1
- package/lib/esm/client/shared/components/PageFooter/Paging.js +1 -11
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +18 -7
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +3 -8
- package/lib/esm/client/shared/components/ResultsPage.js +6 -15
- package/lib/esm/client/shared/creeveyClientApi.js +3 -10
- package/lib/esm/client/shared/helpers.js +21 -47
- 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 +4 -8
- package/lib/esm/index.js +0 -1
- package/lib/esm/server/config.js +7 -14
- package/lib/esm/server/docker.js +4 -12
- package/lib/esm/server/index.js +7 -21
- package/lib/esm/server/logger.js +0 -1
- package/lib/esm/server/master/api.js +0 -9
- package/lib/esm/server/master/index.js +15 -32
- package/lib/esm/server/master/master.js +2 -7
- package/lib/esm/server/master/pool.js +0 -23
- package/lib/esm/server/master/runner.js +14 -27
- package/lib/esm/server/master/server.js +4 -9
- package/lib/esm/server/messages.js +6 -38
- package/lib/esm/server/selenium/browser.js +50 -114
- package/lib/esm/server/selenium/selenoid.js +6 -17
- package/lib/esm/server/stories.js +24 -20
- package/lib/esm/server/storybook/providers/browser.js +4 -8
- package/lib/esm/server/storybook/providers/hybrid.js +6 -14
- package/lib/esm/server/testsFiles/parser.js +0 -6
- package/lib/esm/server/testsFiles/register.js +5 -2
- package/lib/esm/server/update.js +0 -8
- package/lib/esm/server/utils.js +3 -11
- 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 +7 -10
- package/lib/esm/server/worker/worker.js +4 -25
- package/lib/esm/shared/index.js +24 -25
- package/lib/esm/types.js +4 -1
- package/lib/types/client/addon/Manager.d.ts +1 -1
- 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/TestSelect.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/preset.d.ts +2 -2
- package/lib/types/client/addon/preview.d.ts +1 -1
- package/lib/types/client/addon/withCreevey.d.ts +3 -2
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +1 -0
- 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/PageFooter/PageFooter.d.ts +1 -0
- package/lib/types/client/shared/components/PageFooter/Paging.d.ts +1 -0
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +3 -1
- package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +1 -0
- package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
- package/lib/types/client/web/CreeveyApp.d.ts +1 -0
- package/lib/types/client/web/CreeveyLoader.d.ts +2 -1
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +4 -1
- package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
- package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +1 -0
- 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/shared/index.d.ts +1 -1
- package/lib/types/types.d.ts +7 -28
- package/package.json +60 -78
- package/lib/cjs/client/addon/preset.ie11.js +0 -74
- package/lib/cjs/client/addon/preset.sb7.js +0 -19
- package/lib/cjs/client/web/142.js +0 -2
- package/lib/cjs/client/web/142.js.LICENSE.txt +0 -12
- package/lib/cjs/client/web/32.js +0 -1
- package/lib/cjs/client/web/551.js +0 -1
- package/lib/cjs/client/web/566.js +0 -2
- package/lib/cjs/client/web/566.js.LICENSE.txt +0 -31
- package/lib/cjs/client/web/691.js +0 -2
- package/lib/cjs/client/web/691.js.LICENSE.txt +0 -8
- package/lib/cjs/client/web/725.js +0 -1
- package/lib/cjs/server/extract.js +0 -46
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -86
- package/lib/cjs/server/loaders/babel/helpers.js +0 -469
- package/lib/cjs/server/loaders/babel/register.js +0 -124
- 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 -269
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -172
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -39
- 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 -53
- package/lib/cjs/server/storybook/helpers.js +0 -158
- package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
- package/lib/esm/client/addon/preset.ie11.js +0 -59
- package/lib/esm/client/addon/preset.sb7.js +0 -8
- package/lib/esm/server/extract.js +0 -32
- package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -72
- package/lib/esm/server/loaders/babel/helpers.js +0 -452
- package/lib/esm/server/loaders/babel/register.js +0 -103
- 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 -246
- package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -152
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -32
- 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 -27
- package/lib/esm/server/storybook/helpers.js +0 -97
- package/lib/esm/server/storybook/providers/nodejs.js +0 -216
- package/lib/types/client/addon/preset.ie11.d.ts +0 -10
- package/lib/types/client/addon/preset.sb7.d.ts +0 -2
- 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 -4
- 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 -17
- package/lib/types/server/storybook/helpers.d.ts +0 -24
- package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
- package/preset/ie11.js +0 -5
- package/preset/index.js +0 -9
- package/preset/sb7.js +0 -5
- package/types/mdx.d.ts +0 -7
@@ -14,9 +14,7 @@ const LinkIconContainer = styled.span(_ref => {
|
|
14
14
|
};
|
15
15
|
});
|
16
16
|
export default function TestSelect(props) {
|
17
|
-
|
18
|
-
|
19
|
-
const testName = (_props$tests$find$tes = (_props$tests$find = props.tests.find(x => x.id === props.selectedTestId)) === null || _props$tests$find === void 0 ? void 0 : _props$tests$find.testName) !== null && _props$tests$find$tes !== void 0 ? _props$tests$find$tes : '';
|
17
|
+
const testName = props.tests.find(x => x.id === props.selectedTestId)?.testName ?? '';
|
20
18
|
return /*#__PURE__*/React.createElement(WithTooltip, {
|
21
19
|
trigger: "click",
|
22
20
|
placement: "bottom",
|
@@ -26,20 +24,16 @@ export default function TestSelect(props) {
|
|
26
24
|
onHide
|
27
25
|
} = _ref2;
|
28
26
|
return /*#__PURE__*/React.createElement(TooltipLinkList, {
|
29
|
-
links: props.tests.map(x => {
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
},
|
40
|
-
left: /*#__PURE__*/React.createElement(LinkIconContainer, null, getEmojiByTestStatus(x.status, x.skip))
|
41
|
-
};
|
42
|
-
})
|
27
|
+
links: props.tests.map(x => ({
|
28
|
+
id: x.id,
|
29
|
+
title: x.testName ?? '',
|
30
|
+
active: props.selectedTestId === x.id,
|
31
|
+
onClick: () => {
|
32
|
+
props.onChangeTest(x.id);
|
33
|
+
onHide();
|
34
|
+
},
|
35
|
+
left: /*#__PURE__*/React.createElement(LinkIconContainer, null, getEmojiByTestStatus(x.status, x.skip))
|
36
|
+
}))
|
43
37
|
});
|
44
38
|
}
|
45
39
|
}, /*#__PURE__*/React.createElement(Button, {
|
@@ -38,29 +38,30 @@ export const Tools = _ref => {
|
|
38
38
|
return unsubscribe;
|
39
39
|
}, [manager]);
|
40
40
|
if (!test) return null;
|
41
|
-
|
42
41
|
function renderButton(type, title, onClick, icon) {
|
43
42
|
const handleClick = () => {
|
44
43
|
setButtonClicked(type);
|
45
44
|
onClick();
|
46
45
|
};
|
47
|
-
|
48
46
|
const disabled = isRunning && buttonClicked != null && buttonClicked !== type;
|
49
|
-
return
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
47
|
+
return (
|
48
|
+
/*#__PURE__*/
|
49
|
+
// @ts-expect-error Fixed in https://github.com/storybookjs/storybook/pull/26623
|
50
|
+
React.createElement(Button, {
|
51
|
+
onClick: () => {
|
52
|
+
isRunning ? manager.onStop() : handleClick();
|
53
|
+
},
|
54
|
+
title: disabled ? '' : title,
|
55
|
+
disabled: disabled
|
56
|
+
}, buttonClicked === type && isRunning ? /*#__PURE__*/React.createElement(Icons, {
|
57
|
+
icon: 'stop'
|
58
|
+
}) : icon)
|
59
|
+
);
|
58
60
|
}
|
59
|
-
|
60
61
|
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(IconButton, {
|
61
|
-
href:
|
62
|
+
href: `http://localhost:${__CREEVEY_CLIENT_PORT__ || __CREEVEY_SERVER_PORT__ || 3000}/?${stringify({
|
62
63
|
testPath: getTestPath(test)
|
63
|
-
})
|
64
|
+
})}`,
|
64
65
|
target: "_blank",
|
65
66
|
title: "Show in Creevey UI"
|
66
67
|
}, /*#__PURE__*/React.createElement(Icons, {
|
@@ -1,8 +1,2 @@
|
|
1
|
-
export
|
2
|
-
|
3
|
-
return [...entry, require.resolve('./decorator')];
|
4
|
-
}
|
5
|
-
export function managerEntries() {
|
6
|
-
let entry = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
7
|
-
return [...entry, require.resolve('./register')];
|
8
|
-
}
|
1
|
+
export const previewAnnotations = [require.resolve('./preview')];
|
2
|
+
export const managerEntries = [require.resolve('./register')];
|
@@ -1,5 +1,3 @@
|
|
1
1
|
export function readyForCapture() {
|
2
|
-
|
3
|
-
|
4
|
-
(_window$__CREEVEY_SET = (_window = window).__CREEVEY_SET_READY_FOR_CAPTURE__) === null || _window$__CREEVEY_SET === void 0 ? void 0 : _window$__CREEVEY_SET.call(_window);
|
2
|
+
window.__CREEVEY_SET_READY_FOR_CAPTURE__?.();
|
5
3
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { addons, types } from '@storybook/
|
1
|
+
import { addons, types } from '@storybook/manager-api';
|
2
2
|
import React from 'react';
|
3
3
|
import { Addon } from './components/Addon';
|
4
4
|
import { Tools } from './components/Tools';
|
@@ -9,8 +9,8 @@ addons.register(ADDON_ID, api => {
|
|
9
9
|
});
|
10
10
|
export async function registerCreeveyPanels(storybookApi) {
|
11
11
|
const manager = new CreeveyManager(storybookApi);
|
12
|
-
addons.
|
13
|
-
title:
|
12
|
+
addons.add(`${ADDON_ID}/panel/run`, {
|
13
|
+
title: `Creevey/Run`,
|
14
14
|
match: _ref => {
|
15
15
|
let {
|
16
16
|
viewMode
|
@@ -26,9 +26,9 @@ export async function registerCreeveyPanels(storybookApi) {
|
|
26
26
|
await manager.initAll();
|
27
27
|
const browsers = manager.getBrowsers();
|
28
28
|
browsers.forEach(browser => {
|
29
|
-
const panelId =
|
29
|
+
const panelId = `${ADDON_ID}/panel/${browser}`;
|
30
30
|
const title = manager.getTabTitle(browser);
|
31
|
-
addons.
|
31
|
+
addons.add(panelId, {
|
32
32
|
title,
|
33
33
|
type: types.PANEL,
|
34
34
|
paramKey: browser,
|
@@ -36,12 +36,10 @@ export async function registerCreeveyPanels(storybookApi) {
|
|
36
36
|
// eslint-disable-next-line react/display-name
|
37
37
|
render: _ref2 => {
|
38
38
|
let {
|
39
|
-
active
|
40
|
-
key
|
39
|
+
active
|
41
40
|
} = _ref2;
|
42
41
|
return /*#__PURE__*/React.createElement(Addon, {
|
43
42
|
active,
|
44
|
-
key,
|
45
43
|
manager,
|
46
44
|
browser
|
47
45
|
});
|
@@ -1,27 +1,22 @@
|
|
1
1
|
export function getEmojiByTestStatus(status) {
|
2
2
|
let skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
3
|
-
|
4
3
|
switch (status) {
|
5
4
|
case 'failed':
|
6
5
|
{
|
7
6
|
return '❌';
|
8
7
|
}
|
9
|
-
|
10
8
|
case 'success':
|
11
9
|
{
|
12
10
|
return '✔';
|
13
11
|
}
|
14
|
-
|
15
12
|
case 'running':
|
16
13
|
{
|
17
14
|
return '🟡';
|
18
15
|
}
|
19
|
-
|
20
16
|
case 'pending':
|
21
17
|
{
|
22
18
|
return '🕗';
|
23
19
|
}
|
24
|
-
|
25
20
|
default:
|
26
21
|
{
|
27
22
|
if (skip) return '⏸';
|
@@ -1,26 +1,21 @@
|
|
1
1
|
import * as Events from '@storybook/core-events';
|
2
|
-
import
|
3
|
-
// import { buildQueries, within } from '@storybook/testing-library';
|
4
|
-
import { addons, makeDecorator } from '@storybook/addons';
|
2
|
+
import { makeDecorator } from '@storybook/preview-api';
|
5
3
|
import { isObject, noop } from '../../types';
|
6
|
-
import {
|
7
|
-
import { getConnectionUrl } from '../shared/helpers';
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
window.EventSource = NativeEventSource || EventSourcePolyfill;
|
4
|
+
import { serializeRawStories } from '../../shared';
|
5
|
+
import { getConnectionUrl } from '../shared/helpers';
|
6
|
+
const disableAnimationsStyles = `
|
7
|
+
*,
|
8
|
+
*:hover,
|
9
|
+
*::before,
|
10
|
+
*::after {
|
11
|
+
animation-delay: -0.0001ms !important;
|
12
|
+
animation-duration: 0s !important;
|
13
|
+
animation-play-state: paused !important;
|
14
|
+
cursor: none !important;
|
15
|
+
caret-color: transparent !important;
|
16
|
+
transition: 0s !important;
|
20
17
|
}
|
21
|
-
|
22
|
-
const disableAnimationsStyles = "\n*,\n*:hover,\n*::before,\n*::after {\n animation-delay: -0.0001ms !important;\n animation-duration: 0s !important;\n animation-play-state: paused !important;\n cursor: none !important;\n caret-color: transparent !important;\n transition: 0s !important;\n}\n";
|
23
|
-
|
18
|
+
`;
|
24
19
|
async function resetCurrentStory(channel) {
|
25
20
|
setTimeout(() => channel.emit(Events.SET_CURRENT_STORY, {
|
26
21
|
storyId: true,
|
@@ -29,11 +24,9 @@ async function resetCurrentStory(channel) {
|
|
29
24
|
}), 0);
|
30
25
|
return new Promise(resolve => channel.once(Events.STORY_MISSING, resolve));
|
31
26
|
}
|
32
|
-
|
33
27
|
function catchRenderError(channel) {
|
34
28
|
let rejectCallback;
|
35
29
|
const promise = new Promise((_resolve, reject) => rejectCallback = reject);
|
36
|
-
|
37
30
|
function errorHandler(_ref) {
|
38
31
|
let {
|
39
32
|
title,
|
@@ -44,65 +37,51 @@ function catchRenderError(channel) {
|
|
44
37
|
stack: description
|
45
38
|
});
|
46
39
|
}
|
47
|
-
|
48
40
|
function exceptionHandler(exception) {
|
49
41
|
rejectCallback(exception);
|
50
42
|
}
|
51
|
-
|
52
43
|
function removeHandlers() {
|
53
44
|
channel.off(Events.STORY_ERRORED, errorHandler);
|
54
45
|
channel.off(Events.STORY_THREW_EXCEPTION, errorHandler);
|
55
46
|
}
|
56
|
-
|
57
47
|
channel.once(Events.STORY_ERRORED, errorHandler);
|
58
48
|
channel.once(Events.STORY_THREW_EXCEPTION, exceptionHandler);
|
59
49
|
return Object.assign(promise, {
|
60
50
|
cancel: removeHandlers
|
61
51
|
});
|
62
52
|
}
|
63
|
-
|
64
53
|
function waitForStoryRendered(channel) {
|
65
54
|
let resolveCallback;
|
66
55
|
const promise = new Promise(resolve => resolveCallback = resolve);
|
67
|
-
|
68
56
|
function renderHandler() {
|
69
57
|
resolveCallback();
|
70
58
|
}
|
71
|
-
|
72
59
|
function removeHandlers() {
|
73
60
|
channel.off(Events.STORY_RENDERED, renderHandler);
|
74
61
|
}
|
75
|
-
|
76
62
|
channel.once(Events.STORY_RENDERED, renderHandler);
|
77
63
|
return Object.assign(promise, {
|
78
64
|
cancel: removeHandlers
|
79
65
|
});
|
80
66
|
}
|
81
|
-
|
82
67
|
function waitForFontsLoaded() {
|
83
68
|
if (!document.fonts) return;
|
84
69
|
const areFontsLoading = Array.from(document.fonts).some(font => font.status == 'loading');
|
85
|
-
|
86
70
|
if (areFontsLoading) {
|
87
71
|
return new Promise(resolve => {
|
88
72
|
const fontsLoadedHandler = () => {
|
89
73
|
document.fonts.removeEventListener('loadingdone', fontsLoadedHandler);
|
90
74
|
resolve();
|
91
75
|
};
|
92
|
-
|
93
76
|
document.fonts.addEventListener('loadingdone', fontsLoadedHandler);
|
94
77
|
});
|
95
78
|
}
|
96
79
|
}
|
97
|
-
|
98
80
|
function waitForCaptureCall() {
|
99
81
|
return new Promise(resolve => captureResolver = resolve);
|
100
82
|
}
|
101
|
-
|
102
83
|
function initCreeveyState() {
|
103
|
-
|
104
|
-
|
105
|
-
const prevState = JSON.parse((_window$localStorage$ = window.localStorage.getItem('Creevey_Tests')) !== null && _window$localStorage$ !== void 0 ? _window$localStorage$ : '{}');
|
84
|
+
const prevState = JSON.parse(window.localStorage.getItem('Creevey_Tests') ?? '{}');
|
106
85
|
if (prevState.creeveyHost) window.__CREEVEY_SERVER_HOST__ = prevState.creeveyHost;
|
107
86
|
if (prevState.creeveyPort) window.__CREEVEY_SERVER_PORT__ = prevState.creeveyPort;
|
108
87
|
if (prevState.setStoriesCounter) setStoriesCounter = prevState.setStoriesCounter;
|
@@ -116,17 +95,16 @@ function initCreeveyState() {
|
|
116
95
|
}));
|
117
96
|
});
|
118
97
|
}
|
119
|
-
|
120
98
|
let isTestBrowser = false;
|
121
99
|
let captureResolver;
|
122
100
|
let waitForCreevey;
|
123
101
|
let creeveyReady;
|
124
102
|
let setStoriesCounter = 0;
|
125
103
|
export function withCreevey() {
|
104
|
+
const addonsChannel = () => window.__STORYBOOK_ADDONS_CHANNEL__;
|
126
105
|
let currentStory = '';
|
127
106
|
let isAnimationDisabled = false;
|
128
107
|
initCreeveyState();
|
129
|
-
|
130
108
|
function disableAnimation() {
|
131
109
|
isAnimationDisabled = true;
|
132
110
|
const style = document.createElement('style');
|
@@ -135,46 +113,30 @@ export function withCreevey() {
|
|
135
113
|
style.appendChild(textNode);
|
136
114
|
document.head.appendChild(style);
|
137
115
|
}
|
138
|
-
|
139
116
|
async function getStories() {
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
Object.values(stories).forEach(story => {
|
157
|
-
const storiesFromFile = storiesByFiles.get(story.parameters.fileName);
|
158
|
-
if (storiesFromFile) storiesFromFile.push(story);else storiesByFiles.set(story.parameters.fileName, [story]);
|
159
|
-
});
|
160
|
-
void fetch("http://".concat(getConnectionUrl(), "/stories"), {
|
161
|
-
method: 'POST',
|
162
|
-
headers: {
|
163
|
-
'Content-Type': 'application/json'
|
164
|
-
},
|
165
|
-
body: JSON.stringify({
|
166
|
-
setStoriesCounter,
|
167
|
-
stories: [...storiesByFiles.entries()]
|
168
|
-
})
|
169
|
-
});
|
117
|
+
const stories = serializeRawStories(await window.__STORYBOOK_PREVIEW__.extract());
|
118
|
+
const storiesByFiles = new Map();
|
119
|
+
Object.values(stories).forEach(story => {
|
120
|
+
const fileName = story.parameters.fileName;
|
121
|
+
const storiesFromFile = storiesByFiles.get(fileName);
|
122
|
+
if (storiesFromFile) storiesFromFile.push(story);else storiesByFiles.set(fileName, [story]);
|
123
|
+
});
|
124
|
+
void fetch(`http://${getConnectionUrl()}/stories`, {
|
125
|
+
method: 'POST',
|
126
|
+
headers: {
|
127
|
+
'Content-Type': 'application/json'
|
128
|
+
},
|
129
|
+
body: JSON.stringify({
|
130
|
+
setStoriesCounter,
|
131
|
+
stories: [...storiesByFiles.entries()]
|
132
|
+
})
|
170
133
|
});
|
171
|
-
return
|
134
|
+
return stories;
|
172
135
|
}
|
173
|
-
|
174
136
|
async function selectStory(storyId, kind, name, shouldWaitForReady, callback) {
|
175
137
|
if (!isAnimationDisabled) disableAnimation();
|
176
138
|
isTestBrowser = true;
|
177
|
-
const channel =
|
139
|
+
const channel = addonsChannel();
|
178
140
|
const waitForReady = shouldWaitForReady ? new Promise(resolve => window.__CREEVEY_SET_READY_FOR_CAPTURE__ = resolve) : Promise.resolve();
|
179
141
|
if (storyId == currentStory) await resetCurrentStory(channel);else currentStory = storyId;
|
180
142
|
let isCaptureCalled = false;
|
@@ -186,7 +148,6 @@ export function withCreevey() {
|
|
186
148
|
name,
|
187
149
|
kind
|
188
150
|
}), 0);
|
189
|
-
|
190
151
|
try {
|
191
152
|
await Promise.race([(async () => {
|
192
153
|
await Promise.race([renderPromise, capturePromise]);
|
@@ -195,45 +156,48 @@ export function withCreevey() {
|
|
195
156
|
})(), errorPromise]);
|
196
157
|
callback([null, isCaptureCalled]);
|
197
158
|
} catch (reason) {
|
198
|
-
var _reason$stack;
|
199
|
-
|
200
159
|
// NOTE Event `STORY_THREW_EXCEPTION` triggered only in react and vue frameworks and return Error instance
|
201
160
|
// NOTE Event `STORY_ERRORED` return error-like object without `name` field
|
202
|
-
const errorMessage = reason instanceof Error ?
|
161
|
+
const errorMessage = reason instanceof Error ? reason.stack ?? reason.message : isObject(reason) ? `${reason.message}\n ${reason.stack}` : reason;
|
203
162
|
callback([errorMessage]);
|
204
163
|
} finally {
|
205
164
|
renderPromise.cancel();
|
206
165
|
errorPromise.cancel();
|
207
166
|
}
|
208
167
|
}
|
209
|
-
|
210
168
|
function updateGlobals(globals) {
|
211
|
-
|
169
|
+
addonsChannel().emit(Events.UPDATE_GLOBALS, {
|
212
170
|
globals
|
213
171
|
});
|
214
172
|
}
|
215
|
-
|
216
173
|
function insertIgnoreStyles(ignoreSelectors) {
|
217
174
|
const stylesElement = document.createElement('style');
|
218
175
|
stylesElement.setAttribute('type', 'text/css');
|
219
176
|
document.head.appendChild(stylesElement);
|
220
177
|
ignoreSelectors.forEach(selector => {
|
221
|
-
stylesElement.innerHTML +=
|
178
|
+
stylesElement.innerHTML += `
|
179
|
+
${selector} {
|
180
|
+
background: #000 !important;
|
181
|
+
box-shadow: none !important;
|
182
|
+
text-shadow: none !important;
|
183
|
+
outline: 0 !important;
|
184
|
+
color: rgba(0,0,0,0) !important;
|
185
|
+
}
|
186
|
+
${selector} *, ${selector}::before, ${selector}::after {
|
187
|
+
visibility: hidden !important;
|
188
|
+
}
|
189
|
+
`;
|
222
190
|
});
|
223
191
|
return stylesElement;
|
224
192
|
}
|
225
|
-
|
226
193
|
function removeIgnoreStyles(ignoreStyles) {
|
227
|
-
|
228
|
-
|
229
|
-
(_ignoreStyles$parentN = ignoreStyles.parentNode) === null || _ignoreStyles$parentN === void 0 ? void 0 : _ignoreStyles$parentN.removeChild(ignoreStyles);
|
194
|
+
ignoreStyles.parentNode?.removeChild(ignoreStyles);
|
230
195
|
}
|
231
|
-
|
232
196
|
function hasPlayCompletedYet(callback) {
|
233
197
|
creeveyReady();
|
234
198
|
let isCaptureCalled = false;
|
235
199
|
let isPlayCompleted = false;
|
236
|
-
const channel =
|
200
|
+
const channel = addonsChannel();
|
237
201
|
void waitForStoryRendered(channel).then(() => {
|
238
202
|
if (isCaptureCalled) return;
|
239
203
|
isPlayCompleted = true;
|
@@ -245,61 +209,35 @@ export function withCreevey() {
|
|
245
209
|
callback(false);
|
246
210
|
});
|
247
211
|
}
|
248
|
-
|
249
212
|
window.__CREEVEY_GET_STORIES__ = getStories;
|
250
213
|
window.__CREEVEY_SELECT_STORY__ = selectStory;
|
251
214
|
window.__CREEVEY_UPDATE_GLOBALS__ = updateGlobals;
|
252
215
|
window.__CREEVEY_INSERT_IGNORE_STYLES__ = insertIgnoreStyles;
|
253
216
|
window.__CREEVEY_REMOVE_IGNORE_STYLES__ = removeIgnoreStyles;
|
254
217
|
window.__CREEVEY_HAS_PLAY_COMPLETED_YET__ = hasPlayCompletedYet;
|
255
|
-
window.__CREEVEY_SET_READY_FOR_CAPTURE__ = noop;
|
256
|
-
// [...container.querySelectorAll(query)].filter((e) => e instanceof HTMLElement) as HTMLElement[];
|
257
|
-
// const getMultipleError = (_: Element | null, query: string): string => `Found multiple elements by query: ${query}`;
|
258
|
-
// const getMissingError = (_: Element | null, query: string): string => `Unable to find an element by query: ${query}`;
|
259
|
-
// const [queryByQuery, getAllByQuery, getByQuery, findAllByQuery, findByQuery] = buildQueries(
|
260
|
-
// queryAllByQuery,
|
261
|
-
// getMultipleError,
|
262
|
-
// getMissingError,
|
263
|
-
// );
|
264
|
-
// const queries = {
|
265
|
-
// queryByQuery,
|
266
|
-
// getAllByQuery,
|
267
|
-
// getByQuery,
|
268
|
-
// findAllByQuery,
|
269
|
-
// findByQuery,
|
270
|
-
// };
|
271
|
-
|
218
|
+
window.__CREEVEY_SET_READY_FOR_CAPTURE__ = noop;
|
272
219
|
return makeDecorator({
|
273
220
|
name: 'withCreevey',
|
274
221
|
parameterName: 'creevey',
|
275
222
|
wrapper: (getStory, context) => {
|
276
|
-
var _ref2;
|
277
|
-
|
278
223
|
// TODO Define proper types, like captureElement is a promise
|
279
224
|
const {
|
280
225
|
captureElement
|
281
|
-
} = context.parameters.creevey =
|
226
|
+
} = context.parameters.creevey = context.parameters.creevey ?? {};
|
282
227
|
Object.defineProperty(context.parameters.creevey, 'captureElement', {
|
283
228
|
get() {
|
284
229
|
switch (true) {
|
285
230
|
case captureElement === undefined:
|
286
231
|
return Promise.resolve(context.canvasElement);
|
287
|
-
|
288
232
|
case captureElement === null:
|
289
233
|
return Promise.resolve(document.documentElement);
|
290
|
-
|
291
234
|
case typeof captureElement == 'string':
|
292
235
|
return Promise.resolve(context.canvasElement.querySelector(captureElement));
|
293
|
-
// return isInternetExplorer // some code from testing-library makes IE hang
|
294
|
-
// ? Promise.resolve(context.canvasElement.querySelector(captureElement as string))
|
295
|
-
// : within<typeof queries>(context.canvasElement, queries).findByQuery(captureElement as string);
|
296
|
-
|
297
236
|
case typeof captureElement == 'function':
|
298
237
|
// TODO Define type for it
|
299
238
|
return Promise.resolve(captureElement(context));
|
300
239
|
}
|
301
240
|
},
|
302
|
-
|
303
241
|
enumerable: true,
|
304
242
|
configurable: true
|
305
243
|
});
|
@@ -311,7 +249,7 @@ export async function capture(options) {
|
|
311
249
|
if (!isTestBrowser) return;
|
312
250
|
captureResolver();
|
313
251
|
waitForCreevey = new Promise(resolve => creeveyReady = resolve);
|
314
|
-
await fetch(
|
252
|
+
await fetch(`http://${getConnectionUrl()}/capture`, {
|
315
253
|
method: 'POST',
|
316
254
|
headers: {
|
317
255
|
'Content-Type': 'application/json'
|
@@ -9,9 +9,7 @@ export const themeBorderColors = {
|
|
9
9
|
expect: 'positive',
|
10
10
|
diff: 'secondary'
|
11
11
|
};
|
12
|
-
|
13
12
|
const isColor = (theme, color) => color in theme.color;
|
14
|
-
|
15
13
|
export function getBorderColor(theme, color) {
|
16
14
|
return isColor(theme, color) ? theme.color[color] : color;
|
17
15
|
}
|
@@ -37,7 +35,7 @@ const ActualImage = withTheme(styled.img(_ref => {
|
|
37
35
|
theme
|
38
36
|
} = _ref;
|
39
37
|
return {
|
40
|
-
border:
|
38
|
+
border: `1px solid ${getBorderColor(theme, themeBorderColors.expect)}`,
|
41
39
|
maxWidth: '100%'
|
42
40
|
};
|
43
41
|
}));
|
@@ -55,15 +53,15 @@ export function ImagesView(_ref2) {
|
|
55
53
|
expect
|
56
54
|
} = image;
|
57
55
|
return /*#__PURE__*/React.createElement(Container, null, canApprove && diff && expect ? /*#__PURE__*/React.createElement(ViewComponent, {
|
58
|
-
actual:
|
59
|
-
diff:
|
60
|
-
expect:
|
56
|
+
actual: `${url}/${actual}`,
|
57
|
+
diff: `${url}/${diff}`,
|
58
|
+
expect: `${url}/${expect}`
|
61
59
|
}) : /*#__PURE__*/React.createElement(ImageLink, {
|
62
|
-
href:
|
60
|
+
href: `${url}/${actual}`,
|
63
61
|
target: "_blank",
|
64
62
|
rel: "noopener noreferrer"
|
65
63
|
}, /*#__PURE__*/React.createElement(ActualImage, {
|
66
64
|
alt: "actual",
|
67
|
-
src:
|
65
|
+
src: `${url}/${actual}`
|
68
66
|
})));
|
69
67
|
}
|
@@ -40,7 +40,7 @@ const Image = styled.img(_ref2 => {
|
|
40
40
|
} = _ref2;
|
41
41
|
return {
|
42
42
|
boxSizing: 'border-box',
|
43
|
-
border:
|
43
|
+
border: `1px solid ${borderColor}`,
|
44
44
|
maxWidth: '100%',
|
45
45
|
flexShrink: 0
|
46
46
|
};
|
@@ -69,14 +69,13 @@ export const SideBySideView = withTheme(_ref3 => {
|
|
69
69
|
const actualImage = actualImageRef.current;
|
70
70
|
if (!containerElement || !expectImage || !actualImage || !diffImage || !loaded) return setScale(1);
|
71
71
|
const borderSize = getBorderSize(diffImage);
|
72
|
-
|
73
72
|
if (layout == 'vertical') {
|
74
73
|
const ratio = (diffImage.getBoundingClientRect().width - borderSize * 2) / diffImage.naturalWidth;
|
75
74
|
setScale(Math.min(1, ratio));
|
76
75
|
}
|
77
|
-
|
78
76
|
if (layout == 'horizontal') {
|
79
|
-
const ratio =
|
77
|
+
const ratio =
|
78
|
+
// NOTE: 40px because we have two margins by 20px and 6px for borders
|
80
79
|
(containerElement.getBoundingClientRect().width - 40 - borderSize * 6) / [expectImage, diffImage, actualImage].map(image => image.naturalWidth).reduce((a, b) => a + b, 0);
|
81
80
|
setScale(Math.min(1, ratio));
|
82
81
|
}
|
@@ -65,7 +65,7 @@ const BaseImage = styled.img(_ref2 => {
|
|
65
65
|
} = _ref2;
|
66
66
|
return {
|
67
67
|
boxSizing: 'border-box',
|
68
|
-
border:
|
68
|
+
border: `1px solid ${borderColor}`,
|
69
69
|
maxWidth: '100%'
|
70
70
|
};
|
71
71
|
});
|
@@ -95,8 +95,8 @@ export const SlideView = withTheme(_ref3 => {
|
|
95
95
|
const handleSlide = useCallback(event => {
|
96
96
|
if (!expectedImageContainerRef.current || !expectedImageWrapperRef.current) return;
|
97
97
|
const offset = Number(event.target.value);
|
98
|
-
expectedImageContainerRef.current.style.right =
|
99
|
-
expectedImageWrapperRef.current.style.left =
|
98
|
+
expectedImageContainerRef.current.style.right = `${100 - offset}%`;
|
99
|
+
expectedImageWrapperRef.current.style.left = `${100 - offset}%`;
|
100
100
|
}, []);
|
101
101
|
useLayoutEffect(() => {
|
102
102
|
if (loaded && diffImageRef.current) setStep(100 / diffImageRef.current.getBoundingClientRect().width);
|