creevey 0.9.0-beta.2 → 0.9.0-beta.20

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 (226) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/.yarnrc.yml +1 -0
  3. package/CHANGELOG.md +51 -0
  4. package/README.md +9 -1
  5. package/addon/README.md +3 -0
  6. package/addon/package.json +5 -0
  7. package/docs/config.md +29 -26
  8. package/jest.config.js +6 -0
  9. package/lib/cjs/cli.js +1 -0
  10. package/lib/cjs/client/addon/Manager.js +170 -390
  11. package/lib/cjs/client/addon/components/Addon.js +17 -45
  12. package/lib/cjs/client/addon/components/Icons.js +12 -14
  13. package/lib/cjs/client/addon/components/Panel.js +21 -30
  14. package/lib/cjs/client/addon/components/TestSelect.js +20 -31
  15. package/lib/cjs/client/addon/components/Tools.js +35 -65
  16. package/lib/cjs/client/addon/decorator.js +1 -4
  17. package/lib/cjs/client/addon/index.js +27 -0
  18. package/lib/cjs/client/addon/preset.js +3 -76
  19. package/lib/cjs/client/addon/preview.js +11 -0
  20. package/lib/cjs/client/addon/readyForCapture.js +1 -4
  21. package/lib/cjs/client/addon/register.js +43 -82
  22. package/lib/cjs/client/addon/utils.js +4 -8
  23. package/lib/cjs/client/addon/withCreevey.js +145 -404
  24. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +25 -35
  25. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +29 -41
  26. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +46 -83
  27. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +39 -67
  28. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -57
  29. package/lib/cjs/client/shared/components/ImagesView/index.js +9 -14
  30. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +13 -16
  31. package/lib/cjs/client/shared/components/PageFooter/Paging.js +16 -37
  32. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +42 -34
  33. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +40 -84
  34. package/lib/cjs/client/shared/components/ResultsPage.js +42 -99
  35. package/lib/cjs/client/shared/creeveyClientApi.js +56 -93
  36. package/lib/cjs/client/shared/helpers.js +149 -274
  37. package/lib/cjs/client/shared/viewMode.js +5 -9
  38. package/lib/cjs/client/web/192.js +1 -0
  39. package/lib/cjs/client/web/632.js +43 -0
  40. package/lib/cjs/client/web/794.js +1 -0
  41. package/lib/cjs/client/web/main.js +79 -38
  42. package/lib/cjs/client/web/main.js.LICENSE.txt +34 -0
  43. package/lib/cjs/creevey.js +15 -30
  44. package/lib/cjs/index.js +0 -15
  45. package/lib/cjs/server/config.js +16 -36
  46. package/lib/cjs/server/docker.js +8 -34
  47. package/lib/cjs/server/index.js +9 -34
  48. package/lib/cjs/server/logger.js +7 -20
  49. package/lib/cjs/server/master/api.js +1 -14
  50. package/lib/cjs/server/master/index.js +25 -49
  51. package/lib/cjs/server/master/master.js +6 -21
  52. package/lib/cjs/server/master/pool.js +10 -53
  53. package/lib/cjs/server/master/runner.js +65 -105
  54. package/lib/cjs/server/master/server.js +10 -29
  55. package/lib/cjs/server/messages.js +14 -62
  56. package/lib/cjs/server/selenium/browser.js +149 -185
  57. package/lib/cjs/server/selenium/index.js +0 -4
  58. package/lib/cjs/server/selenium/selenoid.js +18 -44
  59. package/lib/cjs/server/stories.js +35 -57
  60. package/lib/cjs/server/storybook/providers/browser.js +15 -29
  61. package/lib/cjs/server/storybook/providers/hybrid.js +16 -37
  62. package/lib/cjs/server/telemetry.js +167 -0
  63. package/lib/cjs/server/testsFiles/parser.js +3 -19
  64. package/lib/cjs/server/testsFiles/register.js +8 -14
  65. package/lib/cjs/server/update.js +4 -25
  66. package/lib/cjs/server/utils.js +35 -76
  67. package/lib/cjs/server/worker/chai-image.js +1 -27
  68. package/lib/cjs/server/worker/helpers.js +2 -12
  69. package/lib/cjs/server/worker/index.js +1 -3
  70. package/lib/cjs/server/worker/reporter.js +16 -43
  71. package/lib/cjs/server/worker/worker.js +32 -72
  72. package/lib/cjs/shared/index.js +87 -0
  73. package/lib/cjs/shared/serializeRegExp.js +34 -0
  74. package/lib/cjs/types.js +11 -20
  75. package/lib/esm/cli.js +1 -1
  76. package/lib/esm/client/addon/Manager.js +170 -381
  77. package/lib/esm/client/addon/components/Addon.js +15 -34
  78. package/lib/esm/client/addon/components/Icons.js +10 -6
  79. package/lib/esm/client/addon/components/Panel.js +20 -18
  80. package/lib/esm/client/addon/components/TestSelect.js +19 -23
  81. package/lib/esm/client/addon/components/Tools.js +33 -49
  82. package/lib/esm/client/addon/decorator.js +1 -1
  83. package/lib/esm/client/addon/index.js +2 -0
  84. package/lib/esm/client/addon/preset.js +2 -56
  85. package/lib/esm/client/addon/preview.js +5 -0
  86. package/lib/esm/client/addon/readyForCapture.js +1 -3
  87. package/lib/esm/client/addon/register.js +41 -67
  88. package/lib/esm/client/addon/utils.js +3 -7
  89. package/lib/esm/client/addon/withCreevey.js +142 -388
  90. package/lib/esm/client/shared/components/ImagesView/BlendView.js +22 -18
  91. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +27 -25
  92. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +43 -63
  93. package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
  94. package/lib/esm/client/shared/components/ImagesView/SwapView.js +23 -40
  95. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
  96. package/lib/esm/client/shared/components/PageFooter/Paging.js +15 -29
  97. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +40 -25
  98. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +38 -66
  99. package/lib/esm/client/shared/components/ResultsPage.js +39 -75
  100. package/lib/esm/client/shared/creeveyClientApi.js +56 -90
  101. package/lib/esm/client/shared/helpers.js +133 -230
  102. package/lib/esm/client/shared/viewMode.js +4 -4
  103. package/lib/esm/client/web/192.js +1 -0
  104. package/lib/esm/client/web/632.js +43 -0
  105. package/lib/esm/client/web/794.js +1 -0
  106. package/lib/esm/client/web/index.html +19 -0
  107. package/lib/esm/client/web/main.js +79 -0
  108. package/lib/esm/client/web/main.js.LICENSE.txt +34 -0
  109. package/lib/esm/creevey.js +13 -16
  110. package/lib/esm/index.js +1 -4
  111. package/lib/esm/server/config.js +9 -16
  112. package/lib/esm/server/docker.js +6 -14
  113. package/lib/esm/server/index.js +8 -22
  114. package/lib/esm/server/logger.js +0 -1
  115. package/lib/esm/server/master/api.js +0 -9
  116. package/lib/esm/server/master/index.js +25 -35
  117. package/lib/esm/server/master/master.js +2 -7
  118. package/lib/esm/server/master/pool.js +8 -41
  119. package/lib/esm/server/master/runner.js +64 -90
  120. package/lib/esm/server/master/server.js +9 -11
  121. package/lib/esm/server/messages.js +8 -42
  122. package/lib/esm/server/selenium/browser.js +147 -163
  123. package/lib/esm/server/selenium/selenoid.js +16 -27
  124. package/lib/esm/server/stories.js +34 -46
  125. package/lib/esm/server/storybook/providers/browser.js +12 -17
  126. package/lib/esm/server/storybook/providers/hybrid.js +11 -22
  127. package/lib/esm/server/telemetry.js +160 -0
  128. package/lib/esm/server/testsFiles/parser.js +0 -6
  129. package/lib/esm/server/testsFiles/register.js +6 -7
  130. package/lib/esm/server/update.js +1 -13
  131. package/lib/esm/server/utils.js +20 -41
  132. package/lib/esm/server/worker/chai-image.js +0 -21
  133. package/lib/esm/server/worker/helpers.js +2 -9
  134. package/lib/esm/server/worker/reporter.js +15 -29
  135. package/lib/esm/server/worker/worker.js +31 -48
  136. package/lib/esm/shared/index.js +77 -0
  137. package/lib/esm/shared/serializeRegExp.js +24 -0
  138. package/lib/esm/types.js +5 -1
  139. package/lib/types/client/addon/Manager.d.ts +3 -3
  140. package/lib/types/client/addon/components/Addon.d.ts +1 -0
  141. package/lib/types/client/addon/components/Icons.d.ts +1 -0
  142. package/lib/types/client/addon/components/Panel.d.ts +1 -0
  143. package/lib/types/client/addon/components/Tools.d.ts +1 -0
  144. package/lib/types/client/addon/decorator.d.ts +1 -1
  145. package/lib/types/client/addon/index.d.ts +2 -0
  146. package/lib/types/client/addon/preset.d.ts +2 -24
  147. package/lib/types/client/addon/preview.d.ts +4 -0
  148. package/lib/types/client/addon/utils.d.ts +1 -0
  149. package/lib/types/client/addon/withCreevey.d.ts +4 -3
  150. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
  151. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -1
  152. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -1
  153. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -1
  154. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +3 -1
  155. package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
  156. package/lib/types/client/web/CreeveyLoader.d.ts +1 -1
  157. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +6 -3
  158. package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
  159. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
  160. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +3 -1
  161. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +3 -1
  162. package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
  163. package/lib/types/client/web/KeyboardEventsContext.d.ts +4 -2
  164. package/lib/types/index.d.ts +4 -1
  165. package/lib/types/server/logger.d.ts +6 -2
  166. package/lib/types/server/messages.d.ts +14 -12
  167. package/lib/types/server/selenium/browser.d.ts +5 -3
  168. package/lib/types/server/storybook/providers/browser.d.ts +2 -4
  169. package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
  170. package/lib/types/server/telemetry.d.ts +2 -0
  171. package/lib/types/server/utils.d.ts +5 -1
  172. package/lib/types/shared/index.d.ts +7 -0
  173. package/lib/types/shared/serializeRegExp.d.ts +9 -0
  174. package/lib/types/types.d.ts +29 -36
  175. package/package.json +132 -133
  176. package/types/global.d.ts +5 -0
  177. package/lib/cjs/client/web/1.js +0 -13
  178. package/lib/cjs/client/web/2.js +0 -1
  179. package/lib/cjs/server/extract.js +0 -50
  180. package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -88
  181. package/lib/cjs/server/loaders/babel/helpers.js +0 -479
  182. package/lib/cjs/server/loaders/babel/register.js +0 -126
  183. package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
  184. package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
  185. package/lib/cjs/server/loaders/webpack/compile.js +0 -286
  186. package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -174
  187. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -44
  188. package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
  189. package/lib/cjs/server/loaders/webpack/start.js +0 -41
  190. package/lib/cjs/server/storybook/entry.js +0 -68
  191. package/lib/cjs/server/storybook/helpers.js +0 -165
  192. package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
  193. package/lib/cjs/shared.js +0 -124
  194. package/lib/esm/server/extract.js +0 -34
  195. package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -74
  196. package/lib/esm/server/loaders/babel/helpers.js +0 -462
  197. package/lib/esm/server/loaders/babel/register.js +0 -105
  198. package/lib/esm/server/loaders/hooks/mdx.js +0 -15
  199. package/lib/esm/server/loaders/hooks/svelte.js +0 -49
  200. package/lib/esm/server/loaders/webpack/compile.js +0 -263
  201. package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -153
  202. package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -36
  203. package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
  204. package/lib/esm/server/loaders/webpack/start.js +0 -27
  205. package/lib/esm/server/storybook/entry.js +0 -44
  206. package/lib/esm/server/storybook/helpers.js +0 -106
  207. package/lib/esm/server/storybook/providers/nodejs.js +0 -217
  208. package/lib/esm/shared.js +0 -93
  209. package/lib/types/server/extract.d.ts +0 -2
  210. package/lib/types/server/loaders/babel/creevey-plugin.d.ts +0 -1
  211. package/lib/types/server/loaders/babel/helpers.d.ts +0 -19
  212. package/lib/types/server/loaders/babel/register.d.ts +0 -5
  213. package/lib/types/server/loaders/hooks/mdx.d.ts +0 -1
  214. package/lib/types/server/loaders/hooks/svelte.d.ts +0 -1
  215. package/lib/types/server/loaders/webpack/compile.d.ts +0 -2
  216. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +0 -2
  217. package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +0 -10
  218. package/lib/types/server/loaders/webpack/mdx-loader.d.ts +0 -6
  219. package/lib/types/server/loaders/webpack/start.d.ts +0 -1
  220. package/lib/types/server/storybook/entry.d.ts +0 -18
  221. package/lib/types/server/storybook/helpers.d.ts +0 -24
  222. package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
  223. package/lib/types/shared.d.ts +0 -16
  224. package/preset.js +0 -9
  225. package/storybook-static/stories.json +0 -21
  226. package/types/mdx.d.ts +0 -6
@@ -1,33 +1,38 @@
1
+ import { SET_GLOBALS, UPDATE_STORY_ARGS, STORY_RENDERED } from '@storybook/core-events';
1
2
  import chalk from 'chalk';
2
3
  import http from 'http';
3
4
  import https from 'https';
4
- import { getLogger } from 'loglevel';
5
+ import { getLogger, levels } from 'loglevel';
5
6
  import prefix from 'loglevel-plugin-prefix';
6
7
  import { networkInterfaces } from 'os';
7
8
  import { PNG } from 'pngjs';
8
- import { Builder, By, Capabilities, Origin } from 'selenium-webdriver';
9
+ import { Builder, By, Capabilities, Origin, logging } from 'selenium-webdriver';
10
+ // import { Options as IeOptions } from 'selenium-webdriver/ie';
11
+ // import { Options as EdgeOptions } from 'selenium-webdriver/edge';
12
+ // import { Options as ChromeOptions } from 'selenium-webdriver/chrome';
13
+ // import { Options as SafariOptions } from 'selenium-webdriver/safari';
14
+ // import { Options as FirefoxOptions } from 'selenium-webdriver/firefox';
9
15
  import { PageLoadStrategy } from 'selenium-webdriver/lib/capabilities';
10
16
  import { isDefined, noop } from '../../types';
11
17
  import { colors, logger } from '../logger';
12
18
  import { emitStoriesMessage, subscribeOn } from '../messages';
13
- import { importStorybookCoreEvents, isStorybookVersionLessThan } from '../storybook/helpers';
14
19
  import { isShuttingDown, LOCALHOST_REGEXP, runSequence } from '../utils';
20
+ // type UnPromise<P> = P extends Promise<infer T> ? T : never;
21
+
22
+ const storybookRootID = 'storybook-root';
15
23
  const DOCKER_INTERNAL = 'host.docker.internal';
16
24
  let browserLogger = logger;
17
25
  let browserName = '';
18
26
  let browser = null;
27
+ // let context: UnPromise<ReturnType<typeof BrowsingContext>> | null = null;
19
28
  let creeveyServerHost = null;
20
-
21
29
  function getSessionData(grid, sessionId = '') {
22
30
  const gridUrl = new URL(grid);
23
31
  gridUrl.pathname = `/host/${sessionId}`;
24
32
  return new Promise((resolve, reject) => (gridUrl.protocol == 'https:' ? https : http).get(gridUrl.toString(), res => {
25
33
  if (res.statusCode !== 200) {
26
- var _res$statusCode;
27
-
28
- return reject(new Error(`Couldn't get session data for ${sessionId}. Status code: ${(_res$statusCode = res.statusCode) !== null && _res$statusCode !== void 0 ? _res$statusCode : 'Unknown'}`));
34
+ return reject(new Error(`Couldn't get session data for ${sessionId}. Status code: ${res.statusCode ?? 'Unknown'}`));
29
35
  }
30
-
31
36
  let data = '';
32
37
  res.setEncoding('utf8');
33
38
  res.on('data', chunk => data += chunk);
@@ -35,51 +40,42 @@ function getSessionData(grid, sessionId = '') {
35
40
  try {
36
41
  resolve(JSON.parse(data));
37
42
  } catch (error) {
38
- var _error$stack;
39
-
40
- reject(new Error(`Couldn't get session data for ${sessionId}. ${error instanceof Error ? (_error$stack = error.stack) !== null && _error$stack !== void 0 ? _error$stack : error.message : error}`));
43
+ reject(new Error(`Couldn't get session data for ${sessionId}. ${error instanceof Error ? error.stack ?? error.message : error}`));
41
44
  }
42
45
  });
43
46
  }));
44
47
  }
45
-
46
48
  function getAddresses() {
49
+ // TODO Check if docker is used
47
50
  return [DOCKER_INTERNAL].concat(...Object.values(networkInterfaces()).filter(isDefined).map(network => network.filter(info => info.family == 'IPv4').map(info => info.address)));
48
51
  }
49
-
50
52
  async function resolveStorybookUrl(storybookUrl, checkUrl) {
51
53
  browserLogger.debug('Resolving storybook url');
52
54
  const addresses = getAddresses();
53
-
54
55
  for (const ip of addresses) {
55
56
  const resolvedUrl = storybookUrl.replace(LOCALHOST_REGEXP, ip);
56
57
  browserLogger.debug(`Checking storybook availability on ${chalk.magenta(resolvedUrl)}`);
57
-
58
58
  if (await checkUrl(resolvedUrl)) {
59
59
  browserLogger.debug(`Resolved storybook url ${chalk.magenta(resolvedUrl)}`);
60
60
  return resolvedUrl;
61
61
  }
62
62
  }
63
-
64
63
  const error = new Error('Please specify `storybookUrl` with IP address that accessible from remote browser');
65
64
  error.name = 'ResolveUrlError';
66
65
  throw error;
67
66
  }
68
-
69
67
  async function openUrlAndWaitForPageSource(browser, url, predicate) {
70
68
  let source = '';
71
69
  await browser.get(url);
72
-
73
70
  do {
74
71
  try {
75
72
  source = await browser.getPageSource();
76
- } catch (_) {// NOTE: Firefox can raise exception "curContainer.frame.document.documentElement is null"
73
+ } catch (_) {
74
+ // NOTE: Firefox can raise exception "curContainer.frame.document.documentElement is null"
77
75
  }
78
76
  } while (predicate(source));
79
-
80
77
  return source;
81
78
  }
82
-
83
79
  function getUrlChecker(browser) {
84
80
  return async url => {
85
81
  try {
@@ -87,61 +83,50 @@ function getUrlChecker(browser) {
87
83
  browserLogger.debug(`Opening ${chalk.magenta('about:blank')} page`);
88
84
  await openUrlAndWaitForPageSource(browser, 'about:blank', source => !source.includes('<body></body>'));
89
85
  browserLogger.debug(`Opening ${chalk.magenta(url)} and checking the page source`);
90
- const source = await openUrlAndWaitForPageSource(browser, url, // NOTE: IE11 can return only `head` without body
91
- source => source.length == 0 || !/<body([^>]*>).+<\/body>/s.test(source)); // NOTE: This is the most optimal way to check if we in storybook or not
86
+ const source = await openUrlAndWaitForPageSource(browser, url,
87
+ // NOTE: IE11 can return only `head` without body
88
+ source => source.length == 0 || !/<body([^>]*>).+<\/body>/s.test(source));
89
+ // NOTE: This is the most optimal way to check if we in storybook or not
92
90
  // We don't use any page load strategies except `NONE`
93
91
  // because other add significant delay and some of them don't work in earlier chrome versions
94
92
  // Browsers always load page successful even it's failed
95
- // So we just check `#root` element
96
-
97
- browserLogger.debug(`Checking ${chalk.cyan('#root')} existence on ${chalk.magenta(url)}`);
98
- return source.includes('<div id="root"></div>');
93
+ // So we just check `root` element
94
+ browserLogger.debug(`Checking ${chalk.cyan(`#${storybookRootID}`)} existence on ${chalk.magenta(url)}`);
95
+ return source.includes(`id="${storybookRootID}"`);
99
96
  } catch (error) {
100
97
  return false;
101
98
  }
102
99
  };
103
100
  }
104
-
105
101
  async function waitForStorybook(browser) {
106
- // NOTE: Storybook 5.x doesn't have the `last` method
107
- if (isStorybookVersionLessThan(6)) {
108
- browserLogger.debug('Waiting for `load` event to make sure that storybook is initiated');
109
- return browser.executeAsyncScript(function (callback) {
110
- if (document.readyState == 'complete') return callback();
111
- window.addEventListener('load', function () {
112
- callback();
113
- });
114
- });
115
- }
116
-
117
102
  browserLogger.debug('Waiting for `setStories` event to make sure that storybook is initiated');
118
103
  let wait = true;
119
104
  let isTimeout = false;
120
- const Events = await importStorybookCoreEvents();
121
105
  const initiateTimeout = setTimeout(() => {
122
106
  wait = false;
123
107
  isTimeout = true;
124
108
  }, 60000);
125
-
126
- while (wait) {
127
- wait = await browser.executeAsyncScript(function (SET_STORIES, callback) {
128
- if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return callback(true);
129
- if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_STORIES) == undefined) return callback(true);
130
- return callback(false);
131
- }, Events.SET_STORIES);
109
+ while (wait !== false) {
110
+ try {
111
+ wait = await browser.executeScript(function (SET_GLOBALS) {
112
+ if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return true;
113
+ if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_GLOBALS) == undefined) return true;
114
+ return false;
115
+ }, SET_GLOBALS);
116
+ } catch (e) {
117
+ browserLogger.debug('An error has been caught during the script: ', e);
118
+ }
132
119
  if (!wait) clearTimeout(initiateTimeout);
133
120
  }
134
-
135
121
  if (isTimeout) throw new Error('Failed to wait `setStories` event');
136
122
  }
137
-
138
123
  async function resetMousePosition(browser) {
139
- var _ref, _await$browser$getCap, _await$browser$getCap2, _await$browser$getCap3;
140
-
124
+ var _await$browser$getCap, _await$browser$getCap2;
141
125
  browserLogger.debug('Resetting mouse position to the top-left corner');
142
126
  const browserName = (await browser.getCapabilities()).getBrowserName();
143
- const [browserVersion] = (_ref = (_await$browser$getCap = (_await$browser$getCap2 = (await browser.getCapabilities()).getBrowserVersion()) === null || _await$browser$getCap2 === void 0 ? void 0 : _await$browser$getCap2.split('.')) !== null && _await$browser$getCap !== void 0 ? _await$browser$getCap : (_await$browser$getCap3 = (await browser.getCapabilities()).get('version')) === null || _await$browser$getCap3 === void 0 ? void 0 : _await$browser$getCap3.split('.')) !== null && _ref !== void 0 ? _ref : []; // NOTE Reset mouse position to support keweb selenium grid browser versions
127
+ const [browserVersion] = ((_await$browser$getCap = (await browser.getCapabilities()).getBrowserVersion()) === null || _await$browser$getCap === void 0 ? void 0 : _await$browser$getCap.split('.')) ?? ((_await$browser$getCap2 = (await browser.getCapabilities()).get('version')) === null || _await$browser$getCap2 === void 0 ? void 0 : _await$browser$getCap2.split('.')) ?? [];
144
128
 
129
+ // NOTE Reset mouse position to support keweb selenium grid browser versions
145
130
  if (browserName == 'chrome' && browserVersion == '70') {
146
131
  const {
147
132
  top,
@@ -156,8 +141,8 @@ async function resetMousePosition(browser) {
156
141
  width: bodyRect.width,
157
142
  height: bodyRect.height
158
143
  };
159
- }); // NOTE Bridge mode doesn't support `Origin.VIEWPORT`, move mouse relative
160
-
144
+ });
145
+ // NOTE Bridge mode doesn't support `Origin.VIEWPORT`, move mouse relative
161
146
  await browser.actions({
162
147
  bridge: true
163
148
  }).move({
@@ -181,7 +166,6 @@ async function resetMousePosition(browser) {
181
166
  }).perform();
182
167
  }
183
168
  }
184
-
185
169
  async function resizeViewport(browser, viewport) {
186
170
  const windowRect = await browser.manage().window().getRect();
187
171
  const {
@@ -201,7 +185,6 @@ async function resizeViewport(browser, viewport) {
201
185
  height: viewport.height + dHeight
202
186
  });
203
187
  }
204
-
205
188
  const getScrollBarWidth = (() => {
206
189
  let scrollBarWidth = null;
207
190
  return async browser => {
@@ -210,33 +193,31 @@ const getScrollBarWidth = (() => {
210
193
  // eslint-disable-next-line no-var
211
194
  var div = document.createElement('div');
212
195
  div.innerHTML = 'a'; // NOTE: In IE clientWidth is 0 if this div is empty.
213
-
214
196
  div.style.overflowY = 'scroll';
215
- document.body.appendChild(div); // eslint-disable-next-line no-var
216
-
197
+ document.body.appendChild(div);
198
+ // eslint-disable-next-line no-var
217
199
  var widthDiff = div.offsetWidth - div.clientWidth;
218
200
  document.body.removeChild(div);
219
201
  return widthDiff;
220
202
  });
221
203
  return scrollBarWidth;
222
204
  };
223
- })(); // NOTE Firefox and Safari take viewport screenshot without scrollbars
224
-
205
+ })();
225
206
 
207
+ // NOTE Firefox and Safari take viewport screenshot without scrollbars
226
208
  async function hasScrollBar(browser) {
227
- var _await$browser$getCap4, _await$browser$getCap5;
228
-
209
+ var _await$browser$getCap3;
229
210
  const browserName = (await browser.getCapabilities()).getBrowserName();
230
- const [browserVersion] = (_await$browser$getCap4 = (_await$browser$getCap5 = (await browser.getCapabilities()).getBrowserVersion()) === null || _await$browser$getCap5 === void 0 ? void 0 : _await$browser$getCap5.split('.')) !== null && _await$browser$getCap4 !== void 0 ? _await$browser$getCap4 : [];
231
- return browserName != 'Safari' && // NOTE This need to work with keweb selenium grid
211
+ const [browserVersion] = ((_await$browser$getCap3 = (await browser.getCapabilities()).getBrowserVersion()) === null || _await$browser$getCap3 === void 0 ? void 0 : _await$browser$getCap3.split('.')) ?? [];
212
+ return browserName != 'Safari' &&
213
+ // NOTE This need to work with keweb selenium grid
232
214
  !(browserName == 'firefox' && browserVersion == '61');
233
215
  }
234
-
235
216
  async function takeCompositeScreenshot(browser, windowRect, elementRect) {
236
217
  const screens = [];
237
218
  const isScreenshotWithoutScrollBar = !(await hasScrollBar(browser));
238
- const scrollBarWidth = await getScrollBarWidth(browser); // NOTE Sometimes viewport has been scrolled somewhere
239
-
219
+ const scrollBarWidth = await getScrollBarWidth(browser);
220
+ // NOTE Sometimes viewport has been scrolled somewhere
240
221
  const normalizedElementRect = {
241
222
  left: elementRect.left - windowRect.left,
242
223
  right: elementRect.left + elementRect.width - windowRect.left,
@@ -251,7 +232,6 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
251
232
  const rows = Math.ceil(elementRect.height / viewportHeight);
252
233
  const xOffset = Math.round(isFitHorizontally ? normalizedElementRect.left : Math.max(0, cols * viewportWidth - elementRect.width));
253
234
  const yOffset = Math.round(isFitVertically ? normalizedElementRect.top : Math.max(0, rows * viewportHeight - elementRect.height));
254
-
255
235
  for (let row = 0; row < rows; row += 1) {
256
236
  for (let col = 0; col < cols; col += 1) {
257
237
  const dx = Math.min(viewportWidth * col + normalizedElementRect.left, Math.max(0, normalizedElementRect.right - viewportWidth));
@@ -262,13 +242,11 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
262
242
  screens.push(await browser.takeScreenshot());
263
243
  }
264
244
  }
265
-
266
245
  const images = screens.map(s => Buffer.from(s, 'base64')).map(b => PNG.sync.read(b));
267
246
  const compositeImage = new PNG({
268
247
  width: Math.round(elementRect.width),
269
248
  height: Math.round(elementRect.height)
270
249
  });
271
-
272
250
  for (let y = 0; y < compositeImage.height; y += 1) {
273
251
  for (let x = 0; x < compositeImage.width; x += 1) {
274
252
  const col = Math.floor(x / viewportWidth);
@@ -277,8 +255,11 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
277
255
  const isLastRow = rows - row == 1;
278
256
  const scrollOffset = isFitVertically || isScreenshotWithoutScrollBar ? 0 : scrollBarWidth;
279
257
  const i = (y * compositeImage.width + x) * 4;
280
- const j = // NOTE compositeImage(x, y) => image(x, y)
281
- (y % viewportHeight * (viewportWidth + scrollOffset) + x % viewportWidth) * 4 + (isLastRow ? yOffset * (viewportWidth + scrollOffset) * 4 : 0) + (isLastCol ? xOffset * 4 : 0);
258
+ const j =
259
+ // NOTE compositeImage(x, y) => image(x, y)
260
+ (y % viewportHeight * (viewportWidth + scrollOffset) + x % viewportWidth) * 4 + (
261
+ // NOTE Offset for last row/col image
262
+ isLastRow ? yOffset * (viewportWidth + scrollOffset) * 4 : 0) + (isLastCol ? xOffset * 4 : 0);
282
263
  const image = images[row * cols + col];
283
264
  compositeImage.data[i + 0] = image.data[j + 0];
284
265
  compositeImage.data[i + 1] = image.data[j + 1];
@@ -286,16 +267,25 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
286
267
  compositeImage.data[i + 3] = image.data[j + 3];
287
268
  }
288
269
  }
289
-
290
270
  return PNG.sync.write(compositeImage).toString('base64');
291
271
  }
292
-
293
272
  export async function takeScreenshot(browser, captureElement, ignoreElements) {
294
273
  let screenshot;
295
274
  const ignoreStyles = await insertIgnoreStyles(browser, ignoreElements);
296
-
297
275
  try {
298
276
  if (!captureElement) {
277
+ if (browserLogger.getLevel() <= levels.DEBUG) {
278
+ const {
279
+ innerWidth,
280
+ innerHeight
281
+ } = await browser.executeScript(function () {
282
+ return {
283
+ innerWidth: window.innerWidth,
284
+ innerHeight: window.innerHeight
285
+ };
286
+ });
287
+ browserLogger.debug(`Viewport size is: ${innerWidth}x${innerHeight}`);
288
+ }
299
289
  browserLogger.debug('Capturing viewport screenshot');
300
290
  screenshot = await browser.takeScreenshot();
301
291
  browserLogger.debug('Viewport screenshot is captured');
@@ -304,10 +294,10 @@ export async function takeScreenshot(browser, captureElement, ignoreElements) {
304
294
  const rects = await browser.executeScript(function (selector) {
305
295
  window.scrollTo(0, 0); // TODO Maybe we should remove same code from `resetMousePosition`
306
296
  // eslint-disable-next-line no-var
307
-
308
297
  var element = document.querySelector(selector);
309
- if (!element) return; // eslint-disable-next-line no-var
298
+ if (!element) return;
310
299
 
300
+ // eslint-disable-next-line no-var
311
301
  var elementRect = element.getBoundingClientRect();
312
302
  return {
313
303
  elementRect: {
@@ -327,21 +317,28 @@ export async function takeScreenshot(browser, captureElement, ignoreElements) {
327
317
  const {
328
318
  elementRect,
329
319
  windowRect
330
- } = rects !== null && rects !== void 0 ? rects : {};
320
+ } = rects ?? {};
331
321
  if (!elementRect || !windowRect) throw new Error(`Couldn't find element with selector: '${captureElement}'`);
332
322
  const isFitIntoViewport = elementRect.width + elementRect.left <= windowRect.width && elementRect.height + elementRect.top <= windowRect.height;
333
323
  if (isFitIntoViewport) browserLogger.debug(`Capturing ${chalk.cyan(captureElement)}`);else browserLogger.debug(`Capturing composite screenshot image of ${chalk.cyan(captureElement)}`);
334
- screenshot = isFitIntoViewport ? await browser.findElement(By.css(captureElement)).takeScreenshot() : // TODO pointer-events: none, need to research
324
+
325
+ // const element = await browser.findElement(By.css(captureElement));
326
+ // screenshot = isFitIntoViewport
327
+ // ? context
328
+ // ? await context.captureElementScreenshot(await element.getId())
329
+ // : await browser.findElement(By.css(captureElement)).takeScreenshot()
330
+ // : // TODO pointer-events: none, need to research
331
+ // await takeCompositeScreenshot(browser, windowRect, elementRect);
332
+ screenshot = isFitIntoViewport ? await browser.findElement(By.css(captureElement)).takeScreenshot() :
333
+ // TODO pointer-events: none, need to research
335
334
  await takeCompositeScreenshot(browser, windowRect, elementRect);
336
335
  browserLogger.debug(`${chalk.cyan(captureElement)} is captured`);
337
336
  }
338
337
  } finally {
339
338
  await removeIgnoreStyles(browser, ignoreStyles);
340
339
  }
341
-
342
340
  return screenshot;
343
341
  }
344
-
345
342
  async function selectStory(browser, {
346
343
  id,
347
344
  kind,
@@ -352,63 +349,51 @@ async function selectStory(browser, {
352
349
  if (typeof window.__CREEVEY_SELECT_STORY__ == 'undefined') {
353
350
  return callback(["Creevey can't switch story. This may happened if forget to add `creevey` addon to your storybook config, or storybook not loaded in browser due syntax error."]);
354
351
  }
355
-
356
- window.__CREEVEY_SELECT_STORY__(id, kind, name, shouldWaitForReady, callback);
352
+ void window.__CREEVEY_SELECT_STORY__(id, kind, name, shouldWaitForReady, callback);
357
353
  }, id, kind, name, waitForReady);
358
- const [errorMessage, isCaptureCalled = false] = result || [];
354
+ const [errorMessage, isCaptureCalled = false] = result ?? [];
359
355
  if (errorMessage) throw new Error(errorMessage);
360
356
  return isCaptureCalled;
361
357
  }
362
-
363
358
  export async function updateStorybookGlobals(browser, globals) {
364
- if (isStorybookVersionLessThan(6)) {
365
- browserLogger.warn('Globals are not supported by Storybook versions less than 6');
366
- return;
367
- }
368
-
369
359
  browserLogger.debug('Applying storybook globals');
370
360
  await browser.executeScript(function (globals) {
371
361
  window.__CREEVEY_UPDATE_GLOBALS__(globals);
372
362
  }, globals);
373
363
  }
374
-
375
364
  function appendIframePath(url) {
376
365
  return `${url.replace(/\/$/, '')}/iframe.html`;
377
366
  }
378
-
379
367
  async function openStorybookPage(browser, storybookUrl, resolver) {
380
368
  if (!LOCALHOST_REGEXP.test(storybookUrl)) {
381
369
  return browser === null || browser === void 0 ? void 0 : browser.get(appendIframePath(storybookUrl));
382
370
  }
383
-
384
371
  try {
385
372
  if (resolver) {
386
373
  browserLogger.debug('Resolving storybook url with custom resolver');
387
374
  const resolvedUrl = await resolver();
388
375
  browserLogger.debug(`Resolver storybook url ${resolvedUrl}`);
389
376
  return browser.get(appendIframePath(resolvedUrl));
390
- } // NOTE: getUrlChecker already calls `browser.get` so we don't need another one
391
-
392
-
377
+ }
378
+ // NOTE: getUrlChecker already calls `browser.get` so we don't need another one
393
379
  return void (await resolveStorybookUrl(appendIframePath(storybookUrl), getUrlChecker(browser)));
394
380
  } catch (error) {
395
381
  browserLogger.error('Failed to resolve storybook URL', error instanceof Error ? error.message : '');
396
382
  throw error;
397
383
  }
398
384
  }
399
-
400
385
  async function resolveCreeveyHost(browser, port) {
401
386
  if (creeveyServerHost != null) return creeveyServerHost;
402
387
  const addresses = getAddresses();
403
388
  creeveyServerHost = await browser.executeAsyncScript(function (hosts, port, callback) {
404
389
  void Promise.all(hosts.map(function (host) {
405
- return new Promise(function (resolve, reject) {
406
- setTimeout(reject, 10000); // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
407
-
408
- fetch('//' + host + ':' + port + '/ping').then(resolve).catch(reject);
409
- }).then(function (response) {
390
+ return Promise.race([
391
+ // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
392
+ fetch('http://' + host + ':' + port + '/ping').then(function (response) {
410
393
  return response.text();
411
- }).then(function (pong) {
394
+ }), new Promise((_resolve, reject) => {
395
+ setTimeout(reject, 5000);
396
+ })]).then(function (pong) {
412
397
  return pong == 'pong' ? host : null;
413
398
  }).catch(function () {
414
399
  return null;
@@ -422,21 +407,17 @@ async function resolveCreeveyHost(browser, port) {
422
407
  if (creeveyServerHost == null) throw new Error("Can't reach creevey server from a browser");
423
408
  return creeveyServerHost;
424
409
  }
425
-
426
- export async function loadStoriesFromBrowser(port) {
410
+ export async function loadStoriesFromBrowser() {
427
411
  if (!browser) throw new Error("Can't get stories from browser if webdriver isn't connected");
428
- const host = await resolveCreeveyHost(browser, port);
429
- const stories = await browser.executeAsyncScript(function (creeveyHost, creeveyPort, callback) {
430
- window.__CREEVEY_SERVER_HOST__ = creeveyHost;
431
- window.__CREEVEY_SERVER_PORT__ = creeveyPort;
412
+ const stories = await browser.executeAsyncScript(function (callback) {
432
413
  void window.__CREEVEY_GET_STORIES__().then(callback);
433
- }, host, port);
414
+ });
434
415
  if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
435
416
  return stories;
436
417
  }
437
- export async function getBrowser(config, name) {
418
+ export async function getBrowser(config, options) {
438
419
  if (browser) return browser;
439
- browserName = name;
420
+ browserName = options.browser;
440
421
  const browserConfig = config.browsers[browserName];
441
422
  const {
442
423
  gridUrl = config.gridUrl,
@@ -447,30 +428,56 @@ export async function getBrowser(config, name) {
447
428
  ...userCapabilities
448
429
  } = browserConfig;
449
430
  void limit;
450
- const realAddress = address; // TODO Define some capabilities explicitly and define typings
431
+ const realAddress = address;
451
432
 
452
- const capabilities = new Capabilities({ ...userCapabilities,
453
- pageLoadStrategy: PageLoadStrategy.NONE
433
+ // TODO Define some capabilities explicitly and define typings
434
+ const capabilities = new Capabilities({
435
+ ...userCapabilities,
436
+ pageLoadStrategy: PageLoadStrategy.EAGER
454
437
  });
455
438
  subscribeOn('shutdown', () => {
456
439
  var _browser;
457
-
458
- (_browser = browser) === null || _browser === void 0 ? void 0 : _browser.quit().finally(() => // eslint-disable-next-line no-process-exit
440
+ (_browser = browser) === null || _browser === void 0 || _browser.quit().finally(() =>
441
+ // eslint-disable-next-line no-process-exit
459
442
  process.exit());
460
443
  browser = null;
461
444
  });
462
-
463
445
  try {
464
446
  var _await$browser$getSes;
465
-
466
447
  const url = new URL(gridUrl);
467
448
  url.username = url.username ? '********' : '';
468
449
  url.password = url.password ? '********' : '';
469
- browserLogger.debug(`(${name}) Connecting to Selenium ${chalk.magenta(url.toString())}`);
470
- browser = await new Builder().usingServer(gridUrl).withCapabilities(capabilities).build();
450
+ browserLogger.debug(`(${browserName}) Connecting to Selenium ${chalk.magenta(url.toString())}`);
451
+ const prefs = new logging.Preferences();
452
+ if (options.trace) {
453
+ for (const type of Object.values(logging.Type)) {
454
+ prefs.setLevel(type, logging.Level.ALL);
455
+ }
456
+ }
457
+
458
+ // const ie = new IeOptions();
459
+ // const edge = new EdgeOptions();
460
+ // const chrome = new ChromeOptions();
461
+ // const safari = new SafariOptions();
462
+ // const firefox = new FirefoxOptions();
463
+ // edge.enableBidi();
464
+ // chrome.enableBidi();
465
+ // firefox.enableBidi();
466
+
467
+ browser = await new Builder()
468
+ // .setIeOptions(ie)
469
+ // .setEdgeOptions(edge)
470
+ // .setChromeOptions(chrome)
471
+ // .setSafariOptions(safari)
472
+ // .setFirefoxOptions(firefox)
473
+ .usingServer(gridUrl).withCapabilities(capabilities).setLoggingPrefs(prefs) // NOTE: Should go last
474
+ .build();
475
+
476
+ // const id = await browser.getWindowHandle();
477
+ // context = await BrowsingContext(browser, { browsingContextId: id });
478
+
471
479
  const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
472
480
  let browserHost = '';
473
-
474
481
  try {
475
482
  const {
476
483
  Name
@@ -479,66 +486,56 @@ export async function getBrowser(config, name) {
479
486
  } catch (_) {
480
487
  /* noop */
481
488
  }
482
-
483
- browserLogger.debug(`(${name}) Connected successful with ${[chalk.green(browserHost), chalk.magenta(sessionId)].filter(Boolean).join(':')}`);
489
+ browserLogger.debug(`(${browserName}) Connected successful with ${[chalk.green(browserHost), chalk.magenta(sessionId)].filter(Boolean).join(':')}`);
484
490
  browserLogger = getLogger(sessionId);
485
491
  prefix.apply(browserLogger, {
486
492
  format(level) {
487
493
  const levelColor = colors[level.toUpperCase()];
488
- return `[${name}:${chalk.gray(sessionId)}] ${levelColor(level)} =>`;
494
+ return `[${browserName}:${chalk.gray(sessionId)}] ${levelColor(level)} =>`;
489
495
  }
490
-
491
496
  });
492
497
  await runSequence([() => {
493
498
  var _browser2;
494
-
495
499
  return (_browser2 = browser) === null || _browser2 === void 0 ? void 0 : _browser2.manage().setTimeouts({
496
- pageLoad: 5000,
500
+ pageLoad: 10000,
497
501
  script: 60000
498
502
  });
499
503
  }, () => viewport && browser && resizeViewport(browser, viewport), () => browser && openStorybookPage(browser, realAddress, config.resolveStorybookUrl), () => browser && waitForStorybook(browser)], () => !isShuttingDown.current);
500
504
  } catch (originalError) {
501
- var _await$browser$getCur, _browser4;
502
-
505
+ var _browser4;
503
506
  if (isShuttingDown.current) {
504
507
  var _browser3;
505
-
506
- (_browser3 = browser) === null || _browser3 === void 0 ? void 0 : _browser3.quit().catch(noop);
508
+ (_browser3 = browser) === null || _browser3 === void 0 || _browser3.quit().catch(noop);
507
509
  browser = null;
508
510
  return null;
509
511
  }
510
-
511
512
  if (originalError instanceof Error && originalError.name == 'ResolveUrlError') throw originalError;
512
- const error = new Error(`Can't load storybook root page by URL ${(_await$browser$getCur = await ((_browser4 = browser) === null || _browser4 === void 0 ? void 0 : _browser4.getCurrentUrl())) !== null && _await$browser$getCur !== void 0 ? _await$browser$getCur : realAddress}`);
513
+ const error = new Error(`Can't load storybook root page by URL ${(await ((_browser4 = browser) === null || _browser4 === void 0 ? void 0 : _browser4.getCurrentUrl())) ?? realAddress}`);
513
514
  if (originalError instanceof Error) error.stack = originalError.stack;
514
515
  throw error;
515
516
  }
516
-
517
517
  if (_storybookGlobals) {
518
518
  await updateStorybookGlobals(browser, _storybookGlobals);
519
519
  }
520
-
521
- await browser.executeScript(function (workerId) {
520
+ const creeveyHost = await resolveCreeveyHost(browser, options.port);
521
+ await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
522
522
  window.__CREEVEY_WORKER_ID__ = workerId;
523
- }, process.pid);
523
+ window.__CREEVEY_SERVER_HOST__ = creeveyHost;
524
+ window.__CREEVEY_SERVER_PORT__ = creeveyPort;
525
+ }, process.pid, creeveyHost, options.port);
524
526
  return browser;
525
527
  }
526
-
527
528
  async function updateStoryArgs(browser, story, updatedArgs) {
528
- const Events = await importStorybookCoreEvents();
529
529
  await browser.executeAsyncScript(function (storyId, updatedArgs, UPDATE_STORY_ARGS, STORY_RENDERED, callback) {
530
530
  window.__STORYBOOK_ADDONS_CHANNEL__.once(STORY_RENDERED, callback);
531
-
532
531
  window.__STORYBOOK_ADDONS_CHANNEL__.emit(UPDATE_STORY_ARGS, {
533
532
  storyId,
534
533
  updatedArgs
535
534
  });
536
- }, story.id, updatedArgs, Events.UPDATE_STORY_ARGS, Events.STORY_RENDERED);
535
+ }, story.id, updatedArgs, UPDATE_STORY_ARGS, STORY_RENDERED);
537
536
  }
538
-
539
537
  export async function closeBrowser() {
540
538
  if (!browser) return;
541
-
542
539
  try {
543
540
  await browser.quit();
544
541
  } finally {
@@ -546,22 +543,18 @@ export async function closeBrowser() {
546
543
  }
547
544
  }
548
545
  export async function switchStory() {
549
- var _this$currentTest, _this$currentTest$ctx, _parameters$creevey;
550
-
546
+ var _this$currentTest;
551
547
  let testOrSuite = this.currentTest;
552
548
  if (!testOrSuite) throw new Error("Can't switch story, because test context doesn't have 'currentTest' field");
553
549
  this.testScope.length = 0;
554
550
  this.screenshots.length = 0;
555
551
  this.testScope.push(this.browserName);
556
-
557
552
  while ((_testOrSuite = testOrSuite) !== null && _testOrSuite !== void 0 && _testOrSuite.title) {
558
553
  var _testOrSuite;
559
-
560
554
  this.testScope.push(testOrSuite.title);
561
555
  testOrSuite = testOrSuite.parent;
562
556
  }
563
-
564
- const story = (_this$currentTest = this.currentTest) === null || _this$currentTest === void 0 ? void 0 : (_this$currentTest$ctx = _this$currentTest.ctx) === null || _this$currentTest$ctx === void 0 ? void 0 : _this$currentTest$ctx.story;
557
+ const story = (_this$currentTest = this.currentTest) === null || _this$currentTest === void 0 || (_this$currentTest = _this$currentTest.ctx) === null || _this$currentTest === void 0 ? void 0 : _this$currentTest.story;
565
558
  if (!story) throw new Error(`Current test '${this.testScope.join('/')}' context doesn't have 'story' field`);
566
559
  const {
567
560
  id,
@@ -570,27 +563,22 @@ export async function switchStory() {
570
563
  parameters
571
564
  } = story;
572
565
  const {
573
- captureElement = '#root',
566
+ captureElement = `#${storybookRootID}`,
574
567
  waitForReady,
575
568
  ignoreElements
576
- } = (_parameters$creevey = parameters.creevey) !== null && _parameters$creevey !== void 0 ? _parameters$creevey : {};
569
+ } = parameters.creevey ?? {};
577
570
  browserLogger.debug(`Switching to story ${chalk.cyan(kind)}/${chalk.cyan(name)} by id ${chalk.magenta(id)}`);
578
571
  if (captureElement) Object.defineProperty(this, 'captureElement', {
579
572
  enumerable: true,
580
573
  configurable: true,
581
574
  get: () => this.browser.findElement(By.css(captureElement))
582
575
  });else Reflect.deleteProperty(this, 'captureElement');
583
-
584
576
  this.takeScreenshot = () => takeScreenshot(this.browser, captureElement, ignoreElements);
585
-
586
577
  this.updateStoryArgs = updatedArgs => updateStoryArgs(this.browser, story, updatedArgs);
587
-
588
578
  this.testScope.reverse();
589
579
  let storyPlayResolver;
590
580
  let waitForComplete = new Promise(resolve => storyPlayResolver = resolve);
591
581
  const unsubscribe = subscribeOn('stories', message => {
592
- var _payload$captureEleme, _payload$ignoreElemen;
593
-
594
582
  if (message.type != 'capture') return;
595
583
  const {
596
584
  payload = {},
@@ -598,7 +586,7 @@ export async function switchStory() {
598
586
  imageName
599
587
  } = {}
600
588
  } = message;
601
- void takeScreenshot(this.browser, (_payload$captureEleme = payload.captureElement) !== null && _payload$captureEleme !== void 0 ? _payload$captureEleme : captureElement, (_payload$ignoreElemen = payload.ignoreElements) !== null && _payload$ignoreElemen !== void 0 ? _payload$ignoreElemen : ignoreElements).then(screenshot => {
589
+ void takeScreenshot(this.browser, payload.captureElement ?? captureElement, payload.ignoreElements ?? ignoreElements).then(screenshot => {
602
590
  this.screenshots.push({
603
591
  imageName,
604
592
  screenshot
@@ -617,17 +605,14 @@ export async function switchStory() {
617
605
  kind,
618
606
  name
619
607
  }, waitForReady);
620
-
621
608
  if (isCaptureCalled) {
622
609
  while (!(await waitForComplete)) {
623
610
  waitForComplete = new Promise(resolve => storyPlayResolver = resolve);
624
611
  }
625
612
  }
626
-
627
613
  unsubscribe();
628
614
  browserLogger.debug(`Story ${chalk.magenta(id)} ready for capturing`);
629
615
  }
630
-
631
616
  async function insertIgnoreStyles(browser, ignoreElements) {
632
617
  const ignoreSelectors = Array.prototype.concat(ignoreElements).filter(Boolean);
633
618
  if (!ignoreSelectors.length) return null;
@@ -636,7 +621,6 @@ async function insertIgnoreStyles(browser, ignoreElements) {
636
621
  return window.__CREEVEY_INSERT_IGNORE_STYLES__(ignoreSelectors);
637
622
  }, ignoreSelectors);
638
623
  }
639
-
640
624
  async function removeIgnoreStyles(browser, ignoreStyles) {
641
625
  if (ignoreStyles) {
642
626
  browserLogger.debug('Revert hiding ignored elements');