creevey 0.9.0-beta.13 → 0.9.0-beta.14

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