creevey 0.8.0-beta.0 → 0.9.0-beta.1

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