creevey 0.9.0-beta.13 → 0.9.0-beta.14

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 (216) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/.yarnrc.yml +1 -0
  3. package/lib/cjs/cli.js +1 -0
  4. package/lib/cjs/client/addon/Manager.js +151 -223
  5. package/lib/cjs/client/addon/components/Addon.js +2 -9
  6. package/lib/cjs/client/addon/components/Icons.js +1 -7
  7. package/lib/cjs/client/addon/components/Panel.js +5 -18
  8. package/lib/cjs/client/addon/components/TestSelect.js +12 -25
  9. package/lib/cjs/client/addon/components/Tools.js +17 -28
  10. package/lib/cjs/client/addon/decorator.js +1 -4
  11. package/lib/cjs/client/addon/index.js +0 -4
  12. package/lib/cjs/client/addon/preset.js +3 -12
  13. package/lib/cjs/client/addon/preview.js +1 -4
  14. package/lib/cjs/client/addon/readyForCapture.js +1 -4
  15. package/lib/cjs/client/addon/register.js +11 -26
  16. package/lib/cjs/client/addon/utils.js +1 -9
  17. package/lib/cjs/client/addon/withCreevey.js +55 -134
  18. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +5 -17
  19. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +8 -24
  20. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +7 -23
  21. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +7 -22
  22. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +5 -17
  23. package/lib/cjs/client/shared/components/ImagesView/index.js +0 -5
  24. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +1 -8
  25. package/lib/cjs/client/shared/components/PageFooter/Paging.js +2 -19
  26. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +21 -17
  27. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +5 -24
  28. package/lib/cjs/client/shared/components/ResultsPage.js +9 -37
  29. package/lib/cjs/client/shared/creeveyClientApi.js +3 -13
  30. package/lib/cjs/client/shared/helpers.js +21 -75
  31. package/lib/cjs/client/shared/viewMode.js +2 -6
  32. package/lib/cjs/client/web/192.js +1 -0
  33. package/lib/cjs/client/web/632.js +43 -0
  34. package/lib/cjs/client/web/794.js +1 -0
  35. package/lib/cjs/client/web/main.js +78 -1
  36. package/lib/cjs/client/web/main.js.LICENSE.txt +0 -15
  37. package/lib/cjs/creevey.js +5 -21
  38. package/lib/cjs/index.js +0 -15
  39. package/lib/cjs/server/config.js +13 -33
  40. package/lib/cjs/server/docker.js +5 -27
  41. package/lib/cjs/server/index.js +8 -33
  42. package/lib/cjs/server/logger.js +5 -19
  43. package/lib/cjs/server/master/api.js +1 -14
  44. package/lib/cjs/server/master/index.js +15 -46
  45. package/lib/cjs/server/master/master.js +6 -21
  46. package/lib/cjs/server/master/pool.js +2 -37
  47. package/lib/cjs/server/master/runner.js +15 -42
  48. package/lib/cjs/server/master/server.js +5 -27
  49. package/lib/cjs/server/messages.js +7 -53
  50. package/lib/cjs/server/selenium/browser.js +51 -136
  51. package/lib/cjs/server/selenium/index.js +0 -4
  52. package/lib/cjs/server/selenium/selenoid.js +7 -33
  53. package/lib/cjs/server/stories.js +25 -30
  54. package/lib/cjs/server/storybook/providers/browser.js +5 -18
  55. package/lib/cjs/server/storybook/providers/hybrid.js +9 -29
  56. package/lib/cjs/server/testsFiles/parser.js +3 -19
  57. package/lib/cjs/server/testsFiles/register.js +7 -9
  58. package/lib/cjs/server/update.js +3 -20
  59. package/lib/cjs/server/utils.js +9 -41
  60. package/lib/cjs/server/worker/chai-image.js +1 -27
  61. package/lib/cjs/server/worker/helpers.js +2 -12
  62. package/lib/cjs/server/worker/index.js +1 -3
  63. package/lib/cjs/server/worker/reporter.js +8 -24
  64. package/lib/cjs/server/worker/worker.js +5 -49
  65. package/lib/cjs/shared/index.js +22 -36
  66. package/lib/cjs/shared/serializeRegExp.js +0 -8
  67. package/lib/cjs/types.js +4 -14
  68. package/lib/esm/cli.js +1 -1
  69. package/lib/esm/client/addon/Manager.js +151 -214
  70. package/lib/esm/client/addon/components/Panel.js +4 -6
  71. package/lib/esm/client/addon/components/TestSelect.js +11 -17
  72. package/lib/esm/client/addon/components/Tools.js +15 -14
  73. package/lib/esm/client/addon/preset.js +2 -8
  74. package/lib/esm/client/addon/readyForCapture.js +1 -3
  75. package/lib/esm/client/addon/register.js +6 -8
  76. package/lib/esm/client/addon/utils.js +0 -5
  77. package/lib/esm/client/addon/withCreevey.js +54 -116
  78. package/lib/esm/client/shared/components/ImagesView/BlendView.js +1 -1
  79. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +6 -8
  80. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +3 -4
  81. package/lib/esm/client/shared/components/ImagesView/SlideView.js +3 -3
  82. package/lib/esm/client/shared/components/ImagesView/SwapView.js +1 -1
  83. package/lib/esm/client/shared/components/PageFooter/Paging.js +1 -11
  84. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +18 -7
  85. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +3 -8
  86. package/lib/esm/client/shared/components/ResultsPage.js +6 -15
  87. package/lib/esm/client/shared/creeveyClientApi.js +3 -10
  88. package/lib/esm/client/shared/helpers.js +21 -47
  89. package/lib/esm/client/web/192.js +1 -0
  90. package/lib/esm/client/web/632.js +43 -0
  91. package/lib/esm/client/web/794.js +1 -0
  92. package/lib/esm/client/web/index.html +19 -0
  93. package/lib/esm/client/web/main.js +79 -0
  94. package/lib/esm/client/web/main.js.LICENSE.txt +34 -0
  95. package/lib/esm/creevey.js +4 -8
  96. package/lib/esm/index.js +0 -1
  97. package/lib/esm/server/config.js +7 -14
  98. package/lib/esm/server/docker.js +4 -12
  99. package/lib/esm/server/index.js +7 -21
  100. package/lib/esm/server/logger.js +0 -1
  101. package/lib/esm/server/master/api.js +0 -9
  102. package/lib/esm/server/master/index.js +15 -32
  103. package/lib/esm/server/master/master.js +2 -7
  104. package/lib/esm/server/master/pool.js +0 -23
  105. package/lib/esm/server/master/runner.js +14 -27
  106. package/lib/esm/server/master/server.js +4 -9
  107. package/lib/esm/server/messages.js +6 -38
  108. package/lib/esm/server/selenium/browser.js +50 -114
  109. package/lib/esm/server/selenium/selenoid.js +6 -17
  110. package/lib/esm/server/stories.js +24 -20
  111. package/lib/esm/server/storybook/providers/browser.js +4 -8
  112. package/lib/esm/server/storybook/providers/hybrid.js +6 -14
  113. package/lib/esm/server/testsFiles/parser.js +0 -6
  114. package/lib/esm/server/testsFiles/register.js +5 -2
  115. package/lib/esm/server/update.js +0 -8
  116. package/lib/esm/server/utils.js +3 -11
  117. package/lib/esm/server/worker/chai-image.js +0 -21
  118. package/lib/esm/server/worker/helpers.js +2 -9
  119. package/lib/esm/server/worker/reporter.js +7 -10
  120. package/lib/esm/server/worker/worker.js +4 -25
  121. package/lib/esm/shared/index.js +24 -25
  122. package/lib/esm/types.js +4 -1
  123. package/lib/types/client/addon/Manager.d.ts +1 -1
  124. package/lib/types/client/addon/components/Addon.d.ts +1 -0
  125. package/lib/types/client/addon/components/Icons.d.ts +1 -0
  126. package/lib/types/client/addon/components/Panel.d.ts +1 -0
  127. package/lib/types/client/addon/components/TestSelect.d.ts +1 -0
  128. package/lib/types/client/addon/components/Tools.d.ts +1 -0
  129. package/lib/types/client/addon/decorator.d.ts +1 -1
  130. package/lib/types/client/addon/preset.d.ts +2 -2
  131. package/lib/types/client/addon/preview.d.ts +1 -1
  132. package/lib/types/client/addon/withCreevey.d.ts +3 -2
  133. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
  134. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +1 -0
  135. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -1
  136. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -1
  137. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -1
  138. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +1 -0
  139. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +1 -0
  140. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +3 -1
  141. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +1 -0
  142. package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
  143. package/lib/types/client/web/CreeveyApp.d.ts +1 -0
  144. package/lib/types/client/web/CreeveyLoader.d.ts +2 -1
  145. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +4 -1
  146. package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
  147. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +1 -0
  148. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
  149. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +1 -0
  150. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +3 -1
  151. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +3 -1
  152. package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
  153. package/lib/types/shared/index.d.ts +1 -1
  154. package/lib/types/types.d.ts +7 -28
  155. package/package.json +60 -78
  156. package/lib/cjs/client/addon/preset.ie11.js +0 -74
  157. package/lib/cjs/client/addon/preset.sb7.js +0 -19
  158. package/lib/cjs/client/web/142.js +0 -2
  159. package/lib/cjs/client/web/142.js.LICENSE.txt +0 -12
  160. package/lib/cjs/client/web/32.js +0 -1
  161. package/lib/cjs/client/web/551.js +0 -1
  162. package/lib/cjs/client/web/566.js +0 -2
  163. package/lib/cjs/client/web/566.js.LICENSE.txt +0 -31
  164. package/lib/cjs/client/web/691.js +0 -2
  165. package/lib/cjs/client/web/691.js.LICENSE.txt +0 -8
  166. package/lib/cjs/client/web/725.js +0 -1
  167. package/lib/cjs/server/extract.js +0 -46
  168. package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -86
  169. package/lib/cjs/server/loaders/babel/helpers.js +0 -469
  170. package/lib/cjs/server/loaders/babel/register.js +0 -124
  171. package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
  172. package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
  173. package/lib/cjs/server/loaders/webpack/compile.js +0 -269
  174. package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -172
  175. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -39
  176. package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
  177. package/lib/cjs/server/loaders/webpack/start.js +0 -41
  178. package/lib/cjs/server/storybook/entry.js +0 -53
  179. package/lib/cjs/server/storybook/helpers.js +0 -158
  180. package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
  181. package/lib/esm/client/addon/preset.ie11.js +0 -59
  182. package/lib/esm/client/addon/preset.sb7.js +0 -8
  183. package/lib/esm/server/extract.js +0 -32
  184. package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -72
  185. package/lib/esm/server/loaders/babel/helpers.js +0 -452
  186. package/lib/esm/server/loaders/babel/register.js +0 -103
  187. package/lib/esm/server/loaders/hooks/mdx.js +0 -15
  188. package/lib/esm/server/loaders/hooks/svelte.js +0 -49
  189. package/lib/esm/server/loaders/webpack/compile.js +0 -246
  190. package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -152
  191. package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -32
  192. package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
  193. package/lib/esm/server/loaders/webpack/start.js +0 -27
  194. package/lib/esm/server/storybook/entry.js +0 -27
  195. package/lib/esm/server/storybook/helpers.js +0 -97
  196. package/lib/esm/server/storybook/providers/nodejs.js +0 -216
  197. package/lib/types/client/addon/preset.ie11.d.ts +0 -10
  198. package/lib/types/client/addon/preset.sb7.d.ts +0 -2
  199. package/lib/types/server/extract.d.ts +0 -2
  200. package/lib/types/server/loaders/babel/creevey-plugin.d.ts +0 -1
  201. package/lib/types/server/loaders/babel/helpers.d.ts +0 -19
  202. package/lib/types/server/loaders/babel/register.d.ts +0 -5
  203. package/lib/types/server/loaders/hooks/mdx.d.ts +0 -1
  204. package/lib/types/server/loaders/hooks/svelte.d.ts +0 -1
  205. package/lib/types/server/loaders/webpack/compile.d.ts +0 -2
  206. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +0 -4
  207. package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +0 -10
  208. package/lib/types/server/loaders/webpack/mdx-loader.d.ts +0 -6
  209. package/lib/types/server/loaders/webpack/start.d.ts +0 -1
  210. package/lib/types/server/storybook/entry.d.ts +0 -17
  211. package/lib/types/server/storybook/helpers.d.ts +0 -24
  212. package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
  213. package/preset/ie11.js +0 -5
  214. package/preset/index.js +0 -9
  215. package/preset/sb7.js +0 -5
  216. package/types/mdx.d.ts +0 -7
@@ -4,46 +4,32 @@ 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
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
+ const writeFileAsync = (0, _util.promisify)(_fs.writeFile);
28
18
  const copyFileAsync = (0, _util.promisify)(_fs.copyFile);
29
19
  const readdirAsync = (0, _util.promisify)(_fs.readdir);
30
20
  const mkdirAsync = (0, _util.promisify)(_fs.mkdir);
31
-
32
21
  async function copyStatics(reportDir) {
33
22
  const clientDir = _path.default.join(__dirname, '../../client/web');
34
-
35
23
  const files = (await readdirAsync(clientDir, {
36
24
  withFileTypes: true
37
25
  })).filter(dirent => dirent.isFile() && !dirent.name.endsWith('.d.ts') && !dirent.name.endsWith('.tsx')).map(dirent => dirent.name);
38
26
  await mkdirAsync(reportDir, {
39
27
  recursive: true
40
28
  });
41
-
42
29
  for (const file of files) {
43
30
  await copyFileAsync(_path.default.join(clientDir, file), _path.default.join(reportDir, file));
44
31
  }
45
32
  }
46
-
47
33
  function reportDataModule(data) {
48
34
  return `
49
35
  (function (root, factory) {
@@ -55,44 +41,34 @@ function reportDataModule(data) {
55
41
  }(this, function () { return ${JSON.stringify(data)} }));
56
42
  `;
57
43
  }
58
-
59
44
  function outputUnnecessaryImages(imagesDir, images) {
60
45
  if (!(0, _fs.existsSync)(imagesDir)) return;
61
46
  const unnecessaryImages = (0, _utils.readDirRecursive)(imagesDir).map(imagePath => _path.default.posix.relative(imagesDir, imagePath)).filter(imagePath => !images.has(imagePath));
62
-
63
47
  if (unnecessaryImages.length > 0) {
64
48
  _logger.logger.warn('We found unnecessary screenshot images, those can be safely removed:\n', unnecessaryImages.join('\n'));
65
49
  }
66
50
  }
67
-
68
51
  async function _default(config, options, resolveApi) {
69
52
  let runner = null;
70
-
71
53
  if (config.hooks.before) {
72
54
  await config.hooks.before();
73
55
  }
74
-
75
56
  (0, _messages.subscribeOn)('shutdown', () => {
76
57
  var _config$hooks$after, _config$hooks;
77
-
78
58
  return (_config$hooks$after = (_config$hooks = config.hooks).after) === null || _config$hooks$after === void 0 ? void 0 : _config$hooks$after.call(_config$hooks);
79
59
  });
80
60
  process.removeListener('SIGINT', _utils.shutdown);
81
61
  process.on('SIGINT', () => {
82
62
  var _runner, _runner2;
83
-
84
- (_runner = runner) === null || _runner === void 0 ? void 0 : _runner.removeAllListeners('stop');
85
-
63
+ (_runner = runner) === null || _runner === void 0 || _runner.removeAllListeners('stop');
86
64
  if ((_runner2 = runner) !== null && _runner2 !== void 0 && _runner2.isRunning) {
87
65
  var _runner4;
88
-
89
66
  // TODO Better handle stop
90
67
  void Promise.race([new Promise(resolve => setTimeout(resolve, 10000)), new Promise(resolve => {
91
68
  var _runner3;
92
-
93
69
  return (_runner3 = runner) === null || _runner3 === void 0 ? void 0 : _runner3.once('stop', resolve);
94
70
  })]).then(() => (0, _utils.shutdownWorkers)());
95
- (_runner4 = runner) === null || _runner4 === void 0 ? void 0 : _runner4.stop();
71
+ (_runner4 = runner) === null || _runner4 === void 0 || _runner4.stop();
96
72
  } else {
97
73
  void (0, _utils.shutdownWorkers)();
98
74
  }
@@ -102,45 +78,38 @@ async function _default(config, options, resolveApi) {
102
78
  debug: options.debug,
103
79
  port: options.port
104
80
  });
105
-
106
81
  if (options.saveReport) {
107
- await copyStatics(config.reportDir);
108
- runner.on('stop', () => {
82
+ runner.on('stop', async () => {
109
83
  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
+ await copyStatics(config.reportDir);
85
+ await writeFileAsync(_path.default.join(config.reportDir, 'data.js'), reportDataModule((_runner5 = runner) === null || _runner5 === void 0 ? void 0 : _runner5.status.tests));
112
86
  });
113
87
  }
114
-
115
88
  if (options.ui) {
116
89
  resolveApi((0, _api.default)(runner));
117
-
118
90
  _logger.logger.info(`Started on http://localhost:${options.port}`);
119
91
  } else {
120
92
  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
-
93
+ _logger.logger.warn("Don't have any tests to run");
94
+ // eslint-disable-next-line no-process-exit
124
95
  void (0, _utils.shutdownWorkers)().then(() => process.exit());
125
96
  return;
126
97
  }
127
-
128
98
  runner.once('stop', () => {
129
99
  var _runner6;
130
-
131
100
  const tests = Object.values(((_runner6 = runner) === null || _runner6 === void 0 ? void 0 : _runner6.status.tests) ?? {});
132
101
  const isSuccess = tests.filter(_types.isDefined).filter(({
133
102
  skip
134
103
  }) => !skip).every(({
135
104
  status
136
- }) => status == 'success'); // TODO output summary
137
-
105
+ }) => status == 'success');
106
+ // TODO output summary
138
107
  process.exitCode = isSuccess ? 0 : -1;
139
- if (!config.failFast) outputUnnecessaryImages(config.screenDir, (0, _utils.testsToImages)(tests)); // eslint-disable-next-line no-process-exit
140
-
108
+ if (!config.failFast) outputUnnecessaryImages(config.screenDir, (0, _utils.testsToImages)(tests));
109
+ // eslint-disable-next-line no-process-exit
141
110
  void (0, _utils.shutdownWorkers)().then(() => process.exit());
142
- }); // TODO grep
143
-
111
+ });
112
+ // TODO grep
144
113
  runner.start(Object.keys(runner.status.tests));
145
114
  }
146
115
  }
@@ -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,32 +4,21 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _cluster = _interopRequireWildcard(require("cluster"));
9
-
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 _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); }
19
-
20
- 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; }
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 {
25
16
  workers = [];
26
17
  queue = [];
27
18
  forcedStop = false;
28
-
29
19
  get isRunning() {
30
20
  return this.workers.length !== this.freeWorkers.length;
31
21
  }
32
-
33
22
  constructor(config, browser) {
34
23
  super();
35
24
  this.browser = browser;
@@ -37,7 +26,6 @@ class Pool extends _events.EventEmitter {
37
26
  this.maxRetries = config.maxRetries;
38
27
  this.config = config.browsers[browser];
39
28
  }
40
-
41
29
  async init() {
42
30
  const poolSize = this.config.limit || 1;
43
31
  this.workers = (await Promise.all(Array.from({
@@ -46,7 +34,6 @@ class Pool extends _events.EventEmitter {
46
34
  if (this.workers.length != poolSize) throw new Error(`Can't instantiate workers for ${this.browser} due many errors`);
47
35
  this.workers.forEach(worker => this.exitHandler(worker));
48
36
  }
49
-
50
37
  start(tests) {
51
38
  if (this.isRunning) return false;
52
39
  this.queue = tests.map(({
@@ -60,27 +47,22 @@ class Pool extends _events.EventEmitter {
60
47
  this.process();
61
48
  return true;
62
49
  }
63
-
64
50
  stop() {
65
51
  if (!this.isRunning) {
66
52
  this.emit('stop');
67
53
  return;
68
54
  }
69
-
70
55
  this.forcedStop = true;
71
56
  this.queue = [];
72
57
  }
73
-
74
58
  process() {
75
59
  const worker = this.getFreeWorker();
76
60
  const [test] = this.queue;
77
-
78
61
  if (this.queue.length == 0 && this.workers.length === this.freeWorkers.length) {
79
62
  this.forcedStop = false;
80
63
  this.emit('stop');
81
64
  return;
82
65
  }
83
-
84
66
  if (!worker || !test) return;
85
67
  worker.isRunning = true;
86
68
  const {
@@ -98,37 +80,29 @@ class Pool extends _events.EventEmitter {
98
80
  });
99
81
  this.process();
100
82
  }
101
-
102
83
  sendStatus(message) {
103
84
  this.emit('test', message);
104
85
  }
105
-
106
86
  getFreeWorker() {
107
87
  return this.freeWorkers[Math.floor(Math.random() * this.freeWorkers.length)];
108
88
  }
109
-
110
89
  get aliveWorkers() {
111
90
  return this.workers.filter(worker => !worker.exitedAfterDisconnect);
112
91
  }
113
-
114
92
  get freeWorkers() {
115
93
  return this.aliveWorkers.filter(worker => !worker.isRunning);
116
94
  }
117
-
118
95
  async forkWorker(retry = 0) {
119
96
  _cluster.default.setupMaster({
120
97
  args: ['--browser', this.browser, ...process.argv.slice(2)]
121
98
  });
122
-
123
99
  const worker = _cluster.default.fork();
124
-
125
100
  const message = await new Promise(resolve => {
126
101
  const readyHandler = message => {
127
102
  if (!(0, _types.isWorkerMessage)(message)) return;
128
103
  worker.off('message', readyHandler);
129
104
  resolve(message);
130
105
  };
131
-
132
106
  worker.on('message', readyHandler);
133
107
  });
134
108
  if (message.type != 'error') return worker;
@@ -136,7 +110,6 @@ class Pool extends _events.EventEmitter {
136
110
  if (retry == FORK_RETRIES) return message.payload;
137
111
  return this.forkWorker(retry + 1);
138
112
  }
139
-
140
113
  exitHandler(worker) {
141
114
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
142
115
  worker.once('exit', async () => {
@@ -148,25 +121,20 @@ class Pool extends _events.EventEmitter {
148
121
  this.process();
149
122
  });
150
123
  }
151
-
152
124
  gracefullyKill(worker) {
153
125
  const timeout = setTimeout(() => worker.kill(), 10000);
154
126
  worker.on('exit', () => clearTimeout(timeout));
155
127
  (0, _messages.sendShutdownMessage)(worker);
156
128
  }
157
-
158
129
  shouldRetry(test) {
159
130
  return test.retries < this.maxRetries && !this.forcedStop;
160
131
  }
161
-
162
132
  handleTestResult(worker, test, result) {
163
133
  const shouldRetry = result.status == 'failed' && this.shouldRetry(test);
164
-
165
134
  if (shouldRetry) {
166
135
  test.retries += 1;
167
136
  this.queue[this.failFast ? 'unshift' : 'push'](test);
168
137
  }
169
-
170
138
  this.sendStatus({
171
139
  id: test.id,
172
140
  status: shouldRetry ? 'retrying' : result.status,
@@ -175,7 +143,6 @@ class Pool extends _events.EventEmitter {
175
143
  worker.isRunning = false;
176
144
  setImmediate(() => this.process());
177
145
  }
178
-
179
146
  subscribe(worker, test) {
180
147
  const subscriptions = [(0, _messages.subscribeOnWorker)(worker, 'worker', message => {
181
148
  if (message.type != 'error') return;
@@ -191,7 +158,5 @@ class Pool extends _events.EventEmitter {
191
158
  this.handleTestResult(worker, test, message.payload);
192
159
  })];
193
160
  }
194
-
195
161
  }
196
-
197
162
  exports.default = Pool;
@@ -4,32 +4,21 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
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 _events = require("events");
15
-
16
11
  var _types = require("../../types");
17
-
18
12
  var _pool = _interopRequireDefault(require("./pool"));
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
14
  const copyFileAsync = (0, _util.promisify)(_fs.copyFile);
23
15
  const mkdirAsync = (0, _util.promisify)(_fs.mkdir);
24
-
25
16
  class Runner extends _events.EventEmitter {
26
17
  pools = {};
27
18
  tests = {};
28
-
29
19
  get isRunning() {
30
20
  return Object.values(this.pools).some(pool => pool.isRunning);
31
21
  }
32
-
33
22
  constructor(config) {
34
23
  super();
35
24
  this.failFast = config.failFast;
@@ -38,7 +27,6 @@ class Runner extends _events.EventEmitter {
38
27
  this.browsers = Object.keys(config.browsers);
39
28
  this.browsers.map(browser => this.pools[browser] = new _pool.default(config, browser)).map(pool => pool.on('test', this.handlePoolMessage));
40
29
  }
41
-
42
30
  handlePoolMessage = message => {
43
31
  const {
44
32
  id,
@@ -52,10 +40,9 @@ class Runner extends _events.EventEmitter {
52
40
  testName,
53
41
  storyPath,
54
42
  storyId
55
- } = test; // TODO Handle 'retrying' status
56
-
43
+ } = test;
44
+ // TODO Handle 'retrying' status
57
45
  test.status = status == 'retrying' ? 'failed' : status;
58
-
59
46
  if (!result) {
60
47
  this.sendUpdate({
61
48
  tests: {
@@ -71,11 +58,9 @@ class Runner extends _events.EventEmitter {
71
58
  });
72
59
  return;
73
60
  }
74
-
75
61
  if (!test.results) {
76
62
  test.results = [];
77
63
  }
78
-
79
64
  test.results.push(result);
80
65
  this.sendUpdate({
81
66
  tests: {
@@ -100,33 +85,32 @@ class Runner extends _events.EventEmitter {
100
85
  this.emit('stop');
101
86
  }
102
87
  };
103
-
104
88
  async init() {
105
89
  await Promise.all(Object.values(this.pools).map(pool => pool.init()));
106
90
  }
107
-
108
91
  updateTests(testsDiff) {
109
92
  const tests = {};
110
93
  const removedTests = [];
111
94
  Object.entries(testsDiff).forEach(([id, newTest]) => {
112
95
  const oldTest = this.tests[id];
113
-
114
96
  if (newTest) {
115
97
  if (oldTest) {
116
- this.tests[id] = { ...newTest,
98
+ this.tests[id] = {
99
+ ...newTest,
117
100
  retries: oldTest.retries,
118
101
  results: oldTest.results,
119
102
  approved: oldTest.approved
120
103
  };
121
- } else this.tests[id] = newTest; // eslint-disable-next-line @typescript-eslint/no-unused-vars
122
-
104
+ } else this.tests[id] = newTest;
123
105
 
106
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
124
107
  const {
125
108
  story,
126
109
  fn,
127
110
  ...restTest
128
111
  } = newTest;
129
- tests[id] = { ...restTest,
112
+ tests[id] = {
113
+ ...restTest,
130
114
  status: 'unknown'
131
115
  };
132
116
  } else if (oldTest) {
@@ -152,7 +136,6 @@ class Runner extends _events.EventEmitter {
152
136
  removedTests
153
137
  });
154
138
  }
155
-
156
139
  start(ids) {
157
140
  if (this.isRunning) return;
158
141
  const testsToStart = ids.map(id => this.tests[id]).filter(_types.isDefined).filter(test => !test.skip);
@@ -165,7 +148,8 @@ class Runner extends _events.EventEmitter {
165
148
  browser,
166
149
  testName,
167
150
  storyPath
168
- }) => ({ ...update,
151
+ }) => ({
152
+ ...update,
169
153
  [id]: {
170
154
  id,
171
155
  browser,
@@ -185,7 +169,8 @@ class Runner extends _events.EventEmitter {
185
169
  } = test;
186
170
  const restPath = [...storyPath, testName].filter(_types.isDefined);
187
171
  test.status = 'pending';
188
- return { ...tests,
172
+ return {
173
+ ...tests,
189
174
  [browser]: [...(tests[browser] || []), {
190
175
  id,
191
176
  path: restPath
@@ -195,21 +180,19 @@ class Runner extends _events.EventEmitter {
195
180
  this.browsers.forEach(browser => {
196
181
  const pool = this.pools[browser];
197
182
  const tests = testsByBrowser[browser];
198
-
199
183
  if (tests && tests.length > 0 && pool.start(tests)) {
200
184
  pool.once('stop', this.handlePoolStop);
201
185
  }
202
186
  });
203
187
  }
204
-
205
188
  stop() {
206
189
  if (!this.isRunning) return;
207
190
  this.browsers.forEach(browser => this.pools[browser].stop());
208
191
  }
209
-
210
192
  get status() {
211
193
  const tests = {};
212
- Object.values(this.tests).filter(_types.isDefined) // eslint-disable-next-line @typescript-eslint/no-unused-vars
194
+ Object.values(this.tests).filter(_types.isDefined)
195
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
213
196
  .forEach(({
214
197
  story,
215
198
  fn,
@@ -221,7 +204,6 @@ class Runner extends _events.EventEmitter {
221
204
  browsers: this.browsers
222
205
  };
223
206
  }
224
-
225
207
  async approve({
226
208
  id,
227
209
  retry,
@@ -233,24 +215,18 @@ class Runner extends _events.EventEmitter {
233
215
  if (!result || !result.images) return;
234
216
  const images = result.images[image];
235
217
  if (!images) return;
236
-
237
218
  if (!test.approved) {
238
219
  test.approved = {};
239
220
  }
240
-
241
221
  const {
242
222
  browser,
243
223
  testName,
244
224
  storyPath
245
225
  } = test;
246
226
  const restPath = [...storyPath, testName].filter(_types.isDefined);
247
-
248
227
  const testPath = _path.default.join(...restPath, image == browser ? '' : browser);
249
-
250
228
  const srcImagePath = _path.default.join(this.reportDir, testPath, images.actual);
251
-
252
229
  const dstImagePath = _path.default.join(this.screenDir, testPath, `${image}.png`);
253
-
254
230
  await mkdirAsync(_path.default.join(this.screenDir, testPath), {
255
231
  recursive: true
256
232
  });
@@ -271,11 +247,8 @@ class Runner extends _events.EventEmitter {
271
247
  }
272
248
  });
273
249
  }
274
-
275
250
  sendUpdate(data) {
276
251
  this.emit('update', data);
277
252
  }
278
-
279
253
  }
280
-
281
254
  exports.default = Runner;
@@ -4,43 +4,26 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = server;
7
-
8
7
  var _path = _interopRequireDefault(require("path"));
9
-
10
8
  var _http = _interopRequireDefault(require("http"));
11
-
12
9
  var _cluster = _interopRequireDefault(require("cluster"));
13
-
14
10
  var _koa = _interopRequireDefault(require("koa"));
15
-
16
11
  var _cors = _interopRequireDefault(require("@koa/cors"));
17
-
18
12
  var _koaStatic = _interopRequireDefault(require("koa-static"));
19
-
20
13
  var _koaMount = _interopRequireDefault(require("koa-mount"));
21
-
22
14
  var _koaBodyparser = _interopRequireDefault(require("koa-bodyparser"));
23
-
24
15
  var _ws = _interopRequireDefault(require("ws"));
25
-
26
16
  var _messages = require("../messages");
27
-
28
17
  var _types = require("../../types");
29
-
30
18
  var _logger = require("../logger");
31
-
32
19
  var _shared = require("../../shared");
33
-
34
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
35
-
20
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
36
21
  function server(reportDir, port, ui) {
37
22
  let resolveApi = _types.noop;
38
23
  let setStoriesCounter = 0;
39
24
  const creeveyApi = new Promise(resolve => resolveApi = resolve);
40
25
  const app = new _koa.default();
41
-
42
26
  const server = _http.default.createServer(app.callback());
43
-
44
27
  const wss = new _ws.default.Server({
45
28
  server
46
29
  });
@@ -51,17 +34,14 @@ function server(reportDir, port, ui) {
51
34
  ctx.body = 'pong';
52
35
  return;
53
36
  }
54
-
55
37
  await next();
56
38
  });
57
-
58
39
  if (ui) {
59
40
  app.use(async (_, next) => {
60
41
  await creeveyApi;
61
42
  await next();
62
43
  });
63
44
  }
64
-
65
45
  app.use(async (ctx, next) => {
66
46
  if (ctx.method == 'POST' && ctx.path == '/stories') {
67
47
  const {
@@ -81,7 +61,6 @@ function server(reportDir, port, ui) {
81
61
  }));
82
62
  return;
83
63
  }
84
-
85
64
  await next();
86
65
  });
87
66
  app.use(async (ctx, next) => {
@@ -90,8 +69,8 @@ function server(reportDir, port, ui) {
90
69
  workerId,
91
70
  options
92
71
  } = ctx.request.body;
93
- const worker = Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).find(worker => worker.process.pid == workerId); // NOTE: Hypothetical case when someone send to us capture req and we don't have a worker with browser session for it
94
-
72
+ const worker = Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).find(worker => worker.process.pid == workerId);
73
+ // NOTE: Hypothetical case when someone send to us capture req and we don't have a worker with browser session for it
95
74
  if (!worker) return;
96
75
  await new Promise(resolve => {
97
76
  const unsubscribe = (0, _messages.subscribeOnWorker)(worker, 'stories', message => {
@@ -103,12 +82,11 @@ function server(reportDir, port, ui) {
103
82
  type: 'capture',
104
83
  payload: options
105
84
  });
106
- }); // TODO Pass screenshot result to show it in inspector
107
-
85
+ });
86
+ // TODO Pass screenshot result to show it in inspector
108
87
  ctx.body = 'Ok';
109
88
  return;
110
89
  }
111
-
112
90
  await next();
113
91
  });
114
92
  app.use((0, _koaStatic.default)(_path.default.join(__dirname, '../../client/web')));