creevey 0.9.0-beta.0 → 0.9.0-beta.1

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.
Files changed (148) hide show
  1. package/lib/types/index.d.ts +4 -3
  2. package/lib/types/server/config.d.ts +1 -1
  3. package/lib/types/server/messages.d.ts +0 -1
  4. package/lib/types/server/{parser.d.ts → testsFiles/parser.d.ts} +1 -1
  5. package/lib/types/server/testsFiles/register.d.ts +2 -0
  6. package/lib/types/types.d.ts +3 -2
  7. package/package.json +5 -2
  8. package/lib/cjs/cli.js +0 -5
  9. package/lib/cjs/client/addon/Manager.js +0 -412
  10. package/lib/cjs/client/addon/components/Addon.js +0 -76
  11. package/lib/cjs/client/addon/components/Icons.js +0 -42
  12. package/lib/cjs/client/addon/components/Panel.js +0 -68
  13. package/lib/cjs/client/addon/components/TestSelect.js +0 -63
  14. package/lib/cjs/client/addon/components/Tools.js +0 -114
  15. package/lib/cjs/client/addon/decorator.js +0 -11
  16. package/lib/cjs/client/addon/preset.js +0 -81
  17. package/lib/cjs/client/addon/readyForCapture.js +0 -12
  18. package/lib/cjs/client/addon/register.js +0 -96
  19. package/lib/cjs/client/addon/utils.js +0 -38
  20. package/lib/cjs/client/addon/withCreevey.js +0 -556
  21. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +0 -85
  22. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +0 -88
  23. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +0 -176
  24. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +0 -179
  25. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +0 -110
  26. package/lib/cjs/client/shared/components/ImagesView/index.js +0 -45
  27. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +0 -46
  28. package/lib/cjs/client/shared/components/PageFooter/Paging.js +0 -98
  29. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +0 -78
  30. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +0 -144
  31. package/lib/cjs/client/shared/components/ResultsPage.js +0 -173
  32. package/lib/cjs/client/shared/creeveyClientApi.js +0 -103
  33. package/lib/cjs/client/shared/helpers.js +0 -482
  34. package/lib/cjs/client/shared/viewMode.js +0 -17
  35. package/lib/cjs/client/web/index.html +0 -19
  36. package/lib/cjs/creevey.js +0 -71
  37. package/lib/cjs/index.js +0 -62
  38. package/lib/cjs/server/config.js +0 -96
  39. package/lib/cjs/server/docker.js +0 -150
  40. package/lib/cjs/server/extract.js +0 -50
  41. package/lib/cjs/server/index.js +0 -83
  42. package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -88
  43. package/lib/cjs/server/loaders/babel/helpers.js +0 -479
  44. package/lib/cjs/server/loaders/babel/register.js +0 -126
  45. package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
  46. package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
  47. package/lib/cjs/server/loaders/webpack/compile.js +0 -286
  48. package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -174
  49. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -44
  50. package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
  51. package/lib/cjs/server/loaders/webpack/start.js +0 -41
  52. package/lib/cjs/server/logger.js +0 -47
  53. package/lib/cjs/server/master/api.js +0 -71
  54. package/lib/cjs/server/master/index.js +0 -146
  55. package/lib/cjs/server/master/master.js +0 -57
  56. package/lib/cjs/server/master/pool.js +0 -206
  57. package/lib/cjs/server/master/runner.js +0 -294
  58. package/lib/cjs/server/master/server.js +0 -129
  59. package/lib/cjs/server/messages.js +0 -266
  60. package/lib/cjs/server/parser.js +0 -85
  61. package/lib/cjs/server/selenium/browser.js +0 -680
  62. package/lib/cjs/server/selenium/index.js +0 -31
  63. package/lib/cjs/server/selenium/selenoid.js +0 -174
  64. package/lib/cjs/server/stories.js +0 -170
  65. package/lib/cjs/server/storybook/entry.js +0 -68
  66. package/lib/cjs/server/storybook/helpers.js +0 -165
  67. package/lib/cjs/server/storybook/providers/browser.js +0 -78
  68. package/lib/cjs/server/storybook/providers/hybrid.js +0 -79
  69. package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
  70. package/lib/cjs/server/update.js +0 -83
  71. package/lib/cjs/server/utils.js +0 -185
  72. package/lib/cjs/server/worker/chai-image.js +0 -142
  73. package/lib/cjs/server/worker/helpers.js +0 -69
  74. package/lib/cjs/server/worker/index.js +0 -15
  75. package/lib/cjs/server/worker/reporter.js +0 -120
  76. package/lib/cjs/server/worker/worker.js +0 -278
  77. package/lib/cjs/shared.js +0 -107
  78. package/lib/cjs/types.js +0 -74
  79. package/lib/esm/cli.js +0 -4
  80. package/lib/esm/client/addon/Manager.js +0 -396
  81. package/lib/esm/client/addon/components/Addon.js +0 -58
  82. package/lib/esm/client/addon/components/Icons.js +0 -27
  83. package/lib/esm/client/addon/components/Panel.js +0 -49
  84. package/lib/esm/client/addon/components/TestSelect.js +0 -49
  85. package/lib/esm/client/addon/components/Tools.js +0 -91
  86. package/lib/esm/client/addon/decorator.js +0 -2
  87. package/lib/esm/client/addon/preset.js +0 -56
  88. package/lib/esm/client/addon/readyForCapture.js +0 -5
  89. package/lib/esm/client/addon/register.js +0 -75
  90. package/lib/esm/client/addon/utils.js +0 -31
  91. package/lib/esm/client/addon/withCreevey.js +0 -532
  92. package/lib/esm/client/shared/components/ImagesView/BlendView.js +0 -63
  93. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +0 -65
  94. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +0 -151
  95. package/lib/esm/client/shared/components/ImagesView/SlideView.js +0 -154
  96. package/lib/esm/client/shared/components/ImagesView/SwapView.js +0 -88
  97. package/lib/esm/client/shared/components/ImagesView/index.js +0 -5
  98. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +0 -32
  99. package/lib/esm/client/shared/components/PageFooter/Paging.js +0 -84
  100. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +0 -64
  101. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +0 -120
  102. package/lib/esm/client/shared/components/ResultsPage.js +0 -143
  103. package/lib/esm/client/shared/creeveyClientApi.js +0 -94
  104. package/lib/esm/client/shared/helpers.js +0 -424
  105. package/lib/esm/client/shared/viewMode.js +0 -6
  106. package/lib/esm/creevey.js +0 -56
  107. package/lib/esm/index.js +0 -7
  108. package/lib/esm/server/config.js +0 -73
  109. package/lib/esm/server/docker.js +0 -123
  110. package/lib/esm/server/extract.js +0 -34
  111. package/lib/esm/server/index.js +0 -64
  112. package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -74
  113. package/lib/esm/server/loaders/babel/helpers.js +0 -462
  114. package/lib/esm/server/loaders/babel/register.js +0 -105
  115. package/lib/esm/server/loaders/hooks/mdx.js +0 -15
  116. package/lib/esm/server/loaders/hooks/svelte.js +0 -49
  117. package/lib/esm/server/loaders/webpack/compile.js +0 -263
  118. package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -153
  119. package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -36
  120. package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
  121. package/lib/esm/server/loaders/webpack/start.js +0 -27
  122. package/lib/esm/server/logger.js +0 -20
  123. package/lib/esm/server/master/api.js +0 -60
  124. package/lib/esm/server/master/index.js +0 -125
  125. package/lib/esm/server/master/master.js +0 -38
  126. package/lib/esm/server/master/pool.js +0 -187
  127. package/lib/esm/server/master/runner.js +0 -272
  128. package/lib/esm/server/master/server.js +0 -105
  129. package/lib/esm/server/messages.js +0 -234
  130. package/lib/esm/server/parser.js +0 -63
  131. package/lib/esm/server/selenium/browser.js +0 -647
  132. package/lib/esm/server/selenium/index.js +0 -2
  133. package/lib/esm/server/selenium/selenoid.js +0 -151
  134. package/lib/esm/server/stories.js +0 -151
  135. package/lib/esm/server/storybook/entry.js +0 -44
  136. package/lib/esm/server/storybook/helpers.js +0 -106
  137. package/lib/esm/server/storybook/providers/browser.js +0 -61
  138. package/lib/esm/server/storybook/providers/hybrid.js +0 -63
  139. package/lib/esm/server/storybook/providers/nodejs.js +0 -217
  140. package/lib/esm/server/update.js +0 -65
  141. package/lib/esm/server/utils.js +0 -146
  142. package/lib/esm/server/worker/chai-image.js +0 -130
  143. package/lib/esm/server/worker/helpers.js +0 -60
  144. package/lib/esm/server/worker/index.js +0 -1
  145. package/lib/esm/server/worker/reporter.js +0 -98
  146. package/lib/esm/server/worker/worker.js +0 -248
  147. package/lib/esm/shared.js +0 -76
  148. package/lib/esm/types.js +0 -43
@@ -1,47 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "getLogger", {
7
- enumerable: true,
8
- get: function () {
9
- return _loglevel.getLogger;
10
- }
11
- });
12
- exports.logger = exports.colors = void 0;
13
-
14
- var _chalk = _interopRequireDefault(require("chalk"));
15
-
16
- var _loglevel = _interopRequireWildcard(require("loglevel"));
17
-
18
- var _loglevelPluginPrefix = _interopRequireDefault(require("loglevel-plugin-prefix"));
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
-
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
- const colors = {
27
- TRACE: _chalk.default.magenta,
28
- DEBUG: _chalk.default.cyan,
29
- INFO: _chalk.default.blue,
30
- WARN: _chalk.default.yellow,
31
- ERROR: _chalk.default.red
32
- };
33
- exports.colors = colors;
34
-
35
- _loglevelPluginPrefix.default.reg(_loglevel.default);
36
-
37
- _loglevelPluginPrefix.default.apply(_loglevel.default, {
38
- format(level, name = 'Creevey') {
39
- const levelColor = colors[level.toUpperCase()];
40
- return `[${name}:${_chalk.default.gray(process.pid)}] ${levelColor(level)} =>`;
41
- }
42
-
43
- });
44
-
45
- const logger = _loglevel.default.getLogger('Creevey');
46
-
47
- exports.logger = logger;
@@ -1,71 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = creeveyApi;
7
-
8
- var _ws = _interopRequireDefault(require("ws"));
9
-
10
- var _logger = require("../logger");
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- function broadcast(wss, message) {
15
- wss.clients.forEach(ws => {
16
- if (ws.readyState === _ws.default.OPEN) {
17
- ws.send(JSON.stringify(message));
18
- }
19
- });
20
- }
21
-
22
- function creeveyApi(runner) {
23
- return {
24
- subscribe(wss) {
25
- runner.on('update', payload => broadcast(wss, {
26
- type: 'update',
27
- payload
28
- }));
29
- },
30
-
31
- handleMessage(ws, message) {
32
- if (typeof message != 'string') {
33
- _logger.logger.info('unhandled message', message);
34
-
35
- return;
36
- }
37
-
38
- const command = JSON.parse(message);
39
-
40
- switch (command.type) {
41
- case 'status':
42
- {
43
- ws.send(JSON.stringify({
44
- type: 'status',
45
- payload: runner.status
46
- }));
47
- return;
48
- }
49
-
50
- case 'start':
51
- {
52
- runner.start(command.payload);
53
- return;
54
- }
55
-
56
- case 'stop':
57
- {
58
- runner.stop();
59
- return;
60
- }
61
-
62
- case 'approve':
63
- {
64
- void runner.approve(command.payload);
65
- return;
66
- }
67
- }
68
- }
69
-
70
- };
71
- }
@@ -1,146 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
-
8
- var _path = _interopRequireDefault(require("path"));
9
-
10
- var _fs = require("fs");
11
-
12
- var _util = require("util");
13
-
14
- var _master = _interopRequireDefault(require("./master"));
15
-
16
- var _api = _interopRequireDefault(require("./api"));
17
-
18
- var _types = require("../../types");
19
-
20
- var _utils = require("../utils");
21
-
22
- var _messages = require("../messages");
23
-
24
- var _logger = require("../logger");
25
-
26
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
-
28
- const copyFileAsync = (0, _util.promisify)(_fs.copyFile);
29
- const readdirAsync = (0, _util.promisify)(_fs.readdir);
30
- const mkdirAsync = (0, _util.promisify)(_fs.mkdir);
31
-
32
- async function copyStatics(reportDir) {
33
- const clientDir = _path.default.join(__dirname, '../../client/web');
34
-
35
- const files = (await readdirAsync(clientDir, {
36
- withFileTypes: true
37
- })).filter(dirent => dirent.isFile() && !dirent.name.endsWith('.d.ts') && !dirent.name.endsWith('.tsx')).map(dirent => dirent.name);
38
- await mkdirAsync(reportDir, {
39
- recursive: true
40
- });
41
-
42
- for (const file of files) {
43
- await copyFileAsync(_path.default.join(clientDir, file), _path.default.join(reportDir, file));
44
- }
45
- }
46
-
47
- function reportDataModule(data) {
48
- return `
49
- (function (root, factory) {
50
- if (typeof module === 'object' && module.exports) {
51
- module.exports = factory();
52
- } else {
53
- root.__CREEVEY_DATA__ = factory();
54
- }
55
- }(this, function () { return ${JSON.stringify(data)} }));
56
- `;
57
- }
58
-
59
- function outputUnnecessaryImages(imagesDir, images) {
60
- if (!(0, _fs.existsSync)(imagesDir)) return;
61
- const unnecessaryImages = (0, _utils.readDirRecursive)(imagesDir).map(imagePath => _path.default.posix.relative(imagesDir, imagePath)).filter(imagePath => !images.has(imagePath));
62
-
63
- if (unnecessaryImages.length > 0) {
64
- _logger.logger.warn('We found unnecessary screenshot images, those can be safely removed:\n', unnecessaryImages.join('\n'));
65
- }
66
- }
67
-
68
- async function _default(config, options, resolveApi) {
69
- let runner = null;
70
-
71
- if (config.hooks.before) {
72
- await config.hooks.before();
73
- }
74
-
75
- (0, _messages.subscribeOn)('shutdown', () => {
76
- var _config$hooks$after, _config$hooks;
77
-
78
- return (_config$hooks$after = (_config$hooks = config.hooks).after) === null || _config$hooks$after === void 0 ? void 0 : _config$hooks$after.call(_config$hooks);
79
- });
80
- process.removeListener('SIGINT', _utils.shutdown);
81
- process.on('SIGINT', () => {
82
- var _runner, _runner2;
83
-
84
- (_runner = runner) === null || _runner === void 0 ? void 0 : _runner.removeAllListeners('stop');
85
-
86
- if ((_runner2 = runner) !== null && _runner2 !== void 0 && _runner2.isRunning) {
87
- var _runner4;
88
-
89
- // TODO Better handle stop
90
- void Promise.race([new Promise(resolve => setTimeout(resolve, 10000)), new Promise(resolve => {
91
- var _runner3;
92
-
93
- return (_runner3 = runner) === null || _runner3 === void 0 ? void 0 : _runner3.once('stop', resolve);
94
- })]).then(() => (0, _utils.shutdownWorkers)());
95
- (_runner4 = runner) === null || _runner4 === void 0 ? void 0 : _runner4.stop();
96
- } else {
97
- void (0, _utils.shutdownWorkers)();
98
- }
99
- });
100
- runner = await (0, _master.default)(config, {
101
- watch: options.ui,
102
- debug: options.debug,
103
- port: options.port
104
- });
105
-
106
- if (options.saveReport) {
107
- await copyStatics(config.reportDir);
108
- runner.on('stop', () => {
109
- var _runner5;
110
-
111
- return (0, _fs.writeFileSync)(_path.default.join(config.reportDir, 'data.js'), reportDataModule((_runner5 = runner) === null || _runner5 === void 0 ? void 0 : _runner5.status.tests));
112
- });
113
- }
114
-
115
- if (options.ui) {
116
- resolveApi((0, _api.default)(runner));
117
-
118
- _logger.logger.info(`Started on http://localhost:${options.port}`);
119
- } else {
120
- if (Object.values(runner.status.tests).filter(test => test && !test.skip).length == 0) {
121
- _logger.logger.warn("Don't have any tests to run"); // eslint-disable-next-line no-process-exit
122
-
123
-
124
- void (0, _utils.shutdownWorkers)().then(() => process.exit());
125
- return;
126
- }
127
-
128
- runner.once('stop', () => {
129
- var _runner$status$tests, _runner6;
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 : {});
132
- const isSuccess = tests.filter(_types.isDefined).filter(({
133
- skip
134
- }) => !skip).every(({
135
- status
136
- }) => status == 'success'); // TODO output summary
137
-
138
- process.exitCode = isSuccess ? 0 : -1;
139
- if (!config.failFast) outputUnnecessaryImages(config.screenDir, (0, _utils.testsToImages)(tests)); // eslint-disable-next-line no-process-exit
140
-
141
- void (0, _utils.shutdownWorkers)().then(() => process.exit());
142
- }); // TODO grep
143
-
144
- runner.start(Object.keys(runner.status.tests));
145
- }
146
- }
@@ -1,57 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = master;
7
-
8
- var _path = _interopRequireDefault(require("path"));
9
-
10
- var _types = require("../../types");
11
-
12
- var _stories = require("../stories");
13
-
14
- var _runner = _interopRequireDefault(require("./runner"));
15
-
16
- var _start = require("../loaders/webpack/start");
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
-
24
- function mergeTests(testsWithReports, testsFromStories) {
25
- Object.values(testsFromStories).filter(_types.isDefined).forEach(test => {
26
- const testWithReport = testsWithReports[test.id];
27
- if (!testWithReport) return;
28
- test.retries = testWithReport.retries;
29
- if (testWithReport.status == 'success' || testWithReport.status == 'failed') test.status = testWithReport.status;
30
- test.results = testWithReport.results;
31
- test.approved = testWithReport.approved;
32
- });
33
- return testsFromStories;
34
- }
35
-
36
- async function master(config, options) {
37
- if (config.useWebpackToExtractTests) await (0, _start.startWebpackCompiler)();
38
- const runner = new _runner.default(config);
39
-
40
- const reportDataPath = _path.default.join(config.reportDir, 'data.js');
41
-
42
- let testsFromReport = {};
43
-
44
- try {
45
- testsFromReport = await Promise.resolve(`${reportDataPath}`).then(s => _interopRequireWildcard(require(s)));
46
- } catch (error) {// Ignore error
47
- }
48
-
49
- await runner.init();
50
- const tests = await (0, _stories.loadTestsFromStories)(Object.keys(config.browsers), listener => config.storiesProvider(config, options, listener), testsDiff => {
51
- runner.updateTests(testsDiff);
52
- (0, _stories.saveTestsJson)(runner.tests, config.reportDir);
53
- });
54
- runner.tests = mergeTests(testsFromReport, tests);
55
- (0, _stories.saveTestsJson)(runner.tests, config.reportDir);
56
- return runner;
57
- }
@@ -1,206 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _cluster = _interopRequireDefault(require("cluster"));
9
-
10
- var _events = require("events");
11
-
12
- var _types = require("../../types");
13
-
14
- var _messages = require("../messages");
15
-
16
- var _utils = require("../utils");
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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
-
22
- const FORK_RETRIES = 5;
23
-
24
- class Pool extends _events.EventEmitter {
25
- get isRunning() {
26
- return this.workers.length !== this.freeWorkers.length;
27
- }
28
-
29
- constructor(config, browser) {
30
- super();
31
- 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
- this.failFast = config.failFast;
46
- this.maxRetries = config.maxRetries;
47
- this.config = config.browsers[browser];
48
- }
49
-
50
- async init() {
51
- const poolSize = this.config.limit || 1;
52
- this.workers = (await Promise.all(Array.from({
53
- length: poolSize
54
- }).map(() => this.forkWorker()))).filter(workerOrError => workerOrError instanceof _cluster.default.Worker);
55
- if (this.workers.length != poolSize) throw new Error(`Can't instantiate workers for ${this.browser} due many errors`);
56
- this.workers.forEach(worker => this.exitHandler(worker));
57
- }
58
-
59
- start(tests) {
60
- if (this.isRunning) return false;
61
- this.queue = tests.map(({
62
- id,
63
- path
64
- }) => ({
65
- id,
66
- path,
67
- retries: 0
68
- }));
69
- this.process();
70
- return true;
71
- }
72
-
73
- stop() {
74
- if (!this.isRunning) {
75
- this.emit('stop');
76
- return;
77
- }
78
-
79
- this.forcedStop = true;
80
- this.queue = [];
81
- }
82
-
83
- process() {
84
- const worker = this.getFreeWorker();
85
- const [test] = this.queue;
86
-
87
- if (this.queue.length == 0 && this.workers.length === this.freeWorkers.length) {
88
- this.forcedStop = false;
89
- this.emit('stop');
90
- return;
91
- }
92
-
93
- if (!worker || !test) return;
94
- worker.isRunning = true;
95
- const {
96
- id
97
- } = test;
98
- this.queue.shift();
99
- this.sendStatus({
100
- id,
101
- status: 'running'
102
- });
103
- this.subscribe(worker, test);
104
- (0, _messages.sendTestMessage)(worker, {
105
- type: 'start',
106
- payload: test
107
- });
108
- this.process();
109
- }
110
-
111
- sendStatus(message) {
112
- this.emit('test', message);
113
- }
114
-
115
- getFreeWorker() {
116
- return this.freeWorkers[Math.floor(Math.random() * this.freeWorkers.length)];
117
- }
118
-
119
- get aliveWorkers() {
120
- return this.workers.filter(worker => !worker.exitedAfterDisconnect);
121
- }
122
-
123
- get freeWorkers() {
124
- return this.aliveWorkers.filter(worker => !worker.isRunning);
125
- }
126
-
127
- async forkWorker(retry = 0) {
128
- _cluster.default.setupMaster({
129
- args: ['--browser', this.browser, ...process.argv.slice(2)]
130
- });
131
-
132
- const worker = _cluster.default.fork();
133
-
134
- const message = await new Promise(resolve => {
135
- const readyHandler = message => {
136
- if (!(0, _types.isWorkerMessage)(message)) return;
137
- worker.off('message', readyHandler);
138
- resolve(message);
139
- };
140
-
141
- worker.on('message', readyHandler);
142
- });
143
- if (message.type != 'error') return worker;
144
- this.gracefullyKill(worker);
145
- if (retry == FORK_RETRIES) return message.payload;
146
- return this.forkWorker(retry + 1);
147
- }
148
-
149
- exitHandler(worker) {
150
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
151
- worker.once('exit', async () => {
152
- if (_utils.isShuttingDown.current) return;
153
- const workerOrError = await this.forkWorker();
154
- if (!(workerOrError instanceof _cluster.default.Worker)) throw new Error(`Can't instantiate worker for ${this.browser} due many errors`);
155
- this.exitHandler(workerOrError);
156
- this.workers[this.workers.indexOf(worker)] = workerOrError;
157
- this.process();
158
- });
159
- }
160
-
161
- gracefullyKill(worker) {
162
- const timeout = setTimeout(() => worker.kill(), 10000);
163
- worker.on('exit', () => clearTimeout(timeout));
164
- (0, _messages.sendShutdownMessage)(worker);
165
- }
166
-
167
- shouldRetry(test) {
168
- return test.retries < this.maxRetries && !this.forcedStop;
169
- }
170
-
171
- handleTestResult(worker, test, result) {
172
- const shouldRetry = result.status == 'failed' && this.shouldRetry(test);
173
-
174
- if (shouldRetry) {
175
- test.retries += 1;
176
- this.queue[this.failFast ? 'unshift' : 'push'](test);
177
- }
178
-
179
- this.sendStatus({
180
- id: test.id,
181
- status: shouldRetry ? 'retrying' : result.status,
182
- result
183
- });
184
- worker.isRunning = false;
185
- setImmediate(() => this.process());
186
- }
187
-
188
- subscribe(worker, test) {
189
- const subscriptions = [(0, _messages.subscribeOnWorker)(worker, 'worker', message => {
190
- if (message.type != 'error') return;
191
- subscriptions.forEach(unsubscribe => unsubscribe());
192
- this.gracefullyKill(worker);
193
- this.handleTestResult(worker, test, {
194
- status: 'failed',
195
- ...message.payload
196
- });
197
- }), (0, _messages.subscribeOnWorker)(worker, 'test', message => {
198
- if (message.type != 'end') return;
199
- subscriptions.forEach(unsubscribe => unsubscribe());
200
- this.handleTestResult(worker, test, message.payload);
201
- })];
202
- }
203
-
204
- }
205
-
206
- exports.default = Pool;