creevey 0.10.0-beta.7 → 0.10.0-beta.9

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 (58) 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/withCreevey.js +9 -1
  4. package/dist/client/addon/withCreevey.js.map +1 -1
  5. package/dist/client/shared/components/ImagesView/SwapView.js +12 -0
  6. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
  7. package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -0
  8. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
  9. package/dist/client/shared/components/ResultsPage.js +23 -5
  10. package/dist/client/shared/components/ResultsPage.js.map +1 -1
  11. package/dist/client/web/CreeveyApp.js +22 -6
  12. package/dist/client/web/CreeveyApp.js.map +1 -1
  13. package/dist/client/web/CreeveyContext.d.ts +5 -0
  14. package/dist/client/web/CreeveyContext.js +3 -0
  15. package/dist/client/web/CreeveyContext.js.map +1 -1
  16. package/dist/client/web/CreeveyView/SideBar/Search.js +2 -2
  17. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
  18. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +49 -6
  19. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  20. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +1 -3
  21. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  22. package/dist/client/web/CreeveyView/SideBar/TestLink.js +1 -3
  23. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  24. package/dist/client/web/KeyboardEventsContext.d.ts +1 -8
  25. package/dist/client/web/KeyboardEventsContext.js +62 -57
  26. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  27. package/dist/client/web/assets/{index-DB8lHlJw.js → index-BE9CL5_G.js} +94 -94
  28. package/dist/client/web/index.html +1 -1
  29. package/dist/server/index.js +4 -0
  30. package/dist/server/index.js.map +1 -1
  31. package/dist/server/playwright/internal.d.ts +2 -2
  32. package/dist/server/playwright/internal.js +10 -8
  33. package/dist/server/playwright/internal.js.map +1 -1
  34. package/dist/server/selenium/internal.d.ts +2 -2
  35. package/dist/server/selenium/internal.js +10 -8
  36. package/dist/server/selenium/internal.js.map +1 -1
  37. package/dist/server/utils.js +2 -3
  38. package/dist/server/utils.js.map +1 -1
  39. package/dist/server/worker/start.js +17 -4
  40. package/dist/server/worker/start.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/client/addon/components/Panel.tsx +2 -2
  43. package/src/client/addon/withCreevey.ts +6 -1
  44. package/src/client/shared/components/ImagesView/SwapView.tsx +18 -0
  45. package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -0
  46. package/src/client/shared/components/ResultsPage.tsx +28 -7
  47. package/src/client/web/CreeveyApp.tsx +25 -7
  48. package/src/client/web/CreeveyContext.tsx +9 -0
  49. package/src/client/web/CreeveyView/SideBar/Search.tsx +3 -3
  50. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +37 -6
  51. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +3 -5
  52. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +2 -4
  53. package/src/client/web/KeyboardEventsContext.tsx +61 -73
  54. package/src/server/index.ts +5 -0
  55. package/src/server/playwright/internal.ts +9 -9
  56. package/src/server/selenium/internal.ts +9 -9
  57. package/src/server/utils.ts +2 -3
  58. package/src/server/worker/start.ts +18 -5
@@ -191,11 +191,13 @@ export class InternalBrowser {
191
191
  #browser: WebDriver;
192
192
  #serverHost: string | null = null;
193
193
  #serverPort: number;
194
+ #storybookGlobals?: StorybookGlobals;
194
195
  #unsubscribe: () => void = noop;
195
196
  #keepAliveInterval: NodeJS.Timeout | null = null;
196
- constructor(browser: WebDriver, port: number) {
197
+ constructor(browser: WebDriver, port: number, storybookGlobals?: StorybookGlobals) {
197
198
  this.#browser = browser;
198
199
  this.#serverPort = port;
200
+ this.#storybookGlobals = storybookGlobals;
199
201
  this.#unsubscribe = subscribeOn('shutdown', () => {
200
202
  void this.closeBrowser();
201
203
  });
@@ -321,6 +323,7 @@ export class InternalBrowser {
321
323
 
322
324
  async selectStory(id: string, waitForReady = false): Promise<boolean> {
323
325
  // NOTE: Global variables might be reset after hot reload. I think it's workaround, maybe we need better solution
326
+ await this.updateStorybookGlobals();
324
327
  await this.updateBrowserGlobalVariables();
325
328
  await this.resetMousePosition();
326
329
 
@@ -417,7 +420,7 @@ export class InternalBrowser {
417
420
 
418
421
  if (!browser) return null;
419
422
 
420
- const internalBrowser = new InternalBrowser(browser, options.port);
423
+ const internalBrowser = new InternalBrowser(browser, options.port, _storybookGlobals);
421
424
 
422
425
  try {
423
426
  if (isShuttingDown.current) return null;
@@ -427,7 +430,6 @@ export class InternalBrowser {
427
430
  gridUrl,
428
431
  viewport,
429
432
  storybookUrl: address,
430
- storybookGlobals: _storybookGlobals,
431
433
  resolveStorybookUrl: config.resolveStorybookUrl,
432
434
  });
433
435
 
@@ -451,14 +453,12 @@ export class InternalBrowser {
451
453
  gridUrl,
452
454
  viewport,
453
455
  storybookUrl,
454
- storybookGlobals,
455
456
  resolveStorybookUrl,
456
457
  }: {
457
458
  browserName: string;
458
459
  gridUrl: string;
459
460
  viewport?: { width: number; height: number };
460
461
  storybookUrl: string;
461
- storybookGlobals?: StorybookGlobals;
462
462
  resolveStorybookUrl?: () => Promise<string>;
463
463
  }): Promise<boolean> {
464
464
  const sessionId = (await this.#browser.getSession()).getId();
@@ -485,7 +485,7 @@ export class InternalBrowser {
485
485
  () => this.#browser.manage().setTimeouts({ pageLoad: 60000, script: 60000 }),
486
486
  () => this.openStorybookPage(storybookUrl, resolveStorybookUrl),
487
487
  () => this.waitForStorybook(),
488
- () => this.updateStorybookGlobals(storybookGlobals),
488
+ () => this.updateStorybookGlobals(),
489
489
  () => this.resolveCreeveyHost(),
490
490
  () => this.updateBrowserGlobalVariables(),
491
491
  // NOTE: Selenium draws automation toolbar with some delay after webdriver initialization
@@ -583,13 +583,13 @@ export class InternalBrowser {
583
583
  if (isTimeout) throw new Error('Failed to wait `setStories` event');
584
584
  }
585
585
 
586
- private async updateStorybookGlobals(globals?: StorybookGlobals): Promise<void> {
587
- if (!globals) return;
586
+ private async updateStorybookGlobals(): Promise<void> {
587
+ if (!this.#storybookGlobals) return;
588
588
 
589
589
  logger().debug('Applying storybook globals');
590
590
  await this.#browser.executeScript(function (globals: StorybookGlobals) {
591
591
  window.__CREEVEY_UPDATE_GLOBALS__(globals);
592
- }, globals);
592
+ }, this.#storybookGlobals);
593
593
  }
594
594
 
595
595
  private async resolveCreeveyHost(): Promise<void> {
@@ -3,7 +3,6 @@ import { get } from 'https';
3
3
  import cluster from 'cluster';
4
4
  import { dirname } from 'path';
5
5
  import { fileURLToPath, pathToFileURL } from 'url';
6
- import { createRequire } from 'module';
7
6
  import { register as esmRegister } from 'tsx/esm/api';
8
7
  import { register as cjsRegister } from 'tsx/cjs/api';
9
8
  import { SkipOptions, SkipOption, isDefined, TestData, noop, ServerTest, Worker } from '../types.js';
@@ -186,10 +185,10 @@ export function readDirRecursive(dirPath: string): string[] {
186
185
  );
187
186
  }
188
187
 
189
- const _require = createRequire(importMetaUrl);
190
188
  export function tryToLoadTestsData(filename: string): Partial<Record<string, ServerTest>> | undefined {
191
189
  try {
192
- return _require(filename) as Partial<Record<string, ServerTest>>;
190
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
191
+ return require(filename) as Partial<Record<string, ServerTest>>;
193
192
  } catch {
194
193
  /* noop */
195
194
  }
@@ -222,13 +222,17 @@ export async function start(browser: string, gridUrl: string, config: Config, op
222
222
  runner.emit(TEST_EVENTS.RUN_BEGIN);
223
223
  runner.emit(TEST_EVENTS.TEST_BEGIN, fakeTest);
224
224
 
225
+ let timeout;
226
+ let isRejected = false;
225
227
  const start = Date.now();
226
228
  try {
227
229
  await Promise.race([
228
- new Promise((reject) =>
229
- setTimeout(() => {
230
- reject(`Timeout of ${config.testTimeout}ms exceeded`);
231
- }, config.testTimeout),
230
+ new Promise(
231
+ (_, reject) =>
232
+ (timeout = setTimeout(() => {
233
+ isRejected = true;
234
+ reject(new Error(`Timeout of ${config.testTimeout}ms exceeded`));
235
+ }, config.testTimeout)),
232
236
  ),
233
237
  (async () => {
234
238
  const context = await webdriver.switchStory(test.story, baseContext);
@@ -240,6 +244,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
240
244
  fakeTest.err = error;
241
245
  }
242
246
  const duration = Date.now() - start;
247
+ clearTimeout(timeout);
243
248
  fakeTest.attachments = imagesContext.attachments;
244
249
  fakeTest.state = error ? 'failed' : 'passed';
245
250
  fakeTest.duration = duration;
@@ -255,7 +260,15 @@ export async function start(browser: string, gridUrl: string, config: Config, op
255
260
 
256
261
  await webdriver.afterTest(test);
257
262
 
258
- runHandler(baseContext.browserName, imagesContext.images, error);
263
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
264
+ if (isRejected) {
265
+ emitWorkerMessage({
266
+ type: 'error',
267
+ payload: { subtype: 'unknown', error: serializeError(error) },
268
+ });
269
+ } else {
270
+ runHandler(baseContext.browserName, imagesContext.images, error);
271
+ }
259
272
  })().catch((error: unknown) => {
260
273
  logger().error('Unexpected error:', error);
261
274
  emitWorkerMessage({