creevey 0.9.0-beta.2 → 0.9.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +1 -0
- package/CHANGELOG.md +51 -0
- package/README.md +9 -1
- package/addon/README.md +3 -0
- package/addon/package.json +5 -0
- package/docs/config.md +29 -26
- package/jest.config.js +6 -0
- package/lib/cjs/cli.js +1 -0
- package/lib/cjs/client/addon/Manager.js +170 -390
- package/lib/cjs/client/addon/components/Addon.js +17 -45
- package/lib/cjs/client/addon/components/Icons.js +12 -14
- package/lib/cjs/client/addon/components/Panel.js +21 -30
- package/lib/cjs/client/addon/components/TestSelect.js +20 -31
- package/lib/cjs/client/addon/components/Tools.js +35 -65
- package/lib/cjs/client/addon/decorator.js +1 -4
- package/lib/cjs/client/addon/index.js +27 -0
- package/lib/cjs/client/addon/preset.js +3 -76
- package/lib/cjs/client/addon/preview.js +11 -0
- package/lib/cjs/client/addon/readyForCapture.js +1 -4
- package/lib/cjs/client/addon/register.js +43 -82
- package/lib/cjs/client/addon/utils.js +4 -8
- package/lib/cjs/client/addon/withCreevey.js +145 -404
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +25 -35
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +29 -41
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +46 -83
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +39 -67
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -57
- package/lib/cjs/client/shared/components/ImagesView/index.js +9 -14
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +13 -16
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +16 -37
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +42 -34
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +40 -84
- package/lib/cjs/client/shared/components/ResultsPage.js +42 -99
- package/lib/cjs/client/shared/creeveyClientApi.js +56 -93
- package/lib/cjs/client/shared/helpers.js +149 -274
- package/lib/cjs/client/shared/viewMode.js +5 -9
- package/lib/cjs/client/web/192.js +1 -0
- package/lib/cjs/client/web/632.js +43 -0
- package/lib/cjs/client/web/794.js +1 -0
- package/lib/cjs/client/web/main.js +79 -38
- package/lib/cjs/client/web/main.js.LICENSE.txt +34 -0
- package/lib/cjs/creevey.js +15 -30
- package/lib/cjs/index.js +0 -15
- package/lib/cjs/server/config.js +16 -36
- package/lib/cjs/server/docker.js +8 -34
- package/lib/cjs/server/index.js +9 -34
- package/lib/cjs/server/logger.js +7 -20
- package/lib/cjs/server/master/api.js +1 -14
- package/lib/cjs/server/master/index.js +25 -49
- package/lib/cjs/server/master/master.js +6 -21
- package/lib/cjs/server/master/pool.js +10 -53
- package/lib/cjs/server/master/runner.js +65 -105
- package/lib/cjs/server/master/server.js +10 -29
- package/lib/cjs/server/messages.js +14 -62
- package/lib/cjs/server/selenium/browser.js +149 -185
- package/lib/cjs/server/selenium/index.js +0 -4
- package/lib/cjs/server/selenium/selenoid.js +18 -44
- package/lib/cjs/server/stories.js +35 -57
- package/lib/cjs/server/storybook/providers/browser.js +15 -29
- package/lib/cjs/server/storybook/providers/hybrid.js +16 -37
- package/lib/cjs/server/telemetry.js +167 -0
- package/lib/cjs/server/testsFiles/parser.js +3 -19
- package/lib/cjs/server/testsFiles/register.js +8 -14
- package/lib/cjs/server/update.js +4 -25
- package/lib/cjs/server/utils.js +35 -76
- package/lib/cjs/server/worker/chai-image.js +1 -27
- package/lib/cjs/server/worker/helpers.js +2 -12
- package/lib/cjs/server/worker/index.js +1 -3
- package/lib/cjs/server/worker/reporter.js +16 -43
- package/lib/cjs/server/worker/worker.js +32 -72
- package/lib/cjs/shared/index.js +87 -0
- package/lib/cjs/shared/serializeRegExp.js +34 -0
- package/lib/cjs/types.js +11 -20
- package/lib/esm/cli.js +1 -1
- package/lib/esm/client/addon/Manager.js +170 -381
- package/lib/esm/client/addon/components/Addon.js +15 -34
- package/lib/esm/client/addon/components/Icons.js +10 -6
- package/lib/esm/client/addon/components/Panel.js +20 -18
- package/lib/esm/client/addon/components/TestSelect.js +19 -23
- package/lib/esm/client/addon/components/Tools.js +33 -49
- package/lib/esm/client/addon/decorator.js +1 -1
- package/lib/esm/client/addon/index.js +2 -0
- package/lib/esm/client/addon/preset.js +2 -56
- package/lib/esm/client/addon/preview.js +5 -0
- package/lib/esm/client/addon/readyForCapture.js +1 -3
- package/lib/esm/client/addon/register.js +41 -67
- package/lib/esm/client/addon/utils.js +3 -7
- package/lib/esm/client/addon/withCreevey.js +142 -388
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +22 -18
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +27 -25
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +43 -63
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +23 -40
- package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
- package/lib/esm/client/shared/components/PageFooter/Paging.js +15 -29
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +40 -25
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +38 -66
- package/lib/esm/client/shared/components/ResultsPage.js +39 -75
- package/lib/esm/client/shared/creeveyClientApi.js +56 -90
- package/lib/esm/client/shared/helpers.js +133 -230
- package/lib/esm/client/shared/viewMode.js +4 -4
- package/lib/esm/client/web/192.js +1 -0
- package/lib/esm/client/web/632.js +43 -0
- package/lib/esm/client/web/794.js +1 -0
- package/lib/esm/client/web/index.html +19 -0
- package/lib/esm/client/web/main.js +79 -0
- package/lib/esm/client/web/main.js.LICENSE.txt +34 -0
- package/lib/esm/creevey.js +13 -16
- package/lib/esm/index.js +1 -4
- package/lib/esm/server/config.js +9 -16
- package/lib/esm/server/docker.js +6 -14
- package/lib/esm/server/index.js +8 -22
- package/lib/esm/server/logger.js +0 -1
- package/lib/esm/server/master/api.js +0 -9
- package/lib/esm/server/master/index.js +25 -35
- package/lib/esm/server/master/master.js +2 -7
- package/lib/esm/server/master/pool.js +8 -41
- package/lib/esm/server/master/runner.js +64 -90
- package/lib/esm/server/master/server.js +9 -11
- package/lib/esm/server/messages.js +8 -42
- package/lib/esm/server/selenium/browser.js +147 -163
- package/lib/esm/server/selenium/selenoid.js +16 -27
- package/lib/esm/server/stories.js +34 -46
- package/lib/esm/server/storybook/providers/browser.js +12 -17
- package/lib/esm/server/storybook/providers/hybrid.js +11 -22
- package/lib/esm/server/telemetry.js +160 -0
- package/lib/esm/server/testsFiles/parser.js +0 -6
- package/lib/esm/server/testsFiles/register.js +6 -7
- package/lib/esm/server/update.js +1 -13
- package/lib/esm/server/utils.js +20 -41
- package/lib/esm/server/worker/chai-image.js +0 -21
- package/lib/esm/server/worker/helpers.js +2 -9
- package/lib/esm/server/worker/reporter.js +15 -29
- package/lib/esm/server/worker/worker.js +31 -48
- package/lib/esm/shared/index.js +77 -0
- package/lib/esm/shared/serializeRegExp.js +24 -0
- package/lib/esm/types.js +5 -1
- package/lib/types/client/addon/Manager.d.ts +3 -3
- package/lib/types/client/addon/components/Addon.d.ts +1 -0
- package/lib/types/client/addon/components/Icons.d.ts +1 -0
- package/lib/types/client/addon/components/Panel.d.ts +1 -0
- package/lib/types/client/addon/components/Tools.d.ts +1 -0
- package/lib/types/client/addon/decorator.d.ts +1 -1
- package/lib/types/client/addon/index.d.ts +2 -0
- package/lib/types/client/addon/preset.d.ts +2 -24
- package/lib/types/client/addon/preview.d.ts +4 -0
- package/lib/types/client/addon/utils.d.ts +1 -0
- package/lib/types/client/addon/withCreevey.d.ts +4 -3
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -1
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +3 -1
- package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
- package/lib/types/client/web/CreeveyLoader.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +6 -3
- package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
- package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
- package/lib/types/client/web/KeyboardEventsContext.d.ts +4 -2
- package/lib/types/index.d.ts +4 -1
- package/lib/types/server/logger.d.ts +6 -2
- package/lib/types/server/messages.d.ts +14 -12
- package/lib/types/server/selenium/browser.d.ts +5 -3
- package/lib/types/server/storybook/providers/browser.d.ts +2 -4
- package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
- package/lib/types/server/telemetry.d.ts +2 -0
- package/lib/types/server/utils.d.ts +5 -1
- package/lib/types/shared/index.d.ts +7 -0
- package/lib/types/shared/serializeRegExp.d.ts +9 -0
- package/lib/types/types.d.ts +29 -36
- package/package.json +132 -133
- package/types/global.d.ts +5 -0
- package/lib/cjs/client/web/1.js +0 -13
- package/lib/cjs/client/web/2.js +0 -1
- package/lib/cjs/server/extract.js +0 -50
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -88
- package/lib/cjs/server/loaders/babel/helpers.js +0 -479
- package/lib/cjs/server/loaders/babel/register.js +0 -126
- package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
- package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
- package/lib/cjs/server/loaders/webpack/compile.js +0 -286
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -174
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -44
- package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
- package/lib/cjs/server/loaders/webpack/start.js +0 -41
- package/lib/cjs/server/storybook/entry.js +0 -68
- package/lib/cjs/server/storybook/helpers.js +0 -165
- package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
- package/lib/cjs/shared.js +0 -124
- package/lib/esm/server/extract.js +0 -34
- package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -74
- package/lib/esm/server/loaders/babel/helpers.js +0 -462
- package/lib/esm/server/loaders/babel/register.js +0 -105
- package/lib/esm/server/loaders/hooks/mdx.js +0 -15
- package/lib/esm/server/loaders/hooks/svelte.js +0 -49
- package/lib/esm/server/loaders/webpack/compile.js +0 -263
- package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -153
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -36
- package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
- package/lib/esm/server/loaders/webpack/start.js +0 -27
- package/lib/esm/server/storybook/entry.js +0 -44
- package/lib/esm/server/storybook/helpers.js +0 -106
- package/lib/esm/server/storybook/providers/nodejs.js +0 -217
- package/lib/esm/shared.js +0 -93
- package/lib/types/server/extract.d.ts +0 -2
- package/lib/types/server/loaders/babel/creevey-plugin.d.ts +0 -1
- package/lib/types/server/loaders/babel/helpers.d.ts +0 -19
- package/lib/types/server/loaders/babel/register.d.ts +0 -5
- package/lib/types/server/loaders/hooks/mdx.d.ts +0 -1
- package/lib/types/server/loaders/hooks/svelte.d.ts +0 -1
- package/lib/types/server/loaders/webpack/compile.d.ts +0 -2
- package/lib/types/server/loaders/webpack/creevey-loader.d.ts +0 -2
- package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +0 -10
- package/lib/types/server/loaders/webpack/mdx-loader.d.ts +0 -6
- package/lib/types/server/loaders/webpack/start.d.ts +0 -1
- package/lib/types/server/storybook/entry.d.ts +0 -18
- package/lib/types/server/storybook/helpers.d.ts +0 -24
- package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
- package/lib/types/shared.d.ts +0 -16
- package/preset.js +0 -9
- package/storybook-static/stories.json +0 -21
- package/types/mdx.d.ts +0 -6
@@ -4,46 +4,33 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = _default;
|
7
|
-
|
8
7
|
var _path = _interopRequireDefault(require("path"));
|
9
|
-
|
10
8
|
var _fs = require("fs");
|
11
|
-
|
12
9
|
var _util = require("util");
|
13
|
-
|
14
10
|
var _master = _interopRequireDefault(require("./master"));
|
15
|
-
|
16
11
|
var _api = _interopRequireDefault(require("./api"));
|
17
|
-
|
18
12
|
var _types = require("../../types");
|
19
|
-
|
20
13
|
var _utils = require("../utils");
|
21
|
-
|
22
14
|
var _messages = require("../messages");
|
23
|
-
|
24
15
|
var _logger = require("../logger");
|
25
|
-
|
26
|
-
function _interopRequireDefault(
|
27
|
-
|
16
|
+
var _telemetry = require("../telemetry");
|
17
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
18
|
+
const writeFileAsync = (0, _util.promisify)(_fs.writeFile);
|
28
19
|
const copyFileAsync = (0, _util.promisify)(_fs.copyFile);
|
29
20
|
const readdirAsync = (0, _util.promisify)(_fs.readdir);
|
30
21
|
const mkdirAsync = (0, _util.promisify)(_fs.mkdir);
|
31
|
-
|
32
22
|
async function copyStatics(reportDir) {
|
33
23
|
const clientDir = _path.default.join(__dirname, '../../client/web');
|
34
|
-
|
35
24
|
const files = (await readdirAsync(clientDir, {
|
36
25
|
withFileTypes: true
|
37
26
|
})).filter(dirent => dirent.isFile() && !dirent.name.endsWith('.d.ts') && !dirent.name.endsWith('.tsx')).map(dirent => dirent.name);
|
38
27
|
await mkdirAsync(reportDir, {
|
39
28
|
recursive: true
|
40
29
|
});
|
41
|
-
|
42
30
|
for (const file of files) {
|
43
31
|
await copyFileAsync(_path.default.join(clientDir, file), _path.default.join(reportDir, file));
|
44
32
|
}
|
45
33
|
}
|
46
|
-
|
47
34
|
function reportDataModule(data) {
|
48
35
|
return `
|
49
36
|
(function (root, factory) {
|
@@ -55,44 +42,34 @@ function reportDataModule(data) {
|
|
55
42
|
}(this, function () { return ${JSON.stringify(data)} }));
|
56
43
|
`;
|
57
44
|
}
|
58
|
-
|
59
45
|
function outputUnnecessaryImages(imagesDir, images) {
|
60
46
|
if (!(0, _fs.existsSync)(imagesDir)) return;
|
61
47
|
const unnecessaryImages = (0, _utils.readDirRecursive)(imagesDir).map(imagePath => _path.default.posix.relative(imagesDir, imagePath)).filter(imagePath => !images.has(imagePath));
|
62
|
-
|
63
48
|
if (unnecessaryImages.length > 0) {
|
64
49
|
_logger.logger.warn('We found unnecessary screenshot images, those can be safely removed:\n', unnecessaryImages.join('\n'));
|
65
50
|
}
|
66
51
|
}
|
67
|
-
|
68
52
|
async function _default(config, options, resolveApi) {
|
69
53
|
let runner = null;
|
70
|
-
|
71
54
|
if (config.hooks.before) {
|
72
55
|
await config.hooks.before();
|
73
56
|
}
|
74
|
-
|
75
57
|
(0, _messages.subscribeOn)('shutdown', () => {
|
76
58
|
var _config$hooks$after, _config$hooks;
|
77
|
-
|
78
59
|
return (_config$hooks$after = (_config$hooks = config.hooks).after) === null || _config$hooks$after === void 0 ? void 0 : _config$hooks$after.call(_config$hooks);
|
79
60
|
});
|
80
61
|
process.removeListener('SIGINT', _utils.shutdown);
|
81
62
|
process.on('SIGINT', () => {
|
82
63
|
var _runner, _runner2;
|
83
|
-
|
84
|
-
(_runner = runner) === null || _runner === void 0 ? void 0 : _runner.removeAllListeners('stop');
|
85
|
-
|
64
|
+
(_runner = runner) === null || _runner === void 0 || _runner.removeAllListeners('stop');
|
86
65
|
if ((_runner2 = runner) !== null && _runner2 !== void 0 && _runner2.isRunning) {
|
87
66
|
var _runner4;
|
88
|
-
|
89
67
|
// TODO Better handle stop
|
90
68
|
void Promise.race([new Promise(resolve => setTimeout(resolve, 10000)), new Promise(resolve => {
|
91
69
|
var _runner3;
|
92
|
-
|
93
70
|
return (_runner3 = runner) === null || _runner3 === void 0 ? void 0 : _runner3.once('stop', resolve);
|
94
71
|
})]).then(() => (0, _utils.shutdownWorkers)());
|
95
|
-
(_runner4 = runner) === null || _runner4 === void 0
|
72
|
+
(_runner4 = runner) === null || _runner4 === void 0 || _runner4.stop();
|
96
73
|
} else {
|
97
74
|
void (0, _utils.shutdownWorkers)();
|
98
75
|
}
|
@@ -102,45 +79,44 @@ async function _default(config, options, resolveApi) {
|
|
102
79
|
debug: options.debug,
|
103
80
|
port: options.port
|
104
81
|
});
|
105
|
-
|
106
82
|
if (options.saveReport) {
|
107
|
-
await copyStatics(config.reportDir);
|
108
83
|
runner.on('stop', () => {
|
109
|
-
|
110
|
-
|
111
|
-
|
84
|
+
void copyStatics(config.reportDir).then(() => {
|
85
|
+
var _runner5;
|
86
|
+
return writeFileAsync(_path.default.join(config.reportDir, 'data.js'), reportDataModule((_runner5 = runner) === null || _runner5 === void 0 ? void 0 : _runner5.status.tests));
|
87
|
+
});
|
112
88
|
});
|
113
89
|
}
|
114
|
-
|
115
90
|
if (options.ui) {
|
116
91
|
resolveApi((0, _api.default)(runner));
|
117
|
-
|
118
92
|
_logger.logger.info(`Started on http://localhost:${options.port}`);
|
119
93
|
} else {
|
120
94
|
if (Object.values(runner.status.tests).filter(test => test && !test.skip).length == 0) {
|
121
|
-
_logger.logger.warn("Don't have any tests to run");
|
122
|
-
|
123
|
-
|
95
|
+
_logger.logger.warn("Don't have any tests to run");
|
96
|
+
// eslint-disable-next-line no-process-exit
|
124
97
|
void (0, _utils.shutdownWorkers)().then(() => process.exit());
|
125
98
|
return;
|
126
99
|
}
|
127
|
-
|
128
100
|
runner.once('stop', () => {
|
129
|
-
var
|
130
|
-
|
131
|
-
const tests = Object.values((_runner$status$tests = (_runner6 = runner) === null || _runner6 === void 0 ? void 0 : _runner6.status.tests) !== null && _runner$status$tests !== void 0 ? _runner$status$tests : {});
|
101
|
+
var _runner6, _runner7;
|
102
|
+
const tests = Object.values(((_runner6 = runner) === null || _runner6 === void 0 ? void 0 : _runner6.status.tests) ?? {});
|
132
103
|
const isSuccess = tests.filter(_types.isDefined).filter(({
|
133
104
|
skip
|
134
105
|
}) => !skip).every(({
|
135
106
|
status
|
136
|
-
}) => status == 'success');
|
137
|
-
|
107
|
+
}) => status == 'success');
|
108
|
+
// TODO output summary
|
138
109
|
process.exitCode = isSuccess ? 0 : -1;
|
139
|
-
if (!config.failFast) outputUnnecessaryImages(config.screenDir, (0, _utils.testsToImages)(tests));
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
110
|
+
if (!config.failFast) outputUnnecessaryImages(config.screenDir, (0, _utils.testsToImages)(tests));
|
111
|
+
(0, _telemetry.sendScreenshotsCount)(config, options, (_runner7 = runner) === null || _runner7 === void 0 ? void 0 : _runner7.status).catch(reason => {
|
112
|
+
const error = reason instanceof Error ? reason.stack ?? reason.message : reason;
|
113
|
+
_logger.logger.warn(`Can't send telemetry: ${error}`);
|
114
|
+
}).finally(() => {
|
115
|
+
// eslint-disable-next-line no-process-exit
|
116
|
+
void (0, _utils.shutdownWorkers)().then(() => process.exit());
|
117
|
+
});
|
118
|
+
});
|
119
|
+
// TODO grep
|
144
120
|
runner.start(Object.keys(runner.status.tests));
|
145
121
|
}
|
146
122
|
}
|
@@ -4,23 +4,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = master;
|
7
|
-
|
8
7
|
var _path = _interopRequireDefault(require("path"));
|
9
|
-
|
10
8
|
var _types = require("../../types");
|
11
|
-
|
12
9
|
var _stories = require("../stories");
|
13
|
-
|
14
10
|
var _runner = _interopRequireDefault(require("./runner"));
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
19
|
-
|
20
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
21
|
-
|
22
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
23
|
-
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
24
14
|
function mergeTests(testsWithReports, testsFromStories) {
|
25
15
|
Object.values(testsFromStories).filter(_types.isDefined).forEach(test => {
|
26
16
|
const testWithReport = testsWithReports[test.id];
|
@@ -32,20 +22,15 @@ function mergeTests(testsWithReports, testsFromStories) {
|
|
32
22
|
});
|
33
23
|
return testsFromStories;
|
34
24
|
}
|
35
|
-
|
36
25
|
async function master(config, options) {
|
37
|
-
if (config.useWebpackToExtractTests) await (0, _start.startWebpackCompiler)();
|
38
26
|
const runner = new _runner.default(config);
|
39
|
-
|
40
27
|
const reportDataPath = _path.default.join(config.reportDir, 'data.js');
|
41
|
-
|
42
28
|
let testsFromReport = {};
|
43
|
-
|
44
29
|
try {
|
45
|
-
testsFromReport = await Promise
|
46
|
-
} catch (error) {
|
30
|
+
testsFromReport = await (specifier => new Promise(r => r(`${specifier}`)).then(s => _interopRequireWildcard(require(s))))(reportDataPath);
|
31
|
+
} catch (error) {
|
32
|
+
// Ignore error
|
47
33
|
}
|
48
|
-
|
49
34
|
await runner.init();
|
50
35
|
const tests = await (0, _stories.loadTestsFromStories)(Object.keys(config.browsers), listener => config.storiesProvider(config, options, listener), testsDiff => {
|
51
36
|
runner.updateTests(testsDiff);
|
@@ -4,58 +4,37 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
|
-
|
8
|
-
var _cluster = _interopRequireDefault(require("cluster"));
|
9
|
-
|
7
|
+
var _cluster = _interopRequireWildcard(require("cluster"));
|
10
8
|
var _events = require("events");
|
11
|
-
|
12
9
|
var _types = require("../../types");
|
13
|
-
|
14
10
|
var _messages = require("../messages");
|
15
|
-
|
16
11
|
var _utils = require("../utils");
|
17
|
-
|
18
|
-
function
|
19
|
-
|
20
|
-
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; }
|
21
|
-
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
22
14
|
const FORK_RETRIES = 5;
|
23
|
-
|
24
15
|
class Pool extends _events.EventEmitter {
|
16
|
+
workers = [];
|
17
|
+
queue = [];
|
18
|
+
forcedStop = false;
|
25
19
|
get isRunning() {
|
26
20
|
return this.workers.length !== this.freeWorkers.length;
|
27
21
|
}
|
28
|
-
|
29
22
|
constructor(config, browser) {
|
30
23
|
super();
|
31
24
|
this.browser = browser;
|
32
|
-
|
33
|
-
_defineProperty(this, "maxRetries", void 0);
|
34
|
-
|
35
|
-
_defineProperty(this, "config", void 0);
|
36
|
-
|
37
|
-
_defineProperty(this, "workers", []);
|
38
|
-
|
39
|
-
_defineProperty(this, "queue", []);
|
40
|
-
|
41
|
-
_defineProperty(this, "forcedStop", false);
|
42
|
-
|
43
|
-
_defineProperty(this, "failFast", void 0);
|
44
|
-
|
45
25
|
this.failFast = config.failFast;
|
46
26
|
this.maxRetries = config.maxRetries;
|
47
27
|
this.config = config.browsers[browser];
|
48
28
|
}
|
49
|
-
|
50
29
|
async init() {
|
51
30
|
const poolSize = this.config.limit || 1;
|
31
|
+
// TODO Init queue for workers to smooth browser starting load
|
52
32
|
this.workers = (await Promise.all(Array.from({
|
53
33
|
length: poolSize
|
54
|
-
}).map(() => this.forkWorker()))).filter(workerOrError => workerOrError instanceof _cluster.
|
34
|
+
}).map(() => this.forkWorker()))).filter(workerOrError => workerOrError instanceof _cluster.Worker);
|
55
35
|
if (this.workers.length != poolSize) throw new Error(`Can't instantiate workers for ${this.browser} due many errors`);
|
56
36
|
this.workers.forEach(worker => this.exitHandler(worker));
|
57
37
|
}
|
58
|
-
|
59
38
|
start(tests) {
|
60
39
|
if (this.isRunning) return false;
|
61
40
|
this.queue = tests.map(({
|
@@ -69,27 +48,22 @@ class Pool extends _events.EventEmitter {
|
|
69
48
|
this.process();
|
70
49
|
return true;
|
71
50
|
}
|
72
|
-
|
73
51
|
stop() {
|
74
52
|
if (!this.isRunning) {
|
75
53
|
this.emit('stop');
|
76
54
|
return;
|
77
55
|
}
|
78
|
-
|
79
56
|
this.forcedStop = true;
|
80
57
|
this.queue = [];
|
81
58
|
}
|
82
|
-
|
83
59
|
process() {
|
84
60
|
const worker = this.getFreeWorker();
|
85
61
|
const [test] = this.queue;
|
86
|
-
|
87
62
|
if (this.queue.length == 0 && this.workers.length === this.freeWorkers.length) {
|
88
63
|
this.forcedStop = false;
|
89
64
|
this.emit('stop');
|
90
65
|
return;
|
91
66
|
}
|
92
|
-
|
93
67
|
if (!worker || !test) return;
|
94
68
|
worker.isRunning = true;
|
95
69
|
const {
|
@@ -107,37 +81,29 @@ class Pool extends _events.EventEmitter {
|
|
107
81
|
});
|
108
82
|
this.process();
|
109
83
|
}
|
110
|
-
|
111
84
|
sendStatus(message) {
|
112
85
|
this.emit('test', message);
|
113
86
|
}
|
114
|
-
|
115
87
|
getFreeWorker() {
|
116
88
|
return this.freeWorkers[Math.floor(Math.random() * this.freeWorkers.length)];
|
117
89
|
}
|
118
|
-
|
119
90
|
get aliveWorkers() {
|
120
91
|
return this.workers.filter(worker => !worker.exitedAfterDisconnect);
|
121
92
|
}
|
122
|
-
|
123
93
|
get freeWorkers() {
|
124
94
|
return this.aliveWorkers.filter(worker => !worker.isRunning);
|
125
95
|
}
|
126
|
-
|
127
96
|
async forkWorker(retry = 0) {
|
128
|
-
_cluster.default.
|
97
|
+
_cluster.default.setupPrimary({
|
129
98
|
args: ['--browser', this.browser, ...process.argv.slice(2)]
|
130
99
|
});
|
131
|
-
|
132
100
|
const worker = _cluster.default.fork();
|
133
|
-
|
134
101
|
const message = await new Promise(resolve => {
|
135
102
|
const readyHandler = message => {
|
136
103
|
if (!(0, _types.isWorkerMessage)(message)) return;
|
137
104
|
worker.off('message', readyHandler);
|
138
105
|
resolve(message);
|
139
106
|
};
|
140
|
-
|
141
107
|
worker.on('message', readyHandler);
|
142
108
|
});
|
143
109
|
if (message.type != 'error') return worker;
|
@@ -145,37 +111,31 @@ class Pool extends _events.EventEmitter {
|
|
145
111
|
if (retry == FORK_RETRIES) return message.payload;
|
146
112
|
return this.forkWorker(retry + 1);
|
147
113
|
}
|
148
|
-
|
149
114
|
exitHandler(worker) {
|
150
115
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
151
116
|
worker.once('exit', async () => {
|
152
117
|
if (_utils.isShuttingDown.current) return;
|
153
118
|
const workerOrError = await this.forkWorker();
|
154
|
-
if (!(workerOrError instanceof _cluster.
|
119
|
+
if (!(workerOrError instanceof _cluster.Worker)) throw new Error(`Can't instantiate worker for ${this.browser} due many errors`);
|
155
120
|
this.exitHandler(workerOrError);
|
156
121
|
this.workers[this.workers.indexOf(worker)] = workerOrError;
|
157
122
|
this.process();
|
158
123
|
});
|
159
124
|
}
|
160
|
-
|
161
125
|
gracefullyKill(worker) {
|
162
126
|
const timeout = setTimeout(() => worker.kill(), 10000);
|
163
127
|
worker.on('exit', () => clearTimeout(timeout));
|
164
128
|
(0, _messages.sendShutdownMessage)(worker);
|
165
129
|
}
|
166
|
-
|
167
130
|
shouldRetry(test) {
|
168
131
|
return test.retries < this.maxRetries && !this.forcedStop;
|
169
132
|
}
|
170
|
-
|
171
133
|
handleTestResult(worker, test, result) {
|
172
134
|
const shouldRetry = result.status == 'failed' && this.shouldRetry(test);
|
173
|
-
|
174
135
|
if (shouldRetry) {
|
175
136
|
test.retries += 1;
|
176
137
|
this.queue[this.failFast ? 'unshift' : 'push'](test);
|
177
138
|
}
|
178
|
-
|
179
139
|
this.sendStatus({
|
180
140
|
id: test.id,
|
181
141
|
status: shouldRetry ? 'retrying' : result.status,
|
@@ -184,7 +144,6 @@ class Pool extends _events.EventEmitter {
|
|
184
144
|
worker.isRunning = false;
|
185
145
|
setImmediate(() => this.process());
|
186
146
|
}
|
187
|
-
|
188
147
|
subscribe(worker, test) {
|
189
148
|
const subscriptions = [(0, _messages.subscribeOnWorker)(worker, 'worker', message => {
|
190
149
|
if (message.type != 'error') return;
|
@@ -200,7 +159,5 @@ class Pool extends _events.EventEmitter {
|
|
200
159
|
this.handleTestResult(worker, test, message.payload);
|
201
160
|
})];
|
202
161
|
}
|
203
|
-
|
204
162
|
}
|
205
|
-
|
206
163
|
exports.default = Pool;
|