creevey 0.9.0-beta.13 → 0.9.0-beta.15

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