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.
Files changed (226) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/.yarnrc.yml +1 -0
  3. package/CHANGELOG.md +51 -0
  4. package/README.md +9 -1
  5. package/addon/README.md +3 -0
  6. package/addon/package.json +5 -0
  7. package/docs/config.md +29 -26
  8. package/jest.config.js +6 -0
  9. package/lib/cjs/cli.js +1 -0
  10. package/lib/cjs/client/addon/Manager.js +170 -390
  11. package/lib/cjs/client/addon/components/Addon.js +17 -45
  12. package/lib/cjs/client/addon/components/Icons.js +12 -14
  13. package/lib/cjs/client/addon/components/Panel.js +21 -30
  14. package/lib/cjs/client/addon/components/TestSelect.js +20 -31
  15. package/lib/cjs/client/addon/components/Tools.js +35 -65
  16. package/lib/cjs/client/addon/decorator.js +1 -4
  17. package/lib/cjs/client/addon/index.js +27 -0
  18. package/lib/cjs/client/addon/preset.js +3 -76
  19. package/lib/cjs/client/addon/preview.js +11 -0
  20. package/lib/cjs/client/addon/readyForCapture.js +1 -4
  21. package/lib/cjs/client/addon/register.js +43 -82
  22. package/lib/cjs/client/addon/utils.js +4 -8
  23. package/lib/cjs/client/addon/withCreevey.js +145 -404
  24. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +25 -35
  25. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +29 -41
  26. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +46 -83
  27. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +39 -67
  28. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -57
  29. package/lib/cjs/client/shared/components/ImagesView/index.js +9 -14
  30. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +13 -16
  31. package/lib/cjs/client/shared/components/PageFooter/Paging.js +16 -37
  32. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +42 -34
  33. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +40 -84
  34. package/lib/cjs/client/shared/components/ResultsPage.js +42 -99
  35. package/lib/cjs/client/shared/creeveyClientApi.js +56 -93
  36. package/lib/cjs/client/shared/helpers.js +149 -274
  37. package/lib/cjs/client/shared/viewMode.js +5 -9
  38. package/lib/cjs/client/web/192.js +1 -0
  39. package/lib/cjs/client/web/632.js +43 -0
  40. package/lib/cjs/client/web/794.js +1 -0
  41. package/lib/cjs/client/web/main.js +79 -38
  42. package/lib/cjs/client/web/main.js.LICENSE.txt +34 -0
  43. package/lib/cjs/creevey.js +15 -30
  44. package/lib/cjs/index.js +0 -15
  45. package/lib/cjs/server/config.js +16 -36
  46. package/lib/cjs/server/docker.js +8 -34
  47. package/lib/cjs/server/index.js +9 -34
  48. package/lib/cjs/server/logger.js +7 -20
  49. package/lib/cjs/server/master/api.js +1 -14
  50. package/lib/cjs/server/master/index.js +25 -49
  51. package/lib/cjs/server/master/master.js +6 -21
  52. package/lib/cjs/server/master/pool.js +10 -53
  53. package/lib/cjs/server/master/runner.js +65 -105
  54. package/lib/cjs/server/master/server.js +10 -29
  55. package/lib/cjs/server/messages.js +14 -62
  56. package/lib/cjs/server/selenium/browser.js +149 -185
  57. package/lib/cjs/server/selenium/index.js +0 -4
  58. package/lib/cjs/server/selenium/selenoid.js +18 -44
  59. package/lib/cjs/server/stories.js +35 -57
  60. package/lib/cjs/server/storybook/providers/browser.js +15 -29
  61. package/lib/cjs/server/storybook/providers/hybrid.js +16 -37
  62. package/lib/cjs/server/telemetry.js +167 -0
  63. package/lib/cjs/server/testsFiles/parser.js +3 -19
  64. package/lib/cjs/server/testsFiles/register.js +8 -14
  65. package/lib/cjs/server/update.js +4 -25
  66. package/lib/cjs/server/utils.js +35 -76
  67. package/lib/cjs/server/worker/chai-image.js +1 -27
  68. package/lib/cjs/server/worker/helpers.js +2 -12
  69. package/lib/cjs/server/worker/index.js +1 -3
  70. package/lib/cjs/server/worker/reporter.js +16 -43
  71. package/lib/cjs/server/worker/worker.js +32 -72
  72. package/lib/cjs/shared/index.js +87 -0
  73. package/lib/cjs/shared/serializeRegExp.js +34 -0
  74. package/lib/cjs/types.js +11 -20
  75. package/lib/esm/cli.js +1 -1
  76. package/lib/esm/client/addon/Manager.js +170 -381
  77. package/lib/esm/client/addon/components/Addon.js +15 -34
  78. package/lib/esm/client/addon/components/Icons.js +10 -6
  79. package/lib/esm/client/addon/components/Panel.js +20 -18
  80. package/lib/esm/client/addon/components/TestSelect.js +19 -23
  81. package/lib/esm/client/addon/components/Tools.js +33 -49
  82. package/lib/esm/client/addon/decorator.js +1 -1
  83. package/lib/esm/client/addon/index.js +2 -0
  84. package/lib/esm/client/addon/preset.js +2 -56
  85. package/lib/esm/client/addon/preview.js +5 -0
  86. package/lib/esm/client/addon/readyForCapture.js +1 -3
  87. package/lib/esm/client/addon/register.js +41 -67
  88. package/lib/esm/client/addon/utils.js +3 -7
  89. package/lib/esm/client/addon/withCreevey.js +142 -388
  90. package/lib/esm/client/shared/components/ImagesView/BlendView.js +22 -18
  91. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +27 -25
  92. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +43 -63
  93. package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
  94. package/lib/esm/client/shared/components/ImagesView/SwapView.js +23 -40
  95. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
  96. package/lib/esm/client/shared/components/PageFooter/Paging.js +15 -29
  97. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +40 -25
  98. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +38 -66
  99. package/lib/esm/client/shared/components/ResultsPage.js +39 -75
  100. package/lib/esm/client/shared/creeveyClientApi.js +56 -90
  101. package/lib/esm/client/shared/helpers.js +133 -230
  102. package/lib/esm/client/shared/viewMode.js +4 -4
  103. package/lib/esm/client/web/192.js +1 -0
  104. package/lib/esm/client/web/632.js +43 -0
  105. package/lib/esm/client/web/794.js +1 -0
  106. package/lib/esm/client/web/index.html +19 -0
  107. package/lib/esm/client/web/main.js +79 -0
  108. package/lib/esm/client/web/main.js.LICENSE.txt +34 -0
  109. package/lib/esm/creevey.js +13 -16
  110. package/lib/esm/index.js +1 -4
  111. package/lib/esm/server/config.js +9 -16
  112. package/lib/esm/server/docker.js +6 -14
  113. package/lib/esm/server/index.js +8 -22
  114. package/lib/esm/server/logger.js +0 -1
  115. package/lib/esm/server/master/api.js +0 -9
  116. package/lib/esm/server/master/index.js +25 -35
  117. package/lib/esm/server/master/master.js +2 -7
  118. package/lib/esm/server/master/pool.js +8 -41
  119. package/lib/esm/server/master/runner.js +64 -90
  120. package/lib/esm/server/master/server.js +9 -11
  121. package/lib/esm/server/messages.js +8 -42
  122. package/lib/esm/server/selenium/browser.js +147 -163
  123. package/lib/esm/server/selenium/selenoid.js +16 -27
  124. package/lib/esm/server/stories.js +34 -46
  125. package/lib/esm/server/storybook/providers/browser.js +12 -17
  126. package/lib/esm/server/storybook/providers/hybrid.js +11 -22
  127. package/lib/esm/server/telemetry.js +160 -0
  128. package/lib/esm/server/testsFiles/parser.js +0 -6
  129. package/lib/esm/server/testsFiles/register.js +6 -7
  130. package/lib/esm/server/update.js +1 -13
  131. package/lib/esm/server/utils.js +20 -41
  132. package/lib/esm/server/worker/chai-image.js +0 -21
  133. package/lib/esm/server/worker/helpers.js +2 -9
  134. package/lib/esm/server/worker/reporter.js +15 -29
  135. package/lib/esm/server/worker/worker.js +31 -48
  136. package/lib/esm/shared/index.js +77 -0
  137. package/lib/esm/shared/serializeRegExp.js +24 -0
  138. package/lib/esm/types.js +5 -1
  139. package/lib/types/client/addon/Manager.d.ts +3 -3
  140. package/lib/types/client/addon/components/Addon.d.ts +1 -0
  141. package/lib/types/client/addon/components/Icons.d.ts +1 -0
  142. package/lib/types/client/addon/components/Panel.d.ts +1 -0
  143. package/lib/types/client/addon/components/Tools.d.ts +1 -0
  144. package/lib/types/client/addon/decorator.d.ts +1 -1
  145. package/lib/types/client/addon/index.d.ts +2 -0
  146. package/lib/types/client/addon/preset.d.ts +2 -24
  147. package/lib/types/client/addon/preview.d.ts +4 -0
  148. package/lib/types/client/addon/utils.d.ts +1 -0
  149. package/lib/types/client/addon/withCreevey.d.ts +4 -3
  150. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
  151. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -1
  152. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -1
  153. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -1
  154. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +3 -1
  155. package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
  156. package/lib/types/client/web/CreeveyLoader.d.ts +1 -1
  157. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +6 -3
  158. package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
  159. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
  160. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +3 -1
  161. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +3 -1
  162. package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
  163. package/lib/types/client/web/KeyboardEventsContext.d.ts +4 -2
  164. package/lib/types/index.d.ts +4 -1
  165. package/lib/types/server/logger.d.ts +6 -2
  166. package/lib/types/server/messages.d.ts +14 -12
  167. package/lib/types/server/selenium/browser.d.ts +5 -3
  168. package/lib/types/server/storybook/providers/browser.d.ts +2 -4
  169. package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
  170. package/lib/types/server/telemetry.d.ts +2 -0
  171. package/lib/types/server/utils.d.ts +5 -1
  172. package/lib/types/shared/index.d.ts +7 -0
  173. package/lib/types/shared/serializeRegExp.d.ts +9 -0
  174. package/lib/types/types.d.ts +29 -36
  175. package/package.json +132 -133
  176. package/types/global.d.ts +5 -0
  177. package/lib/cjs/client/web/1.js +0 -13
  178. package/lib/cjs/client/web/2.js +0 -1
  179. package/lib/cjs/server/extract.js +0 -50
  180. package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -88
  181. package/lib/cjs/server/loaders/babel/helpers.js +0 -479
  182. package/lib/cjs/server/loaders/babel/register.js +0 -126
  183. package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
  184. package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
  185. package/lib/cjs/server/loaders/webpack/compile.js +0 -286
  186. package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -174
  187. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -44
  188. package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
  189. package/lib/cjs/server/loaders/webpack/start.js +0 -41
  190. package/lib/cjs/server/storybook/entry.js +0 -68
  191. package/lib/cjs/server/storybook/helpers.js +0 -165
  192. package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
  193. package/lib/cjs/shared.js +0 -124
  194. package/lib/esm/server/extract.js +0 -34
  195. package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -74
  196. package/lib/esm/server/loaders/babel/helpers.js +0 -462
  197. package/lib/esm/server/loaders/babel/register.js +0 -105
  198. package/lib/esm/server/loaders/hooks/mdx.js +0 -15
  199. package/lib/esm/server/loaders/hooks/svelte.js +0 -49
  200. package/lib/esm/server/loaders/webpack/compile.js +0 -263
  201. package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -153
  202. package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -36
  203. package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
  204. package/lib/esm/server/loaders/webpack/start.js +0 -27
  205. package/lib/esm/server/storybook/entry.js +0 -44
  206. package/lib/esm/server/storybook/helpers.js +0 -106
  207. package/lib/esm/server/storybook/providers/nodejs.js +0 -217
  208. package/lib/esm/shared.js +0 -93
  209. package/lib/types/server/extract.d.ts +0 -2
  210. package/lib/types/server/loaders/babel/creevey-plugin.d.ts +0 -1
  211. package/lib/types/server/loaders/babel/helpers.d.ts +0 -19
  212. package/lib/types/server/loaders/babel/register.d.ts +0 -5
  213. package/lib/types/server/loaders/hooks/mdx.d.ts +0 -1
  214. package/lib/types/server/loaders/hooks/svelte.d.ts +0 -1
  215. package/lib/types/server/loaders/webpack/compile.d.ts +0 -2
  216. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +0 -2
  217. package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +0 -10
  218. package/lib/types/server/loaders/webpack/mdx-loader.d.ts +0 -6
  219. package/lib/types/server/loaders/webpack/start.d.ts +0 -1
  220. package/lib/types/server/storybook/entry.d.ts +0 -18
  221. package/lib/types/server/storybook/helpers.d.ts +0 -24
  222. package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
  223. package/lib/types/shared.d.ts +0 -16
  224. package/preset.js +0 -9
  225. package/storybook-static/stories.json +0 -21
  226. 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(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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 ? void 0 : _runner4.stop();
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
- 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));
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"); // eslint-disable-next-line no-process-exit
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 _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 : {});
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'); // TODO output summary
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)); // eslint-disable-next-line no-process-exit
140
-
141
- void (0, _utils.shutdownWorkers)().then(() => process.exit());
142
- }); // TODO grep
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
- 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
-
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.resolve(`${reportDataPath}`).then(s => _interopRequireWildcard(require(s)));
46
- } catch (error) {// Ignore 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 _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
-
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.default.Worker);
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.setupMaster({
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.default.Worker)) throw new Error(`Can't instantiate worker for ${this.browser} due many errors`);
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;