creevey 0.9.0-beta.2 → 0.9.0-beta.4
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/CHANGELOG.md +35 -0
- package/README.md +9 -1
- package/addon/README.md +3 -0
- package/addon/package.json +4 -0
- package/docs/config.md +29 -26
- package/jest.config.js +6 -0
- package/lib/cjs/client/addon/Manager.js +122 -270
- package/lib/cjs/client/addon/components/Addon.js +17 -38
- package/lib/cjs/client/addon/components/Icons.js +11 -7
- 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.ie11.js +74 -0
- package/lib/cjs/client/addon/preset.js +14 -33
- package/lib/cjs/client/addon/register.js +46 -70
- package/lib/cjs/client/addon/utils.js +6 -2
- package/lib/cjs/client/addon/withCreevey.js +161 -342
- 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 +139 -210
- 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/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 +2 -4
- package/lib/cjs/server/docker.js +3 -7
- package/lib/cjs/server/extract.js +1 -5
- 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 +2 -4
- package/lib/cjs/server/loaders/webpack/compile.js +34 -51
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +20 -22
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +2 -7
- package/lib/cjs/server/loaders/webpack/mdx-loader.js +2 -2
- 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 +5 -3
- package/lib/cjs/server/messages.js +8 -10
- package/lib/cjs/server/selenium/browser.js +22 -46
- package/lib/cjs/server/selenium/selenoid.js +5 -7
- package/lib/cjs/server/stories.js +16 -33
- package/lib/cjs/server/storybook/entry.js +7 -22
- package/lib/cjs/server/storybook/helpers.js +20 -27
- package/lib/cjs/server/storybook/providers/browser.js +5 -9
- package/lib/cjs/server/storybook/providers/nodejs.js +7 -9
- package/lib/cjs/server/update.js +1 -5
- package/lib/cjs/server/utils.js +27 -36
- 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 +122 -270
- 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 +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.ie11.js +59 -0
- package/lib/esm/client/addon/preset.js +12 -27
- package/lib/esm/client/addon/register.js +42 -66
- package/lib/esm/client/addon/utils.js +3 -2
- package/lib/esm/client/addon/withCreevey.js +155 -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 +123 -194
- 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/config.js +2 -4
- package/lib/esm/server/docker.js +2 -2
- package/lib/esm/server/extract.js +1 -3
- 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 +3 -5
- package/lib/esm/server/loaders/webpack/compile.js +35 -52
- package/lib/esm/server/loaders/webpack/creevey-loader.js +9 -10
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +2 -6
- package/lib/esm/server/loaders/webpack/mdx-loader.js +2 -2
- 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 +5 -3
- package/lib/esm/server/messages.js +3 -5
- package/lib/esm/server/selenium/browser.js +19 -43
- package/lib/esm/server/selenium/selenoid.js +4 -6
- package/lib/esm/server/stories.js +16 -32
- package/lib/esm/server/storybook/entry.js +5 -22
- package/lib/esm/server/storybook/helpers.js +11 -20
- package/lib/esm/server/storybook/providers/browser.js +4 -5
- package/lib/esm/server/storybook/providers/nodejs.js +7 -8
- package/lib/esm/server/update.js +1 -5
- package/lib/esm/server/utils.js +18 -31
- 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/preset.ie11.d.ts +10 -0
- 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 +3 -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 +17 -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 +24 -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 +489 -489
- package/package.json +114 -102
- package/preset/ie11.js +5 -0
- package/{preset.js → preset/index.js} +2 -2
- package/types/mdx.d.ts +3 -2
- 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
@@ -51,7 +51,7 @@ export default function server(reportDir, port, ui) {
|
|
51
51
|
type: 'update',
|
52
52
|
payload: deserializedStories
|
53
53
|
});
|
54
|
-
Object.values(cluster.workers).filter(isDefined).filter(worker => worker.isConnected()).forEach(worker => sendStoriesMessage(worker, {
|
54
|
+
Object.values(cluster.workers ?? {}).filter(isDefined).filter(worker => worker.isConnected()).forEach(worker => sendStoriesMessage(worker, {
|
55
55
|
type: 'update',
|
56
56
|
payload: deserializedStories
|
57
57
|
}));
|
@@ -66,7 +66,7 @@ export default function server(reportDir, port, ui) {
|
|
66
66
|
workerId,
|
67
67
|
options
|
68
68
|
} = ctx.request.body;
|
69
|
-
const worker = Object.values(cluster.workers).filter(isDefined).find(worker => worker.process.pid == workerId); // NOTE: Hypothetical case when someone send to us capture req and we don't have a worker with browser session for it
|
69
|
+
const worker = Object.values(cluster.workers ?? {}).filter(isDefined).find(worker => worker.process.pid == workerId); // NOTE: Hypothetical case when someone send to us capture req and we don't have a worker with browser session for it
|
70
70
|
|
71
71
|
if (!worker) return;
|
72
72
|
await new Promise(resolve => {
|
@@ -98,7 +98,9 @@ export default function server(reportDir, port, ui) {
|
|
98
98
|
void creeveyApi.then(api => {
|
99
99
|
api.subscribe(wss);
|
100
100
|
wss.on('connection', ws => {
|
101
|
-
ws.on('message', message =>
|
101
|
+
ws.on('message', (message, isBinary) => {
|
102
|
+
api.handleMessage(ws, isBinary ? message : message.toString());
|
103
|
+
});
|
102
104
|
});
|
103
105
|
});
|
104
106
|
return resolveApi;
|
@@ -1,10 +1,10 @@
|
|
1
1
|
import cluster from 'cluster';
|
2
2
|
|
3
3
|
function emitMessage(message) {
|
4
|
-
var _process$send, _process
|
4
|
+
var _process$send, _process;
|
5
5
|
|
6
6
|
if (cluster.isWorker && !process.connected) return false;
|
7
|
-
return (_process$send = (_process
|
7
|
+
return ((_process$send = (_process = process).send) === null || _process$send === void 0 ? void 0 : _process$send.call(_process, message)) ?? // @ts-expect-error: wrong typings `process.emit` return boolean
|
8
8
|
process.emit('message', message);
|
9
9
|
}
|
10
10
|
|
@@ -158,9 +158,7 @@ export function subscribeOn(scope, handler) {
|
|
158
158
|
}
|
159
159
|
const workers = new Map();
|
160
160
|
export function subscribeOnWorker(worker, scope, handler) {
|
161
|
-
|
162
|
-
|
163
|
-
const workerHandlers = (_workers$get = workers.get(worker)) !== null && _workers$get !== void 0 ? _workers$get : createHandlers();
|
161
|
+
const workerHandlers = workers.get(worker) ?? createHandlers();
|
164
162
|
|
165
163
|
if (!workers.has(worker)) {
|
166
164
|
workers.set(worker, workerHandlers);
|
@@ -10,7 +10,7 @@ import { PageLoadStrategy } from 'selenium-webdriver/lib/capabilities';
|
|
10
10
|
import { isDefined, noop } from '../../types';
|
11
11
|
import { colors, logger } from '../logger';
|
12
12
|
import { emitStoriesMessage, subscribeOn } from '../messages';
|
13
|
-
import { importStorybookCoreEvents
|
13
|
+
import { importStorybookCoreEvents } from '../storybook/helpers';
|
14
14
|
import { isShuttingDown, LOCALHOST_REGEXP, runSequence } from '../utils';
|
15
15
|
const DOCKER_INTERNAL = 'host.docker.internal';
|
16
16
|
let browserLogger = logger;
|
@@ -23,9 +23,7 @@ function getSessionData(grid, sessionId = '') {
|
|
23
23
|
gridUrl.pathname = `/host/${sessionId}`;
|
24
24
|
return new Promise((resolve, reject) => (gridUrl.protocol == 'https:' ? https : http).get(gridUrl.toString(), res => {
|
25
25
|
if (res.statusCode !== 200) {
|
26
|
-
|
27
|
-
|
28
|
-
return reject(new Error(`Couldn't get session data for ${sessionId}. Status code: ${(_res$statusCode = res.statusCode) !== null && _res$statusCode !== void 0 ? _res$statusCode : 'Unknown'}`));
|
26
|
+
return reject(new Error(`Couldn't get session data for ${sessionId}. Status code: ${res.statusCode ?? 'Unknown'}`));
|
29
27
|
}
|
30
28
|
|
31
29
|
let data = '';
|
@@ -35,9 +33,7 @@ function getSessionData(grid, sessionId = '') {
|
|
35
33
|
try {
|
36
34
|
resolve(JSON.parse(data));
|
37
35
|
} catch (error) {
|
38
|
-
|
39
|
-
|
40
|
-
reject(new Error(`Couldn't get session data for ${sessionId}. ${error instanceof Error ? (_error$stack = error.stack) !== null && _error$stack !== void 0 ? _error$stack : error.message : error}`));
|
36
|
+
reject(new Error(`Couldn't get session data for ${sessionId}. ${error instanceof Error ? error.stack ?? error.message : error}`));
|
41
37
|
}
|
42
38
|
});
|
43
39
|
}));
|
@@ -103,17 +99,6 @@ function getUrlChecker(browser) {
|
|
103
99
|
}
|
104
100
|
|
105
101
|
async function waitForStorybook(browser) {
|
106
|
-
// NOTE: Storybook 5.x doesn't have the `last` method
|
107
|
-
if (isStorybookVersionLessThan(6)) {
|
108
|
-
browserLogger.debug('Waiting for `load` event to make sure that storybook is initiated');
|
109
|
-
return browser.executeAsyncScript(function (callback) {
|
110
|
-
if (document.readyState == 'complete') return callback();
|
111
|
-
window.addEventListener('load', function () {
|
112
|
-
callback();
|
113
|
-
});
|
114
|
-
});
|
115
|
-
}
|
116
|
-
|
117
102
|
browserLogger.debug('Waiting for `setStories` event to make sure that storybook is initiated');
|
118
103
|
let wait = true;
|
119
104
|
let isTimeout = false;
|
@@ -136,11 +121,11 @@ async function waitForStorybook(browser) {
|
|
136
121
|
}
|
137
122
|
|
138
123
|
async function resetMousePosition(browser) {
|
139
|
-
var
|
124
|
+
var _await$browser$getCap, _await$browser$getCap2;
|
140
125
|
|
141
126
|
browserLogger.debug('Resetting mouse position to the top-left corner');
|
142
127
|
const browserName = (await browser.getCapabilities()).getBrowserName();
|
143
|
-
const [browserVersion] = (
|
128
|
+
const [browserVersion] = ((_await$browser$getCap = (await browser.getCapabilities()).getBrowserVersion()) === null || _await$browser$getCap === void 0 ? void 0 : _await$browser$getCap.split('.')) ?? ((_await$browser$getCap2 = (await browser.getCapabilities()).get('version')) === null || _await$browser$getCap2 === void 0 ? void 0 : _await$browser$getCap2.split('.')) ?? []; // NOTE Reset mouse position to support keweb selenium grid browser versions
|
144
129
|
|
145
130
|
if (browserName == 'chrome' && browserVersion == '70') {
|
146
131
|
const {
|
@@ -224,10 +209,10 @@ const getScrollBarWidth = (() => {
|
|
224
209
|
|
225
210
|
|
226
211
|
async function hasScrollBar(browser) {
|
227
|
-
var _await$browser$
|
212
|
+
var _await$browser$getCap3;
|
228
213
|
|
229
214
|
const browserName = (await browser.getCapabilities()).getBrowserName();
|
230
|
-
const [browserVersion] = (
|
215
|
+
const [browserVersion] = ((_await$browser$getCap3 = (await browser.getCapabilities()).getBrowserVersion()) === null || _await$browser$getCap3 === void 0 ? void 0 : _await$browser$getCap3.split('.')) ?? [];
|
231
216
|
return browserName != 'Safari' && // NOTE This need to work with keweb selenium grid
|
232
217
|
!(browserName == 'firefox' && browserVersion == '61');
|
233
218
|
}
|
@@ -278,7 +263,8 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
|
|
278
263
|
const scrollOffset = isFitVertically || isScreenshotWithoutScrollBar ? 0 : scrollBarWidth;
|
279
264
|
const i = (y * compositeImage.width + x) * 4;
|
280
265
|
const j = // NOTE compositeImage(x, y) => image(x, y)
|
281
|
-
(y % viewportHeight * (viewportWidth + scrollOffset) + x % viewportWidth) * 4 + (
|
266
|
+
(y % viewportHeight * (viewportWidth + scrollOffset) + x % viewportWidth) * 4 + ( // NOTE Offset for last row/col image
|
267
|
+
isLastRow ? yOffset * (viewportWidth + scrollOffset) * 4 : 0) + (isLastCol ? xOffset * 4 : 0);
|
282
268
|
const image = images[row * cols + col];
|
283
269
|
compositeImage.data[i + 0] = image.data[j + 0];
|
284
270
|
compositeImage.data[i + 1] = image.data[j + 1];
|
@@ -327,7 +313,7 @@ export async function takeScreenshot(browser, captureElement, ignoreElements) {
|
|
327
313
|
const {
|
328
314
|
elementRect,
|
329
315
|
windowRect
|
330
|
-
} = rects
|
316
|
+
} = rects ?? {};
|
331
317
|
if (!elementRect || !windowRect) throw new Error(`Couldn't find element with selector: '${captureElement}'`);
|
332
318
|
const isFitIntoViewport = elementRect.width + elementRect.left <= windowRect.width && elementRect.height + elementRect.top <= windowRect.height;
|
333
319
|
if (isFitIntoViewport) browserLogger.debug(`Capturing ${chalk.cyan(captureElement)}`);else browserLogger.debug(`Capturing composite screenshot image of ${chalk.cyan(captureElement)}`);
|
@@ -353,19 +339,14 @@ async function selectStory(browser, {
|
|
353
339
|
return callback(["Creevey can't switch story. This may happened if forget to add `creevey` addon to your storybook config, or storybook not loaded in browser due syntax error."]);
|
354
340
|
}
|
355
341
|
|
356
|
-
window.__CREEVEY_SELECT_STORY__(id, kind, name, shouldWaitForReady, callback);
|
342
|
+
void window.__CREEVEY_SELECT_STORY__(id, kind, name, shouldWaitForReady, callback);
|
357
343
|
}, id, kind, name, waitForReady);
|
358
|
-
const [errorMessage, isCaptureCalled = false] = result
|
344
|
+
const [errorMessage, isCaptureCalled = false] = result ?? [];
|
359
345
|
if (errorMessage) throw new Error(errorMessage);
|
360
346
|
return isCaptureCalled;
|
361
347
|
}
|
362
348
|
|
363
349
|
export async function updateStorybookGlobals(browser, globals) {
|
364
|
-
if (isStorybookVersionLessThan(6)) {
|
365
|
-
browserLogger.warn('Globals are not supported by Storybook versions less than 6');
|
366
|
-
return;
|
367
|
-
}
|
368
|
-
|
369
350
|
browserLogger.debug('Applying storybook globals');
|
370
351
|
await browser.executeScript(function (globals) {
|
371
352
|
window.__CREEVEY_UPDATE_GLOBALS__(globals);
|
@@ -402,11 +383,8 @@ async function resolveCreeveyHost(browser, port) {
|
|
402
383
|
const addresses = getAddresses();
|
403
384
|
creeveyServerHost = await browser.executeAsyncScript(function (hosts, port, callback) {
|
404
385
|
void Promise.all(hosts.map(function (host) {
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
fetch('//' + host + ':' + port + '/ping').then(resolve).catch(reject);
|
409
|
-
}).then(function (response) {
|
386
|
+
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
387
|
+
return fetch('http://' + host + ':' + port + '/ping').then(function (response) {
|
410
388
|
return response.text();
|
411
389
|
}).then(function (pong) {
|
412
390
|
return pong == 'pong' ? host : null;
|
@@ -498,7 +476,7 @@ export async function getBrowser(config, name) {
|
|
498
476
|
});
|
499
477
|
}, () => viewport && browser && resizeViewport(browser, viewport), () => browser && openStorybookPage(browser, realAddress, config.resolveStorybookUrl), () => browser && waitForStorybook(browser)], () => !isShuttingDown.current);
|
500
478
|
} catch (originalError) {
|
501
|
-
var
|
479
|
+
var _browser4;
|
502
480
|
|
503
481
|
if (isShuttingDown.current) {
|
504
482
|
var _browser3;
|
@@ -509,7 +487,7 @@ export async function getBrowser(config, name) {
|
|
509
487
|
}
|
510
488
|
|
511
489
|
if (originalError instanceof Error && originalError.name == 'ResolveUrlError') throw originalError;
|
512
|
-
const error = new Error(`Can't load storybook root page by URL ${(
|
490
|
+
const error = new Error(`Can't load storybook root page by URL ${(await ((_browser4 = browser) === null || _browser4 === void 0 ? void 0 : _browser4.getCurrentUrl())) ?? realAddress}`);
|
513
491
|
if (originalError instanceof Error) error.stack = originalError.stack;
|
514
492
|
throw error;
|
515
493
|
}
|
@@ -546,7 +524,7 @@ export async function closeBrowser() {
|
|
546
524
|
}
|
547
525
|
}
|
548
526
|
export async function switchStory() {
|
549
|
-
var _this$currentTest, _this$currentTest$ctx
|
527
|
+
var _this$currentTest, _this$currentTest$ctx;
|
550
528
|
|
551
529
|
let testOrSuite = this.currentTest;
|
552
530
|
if (!testOrSuite) throw new Error("Can't switch story, because test context doesn't have 'currentTest' field");
|
@@ -573,7 +551,7 @@ export async function switchStory() {
|
|
573
551
|
captureElement = '#root',
|
574
552
|
waitForReady,
|
575
553
|
ignoreElements
|
576
|
-
} =
|
554
|
+
} = parameters.creevey ?? {};
|
577
555
|
browserLogger.debug(`Switching to story ${chalk.cyan(kind)}/${chalk.cyan(name)} by id ${chalk.magenta(id)}`);
|
578
556
|
if (captureElement) Object.defineProperty(this, 'captureElement', {
|
579
557
|
enumerable: true,
|
@@ -589,8 +567,6 @@ export async function switchStory() {
|
|
589
567
|
let storyPlayResolver;
|
590
568
|
let waitForComplete = new Promise(resolve => storyPlayResolver = resolve);
|
591
569
|
const unsubscribe = subscribeOn('stories', message => {
|
592
|
-
var _payload$captureEleme, _payload$ignoreElemen;
|
593
|
-
|
594
570
|
if (message.type != 'capture') return;
|
595
571
|
const {
|
596
572
|
payload = {},
|
@@ -598,7 +574,7 @@ export async function switchStory() {
|
|
598
574
|
imageName
|
599
575
|
} = {}
|
600
576
|
} = message;
|
601
|
-
void takeScreenshot(this.browser,
|
577
|
+
void takeScreenshot(this.browser, payload.captureElement ?? captureElement, payload.ignoreElements ?? ignoreElements).then(screenshot => {
|
602
578
|
this.screenshots.push({
|
603
579
|
imageName,
|
604
580
|
screenshot
|
@@ -5,7 +5,7 @@ import { downloadBinary, getCreeveyCache } from '../utils';
|
|
5
5
|
import { pullImages, runImage } from '../docker';
|
6
6
|
import { Octokit } from '@octokit/core';
|
7
7
|
import { subscribeOn } from '../messages';
|
8
|
-
import
|
8
|
+
import cluster from 'cluster';
|
9
9
|
import { chmod, exec } from 'shelljs';
|
10
10
|
const mkdirAsync = promisify(mkdir);
|
11
11
|
const writeFileAsync = promisify(writeFile);
|
@@ -41,8 +41,6 @@ async function createSelenoidConfig(browsers, {
|
|
41
41
|
}
|
42
42
|
|
43
43
|
async function downloadSelenoidBinary(destination) {
|
44
|
-
var _assets$find;
|
45
|
-
|
46
44
|
const platformNameMapping = {
|
47
45
|
darwin: 'selenoid_darwin_amd64',
|
48
46
|
linux: 'selenoid_linux_amd64',
|
@@ -59,9 +57,9 @@ async function downloadSelenoidBinary(destination) {
|
|
59
57
|
const {
|
60
58
|
browser_download_url: downloadUrl,
|
61
59
|
size: binarySize
|
62
|
-
} =
|
60
|
+
} = assets.find(({
|
63
61
|
name
|
64
|
-
}) => platformNameMapping[process.platform] == name)
|
62
|
+
}) => platformNameMapping[process.platform] == name) ?? {};
|
65
63
|
if (existsSync(destination) && lstatSync(destination).size == binarySize) return;
|
66
64
|
|
67
65
|
if (!downloadUrl) {
|
@@ -73,7 +71,7 @@ async function downloadSelenoidBinary(destination) {
|
|
73
71
|
|
74
72
|
export async function startSelenoidStandalone(config, debug) {
|
75
73
|
config.gridUrl = 'http://localhost:4444/wd/hub';
|
76
|
-
if (isWorker) return;
|
74
|
+
if (cluster.isWorker) return;
|
77
75
|
const browsers = Object.values(config.browsers).filter(browser => !browser.gridUrl);
|
78
76
|
const selenoidConfigDir = await createSelenoidConfig(browsers, {
|
79
77
|
useDocker: false
|
@@ -4,18 +4,15 @@ import { createHash } from 'crypto';
|
|
4
4
|
import { mapValues, pick } from 'lodash';
|
5
5
|
import { isDefined, isFunction, isObject } from '../types';
|
6
6
|
import { shouldSkip, removeProps } from './utils';
|
7
|
-
import { isStorybookVersionLessThan } from './storybook/helpers';
|
8
7
|
|
9
8
|
function storyTestFabric(delay, testFn) {
|
10
9
|
return async function storyTest() {
|
11
|
-
var _testFn$call;
|
12
|
-
|
13
10
|
delay ? await new Promise(resolve => setTimeout(resolve, delay)) : void 0;
|
14
|
-
await (
|
11
|
+
await (testFn ? testFn.call(this) : this.screenshots.length > 0 ? this.expect(this.screenshots.reduce((screenshots, {
|
15
12
|
imageName,
|
16
13
|
screenshot
|
17
14
|
}, index) => ({ ...screenshots,
|
18
|
-
[imageName
|
15
|
+
[imageName ?? `screenshot_${index}`]: screenshot
|
19
16
|
}), {})).to.matchImages() : this.expect(await this.takeScreenshot()).to.matchImage());
|
20
17
|
};
|
21
18
|
}
|
@@ -45,15 +42,13 @@ function createCreeveyTest(browser, storyMeta, skipOptions, testName) {
|
|
45
42
|
function convertStories(browserName, stories) {
|
46
43
|
const tests = {};
|
47
44
|
(Array.isArray(stories) ? stories : Object.values(stories)).forEach(storyMeta => {
|
48
|
-
var _storyMeta$parameters;
|
49
|
-
|
50
45
|
// TODO Skip docsOnly stories for now
|
51
46
|
if (storyMeta.parameters.docsOnly) return;
|
52
47
|
const {
|
53
48
|
delay: delayParam,
|
54
49
|
tests: storyTests,
|
55
50
|
skip
|
56
|
-
} =
|
51
|
+
} = storyMeta.parameters.creevey ?? {};
|
57
52
|
const delay = typeof delayParam == 'number' ? delayParam : delayParam !== null && delayParam !== void 0 && delayParam.for.includes(browserName) ? delayParam.ms : 0; // typeof tests === "undefined" => rootSuite -> kindSuite -> storyTest -> [browsers.png]
|
58
53
|
// typeof tests === "function" => rootSuite -> kindSuite -> storyTest -> browser -> [images.png]
|
59
54
|
// typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
|
@@ -88,11 +83,11 @@ export async function loadTestsFromStories(browsers, provider, update) {
|
|
88
83
|
const tests = {};
|
89
84
|
browsers.forEach(browser => {
|
90
85
|
Array.from(storiesByFiles.entries()).forEach(([filename, stories]) => {
|
91
|
-
var _testIdsByFiles$get
|
86
|
+
var _testIdsByFiles$get;
|
92
87
|
|
93
88
|
Object.assign(tests, convertStories(browser, stories));
|
94
89
|
const changed = Object.keys(tests);
|
95
|
-
const removed = (
|
90
|
+
const removed = ((_testIdsByFiles$get = testIdsByFiles.get(filename)) === null || _testIdsByFiles$get === void 0 ? void 0 : _testIdsByFiles$get.filter(testId => !tests[testId])) ?? [];
|
96
91
|
if (changed.length == 0) testIdsByFiles.delete(filename);else testIdsByFiles.set(filename, changed);
|
97
92
|
Object.assign(testsDiff, tests);
|
98
93
|
removed.forEach(testId => testsDiff[testId] = undefined);
|
@@ -108,35 +103,24 @@ export async function loadTestsFromStories(browsers, provider, update) {
|
|
108
103
|
fileName
|
109
104
|
}
|
110
105
|
}
|
111
|
-
}) =>
|
112
|
-
|
113
|
-
|
114
|
-
return (// TODO Don't use filename as a key, due possible collisions if two require.context with same structure of modules are defined
|
115
|
-
testIdsByFiles.set(fileName, [...((_testIdsByFiles$get2 = testIdsByFiles.get(fileName)) !== null && _testIdsByFiles$get2 !== void 0 ? _testIdsByFiles$get2 : []), id])
|
116
|
-
);
|
117
|
-
});
|
106
|
+
}) => // TODO Don't use filename as a key, due possible collisions if two require.context with same structure of modules are defined
|
107
|
+
testIdsByFiles.set(fileName, [...(testIdsByFiles.get(fileName) ?? []), id]));
|
118
108
|
return tests;
|
119
109
|
}
|
120
110
|
export function saveStoriesJson(storiesData, extract) {
|
121
|
-
|
122
|
-
|
123
|
-
const outputDir = typeof extract == 'boolean' ? 'storybook-static' : extract;
|
124
|
-
|
125
|
-
if (!isStorybookVersionLessThan(6)) {
|
126
|
-
// NOTE Copy-pasted from Storybook's `getStoriesJsonData` method
|
127
|
-
const allowed = ['fileName', 'docsOnly', 'framework', '__id', '__isArgsStory'];
|
128
|
-
storiesData.globalParameters = pick(storiesData.globalParameters, allowed); // @ts-expect-error ignore error
|
111
|
+
const outputDir = typeof extract == 'boolean' ? 'storybook-static' : extract; // NOTE Copy-pasted from Storybook's `getStoriesJsonData` method
|
129
112
|
|
130
|
-
|
113
|
+
const allowed = ['fileName', 'docsOnly', 'framework', '__id', '__isArgsStory'];
|
114
|
+
storiesData.globalParameters = pick(storiesData.globalParameters, allowed); // @ts-expect-error ignore error
|
131
115
|
|
132
|
-
|
133
|
-
parameters: pick(v.parameters, allowed)
|
134
|
-
}));
|
135
|
-
} // TODO Fix args stories
|
116
|
+
storiesData.kindParameters = mapValues(storiesData.kindParameters, v => pick(v, allowed)); // @ts-expect-error ignore error
|
136
117
|
|
118
|
+
storiesData.stories = mapValues(storiesData.stories, v => ({ ...pick(v, ['id', 'name', 'kind', 'story']),
|
119
|
+
parameters: pick(v.parameters, allowed)
|
120
|
+
})); // TODO Fix args stories
|
137
121
|
|
138
|
-
removeProps(storiesData
|
139
|
-
Object.values((
|
122
|
+
removeProps(storiesData ?? {}, ['stories', () => true, 'parameters', '__isArgsStory']);
|
123
|
+
Object.values((storiesData === null || storiesData === void 0 ? void 0 : storiesData.stories) ?? {}).forEach(story => isObject(story) && 'parameters' in story && isObject(story.parameters) && delete story.parameters.__isArgsStory);
|
140
124
|
mkdirSync(outputDir, {
|
141
125
|
recursive: true
|
142
126
|
});
|
@@ -1,16 +1,12 @@
|
|
1
|
-
var _api$channel, _api$context;
|
2
|
-
|
3
1
|
import { addons } from '@storybook/addons';
|
4
|
-
import { getStorybookFramework,
|
2
|
+
import { getStorybookFramework, resolveFromStorybook } from './helpers';
|
5
3
|
const framework = getStorybookFramework(); // eslint-disable-next-line @typescript-eslint/no-var-requires
|
6
4
|
|
7
|
-
const core = require(resolveFromStorybook('@storybook/core'));
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
9
|
-
|
5
|
+
const core = require(resolveFromStorybook('@storybook/core-client'));
|
10
6
|
|
11
|
-
const start =
|
7
|
+
const start = core.start;
|
12
8
|
const api = start(() => void 0);
|
13
|
-
export const channel =
|
9
|
+
export const channel = addons.getChannel();
|
14
10
|
export const clientApi = api.clientApi;
|
15
11
|
export const forceReRender = api.forceReRender;
|
16
12
|
export const storiesOf = (kind, m) => {
|
@@ -19,21 +15,8 @@ export const storiesOf = (kind, m) => {
|
|
19
15
|
});
|
20
16
|
};
|
21
17
|
export const configure = (...args) => {
|
22
|
-
|
23
|
-
//NOTE: Storybook <= 5.1 pass args as is
|
24
|
-
//@ts-expect-error: ignore it
|
25
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
26
|
-
return api.configApi.configure(...args);
|
27
|
-
}
|
28
|
-
|
29
|
-
if (isStorybookVersionLessThan(6)) {
|
30
|
-
//NOTE: Storybook <= 5.3 pass `framework` as last argument
|
31
|
-
//@ts-expect-error: ignore it
|
32
|
-
return api.configure(...args, framework);
|
33
|
-
} //NOTE Storybook 6.x pass `framework` as first argument
|
18
|
+
//NOTE Storybook 6.x pass `framework` as first argument
|
34
19
|
//@ts-expect-error: ignore it
|
35
|
-
|
36
|
-
|
37
20
|
return api.configure(framework, ...args);
|
38
21
|
};
|
39
22
|
export const addDecorator = clientApi.addDecorator;
|
@@ -7,7 +7,7 @@ export const storybookDirRef = {
|
|
7
7
|
export const resolveFromStorybook = modulePath => resolveFrom(storybookDirRef.current, modulePath);
|
8
8
|
export const resolveFromStorybookAddonDocs = modulePath => resolveFrom(resolveFromStorybook('@storybook/addon-docs'), modulePath);
|
9
9
|
export const resolveFromStorybookBuilderWebpack4 = modulePath => resolveFrom(resolveFromStorybook('@storybook/builder-webpack4'), modulePath);
|
10
|
-
export const
|
10
|
+
export const resolveFromStorybookCoreClient = modulePath => resolveFrom(resolveFromStorybook('@storybook/core-client'), modulePath);
|
11
11
|
export const resolveFromStorybookCoreServer = modulePath => resolveFrom(resolveFromStorybook('@storybook/core-server'), modulePath);
|
12
12
|
|
13
13
|
const importFromStorybook = modulePath => import(resolveFromStorybook(modulePath));
|
@@ -40,27 +40,19 @@ export function getStorybookVersion() {
|
|
40
40
|
return version;
|
41
41
|
}
|
42
42
|
export function isStorybookVersionLessThan(major, minor) {
|
43
|
-
|
44
|
-
|
45
|
-
const [sbMajor, sbMinor] = ((_process$env$__CREEVE = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE !== void 0 ? _process$env$__CREEVE : getStorybookVersion()).split('.');
|
43
|
+
const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
|
46
44
|
return Number(sbMajor) < major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) < minor;
|
47
45
|
}
|
48
46
|
export function isStorybookVersionGreaterThan(major, minor) {
|
49
|
-
|
50
|
-
|
51
|
-
const [sbMajor, sbMinor] = ((_process$env$__CREEVE2 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE2 !== void 0 ? _process$env$__CREEVE2 : getStorybookVersion()).split('.');
|
47
|
+
const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
|
52
48
|
return Number(sbMajor) > major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) > minor;
|
53
49
|
}
|
54
50
|
export function isStorybookVersion(major, minor) {
|
55
|
-
|
56
|
-
|
57
|
-
const [sbMajor, sbMinor] = ((_process$env$__CREEVE3 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE3 !== void 0 ? _process$env$__CREEVE3 : getStorybookVersion()).split('.');
|
51
|
+
const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
|
58
52
|
return Number(sbMajor) == major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) == minor;
|
59
53
|
}
|
60
54
|
export function getStorybookFramework() {
|
61
|
-
|
62
|
-
|
63
|
-
const framework = (_process$env$__CREEVE4 = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__) !== null && _process$env$__CREEVE4 !== void 0 ? _process$env$__CREEVE4 : supportedFrameworks.find(framework => {
|
55
|
+
const framework = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__ ?? supportedFrameworks.find(framework => {
|
64
56
|
try {
|
65
57
|
return require.resolve(resolveFromStorybook(`@storybook/${framework}`));
|
66
58
|
} catch (_) {
|
@@ -81,8 +73,8 @@ export async function importStorybookConfig() {
|
|
81
73
|
try {
|
82
74
|
return storybookConfigRef.current = (await import(require.resolve(configPath))).default;
|
83
75
|
} catch (_) {
|
84
|
-
const storybookUtilsPath =
|
85
|
-
const serverRequireModule =
|
76
|
+
const storybookUtilsPath = '@storybook/core-common/dist/cjs/utils';
|
77
|
+
const serverRequireModule = 'interpret-require'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
86
78
|
|
87
79
|
const {
|
88
80
|
getInterpretedFile
|
@@ -91,16 +83,15 @@ export async function importStorybookConfig() {
|
|
91
83
|
const {
|
92
84
|
default: serverRequireFallback,
|
93
85
|
serverRequire = serverRequireFallback
|
94
|
-
} = await import(resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
86
|
+
} = await import(resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
95
87
|
|
96
|
-
const mainConfigFile =
|
97
|
-
getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
88
|
+
const mainConfigFile = getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
98
89
|
|
99
90
|
return storybookConfigRef.current = serverRequire(mainConfigFile);
|
100
91
|
}
|
101
92
|
}
|
102
93
|
export async function isCSFv3Enabled() {
|
103
|
-
var _await$importStoryboo, _await$importStoryboo2
|
94
|
+
var _await$importStoryboo, _await$importStoryboo2;
|
104
95
|
|
105
|
-
return (_await$importStoryboo =
|
96
|
+
return ((_await$importStoryboo = await importStorybookConfig()) === null || _await$importStoryboo === void 0 ? void 0 : (_await$importStoryboo2 = _await$importStoryboo.features) === null || _await$importStoryboo2 === void 0 ? void 0 : _await$importStoryboo2.previewCsfV3) ?? false;
|
106
97
|
}
|
@@ -1,15 +1,14 @@
|
|
1
|
-
import cluster
|
1
|
+
import cluster from 'cluster';
|
2
2
|
import { loadStoriesFromBrowser } from '../../selenium';
|
3
3
|
import { emitStoriesMessage, sendStoriesMessage, subscribeOn, subscribeOnWorker } from '../../messages';
|
4
|
-
import { deserializeRawStories } from '../../../shared';
|
5
4
|
import { isDefined } from '../../../types';
|
6
5
|
import { logger } from '../../logger';
|
7
6
|
export async function loadStories(_config, {
|
8
7
|
port
|
9
8
|
}, storiesListener) {
|
10
|
-
if (
|
9
|
+
if (cluster.isPrimary) {
|
11
10
|
return new Promise(resolve => {
|
12
|
-
const worker = Object.values(cluster.workers).filter(isDefined).find(worker => worker.isConnected());
|
11
|
+
const worker = Object.values(cluster.workers ?? {}).filter(isDefined).find(worker => worker.isConnected());
|
13
12
|
|
14
13
|
if (worker) {
|
15
14
|
const unsubscribe = subscribeOnWorker(worker, 'stories', message => {
|
@@ -44,7 +43,7 @@ export async function loadStories(_config, {
|
|
44
43
|
});
|
45
44
|
if (message.type == 'update') storiesListener(new Map(message.payload));
|
46
45
|
});
|
47
|
-
const stories =
|
46
|
+
const stories = await loadStoriesFromBrowser(port);
|
48
47
|
const storiesWithOldTests = [];
|
49
48
|
Object.values(stories).forEach(story => {
|
50
49
|
var _parameters, _parameters$creevey;
|
@@ -1,13 +1,12 @@
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/ban-ts-comment */
|
2
2
|
import path from 'path';
|
3
|
-
import
|
3
|
+
import cluster from 'cluster';
|
4
4
|
import chokidar from 'chokidar';
|
5
5
|
import { noop } from '../../../types';
|
6
6
|
import { getCreeveyCache } from '../../utils';
|
7
7
|
import { subscribeOn } from '../../messages';
|
8
|
-
import { importStorybookClientLogger, importStorybookConfig, importStorybookCoreCommon, importStorybookCoreEvents
|
8
|
+
import { importStorybookClientLogger, importStorybookConfig, importStorybookCoreCommon, importStorybookCoreEvents } from '../helpers';
|
9
9
|
import { logger } from '../../logger';
|
10
|
-
import { denormalizeStoryParameters } from '../../../shared';
|
11
10
|
|
12
11
|
async function initStorybookEnvironment() {
|
13
12
|
// @ts-expect-error There is no @types/global-jsdom package
|
@@ -25,7 +24,7 @@ async function initStorybookEnvironment() {
|
|
25
24
|
logger
|
26
25
|
} = await importStorybookClientLogger(); // NOTE: Disable duplication warnings for >=6.2 storybook
|
27
26
|
|
28
|
-
if (isWorker) logger.warn = noop; // NOTE: disable logger for 5.x storybook
|
27
|
+
if (cluster.isWorker) logger.warn = noop; // NOTE: disable logger for 5.x storybook
|
29
28
|
|
30
29
|
logger.debug = noop;
|
31
30
|
return import('../entry');
|
@@ -39,7 +38,7 @@ function watchStories(channel, watcher, initialFiles) {
|
|
39
38
|
watcher.on('change', filePath => storiesByFiles.set(path.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
|
40
39
|
watcher.on('unlink', filePath => storiesByFiles.set(path.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
|
41
40
|
return data => {
|
42
|
-
const stories =
|
41
|
+
const stories = data.stories;
|
43
42
|
const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
|
44
43
|
const addedFiles = Array.from(files).filter(filePath => !watchingFiles.has(filePath));
|
45
44
|
const removedFiles = Array.from(watchingFiles).filter(filePath => !files.has(filePath));
|
@@ -105,7 +104,7 @@ async function loadStoriesDirectly(config, {
|
|
105
104
|
stories
|
106
105
|
} = await importStorybookConfig();
|
107
106
|
const contexts = stories.map(entry => {
|
108
|
-
const normalizedEntry =
|
107
|
+
const normalizedEntry = normalizeStoriesEntry(entry, {
|
109
108
|
configDir: config.storybookDir,
|
110
109
|
workingDir: process.cwd()
|
111
110
|
});
|
@@ -154,7 +153,7 @@ async function loadStoriesDirectly(config, {
|
|
154
153
|
try {
|
155
154
|
configure(contexts.map(ctx => ctx()), module, false);
|
156
155
|
} catch (error) {
|
157
|
-
if (
|
156
|
+
if (cluster.isPrimary) logger.error(error);
|
158
157
|
}
|
159
158
|
}
|
160
159
|
|
@@ -187,7 +186,7 @@ export async function loadStories(config, {
|
|
187
186
|
});
|
188
187
|
const loadPromise = new Promise(resolve => {
|
189
188
|
channel.once(Events.SET_STORIES, data => {
|
190
|
-
const stories =
|
189
|
+
const stories = data.stories;
|
191
190
|
const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
|
192
191
|
if (watcher) channel.on(Events.SET_STORIES, watchStories(channel, watcher, files));
|
193
192
|
resolve(stories);
|
package/lib/esm/server/update.js
CHANGED
@@ -15,11 +15,7 @@ function tryToLoadTestsData(filename) {
|
|
15
15
|
const actualRegex = /^(.*)-actual-(\d+)\.png$/i;
|
16
16
|
|
17
17
|
function approve(dirents, srcPath, dstPath, testPaths, isMatch) {
|
18
|
-
dirents.filter(dirent => dirent.isFile()).map(dirent => actualRegex.exec(dirent.name)).filter(isDefined).filter(([fileName, imageName]) => !testPaths || testPaths.find(([token]) => token == imageName) && isMatch(path.join(srcPath, fileName))).reduce((images, [, imageName, retry]) => {
|
19
|
-
var _images$get;
|
20
|
-
|
21
|
-
return Number(retry) > ((_images$get = images.get(imageName)) !== null && _images$get !== void 0 ? _images$get : -1) ? images.set(imageName, Number(retry)) : images;
|
22
|
-
}, new Map()).forEach((retry, imageName) => {
|
18
|
+
dirents.filter(dirent => dirent.isFile()).map(dirent => actualRegex.exec(dirent.name)).filter(isDefined).filter(([fileName, imageName]) => !testPaths || testPaths.find(([token]) => token == imageName) && isMatch(path.join(srcPath, fileName))).reduce((images, [, imageName, retry]) => Number(retry) > (images.get(imageName) ?? -1) ? images.set(imageName, Number(retry)) : images, new Map()).forEach((retry, imageName) => {
|
23
19
|
mkdirSync(dstPath, {
|
24
20
|
recursive: true
|
25
21
|
});
|