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.
- package/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +1 -0
- package/lib/cjs/cli.js +1 -0
- package/lib/cjs/client/addon/Manager.js +151 -223
- package/lib/cjs/client/addon/components/Addon.js +2 -9
- package/lib/cjs/client/addon/components/Icons.js +1 -7
- package/lib/cjs/client/addon/components/Panel.js +5 -18
- package/lib/cjs/client/addon/components/TestSelect.js +12 -25
- package/lib/cjs/client/addon/components/Tools.js +17 -28
- package/lib/cjs/client/addon/decorator.js +1 -4
- package/lib/cjs/client/addon/index.js +0 -4
- package/lib/cjs/client/addon/preset.js +3 -12
- package/lib/cjs/client/addon/preview.js +1 -4
- package/lib/cjs/client/addon/readyForCapture.js +1 -4
- package/lib/cjs/client/addon/register.js +11 -26
- package/lib/cjs/client/addon/utils.js +1 -9
- package/lib/cjs/client/addon/withCreevey.js +55 -134
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +5 -17
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +8 -24
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +7 -23
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +7 -22
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +5 -17
- package/lib/cjs/client/shared/components/ImagesView/index.js +0 -5
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +1 -8
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +2 -19
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +21 -17
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +5 -24
- package/lib/cjs/client/shared/components/ResultsPage.js +9 -37
- package/lib/cjs/client/shared/creeveyClientApi.js +3 -13
- package/lib/cjs/client/shared/helpers.js +21 -75
- package/lib/cjs/client/shared/viewMode.js +2 -6
- package/lib/cjs/client/web/192.js +1 -0
- package/lib/cjs/client/web/632.js +43 -0
- package/lib/cjs/client/web/794.js +1 -0
- package/lib/cjs/client/web/main.js +78 -1
- package/lib/cjs/client/web/main.js.LICENSE.txt +0 -15
- package/lib/cjs/creevey.js +5 -21
- package/lib/cjs/index.js +0 -15
- package/lib/cjs/server/config.js +13 -33
- package/lib/cjs/server/docker.js +5 -27
- package/lib/cjs/server/index.js +8 -33
- package/lib/cjs/server/logger.js +5 -19
- package/lib/cjs/server/master/api.js +1 -14
- package/lib/cjs/server/master/index.js +15 -46
- package/lib/cjs/server/master/master.js +6 -21
- package/lib/cjs/server/master/pool.js +2 -37
- package/lib/cjs/server/master/runner.js +15 -42
- package/lib/cjs/server/master/server.js +5 -27
- package/lib/cjs/server/messages.js +7 -53
- package/lib/cjs/server/selenium/browser.js +47 -128
- package/lib/cjs/server/selenium/index.js +0 -4
- package/lib/cjs/server/selenium/selenoid.js +7 -33
- package/lib/cjs/server/stories.js +25 -30
- package/lib/cjs/server/storybook/providers/browser.js +5 -18
- package/lib/cjs/server/storybook/providers/hybrid.js +9 -29
- package/lib/cjs/server/testsFiles/parser.js +3 -19
- package/lib/cjs/server/testsFiles/register.js +7 -9
- package/lib/cjs/server/update.js +3 -20
- package/lib/cjs/server/utils.js +9 -41
- package/lib/cjs/server/worker/chai-image.js +1 -27
- package/lib/cjs/server/worker/helpers.js +2 -12
- package/lib/cjs/server/worker/index.js +1 -3
- package/lib/cjs/server/worker/reporter.js +8 -24
- package/lib/cjs/server/worker/worker.js +5 -49
- package/lib/cjs/shared/index.js +22 -36
- package/lib/cjs/shared/serializeRegExp.js +0 -8
- package/lib/cjs/types.js +4 -14
- package/lib/esm/cli.js +1 -1
- package/lib/esm/client/addon/Manager.js +151 -214
- package/lib/esm/client/addon/components/Panel.js +4 -6
- package/lib/esm/client/addon/components/TestSelect.js +11 -17
- package/lib/esm/client/addon/components/Tools.js +15 -14
- package/lib/esm/client/addon/preset.js +2 -8
- package/lib/esm/client/addon/readyForCapture.js +1 -3
- package/lib/esm/client/addon/register.js +6 -8
- package/lib/esm/client/addon/utils.js +0 -5
- package/lib/esm/client/addon/withCreevey.js +54 -116
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +1 -1
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +6 -8
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +3 -4
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +3 -3
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +1 -1
- package/lib/esm/client/shared/components/PageFooter/Paging.js +1 -11
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +18 -7
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +3 -8
- package/lib/esm/client/shared/components/ResultsPage.js +6 -15
- package/lib/esm/client/shared/creeveyClientApi.js +3 -10
- package/lib/esm/client/shared/helpers.js +21 -47
- package/lib/esm/client/web/192.js +1 -0
- package/lib/esm/client/web/632.js +43 -0
- package/lib/esm/client/web/794.js +1 -0
- package/lib/esm/client/web/index.html +19 -0
- package/lib/esm/client/web/main.js +79 -0
- package/lib/esm/client/web/main.js.LICENSE.txt +34 -0
- package/lib/esm/creevey.js +4 -8
- package/lib/esm/index.js +0 -1
- package/lib/esm/server/config.js +7 -14
- package/lib/esm/server/docker.js +4 -12
- package/lib/esm/server/index.js +7 -21
- package/lib/esm/server/logger.js +0 -1
- package/lib/esm/server/master/api.js +0 -9
- package/lib/esm/server/master/index.js +15 -32
- package/lib/esm/server/master/master.js +2 -7
- package/lib/esm/server/master/pool.js +0 -23
- package/lib/esm/server/master/runner.js +14 -27
- package/lib/esm/server/master/server.js +4 -9
- package/lib/esm/server/messages.js +6 -38
- package/lib/esm/server/selenium/browser.js +46 -106
- package/lib/esm/server/selenium/selenoid.js +6 -17
- package/lib/esm/server/stories.js +24 -20
- package/lib/esm/server/storybook/providers/browser.js +4 -8
- package/lib/esm/server/storybook/providers/hybrid.js +6 -14
- package/lib/esm/server/testsFiles/parser.js +0 -6
- package/lib/esm/server/testsFiles/register.js +5 -2
- package/lib/esm/server/update.js +0 -8
- package/lib/esm/server/utils.js +3 -11
- package/lib/esm/server/worker/chai-image.js +0 -21
- package/lib/esm/server/worker/helpers.js +2 -9
- package/lib/esm/server/worker/reporter.js +7 -10
- package/lib/esm/server/worker/worker.js +4 -25
- package/lib/esm/shared/index.js +24 -25
- package/lib/esm/types.js +4 -1
- package/lib/types/client/addon/Manager.d.ts +1 -1
- package/lib/types/client/addon/components/Addon.d.ts +1 -0
- package/lib/types/client/addon/components/Icons.d.ts +1 -0
- package/lib/types/client/addon/components/Panel.d.ts +1 -0
- package/lib/types/client/addon/components/TestSelect.d.ts +1 -0
- package/lib/types/client/addon/components/Tools.d.ts +1 -0
- package/lib/types/client/addon/decorator.d.ts +1 -1
- package/lib/types/client/addon/preset.d.ts +2 -2
- package/lib/types/client/addon/preview.d.ts +1 -1
- package/lib/types/client/addon/withCreevey.d.ts +3 -2
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +1 -0
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -1
- package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +1 -0
- package/lib/types/client/shared/components/PageFooter/Paging.d.ts +1 -0
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +3 -1
- package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +1 -0
- package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
- package/lib/types/client/web/CreeveyApp.d.ts +1 -0
- package/lib/types/client/web/CreeveyLoader.d.ts +2 -1
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +4 -1
- package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
- package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
- package/lib/types/shared/index.d.ts +1 -1
- package/lib/types/types.d.ts +7 -28
- package/package.json +60 -78
- package/lib/cjs/client/addon/preset.ie11.js +0 -74
- package/lib/cjs/client/addon/preset.sb7.js +0 -19
- package/lib/cjs/client/web/142.js +0 -2
- package/lib/cjs/client/web/142.js.LICENSE.txt +0 -12
- package/lib/cjs/client/web/32.js +0 -1
- package/lib/cjs/client/web/551.js +0 -1
- package/lib/cjs/client/web/566.js +0 -2
- package/lib/cjs/client/web/566.js.LICENSE.txt +0 -31
- package/lib/cjs/client/web/691.js +0 -2
- package/lib/cjs/client/web/691.js.LICENSE.txt +0 -8
- package/lib/cjs/client/web/725.js +0 -1
- package/lib/cjs/server/extract.js +0 -46
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -86
- package/lib/cjs/server/loaders/babel/helpers.js +0 -469
- package/lib/cjs/server/loaders/babel/register.js +0 -124
- package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
- package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
- package/lib/cjs/server/loaders/webpack/compile.js +0 -269
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -172
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -39
- package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
- package/lib/cjs/server/loaders/webpack/start.js +0 -41
- package/lib/cjs/server/storybook/entry.js +0 -53
- package/lib/cjs/server/storybook/helpers.js +0 -158
- package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
- package/lib/esm/client/addon/preset.ie11.js +0 -59
- package/lib/esm/client/addon/preset.sb7.js +0 -8
- package/lib/esm/server/extract.js +0 -32
- package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -72
- package/lib/esm/server/loaders/babel/helpers.js +0 -452
- package/lib/esm/server/loaders/babel/register.js +0 -103
- package/lib/esm/server/loaders/hooks/mdx.js +0 -15
- package/lib/esm/server/loaders/hooks/svelte.js +0 -49
- package/lib/esm/server/loaders/webpack/compile.js +0 -246
- package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -152
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -32
- package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
- package/lib/esm/server/loaders/webpack/start.js +0 -27
- package/lib/esm/server/storybook/entry.js +0 -27
- package/lib/esm/server/storybook/helpers.js +0 -97
- package/lib/esm/server/storybook/providers/nodejs.js +0 -216
- package/lib/types/client/addon/preset.ie11.d.ts +0 -10
- package/lib/types/client/addon/preset.sb7.d.ts +0 -2
- package/lib/types/server/extract.d.ts +0 -2
- package/lib/types/server/loaders/babel/creevey-plugin.d.ts +0 -1
- package/lib/types/server/loaders/babel/helpers.d.ts +0 -19
- package/lib/types/server/loaders/babel/register.d.ts +0 -5
- package/lib/types/server/loaders/hooks/mdx.d.ts +0 -1
- package/lib/types/server/loaders/hooks/svelte.d.ts +0 -1
- package/lib/types/server/loaders/webpack/compile.d.ts +0 -2
- package/lib/types/server/loaders/webpack/creevey-loader.d.ts +0 -4
- package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +0 -10
- package/lib/types/server/loaders/webpack/mdx-loader.d.ts +0 -6
- package/lib/types/server/loaders/webpack/start.d.ts +0 -1
- package/lib/types/server/storybook/entry.d.ts +0 -17
- package/lib/types/server/storybook/helpers.d.ts +0 -24
- package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
- package/preset/ie11.js +0 -5
- package/preset/index.js +0 -9
- package/preset/sb7.js +0 -5
- 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
|
-
|
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 (_) {
|
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,
|
116
|
-
|
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
|
-
|
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
|
-
},
|
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('.')) ?? [];
|
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
|
-
});
|
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);
|
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
|
-
})();
|
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' &&
|
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);
|
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 =
|
304
|
-
|
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;
|
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() :
|
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
|
-
}
|
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([
|
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;
|
414
|
+
const realAddress = address;
|
467
415
|
|
468
|
-
|
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
|
-
|
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,
|
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
|
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;
|