creevey 0.10.0-beta.0 → 0.10.0-beta.10

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 (159) 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/controller.js +4 -5
  4. package/dist/client/addon/controller.js.map +1 -1
  5. package/dist/client/addon/withCreevey.js +18 -34
  6. package/dist/client/addon/withCreevey.js.map +1 -1
  7. package/dist/client/shared/components/ImagesView/SwapView.js +12 -0
  8. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
  9. package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -0
  10. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
  11. package/dist/client/shared/components/ResultsPage.js +23 -5
  12. package/dist/client/shared/components/ResultsPage.js.map +1 -1
  13. package/dist/client/web/CreeveyApp.js +22 -6
  14. package/dist/client/web/CreeveyApp.js.map +1 -1
  15. package/dist/client/web/CreeveyContext.d.ts +5 -0
  16. package/dist/client/web/CreeveyContext.js +3 -0
  17. package/dist/client/web/CreeveyContext.js.map +1 -1
  18. package/dist/client/web/CreeveyView/SideBar/Search.js +2 -2
  19. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
  20. package/dist/client/web/CreeveyView/SideBar/SideBar.js +1 -0
  21. package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
  22. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +49 -6
  23. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  24. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +1 -3
  25. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  26. package/dist/client/web/CreeveyView/SideBar/TestLink.js +1 -3
  27. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  28. package/dist/client/web/KeyboardEventsContext.d.ts +1 -8
  29. package/dist/client/web/KeyboardEventsContext.js +62 -57
  30. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  31. package/dist/client/web/assets/{index-DkmZfG9C.js → index-BE9CL5_G.js} +94 -94
  32. package/dist/client/web/index.html +1 -1
  33. package/dist/creevey.js +13 -5
  34. package/dist/creevey.js.map +1 -1
  35. package/dist/index.js +1 -5
  36. package/dist/index.js.map +1 -1
  37. package/dist/playwright.d.ts +2 -0
  38. package/dist/playwright.js +6 -0
  39. package/dist/playwright.js.map +1 -0
  40. package/dist/selenium.d.ts +2 -0
  41. package/dist/selenium.js +6 -0
  42. package/dist/selenium.js.map +1 -0
  43. package/dist/server/config.d.ts +1 -1
  44. package/dist/server/config.js +12 -5
  45. package/dist/server/config.js.map +1 -1
  46. package/dist/server/docker.js +2 -2
  47. package/dist/server/docker.js.map +1 -1
  48. package/dist/server/index.js +40 -4
  49. package/dist/server/index.js.map +1 -1
  50. package/dist/server/logger.d.ts +2 -1
  51. package/dist/server/logger.js +7 -3
  52. package/dist/server/logger.js.map +1 -1
  53. package/dist/server/master/api.js +1 -1
  54. package/dist/server/master/api.js.map +1 -1
  55. package/dist/server/master/pool.d.ts +3 -3
  56. package/dist/server/master/pool.js +10 -63
  57. package/dist/server/master/pool.js.map +1 -1
  58. package/dist/server/master/queue.d.ts +13 -0
  59. package/dist/server/master/queue.js +64 -0
  60. package/dist/server/master/queue.js.map +1 -0
  61. package/dist/server/master/runner.d.ts +1 -0
  62. package/dist/server/master/runner.js +4 -1
  63. package/dist/server/master/runner.js.map +1 -1
  64. package/dist/server/master/server.js +1 -1
  65. package/dist/server/master/server.js.map +1 -1
  66. package/dist/server/master/start.js +4 -4
  67. package/dist/server/master/start.js.map +1 -1
  68. package/dist/server/playwright/docker-file.js +12 -1
  69. package/dist/server/playwright/docker-file.js.map +1 -1
  70. package/dist/server/playwright/docker.d.ts +1 -1
  71. package/dist/server/playwright/docker.js +1 -6
  72. package/dist/server/playwright/docker.js.map +1 -1
  73. package/dist/server/playwright/internal.d.ts +2 -2
  74. package/dist/server/playwright/internal.js +56 -44
  75. package/dist/server/playwright/internal.js.map +1 -1
  76. package/dist/server/playwright/webdriver.d.ts +2 -1
  77. package/dist/server/playwright/webdriver.js +4 -1
  78. package/dist/server/playwright/webdriver.js.map +1 -1
  79. package/dist/server/providers/browser.js +2 -1
  80. package/dist/server/providers/browser.js.map +1 -1
  81. package/dist/server/providers/hybrid.js +1 -1
  82. package/dist/server/providers/hybrid.js.map +1 -1
  83. package/dist/server/reporter.js +4 -4
  84. package/dist/server/reporter.js.map +1 -1
  85. package/dist/server/selenium/internal.d.ts +3 -3
  86. package/dist/server/selenium/internal.js +126 -89
  87. package/dist/server/selenium/internal.js.map +1 -1
  88. package/dist/server/selenium/selenoid.js +2 -2
  89. package/dist/server/selenium/selenoid.js.map +1 -1
  90. package/dist/server/selenium/webdriver.d.ts +2 -1
  91. package/dist/server/selenium/webdriver.js +8 -1
  92. package/dist/server/selenium/webdriver.js.map +1 -1
  93. package/dist/server/telemetry.js +7 -3
  94. package/dist/server/telemetry.js.map +1 -1
  95. package/dist/server/utils.d.ts +2 -1
  96. package/dist/server/utils.js +13 -3
  97. package/dist/server/utils.js.map +1 -1
  98. package/dist/server/webdriver.d.ts +4 -4
  99. package/dist/server/webdriver.js +10 -9
  100. package/dist/server/webdriver.js.map +1 -1
  101. package/dist/server/worker/chai-image.d.ts +1 -2
  102. package/dist/server/worker/chai-image.js +4 -3
  103. package/dist/server/worker/chai-image.js.map +1 -1
  104. package/dist/server/worker/start.js +27 -39
  105. package/dist/server/worker/start.js.map +1 -1
  106. package/dist/types.d.ts +32 -21
  107. package/dist/types.js +13 -1
  108. package/dist/types.js.map +1 -1
  109. package/package.json +45 -38
  110. package/playwright.d.ts +2 -0
  111. package/selenium.d.ts +2 -0
  112. package/src/client/addon/components/Panel.tsx +2 -2
  113. package/src/client/addon/controller.ts +13 -6
  114. package/src/client/addon/withCreevey.ts +25 -13
  115. package/src/client/shared/components/ImagesView/SwapView.tsx +18 -0
  116. package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -0
  117. package/src/client/shared/components/ResultsPage.tsx +28 -7
  118. package/src/client/web/CreeveyApp.tsx +25 -7
  119. package/src/client/web/CreeveyContext.tsx +9 -0
  120. package/src/client/web/CreeveyView/SideBar/Search.tsx +3 -3
  121. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +1 -0
  122. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +37 -6
  123. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +3 -5
  124. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +2 -4
  125. package/src/client/web/KeyboardEventsContext.tsx +61 -73
  126. package/src/creevey.ts +13 -6
  127. package/src/index.ts +0 -2
  128. package/src/playwright.ts +1 -0
  129. package/src/selenium.ts +1 -0
  130. package/src/server/config.ts +19 -7
  131. package/src/server/docker.ts +2 -2
  132. package/src/server/index.ts +45 -4
  133. package/src/server/logger.ts +6 -2
  134. package/src/server/master/api.ts +1 -1
  135. package/src/server/master/pool.ts +18 -56
  136. package/src/server/master/queue.ts +64 -0
  137. package/src/server/master/runner.ts +4 -1
  138. package/src/server/master/server.ts +1 -1
  139. package/src/server/master/start.ts +7 -4
  140. package/src/server/playwright/docker-file.ts +14 -1
  141. package/src/server/playwright/docker.ts +2 -12
  142. package/src/server/playwright/internal.ts +76 -49
  143. package/src/server/playwright/webdriver.ts +7 -2
  144. package/src/server/providers/browser.ts +2 -1
  145. package/src/server/providers/hybrid.ts +1 -1
  146. package/src/server/reporter.ts +4 -3
  147. package/src/server/selenium/internal.ts +147 -93
  148. package/src/server/selenium/selenoid.ts +2 -2
  149. package/src/server/selenium/webdriver.ts +12 -2
  150. package/src/server/telemetry.ts +7 -3
  151. package/src/server/utils.ts +14 -4
  152. package/src/server/webdriver.ts +13 -15
  153. package/src/server/worker/chai-image.ts +4 -4
  154. package/src/server/worker/start.ts +29 -48
  155. package/src/types.ts +35 -23
  156. package/types/playwright-context.d.ts +7 -0
  157. package/types/selenium-context.d.ts +7 -0
  158. package/.yarnrc.yml +0 -1
  159. package/chromatic.config.json +0 -5
@@ -1,7 +1,6 @@
1
- import Logger from 'loglevel';
2
1
  import chalk from 'chalk';
3
2
  import { networkInterfaces } from 'os';
4
- import { logger as defaultLogger } from './logger.js';
3
+ import { logger } from './logger.js';
5
4
  import { Args } from '@storybook/csf';
6
5
  import {
7
6
  isDefined,
@@ -11,6 +10,7 @@ import {
11
10
  CreeveyStoryParams,
12
11
  StoriesRaw,
13
12
  CreeveyWebdriver,
13
+ ServerTest,
14
14
  } from '../types.js';
15
15
  import { emitStoriesMessage, subscribeOn } from './messages.js';
16
16
 
@@ -21,15 +21,15 @@ const DOCKER_INTERNAL = 'host.docker.internal';
21
21
  export async function resolveStorybookUrl(
22
22
  storybookUrl: string,
23
23
  checkUrl: (url: string) => Promise<boolean>,
24
- logger: Logger.Logger = defaultLogger,
25
24
  ): Promise<string> {
26
- logger.debug('Resolving storybook url');
25
+ logger().debug('Resolving storybook url');
27
26
  const addresses = getAddresses();
27
+ // TODO Use Promise.race?
28
28
  for (const ip of addresses) {
29
29
  const resolvedUrl = storybookUrl.replace(LOCALHOST_REGEXP, ip);
30
- logger.debug(`Checking storybook availability on ${chalk.magenta(resolvedUrl)}`);
30
+ logger().debug(`Checking storybook availability on ${chalk.magenta(resolvedUrl)}`);
31
31
  if (await checkUrl(resolvedUrl)) {
32
- logger.debug(`Resolved storybook url ${chalk.magenta(resolvedUrl)}`);
32
+ logger().debug(`Resolved storybook url ${chalk.magenta(resolvedUrl)}`);
33
33
  return resolvedUrl;
34
34
  }
35
35
  }
@@ -71,11 +71,9 @@ export abstract class CreeveyWebdriverBase implements CreeveyWebdriver {
71
71
 
72
72
  abstract loadStoriesFromBrowser(): Promise<StoriesRaw>;
73
73
 
74
- async switchStory(
75
- story: StoryInput,
76
- context: BaseCreeveyTestContext,
77
- logger: Logger.Logger,
78
- ): Promise<CreeveyTestContext> {
74
+ abstract afterTest(test: ServerTest): Promise<void>;
75
+
76
+ async switchStory(story: StoryInput, context: BaseCreeveyTestContext): Promise<CreeveyTestContext> {
79
77
  const { id, title, name, parameters } = story;
80
78
  const {
81
79
  captureElement = `#${storybookRootID}`,
@@ -83,7 +81,7 @@ export abstract class CreeveyWebdriverBase implements CreeveyWebdriver {
83
81
  ignoreElements,
84
82
  } = (parameters.creevey ?? {}) as CreeveyStoryParams;
85
83
 
86
- logger.debug(`Switching to story ${chalk.cyan(title)}/${chalk.cyan(name)} by id ${chalk.magenta(id)}`);
84
+ logger().debug(`Switching to story ${chalk.cyan(title)}/${chalk.cyan(name)} by id ${chalk.magenta(id)}`);
87
85
 
88
86
  let storyPlayResolver: (isCompleted: boolean) => void;
89
87
  let waitForComplete = new Promise<boolean>((resolve) => (storyPlayResolver = resolve));
@@ -104,7 +102,7 @@ export abstract class CreeveyWebdriverBase implements CreeveyWebdriver {
104
102
  const isCaptureCalled = await this.selectStory(id, waitForReady);
105
103
 
106
104
  if (isCaptureCalled) {
107
- logger.debug(`Capturing screenshots from ${chalk.magenta(id)} story's \`play()\` function`);
105
+ logger().debug(`Capturing screenshots from ${chalk.magenta(id)} story's \`play()\` function`);
108
106
  while (!(await waitForComplete)) {
109
107
  waitForComplete = new Promise<boolean>((resolve) => (storyPlayResolver = resolve));
110
108
  }
@@ -112,8 +110,8 @@ export abstract class CreeveyWebdriverBase implements CreeveyWebdriver {
112
110
 
113
111
  unsubscribe();
114
112
 
115
- if (isCaptureCalled) logger.debug(`Story ${chalk.magenta(id)} completed capturing`);
116
- else logger.debug(`Story ${chalk.magenta(id)} ready for capturing`);
113
+ if (isCaptureCalled) logger().debug(`Story ${chalk.magenta(id)} completed capturing`);
114
+ else logger().debug(`Story ${chalk.magenta(id)} ready for capturing`);
117
115
 
118
116
  return Object.assign(
119
117
  {
@@ -1,8 +1,8 @@
1
- import Logger from 'loglevel';
1
+ import { logger } from '../logger';
2
+
2
3
  export default function (
3
4
  matchImage: (image: Buffer, imageName?: string) => Promise<void>,
4
5
  matchImages: (images: Record<string, Buffer>) => Promise<void>,
5
- logger: Logger.Logger,
6
6
  ) {
7
7
  let isWarningShown = false;
8
8
  return function chaiImage({ Assertion }: Chai.ChaiStatic, utils: Chai.ChaiUtils): void {
@@ -11,7 +11,7 @@ export default function (
11
11
  'matchImage',
12
12
  async function (this: Record<string, unknown>, imageName?: string) {
13
13
  if (!isWarningShown) {
14
- logger.warn(
14
+ logger().warn(
15
15
  '`expect(...).to.matchImage()` is deprecated and will be removed in the next major release. Please use `context.matchImage()` instead.',
16
16
  );
17
17
  isWarningShown = true;
@@ -23,7 +23,7 @@ export default function (
23
23
 
24
24
  utils.addMethod(Assertion.prototype, 'matchImages', async function (this: Record<string, unknown>) {
25
25
  if (!isWarningShown) {
26
- logger.warn(
26
+ logger().warn(
27
27
  '`expect(...).to.matchImages()` is deprecated and will be removed in the next major release. Please use `context.matchImages()` instead.',
28
28
  );
29
29
  isWarningShown = true;
@@ -1,8 +1,5 @@
1
1
  import chai from 'chai';
2
- import chalk from 'chalk';
3
- import Logger from 'loglevel';
4
2
  import EventEmitter from 'events';
5
- import { Key, until, WebDriver } from 'selenium-webdriver';
6
3
  import {
7
4
  BaseCreeveyTestContext,
8
5
  Config,
@@ -19,7 +16,6 @@ import {
19
16
  } from '../../types.js';
20
17
  import { subscribeOn, emitTestMessage, emitWorkerMessage } from '../messages.js';
21
18
  import chaiImage from './chai-image.js';
22
- import { SeleniumWebdriver } from '../selenium/webdriver.js';
23
19
  import { getMatchers, getOdiffMatchers, ImageContext } from './match-image.js';
24
20
  import { loadTestsFromStories } from '../stories.js';
25
21
  import { logger } from '../logger.js';
@@ -49,22 +45,6 @@ async function getTestsFromStories(
49
45
  return testsById;
50
46
  }
51
47
 
52
- async function outputTraceLogs(browser: WebDriver, test: ServerTest, logger: Logger.Logger): Promise<void> {
53
- const output: string[] = [];
54
- const types = await browser.manage().logs().getAvailableLogTypes();
55
- for (const type of types) {
56
- const logs = await browser.manage().logs().get(type);
57
- output.push(logs.map((log) => JSON.stringify(log.toJSON(), null, 2)).join('\n'));
58
- }
59
- logger.debug(
60
- '----------',
61
- getTestPath(test).join('/'),
62
- '----------\n',
63
- output.join('\n'),
64
- '\n----------------------------------------------------------------------------------------------------',
65
- );
66
- }
67
-
68
48
  function runHandler(browserName: string, images: Partial<Record<string, Images>>, error?: unknown): void {
69
49
  // TODO How handle browser corruption?
70
50
  if (isImageError(error)) {
@@ -104,7 +84,7 @@ function runHandler(browserName: string, images: Partial<Record<string, Images>>
104
84
 
105
85
  async function setupWebdriver(webdriver: CreeveyWebdriver): Promise<[string, CreeveyWebdriver] | undefined> {
106
86
  if ((await webdriver.openBrowser(true)) == null) {
107
- logger.error('Failed to start browser');
87
+ logger().error('Failed to start browser');
108
88
  emitWorkerMessage({
109
89
  type: 'error',
110
90
  payload: { subtype: 'browser', error: 'Failed to start browser' },
@@ -143,8 +123,6 @@ export async function start(browser: string, gridUrl: string, config: Config, op
143
123
 
144
124
  if (!webdriver || !sessionId) return;
145
125
 
146
- const workerLogger = Logger.getLogger(`${browser}:${chalk.gray(sessionId)}`);
147
-
148
126
  const reporterOptions = {
149
127
  ...config.reporterOptions,
150
128
  creevey: {
@@ -168,13 +146,13 @@ export async function start(browser: string, gridUrl: string, config: Config, op
168
146
  const { matchImage, matchImages } = options.odiff
169
147
  ? getOdiffMatchers(imagesContext, config)
170
148
  : await getMatchers(imagesContext, config);
171
- chai.use(chaiImage(matchImage, matchImages, workerLogger));
149
+ chai.use(chaiImage(matchImage, matchImages));
172
150
 
173
151
  const tests = await (async () => {
174
152
  try {
175
153
  return await getTestsFromStories(config, browser, webdriver);
176
154
  } catch (error) {
177
- workerLogger.error('Failed to get tests from stories:', error);
155
+ logger().error('Failed to get tests from stories:', error);
178
156
  emitWorkerMessage({
179
157
  type: 'error',
180
158
  payload: { subtype: 'browser', error: serializeError(error) },
@@ -192,7 +170,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
192
170
 
193
171
  if (!test) {
194
172
  const error = `Test with id ${message.payload.id} not found`;
195
- workerLogger.error(error);
173
+ logger().error(error);
196
174
  emitWorkerMessage({
197
175
  type: 'error',
198
176
  payload: { subtype: 'test', error },
@@ -202,8 +180,9 @@ export async function start(browser: string, gridUrl: string, config: Config, op
202
180
 
203
181
  const baseContext: BaseCreeveyTestContext = {
204
182
  browserName: browser,
205
- // TODO Pass browser instance to test
206
- // browser: browser,
183
+ // @ts-expect-error We defined separate d.ts declarations for each webdriver
184
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
185
+ webdriver: webdriver.browser,
207
186
  screenshots: [],
208
187
 
209
188
  matchImage: matchImage,
@@ -211,9 +190,6 @@ export async function start(browser: string, gridUrl: string, config: Config, op
211
190
 
212
191
  // NOTE: Deprecated
213
192
  expect: chai.expect,
214
- //TODO Move things below to the separate module
215
- until: until,
216
- keys: Key,
217
193
  };
218
194
 
219
195
  imagesContext.attachments = [];
@@ -246,16 +222,20 @@ export async function start(browser: string, gridUrl: string, config: Config, op
246
222
  runner.emit(TEST_EVENTS.RUN_BEGIN);
247
223
  runner.emit(TEST_EVENTS.TEST_BEGIN, fakeTest);
248
224
 
225
+ let timeout;
226
+ let isRejected = false;
249
227
  const start = Date.now();
250
228
  try {
251
229
  await Promise.race([
252
- new Promise((reject) =>
253
- setTimeout(() => {
254
- reject(`Timeout of ${config.testTimeout}ms exceeded`);
255
- }, 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)),
256
236
  ),
257
237
  (async () => {
258
- const context = await webdriver.switchStory(test.story, baseContext, workerLogger);
238
+ const context = await webdriver.switchStory(test.story, baseContext);
259
239
  await test.fn(context);
260
240
  })(),
261
241
  ]);
@@ -264,6 +244,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
264
244
  fakeTest.err = error;
265
245
  }
266
246
  const duration = Date.now() - start;
247
+ clearTimeout(timeout);
267
248
  fakeTest.attachments = imagesContext.attachments;
268
249
  fakeTest.state = error ? 'failed' : 'passed';
269
250
  fakeTest.duration = duration;
@@ -277,19 +258,19 @@ export async function start(browser: string, gridUrl: string, config: Config, op
277
258
  runner.emit(TEST_EVENTS.TEST_END, fakeTest);
278
259
  runner.emit(TEST_EVENTS.RUN_END);
279
260
 
280
- if (options.trace) {
281
- try {
282
- if (webdriver instanceof SeleniumWebdriver && webdriver.browser) {
283
- await outputTraceLogs(webdriver.browser, test, workerLogger);
284
- }
285
- } catch (_) {
286
- /* noop */
287
- }
288
- }
261
+ await webdriver.afterTest(test);
289
262
 
290
- 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
+ }
291
272
  })().catch((error: unknown) => {
292
- workerLogger.error('Unexpected error:', error);
273
+ logger().error('Unexpected error:', error);
293
274
  emitWorkerMessage({
294
275
  type: 'error',
295
276
  payload: { subtype: 'test', error: serializeError(error) },
@@ -297,7 +278,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
297
278
  });
298
279
  });
299
280
 
300
- workerLogger.info('Browser is ready');
281
+ logger().info('Browser is ready');
301
282
 
302
283
  emitWorkerMessage({ type: 'ready' });
303
284
  }
package/src/types.ts CHANGED
@@ -1,12 +1,10 @@
1
1
  import type { StoryContextForEnhancers, DecoratorFunction } from '@storybook/csf';
2
- import type { IKey } from 'selenium-webdriver/lib/input.js';
3
2
  import type { Worker as ClusterWorker } from 'cluster';
4
- import type { /*Builder,*/ until } from 'selenium-webdriver';
5
3
  import type Pixelmatch from 'pixelmatch';
6
4
  import type { ODiffOptions } from 'odiff-bin';
7
5
  import type { expect } from 'chai';
8
6
  import type EventEmitter from 'events';
9
- import type Logger from 'loglevel';
7
+ import { LaunchOptions } from 'playwright-core';
10
8
  // import type { Browser } from 'playwright-core';
11
9
 
12
10
  /* eslint-disable @typescript-eslint/no-explicit-any */
@@ -43,6 +41,18 @@ export interface StoryMeta {
43
41
  };
44
42
  }
45
43
 
44
+ export enum StorybookEvents {
45
+ SET_STORIES = 'setStories',
46
+ SET_CURRENT_STORY = 'setCurrentStory',
47
+ FORCE_REMOUNT = 'forceRemount',
48
+ STORY_RENDERED = 'storyRendered',
49
+ STORY_ERRORED = 'storyErrored',
50
+ STORY_THREW_EXCEPTION = 'storyThrewException',
51
+ UPDATE_STORY_ARGS = 'updateStoryArgs',
52
+ SET_GLOBALS = 'setGlobals',
53
+ UPDATE_GLOBALS = 'updateGlobals',
54
+ }
55
+
46
56
  export interface CreeveyMeta {
47
57
  parameters?: {
48
58
  creevey?: CreeveyStoryParams;
@@ -93,14 +103,6 @@ export class ChromeConfig {
93
103
  */
94
104
  export interface BrowserConfigObject {
95
105
  browserName: string;
96
- /**
97
- * Browser version. Ignored with Playwright webdriver
98
- */
99
- browserVersion?: string;
100
- /**
101
- * Operation system name. Ignored with Playwright webdriver
102
- */
103
- platformName?: string;
104
106
  // customizeBuilder?: (builder: Builder) => Builder;
105
107
  limit?: number;
106
108
  /**
@@ -124,15 +126,25 @@ export interface BrowserConfigObject {
124
126
  * Used only with `useDocker == false`
125
127
  */
126
128
  webdriverCommand?: string[];
127
- // TODO Check version compatibility
128
- // playwrightVersion?: string;
129
129
  // /**
130
130
  // * Use to start standalone playwright browser
131
131
  // */
132
132
  // playwrightBrowser?: () => Promise<Browser>;
133
133
  viewport?: { width: number; height: number };
134
134
 
135
- [name: string]: unknown;
135
+ seleniumCapabilities?: {
136
+ /**
137
+ * Browser version. Ignored with Playwright webdriver
138
+ */
139
+ browserVersion?: string;
140
+ /**
141
+ * Operation system name. Ignored with Playwright webdriver
142
+ */
143
+ platformName?: string;
144
+ [name: string]: unknown;
145
+ };
146
+
147
+ playwrightOptions?: Omit<LaunchOptions, 'logger'>;
136
148
  }
137
149
 
138
150
  export type StorybookGlobals = Record<string, unknown>;
@@ -151,7 +163,8 @@ export interface CreeveyWebdriver {
151
163
  openBrowser(fresh?: boolean): Promise<CreeveyWebdriver | null>;
152
164
  closeBrowser(): Promise<void>;
153
165
  loadStoriesFromBrowser(): Promise<StoriesRaw>;
154
- switchStory(story: StoryInput, context: BaseCreeveyTestContext, logger: Logger.Logger): Promise<CreeveyTestContext>;
166
+ switchStory(story: StoryInput, context: BaseCreeveyTestContext): Promise<CreeveyTestContext>;
167
+ afterTest(test: ServerTest): Promise<void>;
155
168
  }
156
169
 
157
170
  export interface HookConfig {
@@ -293,6 +306,11 @@ export interface Config {
293
306
  * The `--ui` CLI option ignores this option
294
307
  */
295
308
  failFast: boolean;
309
+ /**
310
+ * Start workers in sequential queue
311
+ * @default false
312
+ */
313
+ useWorkerQueue: boolean;
296
314
  /**
297
315
  * Specify platform for docker images
298
316
  */
@@ -413,14 +431,8 @@ export interface TestData extends TestMeta {
413
431
 
414
432
  export interface BaseCreeveyTestContext {
415
433
  browserName: string;
416
- /**
417
- * @deprecated In near future Creevey will additionally support Playwright as a webdriver, so any Selenium specific things might not be available. Please import `until` explicitly
418
- */
419
- until: typeof until;
420
- /**
421
- * @deprecated In near future Creevey will additionally support Playwright as a webdriver, so any Selenium specific things might not be available. Please import `keys` explicitly
422
- */
423
- keys: IKey;
434
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
435
+ webdriver: any;
424
436
  /**
425
437
  * @deprecated Usually for screenshot testing you don't need other type of assertions except matching images, but if you really need it, please use external `expect` libs
426
438
  */
@@ -0,0 +1,7 @@
1
+ import { Page } from 'playwright-core';
2
+
3
+ declare module 'creevey' {
4
+ interface CreeveyTestContext {
5
+ webdriver: Page;
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ import { WebDriver } from 'selenium-webdriver';
2
+
3
+ declare module 'creevey' {
4
+ interface CreeveyTestContext {
5
+ webdriver: WebDriver;
6
+ }
7
+ }
package/.yarnrc.yml DELETED
@@ -1 +0,0 @@
1
- nodeLinker: node-modules
@@ -1,5 +0,0 @@
1
- {
2
- "onlyChanged": true,
3
- "projectId": "Project:5fd73972015e660021b97564",
4
- "zip": true
5
- }