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