creevey 0.9.0-beta.0 → 0.9.0-beta.10
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 +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/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 +22 -41
- 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 +4 -68
- package/lib/cjs/client/addon/preset.sb7.js +19 -0
- package/lib/cjs/client/addon/preview.js +14 -0
- 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 -366
- 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 +5 -5
- package/lib/cjs/server/config.js +3 -5
- 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 +58 -70
- 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 +21 -28
- package/lib/cjs/server/storybook/providers/browser.js +10 -14
- package/lib/cjs/server/storybook/providers/hybrid.js +17 -14
- package/lib/cjs/server/storybook/providers/nodejs.js +12 -12
- package/lib/cjs/server/{parser.js → testsFiles/parser.js} +1 -14
- package/lib/cjs/server/testsFiles/register.js +44 -0
- 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 +9 -19
- package/lib/cjs/shared/index.js +101 -0
- package/lib/cjs/shared/serializeRegExp.js +42 -0
- package/lib/cjs/types.js +7 -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 +20 -37
- 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 +4 -52
- package/lib/esm/client/addon/preset.sb7.js +8 -0
- package/lib/esm/client/addon/preview.js +5 -0
- 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 +156 -363
- 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 +2 -4
- package/lib/esm/server/config.js +3 -5
- 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 +54 -66
- 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 +12 -21
- package/lib/esm/server/storybook/providers/browser.js +6 -9
- package/lib/esm/server/storybook/providers/hybrid.js +10 -13
- package/lib/esm/server/storybook/providers/nodejs.js +10 -11
- package/lib/esm/server/{parser.js → testsFiles/parser.js} +1 -14
- package/lib/esm/server/testsFiles/register.js +31 -0
- 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 +9 -19
- package/lib/esm/shared/index.js +78 -0
- package/lib/esm/shared/serializeRegExp.js +24 -0
- package/lib/esm/types.js +1 -0
- package/lib/types/client/addon/Manager.d.ts +2 -2
- package/lib/types/client/addon/components/TestSelect.d.ts +0 -1
- package/lib/types/client/addon/index.d.ts +2 -0
- package/lib/types/client/addon/preset.d.ts +0 -22
- package/lib/types/client/addon/preset.ie11.d.ts +10 -0
- package/lib/types/client/addon/preset.sb7.d.ts +2 -0
- 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 +1 -1
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +1 -1
- package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +0 -1
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +1 -1
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +1 -1
- package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +0 -1
- package/lib/types/client/shared/components/PageFooter/Paging.d.ts +0 -1
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +1 -1
- package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +0 -1
- package/lib/types/client/shared/components/ResultsPage.d.ts +1 -1
- package/lib/types/client/web/CreeveyApp.d.ts +0 -1
- package/lib/types/client/web/CreeveyLoader.d.ts +1 -2
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +0 -1
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +4 -4
- package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +0 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +1 -1
- package/lib/types/index.d.ts +4 -2
- package/lib/types/server/config.d.ts +1 -1
- package/lib/types/server/loaders/babel/register.d.ts +1 -1
- package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -2
- package/lib/types/server/logger.d.ts +6 -2
- package/lib/types/server/messages.d.ts +13 -12
- package/lib/types/server/selenium/browser.d.ts +5 -3
- package/lib/types/server/storybook/entry.d.ts +2 -3
- package/lib/types/server/storybook/helpers.d.ts +1 -1
- 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/storybook/providers/nodejs.d.ts +3 -3
- package/lib/types/server/{parser.d.ts → testsFiles/parser.d.ts} +1 -1
- package/lib/types/server/testsFiles/register.d.ts +2 -0
- package/lib/types/server/utils.d.ts +5 -1
- package/lib/types/{shared.d.ts → shared/index.d.ts} +1 -10
- package/lib/types/shared/serializeRegExp.d.ts +9 -0
- package/lib/types/types.d.ts +7 -9
- package/package.json +119 -102
- package/preset/ie11.js +5 -0
- package/{preset.js → preset/index.js} +2 -2
- package/preset/sb7.js +5 -0
- package/types/global.d.ts +5 -0
- 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 -107
- package/lib/esm/shared.js +0 -76
- package/storybook-static/stories.json +0 -21
@@ -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));
|
@@ -35,32 +35,24 @@ export function getStorybookVersion() {
|
|
35
35
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
36
36
|
const {
|
37
37
|
version
|
38
|
-
} = require(resolveFromStorybook('@storybook/core/package.json'));
|
38
|
+
} = require(resolveFromStorybook('@storybook/core-server/package.json'));
|
39
39
|
|
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,12 @@
|
|
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
|
-
export async
|
8
|
-
|
9
|
-
}, storiesListener) {
|
10
|
-
if (isMaster) {
|
6
|
+
export const loadStories = async (_config, _options, storiesListener) => {
|
7
|
+
if (cluster.isPrimary) {
|
11
8
|
return new Promise(resolve => {
|
12
|
-
const worker = Object.values(cluster.workers).filter(isDefined).find(worker => worker.isConnected());
|
9
|
+
const worker = Object.values(cluster.workers ?? {}).filter(isDefined).find(worker => worker.isConnected());
|
13
10
|
|
14
11
|
if (worker) {
|
15
12
|
const unsubscribe = subscribeOnWorker(worker, 'stories', message => {
|
@@ -44,7 +41,7 @@ export async function loadStories(_config, {
|
|
44
41
|
});
|
45
42
|
if (message.type == 'update') storiesListener(new Map(message.payload));
|
46
43
|
});
|
47
|
-
const stories =
|
44
|
+
const stories = await loadStoriesFromBrowser();
|
48
45
|
const storiesWithOldTests = [];
|
49
46
|
Object.values(stories).forEach(story => {
|
50
47
|
var _parameters, _parameters$creevey;
|
@@ -58,4 +55,4 @@ export async function loadStories(_config, {
|
|
58
55
|
});
|
59
56
|
return stories;
|
60
57
|
}
|
61
|
-
}
|
58
|
+
};
|
@@ -1,12 +1,10 @@
|
|
1
1
|
import chokidar from 'chokidar';
|
2
2
|
import { loadStories as browserProvider } from './browser';
|
3
3
|
import { logger } from '../../logger';
|
4
|
-
import parse from '../../parser';
|
4
|
+
import parse from '../../testsFiles/parser';
|
5
5
|
import { readDirRecursive } from '../../../server/utils';
|
6
6
|
import { combineParameters } from '../../../shared';
|
7
|
-
export async
|
8
|
-
port
|
9
|
-
}, storiesListener) {
|
7
|
+
export const loadStories = async (_config, _options, storiesListener) => {
|
10
8
|
let creeveyParamsByStoryId = {};
|
11
9
|
|
12
10
|
const mergeParamsFromTestsToStory = (story, creeveyParams) => {
|
@@ -15,9 +13,7 @@ export async function loadStories(_config, {
|
|
15
13
|
}
|
16
14
|
};
|
17
15
|
|
18
|
-
const stories = await browserProvider(_config, {
|
19
|
-
port
|
20
|
-
}, updatedStoriesByFiles => {
|
16
|
+
const stories = await browserProvider(_config, {}, updatedStoriesByFiles => {
|
21
17
|
Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
|
22
18
|
storiesArray.forEach(story => {
|
23
19
|
const creeveyParams = creeveyParamsByStoryId[story.id];
|
@@ -37,18 +33,19 @@ export async function loadStories(_config, {
|
|
37
33
|
mergeParamsFromTestsToStory(story, creeveyParamsByStoryId[storyId]);
|
38
34
|
});
|
39
35
|
return stories;
|
40
|
-
}
|
36
|
+
};
|
41
37
|
|
42
|
-
function parseParams(config, listener) {
|
43
|
-
if (!config.
|
38
|
+
async function parseParams(config, listener) {
|
39
|
+
if (!config.testsDir) {
|
44
40
|
return Promise.resolve({});
|
45
41
|
}
|
46
42
|
|
47
|
-
const testFiles = readDirRecursive(config.
|
48
|
-
var _config$
|
43
|
+
const testFiles = readDirRecursive(config.testsDir).filter(file => {
|
44
|
+
var _config$testsRegex;
|
49
45
|
|
50
|
-
return (_config$
|
46
|
+
return (_config$testsRegex = config.testsRegex) === null || _config$testsRegex === void 0 ? void 0 : _config$testsRegex.test(file);
|
51
47
|
});
|
48
|
+
await (await import('../../testsFiles/register')).default(config);
|
52
49
|
|
53
50
|
if (listener) {
|
54
51
|
chokidar.watch(testFiles).on('change', filePath => {
|
@@ -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
|
|
@@ -170,10 +169,10 @@ async function loadStoriesDirectly(config, {
|
|
170
169
|
} // TODO Do we need to support multiple storybooks here?
|
171
170
|
|
172
171
|
|
173
|
-
export async
|
172
|
+
export const loadStories = async (config, {
|
174
173
|
watch,
|
175
174
|
debug
|
176
|
-
}, storiesListener) {
|
175
|
+
}, storiesListener) => {
|
177
176
|
const storybookApi = await initStorybookEnvironment();
|
178
177
|
const Events = await importStorybookCoreEvents();
|
179
178
|
const {
|
@@ -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);
|
@@ -198,7 +197,7 @@ export async function loadStories(config, {
|
|
198
197
|
debug
|
199
198
|
});
|
200
199
|
return loadPromise;
|
201
|
-
}
|
200
|
+
};
|
202
201
|
export async function extractStoriesData(config, {
|
203
202
|
watch,
|
204
203
|
debug
|
@@ -1,19 +1,6 @@
|
|
1
1
|
import { toId, storyNameFromExport } from '@storybook/csf';
|
2
2
|
export default async function parse(files) {
|
3
|
-
result = {};
|
4
|
-
|
5
|
-
(await import('@babel/register')).default({
|
6
|
-
babelrc: false,
|
7
|
-
rootMode: 'upward-optional',
|
8
|
-
ignore: [/node_modules/],
|
9
|
-
extensions: ['.js', '.jsx', '.ts', '.tsx'],
|
10
|
-
plugins: [['@babel/plugin-transform-runtime']],
|
11
|
-
presets: ['@babel/preset-typescript', ['@babel/preset-env', {
|
12
|
-
targets: {
|
13
|
-
node: '10'
|
14
|
-
}
|
15
|
-
}]]
|
16
|
-
});
|
3
|
+
result = {};
|
17
4
|
await Promise.all(files.map(async file => import(file)));
|
18
5
|
return result;
|
19
6
|
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { addHook } from 'pirates';
|
2
|
+
import { getTsconfig } from 'get-tsconfig';
|
3
|
+
export default async function register(config) {
|
4
|
+
addHook(() => '', {
|
5
|
+
exts: ['.jpg', '.jpeg', '.png', '.gif', '.eot', '.otf', '.svg', '.ttf', '.woff', '.woff2', '.css', '.less', '.scss', '.styl'],
|
6
|
+
ignoreNodeModules: false
|
7
|
+
});
|
8
|
+
const {
|
9
|
+
path: tsConfigPath
|
10
|
+
} = getTsconfig(config.tsConfig) || {}; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
11
|
+
|
12
|
+
(await import('@babel/register')).default(config.babelOptions({
|
13
|
+
babelrc: false,
|
14
|
+
rootMode: 'upward-optional',
|
15
|
+
ignore: [/node_modules/],
|
16
|
+
extensions: ['.js', '.jsx', '.ts', '.tsx'],
|
17
|
+
parserOpts: {
|
18
|
+
sourceType: 'module',
|
19
|
+
plugins: ['jsx', 'typescript']
|
20
|
+
},
|
21
|
+
presets: ['@babel/preset-typescript', ['@babel/preset-env', {
|
22
|
+
targets: {
|
23
|
+
node: '10'
|
24
|
+
},
|
25
|
+
modules: 'commonjs'
|
26
|
+
}]],
|
27
|
+
plugins: [['@babel/plugin-transform-runtime'], ...(tsConfigPath ? [['babel-plugin-tsconfig-paths', {
|
28
|
+
tsconfig: tsConfigPath
|
29
|
+
}]] : [])]
|
30
|
+
})); // (await import('ts-node')).register({ project: tsConfigPath, transpileOnly: true });
|
31
|
+
}
|
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
|
});
|
package/lib/esm/server/utils.js
CHANGED
@@ -20,38 +20,29 @@ export function shouldSkip(browser, meta, skipOptions, test) {
|
|
20
20
|
return skipOptions;
|
21
21
|
}
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
if (reason) return reason;
|
27
|
-
}
|
28
|
-
|
29
|
-
return false;
|
23
|
+
for (const skipKey in skipOptions) {
|
24
|
+
const reason = shouldSkipByOption(browser, meta, skipOptions[skipKey], skipKey, test);
|
25
|
+
if (reason) return reason;
|
30
26
|
}
|
31
27
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
28
|
+
return false;
|
29
|
+
}
|
30
|
+
export function shouldSkipByOption(browser, meta, skipOption, reason, test) {
|
31
|
+
if (Array.isArray(skipOption)) {
|
32
|
+
for (const skip of skipOption) {
|
33
|
+
const result = shouldSkipByOption(browser, meta, skip, reason, test);
|
34
|
+
if (result) return result;
|
38
35
|
}
|
39
36
|
|
40
|
-
|
41
|
-
reason: skipKey,
|
42
|
-
...skipOptions[skipKey]
|
43
|
-
}, test);
|
44
|
-
if (reason) return reason;
|
37
|
+
return false;
|
45
38
|
}
|
46
39
|
|
47
|
-
if (!hasSkipOptionKeys) return false;
|
48
40
|
const {
|
49
41
|
in: browsers,
|
50
42
|
kinds,
|
51
43
|
stories,
|
52
|
-
tests
|
53
|
-
|
54
|
-
} = skipOptions;
|
44
|
+
tests
|
45
|
+
} = skipOption;
|
55
46
|
const {
|
56
47
|
kind,
|
57
48
|
story
|
@@ -64,7 +55,7 @@ export function shouldSkip(browser, meta, skipOptions, test) {
|
|
64
55
|
}
|
65
56
|
export async function shutdownWorkers() {
|
66
57
|
isShuttingDown.current = true;
|
67
|
-
await Promise.all(Object.values(cluster.workers).filter(isDefined).filter(worker => worker.isConnected()).map(worker => new Promise(resolve => {
|
58
|
+
await Promise.all(Object.values(cluster.workers ?? {}).filter(isDefined).filter(worker => worker.isConnected()).map(worker => new Promise(resolve => {
|
68
59
|
const timeout = setTimeout(() => worker.kill(), 10000);
|
69
60
|
worker.on('exit', () => {
|
70
61
|
clearTimeout(timeout);
|
@@ -96,27 +87,23 @@ export function testsToImages(tests) {
|
|
96
87
|
storyPath,
|
97
88
|
results
|
98
89
|
}) => {
|
99
|
-
var _results$slice
|
90
|
+
var _results$slice$;
|
100
91
|
|
101
|
-
return Object.keys((
|
92
|
+
return Object.keys((results === null || results === void 0 ? void 0 : (_results$slice$ = results.slice(-1)[0]) === null || _results$slice$ === void 0 ? void 0 : _results$slice$.images) ?? {}).map(image => `${[...storyPath, testName, browser, browser == image ? undefined : image].filter(isDefined).join('/')}.png`);
|
102
93
|
})));
|
103
94
|
} // https://tuhrig.de/how-to-know-you-are-inside-a-docker-container/
|
104
95
|
|
105
96
|
export const isInsideDocker = existsSync('/proc/1/cgroup') && /docker/.test(readFileSync('/proc/1/cgroup', 'utf8'));
|
106
97
|
export const downloadBinary = (downloadUrl, destination) => new Promise((resolve, reject) => get(downloadUrl, response => {
|
107
|
-
var _response$statusCode2;
|
108
|
-
|
109
98
|
if (response.statusCode == 302) {
|
110
|
-
var _response$statusCode;
|
111
|
-
|
112
99
|
const {
|
113
100
|
location
|
114
101
|
} = response.headers;
|
115
|
-
if (!location) return reject(new Error(`Couldn't download selenoid. Status code: ${
|
102
|
+
if (!location) return reject(new Error(`Couldn't download selenoid. Status code: ${response.statusCode ?? 'UNKNOWN'}`));
|
116
103
|
return resolve(downloadBinary(location, destination));
|
117
104
|
}
|
118
105
|
|
119
|
-
if (response.statusCode != 200) return reject(new Error(`Couldn't download selenoid. Status code: ${
|
106
|
+
if (response.statusCode != 200) return reject(new Error(`Couldn't download selenoid. Status code: ${response.statusCode ?? 'UNKNOWN'}`));
|
120
107
|
const fileStream = createWriteStream(destination);
|
121
108
|
response.pipe(fileStream);
|
122
109
|
fileStream.on('finish', () => {
|
@@ -1,5 +1,3 @@
|
|
1
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
2
|
-
|
3
1
|
import chalk from 'chalk';
|
4
2
|
import { reporters } from 'mocha';
|
5
3
|
import prefix from 'loglevel-plugin-prefix';
|
@@ -26,31 +24,18 @@ export class CreeveyReporter extends reporters.Base {
|
|
26
24
|
});
|
27
25
|
runner.on('test', test => testLogger.warn(chalk.cyan(test.titlePath().join('/'))));
|
28
26
|
runner.on('pass', test => testLogger.info(chalk.cyan(test.titlePath().join('/'))));
|
29
|
-
runner.on('fail', (test, error) => testLogger.error(chalk.cyan(test.titlePath().join('/')), '\n ', getErrors(error, (error, imageName) => `${chalk.bold(imageName
|
30
|
-
var _error$stack;
|
31
|
-
|
32
|
-
return `${(_error$stack = error.stack) !== null && _error$stack !== void 0 ? _error$stack : error.message}`;
|
33
|
-
}).join('\n ')));
|
27
|
+
runner.on('fail', (test, error) => testLogger.error(chalk.cyan(test.titlePath().join('/')), '\n ', getErrors(error, (error, imageName) => `${chalk.bold(imageName ?? topLevelSuite)}:${error}`, error => `${error.stack ?? error.message}`).join('\n ')));
|
34
28
|
}
|
35
29
|
|
36
30
|
}
|
37
31
|
export class TeamcityReporter extends reporters.Base {
|
38
32
|
constructor(runner, options) {
|
39
33
|
super(runner);
|
40
|
-
|
41
|
-
_defineProperty(this, "escape", str => {
|
42
|
-
if (!str) return '';
|
43
|
-
return str.toString() // eslint-disable-next-line no-control-regex
|
44
|
-
.replace(/\x1B.*?m/g, '').replace(/\|/g, '||').replace(/\n/g, '|n').replace(/\r/g, '|r').replace(/\[/g, '|[').replace(/\]/g, '|]').replace(/\u0085/g, '|x').replace(/\u2028/g, '|l').replace(/\u2029/g, '|p').replace(/'/g, "|'");
|
45
|
-
});
|
46
|
-
|
47
34
|
const topLevelSuite = this.escape(options.reporterOptions.topLevelSuite);
|
48
35
|
const reporterOptions = options.reporterOptions;
|
49
36
|
runner.on('suite', suite => suite.root ? console.log(`##teamcity[testSuiteStarted name='${topLevelSuite}' flowId='${process.pid}']`) : console.log(`##teamcity[testSuiteStarted name='${this.escape(suite.title)}' flowId='${process.pid}']`));
|
50
37
|
runner.on('test', test => console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`));
|
51
38
|
runner.on('fail', (test, error) => {
|
52
|
-
var _error$stack2;
|
53
|
-
|
54
39
|
Object.entries(reporterOptions.images).forEach(([name, image]) => {
|
55
40
|
if (!image) return;
|
56
41
|
const filePath = test.titlePath().concat(name == topLevelSuite ? [] : [topLevelSuite]).map(this.escape).join('/'); // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
@@ -66,7 +51,7 @@ export class TeamcityReporter extends reporters.Base {
|
|
66
51
|
}); // Output failed test as passed due TC don't support retry mechanic
|
67
52
|
// https://teamcity-support.jetbrains.com/hc/en-us/community/posts/207216829-Count-test-as-successful-if-at-least-one-try-is-successful?page=1#community_comment_207394125
|
68
53
|
|
69
|
-
reporterOptions.willRetry ? console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`) : console.log(`##teamcity[testFailed name='${this.escape(test.title)}' message='${this.escape(error.message)}' details='${this.escape(
|
54
|
+
reporterOptions.willRetry ? console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`) : console.log(`##teamcity[testFailed name='${this.escape(test.title)}' message='${this.escape(error.message)}' details='${this.escape(error.stack ?? '')}' flowId='${process.pid}']`);
|
70
55
|
});
|
71
56
|
runner.on('pending', test => console.log(`##teamcity[testIgnored name='${this.escape(test.title)}' message='${this.escape(typeof test.skipReason == 'boolean' ? test.title : test.skipReason)}' flowId='${process.pid}']`));
|
72
57
|
runner.on('test end', test => console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`));
|
@@ -74,6 +59,11 @@ export class TeamcityReporter extends reporters.Base {
|
|
74
59
|
runner.on('end', () => console.log(`##teamcity[testSuiteFinished name='${topLevelSuite}' flowId='${process.pid}']`));
|
75
60
|
}
|
76
61
|
|
62
|
+
escape = str => {
|
63
|
+
if (!str) return '';
|
64
|
+
return str.toString() // eslint-disable-next-line no-control-regex
|
65
|
+
.replace(/\x1B.*?m/g, '').replace(/\|/g, '||').replace(/\n/g, '|n').replace(/\r/g, '|r').replace(/\[/g, '|[').replace(/\]/g, '|]').replace(/\u0085/g, '|x').replace(/\u2028/g, '|l').replace(/\u2029/g, '|p').replace(/'/g, "|'");
|
66
|
+
};
|
77
67
|
}
|
78
68
|
|
79
69
|
function getErrors(error, imageErrorToString, errorToString) {
|
@@ -88,9 +78,7 @@ function getErrors(error, imageErrorToString, errorToString) {
|
|
88
78
|
} else {
|
89
79
|
const imageErrors = error.images;
|
90
80
|
Object.keys(imageErrors).forEach(imageName => {
|
91
|
-
|
92
|
-
|
93
|
-
errors.push(imageErrorToString((_imageErrors$imageNam = imageErrors[imageName]) !== null && _imageErrors$imageNam !== void 0 ? _imageErrors$imageNam : '', imageName));
|
81
|
+
errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
|
94
82
|
});
|
95
83
|
}
|
96
84
|
|
@@ -34,9 +34,7 @@ async function getLastImageNumber(imageDir, imageName) {
|
|
34
34
|
const actualImagesRegexp = new RegExp(`${imageName}-actual-(\\d+)\\.png`);
|
35
35
|
|
36
36
|
try {
|
37
|
-
|
38
|
-
|
39
|
-
return (_await$readdirAsync$m = (await readdirAsync(imageDir)).map(filename => filename.replace(actualImagesRegexp, '$1')).map(Number).filter(x => !isNaN(x)).sort((a, b) => b - a)[0]) !== null && _await$readdirAsync$m !== void 0 ? _await$readdirAsync$m : 0;
|
37
|
+
return (await readdirAsync(imageDir)).map(filename => filename.replace(actualImagesRegexp, '$1')).map(Number).filter(x => !isNaN(x)).sort((a, b) => b - a)[0] ?? 0;
|
40
38
|
} catch (_error) {
|
41
39
|
return 0;
|
42
40
|
}
|
@@ -54,8 +52,6 @@ export default async function worker(config, options) {
|
|
54
52
|
|
55
53
|
function runHandler(failures) {
|
56
54
|
if (failures > 0 && (error || Object.values(images).some(image => (image === null || image === void 0 ? void 0 : image.error) != null))) {
|
57
|
-
var _error2;
|
58
|
-
|
59
55
|
const isTimeout = hasTimeout(error) || Object.values(images).some(image => hasTimeout(image === null || image === void 0 ? void 0 : image.error));
|
60
56
|
const payload = {
|
61
57
|
status: 'failed',
|
@@ -65,7 +61,7 @@ export default async function worker(config, options) {
|
|
65
61
|
isTimeout ? emitWorkerMessage({
|
66
62
|
type: 'error',
|
67
63
|
payload: {
|
68
|
-
error:
|
64
|
+
error: error ?? 'Unknown error'
|
69
65
|
}
|
70
66
|
}) : emitTestMessage({
|
71
67
|
type: 'end',
|
@@ -96,18 +92,16 @@ export default async function worker(config, options) {
|
|
96
92
|
}
|
97
93
|
|
98
94
|
async function getExpected(assertImageName) {
|
99
|
-
var _images$imageName;
|
100
|
-
|
101
95
|
// context => [kind, story, test, browser]
|
102
96
|
// rootSuite -> kindSuite -> storyTest -> [browsers.png]
|
103
97
|
// rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
|
104
98
|
const testPath = [...testScope];
|
105
|
-
const imageName = assertImageName
|
99
|
+
const imageName = assertImageName ?? testPath.pop();
|
106
100
|
const imagesMeta = [];
|
107
101
|
const reportImageDir = path.join(config.reportDir, ...testPath);
|
108
102
|
const imageNumber = (await getLastImageNumber(reportImageDir, imageName)) + 1;
|
109
103
|
const actualImageName = `${imageName}-actual-${imageNumber}.png`;
|
110
|
-
const image = images[imageName] =
|
104
|
+
const image = images[imageName] = images[imageName] ?? {
|
111
105
|
actual: actualImageName
|
112
106
|
};
|
113
107
|
|
@@ -169,12 +163,10 @@ export default async function worker(config, options) {
|
|
169
163
|
|
170
164
|
}
|
171
165
|
};
|
172
|
-
const mocha = new Mocha(mochaOptions);
|
173
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
174
|
-
|
166
|
+
const mocha = new Mocha(mochaOptions);
|
175
167
|
mocha.cleanReferencesAfterRun(false);
|
176
168
|
chai.use(chaiImage(getExpected, config.diffOptions));
|
177
|
-
if ((await getBrowser(config, options
|
169
|
+
if ((await getBrowser(config, options)) == null) return;
|
178
170
|
await addTestsFromStories(mocha.suite, config, {
|
179
171
|
browser: options.browser,
|
180
172
|
watch: options.ui,
|
@@ -185,12 +177,12 @@ export default async function worker(config, options) {
|
|
185
177
|
try {
|
186
178
|
var _await$getBrowser;
|
187
179
|
|
188
|
-
await ((_await$getBrowser = await getBrowser(config, options
|
180
|
+
await ((_await$getBrowser = await getBrowser(config, options)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
|
189
181
|
} catch (_) {
|
190
182
|
await closeBrowser();
|
191
183
|
}
|
192
184
|
|
193
|
-
const browser = await getBrowser(config, options
|
185
|
+
const browser = await getBrowser(config, options);
|
194
186
|
const sessionId = (_await$browser$getSes = await (browser === null || browser === void 0 ? void 0 : browser.getSession())) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
|
195
187
|
if (browser == null) return;
|
196
188
|
const interval = setInterval(() => void browser.getCurrentUrl().then(url => {
|
@@ -222,9 +214,7 @@ export default async function worker(config, options) {
|
|
222
214
|
if (!(reason instanceof Error)) {
|
223
215
|
error = reason;
|
224
216
|
} else if (!isImageError(reason)) {
|
225
|
-
|
226
|
-
|
227
|
-
error = (_reason$stack = reason.stack) !== null && _reason$stack !== void 0 ? _reason$stack : reason.message;
|
217
|
+
error = reason.stack ?? reason.message;
|
228
218
|
} else if (typeof reason.images == 'string') {
|
229
219
|
const image = images[testScope.slice(-1)[0]];
|
230
220
|
if (image) image.error = reason.images;
|