creevey 0.9.0-beta.0 → 0.9.0-beta.10

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 (203) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +9 -1
  3. package/addon/README.md +3 -0
  4. package/addon/package.json +5 -0
  5. package/docs/config.md +29 -26
  6. package/jest.config.js +6 -0
  7. package/lib/cjs/client/addon/Manager.js +122 -270
  8. package/lib/cjs/client/addon/components/Addon.js +17 -38
  9. package/lib/cjs/client/addon/components/Icons.js +11 -7
  10. package/lib/cjs/client/addon/components/Panel.js +17 -13
  11. package/lib/cjs/client/addon/components/TestSelect.js +11 -9
  12. package/lib/cjs/client/addon/components/Tools.js +22 -41
  13. package/lib/cjs/client/addon/decorator.js +1 -1
  14. package/lib/cjs/client/addon/index.js +31 -0
  15. package/lib/cjs/client/addon/preset.ie11.js +74 -0
  16. package/lib/cjs/client/addon/preset.js +4 -68
  17. package/lib/cjs/client/addon/preset.sb7.js +19 -0
  18. package/lib/cjs/client/addon/preview.js +14 -0
  19. package/lib/cjs/client/addon/register.js +46 -70
  20. package/lib/cjs/client/addon/utils.js +6 -2
  21. package/lib/cjs/client/addon/withCreevey.js +161 -366
  22. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +23 -21
  23. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +22 -18
  24. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +42 -64
  25. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +35 -48
  26. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +24 -43
  27. package/lib/cjs/client/shared/components/ImagesView/index.js +9 -9
  28. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +12 -8
  29. package/lib/cjs/client/shared/components/PageFooter/Paging.js +14 -18
  30. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +22 -18
  31. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +42 -67
  32. package/lib/cjs/client/shared/components/ResultsPage.js +39 -69
  33. package/lib/cjs/client/shared/creeveyClientApi.js +55 -82
  34. package/lib/cjs/client/shared/helpers.js +139 -210
  35. package/lib/cjs/client/shared/viewMode.js +5 -5
  36. package/lib/cjs/client/web/142.js +2 -0
  37. package/lib/cjs/client/web/142.js.LICENSE.txt +12 -0
  38. package/lib/cjs/client/web/32.js +1 -0
  39. package/lib/cjs/client/web/551.js +1 -0
  40. package/lib/cjs/client/web/566.js +2 -0
  41. package/lib/cjs/client/web/566.js.LICENSE.txt +31 -0
  42. package/lib/cjs/client/web/691.js +2 -0
  43. package/lib/cjs/client/web/691.js.LICENSE.txt +8 -0
  44. package/lib/cjs/client/web/725.js +1 -0
  45. package/lib/cjs/client/web/main.js +2 -38
  46. package/lib/cjs/client/web/main.js.LICENSE.txt +49 -0
  47. package/lib/cjs/creevey.js +3 -5
  48. package/lib/cjs/index.js +5 -5
  49. package/lib/cjs/server/config.js +3 -5
  50. package/lib/cjs/server/docker.js +3 -7
  51. package/lib/cjs/server/extract.js +1 -5
  52. package/lib/cjs/server/index.js +1 -1
  53. package/lib/cjs/server/loaders/babel/creevey-plugin.js +1 -3
  54. package/lib/cjs/server/loaders/babel/helpers.js +13 -23
  55. package/lib/cjs/server/loaders/babel/register.js +2 -4
  56. package/lib/cjs/server/loaders/webpack/compile.js +34 -51
  57. package/lib/cjs/server/loaders/webpack/creevey-loader.js +20 -22
  58. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +2 -7
  59. package/lib/cjs/server/loaders/webpack/mdx-loader.js +2 -2
  60. package/lib/cjs/server/loaders/webpack/start.js +1 -1
  61. package/lib/cjs/server/logger.js +2 -1
  62. package/lib/cjs/server/master/index.js +2 -2
  63. package/lib/cjs/server/master/pool.js +9 -18
  64. package/lib/cjs/server/master/runner.js +53 -66
  65. package/lib/cjs/server/master/server.js +5 -3
  66. package/lib/cjs/server/messages.js +8 -10
  67. package/lib/cjs/server/selenium/browser.js +58 -70
  68. package/lib/cjs/server/selenium/selenoid.js +5 -7
  69. package/lib/cjs/server/stories.js +16 -33
  70. package/lib/cjs/server/storybook/entry.js +7 -22
  71. package/lib/cjs/server/storybook/helpers.js +21 -28
  72. package/lib/cjs/server/storybook/providers/browser.js +10 -14
  73. package/lib/cjs/server/storybook/providers/hybrid.js +17 -14
  74. package/lib/cjs/server/storybook/providers/nodejs.js +12 -12
  75. package/lib/cjs/server/{parser.js → testsFiles/parser.js} +1 -14
  76. package/lib/cjs/server/testsFiles/register.js +44 -0
  77. package/lib/cjs/server/update.js +1 -5
  78. package/lib/cjs/server/utils.js +27 -36
  79. package/lib/cjs/server/worker/reporter.js +8 -20
  80. package/lib/cjs/server/worker/worker.js +9 -19
  81. package/lib/cjs/shared/index.js +101 -0
  82. package/lib/cjs/shared/serializeRegExp.js +42 -0
  83. package/lib/cjs/types.js +7 -6
  84. package/lib/esm/client/addon/Manager.js +122 -270
  85. package/lib/esm/client/addon/components/Addon.js +15 -34
  86. package/lib/esm/client/addon/components/Icons.js +10 -6
  87. package/lib/esm/client/addon/components/Panel.js +17 -13
  88. package/lib/esm/client/addon/components/TestSelect.js +11 -9
  89. package/lib/esm/client/addon/components/Tools.js +20 -37
  90. package/lib/esm/client/addon/decorator.js +1 -1
  91. package/lib/esm/client/addon/index.js +2 -0
  92. package/lib/esm/client/addon/preset.ie11.js +59 -0
  93. package/lib/esm/client/addon/preset.js +4 -52
  94. package/lib/esm/client/addon/preset.sb7.js +8 -0
  95. package/lib/esm/client/addon/preview.js +5 -0
  96. package/lib/esm/client/addon/register.js +42 -66
  97. package/lib/esm/client/addon/utils.js +3 -2
  98. package/lib/esm/client/addon/withCreevey.js +156 -363
  99. package/lib/esm/client/shared/components/ImagesView/BlendView.js +21 -17
  100. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +21 -17
  101. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +40 -60
  102. package/lib/esm/client/shared/components/ImagesView/SlideView.js +33 -44
  103. package/lib/esm/client/shared/components/ImagesView/SwapView.js +22 -39
  104. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
  105. package/lib/esm/client/shared/components/PageFooter/Paging.js +14 -18
  106. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +22 -18
  107. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +37 -60
  108. package/lib/esm/client/shared/components/ResultsPage.js +36 -64
  109. package/lib/esm/client/shared/creeveyClientApi.js +57 -84
  110. package/lib/esm/client/shared/helpers.js +123 -194
  111. package/lib/esm/client/shared/viewMode.js +4 -4
  112. package/lib/esm/creevey.js +3 -5
  113. package/lib/esm/index.js +2 -4
  114. package/lib/esm/server/config.js +3 -5
  115. package/lib/esm/server/docker.js +2 -2
  116. package/lib/esm/server/extract.js +1 -3
  117. package/lib/esm/server/index.js +1 -1
  118. package/lib/esm/server/loaders/babel/creevey-plugin.js +1 -3
  119. package/lib/esm/server/loaders/babel/helpers.js +12 -22
  120. package/lib/esm/server/loaders/babel/register.js +3 -5
  121. package/lib/esm/server/loaders/webpack/compile.js +35 -52
  122. package/lib/esm/server/loaders/webpack/creevey-loader.js +9 -10
  123. package/lib/esm/server/loaders/webpack/dummy-hmr.js +2 -6
  124. package/lib/esm/server/loaders/webpack/mdx-loader.js +2 -2
  125. package/lib/esm/server/loaders/webpack/start.js +1 -1
  126. package/lib/esm/server/master/index.js +2 -2
  127. package/lib/esm/server/master/pool.js +7 -18
  128. package/lib/esm/server/master/runner.js +53 -66
  129. package/lib/esm/server/master/server.js +5 -3
  130. package/lib/esm/server/messages.js +3 -5
  131. package/lib/esm/server/selenium/browser.js +54 -66
  132. package/lib/esm/server/selenium/selenoid.js +4 -6
  133. package/lib/esm/server/stories.js +16 -32
  134. package/lib/esm/server/storybook/entry.js +5 -22
  135. package/lib/esm/server/storybook/helpers.js +12 -21
  136. package/lib/esm/server/storybook/providers/browser.js +6 -9
  137. package/lib/esm/server/storybook/providers/hybrid.js +10 -13
  138. package/lib/esm/server/storybook/providers/nodejs.js +10 -11
  139. package/lib/esm/server/{parser.js → testsFiles/parser.js} +1 -14
  140. package/lib/esm/server/testsFiles/register.js +31 -0
  141. package/lib/esm/server/update.js +1 -5
  142. package/lib/esm/server/utils.js +18 -31
  143. package/lib/esm/server/worker/reporter.js +8 -20
  144. package/lib/esm/server/worker/worker.js +9 -19
  145. package/lib/esm/shared/index.js +78 -0
  146. package/lib/esm/shared/serializeRegExp.js +24 -0
  147. package/lib/esm/types.js +1 -0
  148. package/lib/types/client/addon/Manager.d.ts +2 -2
  149. package/lib/types/client/addon/components/TestSelect.d.ts +0 -1
  150. package/lib/types/client/addon/index.d.ts +2 -0
  151. package/lib/types/client/addon/preset.d.ts +0 -22
  152. package/lib/types/client/addon/preset.ie11.d.ts +10 -0
  153. package/lib/types/client/addon/preset.sb7.d.ts +2 -0
  154. package/lib/types/client/addon/preview.d.ts +4 -0
  155. package/lib/types/client/addon/utils.d.ts +1 -0
  156. package/lib/types/client/addon/withCreevey.d.ts +1 -1
  157. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +1 -1
  158. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +0 -1
  159. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
  160. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +1 -1
  161. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +1 -1
  162. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +0 -1
  163. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +0 -1
  164. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +1 -1
  165. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +0 -1
  166. package/lib/types/client/shared/components/ResultsPage.d.ts +1 -1
  167. package/lib/types/client/web/CreeveyApp.d.ts +0 -1
  168. package/lib/types/client/web/CreeveyLoader.d.ts +1 -2
  169. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
  170. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +0 -1
  171. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +4 -4
  172. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +0 -1
  173. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +1 -1
  174. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +1 -1
  175. package/lib/types/index.d.ts +4 -2
  176. package/lib/types/server/config.d.ts +1 -1
  177. package/lib/types/server/loaders/babel/register.d.ts +1 -1
  178. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -2
  179. package/lib/types/server/logger.d.ts +6 -2
  180. package/lib/types/server/messages.d.ts +13 -12
  181. package/lib/types/server/selenium/browser.d.ts +5 -3
  182. package/lib/types/server/storybook/entry.d.ts +2 -3
  183. package/lib/types/server/storybook/helpers.d.ts +1 -1
  184. package/lib/types/server/storybook/providers/browser.d.ts +2 -4
  185. package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
  186. package/lib/types/server/storybook/providers/nodejs.d.ts +3 -3
  187. package/lib/types/server/{parser.d.ts → testsFiles/parser.d.ts} +1 -1
  188. package/lib/types/server/testsFiles/register.d.ts +2 -0
  189. package/lib/types/server/utils.d.ts +5 -1
  190. package/lib/types/{shared.d.ts → shared/index.d.ts} +1 -10
  191. package/lib/types/shared/serializeRegExp.d.ts +9 -0
  192. package/lib/types/types.d.ts +7 -9
  193. package/package.json +119 -102
  194. package/preset/ie11.js +5 -0
  195. package/{preset.js → preset/index.js} +2 -2
  196. package/preset/sb7.js +5 -0
  197. package/types/global.d.ts +5 -0
  198. package/types/mdx.d.ts +3 -2
  199. package/lib/cjs/client/web/1.js +0 -13
  200. package/lib/cjs/client/web/2.js +0 -1
  201. package/lib/cjs/shared.js +0 -107
  202. package/lib/esm/shared.js +0 -76
  203. package/storybook-static/stories.json +0 -21
@@ -3,30 +3,24 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.loadStories = loadStories;
6
+ exports.loadStories = void 0;
7
7
 
8
- var _cluster = _interopRequireWildcard(require("cluster"));
8
+ var _cluster = _interopRequireDefault(require("cluster"));
9
9
 
10
10
  var _selenium = require("../../selenium");
11
11
 
12
12
  var _messages = require("../../messages");
13
13
 
14
- var _shared = require("../../../shared");
15
-
16
14
  var _types = require("../../../types");
17
15
 
18
16
  var _logger = require("../../logger");
19
17
 
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; }
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
19
 
24
- async function loadStories(_config, {
25
- port
26
- }, storiesListener) {
27
- if (_cluster.isMaster) {
20
+ const loadStories = async (_config, _options, storiesListener) => {
21
+ if (_cluster.default.isPrimary) {
28
22
  return new Promise(resolve => {
29
- const worker = Object.values(_cluster.default.workers).filter(_types.isDefined).find(worker => worker.isConnected());
23
+ const worker = Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).find(worker => worker.isConnected());
30
24
 
31
25
  if (worker) {
32
26
  const unsubscribe = (0, _messages.subscribeOnWorker)(worker, 'stories', message => {
@@ -61,7 +55,7 @@ async function loadStories(_config, {
61
55
  });
62
56
  if (message.type == 'update') storiesListener(new Map(message.payload));
63
57
  });
64
- const stories = (0, _shared.deserializeRawStories)(await (0, _selenium.loadStoriesFromBrowser)(port));
58
+ const stories = await (0, _selenium.loadStoriesFromBrowser)();
65
59
  const storiesWithOldTests = [];
66
60
  Object.values(stories).forEach(story => {
67
61
  var _parameters, _parameters$creevey;
@@ -75,4 +69,6 @@ async function loadStories(_config, {
75
69
  });
76
70
  return stories;
77
71
  }
78
- }
72
+ };
73
+
74
+ exports.loadStories = loadStories;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.loadStories = loadStories;
6
+ exports.loadStories = void 0;
7
7
 
8
8
  var _chokidar = _interopRequireDefault(require("chokidar"));
9
9
 
@@ -11,7 +11,7 @@ var _browser = require("./browser");
11
11
 
12
12
  var _logger = require("../../logger");
13
13
 
14
- var _parser = _interopRequireDefault(require("../../parser"));
14
+ var _parser = _interopRequireDefault(require("../../testsFiles/parser"));
15
15
 
16
16
  var _utils = require("../../../server/utils");
17
17
 
@@ -19,9 +19,11 @@ var _shared = require("../../../shared");
19
19
 
20
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
21
 
22
- async function loadStories(_config, {
23
- port
24
- }, storiesListener) {
22
+ 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); }
23
+
24
+ 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; }
25
+
26
+ const loadStories = async (_config, _options, storiesListener) => {
25
27
  let creeveyParamsByStoryId = {};
26
28
 
27
29
  const mergeParamsFromTestsToStory = (story, creeveyParams) => {
@@ -30,9 +32,7 @@ async function loadStories(_config, {
30
32
  }
31
33
  };
32
34
 
33
- const stories = await (0, _browser.loadStories)(_config, {
34
- port
35
- }, updatedStoriesByFiles => {
35
+ const stories = await (0, _browser.loadStories)(_config, {}, updatedStoriesByFiles => {
36
36
  Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
37
37
  storiesArray.forEach(story => {
38
38
  const creeveyParams = creeveyParamsByStoryId[story.id];
@@ -52,18 +52,21 @@ async function loadStories(_config, {
52
52
  mergeParamsFromTestsToStory(story, creeveyParamsByStoryId[storyId]);
53
53
  });
54
54
  return stories;
55
- }
55
+ };
56
+
57
+ exports.loadStories = loadStories;
56
58
 
57
- function parseParams(config, listener) {
58
- if (!config.testDir) {
59
+ async function parseParams(config, listener) {
60
+ if (!config.testsDir) {
59
61
  return Promise.resolve({});
60
62
  }
61
63
 
62
- const testFiles = (0, _utils.readDirRecursive)(config.testDir).filter(file => {
63
- var _config$testRegex;
64
+ const testFiles = (0, _utils.readDirRecursive)(config.testsDir).filter(file => {
65
+ var _config$testsRegex;
64
66
 
65
- return (_config$testRegex = config.testRegex) === null || _config$testRegex === void 0 ? void 0 : _config$testRegex.test(file);
67
+ return (_config$testsRegex = config.testsRegex) === null || _config$testsRegex === void 0 ? void 0 : _config$testsRegex.test(file);
66
68
  });
69
+ await (await Promise.resolve().then(() => _interopRequireWildcard(require('../../testsFiles/register')))).default(config);
67
70
 
68
71
  if (listener) {
69
72
  _chokidar.default.watch(testFiles).on('change', filePath => {
@@ -3,12 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.loadStories = loadStories;
7
6
  exports.extractStoriesData = extractStoriesData;
7
+ exports.loadStories = void 0;
8
8
 
9
9
  var _path = _interopRequireDefault(require("path"));
10
10
 
11
- var _cluster = require("cluster");
11
+ var _cluster = _interopRequireDefault(require("cluster"));
12
12
 
13
13
  var _chokidar = _interopRequireDefault(require("chokidar"));
14
14
 
@@ -22,8 +22,6 @@ var _helpers = require("../helpers");
22
22
 
23
23
  var _logger = require("../../logger");
24
24
 
25
- var _shared = require("../../../shared");
26
-
27
25
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
28
26
 
29
27
  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); }
@@ -46,7 +44,7 @@ async function initStorybookEnvironment() {
46
44
  logger
47
45
  } = await (0, _helpers.importStorybookClientLogger)(); // NOTE: Disable duplication warnings for >=6.2 storybook
48
46
 
49
- if (_cluster.isWorker) logger.warn = _types.noop; // NOTE: disable logger for 5.x storybook
47
+ if (_cluster.default.isWorker) logger.warn = _types.noop; // NOTE: disable logger for 5.x storybook
50
48
 
51
49
  logger.debug = _types.noop;
52
50
  return Promise.resolve().then(() => _interopRequireWildcard(require('../entry')));
@@ -60,7 +58,7 @@ function watchStories(channel, watcher, initialFiles) {
60
58
  watcher.on('change', filePath => storiesByFiles.set(_path.default.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
61
59
  watcher.on('unlink', filePath => storiesByFiles.set(_path.default.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
62
60
  return data => {
63
- const stories = (0, _helpers.isStorybookVersionLessThan)(6) || (0, _helpers.isStorybookVersionGreaterThan)(6, 3) ? data.stories : (0, _shared.denormalizeStoryParameters)(data);
61
+ const stories = data.stories;
64
62
  const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
65
63
  const addedFiles = Array.from(files).filter(filePath => !watchingFiles.has(filePath));
66
64
  const removedFiles = Array.from(watchingFiles).filter(filePath => !files.has(filePath));
@@ -126,7 +124,7 @@ async function loadStoriesDirectly(config, {
126
124
  stories
127
125
  } = await (0, _helpers.importStorybookConfig)();
128
126
  const contexts = stories.map(entry => {
129
- const normalizedEntry = (0, _helpers.isStorybookVersionLessThan)(6, 4) ? entry : normalizeStoriesEntry(entry, {
127
+ const normalizedEntry = normalizeStoriesEntry(entry, {
130
128
  configDir: config.storybookDir,
131
129
  workingDir: process.cwd()
132
130
  });
@@ -175,7 +173,7 @@ async function loadStoriesDirectly(config, {
175
173
  try {
176
174
  configure(contexts.map(ctx => ctx()), module, false);
177
175
  } catch (error) {
178
- if (_cluster.isMaster) _logger.logger.error(error);
176
+ if (_cluster.default.isPrimary) _logger.logger.error(error);
179
177
  }
180
178
  }
181
179
 
@@ -191,10 +189,10 @@ async function loadStoriesDirectly(config, {
191
189
  } // TODO Do we need to support multiple storybooks here?
192
190
 
193
191
 
194
- async function loadStories(config, {
192
+ const loadStories = async (config, {
195
193
  watch,
196
194
  debug
197
- }, storiesListener) {
195
+ }, storiesListener) => {
198
196
  const storybookApi = await initStorybookEnvironment();
199
197
  const Events = await (0, _helpers.importStorybookCoreEvents)();
200
198
  const {
@@ -208,7 +206,7 @@ async function loadStories(config, {
208
206
  });
209
207
  const loadPromise = new Promise(resolve => {
210
208
  channel.once(Events.SET_STORIES, data => {
211
- const stories = (0, _helpers.isStorybookVersionLessThan)(6) || (0, _helpers.isStorybookVersionGreaterThan)(6, 3) ? data.stories : (0, _shared.denormalizeStoryParameters)(data);
209
+ const stories = data.stories;
212
210
  const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
213
211
  if (watcher) channel.on(Events.SET_STORIES, watchStories(channel, watcher, files));
214
212
  resolve(stories);
@@ -219,7 +217,9 @@ async function loadStories(config, {
219
217
  debug
220
218
  });
221
219
  return loadPromise;
222
- }
220
+ };
221
+
222
+ exports.loadStories = loadStories;
223
223
 
224
224
  async function extractStoriesData(config, {
225
225
  watch,
@@ -13,20 +13,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
13
13
  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; }
14
14
 
15
15
  async function parse(files) {
16
- result = {}; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
17
-
18
- (await Promise.resolve().then(() => _interopRequireWildcard(require('@babel/register')))).default({
19
- babelrc: false,
20
- rootMode: 'upward-optional',
21
- ignore: [/node_modules/],
22
- extensions: ['.js', '.jsx', '.ts', '.tsx'],
23
- plugins: [['@babel/plugin-transform-runtime']],
24
- presets: ['@babel/preset-typescript', ['@babel/preset-env', {
25
- targets: {
26
- node: '10'
27
- }
28
- }]]
29
- });
16
+ result = {};
30
17
  await Promise.all(files.map(async file => Promise.resolve(`${file}`).then(s => _interopRequireWildcard(require(s)))));
31
18
  return result;
32
19
  }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = register;
7
+
8
+ var _pirates = require("pirates");
9
+
10
+ var _getTsconfig = require("get-tsconfig");
11
+
12
+ 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); }
13
+
14
+ 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; }
15
+
16
+ async function register(config) {
17
+ (0, _pirates.addHook)(() => '', {
18
+ exts: ['.jpg', '.jpeg', '.png', '.gif', '.eot', '.otf', '.svg', '.ttf', '.woff', '.woff2', '.css', '.less', '.scss', '.styl'],
19
+ ignoreNodeModules: false
20
+ });
21
+ const {
22
+ path: tsConfigPath
23
+ } = (0, _getTsconfig.getTsconfig)(config.tsConfig) || {}; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
24
+
25
+ (await Promise.resolve().then(() => _interopRequireWildcard(require('@babel/register')))).default(config.babelOptions({
26
+ babelrc: false,
27
+ rootMode: 'upward-optional',
28
+ ignore: [/node_modules/],
29
+ extensions: ['.js', '.jsx', '.ts', '.tsx'],
30
+ parserOpts: {
31
+ sourceType: 'module',
32
+ plugins: ['jsx', 'typescript']
33
+ },
34
+ presets: ['@babel/preset-typescript', ['@babel/preset-env', {
35
+ targets: {
36
+ node: '10'
37
+ },
38
+ modules: 'commonjs'
39
+ }]],
40
+ plugins: [['@babel/plugin-transform-runtime'], ...(tsConfigPath ? [['babel-plugin-tsconfig-paths', {
41
+ tsconfig: tsConfigPath
42
+ }]] : [])]
43
+ })); // (await import('ts-node')).register({ project: tsConfigPath, transpileOnly: true });
44
+ }
@@ -31,11 +31,7 @@ function tryToLoadTestsData(filename) {
31
31
  const actualRegex = /^(.*)-actual-(\d+)\.png$/i;
32
32
 
33
33
  function approve(dirents, srcPath, dstPath, testPaths, isMatch) {
34
- dirents.filter(dirent => dirent.isFile()).map(dirent => actualRegex.exec(dirent.name)).filter(_types.isDefined).filter(([fileName, imageName]) => !testPaths || testPaths.find(([token]) => token == imageName) && isMatch(_path.default.join(srcPath, fileName))).reduce((images, [, imageName, retry]) => {
35
- var _images$get;
36
-
37
- return Number(retry) > ((_images$get = images.get(imageName)) !== null && _images$get !== void 0 ? _images$get : -1) ? images.set(imageName, Number(retry)) : images;
38
- }, new Map()).forEach((retry, imageName) => {
34
+ dirents.filter(dirent => dirent.isFile()).map(dirent => actualRegex.exec(dirent.name)).filter(_types.isDefined).filter(([fileName, imageName]) => !testPaths || testPaths.find(([token]) => token == imageName) && isMatch(_path.default.join(srcPath, fileName))).reduce((images, [, imageName, retry]) => Number(retry) > (images.get(imageName) ?? -1) ? images.set(imageName, Number(retry)) : images, new Map()).forEach((retry, imageName) => {
39
35
  (0, _fs.mkdirSync)(dstPath, {
40
36
  recursive: true
41
37
  });
@@ -3,15 +3,18 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.shouldSkip = shouldSkip;
7
- exports.shutdownWorkers = shutdownWorkers;
8
- exports.shutdown = shutdown;
6
+ exports.extensions = exports.downloadBinary = exports.LOCALHOST_REGEXP = void 0;
9
7
  exports.getCreeveyCache = getCreeveyCache;
8
+ exports.isShuttingDown = exports.isInsideDocker = void 0;
9
+ exports.readDirRecursive = readDirRecursive;
10
+ exports.removeProps = removeProps;
10
11
  exports.runSequence = runSequence;
12
+ exports.shouldSkip = shouldSkip;
13
+ exports.shouldSkipByOption = shouldSkipByOption;
14
+ exports.shutdown = shutdown;
15
+ exports.shutdownWorkers = shutdownWorkers;
16
+ exports.skipOptionKeys = void 0;
11
17
  exports.testsToImages = testsToImages;
12
- exports.removeProps = removeProps;
13
- exports.readDirRecursive = readDirRecursive;
14
- exports.downloadBinary = exports.isInsideDocker = exports.skipOptionKeys = exports.extensions = exports.LOCALHOST_REGEXP = exports.isShuttingDown = void 0;
15
18
 
16
19
  var _fs = require("fs");
17
20
 
@@ -47,38 +50,30 @@ function shouldSkip(browser, meta, skipOptions, test) {
47
50
  return skipOptions;
48
51
  }
49
52
 
50
- if (Array.isArray(skipOptions)) {
51
- for (const skip of skipOptions) {
52
- const reason = shouldSkip(browser, meta, skip, test);
53
- if (reason) return reason;
54
- }
55
-
56
- return false;
53
+ for (const skipKey in skipOptions) {
54
+ const reason = shouldSkipByOption(browser, meta, skipOptions[skipKey], skipKey, test);
55
+ if (reason) return reason;
57
56
  }
58
57
 
59
- let hasSkipOptionKeys = false;
58
+ return false;
59
+ }
60
60
 
61
- for (const skipKey in skipOptions) {
62
- if (skipOptionKeys.includes(skipKey)) {
63
- hasSkipOptionKeys = true;
64
- continue;
61
+ function shouldSkipByOption(browser, meta, skipOption, reason, test) {
62
+ if (Array.isArray(skipOption)) {
63
+ for (const skip of skipOption) {
64
+ const result = shouldSkipByOption(browser, meta, skip, reason, test);
65
+ if (result) return result;
65
66
  }
66
67
 
67
- const reason = shouldSkip(browser, meta, {
68
- reason: skipKey,
69
- ...skipOptions[skipKey]
70
- }, test);
71
- if (reason) return reason;
68
+ return false;
72
69
  }
73
70
 
74
- if (!hasSkipOptionKeys) return false;
75
71
  const {
76
72
  in: browsers,
77
73
  kinds,
78
74
  stories,
79
- tests,
80
- reason = true
81
- } = skipOptions;
75
+ tests
76
+ } = skipOption;
82
77
  const {
83
78
  kind,
84
79
  story
@@ -92,7 +87,7 @@ function shouldSkip(browser, meta, skipOptions, test) {
92
87
 
93
88
  async function shutdownWorkers() {
94
89
  isShuttingDown.current = true;
95
- await Promise.all(Object.values(_cluster.default.workers).filter(_types.isDefined).filter(worker => worker.isConnected()).map(worker => new Promise(resolve => {
90
+ await Promise.all(Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).filter(worker => worker.isConnected()).map(worker => new Promise(resolve => {
96
91
  const timeout = setTimeout(() => worker.kill(), 10000);
97
92
  worker.on('exit', () => {
98
93
  clearTimeout(timeout);
@@ -128,9 +123,9 @@ function testsToImages(tests) {
128
123
  storyPath,
129
124
  results
130
125
  }) => {
131
- var _results$slice$0$imag, _results$slice$;
126
+ var _results$slice$;
132
127
 
133
- return Object.keys((_results$slice$0$imag = results === null || results === void 0 ? void 0 : (_results$slice$ = results.slice(-1)[0]) === null || _results$slice$ === void 0 ? void 0 : _results$slice$.images) !== null && _results$slice$0$imag !== void 0 ? _results$slice$0$imag : {}).map(image => `${[...storyPath, testName, browser, browser == image ? undefined : image].filter(_types.isDefined).join('/')}.png`);
128
+ return Object.keys((results === null || results === void 0 ? void 0 : (_results$slice$ = results.slice(-1)[0]) === null || _results$slice$ === void 0 ? void 0 : _results$slice$.images) ?? {}).map(image => `${[...storyPath, testName, browser, browser == image ? undefined : image].filter(_types.isDefined).join('/')}.png`);
134
129
  })));
135
130
  } // https://tuhrig.de/how-to-know-you-are-inside-a-docker-container/
136
131
 
@@ -139,19 +134,15 @@ const isInsideDocker = (0, _fs.existsSync)('/proc/1/cgroup') && /docker/.test((0
139
134
  exports.isInsideDocker = isInsideDocker;
140
135
 
141
136
  const downloadBinary = (downloadUrl, destination) => new Promise((resolve, reject) => (0, _https.get)(downloadUrl, response => {
142
- var _response$statusCode2;
143
-
144
137
  if (response.statusCode == 302) {
145
- var _response$statusCode;
146
-
147
138
  const {
148
139
  location
149
140
  } = response.headers;
150
- if (!location) return reject(new Error(`Couldn't download selenoid. Status code: ${(_response$statusCode = response.statusCode) !== null && _response$statusCode !== void 0 ? _response$statusCode : 'UNKNOWN'}`));
141
+ if (!location) return reject(new Error(`Couldn't download selenoid. Status code: ${response.statusCode ?? 'UNKNOWN'}`));
151
142
  return resolve(downloadBinary(location, destination));
152
143
  }
153
144
 
154
- if (response.statusCode != 200) return reject(new Error(`Couldn't download selenoid. Status code: ${(_response$statusCode2 = response.statusCode) !== null && _response$statusCode2 !== void 0 ? _response$statusCode2 : 'UNKNOWN'}`));
145
+ if (response.statusCode != 200) return reject(new Error(`Couldn't download selenoid. Status code: ${response.statusCode ?? 'UNKNOWN'}`));
155
146
  const fileStream = (0, _fs.createWriteStream)(destination);
156
147
  response.pipe(fileStream);
157
148
  fileStream.on('finish', () => {
@@ -17,8 +17,6 @@ var _logger = require("../logger");
17
17
 
18
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
19
 
20
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
21
-
22
20
  const testLevels = {
23
21
  INFO: _chalk.default.green('PASS'),
24
22
  WARN: _chalk.default.yellow('START'),
@@ -43,11 +41,7 @@ class CreeveyReporter extends _mocha.reporters.Base {
43
41
 
44
42
  runner.on('test', test => testLogger.warn(_chalk.default.cyan(test.titlePath().join('/'))));
45
43
  runner.on('pass', test => testLogger.info(_chalk.default.cyan(test.titlePath().join('/'))));
46
- runner.on('fail', (test, error) => testLogger.error(_chalk.default.cyan(test.titlePath().join('/')), '\n ', getErrors(error, (error, imageName) => `${_chalk.default.bold(imageName !== null && imageName !== void 0 ? imageName : topLevelSuite)}:${error}`, error => {
47
- var _error$stack;
48
-
49
- return `${(_error$stack = error.stack) !== null && _error$stack !== void 0 ? _error$stack : error.message}`;
50
- }).join('\n ')));
44
+ runner.on('fail', (test, error) => testLogger.error(_chalk.default.cyan(test.titlePath().join('/')), '\n ', getErrors(error, (error, imageName) => `${_chalk.default.bold(imageName ?? topLevelSuite)}:${error}`, error => `${error.stack ?? error.message}`).join('\n ')));
51
45
  }
52
46
 
53
47
  }
@@ -57,20 +51,11 @@ exports.CreeveyReporter = CreeveyReporter;
57
51
  class TeamcityReporter extends _mocha.reporters.Base {
58
52
  constructor(runner, options) {
59
53
  super(runner);
60
-
61
- _defineProperty(this, "escape", str => {
62
- if (!str) return '';
63
- return str.toString() // eslint-disable-next-line no-control-regex
64
- .replace(/\x1B.*?m/g, '').replace(/\|/g, '||').replace(/\n/g, '|n').replace(/\r/g, '|r').replace(/\[/g, '|[').replace(/\]/g, '|]').replace(/\u0085/g, '|x').replace(/\u2028/g, '|l').replace(/\u2029/g, '|p').replace(/'/g, "|'");
65
- });
66
-
67
54
  const topLevelSuite = this.escape(options.reporterOptions.topLevelSuite);
68
55
  const reporterOptions = options.reporterOptions;
69
56
  runner.on('suite', suite => suite.root ? console.log(`##teamcity[testSuiteStarted name='${topLevelSuite}' flowId='${process.pid}']`) : console.log(`##teamcity[testSuiteStarted name='${this.escape(suite.title)}' flowId='${process.pid}']`));
70
57
  runner.on('test', test => console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`));
71
58
  runner.on('fail', (test, error) => {
72
- var _error$stack2;
73
-
74
59
  Object.entries(reporterOptions.images).forEach(([name, image]) => {
75
60
  if (!image) return;
76
61
  const filePath = test.titlePath().concat(name == topLevelSuite ? [] : [topLevelSuite]).map(this.escape).join('/'); // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -86,7 +71,7 @@ class TeamcityReporter extends _mocha.reporters.Base {
86
71
  }); // Output failed test as passed due TC don't support retry mechanic
87
72
  // https://teamcity-support.jetbrains.com/hc/en-us/community/posts/207216829-Count-test-as-successful-if-at-least-one-try-is-successful?page=1#community_comment_207394125
88
73
 
89
- reporterOptions.willRetry ? console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`) : console.log(`##teamcity[testFailed name='${this.escape(test.title)}' message='${this.escape(error.message)}' details='${this.escape((_error$stack2 = error.stack) !== null && _error$stack2 !== void 0 ? _error$stack2 : '')}' flowId='${process.pid}']`);
74
+ reporterOptions.willRetry ? console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`) : console.log(`##teamcity[testFailed name='${this.escape(test.title)}' message='${this.escape(error.message)}' details='${this.escape(error.stack ?? '')}' flowId='${process.pid}']`);
90
75
  });
91
76
  runner.on('pending', test => console.log(`##teamcity[testIgnored name='${this.escape(test.title)}' message='${this.escape(typeof test.skipReason == 'boolean' ? test.title : test.skipReason)}' flowId='${process.pid}']`));
92
77
  runner.on('test end', test => console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`));
@@ -94,6 +79,11 @@ class TeamcityReporter extends _mocha.reporters.Base {
94
79
  runner.on('end', () => console.log(`##teamcity[testSuiteFinished name='${topLevelSuite}' flowId='${process.pid}']`));
95
80
  }
96
81
 
82
+ escape = str => {
83
+ if (!str) return '';
84
+ return str.toString() // eslint-disable-next-line no-control-regex
85
+ .replace(/\x1B.*?m/g, '').replace(/\|/g, '||').replace(/\n/g, '|n').replace(/\r/g, '|r').replace(/\[/g, '|[').replace(/\]/g, '|]').replace(/\u0085/g, '|x').replace(/\u2028/g, '|l').replace(/\u2029/g, '|p').replace(/'/g, "|'");
86
+ };
97
87
  }
98
88
 
99
89
  exports.TeamcityReporter = TeamcityReporter;
@@ -110,9 +100,7 @@ function getErrors(error, imageErrorToString, errorToString) {
110
100
  } else {
111
101
  const imageErrors = error.images;
112
102
  Object.keys(imageErrors).forEach(imageName => {
113
- var _imageErrors$imageNam;
114
-
115
- errors.push(imageErrorToString((_imageErrors$imageNam = imageErrors[imageName]) !== null && _imageErrors$imageNam !== void 0 ? _imageErrors$imageNam : '', imageName));
103
+ errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
116
104
  });
117
105
  }
118
106
 
@@ -57,9 +57,7 @@ async function getLastImageNumber(imageDir, imageName) {
57
57
  const actualImagesRegexp = new RegExp(`${imageName}-actual-(\\d+)\\.png`);
58
58
 
59
59
  try {
60
- var _await$readdirAsync$m;
61
-
62
- return (_await$readdirAsync$m = (await readdirAsync(imageDir)).map(filename => filename.replace(actualImagesRegexp, '$1')).map(Number).filter(x => !isNaN(x)).sort((a, b) => b - a)[0]) !== null && _await$readdirAsync$m !== void 0 ? _await$readdirAsync$m : 0;
60
+ return (await readdirAsync(imageDir)).map(filename => filename.replace(actualImagesRegexp, '$1')).map(Number).filter(x => !isNaN(x)).sort((a, b) => b - a)[0] ?? 0;
63
61
  } catch (_error) {
64
62
  return 0;
65
63
  }
@@ -77,8 +75,6 @@ async function worker(config, options) {
77
75
 
78
76
  function runHandler(failures) {
79
77
  if (failures > 0 && (error || Object.values(images).some(image => (image === null || image === void 0 ? void 0 : image.error) != null))) {
80
- var _error2;
81
-
82
78
  const isTimeout = hasTimeout(error) || Object.values(images).some(image => hasTimeout(image === null || image === void 0 ? void 0 : image.error));
83
79
  const payload = {
84
80
  status: 'failed',
@@ -88,7 +84,7 @@ async function worker(config, options) {
88
84
  isTimeout ? (0, _messages.emitWorkerMessage)({
89
85
  type: 'error',
90
86
  payload: {
91
- error: (_error2 = error) !== null && _error2 !== void 0 ? _error2 : 'Unknown error'
87
+ error: error ?? 'Unknown error'
92
88
  }
93
89
  }) : (0, _messages.emitTestMessage)({
94
90
  type: 'end',
@@ -119,20 +115,18 @@ async function worker(config, options) {
119
115
  }
120
116
 
121
117
  async function getExpected(assertImageName) {
122
- var _images$imageName;
123
-
124
118
  // context => [kind, story, test, browser]
125
119
  // rootSuite -> kindSuite -> storyTest -> [browsers.png]
126
120
  // rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
127
121
  const testPath = [...testScope];
128
- const imageName = assertImageName !== null && assertImageName !== void 0 ? assertImageName : testPath.pop();
122
+ const imageName = assertImageName ?? testPath.pop();
129
123
  const imagesMeta = [];
130
124
 
131
125
  const reportImageDir = _path.default.join(config.reportDir, ...testPath);
132
126
 
133
127
  const imageNumber = (await getLastImageNumber(reportImageDir, imageName)) + 1;
134
128
  const actualImageName = `${imageName}-actual-${imageNumber}.png`;
135
- const image = images[imageName] = (_images$imageName = images[imageName]) !== null && _images$imageName !== void 0 ? _images$imageName : {
129
+ const image = images[imageName] = images[imageName] ?? {
136
130
  actual: actualImageName
137
131
  };
138
132
 
@@ -195,14 +189,12 @@ async function worker(config, options) {
195
189
 
196
190
  }
197
191
  };
198
- const mocha = new _mocha.default(mochaOptions); // @ts-expect-error: @types/mocha has out-dated types
199
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
200
-
192
+ const mocha = new _mocha.default(mochaOptions);
201
193
  mocha.cleanReferencesAfterRun(false);
202
194
 
203
195
  _chai.default.use((0, _chaiImage.default)(getExpected, config.diffOptions));
204
196
 
205
- if ((await (0, _selenium.getBrowser)(config, options.browser)) == null) return;
197
+ if ((await (0, _selenium.getBrowser)(config, options)) == null) return;
206
198
  await (0, _helpers.addTestsFromStories)(mocha.suite, config, {
207
199
  browser: options.browser,
208
200
  watch: options.ui,
@@ -213,12 +205,12 @@ async function worker(config, options) {
213
205
  try {
214
206
  var _await$getBrowser;
215
207
 
216
- await ((_await$getBrowser = await (0, _selenium.getBrowser)(config, options.browser)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
208
+ await ((_await$getBrowser = await (0, _selenium.getBrowser)(config, options)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
217
209
  } catch (_) {
218
210
  await (0, _selenium.closeBrowser)();
219
211
  }
220
212
 
221
- const browser = await (0, _selenium.getBrowser)(config, options.browser);
213
+ const browser = await (0, _selenium.getBrowser)(config, options);
222
214
  const sessionId = (_await$browser$getSes = await (browser === null || browser === void 0 ? void 0 : browser.getSession())) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
223
215
  if (browser == null) return;
224
216
  const interval = setInterval(() => void browser.getCurrentUrl().then(url => {
@@ -250,9 +242,7 @@ async function worker(config, options) {
250
242
  if (!(reason instanceof Error)) {
251
243
  error = reason;
252
244
  } else if (!(0, _types.isImageError)(reason)) {
253
- var _reason$stack;
254
-
255
- error = (_reason$stack = reason.stack) !== null && _reason$stack !== void 0 ? _reason$stack : reason.message;
245
+ error = reason.stack ?? reason.message;
256
246
  } else if (typeof reason.images == 'string') {
257
247
  const image = images[testScope.slice(-1)[0]];
258
248
  if (image) image.error = reason.images;