creevey 0.7.39 → 0.8.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/CHANGELOG.md +33 -2
  2. package/README.md +9 -1
  3. package/addon/README.md +3 -0
  4. package/addon/package.json +4 -0
  5. package/docs/config.md +37 -5
  6. package/docs/grid.md +2 -1
  7. package/jest.config.js +6 -0
  8. package/lib/cjs/client/addon/Manager.js +124 -271
  9. package/lib/cjs/client/addon/components/Addon.js +17 -38
  10. package/lib/cjs/client/addon/components/Icons.js +11 -7
  11. package/lib/cjs/client/addon/components/Panel.js +17 -13
  12. package/lib/cjs/client/addon/components/TestSelect.js +11 -9
  13. package/lib/cjs/client/addon/components/Tools.js +21 -40
  14. package/lib/cjs/client/addon/decorator.js +1 -1
  15. package/lib/cjs/client/addon/index.js +31 -0
  16. package/lib/cjs/client/addon/preset.ie11.js +74 -0
  17. package/lib/cjs/client/addon/preset.js +13 -31
  18. package/lib/cjs/client/addon/readyForCapture.js +12 -0
  19. package/lib/cjs/client/addon/register.js +46 -70
  20. package/lib/cjs/client/addon/utils.js +5 -41
  21. package/lib/cjs/client/addon/withCreevey.js +221 -155
  22. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +26 -24
  23. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +22 -18
  24. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +44 -66
  25. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +38 -50
  26. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -45
  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 +140 -211
  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 +10 -15
  49. package/lib/cjs/server/config.js +5 -4
  50. package/lib/cjs/server/docker.js +3 -7
  51. package/lib/cjs/server/extract.js +7 -4
  52. package/lib/cjs/server/index.js +3 -5
  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 +3 -4
  56. package/lib/cjs/server/loaders/webpack/compile.js +33 -50
  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 +4 -4
  63. package/lib/cjs/server/master/master.js +1 -0
  64. package/lib/cjs/server/master/pool.js +38 -47
  65. package/lib/cjs/server/master/runner.js +53 -66
  66. package/lib/cjs/server/master/server.js +78 -4
  67. package/lib/cjs/server/messages.js +128 -18
  68. package/lib/cjs/server/selenium/browser.js +129 -55
  69. package/lib/cjs/server/selenium/selenoid.js +6 -8
  70. package/lib/cjs/server/stories.js +58 -84
  71. package/lib/cjs/server/storybook/entry.js +8 -22
  72. package/lib/cjs/server/storybook/helpers.js +22 -21
  73. package/lib/cjs/server/storybook/providers/browser.js +74 -0
  74. package/lib/cjs/server/storybook/{nodejs-provider.js → providers/nodejs.js} +44 -22
  75. package/lib/cjs/server/update.js +1 -5
  76. package/lib/cjs/server/utils.js +36 -15
  77. package/lib/cjs/server/worker/helpers.js +2 -6
  78. package/lib/cjs/server/worker/reporter.js +8 -20
  79. package/lib/cjs/server/worker/worker.js +21 -19
  80. package/lib/cjs/shared/index.js +101 -0
  81. package/lib/cjs/shared/serializeRegExp.js +42 -0
  82. package/lib/cjs/types.js +11 -6
  83. package/lib/esm/client/addon/Manager.js +124 -272
  84. package/lib/esm/client/addon/components/Addon.js +15 -34
  85. package/lib/esm/client/addon/components/Icons.js +10 -6
  86. package/lib/esm/client/addon/components/Panel.js +17 -13
  87. package/lib/esm/client/addon/components/TestSelect.js +11 -9
  88. package/lib/esm/client/addon/components/Tools.js +19 -36
  89. package/lib/esm/client/addon/decorator.js +1 -1
  90. package/lib/esm/client/addon/index.js +2 -0
  91. package/lib/esm/client/addon/preset.ie11.js +59 -0
  92. package/lib/esm/client/addon/preset.js +12 -26
  93. package/lib/esm/client/addon/readyForCapture.js +5 -0
  94. package/lib/esm/client/addon/register.js +42 -66
  95. package/lib/esm/client/addon/utils.js +3 -34
  96. package/lib/esm/client/addon/withCreevey.js +209 -156
  97. package/lib/esm/client/shared/components/ImagesView/BlendView.js +23 -20
  98. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +21 -17
  99. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +42 -63
  100. package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
  101. package/lib/esm/client/shared/components/ImagesView/SwapView.js +24 -42
  102. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
  103. package/lib/esm/client/shared/components/PageFooter/Paging.js +14 -18
  104. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +22 -18
  105. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +37 -60
  106. package/lib/esm/client/shared/components/ResultsPage.js +36 -64
  107. package/lib/esm/client/shared/creeveyClientApi.js +57 -84
  108. package/lib/esm/client/shared/helpers.js +124 -195
  109. package/lib/esm/client/shared/viewMode.js +4 -4
  110. package/lib/esm/creevey.js +3 -5
  111. package/lib/esm/index.js +2 -3
  112. package/lib/esm/server/config.js +4 -5
  113. package/lib/esm/server/docker.js +2 -2
  114. package/lib/esm/server/extract.js +6 -4
  115. package/lib/esm/server/index.js +3 -4
  116. package/lib/esm/server/loaders/babel/creevey-plugin.js +1 -3
  117. package/lib/esm/server/loaders/babel/helpers.js +12 -22
  118. package/lib/esm/server/loaders/babel/register.js +3 -4
  119. package/lib/esm/server/loaders/webpack/compile.js +34 -51
  120. package/lib/esm/server/loaders/webpack/creevey-loader.js +9 -10
  121. package/lib/esm/server/loaders/webpack/dummy-hmr.js +2 -6
  122. package/lib/esm/server/loaders/webpack/mdx-loader.js +2 -2
  123. package/lib/esm/server/loaders/webpack/start.js +1 -1
  124. package/lib/esm/server/master/index.js +4 -4
  125. package/lib/esm/server/master/master.js +1 -0
  126. package/lib/esm/server/master/pool.js +38 -49
  127. package/lib/esm/server/master/runner.js +53 -66
  128. package/lib/esm/server/master/server.js +76 -6
  129. package/lib/esm/server/messages.js +118 -14
  130. package/lib/esm/server/selenium/browser.js +126 -57
  131. package/lib/esm/server/selenium/selenoid.js +5 -7
  132. package/lib/esm/server/stories.js +60 -83
  133. package/lib/esm/server/storybook/entry.js +7 -24
  134. package/lib/esm/server/storybook/helpers.js +13 -16
  135. package/lib/esm/server/storybook/providers/browser.js +60 -0
  136. package/lib/esm/server/storybook/{nodejs-provider.js → providers/nodejs.js} +42 -21
  137. package/lib/esm/server/update.js +1 -5
  138. package/lib/esm/server/utils.js +28 -10
  139. package/lib/esm/server/worker/helpers.js +2 -6
  140. package/lib/esm/server/worker/reporter.js +8 -20
  141. package/lib/esm/server/worker/worker.js +22 -20
  142. package/lib/esm/shared/index.js +78 -0
  143. package/lib/esm/shared/serializeRegExp.js +24 -0
  144. package/lib/esm/types.js +3 -0
  145. package/lib/types/cli.d.ts +1 -1
  146. package/lib/types/client/addon/Manager.d.ts +37 -37
  147. package/lib/types/client/addon/components/Addon.d.ts +8 -8
  148. package/lib/types/client/addon/components/Icons.d.ts +7 -7
  149. package/lib/types/client/addon/components/Panel.d.ts +9 -9
  150. package/lib/types/client/addon/components/TestSelect.d.ts +8 -9
  151. package/lib/types/client/addon/components/Tools.d.ts +6 -6
  152. package/lib/types/client/addon/decorator.d.ts +1 -1
  153. package/lib/types/client/addon/index.d.ts +2 -0
  154. package/lib/types/client/addon/preset.d.ts +23 -22
  155. package/lib/types/client/addon/preset.ie11.d.ts +10 -0
  156. package/lib/types/client/addon/readyForCapture.d.ts +6 -0
  157. package/lib/types/client/addon/register.d.ts +3 -3
  158. package/lib/types/client/addon/utils.d.ts +3 -6
  159. package/lib/types/client/addon/withCreevey.d.ts +24 -13
  160. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -3
  161. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +24 -25
  162. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -3
  163. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -3
  164. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -3
  165. package/lib/types/client/shared/components/ImagesView/index.d.ts +5 -5
  166. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +8 -9
  167. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +7 -8
  168. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +12 -12
  169. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +16 -17
  170. package/lib/types/client/shared/components/ResultsPage.d.ts +18 -18
  171. package/lib/types/client/shared/creeveyClientApi.d.ts +9 -9
  172. package/lib/types/client/shared/helpers.d.ts +46 -46
  173. package/lib/types/client/shared/viewMode.d.ts +4 -4
  174. package/lib/types/client/web/CreeveyApp.d.ts +11 -12
  175. package/lib/types/client/web/CreeveyContext.d.ts +11 -11
  176. package/lib/types/client/web/CreeveyLoader.d.ts +2 -3
  177. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +19 -19
  178. package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +6 -6
  179. package/lib/types/client/web/CreeveyView/SideBar/SideBar.d.ts +14 -14
  180. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +12 -13
  181. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +33 -33
  182. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +7 -8
  183. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +10 -10
  184. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +9 -9
  185. package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +6 -6
  186. package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +1 -1
  187. package/lib/types/client/web/KeyboardEventsContext.d.ts +13 -13
  188. package/lib/types/client/web/index.d.ts +4 -4
  189. package/lib/types/creevey.d.ts +1 -1
  190. package/lib/types/index.d.ts +0 -1
  191. package/lib/types/server/config.d.ts +4 -4
  192. package/lib/types/server/docker.d.ts +7 -7
  193. package/lib/types/server/extract.d.ts +2 -2
  194. package/lib/types/server/index.d.ts +2 -2
  195. package/lib/types/server/loaders/babel/creevey-plugin.d.ts +1 -1
  196. package/lib/types/server/loaders/babel/helpers.d.ts +19 -19
  197. package/lib/types/server/loaders/babel/register.d.ts +5 -5
  198. package/lib/types/server/loaders/hooks/mdx.d.ts +1 -1
  199. package/lib/types/server/loaders/hooks/svelte.d.ts +1 -1
  200. package/lib/types/server/loaders/webpack/compile.d.ts +2 -2
  201. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -2
  202. package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +10 -10
  203. package/lib/types/server/loaders/webpack/mdx-loader.d.ts +6 -6
  204. package/lib/types/server/loaders/webpack/start.d.ts +1 -1
  205. package/lib/types/server/logger.d.ts +10 -6
  206. package/lib/types/server/master/api.d.ts +7 -7
  207. package/lib/types/server/master/index.d.ts +3 -3
  208. package/lib/types/server/master/master.d.ts +7 -6
  209. package/lib/types/server/master/pool.d.ts +31 -30
  210. package/lib/types/server/master/runner.d.ts +26 -26
  211. package/lib/types/server/master/server.d.ts +2 -2
  212. package/lib/types/server/messages.d.ts +29 -18
  213. package/lib/types/server/selenium/browser.d.ts +17 -14
  214. package/lib/types/server/selenium/index.d.ts +2 -2
  215. package/lib/types/server/selenium/selenoid.d.ts +3 -3
  216. package/lib/types/server/stories.d.ts +8 -9
  217. package/lib/types/server/storybook/entry.d.ts +17 -14
  218. package/lib/types/server/storybook/helpers.d.ts +24 -23
  219. package/lib/types/server/storybook/providers/browser.d.ts +4 -0
  220. package/lib/types/server/storybook/providers/nodejs.d.ts +9 -0
  221. package/lib/types/server/update.d.ts +2 -2
  222. package/lib/types/server/utils.d.ts +19 -18
  223. package/lib/types/server/worker/chai-image.d.ts +6 -6
  224. package/lib/types/server/worker/helpers.d.ts +8 -7
  225. package/lib/types/server/worker/index.d.ts +1 -1
  226. package/lib/types/server/worker/reporter.d.ts +8 -8
  227. package/lib/types/server/worker/worker.d.ts +4 -4
  228. package/lib/types/shared/index.d.ts +7 -0
  229. package/lib/types/shared/serializeRegExp.d.ts +9 -0
  230. package/lib/types/types.d.ts +487 -459
  231. package/package.json +121 -99
  232. package/preset/ie11.js +5 -0
  233. package/{preset.js → preset/index.js} +2 -2
  234. package/types/mdx.d.ts +3 -2
  235. package/types/mocha.d.ts +1 -0
  236. package/lib/cjs/client/web/1.js +0 -13
  237. package/lib/cjs/client/web/2.js +0 -1
  238. package/lib/types/server/storybook/nodejs-provider.d.ts +0 -5
  239. package/storybook-static/stories.json +0 -530
@@ -3,7 +3,6 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.flatStories = flatStories;
7
6
  exports.loadTestsFromStories = loadTestsFromStories;
8
7
  exports.saveStoriesJson = saveStoriesJson;
9
8
  exports.saveTestsJson = saveTestsJson;
@@ -20,16 +19,17 @@ var _types = require("../types");
20
19
 
21
20
  var _utils = require("./utils");
22
21
 
23
- var _helpers = require("./storybook/helpers");
24
-
25
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
23
 
27
24
  function storyTestFabric(delay, testFn) {
28
25
  return async function storyTest() {
29
- var _testFn$call;
30
-
31
26
  delay ? await new Promise(resolve => setTimeout(resolve, delay)) : void 0;
32
- await ((_testFn$call = testFn === null || testFn === void 0 ? void 0 : testFn.call(this)) !== null && _testFn$call !== void 0 ? _testFn$call : this.expect(await this.takeScreenshot()).to.matchImage());
27
+ await (testFn ? testFn.call(this) : this.screenshots.length > 0 ? this.expect(this.screenshots.reduce((screenshots, {
28
+ imageName,
29
+ screenshot
30
+ }, index) => ({ ...screenshots,
31
+ [imageName ?? `screenshot_${index}`]: screenshot
32
+ }), {})).to.matchImages() : this.expect(await this.takeScreenshot()).to.matchImage());
33
33
  };
34
34
  }
35
35
 
@@ -55,78 +55,63 @@ function createCreeveyTest(browser, storyMeta, skipOptions, testName) {
55
55
  };
56
56
  }
57
57
 
58
- function convertStories(browsers, stories) {
58
+ function convertStories(browserName, stories) {
59
59
  const tests = {};
60
60
  (Array.isArray(stories) ? stories : Object.values(stories)).forEach(storyMeta => {
61
61
  // TODO Skip docsOnly stories for now
62
62
  if (storyMeta.parameters.docsOnly) return;
63
- browsers.forEach(browserName => {
64
- var _storyMeta$parameters;
65
-
66
- const {
67
- delay: delayParam,
68
- tests: storyTests,
69
- skip
70
- } = (_storyMeta$parameters = storyMeta.parameters.creevey) !== null && _storyMeta$parameters !== void 0 ? _storyMeta$parameters : {};
71
- const delay = typeof delayParam == 'number' ? delayParam : delayParam !== null && delayParam !== void 0 && delayParam.for.includes(browserName) ? delayParam.ms : 0; // typeof tests === "undefined" => rootSuite -> kindSuite -> storyTest -> [browsers.png]
72
- // typeof tests === "function" => rootSuite -> kindSuite -> storyTest -> browser -> [images.png]
73
- // typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
74
- // typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> browser -> [images.png]
75
-
76
- if (!storyTests) {
77
- const test = createCreeveyTest(browserName, storyMeta, skip);
78
- tests[test.id] = { ...test,
79
- storyId: storyMeta.id,
80
- story: storyMeta,
81
- fn: storyTestFabric(delay)
82
- };
83
- return;
84
- }
63
+ const {
64
+ delay: delayParam,
65
+ tests: storyTests,
66
+ skip
67
+ } = storyMeta.parameters.creevey ?? {};
68
+ const delay = typeof delayParam == 'number' ? delayParam : delayParam !== null && delayParam !== void 0 && delayParam.for.includes(browserName) ? delayParam.ms : 0; // typeof tests === "undefined" => rootSuite -> kindSuite -> storyTest -> [browsers.png]
69
+ // typeof tests === "function" => rootSuite -> kindSuite -> storyTest -> browser -> [images.png]
70
+ // typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
71
+ // typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> browser -> [images.png]
72
+
73
+ if (!storyTests) {
74
+ const test = createCreeveyTest(browserName, storyMeta, skip);
75
+ tests[test.id] = { ...test,
76
+ storyId: storyMeta.id,
77
+ story: storyMeta,
78
+ fn: storyTestFabric(delay)
79
+ };
80
+ return;
81
+ }
85
82
 
86
- Object.entries(storyTests).forEach(([testName, testFn]) => {
87
- const test = createCreeveyTest(browserName, storyMeta, skip, testName);
88
- tests[test.id] = { ...test,
89
- storyId: storyMeta.id,
90
- story: storyMeta,
91
- fn: storyTestFabric(delay, testFn)
92
- };
93
- });
83
+ Object.entries(storyTests).forEach(([testName, testFn]) => {
84
+ const test = createCreeveyTest(browserName, storyMeta, skip, testName);
85
+ tests[test.id] = { ...test,
86
+ storyId: storyMeta.id,
87
+ story: storyMeta,
88
+ fn: storyTestFabric(delay, testFn)
89
+ };
94
90
  });
95
91
  });
96
92
  return tests;
97
- } // TODO use the storybook version, after the fix of skip option API
98
-
99
-
100
- function flatStories({
101
- globalParameters,
102
- kindParameters,
103
- stories
104
- }) {
105
- Object.values(stories).forEach(story => {
106
- // NOTE: Copy-paste merge parameters from storybook
107
- story.parameters = (0, _lodash.mergeWith)({}, globalParameters, kindParameters[story.kind], story.parameters, (objValue, srcValue) => Array.isArray(objValue) ? objValue.concat(srcValue) : undefined);
108
- });
109
- return stories;
110
93
  }
111
94
 
112
95
  async function loadTestsFromStories(browsers, provider, update) {
113
96
  const testIdsByFiles = new Map();
114
- const data = await provider(storiesByFiles => {
97
+ const stories = await provider(storiesByFiles => {
115
98
  const testsDiff = {};
116
- Array.from(storiesByFiles.entries()).forEach(([filename, stories]) => {
117
- var _testIdsByFiles$get$f, _testIdsByFiles$get;
118
-
119
- const tests = convertStories(browsers, stories);
120
- const changed = Object.keys(tests);
121
- const removed = (_testIdsByFiles$get$f = (_testIdsByFiles$get = testIdsByFiles.get(filename)) === null || _testIdsByFiles$get === void 0 ? void 0 : _testIdsByFiles$get.filter(testId => !tests[testId])) !== null && _testIdsByFiles$get$f !== void 0 ? _testIdsByFiles$get$f : [];
122
- if (changed.length == 0) testIdsByFiles.delete(filename);else testIdsByFiles.set(filename, changed);
123
- Object.assign(testsDiff, tests);
124
- removed.forEach(testId => testsDiff[testId] = undefined);
99
+ const tests = {};
100
+ browsers.forEach(browser => {
101
+ Array.from(storiesByFiles.entries()).forEach(([filename, stories]) => {
102
+ var _testIdsByFiles$get;
103
+
104
+ Object.assign(tests, convertStories(browser, stories));
105
+ const changed = Object.keys(tests);
106
+ const removed = ((_testIdsByFiles$get = testIdsByFiles.get(filename)) === null || _testIdsByFiles$get === void 0 ? void 0 : _testIdsByFiles$get.filter(testId => !tests[testId])) ?? [];
107
+ if (changed.length == 0) testIdsByFiles.delete(filename);else testIdsByFiles.set(filename, changed);
108
+ Object.assign(testsDiff, tests);
109
+ removed.forEach(testId => testsDiff[testId] = undefined);
110
+ });
125
111
  });
126
112
  update === null || update === void 0 ? void 0 : update(testsDiff);
127
113
  });
128
- const stories = (0, _helpers.isStorybookVersionLessThan)(6) ? data.stories : flatStories(data);
129
- const tests = convertStories(browsers, stories);
114
+ const tests = browsers.reduce((tests, browser) => Object.assign(tests, convertStories(browser, stories)), {});
130
115
  Object.values(tests).filter(_types.isDefined).forEach(({
131
116
  id,
132
117
  story: {
@@ -134,36 +119,25 @@ async function loadTestsFromStories(browsers, provider, update) {
134
119
  fileName
135
120
  }
136
121
  }
137
- }) => {
138
- var _testIdsByFiles$get2;
139
-
140
- return (// TODO Don't use filename as a key, due possible collisions if two require.context with same structure of modules are defined
141
- testIdsByFiles.set(fileName, [...((_testIdsByFiles$get2 = testIdsByFiles.get(fileName)) !== null && _testIdsByFiles$get2 !== void 0 ? _testIdsByFiles$get2 : []), id])
142
- );
143
- });
122
+ }) => // TODO Don't use filename as a key, due possible collisions if two require.context with same structure of modules are defined
123
+ testIdsByFiles.set(fileName, [...(testIdsByFiles.get(fileName) ?? []), id]));
144
124
  return tests;
145
125
  }
146
126
 
147
127
  function saveStoriesJson(storiesData, extract) {
148
- var _storiesData$stories;
149
-
150
- const outputDir = typeof extract == 'boolean' ? 'storybook-static' : extract;
151
-
152
- if (!(0, _helpers.isStorybookVersionLessThan)(6)) {
153
- // NOTE Copy-pasted from Storybook's `getStoriesJsonData` method
154
- const allowed = ['fileName', 'docsOnly', 'framework', '__id', '__isArgsStory'];
155
- storiesData.globalParameters = (0, _lodash.pick)(storiesData.globalParameters, allowed); // @ts-expect-error ignore error
128
+ const outputDir = typeof extract == 'boolean' ? 'storybook-static' : extract; // NOTE Copy-pasted from Storybook's `getStoriesJsonData` method
156
129
 
157
- storiesData.kindParameters = (0, _lodash.mapValues)(storiesData.kindParameters, v => (0, _lodash.pick)(v, allowed)); // @ts-expect-error ignore error
130
+ const allowed = ['fileName', 'docsOnly', 'framework', '__id', '__isArgsStory'];
131
+ storiesData.globalParameters = (0, _lodash.pick)(storiesData.globalParameters, allowed); // @ts-expect-error ignore error
158
132
 
159
- storiesData.stories = (0, _lodash.mapValues)(storiesData.stories, v => ({ ...(0, _lodash.pick)(v, ['id', 'name', 'kind', 'story']),
160
- parameters: (0, _lodash.pick)(v.parameters, allowed)
161
- }));
162
- } // TODO Fix args stories
133
+ storiesData.kindParameters = (0, _lodash.mapValues)(storiesData.kindParameters, v => (0, _lodash.pick)(v, allowed)); // @ts-expect-error ignore error
163
134
 
135
+ storiesData.stories = (0, _lodash.mapValues)(storiesData.stories, v => ({ ...(0, _lodash.pick)(v, ['id', 'name', 'kind', 'story']),
136
+ parameters: (0, _lodash.pick)(v.parameters, allowed)
137
+ })); // TODO Fix args stories
164
138
 
165
- (0, _utils.removeProps)(storiesData !== null && storiesData !== void 0 ? storiesData : {}, ['stories', () => true, 'parameters', '__isArgsStory']);
166
- Object.values((_storiesData$stories = storiesData === null || storiesData === void 0 ? void 0 : storiesData.stories) !== null && _storiesData$stories !== void 0 ? _storiesData$stories : {}).forEach(story => (0, _types.isObject)(story) && 'parameters' in story && (0, _types.isObject)(story.parameters) && delete story.parameters.__isArgsStory);
139
+ (0, _utils.removeProps)(storiesData ?? {}, ['stories', () => true, 'parameters', '__isArgsStory']);
140
+ Object.values((storiesData === null || storiesData === void 0 ? void 0 : storiesData.stories) ?? {}).forEach(story => (0, _types.isObject)(story) && 'parameters' in story && (0, _types.isObject)(story.parameters) && delete story.parameters.__isArgsStory);
167
141
  (0, _fs.mkdirSync)(outputDir, {
168
142
  recursive: true
169
143
  });
@@ -3,23 +3,21 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.raw = exports.getStorybook = exports.setAddon = exports.clearDecorators = exports.addParameters = exports.addDecorator = exports.configure = exports.storiesOf = exports.forceReRender = exports.clientApi = exports.channel = void 0;
6
+ exports.storiesOf = exports.setAddon = exports.raw = exports.getStorybook = exports.forceReRender = exports.configure = exports.clientApi = exports.clearDecorators = exports.channel = exports.addParameters = exports.addDecorator = void 0;
7
7
 
8
- var _helpers = require("./helpers");
8
+ var _addons = require("@storybook/addons");
9
9
 
10
- var _api$channel, _api$context;
10
+ var _helpers = require("./helpers");
11
11
 
12
12
  const framework = (0, _helpers.getStorybookFramework)(); // eslint-disable-next-line @typescript-eslint/no-var-requires
13
13
 
14
- const core = require((0, _helpers.resolveFromStorybook)('@storybook/core')); //@ts-expect-error: 6.2 use named exports
15
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
14
+ const core = require((0, _helpers.resolveFromStorybook)('@storybook/core'));
16
15
 
16
+ const start = core.start;
17
+ const api = start(() => void 0);
17
18
 
18
- const start = (0, _helpers.isStorybookVersionLessThan)(6, 2) ? core.default.start : core.start;
19
- const api = start(() => void 0); //@ts-expect-error: 6.x has { channel }, but 5.x has { context: { channel } }
20
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
19
+ const channel = _addons.addons.getChannel();
21
20
 
22
- const channel = (_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;
23
21
  exports.channel = channel;
24
22
  const clientApi = api.clientApi;
25
23
  exports.clientApi = clientApi;
@@ -35,20 +33,8 @@ const storiesOf = (kind, m) => {
35
33
  exports.storiesOf = storiesOf;
36
34
 
37
35
  const configure = (...args) => {
38
- if ((0, _helpers.isStorybookVersionLessThan)(5, 2)) {
39
- //NOTE: Storybook <= 5.1 pass args as is
40
- //@ts-expect-error: ignore it
41
- return api.configApi.configure(...args);
42
- }
43
-
44
- if ((0, _helpers.isStorybookVersionLessThan)(6)) {
45
- //NOTE: Storybook <= 5.3 pass `framework` as last argument
46
- //@ts-expect-error: ignore it
47
- return api.configure(...args, framework);
48
- } //NOTE Storybook 6.x pass `framework` as first argument
36
+ //NOTE Storybook 6.x pass `framework` as first argument
49
37
  //@ts-expect-error: ignore it
50
-
51
-
52
38
  return api.configure(framework, ...args);
53
39
  };
54
40
 
@@ -3,15 +3,18 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.getStorybookFramework = getStorybookFramework;
7
+ exports.getStorybookVersion = getStorybookVersion;
6
8
  exports.hasDocsAddon = hasDocsAddon;
7
9
  exports.hasSvelteCSFAddon = hasSvelteCSFAddon;
8
- exports.getStorybookVersion = getStorybookVersion;
9
- exports.isStorybookVersionLessThan = isStorybookVersionLessThan;
10
- exports.isStorybookVersion = isStorybookVersion;
11
- exports.getStorybookFramework = getStorybookFramework;
10
+ exports.importStorybookClientLogger = void 0;
12
11
  exports.importStorybookConfig = importStorybookConfig;
12
+ exports.importStorybookCoreEvents = exports.importStorybookCoreCommon = void 0;
13
13
  exports.isCSFv3Enabled = isCSFv3Enabled;
14
- exports.storybookConfigRef = exports.importStorybookCoreEvents = exports.importStorybookCoreCommon = exports.importStorybookClientLogger = exports.resolveFromStorybookCoreServer = exports.resolveFromStorybookCore = exports.resolveFromStorybookBuilderWebpack4 = exports.resolveFromStorybookAddonDocs = exports.resolveFromStorybook = exports.storybookDirRef = void 0;
14
+ exports.isStorybookVersion = isStorybookVersion;
15
+ exports.isStorybookVersionGreaterThan = isStorybookVersionGreaterThan;
16
+ exports.isStorybookVersionLessThan = isStorybookVersionLessThan;
17
+ exports.storybookDirRef = exports.storybookConfigRef = exports.resolveFromStorybookCoreServer = exports.resolveFromStorybookCore = exports.resolveFromStorybookBuilderWebpack4 = exports.resolveFromStorybookAddonDocs = exports.resolveFromStorybook = void 0;
15
18
 
16
19
  var _path = _interopRequireDefault(require("path"));
17
20
 
@@ -91,23 +94,22 @@ function getStorybookVersion() {
91
94
  }
92
95
 
93
96
  function isStorybookVersionLessThan(major, minor) {
94
- var _process$env$__CREEVE;
95
-
96
- const [sbMajor, sbMinor] = ((_process$env$__CREEVE = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE !== void 0 ? _process$env$__CREEVE : getStorybookVersion()).split('.');
97
+ const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
97
98
  return Number(sbMajor) < major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) < minor;
98
99
  }
99
100
 
100
- function isStorybookVersion(major, minor) {
101
- var _process$env$__CREEVE2;
101
+ function isStorybookVersionGreaterThan(major, minor) {
102
+ const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
103
+ return Number(sbMajor) > major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) > minor;
104
+ }
102
105
 
103
- const [sbMajor, sbMinor] = ((_process$env$__CREEVE2 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE2 !== void 0 ? _process$env$__CREEVE2 : getStorybookVersion()).split('.');
106
+ function isStorybookVersion(major, minor) {
107
+ const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
104
108
  return Number(sbMajor) == major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) == minor;
105
109
  }
106
110
 
107
111
  function getStorybookFramework() {
108
- var _process$env$__CREEVE3;
109
-
110
- const framework = (_process$env$__CREEVE3 = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__) !== null && _process$env$__CREEVE3 !== void 0 ? _process$env$__CREEVE3 : supportedFrameworks.find(framework => {
112
+ const framework = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__ ?? supportedFrameworks.find(framework => {
111
113
  try {
112
114
  return require.resolve(resolveFromStorybook(`@storybook/${framework}`));
113
115
  } catch (_) {
@@ -131,8 +133,8 @@ async function importStorybookConfig() {
131
133
  try {
132
134
  return storybookConfigRef.current = (await Promise.resolve(`${require.resolve(configPath)}`).then(s => _interopRequireWildcard(require(s)))).default;
133
135
  } catch (_) {
134
- const storybookUtilsPath = isStorybookVersionLessThan(6, 2) ? '@storybook/core/dist/server/utils' : '@storybook/core-common/dist/cjs/utils';
135
- const serverRequireModule = isStorybookVersionLessThan(6, 2) ? 'server-require' : 'interpret-require'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
136
+ const storybookUtilsPath = '@storybook/core-common/dist/cjs/utils';
137
+ const serverRequireModule = 'interpret-require'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
136
138
 
137
139
  const {
138
140
  getInterpretedFile
@@ -141,17 +143,16 @@ async function importStorybookConfig() {
141
143
  const {
142
144
  default: serverRequireFallback,
143
145
  serverRequire = serverRequireFallback
144
- } = await Promise.resolve(`${resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)}`).then(s => _interopRequireWildcard(require(s))); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
146
+ } = await Promise.resolve(`${resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)}`).then(s => _interopRequireWildcard(require(s))); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
145
147
 
146
- const mainConfigFile = isStorybookVersionLessThan(6, 1) ? configPath : // eslint-disable-next-line @typescript-eslint/no-unsafe-call
147
- getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
148
+ const mainConfigFile = getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
148
149
 
149
150
  return storybookConfigRef.current = serverRequire(mainConfigFile);
150
151
  }
151
152
  }
152
153
 
153
154
  async function isCSFv3Enabled() {
154
- var _await$importStoryboo, _await$importStoryboo2, _await$importStoryboo3;
155
+ var _await$importStoryboo, _await$importStoryboo2;
155
156
 
156
- 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;
157
+ 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;
157
158
  }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.loadStories = loadStories;
7
+
8
+ var _cluster = _interopRequireDefault(require("cluster"));
9
+
10
+ var _selenium = require("../../selenium");
11
+
12
+ var _messages = require("../../messages");
13
+
14
+ var _types = require("../../../types");
15
+
16
+ var _logger = require("../../logger");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ async function loadStories(_config, {
21
+ port
22
+ }, storiesListener) {
23
+ if (_cluster.default.isPrimary) {
24
+ return new Promise(resolve => {
25
+ const worker = Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).find(worker => worker.isConnected());
26
+
27
+ if (worker) {
28
+ const unsubscribe = (0, _messages.subscribeOnWorker)(worker, 'stories', message => {
29
+ if (message.type == 'set') {
30
+ const {
31
+ stories,
32
+ oldTests
33
+ } = message.payload;
34
+ if (oldTests.length > 0) _logger.logger.warn(`If you use browser stories provider of CSFv3 Storybook feature\n` + `Creevey will not load tests defined in story parameters from following stories:\n` + oldTests.join('\n'));
35
+ unsubscribe();
36
+ resolve(stories);
37
+ }
38
+ });
39
+ (0, _messages.sendStoriesMessage)(worker, {
40
+ type: 'get'
41
+ });
42
+ }
43
+
44
+ (0, _messages.subscribeOn)('stories', message => {
45
+ // TODO updates only one browser :(
46
+ if (message.type == 'update') storiesListener(new Map(message.payload));
47
+ });
48
+ });
49
+ } else {
50
+ (0, _messages.subscribeOn)('stories', message => {
51
+ if (message.type == 'get') (0, _messages.emitStoriesMessage)({
52
+ type: 'set',
53
+ payload: {
54
+ stories,
55
+ oldTests: storiesWithOldTests
56
+ }
57
+ });
58
+ if (message.type == 'update') storiesListener(new Map(message.payload));
59
+ });
60
+ const stories = await (0, _selenium.loadStoriesFromBrowser)(port);
61
+ const storiesWithOldTests = [];
62
+ Object.values(stories).forEach(story => {
63
+ var _parameters, _parameters$creevey;
64
+
65
+ if ((_parameters = story.parameters) !== null && _parameters !== void 0 && (_parameters$creevey = _parameters.creevey) !== null && _parameters$creevey !== void 0 && _parameters$creevey.tests) {
66
+ var _parameters2, _parameters2$creevey;
67
+
68
+ (_parameters2 = story.parameters) === null || _parameters2 === void 0 ? true : (_parameters2$creevey = _parameters2.creevey) === null || _parameters2$creevey === void 0 ? true : delete _parameters2$creevey.tests;
69
+ storiesWithOldTests.push(`${story.kind}/${story.name}`);
70
+ }
71
+ });
72
+ return stories;
73
+ }
74
+ }
@@ -3,25 +3,24 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.extractStoriesData = extractStoriesData;
6
7
  exports.loadStories = loadStories;
7
8
 
8
9
  var _path = _interopRequireDefault(require("path"));
9
10
 
10
- var _cluster = require("cluster");
11
+ var _cluster = _interopRequireDefault(require("cluster"));
11
12
 
12
13
  var _chokidar = _interopRequireDefault(require("chokidar"));
13
14
 
14
- var _types = require("../../types");
15
+ var _types = require("../../../types");
15
16
 
16
- var _utils = require("../utils");
17
+ var _utils = require("../../utils");
17
18
 
18
- var _messages = require("../messages");
19
+ var _messages = require("../../messages");
19
20
 
20
- var _helpers = require("./helpers");
21
+ var _helpers = require("../helpers");
21
22
 
22
- var _logger = require("../logger");
23
-
24
- var _stories = require("../stories");
23
+ var _logger = require("../../logger");
25
24
 
26
25
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
26
 
@@ -30,7 +29,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
30
29
  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; }
31
30
 
32
31
  async function initStorybookEnvironment() {
33
- // @ts-ignore
32
+ // @ts-expect-error There is no @types/global-jsdom package
34
33
  (await Promise.resolve().then(() => _interopRequireWildcard(require('global-jsdom')))).default(undefined, {
35
34
  url: 'http://localhost'
36
35
  }); // NOTE Cutoff `jsdom` part from userAgent, because storybook check enviroment and create events channel if runs in browser
@@ -45,10 +44,10 @@ async function initStorybookEnvironment() {
45
44
  logger
46
45
  } = await (0, _helpers.importStorybookClientLogger)(); // NOTE: Disable duplication warnings for >=6.2 storybook
47
46
 
48
- 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
49
48
 
50
49
  logger.debug = _types.noop;
51
- return Promise.resolve().then(() => _interopRequireWildcard(require('./entry')));
50
+ return Promise.resolve().then(() => _interopRequireWildcard(require('../entry')));
52
51
  }
53
52
 
54
53
  function watchStories(channel, watcher, initialFiles) {
@@ -59,7 +58,7 @@ function watchStories(channel, watcher, initialFiles) {
59
58
  watcher.on('change', filePath => storiesByFiles.set(_path.default.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
60
59
  watcher.on('unlink', filePath => storiesByFiles.set(_path.default.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
61
60
  return data => {
62
- const stories = (0, _helpers.isStorybookVersionLessThan)(6) ? data.stories : (0, _stories.flatStories)(data);
61
+ const stories = data.stories;
63
62
  const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
64
63
  const addedFiles = Array.from(files).filter(filePath => !watchingFiles.has(filePath));
65
64
  const removedFiles = Array.from(watchingFiles).filter(filePath => !files.has(filePath));
@@ -104,13 +103,14 @@ async function loadStoriesDirectly(config, {
104
103
  debug
105
104
  }) {
106
105
  const {
107
- toRequireContext
106
+ toRequireContext,
107
+ normalizeStoriesEntry
108
108
  } = await (0, _helpers.importStorybookCoreCommon)();
109
109
  const {
110
110
  addParameters,
111
111
  configure
112
- } = await Promise.resolve().then(() => _interopRequireWildcard(require('./entry')));
113
- const requireContext = await (await Promise.resolve().then(() => _interopRequireWildcard(require('../loaders/babel/register')))).default(config, debug);
112
+ } = await Promise.resolve().then(() => _interopRequireWildcard(require('../entry')));
113
+ const requireContext = await (await Promise.resolve().then(() => _interopRequireWildcard(require('../../loaders/babel/register')))).default(config, debug);
114
114
 
115
115
  const preview = (() => {
116
116
  try {
@@ -123,12 +123,16 @@ async function loadStoriesDirectly(config, {
123
123
  const {
124
124
  stories
125
125
  } = await (0, _helpers.importStorybookConfig)();
126
- const contexts = stories.map(input => {
126
+ const contexts = stories.map(entry => {
127
+ const normalizedEntry = normalizeStoriesEntry(entry, {
128
+ configDir: config.storybookDir,
129
+ workingDir: process.cwd()
130
+ });
127
131
  const {
128
132
  path: storiesPath,
129
133
  recursive,
130
134
  match
131
- } = toRequireContext(input);
135
+ } = toRequireContext(normalizedEntry);
132
136
  watcher === null || watcher === void 0 ? void 0 : watcher.add(_path.default.resolve(config.storybookDir, storiesPath));
133
137
  return () => requireContext(storiesPath, recursive, new RegExp(match));
134
138
  });
@@ -169,7 +173,7 @@ async function loadStoriesDirectly(config, {
169
173
  try {
170
174
  configure(contexts.map(ctx => ctx()), module, false);
171
175
  } catch (error) {
172
- if (_cluster.isMaster) _logger.logger.error(error);
176
+ if (_cluster.default.isPrimary) _logger.logger.error(error);
173
177
  }
174
178
  }
175
179
 
@@ -182,7 +186,8 @@ async function loadStoriesDirectly(config, {
182
186
  void startStorybook();
183
187
  });
184
188
  void startStorybook();
185
- }
189
+ } // TODO Do we need to support multiple storybooks here?
190
+
186
191
 
187
192
  async function loadStories(config, {
188
193
  watch,
@@ -195,16 +200,16 @@ async function loadStories(config, {
195
200
  } = storybookApi;
196
201
  channel.removeAllListeners(Events.CURRENT_STORY_WAS_SET);
197
202
  channel.on('storiesUpdated', storiesListener);
198
- let watcher = null;
203
+ let watcher;
199
204
  if (watch) watcher = _chokidar.default.watch([], {
200
205
  ignoreInitial: true
201
206
  });
202
207
  const loadPromise = new Promise(resolve => {
203
208
  channel.once(Events.SET_STORIES, data => {
204
- const stories = (0, _helpers.isStorybookVersionLessThan)(6) ? data.stories : (0, _stories.flatStories)(data);
209
+ const stories = data.stories;
205
210
  const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
206
211
  if (watcher) channel.on(Events.SET_STORIES, watchStories(channel, watcher, files));
207
- resolve(data);
212
+ resolve(stories);
208
213
  });
209
214
  });
210
215
  if (config.useWebpackToExtractTests) loadStoriesFromBundle(watch);else void loadStoriesDirectly(config, {
@@ -212,4 +217,21 @@ async function loadStories(config, {
212
217
  debug
213
218
  });
214
219
  return loadPromise;
220
+ }
221
+
222
+ async function extractStoriesData(config, {
223
+ watch,
224
+ debug
225
+ }) {
226
+ const storybookApi = await initStorybookEnvironment();
227
+ const Events = await (0, _helpers.importStorybookCoreEvents)();
228
+ const {
229
+ channel
230
+ } = storybookApi;
231
+ channel.removeAllListeners(Events.CURRENT_STORY_WAS_SET);
232
+ const loadPromise = new Promise(resolve => channel.once(Events.SET_STORIES, resolve));
233
+ if (config.useWebpackToExtractTests) loadStoriesFromBundle(watch);else void loadStoriesDirectly(config, {
234
+ debug
235
+ });
236
+ return loadPromise;
215
237
  }
@@ -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
  });