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