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
@@ -1,16 +1,12 @@
1
- var _api$channel, _api$context;
2
-
3
1
  import { addons } from '@storybook/addons';
4
- import { getStorybookFramework, isStorybookVersionLessThan, resolveFromStorybook } from './helpers';
2
+ import { getStorybookFramework, resolveFromStorybook } from './helpers';
5
3
  const framework = getStorybookFramework(); // eslint-disable-next-line @typescript-eslint/no-var-requires
6
4
 
7
- const core = require(resolveFromStorybook('@storybook/core')); //@ts-expect-error: 6.2 use named exports
8
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
9
-
5
+ const core = require(resolveFromStorybook('@storybook/core-client'));
10
6
 
11
- const start = isStorybookVersionLessThan(6, 2) ? core.default.start : core.start;
7
+ const start = core.start;
12
8
  const api = start(() => void 0);
13
- export const channel = isStorybookVersionLessThan(6, 4) ? (_api$channel = api.channel) !== null && _api$channel !== void 0 ? _api$channel : (_api$context = api.context) === null || _api$context === void 0 ? void 0 : _api$context.channel : addons.getChannel();
9
+ export const channel = addons.getChannel();
14
10
  export const clientApi = api.clientApi;
15
11
  export const forceReRender = api.forceReRender;
16
12
  export const storiesOf = (kind, m) => {
@@ -19,21 +15,8 @@ export const storiesOf = (kind, m) => {
19
15
  });
20
16
  };
21
17
  export const configure = (...args) => {
22
- if (isStorybookVersionLessThan(5, 2)) {
23
- //NOTE: Storybook <= 5.1 pass args as is
24
- //@ts-expect-error: ignore it
25
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
26
- return api.configApi.configure(...args);
27
- }
28
-
29
- if (isStorybookVersionLessThan(6)) {
30
- //NOTE: Storybook <= 5.3 pass `framework` as last argument
31
- //@ts-expect-error: ignore it
32
- return api.configure(...args, framework);
33
- } //NOTE Storybook 6.x pass `framework` as first argument
18
+ //NOTE Storybook 6.x pass `framework` as first argument
34
19
  //@ts-expect-error: ignore it
35
-
36
-
37
20
  return api.configure(framework, ...args);
38
21
  };
39
22
  export const addDecorator = clientApi.addDecorator;
@@ -7,7 +7,7 @@ export const storybookDirRef = {
7
7
  export const resolveFromStorybook = modulePath => resolveFrom(storybookDirRef.current, modulePath);
8
8
  export const resolveFromStorybookAddonDocs = modulePath => resolveFrom(resolveFromStorybook('@storybook/addon-docs'), modulePath);
9
9
  export const resolveFromStorybookBuilderWebpack4 = modulePath => resolveFrom(resolveFromStorybook('@storybook/builder-webpack4'), modulePath);
10
- export const resolveFromStorybookCore = modulePath => resolveFrom(resolveFromStorybook('@storybook/core'), modulePath);
10
+ export const resolveFromStorybookCoreClient = modulePath => resolveFrom(resolveFromStorybook('@storybook/core-client'), modulePath);
11
11
  export const resolveFromStorybookCoreServer = modulePath => resolveFrom(resolveFromStorybook('@storybook/core-server'), modulePath);
12
12
 
13
13
  const importFromStorybook = modulePath => import(resolveFromStorybook(modulePath));
@@ -35,32 +35,24 @@ export function getStorybookVersion() {
35
35
  // eslint-disable-next-line @typescript-eslint/no-var-requires
36
36
  const {
37
37
  version
38
- } = require(resolveFromStorybook('@storybook/core/package.json'));
38
+ } = require(resolveFromStorybook('@storybook/core-server/package.json'));
39
39
 
40
40
  return version;
41
41
  }
42
42
  export function isStorybookVersionLessThan(major, minor) {
43
- var _process$env$__CREEVE;
44
-
45
- const [sbMajor, sbMinor] = ((_process$env$__CREEVE = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE !== void 0 ? _process$env$__CREEVE : getStorybookVersion()).split('.');
43
+ const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
46
44
  return Number(sbMajor) < major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) < minor;
47
45
  }
48
46
  export function isStorybookVersionGreaterThan(major, minor) {
49
- var _process$env$__CREEVE2;
50
-
51
- const [sbMajor, sbMinor] = ((_process$env$__CREEVE2 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE2 !== void 0 ? _process$env$__CREEVE2 : getStorybookVersion()).split('.');
47
+ const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
52
48
  return Number(sbMajor) > major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) > minor;
53
49
  }
54
50
  export function isStorybookVersion(major, minor) {
55
- var _process$env$__CREEVE3;
56
-
57
- const [sbMajor, sbMinor] = ((_process$env$__CREEVE3 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE3 !== void 0 ? _process$env$__CREEVE3 : getStorybookVersion()).split('.');
51
+ const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
58
52
  return Number(sbMajor) == major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) == minor;
59
53
  }
60
54
  export function getStorybookFramework() {
61
- var _process$env$__CREEVE4;
62
-
63
- const framework = (_process$env$__CREEVE4 = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__) !== null && _process$env$__CREEVE4 !== void 0 ? _process$env$__CREEVE4 : supportedFrameworks.find(framework => {
55
+ const framework = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__ ?? supportedFrameworks.find(framework => {
64
56
  try {
65
57
  return require.resolve(resolveFromStorybook(`@storybook/${framework}`));
66
58
  } catch (_) {
@@ -81,8 +73,8 @@ export async function importStorybookConfig() {
81
73
  try {
82
74
  return storybookConfigRef.current = (await import(require.resolve(configPath))).default;
83
75
  } catch (_) {
84
- const storybookUtilsPath = isStorybookVersionLessThan(6, 2) ? '@storybook/core/dist/server/utils' : '@storybook/core-common/dist/cjs/utils';
85
- const serverRequireModule = isStorybookVersionLessThan(6, 2) ? 'server-require' : 'interpret-require'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
76
+ const storybookUtilsPath = '@storybook/core-common/dist/cjs/utils';
77
+ const serverRequireModule = 'interpret-require'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
86
78
 
87
79
  const {
88
80
  getInterpretedFile
@@ -91,16 +83,15 @@ export async function importStorybookConfig() {
91
83
  const {
92
84
  default: serverRequireFallback,
93
85
  serverRequire = serverRequireFallback
94
- } = await import(resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
86
+ } = await import(resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
95
87
 
96
- const mainConfigFile = isStorybookVersionLessThan(6, 1) ? configPath : // eslint-disable-next-line @typescript-eslint/no-unsafe-call
97
- getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
88
+ const mainConfigFile = getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
98
89
 
99
90
  return storybookConfigRef.current = serverRequire(mainConfigFile);
100
91
  }
101
92
  }
102
93
  export async function isCSFv3Enabled() {
103
- var _await$importStoryboo, _await$importStoryboo2, _await$importStoryboo3;
94
+ var _await$importStoryboo, _await$importStoryboo2;
104
95
 
105
- return (_await$importStoryboo = (_await$importStoryboo2 = await importStorybookConfig()) === null || _await$importStoryboo2 === void 0 ? void 0 : (_await$importStoryboo3 = _await$importStoryboo2.features) === null || _await$importStoryboo3 === void 0 ? void 0 : _await$importStoryboo3.previewCsfV3) !== null && _await$importStoryboo !== void 0 ? _await$importStoryboo : false;
96
+ return ((_await$importStoryboo = await importStorybookConfig()) === null || _await$importStoryboo === void 0 ? void 0 : (_await$importStoryboo2 = _await$importStoryboo.features) === null || _await$importStoryboo2 === void 0 ? void 0 : _await$importStoryboo2.previewCsfV3) ?? false;
106
97
  }
@@ -1,15 +1,12 @@
1
- import cluster, { isMaster } from 'cluster';
1
+ import cluster from 'cluster';
2
2
  import { loadStoriesFromBrowser } from '../../selenium';
3
3
  import { emitStoriesMessage, sendStoriesMessage, subscribeOn, subscribeOnWorker } from '../../messages';
4
- import { deserializeRawStories } from '../../../shared';
5
4
  import { isDefined } from '../../../types';
6
5
  import { logger } from '../../logger';
7
- export async function loadStories(_config, {
8
- port
9
- }, storiesListener) {
10
- if (isMaster) {
6
+ export const loadStories = async (_config, _options, storiesListener) => {
7
+ if (cluster.isPrimary) {
11
8
  return new Promise(resolve => {
12
- const worker = Object.values(cluster.workers).filter(isDefined).find(worker => worker.isConnected());
9
+ const worker = Object.values(cluster.workers ?? {}).filter(isDefined).find(worker => worker.isConnected());
13
10
 
14
11
  if (worker) {
15
12
  const unsubscribe = subscribeOnWorker(worker, 'stories', message => {
@@ -44,7 +41,7 @@ export async function loadStories(_config, {
44
41
  });
45
42
  if (message.type == 'update') storiesListener(new Map(message.payload));
46
43
  });
47
- const stories = deserializeRawStories(await loadStoriesFromBrowser(port));
44
+ const stories = await loadStoriesFromBrowser();
48
45
  const storiesWithOldTests = [];
49
46
  Object.values(stories).forEach(story => {
50
47
  var _parameters, _parameters$creevey;
@@ -58,4 +55,4 @@ export async function loadStories(_config, {
58
55
  });
59
56
  return stories;
60
57
  }
61
- }
58
+ };
@@ -1,12 +1,10 @@
1
1
  import chokidar from 'chokidar';
2
2
  import { loadStories as browserProvider } from './browser';
3
3
  import { logger } from '../../logger';
4
- import parse from '../../parser';
4
+ import parse from '../../testsFiles/parser';
5
5
  import { readDirRecursive } from '../../../server/utils';
6
6
  import { combineParameters } from '../../../shared';
7
- export async function loadStories(_config, {
8
- port
9
- }, storiesListener) {
7
+ export const loadStories = async (_config, _options, storiesListener) => {
10
8
  let creeveyParamsByStoryId = {};
11
9
 
12
10
  const mergeParamsFromTestsToStory = (story, creeveyParams) => {
@@ -15,9 +13,7 @@ export async function loadStories(_config, {
15
13
  }
16
14
  };
17
15
 
18
- const stories = await browserProvider(_config, {
19
- port
20
- }, updatedStoriesByFiles => {
16
+ const stories = await browserProvider(_config, {}, updatedStoriesByFiles => {
21
17
  Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
22
18
  storiesArray.forEach(story => {
23
19
  const creeveyParams = creeveyParamsByStoryId[story.id];
@@ -37,18 +33,19 @@ export async function loadStories(_config, {
37
33
  mergeParamsFromTestsToStory(story, creeveyParamsByStoryId[storyId]);
38
34
  });
39
35
  return stories;
40
- }
36
+ };
41
37
 
42
- function parseParams(config, listener) {
43
- if (!config.testDir) {
38
+ async function parseParams(config, listener) {
39
+ if (!config.testsDir) {
44
40
  return Promise.resolve({});
45
41
  }
46
42
 
47
- const testFiles = readDirRecursive(config.testDir).filter(file => {
48
- var _config$testRegex;
43
+ const testFiles = readDirRecursive(config.testsDir).filter(file => {
44
+ var _config$testsRegex;
49
45
 
50
- return (_config$testRegex = config.testRegex) === null || _config$testRegex === void 0 ? void 0 : _config$testRegex.test(file);
46
+ return (_config$testsRegex = config.testsRegex) === null || _config$testsRegex === void 0 ? void 0 : _config$testsRegex.test(file);
51
47
  });
48
+ await (await import('../../testsFiles/register')).default(config);
52
49
 
53
50
  if (listener) {
54
51
  chokidar.watch(testFiles).on('change', filePath => {
@@ -1,13 +1,12 @@
1
1
  /* eslint-disable @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/ban-ts-comment */
2
2
  import path from 'path';
3
- import { isWorker, isMaster } from 'cluster';
3
+ import cluster from 'cluster';
4
4
  import chokidar from 'chokidar';
5
5
  import { noop } from '../../../types';
6
6
  import { getCreeveyCache } from '../../utils';
7
7
  import { subscribeOn } from '../../messages';
8
- import { importStorybookClientLogger, importStorybookConfig, importStorybookCoreCommon, importStorybookCoreEvents, isStorybookVersionGreaterThan, isStorybookVersionLessThan } from '../helpers';
8
+ import { importStorybookClientLogger, importStorybookConfig, importStorybookCoreCommon, importStorybookCoreEvents } from '../helpers';
9
9
  import { logger } from '../../logger';
10
- import { denormalizeStoryParameters } from '../../../shared';
11
10
 
12
11
  async function initStorybookEnvironment() {
13
12
  // @ts-expect-error There is no @types/global-jsdom package
@@ -25,7 +24,7 @@ async function initStorybookEnvironment() {
25
24
  logger
26
25
  } = await importStorybookClientLogger(); // NOTE: Disable duplication warnings for >=6.2 storybook
27
26
 
28
- if (isWorker) logger.warn = noop; // NOTE: disable logger for 5.x storybook
27
+ if (cluster.isWorker) logger.warn = noop; // NOTE: disable logger for 5.x storybook
29
28
 
30
29
  logger.debug = noop;
31
30
  return import('../entry');
@@ -39,7 +38,7 @@ function watchStories(channel, watcher, initialFiles) {
39
38
  watcher.on('change', filePath => storiesByFiles.set(path.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
40
39
  watcher.on('unlink', filePath => storiesByFiles.set(path.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
41
40
  return data => {
42
- const stories = isStorybookVersionLessThan(6) || isStorybookVersionGreaterThan(6, 3) ? data.stories : denormalizeStoryParameters(data);
41
+ const stories = data.stories;
43
42
  const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
44
43
  const addedFiles = Array.from(files).filter(filePath => !watchingFiles.has(filePath));
45
44
  const removedFiles = Array.from(watchingFiles).filter(filePath => !files.has(filePath));
@@ -105,7 +104,7 @@ async function loadStoriesDirectly(config, {
105
104
  stories
106
105
  } = await importStorybookConfig();
107
106
  const contexts = stories.map(entry => {
108
- const normalizedEntry = isStorybookVersionLessThan(6, 4) ? entry : normalizeStoriesEntry(entry, {
107
+ const normalizedEntry = normalizeStoriesEntry(entry, {
109
108
  configDir: config.storybookDir,
110
109
  workingDir: process.cwd()
111
110
  });
@@ -154,7 +153,7 @@ async function loadStoriesDirectly(config, {
154
153
  try {
155
154
  configure(contexts.map(ctx => ctx()), module, false);
156
155
  } catch (error) {
157
- if (isMaster) logger.error(error);
156
+ if (cluster.isPrimary) logger.error(error);
158
157
  }
159
158
  }
160
159
 
@@ -170,10 +169,10 @@ async function loadStoriesDirectly(config, {
170
169
  } // TODO Do we need to support multiple storybooks here?
171
170
 
172
171
 
173
- export async function loadStories(config, {
172
+ export const loadStories = async (config, {
174
173
  watch,
175
174
  debug
176
- }, storiesListener) {
175
+ }, storiesListener) => {
177
176
  const storybookApi = await initStorybookEnvironment();
178
177
  const Events = await importStorybookCoreEvents();
179
178
  const {
@@ -187,7 +186,7 @@ export async function loadStories(config, {
187
186
  });
188
187
  const loadPromise = new Promise(resolve => {
189
188
  channel.once(Events.SET_STORIES, data => {
190
- const stories = isStorybookVersionLessThan(6) || isStorybookVersionGreaterThan(6, 3) ? data.stories : denormalizeStoryParameters(data);
189
+ const stories = data.stories;
191
190
  const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
192
191
  if (watcher) channel.on(Events.SET_STORIES, watchStories(channel, watcher, files));
193
192
  resolve(stories);
@@ -198,7 +197,7 @@ export async function loadStories(config, {
198
197
  debug
199
198
  });
200
199
  return loadPromise;
201
- }
200
+ };
202
201
  export async function extractStoriesData(config, {
203
202
  watch,
204
203
  debug
@@ -1,19 +1,6 @@
1
1
  import { toId, storyNameFromExport } from '@storybook/csf';
2
2
  export default async function parse(files) {
3
- result = {}; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
4
-
5
- (await import('@babel/register')).default({
6
- babelrc: false,
7
- rootMode: 'upward-optional',
8
- ignore: [/node_modules/],
9
- extensions: ['.js', '.jsx', '.ts', '.tsx'],
10
- plugins: [['@babel/plugin-transform-runtime']],
11
- presets: ['@babel/preset-typescript', ['@babel/preset-env', {
12
- targets: {
13
- node: '10'
14
- }
15
- }]]
16
- });
3
+ result = {};
17
4
  await Promise.all(files.map(async file => import(file)));
18
5
  return result;
19
6
  }
@@ -0,0 +1,31 @@
1
+ import { addHook } from 'pirates';
2
+ import { getTsconfig } from 'get-tsconfig';
3
+ export default async function register(config) {
4
+ addHook(() => '', {
5
+ exts: ['.jpg', '.jpeg', '.png', '.gif', '.eot', '.otf', '.svg', '.ttf', '.woff', '.woff2', '.css', '.less', '.scss', '.styl'],
6
+ ignoreNodeModules: false
7
+ });
8
+ const {
9
+ path: tsConfigPath
10
+ } = getTsconfig(config.tsConfig) || {}; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
11
+
12
+ (await import('@babel/register')).default(config.babelOptions({
13
+ babelrc: false,
14
+ rootMode: 'upward-optional',
15
+ ignore: [/node_modules/],
16
+ extensions: ['.js', '.jsx', '.ts', '.tsx'],
17
+ parserOpts: {
18
+ sourceType: 'module',
19
+ plugins: ['jsx', 'typescript']
20
+ },
21
+ presets: ['@babel/preset-typescript', ['@babel/preset-env', {
22
+ targets: {
23
+ node: '10'
24
+ },
25
+ modules: 'commonjs'
26
+ }]],
27
+ plugins: [['@babel/plugin-transform-runtime'], ...(tsConfigPath ? [['babel-plugin-tsconfig-paths', {
28
+ tsconfig: tsConfigPath
29
+ }]] : [])]
30
+ })); // (await import('ts-node')).register({ project: tsConfigPath, transpileOnly: true });
31
+ }
@@ -15,11 +15,7 @@ function tryToLoadTestsData(filename) {
15
15
  const actualRegex = /^(.*)-actual-(\d+)\.png$/i;
16
16
 
17
17
  function approve(dirents, srcPath, dstPath, testPaths, isMatch) {
18
- dirents.filter(dirent => dirent.isFile()).map(dirent => actualRegex.exec(dirent.name)).filter(isDefined).filter(([fileName, imageName]) => !testPaths || testPaths.find(([token]) => token == imageName) && isMatch(path.join(srcPath, fileName))).reduce((images, [, imageName, retry]) => {
19
- var _images$get;
20
-
21
- return Number(retry) > ((_images$get = images.get(imageName)) !== null && _images$get !== void 0 ? _images$get : -1) ? images.set(imageName, Number(retry)) : images;
22
- }, new Map()).forEach((retry, imageName) => {
18
+ dirents.filter(dirent => dirent.isFile()).map(dirent => actualRegex.exec(dirent.name)).filter(isDefined).filter(([fileName, imageName]) => !testPaths || testPaths.find(([token]) => token == imageName) && isMatch(path.join(srcPath, fileName))).reduce((images, [, imageName, retry]) => Number(retry) > (images.get(imageName) ?? -1) ? images.set(imageName, Number(retry)) : images, new Map()).forEach((retry, imageName) => {
23
19
  mkdirSync(dstPath, {
24
20
  recursive: true
25
21
  });
@@ -20,38 +20,29 @@ export function shouldSkip(browser, meta, skipOptions, test) {
20
20
  return skipOptions;
21
21
  }
22
22
 
23
- if (Array.isArray(skipOptions)) {
24
- for (const skip of skipOptions) {
25
- const reason = shouldSkip(browser, meta, skip, test);
26
- if (reason) return reason;
27
- }
28
-
29
- return false;
23
+ for (const skipKey in skipOptions) {
24
+ const reason = shouldSkipByOption(browser, meta, skipOptions[skipKey], skipKey, test);
25
+ if (reason) return reason;
30
26
  }
31
27
 
32
- let hasSkipOptionKeys = false;
33
-
34
- for (const skipKey in skipOptions) {
35
- if (skipOptionKeys.includes(skipKey)) {
36
- hasSkipOptionKeys = true;
37
- continue;
28
+ return false;
29
+ }
30
+ export function shouldSkipByOption(browser, meta, skipOption, reason, test) {
31
+ if (Array.isArray(skipOption)) {
32
+ for (const skip of skipOption) {
33
+ const result = shouldSkipByOption(browser, meta, skip, reason, test);
34
+ if (result) return result;
38
35
  }
39
36
 
40
- const reason = shouldSkip(browser, meta, {
41
- reason: skipKey,
42
- ...skipOptions[skipKey]
43
- }, test);
44
- if (reason) return reason;
37
+ return false;
45
38
  }
46
39
 
47
- if (!hasSkipOptionKeys) return false;
48
40
  const {
49
41
  in: browsers,
50
42
  kinds,
51
43
  stories,
52
- tests,
53
- reason = true
54
- } = skipOptions;
44
+ tests
45
+ } = skipOption;
55
46
  const {
56
47
  kind,
57
48
  story
@@ -64,7 +55,7 @@ export function shouldSkip(browser, meta, skipOptions, test) {
64
55
  }
65
56
  export async function shutdownWorkers() {
66
57
  isShuttingDown.current = true;
67
- await Promise.all(Object.values(cluster.workers).filter(isDefined).filter(worker => worker.isConnected()).map(worker => new Promise(resolve => {
58
+ await Promise.all(Object.values(cluster.workers ?? {}).filter(isDefined).filter(worker => worker.isConnected()).map(worker => new Promise(resolve => {
68
59
  const timeout = setTimeout(() => worker.kill(), 10000);
69
60
  worker.on('exit', () => {
70
61
  clearTimeout(timeout);
@@ -96,27 +87,23 @@ export function testsToImages(tests) {
96
87
  storyPath,
97
88
  results
98
89
  }) => {
99
- var _results$slice$0$imag, _results$slice$;
90
+ var _results$slice$;
100
91
 
101
- 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(isDefined).join('/')}.png`);
92
+ 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(isDefined).join('/')}.png`);
102
93
  })));
103
94
  } // https://tuhrig.de/how-to-know-you-are-inside-a-docker-container/
104
95
 
105
96
  export const isInsideDocker = existsSync('/proc/1/cgroup') && /docker/.test(readFileSync('/proc/1/cgroup', 'utf8'));
106
97
  export const downloadBinary = (downloadUrl, destination) => new Promise((resolve, reject) => get(downloadUrl, response => {
107
- var _response$statusCode2;
108
-
109
98
  if (response.statusCode == 302) {
110
- var _response$statusCode;
111
-
112
99
  const {
113
100
  location
114
101
  } = response.headers;
115
- if (!location) return reject(new Error(`Couldn't download selenoid. Status code: ${(_response$statusCode = response.statusCode) !== null && _response$statusCode !== void 0 ? _response$statusCode : 'UNKNOWN'}`));
102
+ if (!location) return reject(new Error(`Couldn't download selenoid. Status code: ${response.statusCode ?? 'UNKNOWN'}`));
116
103
  return resolve(downloadBinary(location, destination));
117
104
  }
118
105
 
119
- 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'}`));
106
+ if (response.statusCode != 200) return reject(new Error(`Couldn't download selenoid. Status code: ${response.statusCode ?? 'UNKNOWN'}`));
120
107
  const fileStream = createWriteStream(destination);
121
108
  response.pipe(fileStream);
122
109
  fileStream.on('finish', () => {
@@ -1,5 +1,3 @@
1
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
-
3
1
  import chalk from 'chalk';
4
2
  import { reporters } from 'mocha';
5
3
  import prefix from 'loglevel-plugin-prefix';
@@ -26,31 +24,18 @@ export class CreeveyReporter extends reporters.Base {
26
24
  });
27
25
  runner.on('test', test => testLogger.warn(chalk.cyan(test.titlePath().join('/'))));
28
26
  runner.on('pass', test => testLogger.info(chalk.cyan(test.titlePath().join('/'))));
29
- runner.on('fail', (test, error) => testLogger.error(chalk.cyan(test.titlePath().join('/')), '\n ', getErrors(error, (error, imageName) => `${chalk.bold(imageName !== null && imageName !== void 0 ? imageName : topLevelSuite)}:${error}`, error => {
30
- var _error$stack;
31
-
32
- return `${(_error$stack = error.stack) !== null && _error$stack !== void 0 ? _error$stack : error.message}`;
33
- }).join('\n ')));
27
+ runner.on('fail', (test, error) => testLogger.error(chalk.cyan(test.titlePath().join('/')), '\n ', getErrors(error, (error, imageName) => `${chalk.bold(imageName ?? topLevelSuite)}:${error}`, error => `${error.stack ?? error.message}`).join('\n ')));
34
28
  }
35
29
 
36
30
  }
37
31
  export class TeamcityReporter extends reporters.Base {
38
32
  constructor(runner, options) {
39
33
  super(runner);
40
-
41
- _defineProperty(this, "escape", str => {
42
- if (!str) return '';
43
- return str.toString() // eslint-disable-next-line no-control-regex
44
- .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, "|'");
45
- });
46
-
47
34
  const topLevelSuite = this.escape(options.reporterOptions.topLevelSuite);
48
35
  const reporterOptions = options.reporterOptions;
49
36
  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}']`));
50
37
  runner.on('test', test => console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`));
51
38
  runner.on('fail', (test, error) => {
52
- var _error$stack2;
53
-
54
39
  Object.entries(reporterOptions.images).forEach(([name, image]) => {
55
40
  if (!image) return;
56
41
  const filePath = test.titlePath().concat(name == topLevelSuite ? [] : [topLevelSuite]).map(this.escape).join('/'); // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -66,7 +51,7 @@ export class TeamcityReporter extends reporters.Base {
66
51
  }); // Output failed test as passed due TC don't support retry mechanic
67
52
  // 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
68
53
 
69
- 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}']`);
54
+ 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}']`);
70
55
  });
71
56
  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}']`));
72
57
  runner.on('test end', test => console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`));
@@ -74,6 +59,11 @@ export class TeamcityReporter extends reporters.Base {
74
59
  runner.on('end', () => console.log(`##teamcity[testSuiteFinished name='${topLevelSuite}' flowId='${process.pid}']`));
75
60
  }
76
61
 
62
+ escape = str => {
63
+ if (!str) return '';
64
+ return str.toString() // eslint-disable-next-line no-control-regex
65
+ .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, "|'");
66
+ };
77
67
  }
78
68
 
79
69
  function getErrors(error, imageErrorToString, errorToString) {
@@ -88,9 +78,7 @@ function getErrors(error, imageErrorToString, errorToString) {
88
78
  } else {
89
79
  const imageErrors = error.images;
90
80
  Object.keys(imageErrors).forEach(imageName => {
91
- var _imageErrors$imageNam;
92
-
93
- errors.push(imageErrorToString((_imageErrors$imageNam = imageErrors[imageName]) !== null && _imageErrors$imageNam !== void 0 ? _imageErrors$imageNam : '', imageName));
81
+ errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
94
82
  });
95
83
  }
96
84
 
@@ -34,9 +34,7 @@ async function getLastImageNumber(imageDir, imageName) {
34
34
  const actualImagesRegexp = new RegExp(`${imageName}-actual-(\\d+)\\.png`);
35
35
 
36
36
  try {
37
- var _await$readdirAsync$m;
38
-
39
- 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;
37
+ return (await readdirAsync(imageDir)).map(filename => filename.replace(actualImagesRegexp, '$1')).map(Number).filter(x => !isNaN(x)).sort((a, b) => b - a)[0] ?? 0;
40
38
  } catch (_error) {
41
39
  return 0;
42
40
  }
@@ -54,8 +52,6 @@ export default async function worker(config, options) {
54
52
 
55
53
  function runHandler(failures) {
56
54
  if (failures > 0 && (error || Object.values(images).some(image => (image === null || image === void 0 ? void 0 : image.error) != null))) {
57
- var _error2;
58
-
59
55
  const isTimeout = hasTimeout(error) || Object.values(images).some(image => hasTimeout(image === null || image === void 0 ? void 0 : image.error));
60
56
  const payload = {
61
57
  status: 'failed',
@@ -65,7 +61,7 @@ export default async function worker(config, options) {
65
61
  isTimeout ? emitWorkerMessage({
66
62
  type: 'error',
67
63
  payload: {
68
- error: (_error2 = error) !== null && _error2 !== void 0 ? _error2 : 'Unknown error'
64
+ error: error ?? 'Unknown error'
69
65
  }
70
66
  }) : emitTestMessage({
71
67
  type: 'end',
@@ -96,18 +92,16 @@ export default async function worker(config, options) {
96
92
  }
97
93
 
98
94
  async function getExpected(assertImageName) {
99
- var _images$imageName;
100
-
101
95
  // context => [kind, story, test, browser]
102
96
  // rootSuite -> kindSuite -> storyTest -> [browsers.png]
103
97
  // rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
104
98
  const testPath = [...testScope];
105
- const imageName = assertImageName !== null && assertImageName !== void 0 ? assertImageName : testPath.pop();
99
+ const imageName = assertImageName ?? testPath.pop();
106
100
  const imagesMeta = [];
107
101
  const reportImageDir = path.join(config.reportDir, ...testPath);
108
102
  const imageNumber = (await getLastImageNumber(reportImageDir, imageName)) + 1;
109
103
  const actualImageName = `${imageName}-actual-${imageNumber}.png`;
110
- const image = images[imageName] = (_images$imageName = images[imageName]) !== null && _images$imageName !== void 0 ? _images$imageName : {
104
+ const image = images[imageName] = images[imageName] ?? {
111
105
  actual: actualImageName
112
106
  };
113
107
 
@@ -169,12 +163,10 @@ export default async function worker(config, options) {
169
163
 
170
164
  }
171
165
  };
172
- const mocha = new Mocha(mochaOptions); // @ts-expect-error: @types/mocha has out-dated types
173
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
174
-
166
+ const mocha = new Mocha(mochaOptions);
175
167
  mocha.cleanReferencesAfterRun(false);
176
168
  chai.use(chaiImage(getExpected, config.diffOptions));
177
- if ((await getBrowser(config, options.browser)) == null) return;
169
+ if ((await getBrowser(config, options)) == null) return;
178
170
  await addTestsFromStories(mocha.suite, config, {
179
171
  browser: options.browser,
180
172
  watch: options.ui,
@@ -185,12 +177,12 @@ export default async function worker(config, options) {
185
177
  try {
186
178
  var _await$getBrowser;
187
179
 
188
- await ((_await$getBrowser = await getBrowser(config, options.browser)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
180
+ await ((_await$getBrowser = await getBrowser(config, options)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
189
181
  } catch (_) {
190
182
  await closeBrowser();
191
183
  }
192
184
 
193
- const browser = await getBrowser(config, options.browser);
185
+ const browser = await getBrowser(config, options);
194
186
  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();
195
187
  if (browser == null) return;
196
188
  const interval = setInterval(() => void browser.getCurrentUrl().then(url => {
@@ -222,9 +214,7 @@ export default async function worker(config, options) {
222
214
  if (!(reason instanceof Error)) {
223
215
  error = reason;
224
216
  } else if (!isImageError(reason)) {
225
- var _reason$stack;
226
-
227
- error = (_reason$stack = reason.stack) !== null && _reason$stack !== void 0 ? _reason$stack : reason.message;
217
+ error = reason.stack ?? reason.message;
228
218
  } else if (typeof reason.images == 'string') {
229
219
  const image = images[testScope.slice(-1)[0]];
230
220
  if (image) image.error = reason.images;