creevey 0.10.0-beta.0 → 0.10.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dist/client/addon/components/Panel.js +2 -2
  2. package/dist/client/addon/components/Panel.js.map +1 -1
  3. package/dist/client/addon/controller.js +4 -5
  4. package/dist/client/addon/controller.js.map +1 -1
  5. package/dist/client/addon/withCreevey.js +18 -34
  6. package/dist/client/addon/withCreevey.js.map +1 -1
  7. package/dist/client/shared/components/ImagesView/SwapView.js +12 -0
  8. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
  9. package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -0
  10. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
  11. package/dist/client/shared/components/ResultsPage.js +23 -5
  12. package/dist/client/shared/components/ResultsPage.js.map +1 -1
  13. package/dist/client/web/CreeveyApp.js +22 -6
  14. package/dist/client/web/CreeveyApp.js.map +1 -1
  15. package/dist/client/web/CreeveyContext.d.ts +5 -0
  16. package/dist/client/web/CreeveyContext.js +3 -0
  17. package/dist/client/web/CreeveyContext.js.map +1 -1
  18. package/dist/client/web/CreeveyView/SideBar/Search.js +2 -2
  19. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
  20. package/dist/client/web/CreeveyView/SideBar/SideBar.js +1 -0
  21. package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
  22. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +49 -6
  23. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  24. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +1 -3
  25. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  26. package/dist/client/web/CreeveyView/SideBar/TestLink.js +1 -3
  27. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  28. package/dist/client/web/KeyboardEventsContext.d.ts +1 -8
  29. package/dist/client/web/KeyboardEventsContext.js +62 -57
  30. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  31. package/dist/client/web/assets/{index-DkmZfG9C.js → index-BE9CL5_G.js} +94 -94
  32. package/dist/client/web/index.html +1 -1
  33. package/dist/creevey.js +13 -5
  34. package/dist/creevey.js.map +1 -1
  35. package/dist/index.js +1 -5
  36. package/dist/index.js.map +1 -1
  37. package/dist/playwright.d.ts +2 -0
  38. package/dist/playwright.js +6 -0
  39. package/dist/playwright.js.map +1 -0
  40. package/dist/selenium.d.ts +2 -0
  41. package/dist/selenium.js +6 -0
  42. package/dist/selenium.js.map +1 -0
  43. package/dist/server/config.d.ts +1 -1
  44. package/dist/server/config.js +12 -5
  45. package/dist/server/config.js.map +1 -1
  46. package/dist/server/docker.js +2 -2
  47. package/dist/server/docker.js.map +1 -1
  48. package/dist/server/index.js +40 -4
  49. package/dist/server/index.js.map +1 -1
  50. package/dist/server/logger.d.ts +2 -1
  51. package/dist/server/logger.js +7 -3
  52. package/dist/server/logger.js.map +1 -1
  53. package/dist/server/master/api.js +1 -1
  54. package/dist/server/master/api.js.map +1 -1
  55. package/dist/server/master/pool.d.ts +3 -3
  56. package/dist/server/master/pool.js +10 -63
  57. package/dist/server/master/pool.js.map +1 -1
  58. package/dist/server/master/queue.d.ts +13 -0
  59. package/dist/server/master/queue.js +64 -0
  60. package/dist/server/master/queue.js.map +1 -0
  61. package/dist/server/master/runner.d.ts +1 -0
  62. package/dist/server/master/runner.js +4 -1
  63. package/dist/server/master/runner.js.map +1 -1
  64. package/dist/server/master/server.js +1 -1
  65. package/dist/server/master/server.js.map +1 -1
  66. package/dist/server/master/start.js +4 -4
  67. package/dist/server/master/start.js.map +1 -1
  68. package/dist/server/playwright/docker-file.js +12 -1
  69. package/dist/server/playwright/docker-file.js.map +1 -1
  70. package/dist/server/playwright/docker.d.ts +1 -1
  71. package/dist/server/playwright/docker.js +1 -6
  72. package/dist/server/playwright/docker.js.map +1 -1
  73. package/dist/server/playwright/internal.d.ts +2 -2
  74. package/dist/server/playwright/internal.js +56 -44
  75. package/dist/server/playwright/internal.js.map +1 -1
  76. package/dist/server/playwright/webdriver.d.ts +2 -1
  77. package/dist/server/playwright/webdriver.js +4 -1
  78. package/dist/server/playwright/webdriver.js.map +1 -1
  79. package/dist/server/providers/browser.js +2 -1
  80. package/dist/server/providers/browser.js.map +1 -1
  81. package/dist/server/providers/hybrid.js +1 -1
  82. package/dist/server/providers/hybrid.js.map +1 -1
  83. package/dist/server/reporter.js +4 -4
  84. package/dist/server/reporter.js.map +1 -1
  85. package/dist/server/selenium/internal.d.ts +3 -3
  86. package/dist/server/selenium/internal.js +126 -89
  87. package/dist/server/selenium/internal.js.map +1 -1
  88. package/dist/server/selenium/selenoid.js +2 -2
  89. package/dist/server/selenium/selenoid.js.map +1 -1
  90. package/dist/server/selenium/webdriver.d.ts +2 -1
  91. package/dist/server/selenium/webdriver.js +8 -1
  92. package/dist/server/selenium/webdriver.js.map +1 -1
  93. package/dist/server/telemetry.js +7 -3
  94. package/dist/server/telemetry.js.map +1 -1
  95. package/dist/server/utils.d.ts +2 -1
  96. package/dist/server/utils.js +13 -3
  97. package/dist/server/utils.js.map +1 -1
  98. package/dist/server/webdriver.d.ts +4 -4
  99. package/dist/server/webdriver.js +10 -9
  100. package/dist/server/webdriver.js.map +1 -1
  101. package/dist/server/worker/chai-image.d.ts +1 -2
  102. package/dist/server/worker/chai-image.js +4 -3
  103. package/dist/server/worker/chai-image.js.map +1 -1
  104. package/dist/server/worker/start.js +27 -39
  105. package/dist/server/worker/start.js.map +1 -1
  106. package/dist/types.d.ts +32 -21
  107. package/dist/types.js +13 -1
  108. package/dist/types.js.map +1 -1
  109. package/package.json +45 -38
  110. package/playwright.d.ts +2 -0
  111. package/selenium.d.ts +2 -0
  112. package/src/client/addon/components/Panel.tsx +2 -2
  113. package/src/client/addon/controller.ts +13 -6
  114. package/src/client/addon/withCreevey.ts +25 -13
  115. package/src/client/shared/components/ImagesView/SwapView.tsx +18 -0
  116. package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -0
  117. package/src/client/shared/components/ResultsPage.tsx +28 -7
  118. package/src/client/web/CreeveyApp.tsx +25 -7
  119. package/src/client/web/CreeveyContext.tsx +9 -0
  120. package/src/client/web/CreeveyView/SideBar/Search.tsx +3 -3
  121. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +1 -0
  122. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +37 -6
  123. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +3 -5
  124. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +2 -4
  125. package/src/client/web/KeyboardEventsContext.tsx +61 -73
  126. package/src/creevey.ts +13 -6
  127. package/src/index.ts +0 -2
  128. package/src/playwright.ts +1 -0
  129. package/src/selenium.ts +1 -0
  130. package/src/server/config.ts +19 -7
  131. package/src/server/docker.ts +2 -2
  132. package/src/server/index.ts +45 -4
  133. package/src/server/logger.ts +6 -2
  134. package/src/server/master/api.ts +1 -1
  135. package/src/server/master/pool.ts +18 -56
  136. package/src/server/master/queue.ts +64 -0
  137. package/src/server/master/runner.ts +4 -1
  138. package/src/server/master/server.ts +1 -1
  139. package/src/server/master/start.ts +7 -4
  140. package/src/server/playwright/docker-file.ts +14 -1
  141. package/src/server/playwright/docker.ts +2 -12
  142. package/src/server/playwright/internal.ts +76 -49
  143. package/src/server/playwright/webdriver.ts +7 -2
  144. package/src/server/providers/browser.ts +2 -1
  145. package/src/server/providers/hybrid.ts +1 -1
  146. package/src/server/reporter.ts +4 -3
  147. package/src/server/selenium/internal.ts +147 -93
  148. package/src/server/selenium/selenoid.ts +2 -2
  149. package/src/server/selenium/webdriver.ts +12 -2
  150. package/src/server/telemetry.ts +7 -3
  151. package/src/server/utils.ts +14 -4
  152. package/src/server/webdriver.ts +13 -15
  153. package/src/server/worker/chai-image.ts +4 -4
  154. package/src/server/worker/start.ts +29 -48
  155. package/src/types.ts +35 -23
  156. package/types/playwright-context.d.ts +7 -0
  157. package/types/selenium-context.d.ts +7 -0
  158. package/.yarnrc.yml +0 -1
  159. package/chromatic.config.json +0 -5
@@ -1,10 +1,17 @@
1
1
  import { Browser, BrowserType, Page, chromium, firefox, webkit } from 'playwright-core';
2
- import Logger from 'loglevel';
3
2
  import chalk from 'chalk';
4
3
  import { v4 } from 'uuid';
5
4
  import prefix from 'loglevel-plugin-prefix';
6
- import { SET_GLOBALS, STORY_RENDERED, UPDATE_STORY_ARGS } from '@storybook/core-events';
7
- import { BrowserConfigObject, Config, Options, StoriesRaw, StoryInput, StorybookGlobals, noop } from '../../types';
5
+ import {
6
+ BrowserConfigObject,
7
+ Config,
8
+ Options,
9
+ StoriesRaw,
10
+ StoryInput,
11
+ StorybookEvents,
12
+ StorybookGlobals,
13
+ noop,
14
+ } from '../../types';
8
15
  import { subscribeOn } from '../messages';
9
16
  import { appendIframePath, getAddresses, LOCALHOST_REGEXP, resolveStorybookUrl, storybookRootID } from '../webdriver';
10
17
  import { isShuttingDown, runSequence } from '../utils';
@@ -20,7 +27,7 @@ async function tryConnect(type: BrowserType, gridUrl: string): Promise<Browser |
20
27
  (resolve) =>
21
28
  (timeout = setTimeout(() => {
22
29
  isTimeout = true;
23
- logger.error(`Can't connect to ${type.name()} playwright browser`, error);
30
+ logger().error(`Can't connect to ${type.name()} playwright browser`, error);
24
31
  resolve(null);
25
32
  }, 10000)),
26
33
  ),
@@ -49,13 +56,13 @@ export class InternalBrowser {
49
56
  #sessionId: string = v4();
50
57
  #serverHost: string | null = null;
51
58
  #serverPort: number;
52
- #logger: Logger.Logger;
59
+ #storybookGlobals?: StorybookGlobals;
53
60
  #unsubscribe: () => void = noop;
54
- constructor(browser: Browser, page: Page, port: number) {
61
+ constructor(browser: Browser, page: Page, port: number, storybookGlobals?: StorybookGlobals) {
55
62
  this.#browser = browser;
56
63
  this.#page = page;
57
64
  this.#serverPort = port;
58
- this.#logger = Logger.getLogger(this.#sessionId);
65
+ this.#storybookGlobals = storybookGlobals;
59
66
  this.#unsubscribe = subscribeOn('shutdown', () => {
60
67
  void this.closeBrowser();
61
68
  });
@@ -91,7 +98,12 @@ export class InternalBrowser {
91
98
  if (captureElement) {
92
99
  const element = await this.#page.$(captureElement);
93
100
  if (!element) throw new Error(`Element with selector ${captureElement} not found`);
94
- return element.screenshot({ animations: 'disabled', mask });
101
+
102
+ return element.screenshot({
103
+ animations: 'disabled',
104
+ mask,
105
+ style: ':root { overflow: hidden !important; }',
106
+ });
95
107
  }
96
108
  return this.#page.screenshot({ animations: 'disabled', mask, fullPage: true });
97
109
  }
@@ -102,10 +114,11 @@ export class InternalBrowser {
102
114
 
103
115
  async selectStory(id: string, waitForReady = false): Promise<boolean> {
104
116
  // NOTE: Global variables might be reset after hot reload. I think it's workaround, maybe we need better solution
117
+ await this.updateStorybookGlobals();
105
118
  await this.updateBrowserGlobalVariables();
106
119
  await this.resetMousePosition();
107
120
 
108
- this.#logger.debug(`Triggering 'SetCurrentStory' event with storyId ${chalk.magenta(id)}`);
121
+ logger().debug(`Triggering 'SetCurrentStory' event with storyId ${chalk.magenta(id)}`);
109
122
 
110
123
  const result = await this.#page.evaluate<
111
124
  [error?: string | null, isCaptureCalled?: boolean] | null,
@@ -140,7 +153,7 @@ export class InternalBrowser {
140
153
  });
141
154
  });
142
155
  },
143
- [story.id, updatedArgs, UPDATE_STORY_ARGS, STORY_RENDERED] as const,
156
+ [story.id, updatedArgs, StorybookEvents.UPDATE_STORY_ARGS, StorybookEvents.STORY_RENDERED] as const,
144
157
  );
145
158
  }
146
159
 
@@ -167,26 +180,43 @@ export class InternalBrowser {
167
180
  options: Options,
168
181
  ): Promise<InternalBrowser | null> {
169
182
  const browserConfig = config.browsers[browserName] as BrowserConfigObject;
170
- const { storybookUrl: address = config.storybookUrl, viewport, _storybookGlobals } = browserConfig;
183
+ const {
184
+ storybookUrl: address = config.storybookUrl,
185
+ viewport,
186
+ _storybookGlobals,
187
+ seleniumCapabilities,
188
+ playwrightOptions,
189
+ } = browserConfig;
171
190
 
172
191
  let browser: Browser | null = null;
173
192
 
174
- // TODO Support Selenium Grid 4
175
- switch (browserConfig.browserName) {
176
- case 'chromium':
177
- browser = await tryConnect(chromium, gridUrl);
178
- break;
179
- case 'firefox':
180
- browser = await tryConnect(firefox, gridUrl);
181
- break;
182
- case 'webkit':
183
- browser = await tryConnect(webkit, gridUrl);
184
- break;
185
-
186
- default:
187
- throw new Error(
188
- `Unknown browser ${browserConfig.browserName}. Playwright supports browsers: chromium, firefox, webkit`,
189
- );
193
+ if (new URL(gridUrl).protocol === 'ws:') {
194
+ switch (browserConfig.browserName) {
195
+ case 'chromium':
196
+ browser = await tryConnect(chromium, gridUrl);
197
+ break;
198
+ case 'firefox':
199
+ browser = await tryConnect(firefox, gridUrl);
200
+ break;
201
+ case 'webkit':
202
+ browser = await tryConnect(webkit, gridUrl);
203
+ break;
204
+
205
+ default:
206
+ logger().error(
207
+ `Unknown browser ${browserConfig.browserName}. Playwright supports browsers: chromium, firefox, webkit`,
208
+ );
209
+ }
210
+ } else {
211
+ if (browserConfig.browserName != 'chrome') {
212
+ logger().error("Playwright's Selenium Grid feature supports only chrome browser");
213
+ return null;
214
+ }
215
+
216
+ process.env.SELENIUM_REMOTE_URL = gridUrl;
217
+ process.env.SELENIUM_REMOTE_CAPABILITIES = JSON.stringify(seleniumCapabilities);
218
+
219
+ browser = await chromium.launch(playwrightOptions);
190
220
  }
191
221
 
192
222
  if (!browser) {
@@ -197,7 +227,7 @@ export class InternalBrowser {
197
227
 
198
228
  // TODO Add debug output
199
229
 
200
- const internalBrowser = new InternalBrowser(browser, page, options.port);
230
+ const internalBrowser = new InternalBrowser(browser, page, options.port, _storybookGlobals);
201
231
 
202
232
  try {
203
233
  if (isShuttingDown.current) return null;
@@ -205,7 +235,6 @@ export class InternalBrowser {
205
235
  browserName,
206
236
  viewport,
207
237
  storybookUrl: address,
208
- storybookGlobals: _storybookGlobals,
209
238
  resolveStorybookUrl: config.resolveStorybookUrl,
210
239
  });
211
240
 
@@ -217,7 +246,7 @@ export class InternalBrowser {
217
246
  const error = new Error(`Can't load storybook root page: ${message}`);
218
247
  if (originalError instanceof Error) error.stack = originalError.stack;
219
248
 
220
- logger.error(error);
249
+ logger().error(error);
221
250
 
222
251
  return null;
223
252
  }
@@ -227,32 +256,29 @@ export class InternalBrowser {
227
256
  browserName,
228
257
  viewport,
229
258
  storybookUrl,
230
- storybookGlobals,
231
259
  resolveStorybookUrl,
232
260
  }: {
233
261
  browserName: string;
234
262
  viewport?: { width: number; height: number };
235
263
  storybookUrl: string;
236
- storybookGlobals?: StorybookGlobals;
237
264
  resolveStorybookUrl?: () => Promise<string>;
238
265
  }) {
239
266
  const sessionId = this.#sessionId;
240
267
 
241
- prefix.apply(this.#logger, {
268
+ prefix.apply(logger(), {
242
269
  format(level) {
243
270
  const levelColor = colors[level.toUpperCase() as keyof typeof colors];
244
- return `[${browserName}:${chalk.gray(sessionId)}] ${levelColor(level)} =>`;
271
+ return `[${browserName}:${chalk.gray(process.pid)}] ${levelColor(level)} => ${chalk.gray(sessionId)}`;
245
272
  },
246
273
  });
247
274
 
248
- this.#page.setDefaultNavigationTimeout(10000);
249
275
  this.#page.setDefaultTimeout(60000);
250
276
 
251
277
  return await runSequence(
252
278
  [
253
279
  () => this.openStorybookPage(storybookUrl, resolveStorybookUrl),
254
280
  () => this.waitForStorybook(),
255
- () => this.updateStorybookGlobals(storybookGlobals),
281
+ () => this.updateStorybookGlobals(),
256
282
  () => this.resolveCreeveyHost(),
257
283
  () => this.updateBrowserGlobalVariables(),
258
284
  () => this.resizeViewport(viewport),
@@ -269,29 +295,30 @@ export class InternalBrowser {
269
295
 
270
296
  try {
271
297
  if (resolver) {
272
- this.#logger.debug('Resolving storybook url with custom resolver');
298
+ logger().debug('Resolving storybook url with custom resolver');
273
299
 
274
300
  const resolvedUrl = await resolver();
275
301
 
276
- this.#logger.debug(`Resolver storybook url ${resolvedUrl}`);
302
+ logger().debug(`Resolver storybook url ${resolvedUrl}`);
277
303
 
278
304
  await this.#page.goto(appendIframePath(resolvedUrl));
279
305
  } else {
280
- await resolveStorybookUrl(appendIframePath(storybookUrl), (url) => this.checkUrl(url), this.#logger);
306
+ // TODO this.#page.setDefaultNavigationTimeout(10000);
307
+ await resolveStorybookUrl(appendIframePath(storybookUrl), (url) => this.checkUrl(url));
281
308
  }
282
309
  } catch (error) {
283
- this.#logger.error('Failed to resolve storybook URL', error instanceof Error ? error.message : '');
310
+ logger().error('Failed to resolve storybook URL', error instanceof Error ? error.message : '');
284
311
  throw error;
285
312
  }
286
313
  }
287
314
 
288
315
  private async checkUrl(url: string): Promise<boolean> {
289
316
  try {
290
- this.#logger.debug(`Opening ${chalk.magenta(url)} and checking the page source`);
317
+ logger().debug(`Opening ${chalk.magenta(url)} and checking the page source`);
291
318
  const response = await this.#page.goto(url, { waitUntil: 'commit' });
292
319
  const source = await response?.text();
293
320
 
294
- this.#logger.debug(`Checking ${chalk.cyan(`#${storybookRootID}`)} existence on ${chalk.magenta(url)}`);
321
+ logger().debug(`Checking ${chalk.cyan(`#${storybookRootID}`)} existence on ${chalk.magenta(url)}`);
295
322
  return source?.includes(`id="${storybookRootID}"`) ?? false;
296
323
  } catch {
297
324
  return false;
@@ -300,7 +327,7 @@ export class InternalBrowser {
300
327
 
301
328
  private async waitForStorybook(): Promise<void> {
302
329
  // TODO Duplicated code with selenium
303
- this.#logger.debug('Waiting for `setStories` event to make sure that storybook is initiated');
330
+ logger().debug('Waiting for `setStories` event to make sure that storybook is initiated');
304
331
 
305
332
  const isTimeout = await Promise.race([
306
333
  new Promise<boolean>((resolve) => {
@@ -317,9 +344,9 @@ export class InternalBrowser {
317
344
  if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return true;
318
345
  if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_GLOBALS) == undefined) return true;
319
346
  return false;
320
- }, SET_GLOBALS);
347
+ }, StorybookEvents.SET_GLOBALS);
321
348
  } catch (e: unknown) {
322
- this.#logger.debug('An error has been caught during the script:', e);
349
+ logger().debug('An error has been caught during the script:', e);
323
350
  }
324
351
  } while (wait);
325
352
  return false;
@@ -330,13 +357,13 @@ export class InternalBrowser {
330
357
  if (isTimeout) throw new Error('Failed to wait `setStories` event');
331
358
  }
332
359
 
333
- private async updateStorybookGlobals(globals?: StorybookGlobals): Promise<void> {
334
- if (!globals) return;
360
+ private async updateStorybookGlobals(): Promise<void> {
361
+ if (!this.#storybookGlobals) return;
335
362
 
336
- this.#logger.debug('Applying storybook globals');
363
+ logger().debug('Applying storybook globals');
337
364
  await this.#page.evaluate((globals: StorybookGlobals) => {
338
365
  window.__CREEVEY_UPDATE_GLOBALS__(globals);
339
- }, globals);
366
+ }, this.#storybookGlobals);
340
367
  }
341
368
 
342
369
  private async resolveCreeveyHost(): Promise<void> {
@@ -1,5 +1,6 @@
1
+ /// <reference types="../../../types/playwright-context" />
1
2
  import { Args } from '@storybook/csf';
2
- import { Config, Options, StoriesRaw, StoryInput } from '../../types';
3
+ import { Config, Options, ServerTest, StoriesRaw, StoryInput } from '../../types';
3
4
  import { logger } from '../logger';
4
5
  import { subscribeOn } from '../messages';
5
6
  import { CreeveyWebdriverBase } from '../webdriver';
@@ -52,7 +53,7 @@ export class PlaywrightWebdriver extends CreeveyWebdriverBase {
52
53
  try {
53
54
  return await import('./internal.js');
54
55
  } catch (error) {
55
- logger.error(error);
56
+ logger().error(error);
56
57
  return null;
57
58
  }
58
59
  })();
@@ -85,6 +86,10 @@ export class PlaywrightWebdriver extends CreeveyWebdriverBase {
85
86
  return this.#browser.loadStoriesFromBrowser();
86
87
  }
87
88
 
89
+ afterTest(_test: ServerTest): Promise<void> {
90
+ return Promise.resolve(undefined);
91
+ }
92
+
88
93
  protected async takeScreenshot(
89
94
  captureElement: string | null,
90
95
  ignoreElements?: string | string[] | null,
@@ -5,6 +5,7 @@ import { isDefined } from '../../types.js';
5
5
  import { logger } from '../logger.js';
6
6
  import { deserializeRawStories } from '../../shared/index.js';
7
7
 
8
+ // TODO Don't have updates from stories
8
9
  export const loadStories: StoriesProvider = async (_config, storiesListener, webdriver) => {
9
10
  if (cluster.isPrimary) {
10
11
  return new Promise<StoriesRaw>((resolve) => {
@@ -17,7 +18,7 @@ export const loadStories: StoriesProvider = async (_config, storiesListener, web
17
18
  if (message.type == 'set') {
18
19
  const { stories, oldTests } = message.payload;
19
20
  if (oldTests.length > 0)
20
- logger.warn(
21
+ logger().warn(
21
22
  `If you use browser stories provider of CSFv3 Storybook feature\n` +
22
23
  `Creevey will not load tests defined in story parameters from following stories:\n` +
23
24
  oldTests.join('\n'),
@@ -54,7 +54,7 @@ async function parseParams(
54
54
 
55
55
  if (listener) {
56
56
  chokidar.watch(testFiles).on('change', (filePath) => {
57
- logger.debug(`changed: ${filePath}`);
57
+ logger().debug(`changed: ${filePath}`);
58
58
 
59
59
  // doesn't work, always returns {} due modules caching
60
60
  // see https://github.com/nodejs/modules/issues/307
@@ -22,11 +22,11 @@ export class CreeveyReporter {
22
22
  // TODO Output in better way, like vitest, maybe
23
23
  constructor(runner: EventEmitter, options: { reporterOptions: { creevey: ReporterOptions } }) {
24
24
  const { sessionId, browserName } = options.reporterOptions.creevey;
25
- const testLogger = Logger.getLogger(browserName);
25
+ const testLogger = Logger.getLogger(sessionId);
26
26
 
27
27
  prefix.apply(testLogger, {
28
28
  format(level) {
29
- return `${testLevels[level]} => (${browserName}:${chalk.gray(sessionId)})`;
29
+ return `[${browserName}:${chalk.gray(process.pid)}] ${testLevels[level]} => ${chalk.gray(sessionId)}`;
30
30
  },
31
31
  });
32
32
 
@@ -34,11 +34,12 @@ export class CreeveyReporter {
34
34
  testLogger.warn(chalk.cyan(test.titlePath().join('/')));
35
35
  });
36
36
  runner.on(TEST_EVENTS.TEST_PASS, (test: FakeTest) => {
37
- testLogger.info(chalk.cyan(test.titlePath().join('/')));
37
+ testLogger.info(chalk.cyan(test.titlePath().join('/')), chalk.gray(`(${test.duration} ms)`));
38
38
  });
39
39
  runner.on(TEST_EVENTS.TEST_FAIL, (test: FakeTest, error) => {
40
40
  testLogger.error(
41
41
  chalk.cyan(test.titlePath().join('/')),
42
+ chalk.gray(`(${test.duration} ms)`),
42
43
  '\n ',
43
44
  this.getErrors(
44
45
  error,