creevey 0.9.1 → 0.10.0-beta.0

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 (259) hide show
  1. package/chromatic.config.json +5 -0
  2. package/dist/client/addon/components/Addon.d.ts +1 -0
  3. package/dist/client/addon/components/Addon.js.map +1 -1
  4. package/dist/client/addon/components/Icons.d.ts +1 -0
  5. package/dist/client/addon/components/Icons.js.map +1 -1
  6. package/dist/client/addon/components/Panel.d.ts +1 -0
  7. package/dist/client/addon/components/Panel.js.map +1 -1
  8. package/dist/client/addon/components/TestSelect.d.ts +1 -0
  9. package/dist/client/addon/components/TestSelect.js +4 -3
  10. package/dist/client/addon/components/TestSelect.js.map +1 -1
  11. package/dist/client/addon/components/Tools.d.ts +1 -0
  12. package/dist/client/addon/components/Tools.js +7 -8
  13. package/dist/client/addon/components/Tools.js.map +1 -1
  14. package/dist/client/addon/controller.d.ts +1 -1
  15. package/dist/client/addon/controller.js.map +1 -1
  16. package/dist/client/addon/decorator.d.ts +1 -1
  17. package/dist/client/addon/manager.js +3 -2
  18. package/dist/client/addon/manager.js.map +1 -1
  19. package/dist/client/addon/preview.d.ts +1 -1
  20. package/dist/client/addon/withCreevey.d.ts +6 -8
  21. package/dist/client/addon/withCreevey.js +21 -19
  22. package/dist/client/addon/withCreevey.js.map +1 -1
  23. package/dist/client/shared/components/ImagesView/BlendView.d.ts +1 -1
  24. package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
  25. package/dist/client/shared/components/ImagesView/ImagesView.d.ts +1 -0
  26. package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -1
  27. package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
  28. package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
  29. package/dist/client/shared/components/ImagesView/SlideView.d.ts +1 -1
  30. package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
  31. package/dist/client/shared/components/ImagesView/SwapView.d.ts +1 -1
  32. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
  33. package/dist/client/shared/components/PageFooter/PageFooter.d.ts +1 -0
  34. package/dist/client/shared/components/PageFooter/PageFooter.js +1 -1
  35. package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -1
  36. package/dist/client/shared/components/PageFooter/Paging.d.ts +2 -2
  37. package/dist/client/shared/components/PageFooter/Paging.js +8 -6
  38. package/dist/client/shared/components/PageFooter/Paging.js.map +1 -1
  39. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
  40. package/dist/client/shared/components/PageHeader/PageHeader.d.ts +1 -0
  41. package/dist/client/shared/components/PageHeader/PageHeader.js +2 -1
  42. package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
  43. package/dist/client/shared/components/ResultsPage.d.ts +2 -2
  44. package/dist/client/shared/components/ResultsPage.js.map +1 -1
  45. package/dist/client/web/CreeveyApp.d.ts +1 -0
  46. package/dist/client/web/CreeveyApp.js.map +1 -1
  47. package/dist/client/web/CreeveyLoader.d.ts +1 -0
  48. package/dist/client/web/CreeveyLoader.js.map +1 -1
  49. package/dist/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
  50. package/dist/client/web/CreeveyView/SideBar/Checkbox.js +4 -4
  51. package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -1
  52. package/dist/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
  53. package/dist/client/web/CreeveyView/SideBar/Search.js +4 -4
  54. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
  55. package/dist/client/web/CreeveyView/SideBar/SideBar.d.ts +1 -1
  56. package/dist/client/web/CreeveyView/SideBar/SideBar.js +1 -7
  57. package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
  58. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.d.ts +1 -0
  59. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +5 -4
  60. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  61. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +1 -0
  62. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +4 -3
  63. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
  64. package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +3 -7
  65. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +6 -5
  66. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  67. package/dist/client/web/CreeveyView/SideBar/TestLink.d.ts +1 -0
  68. package/dist/client/web/CreeveyView/SideBar/TestLink.js +5 -1
  69. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  70. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +15 -8
  71. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -1
  72. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +5 -4
  73. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
  74. package/dist/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
  75. package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -1
  76. package/dist/client/web/KeyboardEventsContext.d.ts +3 -4
  77. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  78. package/dist/client/web/assets/index-DkmZfG9C.js +591 -0
  79. package/dist/client/web/index.html +1 -1
  80. package/dist/client/web/index.js +5 -6
  81. package/dist/client/web/index.js.map +1 -1
  82. package/dist/creevey.js +21 -9
  83. package/dist/creevey.js.map +1 -1
  84. package/dist/index.js +7 -3
  85. package/dist/index.js.map +1 -1
  86. package/dist/server/config.d.ts +1 -1
  87. package/dist/server/config.js +9 -5
  88. package/dist/server/config.js.map +1 -1
  89. package/dist/server/docker.d.ts +2 -2
  90. package/dist/server/docker.js +46 -40
  91. package/dist/server/docker.js.map +1 -1
  92. package/dist/server/index.js +54 -15
  93. package/dist/server/index.js.map +1 -1
  94. package/dist/server/master/master.d.ts +1 -5
  95. package/dist/server/master/master.js +3 -3
  96. package/dist/server/master/master.js.map +1 -1
  97. package/dist/server/master/pool.d.ts +2 -1
  98. package/dist/server/master/pool.js +13 -7
  99. package/dist/server/master/pool.js.map +1 -1
  100. package/dist/server/master/runner.d.ts +1 -1
  101. package/dist/server/master/runner.js +4 -2
  102. package/dist/server/master/runner.js.map +1 -1
  103. package/dist/server/master/server.js +1 -0
  104. package/dist/server/master/server.js.map +1 -1
  105. package/dist/server/master/start.d.ts +3 -0
  106. package/dist/server/master/{index.js → start.js} +6 -9
  107. package/dist/server/master/start.js.map +1 -0
  108. package/dist/server/messages.d.ts +4 -10
  109. package/dist/server/messages.js +4 -58
  110. package/dist/server/messages.js.map +1 -1
  111. package/dist/server/playwright/docker-file.d.ts +1 -0
  112. package/dist/server/playwright/docker-file.js +26 -0
  113. package/dist/server/playwright/docker-file.js.map +1 -0
  114. package/dist/server/playwright/docker.d.ts +1 -0
  115. package/dist/server/playwright/docker.js +31 -0
  116. package/dist/server/playwright/docker.js.map +1 -0
  117. package/dist/server/playwright/internal.d.ts +25 -0
  118. package/dist/server/playwright/internal.js +319 -0
  119. package/dist/server/playwright/internal.js.map +1 -0
  120. package/dist/server/playwright/webdriver.d.ts +16 -0
  121. package/dist/server/playwright/webdriver.js +105 -0
  122. package/dist/server/playwright/webdriver.js.map +1 -0
  123. package/dist/server/providers/browser.d.ts +2 -0
  124. package/dist/server/{storybook/providers → providers}/browser.js +6 -7
  125. package/dist/server/providers/browser.js.map +1 -0
  126. package/dist/server/providers/hybrid.d.ts +2 -0
  127. package/dist/server/{storybook/providers → providers}/hybrid.js +8 -8
  128. package/dist/server/providers/hybrid.js.map +1 -0
  129. package/dist/server/reporter.d.ts +26 -0
  130. package/dist/server/{worker/reporter.js → reporter.js} +34 -56
  131. package/dist/server/reporter.js.map +1 -0
  132. package/dist/server/selenium/internal.d.ts +31 -0
  133. package/dist/server/selenium/internal.js +606 -0
  134. package/dist/server/selenium/internal.js.map +1 -0
  135. package/dist/server/selenium/selenoid.js +6 -13
  136. package/dist/server/selenium/selenoid.js.map +1 -1
  137. package/dist/server/selenium/webdriver.d.ts +24 -0
  138. package/dist/server/selenium/webdriver.js +106 -0
  139. package/dist/server/selenium/webdriver.js.map +1 -0
  140. package/dist/server/stories.js +16 -9
  141. package/dist/server/stories.js.map +1 -1
  142. package/dist/server/telemetry.d.ts +1 -1
  143. package/dist/server/telemetry.js +4 -4
  144. package/dist/server/telemetry.js.map +1 -1
  145. package/dist/server/utils.d.ts +3 -4
  146. package/dist/server/utils.js +10 -9
  147. package/dist/server/utils.js.map +1 -1
  148. package/dist/server/webdriver.d.ts +19 -0
  149. package/dist/server/webdriver.js +79 -0
  150. package/dist/server/webdriver.js.map +1 -0
  151. package/dist/server/worker/chai-image.d.ts +2 -5
  152. package/dist/server/worker/chai-image.js +14 -102
  153. package/dist/server/worker/chai-image.js.map +1 -1
  154. package/dist/server/worker/match-image.d.ts +14 -0
  155. package/dist/server/worker/match-image.js +231 -0
  156. package/dist/server/worker/match-image.js.map +1 -0
  157. package/dist/server/worker/start.d.ts +2 -0
  158. package/dist/server/worker/start.js +258 -0
  159. package/dist/server/worker/start.js.map +1 -0
  160. package/dist/types.d.ts +127 -64
  161. package/dist/types.js +15 -9
  162. package/dist/types.js.map +1 -1
  163. package/package.json +108 -110
  164. package/src/client/addon/components/Addon.tsx +1 -1
  165. package/src/client/addon/components/Icons.tsx +1 -1
  166. package/src/client/addon/components/Panel.tsx +1 -1
  167. package/src/client/addon/components/TestSelect.tsx +5 -5
  168. package/src/client/addon/components/Tools.tsx +9 -9
  169. package/src/client/addon/controller.ts +1 -1
  170. package/src/client/addon/manager.ts +4 -4
  171. package/src/client/addon/withCreevey.ts +26 -28
  172. package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
  173. package/src/client/shared/components/ImagesView/ImagesView.tsx +2 -2
  174. package/src/client/shared/components/ImagesView/SideBySideView.tsx +1 -1
  175. package/src/client/shared/components/ImagesView/SlideView.tsx +1 -1
  176. package/src/client/shared/components/ImagesView/SwapView.tsx +1 -1
  177. package/src/client/shared/components/PageFooter/PageFooter.tsx +2 -2
  178. package/src/client/shared/components/PageFooter/Paging.tsx +13 -13
  179. package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -1
  180. package/src/client/shared/components/PageHeader/PageHeader.tsx +4 -3
  181. package/src/client/shared/components/ResultsPage.tsx +1 -1
  182. package/src/client/web/CreeveyApp.tsx +1 -1
  183. package/src/client/web/CreeveyLoader.tsx +1 -1
  184. package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +6 -7
  185. package/src/client/web/CreeveyView/SideBar/Search.tsx +4 -4
  186. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +3 -10
  187. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +7 -6
  188. package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +7 -6
  189. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +8 -6
  190. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +8 -3
  191. package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +18 -10
  192. package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +7 -10
  193. package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -2
  194. package/src/client/web/KeyboardEventsContext.tsx +3 -4
  195. package/src/client/web/index.html +1 -1
  196. package/src/client/web/index.tsx +4 -3
  197. package/src/creevey.ts +25 -8
  198. package/src/index.ts +4 -2
  199. package/src/server/config.ts +12 -8
  200. package/src/server/docker.ts +58 -44
  201. package/src/server/index.ts +57 -18
  202. package/src/server/master/master.ts +3 -6
  203. package/src/server/master/pool.ts +25 -9
  204. package/src/server/master/runner.ts +4 -2
  205. package/src/server/master/server.ts +1 -0
  206. package/src/server/master/{index.ts → start.ts} +13 -11
  207. package/src/server/messages.ts +11 -75
  208. package/src/server/playwright/docker-file.ts +21 -0
  209. package/src/server/playwright/docker.ts +41 -0
  210. package/src/server/playwright/internal.ts +387 -0
  211. package/src/server/playwright/webdriver.ts +126 -0
  212. package/src/server/{storybook/providers → providers}/browser.ts +7 -8
  213. package/src/server/{storybook/providers → providers}/hybrid.ts +19 -19
  214. package/src/server/{worker/reporter.ts → reporter.ts} +40 -72
  215. package/src/server/selenium/internal.ts +785 -0
  216. package/src/server/selenium/selenoid.ts +12 -17
  217. package/src/server/selenium/webdriver.ts +136 -0
  218. package/src/server/stories.ts +18 -11
  219. package/src/server/telemetry.ts +2 -2
  220. package/src/server/utils.ts +9 -9
  221. package/src/server/webdriver.ts +127 -0
  222. package/src/server/worker/chai-image.ts +21 -133
  223. package/src/server/worker/match-image.ts +303 -0
  224. package/src/server/worker/start.ts +303 -0
  225. package/src/types.ts +162 -60
  226. package/dist/client/web/202.js +0 -1
  227. package/dist/client/web/270.js +0 -43
  228. package/dist/client/web/752.js +0 -1
  229. package/dist/client/web/main.js +0 -79
  230. package/dist/client/web/main.js.LICENSE.txt +0 -34
  231. package/dist/server/master/index.d.ts +0 -3
  232. package/dist/server/master/index.js.map +0 -1
  233. package/dist/server/selenium/browser.d.ts +0 -19
  234. package/dist/server/selenium/browser.js +0 -640
  235. package/dist/server/selenium/browser.js.map +0 -1
  236. package/dist/server/selenium/index.d.ts +0 -2
  237. package/dist/server/selenium/index.js +0 -19
  238. package/dist/server/selenium/index.js.map +0 -1
  239. package/dist/server/storybook/providers/browser.d.ts +0 -2
  240. package/dist/server/storybook/providers/browser.js.map +0 -1
  241. package/dist/server/storybook/providers/hybrid.d.ts +0 -2
  242. package/dist/server/storybook/providers/hybrid.js.map +0 -1
  243. package/dist/server/worker/helpers.d.ts +0 -8
  244. package/dist/server/worker/helpers.js +0 -57
  245. package/dist/server/worker/helpers.js.map +0 -1
  246. package/dist/server/worker/index.d.ts +0 -1
  247. package/dist/server/worker/index.js +0 -6
  248. package/dist/server/worker/index.js.map +0 -1
  249. package/dist/server/worker/reporter.d.ts +0 -8
  250. package/dist/server/worker/reporter.js.map +0 -1
  251. package/dist/server/worker/worker.d.ts +0 -4
  252. package/dist/server/worker/worker.js +0 -212
  253. package/dist/server/worker/worker.js.map +0 -1
  254. package/src/server/selenium/browser.ts +0 -840
  255. package/src/server/selenium/index.ts +0 -2
  256. package/src/server/worker/helpers.ts +0 -61
  257. package/src/server/worker/index.ts +0 -1
  258. package/src/server/worker/worker.ts +0 -240
  259. package/types/mocha.d.ts +0 -20
@@ -0,0 +1,126 @@
1
+ import { Args } from '@storybook/csf';
2
+ import { Config, Options, StoriesRaw, StoryInput } from '../../types';
3
+ import { logger } from '../logger';
4
+ import { subscribeOn } from '../messages';
5
+ import { CreeveyWebdriverBase } from '../webdriver';
6
+ import type { InternalBrowser } from './internal';
7
+
8
+ export class PlaywrightWebdriver extends CreeveyWebdriverBase {
9
+ #browser: InternalBrowser | null = null;
10
+ #browserName: string;
11
+ #gridUrl: string;
12
+ #config: Config;
13
+ #options: Options;
14
+ constructor(browser: string, gridUrl: string, config: Config, options: Options) {
15
+ super();
16
+
17
+ this.#browserName = browser;
18
+ this.#gridUrl = gridUrl;
19
+ this.#config = config;
20
+ this.#options = options;
21
+
22
+ subscribeOn('shutdown', () => {
23
+ void this.#browser?.closeBrowser().finally(() => process.exit());
24
+ this.#browser = null;
25
+ });
26
+ }
27
+
28
+ get browser() {
29
+ return this.#browser?.browser;
30
+ }
31
+
32
+ getSessionId(): Promise<string> {
33
+ if (!this.#browser) {
34
+ // TODO Describe the error
35
+ throw new Error('Browser is not initialized');
36
+ }
37
+
38
+ return Promise.resolve(this.#browser.sessionId);
39
+ }
40
+
41
+ async openBrowser(fresh = false): Promise<PlaywrightWebdriver | null> {
42
+ if (this.#browser) {
43
+ if (fresh) {
44
+ await this.#browser.closeBrowser();
45
+ this.#browser = null;
46
+ } else {
47
+ return this;
48
+ }
49
+ }
50
+
51
+ const internalModule = await (async () => {
52
+ try {
53
+ return await import('./internal.js');
54
+ } catch (error) {
55
+ logger.error(error);
56
+ return null;
57
+ }
58
+ })();
59
+
60
+ if (!internalModule) return null;
61
+
62
+ const { InternalBrowser } = internalModule;
63
+ const browser = await InternalBrowser.getBrowser(this.#browserName, this.#gridUrl, this.#config, this.#options);
64
+
65
+ if (!browser) return null;
66
+
67
+ this.#browser = browser;
68
+
69
+ return this;
70
+ }
71
+
72
+ async closeBrowser(): Promise<void> {
73
+ if (this.#browser) {
74
+ await this.#browser.closeBrowser();
75
+ this.#browser = null;
76
+ }
77
+ }
78
+
79
+ async loadStoriesFromBrowser(): Promise<StoriesRaw> {
80
+ if (!this.#browser) {
81
+ // TODO Describe the error
82
+ throw new Error('Browser is not initialized');
83
+ }
84
+
85
+ return this.#browser.loadStoriesFromBrowser();
86
+ }
87
+
88
+ protected async takeScreenshot(
89
+ captureElement: string | null,
90
+ ignoreElements?: string | string[] | null,
91
+ ): Promise<Buffer> {
92
+ if (!this.#browser) {
93
+ // TODO Describe the error
94
+ throw new Error('Browser is not initialized');
95
+ }
96
+
97
+ return this.#browser.takeScreenshot(captureElement, ignoreElements);
98
+ }
99
+
100
+ protected waitForComplete(callback: (isCompleted: boolean) => void): void {
101
+ if (!this.#browser) {
102
+ // TODO Describe the error
103
+ throw new Error('Browser is not initialized');
104
+ }
105
+
106
+ this.#browser.waitForComplete(callback);
107
+ }
108
+
109
+ protected async selectStory(id: string, waitForReady?: boolean): Promise<boolean> {
110
+ if (!this.#browser) {
111
+ // TODO Describe the error
112
+ throw new Error('Browser is not initialized');
113
+ }
114
+
115
+ return this.#browser.selectStory(id, waitForReady);
116
+ }
117
+
118
+ protected async updateStoryArgs(story: StoryInput, updatedArgs: Args): Promise<void> {
119
+ if (!this.#browser) {
120
+ // TODO Describe the error
121
+ throw new Error('Browser is not initialized');
122
+ }
123
+
124
+ return this.#browser.updateStoryArgs(story, updatedArgs);
125
+ }
126
+ }
@@ -1,12 +1,11 @@
1
1
  import cluster from 'cluster';
2
- import type { CreeveyStory, StoriesProvider, StoriesRaw } from '../../../types.js';
3
- import { loadStoriesFromBrowser } from '../../selenium/index.js';
4
- import { emitStoriesMessage, sendStoriesMessage, subscribeOn, subscribeOnWorker } from '../../messages.js';
5
- import { isDefined } from '../../../types.js';
6
- import { logger } from '../../logger.js';
7
- import { deserializeRawStories } from '../../../shared/index.js';
2
+ import type { CreeveyStory, StoriesProvider, StoriesRaw } from '../../types.js';
3
+ import { emitStoriesMessage, sendStoriesMessage, subscribeOn, subscribeOnWorker } from '../messages.js';
4
+ import { isDefined } from '../../types.js';
5
+ import { logger } from '../logger.js';
6
+ import { deserializeRawStories } from '../../shared/index.js';
8
7
 
9
- export const loadStories: StoriesProvider = async (_config, _options, storiesListener) => {
8
+ export const loadStories: StoriesProvider = async (_config, storiesListener, webdriver) => {
10
9
  if (cluster.isPrimary) {
11
10
  return new Promise<StoriesRaw>((resolve) => {
12
11
  const worker = Object.values(cluster.workers ?? {})
@@ -40,7 +39,7 @@ export const loadStories: StoriesProvider = async (_config, _options, storiesLis
40
39
  emitStoriesMessage({ type: 'set', payload: { stories, oldTests: storiesWithOldTests } });
41
40
  if (message.type == 'update') storiesListener(new Map(message.payload));
42
41
  });
43
- const stories = deserializeRawStories(await loadStoriesFromBrowser());
42
+ const stories = deserializeRawStories((await webdriver?.loadStoriesFromBrowser()) ?? {});
44
43
 
45
44
  const storiesWithOldTests: string[] = [];
46
45
 
@@ -1,17 +1,13 @@
1
1
  import chokidar from 'chokidar';
2
2
 
3
3
  import { loadStories as browserProvider } from './browser.js';
4
- import type { Config, StoryInput, CreeveyStoryParams, CreeveyStory, StoriesProvider } from '../../../types.js';
5
- import { logger } from '../../logger.js';
6
- import parse, { CreeveyParamsByStoryId } from '../../testsFiles/parser.js';
7
- import { readDirRecursive } from '../../utils.js';
8
- import { combineParameters } from '../../../shared/index.js';
4
+ import type { Config, CreeveyStoryParams, CreeveyStory, StoriesProvider } from '../../types.js';
5
+ import { logger } from '../logger.js';
6
+ import parse, { CreeveyParamsByStoryId } from '../testsFiles/parser.js';
7
+ import { readDirRecursive } from '../utils.js';
8
+ import { combineParameters } from '../../shared/index.js';
9
9
 
10
- export const loadStories: StoriesProvider = async (
11
- _config: Config,
12
- _options,
13
- storiesListener: (stories: Map<string, StoryInput[]>) => void,
14
- ) => {
10
+ export const loadStories: StoriesProvider = async (config, storiesListener, webdriver) => {
15
11
  let creeveyParamsByStoryId: Partial<CreeveyParamsByStoryId> = {};
16
12
 
17
13
  const mergeParamsFromTestsToStory = (story: CreeveyStory, creeveyParams: CreeveyStoryParams): void => {
@@ -20,18 +16,22 @@ export const loadStories: StoriesProvider = async (
20
16
  }
21
17
  };
22
18
 
23
- const stories = await browserProvider(_config, {}, (updatedStoriesByFiles) => {
24
- Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
25
- storiesArray.forEach((story) => {
26
- const creeveyParams = creeveyParamsByStoryId[story.id];
27
- if (creeveyParams) mergeParamsFromTestsToStory(story, creeveyParams);
19
+ const stories = await browserProvider(
20
+ config,
21
+ (updatedStoriesByFiles) => {
22
+ Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
23
+ storiesArray.forEach((story) => {
24
+ const creeveyParams = creeveyParamsByStoryId[story.id];
25
+ if (creeveyParams) mergeParamsFromTestsToStory(story, creeveyParams);
26
+ });
28
27
  });
29
- });
30
- storiesListener(updatedStoriesByFiles);
31
- });
28
+ storiesListener(updatedStoriesByFiles);
29
+ },
30
+ webdriver,
31
+ );
32
32
 
33
33
  // TODO fix test files hot reloading
34
- creeveyParamsByStoryId = await parseParams(_config /*, (data) => console.log(data) */);
34
+ creeveyParamsByStoryId = await parseParams(config /*, (data) => console.log(data) */);
35
35
 
36
36
  Object.entries(stories).forEach(([storyId, story]) => {
37
37
  const creeveyParams = creeveyParamsByStoryId[storyId];
@@ -1,13 +1,13 @@
1
1
  import chalk from 'chalk';
2
2
  import Logger from 'loglevel';
3
3
  import prefix from 'loglevel-plugin-prefix';
4
- import { Runner, reporters, MochaOptions } from 'mocha';
5
- import { Images, isDefined, isImageError } from '../../types.js';
4
+ import { FakeTest, Images, isDefined, isImageError, TEST_EVENTS } from '../types.js';
5
+ import EventEmitter from 'events';
6
6
 
7
7
  interface ReporterOptions {
8
8
  reportDir: string;
9
9
  sessionId: string;
10
- topLevelSuite: string;
10
+ browserName: string;
11
11
  willRetry: boolean;
12
12
  images: Partial<Record<string, Partial<Images>>>;
13
13
  }
@@ -18,62 +18,73 @@ const testLevels: Record<string, string> = {
18
18
  ERROR: chalk.red('FAIL'),
19
19
  };
20
20
 
21
- export class CreeveyReporter extends reporters.Base {
21
+ export class CreeveyReporter {
22
22
  // TODO Output in better way, like vitest, maybe
23
- constructor(runner: Runner, options: MochaOptions) {
24
- super(runner);
25
-
26
- const { sessionId, topLevelSuite } = options.reporterOptions as ReporterOptions;
27
- const testLogger = Logger.getLogger(topLevelSuite);
23
+ constructor(runner: EventEmitter, options: { reporterOptions: { creevey: ReporterOptions } }) {
24
+ const { sessionId, browserName } = options.reporterOptions.creevey;
25
+ const testLogger = Logger.getLogger(browserName);
28
26
 
29
27
  prefix.apply(testLogger, {
30
28
  format(level) {
31
- return `${testLevels[level]} => (${topLevelSuite}:${chalk.gray(sessionId)})`;
29
+ return `${testLevels[level]} => (${browserName}:${chalk.gray(sessionId)})`;
32
30
  },
33
31
  });
34
32
 
35
- runner.on('test', (test) => {
33
+ runner.on(TEST_EVENTS.TEST_BEGIN, (test: FakeTest) => {
36
34
  testLogger.warn(chalk.cyan(test.titlePath().join('/')));
37
35
  });
38
- runner.on('pass', (test) => {
36
+ runner.on(TEST_EVENTS.TEST_PASS, (test: FakeTest) => {
39
37
  testLogger.info(chalk.cyan(test.titlePath().join('/')));
40
38
  });
41
- runner.on('fail', (test, error) => {
39
+ runner.on(TEST_EVENTS.TEST_FAIL, (test: FakeTest, error) => {
42
40
  testLogger.error(
43
41
  chalk.cyan(test.titlePath().join('/')),
44
42
  '\n ',
45
- getErrors(
43
+ this.getErrors(
46
44
  error,
47
- (error, imageName) => `${chalk.bold(imageName ?? topLevelSuite)}:${error}`,
45
+ (error, imageName) => `${chalk.bold(imageName ?? browserName)}:${error}`,
48
46
  (error) => error.stack ?? error.message,
49
47
  ).join('\n '),
50
48
  );
51
49
  });
52
50
  }
51
+ private getErrors(
52
+ error: unknown,
53
+ imageErrorToString: (error: string, imageName?: string) => string,
54
+ errorToString: (error: Error) => string,
55
+ ): string[] {
56
+ const errors = [];
57
+ if (!(error instanceof Error)) {
58
+ errors.push(error as string);
59
+ } else if (!isImageError(error)) {
60
+ errors.push(errorToString(error));
61
+ } else if (typeof error.images == 'string') {
62
+ errors.push(imageErrorToString(error.images));
63
+ } else {
64
+ const imageErrors = error.images ?? {};
65
+ Object.keys(imageErrors).forEach((imageName) => {
66
+ errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
67
+ });
68
+ }
69
+ return errors;
70
+ }
53
71
  }
54
72
 
55
- export class TeamcityReporter extends reporters.Base {
56
- constructor(runner: Runner, options: MochaOptions) {
57
- super(runner);
58
-
59
- const topLevelSuite = this.escape((options.reporterOptions as ReporterOptions).topLevelSuite);
60
- const reporterOptions = options.reporterOptions as ReporterOptions;
61
-
62
- runner.on('suite', (suite) => {
63
- if (suite.root) console.log(`##teamcity[testSuiteStarted name='${topLevelSuite}' flowId='${process.pid}']`);
64
- else console.log(`##teamcity[testSuiteStarted name='${this.escape(suite.title)}' flowId='${process.pid}']`);
65
- });
73
+ export class TeamcityReporter {
74
+ constructor(runner: EventEmitter, options: { reporterOptions: { creevey: ReporterOptions } }) {
75
+ const browserName = this.escape(options.reporterOptions.creevey.browserName);
76
+ const reporterOptions = options.reporterOptions.creevey;
66
77
 
67
- runner.on('test', (test) => {
78
+ runner.on(TEST_EVENTS.TEST_BEGIN, (test: FakeTest) => {
68
79
  console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`);
69
80
  });
70
81
 
71
- runner.on('fail', (test, error: Error) => {
82
+ runner.on(TEST_EVENTS.TEST_FAIL, (test: FakeTest, error: Error) => {
72
83
  Object.entries(reporterOptions.images).forEach(([name, image]) => {
73
84
  if (!image) return;
74
85
  const filePath = test
75
86
  .titlePath()
76
- .concat(name == topLevelSuite ? [] : [topLevelSuite])
87
+ .concat(name == browserName ? [] : [browserName])
77
88
  .map(this.escape)
78
89
  .join('/');
79
90
 
@@ -104,27 +115,6 @@ export class TeamcityReporter extends reporters.Base {
104
115
  )}' details='${this.escape(error.stack ?? '')}' flowId='${process.pid}']`,
105
116
  );
106
117
  });
107
-
108
- runner.on('pending', (test) => {
109
- console.log(
110
- `##teamcity[testIgnored name='${this.escape(test.title)}' message='${this.escape(
111
- typeof test.skipReason == 'boolean' ? test.title : test.skipReason,
112
- )}' flowId='${process.pid}']`,
113
- );
114
- });
115
-
116
- runner.on('test end', (test) => {
117
- console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`);
118
- });
119
-
120
- runner.on('suite end', (suite) => {
121
- if (!suite.root)
122
- console.log(`##teamcity[testSuiteFinished name='${this.escape(suite.title)}' flowId='${process.pid}']`);
123
- });
124
-
125
- runner.on('end', () => {
126
- console.log(`##teamcity[testSuiteFinished name='${topLevelSuite}' flowId='${process.pid}']`);
127
- });
128
118
  }
129
119
 
130
120
  private escape = (str: string): string => {
@@ -146,25 +136,3 @@ export class TeamcityReporter extends reporters.Base {
146
136
  );
147
137
  };
148
138
  }
149
-
150
- function getErrors(
151
- error: unknown,
152
- imageErrorToString: (error: string, imageName?: string) => string,
153
- errorToString: (error: Error) => string,
154
- ): string[] {
155
- const errors = [];
156
- if (!(error instanceof Error)) {
157
- errors.push(error as string);
158
- } else if (!isImageError(error)) {
159
- errors.push(errorToString(error));
160
- } else if (typeof error.images == 'string') {
161
- errors.push(imageErrorToString(error.images));
162
- } else {
163
- const imageErrors = error.images;
164
- Object.keys(imageErrors).forEach((imageName) => {
165
- errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
166
- });
167
- }
168
-
169
- return errors;
170
- }