creevey 0.9.0-beta.12 → 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 +47 -128
  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 +46 -106
  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,45 +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 {
113
+ try {
148
114
  wait = await browser.executeScript(function (SET_GLOBALS) {
149
115
  if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return true;
150
116
  if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_GLOBALS) == undefined) return true;
151
117
  return false;
152
- }, Events.SET_GLOBALS);
118
+ }, _coreEvents.SET_GLOBALS);
119
+ } catch (e) {
120
+ browserLogger.debug('An error has been caught during the script: ', e);
153
121
  }
154
-
155
122
  if (!wait) clearTimeout(initiateTimeout);
156
123
  }
157
-
158
124
  if (isTimeout) throw new Error('Failed to wait `setStories` event');
159
125
  }
160
-
161
126
  async function resetMousePosition(browser) {
162
127
  var _await$browser$getCap, _await$browser$getCap2;
163
-
164
128
  browserLogger.debug('Resetting mouse position to the top-left corner');
165
129
  const browserName = (await browser.getCapabilities()).getBrowserName();
166
- 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('.')) ?? [];
167
131
 
132
+ // NOTE Reset mouse position to support keweb selenium grid browser versions
168
133
  if (browserName == 'chrome' && browserVersion == '70') {
169
134
  const {
170
135
  top,
@@ -179,8 +144,8 @@ async function resetMousePosition(browser) {
179
144
  width: bodyRect.width,
180
145
  height: bodyRect.height
181
146
  };
182
- }); // NOTE Bridge mode doesn't support `Origin.VIEWPORT`, move mouse relative
183
-
147
+ });
148
+ // NOTE Bridge mode doesn't support `Origin.VIEWPORT`, move mouse relative
184
149
  await browser.actions({
185
150
  bridge: true
186
151
  }).move({
@@ -204,7 +169,6 @@ async function resetMousePosition(browser) {
204
169
  }).perform();
205
170
  }
206
171
  }
207
-
208
172
  async function resizeViewport(browser, viewport) {
209
173
  const windowRect = await browser.manage().window().getRect();
210
174
  const {
@@ -224,7 +188,6 @@ async function resizeViewport(browser, viewport) {
224
188
  height: viewport.height + dHeight
225
189
  });
226
190
  }
227
-
228
191
  const getScrollBarWidth = (() => {
229
192
  let scrollBarWidth = null;
230
193
  return async browser => {
@@ -233,33 +196,31 @@ const getScrollBarWidth = (() => {
233
196
  // eslint-disable-next-line no-var
234
197
  var div = document.createElement('div');
235
198
  div.innerHTML = 'a'; // NOTE: In IE clientWidth is 0 if this div is empty.
236
-
237
199
  div.style.overflowY = 'scroll';
238
- document.body.appendChild(div); // eslint-disable-next-line no-var
239
-
200
+ document.body.appendChild(div);
201
+ // eslint-disable-next-line no-var
240
202
  var widthDiff = div.offsetWidth - div.clientWidth;
241
203
  document.body.removeChild(div);
242
204
  return widthDiff;
243
205
  });
244
206
  return scrollBarWidth;
245
207
  };
246
- })(); // NOTE Firefox and Safari take viewport screenshot without scrollbars
247
-
208
+ })();
248
209
 
210
+ // NOTE Firefox and Safari take viewport screenshot without scrollbars
249
211
  async function hasScrollBar(browser) {
250
212
  var _await$browser$getCap3;
251
-
252
213
  const browserName = (await browser.getCapabilities()).getBrowserName();
253
214
  const [browserVersion] = ((_await$browser$getCap3 = (await browser.getCapabilities()).getBrowserVersion()) === null || _await$browser$getCap3 === void 0 ? void 0 : _await$browser$getCap3.split('.')) ?? [];
254
- 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
255
217
  !(browserName == 'firefox' && browserVersion == '61');
256
218
  }
257
-
258
219
  async function takeCompositeScreenshot(browser, windowRect, elementRect) {
259
220
  const screens = [];
260
221
  const isScreenshotWithoutScrollBar = !(await hasScrollBar(browser));
261
- const scrollBarWidth = await getScrollBarWidth(browser); // NOTE Sometimes viewport has been scrolled somewhere
262
-
222
+ const scrollBarWidth = await getScrollBarWidth(browser);
223
+ // NOTE Sometimes viewport has been scrolled somewhere
263
224
  const normalizedElementRect = {
264
225
  left: elementRect.left - windowRect.left,
265
226
  right: elementRect.left + elementRect.width - windowRect.left,
@@ -274,7 +235,6 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
274
235
  const rows = Math.ceil(elementRect.height / viewportHeight);
275
236
  const xOffset = Math.round(isFitHorizontally ? normalizedElementRect.left : Math.max(0, cols * viewportWidth - elementRect.width));
276
237
  const yOffset = Math.round(isFitVertically ? normalizedElementRect.top : Math.max(0, rows * viewportHeight - elementRect.height));
277
-
278
238
  for (let row = 0; row < rows; row += 1) {
279
239
  for (let col = 0; col < cols; col += 1) {
280
240
  const dx = Math.min(viewportWidth * col + normalizedElementRect.left, Math.max(0, normalizedElementRect.right - viewportWidth));
@@ -285,13 +245,11 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
285
245
  screens.push(await browser.takeScreenshot());
286
246
  }
287
247
  }
288
-
289
248
  const images = screens.map(s => Buffer.from(s, 'base64')).map(b => _pngjs.PNG.sync.read(b));
290
249
  const compositeImage = new _pngjs.PNG({
291
250
  width: Math.round(elementRect.width),
292
251
  height: Math.round(elementRect.height)
293
252
  });
294
-
295
253
  for (let y = 0; y < compositeImage.height; y += 1) {
296
254
  for (let x = 0; x < compositeImage.width; x += 1) {
297
255
  const col = Math.floor(x / viewportWidth);
@@ -300,8 +258,10 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
300
258
  const isLastRow = rows - row == 1;
301
259
  const scrollOffset = isFitVertically || isScreenshotWithoutScrollBar ? 0 : scrollBarWidth;
302
260
  const i = (y * compositeImage.width + x) * 4;
303
- const j = // NOTE compositeImage(x, y) => image(x, y)
304
- (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
305
265
  isLastRow ? yOffset * (viewportWidth + scrollOffset) * 4 : 0) + (isLastCol ? xOffset * 4 : 0);
306
266
  const image = images[row * cols + col];
307
267
  compositeImage.data[i + 0] = image.data[j + 0];
@@ -310,14 +270,11 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
310
270
  compositeImage.data[i + 3] = image.data[j + 3];
311
271
  }
312
272
  }
313
-
314
273
  return _pngjs.PNG.sync.write(compositeImage).toString('base64');
315
274
  }
316
-
317
275
  async function takeScreenshot(browser, captureElement, ignoreElements) {
318
276
  let screenshot;
319
277
  const ignoreStyles = await insertIgnoreStyles(browser, ignoreElements);
320
-
321
278
  try {
322
279
  if (!captureElement) {
323
280
  browserLogger.debug('Capturing viewport screenshot');
@@ -328,10 +285,10 @@ async function takeScreenshot(browser, captureElement, ignoreElements) {
328
285
  const rects = await browser.executeScript(function (selector) {
329
286
  window.scrollTo(0, 0); // TODO Maybe we should remove same code from `resetMousePosition`
330
287
  // eslint-disable-next-line no-var
331
-
332
288
  var element = document.querySelector(selector);
333
- if (!element) return; // eslint-disable-next-line no-var
289
+ if (!element) return;
334
290
 
291
+ // eslint-disable-next-line no-var
335
292
  var elementRect = element.getBoundingClientRect();
336
293
  return {
337
294
  elementRect: {
@@ -355,17 +312,16 @@ async function takeScreenshot(browser, captureElement, ignoreElements) {
355
312
  if (!elementRect || !windowRect) throw new Error(`Couldn't find element with selector: '${captureElement}'`);
356
313
  const isFitIntoViewport = elementRect.width + elementRect.left <= windowRect.width && elementRect.height + elementRect.top <= windowRect.height;
357
314
  if (isFitIntoViewport) browserLogger.debug(`Capturing ${_chalk.default.cyan(captureElement)}`);else browserLogger.debug(`Capturing composite screenshot image of ${_chalk.default.cyan(captureElement)}`);
358
- 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
359
317
  await takeCompositeScreenshot(browser, windowRect, elementRect);
360
318
  browserLogger.debug(`${_chalk.default.cyan(captureElement)} is captured`);
361
319
  }
362
320
  } finally {
363
321
  await removeIgnoreStyles(browser, ignoreStyles);
364
322
  }
365
-
366
323
  return screenshot;
367
324
  }
368
-
369
325
  async function selectStory(browser, {
370
326
  id,
371
327
  kind,
@@ -376,52 +332,46 @@ async function selectStory(browser, {
376
332
  if (typeof window.__CREEVEY_SELECT_STORY__ == 'undefined') {
377
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."]);
378
334
  }
379
-
380
335
  void window.__CREEVEY_SELECT_STORY__(id, kind, name, shouldWaitForReady, callback);
381
336
  }, id, kind, name, waitForReady);
382
337
  const [errorMessage, isCaptureCalled = false] = result ?? [];
383
338
  if (errorMessage) throw new Error(errorMessage);
384
339
  return isCaptureCalled;
385
340
  }
386
-
387
341
  async function updateStorybookGlobals(browser, globals) {
388
342
  browserLogger.debug('Applying storybook globals');
389
343
  await browser.executeScript(function (globals) {
390
344
  window.__CREEVEY_UPDATE_GLOBALS__(globals);
391
345
  }, globals);
392
346
  }
393
-
394
347
  function appendIframePath(url) {
395
348
  return `${url.replace(/\/$/, '')}/iframe.html`;
396
349
  }
397
-
398
350
  async function openStorybookPage(browser, storybookUrl, resolver) {
399
351
  if (!_utils.LOCALHOST_REGEXP.test(storybookUrl)) {
400
352
  return browser === null || browser === void 0 ? void 0 : browser.get(appendIframePath(storybookUrl));
401
353
  }
402
-
403
354
  try {
404
355
  if (resolver) {
405
356
  browserLogger.debug('Resolving storybook url with custom resolver');
406
357
  const resolvedUrl = await resolver();
407
358
  browserLogger.debug(`Resolver storybook url ${resolvedUrl}`);
408
359
  return browser.get(appendIframePath(resolvedUrl));
409
- } // NOTE: getUrlChecker already calls `browser.get` so we don't need another one
410
-
411
-
360
+ }
361
+ // NOTE: getUrlChecker already calls `browser.get` so we don't need another one
412
362
  return void (await resolveStorybookUrl(appendIframePath(storybookUrl), getUrlChecker(browser)));
413
363
  } catch (error) {
414
364
  browserLogger.error('Failed to resolve storybook URL', error instanceof Error ? error.message : '');
415
365
  throw error;
416
366
  }
417
367
  }
418
-
419
368
  async function resolveCreeveyHost(browser, port) {
420
369
  if (creeveyServerHost != null) return creeveyServerHost;
421
370
  const addresses = getAddresses();
422
371
  creeveyServerHost = await browser.executeAsyncScript(function (hosts, port, callback) {
423
372
  void Promise.all(hosts.map(function (host) {
424
- 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
425
375
  fetch('http://' + host + ':' + port + '/ping').then(function (response) {
426
376
  return response.text();
427
377
  }), new Promise((_resolve, reject) => {
@@ -440,7 +390,6 @@ async function resolveCreeveyHost(browser, port) {
440
390
  if (creeveyServerHost == null) throw new Error("Can't reach creevey server from a browser");
441
391
  return creeveyServerHost;
442
392
  }
443
-
444
393
  async function loadStoriesFromBrowser() {
445
394
  if (!browser) throw new Error("Can't get stories from browser if webdriver isn't connected");
446
395
  const stories = await browser.executeAsyncScript(function (callback) {
@@ -449,7 +398,6 @@ async function loadStoriesFromBrowser() {
449
398
  if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
450
399
  return stories;
451
400
  }
452
-
453
401
  async function getBrowser(config, options) {
454
402
  if (browser) return browser;
455
403
  browserName = options.browser;
@@ -463,22 +411,22 @@ async function getBrowser(config, options) {
463
411
  ...userCapabilities
464
412
  } = browserConfig;
465
413
  void limit;
466
- const realAddress = address; // TODO Define some capabilities explicitly and define typings
414
+ const realAddress = address;
467
415
 
468
- const capabilities = new _seleniumWebdriver.Capabilities({ ...userCapabilities,
416
+ // TODO Define some capabilities explicitly and define typings
417
+ const capabilities = new _seleniumWebdriver.Capabilities({
418
+ ...userCapabilities,
469
419
  pageLoadStrategy: _capabilities.PageLoadStrategy.NONE
470
420
  });
471
421
  (0, _messages.subscribeOn)('shutdown', () => {
472
422
  var _browser;
473
-
474
- (_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
475
425
  process.exit());
476
426
  browser = null;
477
427
  });
478
-
479
428
  try {
480
429
  var _await$browser$getSes;
481
-
482
430
  const url = new URL(gridUrl);
483
431
  url.username = url.username ? '********' : '';
484
432
  url.password = url.password ? '********' : '';
@@ -486,7 +434,6 @@ async function getBrowser(config, options) {
486
434
  browser = await new _seleniumWebdriver.Builder().usingServer(gridUrl).withCapabilities(capabilities).build();
487
435
  const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
488
436
  let browserHost = '';
489
-
490
437
  try {
491
438
  const {
492
439
  Name
@@ -495,22 +442,16 @@ async function getBrowser(config, options) {
495
442
  } catch (_) {
496
443
  /* noop */
497
444
  }
498
-
499
445
  browserLogger.debug(`(${browserName}) Connected successful with ${[_chalk.default.green(browserHost), _chalk.default.magenta(sessionId)].filter(Boolean).join(':')}`);
500
446
  browserLogger = (0, _loglevel.getLogger)(sessionId);
501
-
502
447
  _loglevelPluginPrefix.default.apply(browserLogger, {
503
448
  format(level) {
504
449
  const levelColor = _logger.colors[level.toUpperCase()];
505
-
506
450
  return `[${browserName}:${_chalk.default.gray(sessionId)}] ${levelColor(level)} =>`;
507
451
  }
508
-
509
452
  });
510
-
511
453
  await (0, _utils.runSequence)([() => {
512
454
  var _browser2;
513
-
514
455
  return (_browser2 = browser) === null || _browser2 === void 0 ? void 0 : _browser2.manage().setTimeouts({
515
456
  pageLoad: 5000,
516
457
  script: 60000
@@ -518,25 +459,20 @@ async function getBrowser(config, options) {
518
459
  }, () => viewport && browser && resizeViewport(browser, viewport), () => browser && openStorybookPage(browser, realAddress, config.resolveStorybookUrl), () => browser && waitForStorybook(browser)], () => !_utils.isShuttingDown.current);
519
460
  } catch (originalError) {
520
461
  var _browser4;
521
-
522
462
  if (_utils.isShuttingDown.current) {
523
463
  var _browser3;
524
-
525
- (_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);
526
465
  browser = null;
527
466
  return null;
528
467
  }
529
-
530
468
  if (originalError instanceof Error && originalError.name == 'ResolveUrlError') throw originalError;
531
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}`);
532
470
  if (originalError instanceof Error) error.stack = originalError.stack;
533
471
  throw error;
534
472
  }
535
-
536
473
  if (_storybookGlobals) {
537
474
  await updateStorybookGlobals(browser, _storybookGlobals);
538
475
  }
539
-
540
476
  const creeveyHost = await resolveCreeveyHost(browser, options.port);
541
477
  await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
542
478
  window.__CREEVEY_WORKER_ID__ = workerId;
@@ -545,46 +481,36 @@ async function getBrowser(config, options) {
545
481
  }, process.pid, creeveyHost, options.port);
546
482
  return browser;
547
483
  }
548
-
549
484
  async function updateStoryArgs(browser, story, updatedArgs) {
550
- const Events = await (0, _helpers.importStorybookCoreEvents)();
551
485
  await browser.executeAsyncScript(function (storyId, updatedArgs, UPDATE_STORY_ARGS, STORY_RENDERED, callback) {
552
486
  window.__STORYBOOK_ADDONS_CHANNEL__.once(STORY_RENDERED, callback);
553
-
554
487
  window.__STORYBOOK_ADDONS_CHANNEL__.emit(UPDATE_STORY_ARGS, {
555
488
  storyId,
556
489
  updatedArgs
557
490
  });
558
- }, story.id, updatedArgs, Events.UPDATE_STORY_ARGS, Events.STORY_RENDERED);
491
+ }, story.id, updatedArgs, _coreEvents.UPDATE_STORY_ARGS, _coreEvents.STORY_RENDERED);
559
492
  }
560
-
561
493
  async function closeBrowser() {
562
494
  if (!browser) return;
563
-
564
495
  try {
565
496
  await browser.quit();
566
497
  } finally {
567
498
  browser = null;
568
499
  }
569
500
  }
570
-
571
501
  async function switchStory() {
572
- var _this$currentTest, _this$currentTest$ctx;
573
-
502
+ var _this$currentTest;
574
503
  let testOrSuite = this.currentTest;
575
504
  if (!testOrSuite) throw new Error("Can't switch story, because test context doesn't have 'currentTest' field");
576
505
  this.testScope.length = 0;
577
506
  this.screenshots.length = 0;
578
507
  this.testScope.push(this.browserName);
579
-
580
508
  while ((_testOrSuite = testOrSuite) !== null && _testOrSuite !== void 0 && _testOrSuite.title) {
581
509
  var _testOrSuite;
582
-
583
510
  this.testScope.push(testOrSuite.title);
584
511
  testOrSuite = testOrSuite.parent;
585
512
  }
586
-
587
- 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;
588
514
  if (!story) throw new Error(`Current test '${this.testScope.join('/')}' context doesn't have 'story' field`);
589
515
  const {
590
516
  id,
@@ -603,11 +529,8 @@ async function switchStory() {
603
529
  configurable: true,
604
530
  get: () => this.browser.findElement(_seleniumWebdriver.By.css(captureElement))
605
531
  });else Reflect.deleteProperty(this, 'captureElement');
606
-
607
532
  this.takeScreenshot = () => takeScreenshot(this.browser, captureElement, ignoreElements);
608
-
609
533
  this.updateStoryArgs = updatedArgs => updateStoryArgs(this.browser, story, updatedArgs);
610
-
611
534
  this.testScope.reverse();
612
535
  let storyPlayResolver;
613
536
  let waitForComplete = new Promise(resolve => storyPlayResolver = resolve);
@@ -638,17 +561,14 @@ async function switchStory() {
638
561
  kind,
639
562
  name
640
563
  }, waitForReady);
641
-
642
564
  if (isCaptureCalled) {
643
565
  while (!(await waitForComplete)) {
644
566
  waitForComplete = new Promise(resolve => storyPlayResolver = resolve);
645
567
  }
646
568
  }
647
-
648
569
  unsubscribe();
649
570
  browserLogger.debug(`Story ${_chalk.default.magenta(id)} ready for capturing`);
650
571
  }
651
-
652
572
  async function insertIgnoreStyles(browser, ignoreElements) {
653
573
  const ignoreSelectors = Array.prototype.concat(ignoreElements).filter(Boolean);
654
574
  if (!ignoreSelectors.length) return null;
@@ -657,7 +577,6 @@ async function insertIgnoreStyles(browser, ignoreElements) {
657
577
  return window.__CREEVEY_INSERT_IGNORE_STYLES__(ignoreSelectors);
658
578
  }, ignoreSelectors);
659
579
  }
660
-
661
580
  async function removeIgnoreStyles(browser, ignoreStyles) {
662
581
  if (ignoreStyles) {
663
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;