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