creevey 0.10.0-beta.30 → 0.10.0-beta.32

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 (52) hide show
  1. package/dist/client/shared/components/ResultsPage.d.ts +1 -1
  2. package/dist/client/web/CreeveyApp.js +1 -0
  3. package/dist/client/web/CreeveyApp.js.map +1 -1
  4. package/dist/client/web/assets/{index-C5QCFtF-.js → index-Cs8IUTQs.js} +84 -84
  5. package/dist/client/web/index.html +1 -1
  6. package/dist/server/docker.d.ts +1 -1
  7. package/dist/server/docker.js +21 -4
  8. package/dist/server/docker.js.map +1 -1
  9. package/dist/server/index.js +9 -10
  10. package/dist/server/index.js.map +1 -1
  11. package/dist/server/master/start.js +1 -1
  12. package/dist/server/master/start.js.map +1 -1
  13. package/dist/server/playwright/docker-file.d.ts +1 -2
  14. package/dist/server/playwright/docker-file.js +10 -4
  15. package/dist/server/playwright/docker-file.js.map +1 -1
  16. package/dist/server/playwright/docker.d.ts +2 -1
  17. package/dist/server/playwright/docker.js +10 -2
  18. package/dist/server/playwright/docker.js.map +1 -1
  19. package/dist/server/playwright/internal.d.ts +3 -4
  20. package/dist/server/playwright/internal.js +48 -37
  21. package/dist/server/playwright/internal.js.map +1 -1
  22. package/dist/server/playwright/webdriver.js +1 -7
  23. package/dist/server/playwright/webdriver.js.map +1 -1
  24. package/dist/server/selenium/internal.js +5 -12
  25. package/dist/server/selenium/internal.js.map +1 -1
  26. package/dist/server/selenium/webdriver.js +0 -7
  27. package/dist/server/selenium/webdriver.js.map +1 -1
  28. package/dist/server/telemetry.js +2 -2
  29. package/dist/server/utils.d.ts +1 -2
  30. package/dist/server/utils.js +11 -8
  31. package/dist/server/utils.js.map +1 -1
  32. package/dist/server/webdriver.d.ts +2 -0
  33. package/dist/server/webdriver.js +13 -1
  34. package/dist/server/webdriver.js.map +1 -1
  35. package/dist/types.d.ts +0 -2
  36. package/dist/types.js.map +1 -1
  37. package/package.json +3 -3
  38. package/src/client/web/CreeveyApp.tsx +1 -0
  39. package/src/server/docker.ts +24 -4
  40. package/src/server/index.ts +11 -14
  41. package/src/server/master/start.ts +1 -1
  42. package/src/server/playwright/docker-file.ts +12 -5
  43. package/src/server/playwright/docker.ts +16 -3
  44. package/src/server/playwright/index-source.mjs +16 -0
  45. package/src/server/playwright/internal.ts +78 -52
  46. package/src/server/playwright/webdriver.ts +1 -7
  47. package/src/server/selenium/internal.ts +5 -12
  48. package/src/server/selenium/webdriver.ts +0 -7
  49. package/src/server/telemetry.ts +2 -2
  50. package/src/server/utils.ts +33 -25
  51. package/src/server/webdriver.ts +13 -0
  52. package/src/types.ts +0 -2
@@ -42,7 +42,6 @@ export class SeleniumWebdriver extends CreeveyWebdriverBase {
42
42
 
43
43
  getSessionId(): Promise<string> {
44
44
  if (!this.#browser) {
45
- // TODO Describe the error
46
45
  throw new Error('Browser is not initialized');
47
46
  }
48
47
 
@@ -89,7 +88,6 @@ export class SeleniumWebdriver extends CreeveyWebdriverBase {
89
88
 
90
89
  async loadStoriesFromBrowser(): Promise<StoriesRaw> {
91
90
  if (!this.#browser) {
92
- // TODO Describe the error
93
91
  throw new Error('Browser is not initialized');
94
92
  }
95
93
 
@@ -98,7 +96,6 @@ export class SeleniumWebdriver extends CreeveyWebdriverBase {
98
96
 
99
97
  afterTest(test: ServerTest): Promise<void> {
100
98
  if (!this.#browser) {
101
- // TODO Describe the error
102
99
  throw new Error('Browser is not initialized');
103
100
  }
104
101
 
@@ -110,7 +107,6 @@ export class SeleniumWebdriver extends CreeveyWebdriverBase {
110
107
  ignoreElements?: string | string[] | null,
111
108
  ): Promise<Buffer> {
112
109
  if (!this.#browser) {
113
- // TODO Describe the error
114
110
  throw new Error('Browser is not initialized');
115
111
  }
116
112
 
@@ -119,7 +115,6 @@ export class SeleniumWebdriver extends CreeveyWebdriverBase {
119
115
 
120
116
  protected waitForComplete(callback: (isCompleted: boolean) => void): void {
121
117
  if (!this.#browser) {
122
- // TODO Describe the error
123
118
  throw new Error('Browser is not initialized');
124
119
  }
125
120
 
@@ -128,7 +123,6 @@ export class SeleniumWebdriver extends CreeveyWebdriverBase {
128
123
 
129
124
  protected async selectStory(id: string, waitForReady?: boolean): Promise<boolean> {
130
125
  if (!this.#browser) {
131
- // TODO Describe the error
132
126
  throw new Error('Browser is not initialized');
133
127
  }
134
128
 
@@ -137,7 +131,6 @@ export class SeleniumWebdriver extends CreeveyWebdriverBase {
137
131
 
138
132
  protected async updateStoryArgs(story: StoryInput, updatedArgs: Args): Promise<void> {
139
133
  if (!this.#browser) {
140
- // TODO Describe the error
141
134
  throw new Error('Browser is not initialized');
142
135
  }
143
136
 
@@ -181,8 +181,8 @@ export async function sendScreenshotsCount(
181
181
  const testsMeta = { runId: uuid, tests };
182
182
 
183
183
  const fullPathname = buildPathname('tests', testsMeta);
184
- // NOTE: Keep request path shorter than 32k symbols
185
- const chunksCount = Math.ceil(fullPathname.length / 32_000);
184
+ // NOTE: Keep request path shorter than 24k symbols
185
+ const chunksCount = Math.ceil(fullPathname.length / 24_000);
186
186
  let chunks: string[] = [];
187
187
  if (chunksCount > 1) {
188
188
  const testsString = JSON.stringify(tests);
@@ -8,6 +8,7 @@ import { register as esmRegister } from 'tsx/esm/api';
8
8
  import { register as cjsRegister } from 'tsx/cjs/api';
9
9
  import { SkipOptions, SkipOption, isDefined, TestData, noop, ServerTest, Worker } from '../types.js';
10
10
  import { emitShutdownMessage, sendShutdownMessage } from './messages.js';
11
+ import { LOCALHOST_REGEXP } from './webdriver.js';
11
12
  import assert from 'assert';
12
13
  import pidtree from 'pidtree';
13
14
 
@@ -99,7 +100,7 @@ export async function shutdownWorkers(): Promise<void> {
99
100
  new Promise<void>((resolve) => {
100
101
  const timeout = setTimeout(() => {
101
102
  if (worker.process.pid) void killTree(worker.process.pid);
102
- }, 10000);
103
+ }, 10_000);
103
104
  worker.on('exit', () => {
104
105
  clearTimeout(timeout);
105
106
  resolve();
@@ -134,10 +135,6 @@ export async function killTree(rootPid: number): Promise<void> {
134
135
  });
135
136
  }
136
137
 
137
- export function shutdown(): void {
138
- process.exit();
139
- }
140
-
141
138
  export function shutdownWithError(): void {
142
139
  process.exit(1);
143
140
  }
@@ -261,25 +258,36 @@ export async function loadThroughTSX<T>(
261
258
  return result;
262
259
  }
263
260
 
264
- export function waitOnUrl(url: string, timeout: number, delay: number) {
261
+ export function waitOnUrl(waitUrl: string, timeout: number, delay: number) {
262
+ const urls = [waitUrl];
263
+ if (!LOCALHOST_REGEXP.test(waitUrl)) {
264
+ const parsedUrl = new URL(waitUrl);
265
+ parsedUrl.host = 'localhost';
266
+ urls.push(parsedUrl.toString());
267
+ }
265
268
  const startTime = Date.now();
266
- return new Promise<void>((resolve, reject) => {
267
- const interval = setInterval(() => {
268
- http
269
- .get(url, (response) => {
270
- if (response.statusCode === 200) {
271
- clearInterval(interval);
272
- resolve();
273
- }
274
- })
275
- .on('error', () => {
276
- // Ignore HTTP errors
277
- });
278
-
279
- if (Date.now() - startTime > timeout) {
280
- clearInterval(interval);
281
- reject(new Error(`${url} didn't respond within ${timeout / 1000} seconds`));
282
- }
283
- }, delay);
284
- });
269
+ return Promise.race(
270
+ urls.map(
271
+ (url) =>
272
+ new Promise<void>((resolve, reject) => {
273
+ const interval = setInterval(() => {
274
+ http
275
+ .get(url, (response) => {
276
+ if (response.statusCode === 200) {
277
+ clearInterval(interval);
278
+ resolve();
279
+ }
280
+ })
281
+ .on('error', () => {
282
+ // Ignore HTTP errors
283
+ });
284
+
285
+ if (Date.now() - startTime > timeout) {
286
+ clearInterval(interval);
287
+ reject(new Error(`${url} didn't respond within ${timeout / 1000} seconds`));
288
+ }
289
+ }, delay);
290
+ }),
291
+ ),
292
+ );
285
293
  }
@@ -18,6 +18,19 @@ export const storybookRootID = 'storybook-root';
18
18
  export const LOCALHOST_REGEXP = /(localhost|127\.0\.0\.1)/i;
19
19
  const DOCKER_INTERNAL = 'host.docker.internal';
20
20
 
21
+ let browserClosePromise: Promise<void> | null = null;
22
+
23
+ export const openBrowser = () => {
24
+ let resolve: () => void;
25
+ browserClosePromise = new Promise((r) => (resolve = r));
26
+ return () => {
27
+ resolve();
28
+ browserClosePromise = null;
29
+ };
30
+ };
31
+
32
+ export const waitForBrowserClose = () => browserClosePromise;
33
+
21
34
  export async function resolveStorybookUrl(
22
35
  storybookUrl: string,
23
36
  checkUrl: (url: string) => Promise<boolean>,
package/src/types.ts CHANGED
@@ -150,7 +150,6 @@ export interface BrowserConfigObject {
150
150
  screenshots?: boolean;
151
151
  snapshots?: boolean;
152
152
  sources?: boolean;
153
- path: string;
154
153
  };
155
154
  };
156
155
  }
@@ -369,7 +368,6 @@ export interface Options {
369
368
  storybookUrl?: string;
370
369
  storybookPort?: string;
371
370
  storybookAutorunCmd?: string;
372
- saveReport: boolean;
373
371
  failFast?: boolean;
374
372
  odiff?: boolean;
375
373
  noDocker?: boolean;