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.
- package/dist/client/addon/components/Panel.js +2 -2
- package/dist/client/addon/components/Panel.js.map +1 -1
- package/dist/client/addon/withCreevey.js +9 -1
- package/dist/client/addon/withCreevey.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SwapView.js +12 -0
- package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -0
- package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
- package/dist/client/shared/components/ResultsPage.js +23 -5
- package/dist/client/shared/components/ResultsPage.js.map +1 -1
- package/dist/client/web/CreeveyApp.js +22 -6
- package/dist/client/web/CreeveyApp.js.map +1 -1
- package/dist/client/web/CreeveyContext.d.ts +5 -0
- package/dist/client/web/CreeveyContext.js +3 -0
- package/dist/client/web/CreeveyContext.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Search.js +2 -2
- package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +49 -6
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +1 -3
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestLink.js +1 -3
- package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
- package/dist/client/web/KeyboardEventsContext.d.ts +1 -8
- package/dist/client/web/KeyboardEventsContext.js +62 -57
- package/dist/client/web/KeyboardEventsContext.js.map +1 -1
- package/dist/client/web/assets/{index-DB8lHlJw.js → index-BE9CL5_G.js} +94 -94
- package/dist/client/web/index.html +1 -1
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/playwright/internal.d.ts +2 -2
- package/dist/server/playwright/internal.js +10 -8
- package/dist/server/playwright/internal.js.map +1 -1
- package/dist/server/selenium/internal.d.ts +2 -2
- package/dist/server/selenium/internal.js +10 -8
- package/dist/server/selenium/internal.js.map +1 -1
- package/dist/server/utils.js +2 -3
- package/dist/server/utils.js.map +1 -1
- package/dist/server/worker/start.js +17 -4
- package/dist/server/worker/start.js.map +1 -1
- package/package.json +1 -1
- package/src/client/addon/components/Panel.tsx +2 -2
- package/src/client/addon/withCreevey.ts +6 -1
- package/src/client/shared/components/ImagesView/SwapView.tsx +18 -0
- package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -0
- package/src/client/shared/components/ResultsPage.tsx +28 -7
- package/src/client/web/CreeveyApp.tsx +25 -7
- package/src/client/web/CreeveyContext.tsx +9 -0
- package/src/client/web/CreeveyView/SideBar/Search.tsx +3 -3
- package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +37 -6
- package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +3 -5
- package/src/client/web/CreeveyView/SideBar/TestLink.tsx +2 -4
- package/src/client/web/KeyboardEventsContext.tsx +61 -73
- package/src/server/index.ts +5 -0
- package/src/server/playwright/internal.ts +9 -9
- package/src/server/selenium/internal.ts +9 -9
- package/src/server/utils.ts +2 -3
- 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(
|
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(
|
587
|
-
if (!
|
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
|
-
},
|
592
|
+
}, this.#storybookGlobals);
|
593
593
|
}
|
594
594
|
|
595
595
|
private async resolveCreeveyHost(): Promise<void> {
|
package/src/server/utils.ts
CHANGED
@@ -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
|
-
|
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(
|
229
|
-
|
230
|
-
|
231
|
-
|
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
|
-
|
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({
|