creevey 0.10.0-beta.2 → 0.10.0-beta.4

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/addon/controller.js +4 -5
  2. package/dist/client/addon/controller.js.map +1 -1
  3. package/dist/client/addon/withCreevey.js +10 -34
  4. package/dist/client/addon/withCreevey.js.map +1 -1
  5. package/dist/creevey.js +1 -0
  6. package/dist/creevey.js.map +1 -1
  7. package/dist/server/config.js +2 -2
  8. package/dist/server/config.js.map +1 -1
  9. package/dist/server/index.js +22 -1
  10. package/dist/server/index.js.map +1 -1
  11. package/dist/server/master/pool.js +2 -0
  12. package/dist/server/master/pool.js.map +1 -1
  13. package/dist/server/playwright/internal.js +26 -17
  14. package/dist/server/playwright/internal.js.map +1 -1
  15. package/dist/server/reporter.js +1 -1
  16. package/dist/server/reporter.js.map +1 -1
  17. package/dist/server/selenium/internal.js +4 -5
  18. package/dist/server/selenium/internal.js.map +1 -1
  19. package/dist/server/selenium/selenoid.js +2 -2
  20. package/dist/server/selenium/selenoid.js.map +1 -1
  21. package/dist/server/telemetry.js +7 -3
  22. package/dist/server/telemetry.js.map +1 -1
  23. package/dist/types.d.ts +24 -9
  24. package/dist/types.js +13 -1
  25. package/dist/types.js.map +1 -1
  26. package/package.json +6 -10
  27. package/src/client/addon/controller.ts +13 -6
  28. package/src/client/addon/withCreevey.ts +19 -12
  29. package/src/creevey.ts +1 -0
  30. package/src/server/config.ts +2 -2
  31. package/src/server/index.ts +19 -2
  32. package/src/server/master/pool.ts +2 -0
  33. package/src/server/playwright/internal.ts +46 -21
  34. package/src/server/reporter.ts +1 -1
  35. package/src/server/selenium/internal.ts +6 -6
  36. package/src/server/selenium/selenoid.ts +2 -2
  37. package/src/server/telemetry.ts +7 -3
  38. package/src/types.ts +26 -11
@@ -3,8 +3,16 @@ import Logger from 'loglevel';
3
3
  import chalk from 'chalk';
4
4
  import { v4 } from 'uuid';
5
5
  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';
6
+ import {
7
+ BrowserConfigObject,
8
+ Config,
9
+ Options,
10
+ StoriesRaw,
11
+ StoryInput,
12
+ StorybookEvents,
13
+ StorybookGlobals,
14
+ noop,
15
+ } from '../../types';
8
16
  import { subscribeOn } from '../messages';
9
17
  import { appendIframePath, getAddresses, LOCALHOST_REGEXP, resolveStorybookUrl, storybookRootID } from '../webdriver';
10
18
  import { isShuttingDown, runSequence } from '../utils';
@@ -140,7 +148,7 @@ export class InternalBrowser {
140
148
  });
141
149
  });
142
150
  },
143
- [story.id, updatedArgs, UPDATE_STORY_ARGS, STORY_RENDERED] as const,
151
+ [story.id, updatedArgs, StorybookEvents.UPDATE_STORY_ARGS, StorybookEvents.STORY_RENDERED] as const,
144
152
  );
145
153
  }
146
154
 
@@ -167,26 +175,43 @@ export class InternalBrowser {
167
175
  options: Options,
168
176
  ): Promise<InternalBrowser | null> {
169
177
  const browserConfig = config.browsers[browserName] as BrowserConfigObject;
170
- const { storybookUrl: address = config.storybookUrl, viewport, _storybookGlobals } = browserConfig;
178
+ const {
179
+ storybookUrl: address = config.storybookUrl,
180
+ viewport,
181
+ _storybookGlobals,
182
+ seleniumCapabilities,
183
+ playwrightOptions,
184
+ } = browserConfig;
171
185
 
172
186
  let browser: Browser | null = null;
173
187
 
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
- );
188
+ if (new URL(gridUrl).protocol === 'ws:') {
189
+ switch (browserConfig.browserName) {
190
+ case 'chromium':
191
+ browser = await tryConnect(chromium, gridUrl);
192
+ break;
193
+ case 'firefox':
194
+ browser = await tryConnect(firefox, gridUrl);
195
+ break;
196
+ case 'webkit':
197
+ browser = await tryConnect(webkit, gridUrl);
198
+ break;
199
+
200
+ default:
201
+ logger.error(
202
+ `Unknown browser ${browserConfig.browserName}. Playwright supports browsers: chromium, firefox, webkit`,
203
+ );
204
+ }
205
+ } else {
206
+ if (browserConfig.browserName != 'chrome') {
207
+ logger.error("Playwright's Selenium Grid feature supports only chrome browser");
208
+ return null;
209
+ }
210
+
211
+ process.env.SELENIUM_REMOTE_URL = gridUrl;
212
+ process.env.SELENIUM_REMOTE_CAPABILITIES = JSON.stringify(seleniumCapabilities);
213
+
214
+ browser = await chromium.launch(playwrightOptions);
190
215
  }
191
216
 
192
217
  if (!browser) {
@@ -317,7 +342,7 @@ export class InternalBrowser {
317
342
  if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return true;
318
343
  if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_GLOBALS) == undefined) return true;
319
344
  return false;
320
- }, SET_GLOBALS);
345
+ }, StorybookEvents.SET_GLOBALS);
321
346
  } catch (e: unknown) {
322
347
  this.#logger.debug('An error has been caught during the script:', e);
323
348
  }
@@ -34,7 +34,7 @@ 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(
@@ -1,5 +1,4 @@
1
1
  import { Args } from '@storybook/csf';
2
- import { SET_GLOBALS, UPDATE_STORY_ARGS, STORY_RENDERED } from '@storybook/core-events';
3
2
  import chalk from 'chalk';
4
3
  import http from 'http';
5
4
  import https from 'https';
@@ -22,6 +21,7 @@ import {
22
21
  StoriesRaw,
23
22
  Options,
24
23
  ServerTest,
24
+ StorybookEvents,
25
25
  } from '../../types.js';
26
26
  import { colors, logger } from '../logger.js';
27
27
  import { subscribeOn } from '../messages.js';
@@ -100,7 +100,7 @@ async function buildWebdriver(
100
100
  options: Options,
101
101
  ): Promise<WebDriver | null> {
102
102
  const browserConfig = config.browsers[browserName] as BrowserConfigObject;
103
- const { _storybookGlobals, /*customizeBuilder,*/ ...userCapabilities } = browserConfig;
103
+ const { /*customizeBuilder,*/ seleniumCapabilities } = browserConfig;
104
104
 
105
105
  const url = new URL(gridUrl);
106
106
  url.username = url.username ? '********' : '';
@@ -108,7 +108,7 @@ async function buildWebdriver(
108
108
  logger.debug(`(${browserName}) Connecting to Selenium ${chalk.magenta(url.toString())}`);
109
109
 
110
110
  // TODO Define some capabilities explicitly and define typings
111
- const capabilities = new Capabilities({ ...userCapabilities, pageLoadStrategy: PageLoadStrategy.EAGER });
111
+ const capabilities = new Capabilities({ ...seleniumCapabilities, pageLoadStrategy: PageLoadStrategy.EAGER });
112
112
  const prefs = new logging.Preferences();
113
113
 
114
114
  if (options.trace) {
@@ -338,8 +338,8 @@ export class InternalBrowser {
338
338
  },
339
339
  story.id,
340
340
  updatedArgs,
341
- UPDATE_STORY_ARGS,
342
- STORY_RENDERED,
341
+ StorybookEvents.UPDATE_STORY_ARGS,
342
+ StorybookEvents.STORY_RENDERED,
343
343
  );
344
344
  }
345
345
 
@@ -544,7 +544,7 @@ export class InternalBrowser {
544
544
  if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return true;
545
545
  if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_GLOBALS) == undefined) return true;
546
546
  return false;
547
- }, SET_GLOBALS);
547
+ }, StorybookEvents.SET_GLOBALS);
548
548
  } catch (e: unknown) {
549
549
  this.#logger.debug('An error has been caught during the script:', e);
550
550
  }
@@ -30,7 +30,7 @@ async function createSelenoidConfig(
30
30
  browsers.forEach(
31
31
  ({
32
32
  browserName,
33
- browserVersion = 'latest',
33
+ seleniumCapabilities: { browserVersion = 'latest' } = {},
34
34
  dockerImage = `selenoid/${browserName}:${browserVersion}`,
35
35
  webdriverCommand = [],
36
36
  }) => {
@@ -117,7 +117,7 @@ export async function startSelenoidContainer(config: Config, debug: boolean): Pr
117
117
  browsers.forEach(
118
118
  ({
119
119
  browserName,
120
- browserVersion = 'latest',
120
+ seleniumCapabilities: { browserVersion = 'latest' } = {},
121
121
  limit: browserLimit = 1,
122
122
  dockerImage = `selenoid/${browserName}:${browserVersion}`,
123
123
  }) => {
@@ -154,12 +154,16 @@ export async function sendScreenshotsCount(
154
154
  name: name,
155
155
  gridUrl: browser.gridUrl ? sanitizeGridUrl(browser.gridUrl) : undefined,
156
156
  browserName: browser.browserName,
157
- browserVersion: browser.browserVersion,
158
- platformName: browser.platformName,
157
+ // @ts-expect-error Support old config version
158
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
159
+ browserVersion: browser.seleniumCapabilities?.browserVersion ?? browser.browserVersion,
160
+ // @ts-expect-error Support old config version
161
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
162
+ platformName: browser.seleniumCapabilities?.platformName ?? browser.platformName,
159
163
  viewport: browser.viewport,
160
164
  limit: browser.limit,
161
165
  dockerImage: browser.dockerImage,
162
- 'se:teamname': browser['se:teamname'],
166
+ 'se:teamname': browser.seleniumCapabilities?.['se:teamname'],
163
167
  }
164
168
  : browser,
165
169
  ]),
package/src/types.ts CHANGED
@@ -5,6 +5,7 @@ import type { ODiffOptions } from 'odiff-bin';
5
5
  import type { expect } from 'chai';
6
6
  import type EventEmitter from 'events';
7
7
  import type Logger from 'loglevel';
8
+ import { LaunchOptions } from 'playwright-core';
8
9
  // import type { Browser } from 'playwright-core';
9
10
 
10
11
  /* eslint-disable @typescript-eslint/no-explicit-any */
@@ -41,6 +42,18 @@ export interface StoryMeta {
41
42
  };
42
43
  }
43
44
 
45
+ export enum StorybookEvents {
46
+ SET_STORIES = 'setStories',
47
+ SET_CURRENT_STORY = 'setCurrentStory',
48
+ FORCE_REMOUNT = 'forceRemount',
49
+ STORY_RENDERED = 'storyRendered',
50
+ STORY_ERRORED = 'storyErrored',
51
+ STORY_THREW_EXCEPTION = 'storyThrewException',
52
+ UPDATE_STORY_ARGS = 'updateStoryArgs',
53
+ SET_GLOBALS = 'setGlobals',
54
+ UPDATE_GLOBALS = 'updateGlobals',
55
+ }
56
+
44
57
  export interface CreeveyMeta {
45
58
  parameters?: {
46
59
  creevey?: CreeveyStoryParams;
@@ -91,14 +104,6 @@ export class ChromeConfig {
91
104
  */
92
105
  export interface BrowserConfigObject {
93
106
  browserName: string;
94
- /**
95
- * Browser version. Ignored with Playwright webdriver
96
- */
97
- browserVersion?: string;
98
- /**
99
- * Operation system name. Ignored with Playwright webdriver
100
- */
101
- platformName?: string;
102
107
  // customizeBuilder?: (builder: Builder) => Builder;
103
108
  limit?: number;
104
109
  /**
@@ -122,15 +127,25 @@ export interface BrowserConfigObject {
122
127
  * Used only with `useDocker == false`
123
128
  */
124
129
  webdriverCommand?: string[];
125
- // TODO Check version compatibility
126
- // playwrightVersion?: string;
127
130
  // /**
128
131
  // * Use to start standalone playwright browser
129
132
  // */
130
133
  // playwrightBrowser?: () => Promise<Browser>;
131
134
  viewport?: { width: number; height: number };
132
135
 
133
- [name: string]: unknown;
136
+ seleniumCapabilities?: {
137
+ /**
138
+ * Browser version. Ignored with Playwright webdriver
139
+ */
140
+ browserVersion?: string;
141
+ /**
142
+ * Operation system name. Ignored with Playwright webdriver
143
+ */
144
+ platformName?: string;
145
+ [name: string]: unknown;
146
+ };
147
+
148
+ playwrightOptions?: Omit<LaunchOptions, 'logger'>;
134
149
  }
135
150
 
136
151
  export type StorybookGlobals = Record<string, unknown>;