creevey 0.10.0-beta.23 → 0.10.0-beta.25

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 (38) hide show
  1. package/dist/client/web/assets/{index-Bk1_hhr8.js → index-Bmw2S3ik.js} +83 -83
  2. package/dist/client/web/index.html +1 -1
  3. package/dist/creevey.js +1 -1
  4. package/dist/creevey.js.map +1 -1
  5. package/dist/server/config.d.ts +1 -1
  6. package/dist/server/config.js +8 -3
  7. package/dist/server/config.js.map +1 -1
  8. package/dist/server/connection.d.ts +4 -0
  9. package/dist/server/connection.js +35 -0
  10. package/dist/server/connection.js.map +1 -0
  11. package/dist/server/index.js +33 -1
  12. package/dist/server/index.js.map +1 -1
  13. package/dist/server/master/start.js +1 -1
  14. package/dist/server/master/start.js.map +1 -1
  15. package/dist/server/playwright/docker-file.js +2 -13
  16. package/dist/server/playwright/docker-file.js.map +1 -1
  17. package/dist/server/playwright/internal.d.ts +3 -2
  18. package/dist/server/playwright/internal.js +49 -32
  19. package/dist/server/playwright/internal.js.map +1 -1
  20. package/dist/server/testsFiles/parser.js +44 -2
  21. package/dist/server/testsFiles/parser.js.map +1 -1
  22. package/dist/server/utils.d.ts +17 -0
  23. package/dist/server/utils.js +53 -3
  24. package/dist/server/utils.js.map +1 -1
  25. package/dist/types.d.ts +17 -2
  26. package/dist/types.js.map +1 -1
  27. package/docs/config.md +3 -0
  28. package/package.json +4 -4
  29. package/src/creevey.ts +1 -1
  30. package/src/server/config.ts +7 -4
  31. package/src/server/connection.ts +32 -0
  32. package/src/server/index.ts +37 -2
  33. package/src/server/master/start.ts +1 -1
  34. package/src/server/playwright/docker-file.ts +2 -14
  35. package/src/server/playwright/internal.ts +48 -34
  36. package/src/server/testsFiles/parser.ts +51 -1
  37. package/src/server/utils.ts +59 -3
  38. package/src/types.ts +17 -2
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/server/testsFiles/parser.ts"],"names":[],"mappings":";;;AAOA,wBAaC;AApBD,6BAAoC;AACpC,wCAA2D;AAE3D,0CAA6C;AAI9B,KAAK,UAAU,KAAK,CAAC,KAAe;IACjD,MAAM,GAAG,EAAE,CAAC;IAEZ,MAAM,IAAA,yBAAc,EAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAClC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,OAAO,GAAG,IAAA,mBAAa,EAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC,CAAC,CACH,CACF,CAAC;IAEF,OAAO,MAAgC,CAAC;AAC1C,CAAC;AAED,IAAI,MAAM,GAAoC,EAAE,CAAC;AAEjD,IAAI,SAAS,GAAG,EAAE,CAAC;AACnB,IAAI,UAAU,GAAG,EAAE,CAAC;AACpB,IAAI,WAAW,GAA8B,IAAI,CAAC;AAElD,MAAM,kBAAkB,GAAG,CAAC,MAA0B,EAAQ,EAAE;IAC9D,WAAW,GAAG,MAAM,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAE,UAAkB,EAAU,EAAE;IACnE,OAAO,IAAA,UAAI,EAAC,SAAS,EAAE,IAAA,yBAAmB,EAAC,UAAU,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEK,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,MAAkB,EAAQ,EAAE;IAC9D,SAAS,GAAG,KAAK,CAAC;IAClB,MAAM,EAAE,CAAC;IACT,SAAS,GAAG,EAAE,CAAC;AACjB,CAAC,CAAC;AAJW,QAAA,IAAI,QAIf;AAEK,MAAM,KAAK,GAAG,CACnB,KAAa,EACb,OAAoF,EAC9E,EAAE;IACR,UAAU,GAAG,KAAK,CAAC;IACnB,WAAW,GAAG,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACpF,UAAU,GAAG,EAAE,CAAC;IAChB,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC,CAAC;AAXW,QAAA,KAAK,SAWhB;AAEK,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,MAA2B,EAAQ,EAAE;IACvE,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACxF,CAAC,CAAC;AANW,QAAA,IAAI,QAMf"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/server/testsFiles/parser.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,18 @@ export declare const isShuttingDown: {
3
3
  current: boolean;
4
4
  };
5
5
  export declare const configExt: string[];
6
+ declare const browserTypes: {
7
+ readonly chromium: "chromium";
8
+ readonly 'chromium-headless-shell': "chromium";
9
+ readonly chrome: "chromium";
10
+ readonly 'chrome-beta': "chromium";
11
+ readonly msedge: "chromium";
12
+ readonly 'msedge-beta': "chromium";
13
+ readonly 'msedge-dev': "chromium";
14
+ readonly 'bidi-chromium': "chromium";
15
+ readonly firefox: "firefox";
16
+ readonly webkit: "webkit";
17
+ };
6
18
  export declare const skipOptionKeys: string[];
7
19
  export declare function shouldSkip(browser: string, meta: {
8
20
  title: string;
@@ -14,6 +26,9 @@ export declare function shouldSkipByOption(browser: string, meta: {
14
26
  }, skipOption: SkipOption | SkipOption[], reason: string, test?: string): string | boolean;
15
27
  export declare function shutdownWorkers(): Promise<void>;
16
28
  export declare function gracefullyKill(worker: Worker): void;
29
+ export declare function shutdown(): void;
30
+ export declare function shutdownWithError(): void;
31
+ export declare function resolvePlaywrightBrowserType(browserName: string): (typeof browserTypes)[keyof typeof browserTypes];
17
32
  export declare function getCreeveyCache(): Promise<string | undefined>;
18
33
  export declare function runSequence(seq: (() => unknown)[], predicate: () => boolean): Promise<boolean>;
19
34
  export declare function getTestPath(test: ServerTest): string[];
@@ -23,3 +38,5 @@ export declare const downloadBinary: (downloadUrl: string, destination: string)
23
38
  export declare function readDirRecursive(dirPath: string): string[];
24
39
  export declare function tryToLoadTestsData(filename: string): Partial<Record<string, ServerTest>> | undefined;
25
40
  export declare function loadThroughTSX<T>(callback: (load: (modulePath: string) => Promise<T>) => Promise<T>): Promise<T>;
41
+ export declare function waitOnUrl(url: string, timeout: number, delay: number): Promise<void>;
42
+ export {};
@@ -8,6 +8,9 @@ exports.shouldSkip = shouldSkip;
8
8
  exports.shouldSkipByOption = shouldSkipByOption;
9
9
  exports.shutdownWorkers = shutdownWorkers;
10
10
  exports.gracefullyKill = gracefullyKill;
11
+ exports.shutdown = shutdown;
12
+ exports.shutdownWithError = shutdownWithError;
13
+ exports.resolvePlaywrightBrowserType = resolvePlaywrightBrowserType;
11
14
  exports.getCreeveyCache = getCreeveyCache;
12
15
  exports.runSequence = runSequence;
13
16
  exports.getTestPath = getTestPath;
@@ -15,8 +18,10 @@ exports.testsToImages = testsToImages;
15
18
  exports.readDirRecursive = readDirRecursive;
16
19
  exports.tryToLoadTestsData = tryToLoadTestsData;
17
20
  exports.loadThroughTSX = loadThroughTSX;
21
+ exports.waitOnUrl = waitOnUrl;
18
22
  const fs_1 = __importDefault(require("fs"));
19
- const https_1 = require("https");
23
+ const https_1 = __importDefault(require("https"));
24
+ const http_1 = __importDefault(require("http"));
20
25
  const cluster_1 = __importDefault(require("cluster"));
21
26
  const path_1 = require("path");
22
27
  const url_1 = require("url");
@@ -24,9 +29,22 @@ const api_1 = require("tsx/esm/api");
24
29
  const api_2 = require("tsx/cjs/api");
25
30
  const types_js_1 = require("../types.js");
26
31
  const messages_js_1 = require("./messages.js");
32
+ const assert_1 = __importDefault(require("assert"));
27
33
  const importMetaUrl = (0, url_1.pathToFileURL)(__filename).href;
28
34
  exports.isShuttingDown = { current: false };
29
35
  exports.configExt = ['.js', '.mjs', '.ts', '.cjs', '.mts', '.cts'];
36
+ const browserTypes = {
37
+ chromium: 'chromium',
38
+ 'chromium-headless-shell': 'chromium',
39
+ chrome: 'chromium',
40
+ 'chrome-beta': 'chromium',
41
+ msedge: 'chromium',
42
+ 'msedge-beta': 'chromium',
43
+ 'msedge-dev': 'chromium',
44
+ 'bidi-chromium': 'chromium',
45
+ firefox: 'firefox',
46
+ webkit: 'webkit',
47
+ };
30
48
  exports.skipOptionKeys = ['in', 'kinds', 'stories', 'tests', 'reason'];
31
49
  function matchBy(pattern, value) {
32
50
  return ((typeof pattern == 'string' && pattern == value) ||
@@ -89,6 +107,16 @@ function gracefullyKill(worker) {
89
107
  });
90
108
  (0, messages_js_1.sendShutdownMessage)(worker);
91
109
  }
110
+ function shutdown() {
111
+ process.exit();
112
+ }
113
+ function shutdownWithError() {
114
+ process.exit(1);
115
+ }
116
+ function resolvePlaywrightBrowserType(browserName) {
117
+ (0, assert_1.default)(browserName in browserTypes, new Error(`Failed to match browser name "${browserName}" to playwright browserType`));
118
+ return browserTypes[browserName];
119
+ }
92
120
  async function getCreeveyCache() {
93
121
  const { default: findCacheDir } = await import('find-cache-dir');
94
122
  return findCacheDir({ name: 'creevey', cwd: (0, path_1.dirname)((0, url_1.fileURLToPath)(importMetaUrl)) });
@@ -111,8 +139,9 @@ function testsToImages(tests) {
111
139
  .join('/')}.png`))));
112
140
  }
113
141
  // https://tuhrig.de/how-to-know-you-are-inside-a-docker-container/
114
- exports.isInsideDocker = fs_1.default.existsSync('/proc/1/cgroup') && fs_1.default.readFileSync('/proc/1/cgroup', 'utf-8').includes('docker');
115
- const downloadBinary = (downloadUrl, destination) => new Promise((resolve, reject) => (0, https_1.get)(downloadUrl, (response) => {
142
+ exports.isInsideDocker = (fs_1.default.existsSync('/proc/1/cgroup') && fs_1.default.readFileSync('/proc/1/cgroup', 'utf-8').includes('docker')) ||
143
+ process.env.DOCKER === 'true';
144
+ const downloadBinary = (downloadUrl, destination) => new Promise((resolve, reject) => https_1.default.get(downloadUrl, (response) => {
116
145
  if (response.statusCode == 302) {
117
146
  const { location } = response.headers;
118
147
  if (!location) {
@@ -165,4 +194,25 @@ async function loadThroughTSX(callback) {
165
194
  await unregister();
166
195
  return result;
167
196
  }
197
+ function waitOnUrl(url, timeout, delay) {
198
+ const startTime = Date.now();
199
+ return new Promise((resolve, reject) => {
200
+ const interval = setInterval(() => {
201
+ http_1.default
202
+ .get(url, (response) => {
203
+ if (response.statusCode === 200) {
204
+ clearInterval(interval);
205
+ resolve();
206
+ }
207
+ })
208
+ .on('error', () => {
209
+ // Ignore HTTP errors
210
+ });
211
+ if (Date.now() - startTime > timeout) {
212
+ clearInterval(interval);
213
+ reject(new Error(`${url} didn't respond within ${timeout / 1000} seconds`));
214
+ }
215
+ }, delay);
216
+ });
217
+ }
168
218
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -4,7 +4,7 @@ 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 { LaunchOptions } from 'playwright-core';
7
+ import type { LaunchOptions } from 'playwright-core';
8
8
  export type DiffOptions = typeof Pixelmatch extends (x1: any, x2: any, x3: any, x4: any, x5: any, options?: infer T) => void ? T : never;
9
9
  export interface SetStoriesData {
10
10
  v?: number;
@@ -114,7 +114,14 @@ export interface BrowserConfigObject {
114
114
  platformName?: string;
115
115
  [name: string]: unknown;
116
116
  };
117
- playwrightOptions?: Omit<LaunchOptions, 'logger'>;
117
+ playwrightOptions?: Omit<LaunchOptions, 'logger'> & {
118
+ trace?: {
119
+ screenshots?: boolean;
120
+ snapshots?: boolean;
121
+ sources?: boolean;
122
+ path: string;
123
+ };
124
+ };
118
125
  }
119
126
  export type StorybookGlobals = Record<string, unknown>;
120
127
  export type BrowserConfig = boolean | string | BrowserConfigObject;
@@ -157,6 +164,11 @@ export interface Config {
157
164
  * Url where storybook hosted on
158
165
  */
159
166
  resolveStorybookUrl?: () => Promise<string>;
167
+ /**
168
+ * Command to automatically start Storybook if it is not running.
169
+ * For example, `npm run storybook`, `yarn run storybook` etc.
170
+ */
171
+ storybookAutorunCmd?: string;
160
172
  /**
161
173
  * Absolute path to directory with reference images
162
174
  * @default path.join(process.cwd(), './images')
@@ -303,8 +315,11 @@ export interface Options {
303
315
  reportDir?: string;
304
316
  gridUrl?: string;
305
317
  storybookUrl?: string;
318
+ storybookAutorunCmd?: string;
319
+ saveReport: boolean;
306
320
  failFast?: boolean;
307
321
  odiff?: boolean;
322
+ noDocker?: boolean;
308
323
  }
309
324
  export type WorkerError = 'browser' | 'test' | 'unknown';
310
325
  export type WorkerMessage = {
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAqjBA,oBAEC;AAED,8BAEC;AAED,wBASC;AAED,4BAEC;AAED,4BAEC;AAGD,gCAEC;AAED,oCAEC;AAED,4CAEC;AAED,0CAEC;AAED,4CAEC;AAED,sCAEC;AA5jBD,IAAY,eAUX;AAVD,WAAY,eAAe;IACzB,6CAA0B,CAAA;IAC1B,wDAAqC,CAAA;IACrC,iDAA8B,CAAA;IAC9B,mDAAgC,CAAA;IAChC,iDAA8B,CAAA;IAC9B,gEAA6C,CAAA;IAC7C,wDAAqC,CAAA;IACrC,6CAA0B,CAAA;IAC1B,mDAAgC,CAAA;AAClC,CAAC,EAVW,eAAe,+BAAf,eAAe,QAU1B;AAuWD,MAAa,WAAY,SAAQ,KAAK;IACpC,MAAM,CAA4C;CACnD;AAFD,kCAEC;AAwCD,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,kCAAmB,CAAA;IACnB,8BAAe,CAAA;IACf,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;IACrB,iCAAkB,CAAA;IAClB,iCAAkB,CAAA;AACpB,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB;AAwGD,SAAgB,IAAI;IAClB,UAAU;AACZ,CAAC;AAED,SAAgB,SAAS,CAAI,KAA2B;IACtD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AAC/C,CAAC;AAED,SAAgB,MAAM,CAAC,CAA8B;IACnD,OAAO,CACL,SAAS,CAAC,CAAC,CAAC;QACZ,QAAQ,CAAC,CAAC,CAAC;QACX,IAAI,IAAI,CAAC;QACT,SAAS,IAAI,CAAC;QACd,OAAO,CAAC,CAAC,EAAE,IAAI,QAAQ;QACvB,OAAO,CAAC,CAAC,OAAO,IAAI,QAAQ,CAC7B,CAAC;AACJ,CAAC;AAED,SAAgB,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAO,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,SAAgB,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAO,CAAC,IAAI,QAAQ,CAAC;AAC9B,CAAC;AAED,8DAA8D;AAC9D,SAAgB,UAAU,CAAC,CAAU;IACnC,OAAO,OAAO,CAAC,IAAI,UAAU,CAAC;AAChC,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,WAAW,IAAI,QAAQ,IAAI,KAAK,CAAC;AAC3D,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC;AACjD,CAAC;AAED,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;AAChE,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;AACjE,CAAC;AAED,SAAgB,aAAa,CAAC,OAAgB;IAC5C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAokBA,oBAEC;AAED,8BAEC;AAED,wBASC;AAED,4BAEC;AAED,4BAEC;AAGD,gCAEC;AAED,oCAEC;AAED,4CAEC;AAED,0CAEC;AAED,4CAEC;AAED,sCAEC;AA3kBD,IAAY,eAUX;AAVD,WAAY,eAAe;IACzB,6CAA0B,CAAA;IAC1B,wDAAqC,CAAA;IACrC,iDAA8B,CAAA;IAC9B,mDAAgC,CAAA;IAChC,iDAA8B,CAAA;IAC9B,gEAA6C,CAAA;IAC7C,wDAAqC,CAAA;IACrC,6CAA0B,CAAA;IAC1B,mDAAgC,CAAA;AAClC,CAAC,EAVW,eAAe,+BAAf,eAAe,QAU1B;AAsXD,MAAa,WAAY,SAAQ,KAAK;IACpC,MAAM,CAA4C;CACnD;AAFD,kCAEC;AAwCD,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,kCAAmB,CAAA;IACnB,8BAAe,CAAA;IACf,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;IACrB,iCAAkB,CAAA;IAClB,iCAAkB,CAAA;AACpB,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB;AAwGD,SAAgB,IAAI;IAClB,UAAU;AACZ,CAAC;AAED,SAAgB,SAAS,CAAI,KAA2B;IACtD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AAC/C,CAAC;AAED,SAAgB,MAAM,CAAC,CAA8B;IACnD,OAAO,CACL,SAAS,CAAC,CAAC,CAAC;QACZ,QAAQ,CAAC,CAAC,CAAC;QACX,IAAI,IAAI,CAAC;QACT,SAAS,IAAI,CAAC;QACd,OAAO,CAAC,CAAC,EAAE,IAAI,QAAQ;QACvB,OAAO,CAAC,CAAC,OAAO,IAAI,QAAQ,CAC7B,CAAC;AACJ,CAAC;AAED,SAAgB,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAO,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,SAAgB,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAO,CAAC,IAAI,QAAQ,CAAC;AAC9B,CAAC;AAED,8DAA8D;AAC9D,SAAgB,UAAU,CAAC,CAAU;IACnC,OAAO,OAAO,CAAC,IAAI,UAAU,CAAC;AAChC,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,WAAW,IAAI,QAAQ,IAAI,KAAK,CAAC;AAC3D,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC;AACjD,CAAC;AAED,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;AAChE,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;AACjE,CAAC;AAED,SAAgB,aAAa,CAAC,OAAgB;IAC5C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;AAC9D,CAAC"}
package/docs/config.md CHANGED
@@ -47,6 +47,9 @@ module.exports = {
47
47
  // Default Storybook url
48
48
  storybookUrl: 'http://localhost:6006',
49
49
 
50
+ // Command to automatically start Storybook if it is not running
51
+ storybookAutorunCmd: 'yarn storybook',
52
+
50
53
  // Where original images are stored
51
54
  screenDir: path.join(__dirname, '../images'),
52
55
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "creevey",
3
3
  "description": "Cross-browser screenshot testing tool for Storybook with fancy UI Runner",
4
- "version": "0.10.0-beta.23",
4
+ "version": "0.10.0-beta.25",
5
5
  "type": "commonjs",
6
6
  "bin": "dist/cli.js",
7
7
  "main": "./dist/index.js",
@@ -74,11 +74,11 @@
74
74
  "node": ">=18.0"
75
75
  },
76
76
  "peerDependencies": {
77
- "playwright": "*",
77
+ "playwright-core": "*",
78
78
  "selenium-webdriver": "*"
79
79
  },
80
80
  "peerDependenciesMeta": {
81
- "playwright": {
81
+ "playwright-core": {
82
82
  "optional": true
83
83
  },
84
84
  "selenium-webdriver": {
@@ -175,7 +175,7 @@
175
175
  "immer": "^10.1.1",
176
176
  "lint-staged": "^15.3.0",
177
177
  "pinst": "^3.0.0",
178
- "playwright-core": "^1.49.1",
178
+ "playwright-core": "^1.50.1",
179
179
  "prettier": "^3.4.2",
180
180
  "react": "^18.3.1",
181
181
  "react-dom": "^18.3.1",
package/src/creevey.ts CHANGED
@@ -31,7 +31,7 @@ process.on('SIGINT', () => {
31
31
 
32
32
  const argv = minimist<Options>(process.argv.slice(2), {
33
33
  string: ['browser', 'config', 'reporter', 'reportDir', 'screenDir', 'gridUrl', 'storybookUrl'],
34
- boolean: ['debug', 'trace', 'ui', 'odiff'],
34
+ boolean: ['debug', 'trace', 'ui', 'odiff', 'noDocker'],
35
35
  default: { port: 3000 },
36
36
  alias: { port: 'p', config: 'c', debug: 'd', update: 'u' },
37
37
  });
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { pathToFileURL } from 'url';
4
- import { loadStories as browserStoriesProvider } from './providers/browser.js';
4
+ import { loadStories as hybridStoriesProvider } from './providers/hybrid.js';
5
5
  import { Config, BrowserConfig, BrowserConfigObject, Options, isDefined } from '../types.js';
6
6
  import { configExt, loadThroughTSX } from './utils.js';
7
7
  import { CreeveyReporter, TeamcityReporter } from './reporter.js';
@@ -9,19 +9,20 @@ import { logger } from './logger.js';
9
9
 
10
10
  export const defaultBrowser = 'chrome';
11
11
 
12
- export const defaultConfig: Omit<Config, 'gridUrl' | 'testsDir' | 'tsConfig' | 'webdriver'> = {
12
+ export const defaultConfig: Omit<Config, 'gridUrl' | 'tsConfig' | 'webdriver'> = {
13
13
  disableTelemetry: false,
14
14
  useWorkerQueue: false,
15
15
  useDocker: true,
16
- dockerImage: 'aerokube/selenoid:latest-release',
16
+ dockerImage: 'aerokube/selenoid:latest-release', // TODO What about playwright?
17
17
  dockerImagePlatform: '',
18
18
  pullImages: true,
19
19
  failFast: false,
20
20
  storybookUrl: 'http://localhost:6006',
21
21
  screenDir: path.resolve('images'),
22
22
  reportDir: path.resolve('report'),
23
+ testsDir: path.resolve('src'),
23
24
  reporter: process.env.TEAMCITY_VERSION ? TeamcityReporter : CreeveyReporter,
24
- storiesProvider: browserStoriesProvider,
25
+ storiesProvider: hybridStoriesProvider,
25
26
  maxRetries: 0,
26
27
  testTimeout: 30000,
27
28
  diffOptions: { threshold: 0.1, includeAA: false },
@@ -83,10 +84,12 @@ export async function readConfig(options: Options): Promise<Config> {
83
84
  Object.assign(userConfig, configData);
84
85
  }
85
86
 
87
+ if (options.noDocker) userConfig.useDocker = false;
86
88
  if (options.failFast != undefined) userConfig.failFast = Boolean(options.failFast);
87
89
  if (options.reportDir) userConfig.reportDir = path.resolve(options.reportDir);
88
90
  if (options.screenDir) userConfig.screenDir = path.resolve(options.screenDir);
89
91
  if (options.storybookUrl) userConfig.storybookUrl = options.storybookUrl;
92
+ if (options.storybookAutorunCmd) userConfig.storybookAutorunCmd = options.storybookAutorunCmd;
90
93
 
91
94
  // NOTE: Hack to pass typescript checking
92
95
  const config = userConfig as Config;
@@ -0,0 +1,32 @@
1
+ import { Config } from 'src/types';
2
+ import { waitOnUrl } from './utils.js';
3
+ import { logger } from './logger.js';
4
+ import { exec } from 'node:child_process';
5
+
6
+ const RESPONSE_FAST_CHECK_TIMEOUT_MS = 3000;
7
+ const RESPONSE_CHECK_TIMEOUT_MS = 10000;
8
+ const RESPONSE_CHECK_INTERVAL_MS = 200;
9
+
10
+ export async function getStorybookUrl({ storybookUrl, resolveStorybookUrl }: Config) {
11
+ return resolveStorybookUrl ? resolveStorybookUrl() : storybookUrl;
12
+ }
13
+
14
+ export async function tryAutorunStorybook(url: string, storybookAutorunCmd: string) {
15
+ try {
16
+ await waitOnUrl(url, RESPONSE_FAST_CHECK_TIMEOUT_MS, RESPONSE_CHECK_INTERVAL_MS);
17
+ } catch {
18
+ logger().info(`Trying start Storybook automatically via \`${storybookAutorunCmd}\` from config...`);
19
+ exec(storybookAutorunCmd);
20
+ }
21
+ }
22
+
23
+ export async function checkIsStorybookConnected(url: string) {
24
+ try {
25
+ await waitOnUrl(url, RESPONSE_CHECK_TIMEOUT_MS, RESPONSE_CHECK_INTERVAL_MS);
26
+ return true;
27
+ } catch (reason: unknown) {
28
+ const error = reason instanceof Error ? (reason.stack ?? reason.message) : (reason as string);
29
+ logger().error(error);
30
+ return false;
31
+ }
32
+ }
@@ -5,10 +5,11 @@ import { Options, Config, BrowserConfigObject, isWorkerMessage } from '../types.
5
5
  import { logger } from './logger.js';
6
6
  import { SeleniumWebdriver } from './selenium/webdriver.js';
7
7
  import { LOCALHOST_REGEXP } from './webdriver.js';
8
- import { isInsideDocker } from './utils.js';
8
+ import { isInsideDocker, resolvePlaywrightBrowserType, shutdownWithError } from './utils.js';
9
9
  import { sendWorkerMessage } from './messages.js';
10
10
  import { buildImage } from './docker.js';
11
11
  import { mkdir, writeFile } from 'fs/promises';
12
+ import { getStorybookUrl, tryAutorunStorybook, checkIsStorybookConnected } from './connection.js';
12
13
 
13
14
  async function startWebdriverServer(browser: string, config: Config, options: Options): Promise<string | undefined> {
14
15
  if (config.webdriver === SeleniumWebdriver) {
@@ -26,7 +27,13 @@ async function startWebdriverServer(browser: string, config: Config, options: Op
26
27
  } else {
27
28
  if (config.gridUrl) return undefined;
28
29
 
29
- // TODO start standalone playwright server (useDocker == false)
30
+ if (!config.useDocker) {
31
+ if (cluster.isPrimary) return undefined;
32
+
33
+ const { browserName } = config.browsers[browser] as BrowserConfigObject;
34
+ return `creevey://${resolvePlaywrightBrowserType(browserName)}.playwright`;
35
+ }
36
+
30
37
  const {
31
38
  default: { version },
32
39
  } = await import('playwright-core/package.json', { with: { type: 'json' } });
@@ -96,6 +103,34 @@ export default async function (options: Options): Promise<void> {
96
103
  gridUrl = await startWebdriverServer(browser, config, options);
97
104
  }
98
105
 
106
+ if (cluster.isPrimary) {
107
+ const url = await getStorybookUrl(config);
108
+
109
+ if (!url) {
110
+ logger().error(`Creevey can't access storybook. Set \`storybookUrl\` or \`resolveStorybookUrl\` in config`);
111
+ shutdownWithError();
112
+ return;
113
+ }
114
+
115
+ if (url && config.storybookAutorunCmd) {
116
+ logger().info(`Storybook should be started via \`${config.storybookAutorunCmd}\` and be accessible at ${url}`);
117
+ logger().info('Waiting Storybook...');
118
+ await tryAutorunStorybook(url, config.storybookAutorunCmd);
119
+ } else {
120
+ logger().info(`Storybook should be started and be accessible at ${url}`);
121
+ logger().info("Tip: you can start Storybook automatically by adding `storybookAutorunCmd` to Creevey's config");
122
+ logger().info('Waiting Storybook...');
123
+ }
124
+
125
+ const isConnected = await checkIsStorybookConnected(url);
126
+ if (isConnected) {
127
+ logger().info('Storybook connected!\n');
128
+ } else {
129
+ logger().error('Storybook is not responding. Please start Storybook and restart Creevey');
130
+ shutdownWithError();
131
+ }
132
+ }
133
+
99
134
  switch (true) {
100
135
  case Boolean(update): {
101
136
  (await import('./update.js')).update(config, typeof update == 'string' ? update : undefined);
@@ -14,7 +14,7 @@ import { sendScreenshotsCount } from '../telemetry.js';
14
14
  const importMetaUrl = pathToFileURL(__filename).href;
15
15
 
16
16
  async function copyStatics(reportDir: string): Promise<void> {
17
- const clientDir = path.join(path.dirname(fileURLToPath(importMetaUrl)), '../../client/web');
17
+ const clientDir = path.join(path.dirname(fileURLToPath(importMetaUrl)), '../../../dist/client/web');
18
18
  const assets = (await readdir(path.join(clientDir, 'assets'), { withFileTypes: true }))
19
19
  .filter((dirent) => dirent.isFile())
20
20
  .map((dirent) => dirent.name);
@@ -1,19 +1,7 @@
1
1
  import semver from 'semver';
2
2
  import { exec } from 'shelljs';
3
3
  import { LaunchOptions } from 'playwright-core';
4
-
5
- const browserMap: Record<string, string> = {
6
- chromium: 'chromium',
7
- 'chromium-headless-shell': 'chromium',
8
- chrome: 'chromium',
9
- 'chrome-beta': 'chromium',
10
- msedge: 'chromium',
11
- 'msedge-beta': 'chromium',
12
- 'msedge-dev': 'chromium',
13
- 'bidi-chromium': 'chromium',
14
- firefox: 'firefox',
15
- webkit: 'webkit',
16
- };
4
+ import { resolvePlaywrightBrowserType } from '../utils';
17
5
 
18
6
  // TODO Support custom docker images
19
7
  export function playwrightDockerFile(browser: string, version: string, serverOptions?: LaunchOptions): string {
@@ -32,7 +20,7 @@ FROM node:lts
32
20
  WORKDIR /creevey
33
21
 
34
22
  RUN echo "{ \\"type\\": \\"module\\" }" > package.json && \\
35
- echo "import { ${browserMap[browser]} as browser } from 'playwright-core';" >> index.js && \\
23
+ echo "import { ${resolvePlaywrightBrowserType(browser)} as browser } from 'playwright-core';" >> index.js && \\
36
24
  echo "const ws = await browser.launchServer({ ...${JSON.stringify(serverOptions)}, port: 4444, wsPath: 'creevey' })" >> index.js && \\${
37
25
  npmRegistry
38
26
  ? `