creevey 0.10.0-beta.4 → 0.10.0-beta.40

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 (211) hide show
  1. package/README.md +19 -41
  2. package/dist/client/addon/components/Addon.js +17 -7
  3. package/dist/client/addon/components/Addon.js.map +1 -1
  4. package/dist/client/addon/components/Panel.js +2 -2
  5. package/dist/client/addon/components/Panel.js.map +1 -1
  6. package/dist/client/addon/components/Tools.js +17 -7
  7. package/dist/client/addon/components/Tools.js.map +1 -1
  8. package/dist/client/addon/withCreevey.d.ts +2 -1
  9. package/dist/client/addon/withCreevey.js +11 -1
  10. package/dist/client/addon/withCreevey.js.map +1 -1
  11. package/dist/client/shared/components/ImagesView/BlendView.d.ts +1 -1
  12. package/dist/client/shared/components/ImagesView/BlendView.js +17 -7
  13. package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
  14. package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
  15. package/dist/client/shared/components/ImagesView/SideBySideView.js +17 -7
  16. package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
  17. package/dist/client/shared/components/ImagesView/SlideView.d.ts +1 -1
  18. package/dist/client/shared/components/ImagesView/SlideView.js +17 -7
  19. package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
  20. package/dist/client/shared/components/ImagesView/SwapView.d.ts +1 -1
  21. package/dist/client/shared/components/ImagesView/SwapView.js +29 -7
  22. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
  23. package/dist/client/shared/components/PageHeader/ImagePreview.d.ts +1 -1
  24. package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -0
  25. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
  26. package/dist/client/shared/components/PageHeader/PageHeader.js +20 -8
  27. package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
  28. package/dist/client/shared/components/ResultsPage.d.ts +1 -1
  29. package/dist/client/shared/components/ResultsPage.js +43 -13
  30. package/dist/client/shared/components/ResultsPage.js.map +1 -1
  31. package/dist/client/shared/creeveyClientApi.js +8 -1
  32. package/dist/client/shared/creeveyClientApi.js.map +1 -1
  33. package/dist/client/shared/helpers.d.ts +1 -3
  34. package/dist/client/shared/helpers.js +4 -19
  35. package/dist/client/shared/helpers.js.map +1 -1
  36. package/dist/client/web/CreeveyApp.js +42 -14
  37. package/dist/client/web/CreeveyApp.js.map +1 -1
  38. package/dist/client/web/CreeveyContext.d.ts +5 -0
  39. package/dist/client/web/CreeveyContext.js +20 -7
  40. package/dist/client/web/CreeveyContext.js.map +1 -1
  41. package/dist/client/web/CreeveyLoader.js +2 -2
  42. package/dist/client/web/CreeveyLoader.js.map +1 -1
  43. package/dist/client/web/CreeveyView/SideBar/Search.js +19 -9
  44. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
  45. package/dist/client/web/CreeveyView/SideBar/SideBar.js +18 -7
  46. package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
  47. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +60 -7
  48. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  49. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +17 -7
  50. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
  51. package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +2 -2
  52. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +18 -10
  53. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  54. package/dist/client/web/CreeveyView/SideBar/TestLink.js +18 -10
  55. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  56. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +1 -1
  57. package/dist/client/web/CreeveyView/SideBar/TestsStatus.d.ts +1 -1
  58. package/dist/client/web/KeyboardEventsContext.d.ts +1 -8
  59. package/dist/client/web/KeyboardEventsContext.js +79 -64
  60. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  61. package/dist/client/web/assets/index-B0Xv0lOY.js +802 -0
  62. package/dist/client/web/index.html +1 -1
  63. package/dist/client/web/index.js +17 -7
  64. package/dist/client/web/index.js.map +1 -1
  65. package/dist/client/web/themes.d.ts +2 -0
  66. package/dist/client/web/themes.js +22 -0
  67. package/dist/client/web/themes.js.map +1 -0
  68. package/dist/creevey.js +16 -9
  69. package/dist/creevey.js.map +1 -1
  70. package/dist/index.d.ts +1 -0
  71. package/dist/server/config.d.ts +1 -1
  72. package/dist/server/config.js +27 -5
  73. package/dist/server/config.js.map +1 -1
  74. package/dist/server/connection.d.ts +3 -0
  75. package/dist/server/connection.js +28 -0
  76. package/dist/server/connection.js.map +1 -0
  77. package/dist/server/docker.d.ts +1 -1
  78. package/dist/server/docker.js +56 -32
  79. package/dist/server/docker.js.map +1 -1
  80. package/dist/server/index.js +64 -11
  81. package/dist/server/index.js.map +1 -1
  82. package/dist/server/logger.d.ts +2 -1
  83. package/dist/server/logger.js +7 -3
  84. package/dist/server/logger.js.map +1 -1
  85. package/dist/server/master/api.js +1 -1
  86. package/dist/server/master/api.js.map +1 -1
  87. package/dist/server/master/pool.d.ts +4 -3
  88. package/dist/server/master/pool.js +13 -66
  89. package/dist/server/master/pool.js.map +1 -1
  90. package/dist/server/master/queue.d.ts +13 -0
  91. package/dist/server/master/queue.js +71 -0
  92. package/dist/server/master/queue.js.map +1 -0
  93. package/dist/server/master/runner.d.ts +3 -0
  94. package/dist/server/master/runner.js +76 -10
  95. package/dist/server/master/runner.js.map +1 -1
  96. package/dist/server/master/server.js +1 -1
  97. package/dist/server/master/server.js.map +1 -1
  98. package/dist/server/master/start.js +13 -11
  99. package/dist/server/master/start.js.map +1 -1
  100. package/dist/server/playwright/docker-file.d.ts +1 -1
  101. package/dist/server/playwright/docker-file.js +15 -6
  102. package/dist/server/playwright/docker-file.js.map +1 -1
  103. package/dist/server/playwright/docker.d.ts +2 -1
  104. package/dist/server/playwright/docker.js +10 -2
  105. package/dist/server/playwright/docker.js.map +1 -1
  106. package/dist/server/playwright/index-source.mjs +16 -0
  107. package/dist/server/playwright/internal.d.ts +6 -6
  108. package/dist/server/playwright/internal.js +143 -91
  109. package/dist/server/playwright/internal.js.map +1 -1
  110. package/dist/server/playwright/webdriver.d.ts +1 -1
  111. package/dist/server/playwright/webdriver.js +5 -8
  112. package/dist/server/playwright/webdriver.js.map +1 -1
  113. package/dist/server/providers/browser.js +6 -4
  114. package/dist/server/providers/browser.js.map +1 -1
  115. package/dist/server/providers/hybrid.js +1 -1
  116. package/dist/server/providers/hybrid.js.map +1 -1
  117. package/dist/server/reporter.d.ts +4 -19
  118. package/dist/server/reporter.js +30 -21
  119. package/dist/server/reporter.js.map +1 -1
  120. package/dist/server/selenium/internal.d.ts +3 -4
  121. package/dist/server/selenium/internal.js +127 -108
  122. package/dist/server/selenium/internal.js.map +1 -1
  123. package/dist/server/selenium/selenoid.js +8 -6
  124. package/dist/server/selenium/selenoid.js.map +1 -1
  125. package/dist/server/selenium/webdriver.d.ts +1 -1
  126. package/dist/server/selenium/webdriver.js +5 -9
  127. package/dist/server/selenium/webdriver.js.map +1 -1
  128. package/dist/server/telemetry.js +2 -2
  129. package/dist/server/testsFiles/parser.js +45 -5
  130. package/dist/server/testsFiles/parser.js.map +1 -1
  131. package/dist/server/utils.d.ts +19 -1
  132. package/dist/server/utils.js +87 -8
  133. package/dist/server/utils.js.map +1 -1
  134. package/dist/server/webdriver.d.ts +5 -4
  135. package/dist/server/webdriver.js +23 -10
  136. package/dist/server/webdriver.js.map +1 -1
  137. package/dist/server/worker/chai-image.d.ts +1 -2
  138. package/dist/server/worker/chai-image.js +4 -3
  139. package/dist/server/worker/chai-image.js.map +1 -1
  140. package/dist/server/worker/context.d.ts +3 -0
  141. package/dist/server/worker/context.js +15 -0
  142. package/dist/server/worker/context.js.map +1 -0
  143. package/dist/server/worker/match-image.d.ts +4 -4
  144. package/dist/server/worker/match-image.js +7 -4
  145. package/dist/server/worker/match-image.js.map +1 -1
  146. package/dist/server/worker/start.js +45 -73
  147. package/dist/server/worker/start.js.map +1 -1
  148. package/dist/shared/index.d.ts +1 -1
  149. package/dist/types.d.ts +40 -8
  150. package/dist/types.js +2 -0
  151. package/dist/types.js.map +1 -1
  152. package/docs/cli.md +12 -0
  153. package/docs/config.md +179 -165
  154. package/docs/storybook.md +60 -0
  155. package/docs/tests.md +50 -45
  156. package/package.json +64 -63
  157. package/src/client/addon/components/Panel.tsx +2 -2
  158. package/src/client/addon/withCreevey.ts +10 -2
  159. package/src/client/shared/components/ImagesView/SwapView.tsx +18 -0
  160. package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -0
  161. package/src/client/shared/components/PageHeader/PageHeader.tsx +4 -2
  162. package/src/client/shared/components/ResultsPage.tsx +31 -8
  163. package/src/client/shared/creeveyClientApi.ts +9 -1
  164. package/src/client/shared/helpers.ts +4 -24
  165. package/src/client/web/CreeveyApp.tsx +27 -8
  166. package/src/client/web/CreeveyContext.tsx +9 -0
  167. package/src/client/web/CreeveyLoader.tsx +1 -1
  168. package/src/client/web/CreeveyView/SideBar/Search.tsx +3 -3
  169. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +1 -0
  170. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +37 -6
  171. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +3 -5
  172. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +2 -4
  173. package/src/client/web/KeyboardEventsContext.tsx +61 -73
  174. package/src/client/web/themes.ts +24 -0
  175. package/src/creevey.ts +16 -10
  176. package/src/server/config.ts +28 -6
  177. package/src/server/connection.ts +26 -0
  178. package/src/server/docker.ts +63 -34
  179. package/src/server/index.ts +72 -14
  180. package/src/server/logger.ts +6 -2
  181. package/src/server/master/api.ts +1 -1
  182. package/src/server/master/pool.ts +23 -59
  183. package/src/server/master/queue.ts +77 -0
  184. package/src/server/master/runner.ts +94 -10
  185. package/src/server/master/server.ts +1 -1
  186. package/src/server/master/start.ts +16 -11
  187. package/src/server/playwright/docker-file.ts +18 -6
  188. package/src/server/playwright/docker.ts +16 -3
  189. package/src/server/playwright/index-source.mjs +16 -0
  190. package/src/server/playwright/internal.ts +182 -111
  191. package/src/server/playwright/webdriver.ts +6 -9
  192. package/src/server/providers/browser.ts +6 -4
  193. package/src/server/providers/hybrid.ts +1 -1
  194. package/src/server/reporter.ts +37 -34
  195. package/src/server/selenium/internal.ts +131 -116
  196. package/src/server/selenium/selenoid.ts +8 -6
  197. package/src/server/selenium/webdriver.ts +6 -10
  198. package/src/server/telemetry.ts +2 -2
  199. package/src/server/testsFiles/parser.ts +52 -4
  200. package/src/server/utils.ts +97 -9
  201. package/src/server/webdriver.ts +24 -16
  202. package/src/server/worker/chai-image.ts +4 -4
  203. package/src/server/worker/context.ts +14 -0
  204. package/src/server/worker/match-image.ts +12 -8
  205. package/src/server/worker/start.ts +49 -86
  206. package/src/shared/index.ts +1 -1
  207. package/src/types.ts +44 -8
  208. package/types/global.d.ts +1 -0
  209. package/.yarnrc.yml +0 -1
  210. package/chromatic.config.json +0 -5
  211. package/dist/client/web/assets/index-DkmZfG9C.js +0 -591
@@ -1,18 +1,12 @@
1
1
  import chai from 'chai';
2
- import chalk from 'chalk';
3
- import Logger from 'loglevel';
4
- import EventEmitter from 'events';
5
2
  import {
6
3
  BaseCreeveyTestContext,
7
4
  Config,
8
5
  CreeveyWebdriver,
9
- FakeSuite,
10
- FakeTest,
11
- Images,
12
6
  Options,
13
7
  ServerTest,
14
- TEST_EVENTS,
15
8
  TestMessage,
9
+ TestResult,
16
10
  isDefined,
17
11
  isImageError,
18
12
  } from '../../types.js';
@@ -47,9 +41,10 @@ async function getTestsFromStories(
47
41
  return testsById;
48
42
  }
49
43
 
50
- function runHandler(browserName: string, images: Partial<Record<string, Images>>, error?: unknown): void {
44
+ function runHandler(browserName: string, result: Omit<TestResult, 'status'>, error?: unknown): void {
51
45
  // TODO How handle browser corruption?
52
- if (isImageError(error)) {
46
+ const { images } = result;
47
+ if (images != null && isImageError(error)) {
53
48
  if (typeof error.images == 'string') {
54
49
  const image = images[browserName];
55
50
  if (image) image.error = error.images;
@@ -62,31 +57,37 @@ function runHandler(browserName: string, images: Partial<Record<string, Images>>
62
57
  }
63
58
  }
64
59
 
65
- if (error || Object.values(images).some((image) => image?.error != null)) {
66
- const errorMessage = serializeError(error);
60
+ if (error || (images != null && Object.values(images).some((image) => image?.error != null))) {
61
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
62
+ const errorMessage = result.error!;
67
63
 
68
64
  const isUnexpectedError =
69
65
  hasTimeout(errorMessage) ||
70
66
  hasDisconnected(errorMessage) ||
71
- Object.values(images).some((image) => hasTimeout(image?.error));
67
+ (images != null && Object.values(images).some((image) => hasTimeout(image?.error)));
72
68
  if (isUnexpectedError) emitWorkerMessage({ type: 'error', payload: { subtype: 'unknown', error: errorMessage } });
73
69
  else
74
70
  emitTestMessage({
75
71
  type: 'end',
76
72
  payload: {
77
73
  status: 'failed',
78
- images,
79
- error: errorMessage,
74
+ ...result,
80
75
  },
81
76
  });
82
77
  } else {
83
- emitTestMessage({ type: 'end', payload: { status: 'success', images } });
78
+ emitTestMessage({
79
+ type: 'end',
80
+ payload: {
81
+ status: 'success',
82
+ ...result,
83
+ },
84
+ });
84
85
  }
85
86
  }
86
87
 
87
88
  async function setupWebdriver(webdriver: CreeveyWebdriver): Promise<[string, CreeveyWebdriver] | undefined> {
88
89
  if ((await webdriver.openBrowser(true)) == null) {
89
- logger.error('Failed to start browser');
90
+ logger().error('Failed to start browser');
90
91
  emitWorkerMessage({
91
92
  type: 'error',
92
93
  payload: { subtype: 'browser', error: 'Failed to start browser' },
@@ -114,7 +115,6 @@ function hasTimeout(str: string | null | undefined): boolean {
114
115
  }
115
116
 
116
117
  export async function start(browser: string, gridUrl: string, config: Config, options: Options): Promise<void> {
117
- let retries = 0;
118
118
  const imagesContext: ImageContext = {
119
119
  attachments: [],
120
120
  testFullPath: [],
@@ -125,38 +125,16 @@ export async function start(browser: string, gridUrl: string, config: Config, op
125
125
 
126
126
  if (!webdriver || !sessionId) return;
127
127
 
128
- const workerLogger = Logger.getLogger(`${browser}:${chalk.gray(sessionId)}`);
129
-
130
- const reporterOptions = {
131
- ...config.reporterOptions,
132
- creevey: {
133
- sessionId,
134
- reportDir: config.reportDir,
135
- browserName: browser,
136
- get willRetry() {
137
- return retries < config.maxRetries;
138
- },
139
- get images() {
140
- return imagesContext.images;
141
- },
142
- },
143
- };
144
-
145
- class FakeRunner extends EventEmitter {}
146
- const runner = new FakeRunner();
147
- const Reporter = config.reporter;
148
- new Reporter(runner, { reporterOptions });
149
-
150
128
  const { matchImage, matchImages } = options.odiff
151
129
  ? getOdiffMatchers(imagesContext, config)
152
130
  : await getMatchers(imagesContext, config);
153
- chai.use(chaiImage(matchImage, matchImages, workerLogger));
131
+ chai.use(chaiImage(matchImage, matchImages));
154
132
 
155
133
  const tests = await (async () => {
156
134
  try {
157
135
  return await getTestsFromStories(config, browser, webdriver);
158
136
  } catch (error) {
159
- workerLogger.error('Failed to get tests from stories:', error);
137
+ logger().error('Failed to get tests from stories:', error);
160
138
  emitWorkerMessage({
161
139
  type: 'error',
162
140
  payload: { subtype: 'browser', error: serializeError(error) },
@@ -174,7 +152,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
174
152
 
175
153
  if (!test) {
176
154
  const error = `Test with id ${message.payload.id} not found`;
177
- workerLogger.error(error);
155
+ logger().error(error);
178
156
  emitWorkerMessage({
179
157
  type: 'error',
180
158
  payload: { subtype: 'test', error },
@@ -200,68 +178,53 @@ export async function start(browser: string, gridUrl: string, config: Config, op
200
178
  imagesContext.testFullPath = getTestPath(test);
201
179
  imagesContext.images = {};
202
180
 
203
- retries = message.payload.retries;
204
181
  let error = undefined;
205
182
 
206
- const fakeSuite: FakeSuite = {
207
- title: test.storyPath.slice(0, -1).join('/'),
208
- fullTitle: () => fakeSuite.title,
209
- titlePath: () => [fakeSuite.title],
210
- tests: [],
211
- };
212
-
213
- const fakeTest: FakeTest = {
214
- parent: fakeSuite,
215
- title: [test.story.name, test.testName, test.browser].filter(isDefined).join('/'),
216
- fullTitle: () => getTestPath(test).join('/'),
217
- titlePath: () => getTestPath(test),
218
- currentRetry: () => retries,
219
- retires: () => config.maxRetries,
220
- slow: () => 1000,
221
- };
222
-
223
- fakeSuite.tests.push(fakeTest);
224
-
225
183
  void (async () => {
226
- runner.emit(TEST_EVENTS.RUN_BEGIN);
227
- runner.emit(TEST_EVENTS.TEST_BEGIN, fakeTest);
228
-
184
+ let timeout;
185
+ let isRejected = false;
229
186
  const start = Date.now();
230
187
  try {
231
188
  await Promise.race([
232
- new Promise((reject) =>
233
- setTimeout(() => {
234
- reject(`Timeout of ${config.testTimeout}ms exceeded`);
235
- }, config.testTimeout),
189
+ new Promise(
190
+ (_, reject) =>
191
+ (timeout = setTimeout(() => {
192
+ isRejected = true;
193
+ reject(new Error(`Timeout of ${config.testTimeout}ms exceeded`));
194
+ }, config.testTimeout)),
236
195
  ),
237
196
  (async () => {
238
- const context = await webdriver.switchStory(test.story, baseContext, workerLogger);
197
+ const context = await webdriver.switchStory(test.story, baseContext);
239
198
  await test.fn(context);
240
199
  })(),
241
200
  ]);
242
201
  } catch (testError) {
243
202
  error = testError;
244
- fakeTest.err = error;
245
203
  }
246
204
  const duration = Date.now() - start;
247
- fakeTest.attachments = imagesContext.attachments;
248
- fakeTest.state = error ? 'failed' : 'passed';
249
- fakeTest.duration = duration;
250
- fakeTest.speed = duration > fakeTest.slow() ? 'slow' : duration / 2 > fakeTest.slow() ? 'medium' : 'fast';
251
-
252
- if (error) {
253
- runner.emit(TEST_EVENTS.TEST_FAIL, fakeTest, error);
254
- } else {
255
- runner.emit(TEST_EVENTS.TEST_PASS, fakeTest);
256
- }
257
- runner.emit(TEST_EVENTS.TEST_END, fakeTest);
258
- runner.emit(TEST_EVENTS.RUN_END);
205
+ clearTimeout(timeout);
259
206
 
260
207
  await webdriver.afterTest(test);
261
208
 
262
- runHandler(baseContext.browserName, imagesContext.images, error);
209
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
210
+ if (isRejected) {
211
+ emitWorkerMessage({
212
+ type: 'error',
213
+ payload: { subtype: 'unknown', error: serializeError(error) },
214
+ });
215
+ } else {
216
+ const result = {
217
+ sessionId,
218
+ images: imagesContext.images,
219
+ error: serializeError(error),
220
+ duration,
221
+ attachments: imagesContext.attachments,
222
+ retries: message.payload.retries,
223
+ };
224
+ runHandler(baseContext.browserName, result, error);
225
+ }
263
226
  })().catch((error: unknown) => {
264
- workerLogger.error('Unexpected error:', error);
227
+ logger().error('Unexpected error:', error);
265
228
  emitWorkerMessage({
266
229
  type: 'error',
267
230
  payload: { subtype: 'test', error: serializeError(error) },
@@ -269,7 +232,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
269
232
  });
270
233
  });
271
234
 
272
- workerLogger.info('Browser is ready');
235
+ logger().info('Browser is ready');
273
236
 
274
237
  emitWorkerMessage({ type: 'ready' });
275
238
  }
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { Parameters } from '@storybook/csf';
2
+ import type { Parameters } from '@storybook/types';
3
3
  import { SetStoriesData, StoriesRaw, CreeveyStoryParams, StoryInput } from '../types.js';
4
4
  import { deserializeRegExp, isSerializedRegExp, isRegExp, serializeRegExp } from './serializeRegExp.js';
5
5
 
package/src/types.ts CHANGED
@@ -1,11 +1,10 @@
1
- import type { StoryContextForEnhancers, DecoratorFunction } from '@storybook/csf';
1
+ import type { StoryContextForEnhancers, DecoratorFunction } from '@storybook/types';
2
2
  import type { Worker as ClusterWorker } from 'cluster';
3
3
  import type Pixelmatch from 'pixelmatch';
4
4
  import type { ODiffOptions } from 'odiff-bin';
5
5
  import type { expect } from 'chai';
6
6
  import type EventEmitter from 'events';
7
- import type Logger from 'loglevel';
8
- import { LaunchOptions } from 'playwright-core';
7
+ import type { LaunchOptions } from 'playwright-core';
9
8
  // import type { Browser } from 'playwright-core';
10
9
 
11
10
  /* eslint-disable @typescript-eslint/no-explicit-any */
@@ -103,6 +102,7 @@ export class ChromeConfig {
103
102
  }
104
103
  */
105
104
  export interface BrowserConfigObject {
105
+ // TODO Restrict browser names for playwright images
106
106
  browserName: string;
107
107
  // customizeBuilder?: (builder: Builder) => Builder;
108
108
  limit?: number;
@@ -145,7 +145,13 @@ export interface BrowserConfigObject {
145
145
  [name: string]: unknown;
146
146
  };
147
147
 
148
- playwrightOptions?: Omit<LaunchOptions, 'logger'>;
148
+ playwrightOptions?: Omit<LaunchOptions, 'logger'> & {
149
+ trace?: {
150
+ screenshots?: boolean;
151
+ snapshots?: boolean;
152
+ sources?: boolean;
153
+ };
154
+ };
149
155
  }
150
156
 
151
157
  export type StorybookGlobals = Record<string, unknown>;
@@ -164,7 +170,7 @@ export interface CreeveyWebdriver {
164
170
  openBrowser(fresh?: boolean): Promise<CreeveyWebdriver | null>;
165
171
  closeBrowser(): Promise<void>;
166
172
  loadStoriesFromBrowser(): Promise<StoriesRaw>;
167
- switchStory(story: StoryInput, context: BaseCreeveyTestContext, logger: Logger.Logger): Promise<CreeveyTestContext>;
173
+ switchStory(story: StoryInput, context: BaseCreeveyTestContext): Promise<CreeveyTestContext>;
168
174
  afterTest(test: ServerTest): Promise<void>;
169
175
  }
170
176
 
@@ -200,6 +206,11 @@ export interface Config {
200
206
  * Url where storybook hosted on
201
207
  */
202
208
  resolveStorybookUrl?: () => Promise<string>;
209
+ /**
210
+ * Command to automatically start Storybook if it is not running.
211
+ * For example, `npm run storybook`, `yarn run storybook` etc.
212
+ */
213
+ storybookAutorunCmd?: string;
203
214
  /**
204
215
  * Absolute path to directory with reference images
205
216
  * @default path.join(process.cwd(), './images')
@@ -307,6 +318,11 @@ export interface Config {
307
318
  * The `--ui` CLI option ignores this option
308
319
  */
309
320
  failFast: boolean;
321
+ /**
322
+ * Start workers in sequential queue
323
+ * @default false
324
+ */
325
+ useWorkerQueue: boolean;
310
326
  /**
311
327
  * Specify platform for docker images
312
328
  */
@@ -348,9 +364,13 @@ export interface Options {
348
364
  screenDir?: string;
349
365
  reportDir?: string;
350
366
  gridUrl?: string;
367
+ storybookStart?: boolean | string;
351
368
  storybookUrl?: string;
369
+ storybookPort?: string;
370
+ storybookAutorunCmd?: string;
352
371
  failFast?: boolean;
353
372
  odiff?: boolean;
373
+ noDocker?: boolean;
354
374
  }
355
375
 
356
376
  export type WorkerError = 'browser' | 'test' | 'unknown';
@@ -399,10 +419,15 @@ export type TestStatus = 'unknown' | 'pending' | 'running' | 'failed' | 'approve
399
419
 
400
420
  export interface TestResult {
401
421
  status: 'failed' | 'success';
422
+ retries: number;
402
423
  // TODO Remove checks `name == browser` in TestResultsView
403
424
  // images?: Partial<{ [name: string]: Images }> | Images;
404
425
  images?: Partial<Record<string, Images>>;
405
426
  error?: string;
427
+ // Test metadata for reporting
428
+ duration?: number;
429
+ attachments?: string[];
430
+ sessionId?: string;
406
431
  }
407
432
 
408
433
  export class ImagesError extends Error {
@@ -437,8 +462,8 @@ export interface BaseCreeveyTestContext {
437
462
  * @internal
438
463
  */
439
464
  screenshots: { imageName?: string; screenshot: Buffer }[];
440
- matchImage: (image: Buffer, imageName?: string) => Promise<void>;
441
- matchImages: (images: Record<string, Buffer>) => Promise<void>;
465
+ matchImage: (image: Buffer | string, imageName?: string) => Promise<void>;
466
+ matchImages: (images: Record<string, Buffer | string>) => Promise<void>;
442
467
  }
443
468
 
444
469
  export interface CreeveyTestContext extends BaseCreeveyTestContext {
@@ -450,6 +475,8 @@ export interface CreeveyTestContext extends BaseCreeveyTestContext {
450
475
  export enum TEST_EVENTS {
451
476
  RUN_BEGIN = 'start',
452
477
  RUN_END = 'end',
478
+ SUITE_BEGIN = 'suite',
479
+ SUITE_END = 'suite end',
453
480
  TEST_BEGIN = 'test',
454
481
  TEST_END = 'test end',
455
482
  TEST_FAIL = 'fail',
@@ -474,7 +501,7 @@ export interface FakeTest {
474
501
  title: string;
475
502
  fullTitle: () => string;
476
503
  titlePath: () => string[];
477
- currentRetry: () => number;
504
+ currentRetry: () => number | undefined;
478
505
  retires: () => number;
479
506
  slow: () => number;
480
507
  duration?: number;
@@ -484,6 +511,15 @@ export interface FakeTest {
484
511
  err?: unknown;
485
512
  // NOTE: image files
486
513
  attachments?: string[];
514
+
515
+ // NOTE: Creevey specific fields
516
+ creevey: {
517
+ reportDir: string;
518
+ sessionId: string;
519
+ browserName: string;
520
+ willRetry: boolean;
521
+ images: Partial<Record<string, Partial<Images>>>;
522
+ };
487
523
  }
488
524
 
489
525
  export interface CreeveyStatus {
package/types/global.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable no-var */
2
2
 
3
+ declare var __CREEVEY_ENV__: boolean;
3
4
  declare var __CREEVEY_SERVER_HOST__: string;
4
5
  declare var __CREEVEY_SERVER_PORT__: number | null;
5
6
  declare var __CREEVEY_CLIENT_PORT__: number | null;
package/.yarnrc.yml DELETED
@@ -1 +0,0 @@
1
- nodeLinker: node-modules
@@ -1,5 +0,0 @@
1
- {
2
- "onlyChanged": true,
3
- "projectId": "Project:5fd73972015e660021b97564",
4
- "zip": true
5
- }