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