creevey 0.9.0-beta.5 → 0.9.0-beta.7
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/CHANGELOG.md +14 -0
- package/addon/package.json +1 -0
- package/lib/cjs/client/web/32.js +1 -1
- package/lib/cjs/client/web/551.js +1 -1
- package/lib/cjs/client/web/691.js +1 -1
- package/lib/cjs/client/web/725.js +1 -1
- package/lib/cjs/client/web/main.js +1 -1
- package/lib/cjs/server/selenium/browser.js +35 -25
- package/lib/cjs/server/storybook/helpers.js +1 -1
- package/lib/cjs/server/storybook/providers/browser.js +6 -6
- package/lib/cjs/server/storybook/providers/hybrid.js +6 -8
- package/lib/cjs/server/storybook/providers/nodejs.js +6 -4
- package/lib/cjs/server/testsFiles/register.js +1 -5
- package/lib/cjs/server/worker/worker.js +3 -3
- package/lib/cjs/types.js +1 -0
- package/lib/esm/server/selenium/browser.js +36 -26
- package/lib/esm/server/storybook/helpers.js +1 -1
- package/lib/esm/server/storybook/providers/browser.js +3 -5
- package/lib/esm/server/storybook/providers/hybrid.js +3 -7
- package/lib/esm/server/storybook/providers/nodejs.js +3 -3
- package/lib/esm/server/testsFiles/register.js +1 -5
- package/lib/esm/server/worker/worker.js +3 -3
- package/lib/esm/types.js +1 -0
- package/lib/types/cli.d.ts +1 -1
- package/lib/types/client/addon/Manager.d.ts +37 -37
- package/lib/types/client/addon/components/Addon.d.ts +8 -8
- package/lib/types/client/addon/components/Icons.d.ts +7 -7
- package/lib/types/client/addon/components/Panel.d.ts +9 -9
- package/lib/types/client/addon/components/TestSelect.d.ts +8 -8
- package/lib/types/client/addon/components/Tools.d.ts +6 -6
- package/lib/types/client/addon/decorator.d.ts +1 -1
- package/lib/types/client/addon/index.d.ts +2 -2
- package/lib/types/client/addon/preset.d.ts +23 -23
- package/lib/types/client/addon/preset.ie11.d.ts +10 -10
- package/lib/types/client/addon/readyForCapture.d.ts +6 -6
- package/lib/types/client/addon/register.d.ts +3 -3
- package/lib/types/client/addon/utils.d.ts +3 -3
- package/lib/types/client/addon/withCreevey.d.ts +24 -24
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -3
- package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +24 -24
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -3
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -3
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -3
- package/lib/types/client/shared/components/ImagesView/index.d.ts +5 -5
- package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +8 -8
- package/lib/types/client/shared/components/PageFooter/Paging.d.ts +7 -7
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +12 -12
- package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +16 -16
- package/lib/types/client/shared/components/ResultsPage.d.ts +18 -18
- package/lib/types/client/shared/creeveyClientApi.d.ts +9 -9
- package/lib/types/client/shared/helpers.d.ts +46 -46
- package/lib/types/client/shared/viewMode.d.ts +4 -4
- package/lib/types/client/web/CreeveyApp.d.ts +11 -11
- package/lib/types/client/web/CreeveyContext.d.ts +11 -11
- package/lib/types/client/web/CreeveyLoader.d.ts +2 -2
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +19 -19
- package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +6 -6
- package/lib/types/client/web/CreeveyView/SideBar/SideBar.d.ts +14 -14
- package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +12 -12
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +33 -33
- package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +7 -7
- package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +10 -10
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +9 -9
- package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +6 -6
- package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +1 -1
- package/lib/types/client/web/KeyboardEventsContext.d.ts +13 -13
- package/lib/types/client/web/index.d.ts +4 -4
- package/lib/types/creevey.d.ts +1 -1
- package/lib/types/server/config.d.ts +4 -4
- package/lib/types/server/docker.d.ts +7 -7
- package/lib/types/server/extract.d.ts +2 -2
- package/lib/types/server/index.d.ts +2 -2
- package/lib/types/server/loaders/babel/creevey-plugin.d.ts +1 -1
- package/lib/types/server/loaders/babel/helpers.d.ts +19 -19
- package/lib/types/server/loaders/babel/register.d.ts +5 -5
- package/lib/types/server/loaders/hooks/mdx.d.ts +1 -1
- package/lib/types/server/loaders/hooks/svelte.d.ts +1 -1
- package/lib/types/server/loaders/webpack/compile.d.ts +2 -2
- package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -4
- package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +10 -10
- package/lib/types/server/loaders/webpack/mdx-loader.d.ts +6 -6
- package/lib/types/server/loaders/webpack/start.d.ts +1 -1
- package/lib/types/server/logger.d.ts +10 -10
- package/lib/types/server/master/api.d.ts +7 -7
- package/lib/types/server/master/index.d.ts +3 -3
- package/lib/types/server/master/master.d.ts +7 -7
- package/lib/types/server/master/pool.d.ts +31 -31
- package/lib/types/server/master/runner.d.ts +26 -26
- package/lib/types/server/master/server.d.ts +2 -2
- package/lib/types/server/messages.d.ts +29 -27
- package/lib/types/server/selenium/browser.d.ts +19 -17
- package/lib/types/server/selenium/index.d.ts +2 -2
- package/lib/types/server/selenium/selenoid.d.ts +3 -3
- package/lib/types/server/stories.d.ts +8 -8
- package/lib/types/server/storybook/entry.d.ts +17 -17
- package/lib/types/server/storybook/helpers.d.ts +24 -24
- package/lib/types/server/storybook/providers/browser.d.ts +2 -4
- package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
- package/lib/types/server/storybook/providers/nodejs.d.ts +9 -9
- package/lib/types/server/testsFiles/parser.d.ts +12 -12
- package/lib/types/server/testsFiles/register.d.ts +2 -2
- package/lib/types/server/update.d.ts +2 -2
- package/lib/types/server/utils.d.ts +24 -24
- package/lib/types/server/worker/chai-image.d.ts +6 -6
- package/lib/types/server/worker/helpers.d.ts +8 -8
- package/lib/types/server/worker/index.d.ts +1 -1
- package/lib/types/server/worker/reporter.d.ts +8 -8
- package/lib/types/server/worker/worker.d.ts +4 -4
- package/lib/types/shared/index.d.ts +7 -7
- package/lib/types/shared/serializeRegExp.d.ts +9 -9
- package/lib/types/types.d.ts +486 -489
- package/package.json +4 -3
@@ -40,6 +40,7 @@ var _utils = require("../utils");
|
|
40
40
|
|
41
41
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
42
42
|
|
43
|
+
const storybookRootID = (0, _helpers.isStorybookVersionLessThan)(7) ? 'root' : 'storybook-root';
|
43
44
|
const DOCKER_INTERNAL = 'host.docker.internal';
|
44
45
|
let browserLogger = _logger.logger;
|
45
46
|
let browserName = '';
|
@@ -116,10 +117,10 @@ function getUrlChecker(browser) {
|
|
116
117
|
// We don't use any page load strategies except `NONE`
|
117
118
|
// because other add significant delay and some of them don't work in earlier chrome versions
|
118
119
|
// Browsers always load page successful even it's failed
|
119
|
-
// So we just check
|
120
|
+
// So we just check `root` element
|
120
121
|
|
121
|
-
browserLogger.debug(`Checking ${_chalk.default.cyan(
|
122
|
-
return source.includes(
|
122
|
+
browserLogger.debug(`Checking ${_chalk.default.cyan(`#${storybookRootID}`)} existence on ${_chalk.default.magenta(url)}`);
|
123
|
+
return source.includes(`id="${storybookRootID}"`);
|
123
124
|
} catch (error) {
|
124
125
|
return false;
|
125
126
|
}
|
@@ -137,11 +138,18 @@ async function waitForStorybook(browser) {
|
|
137
138
|
}, 60000);
|
138
139
|
|
139
140
|
while (wait) {
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
141
|
+
if ((0, _helpers.isStorybookVersionLessThan)(7)) {
|
142
|
+
wait = await browser.executeAsyncScript(function (SET_STORIES, callback) {
|
143
|
+
if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return callback(true);
|
144
|
+
if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_STORIES) == undefined) return callback(true);
|
145
|
+
return callback(false);
|
146
|
+
}, Events.SET_STORIES);
|
147
|
+
} else {
|
148
|
+
wait = await browser.executeAsyncScript(function (callback) {
|
149
|
+
return callback(typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined');
|
150
|
+
});
|
151
|
+
}
|
152
|
+
|
145
153
|
if (!wait) clearTimeout(initiateTimeout);
|
146
154
|
}
|
147
155
|
|
@@ -411,10 +419,12 @@ async function resolveCreeveyHost(browser, port) {
|
|
411
419
|
const addresses = getAddresses();
|
412
420
|
creeveyServerHost = await browser.executeAsyncScript(function (hosts, port, callback) {
|
413
421
|
void Promise.all(hosts.map(function (host) {
|
414
|
-
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
415
|
-
|
422
|
+
return Promise.race([// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
423
|
+
fetch('http://' + host + ':' + port + '/ping').then(function (response) {
|
416
424
|
return response.text();
|
417
|
-
})
|
425
|
+
}), new Promise((_resolve, reject) => {
|
426
|
+
setTimeout(reject, 5000);
|
427
|
+
})]).then(function (pong) {
|
418
428
|
return pong == 'pong' ? host : null;
|
419
429
|
}).catch(function () {
|
420
430
|
return null;
|
@@ -429,21 +439,18 @@ async function resolveCreeveyHost(browser, port) {
|
|
429
439
|
return creeveyServerHost;
|
430
440
|
}
|
431
441
|
|
432
|
-
async function loadStoriesFromBrowser(
|
442
|
+
async function loadStoriesFromBrowser() {
|
433
443
|
if (!browser) throw new Error("Can't get stories from browser if webdriver isn't connected");
|
434
|
-
const
|
435
|
-
const stories = await browser.executeAsyncScript(function (creeveyHost, creeveyPort, callback) {
|
436
|
-
window.__CREEVEY_SERVER_HOST__ = creeveyHost;
|
437
|
-
window.__CREEVEY_SERVER_PORT__ = creeveyPort;
|
444
|
+
const stories = await browser.executeAsyncScript(function (callback) {
|
438
445
|
void window.__CREEVEY_GET_STORIES__().then(callback);
|
439
|
-
}
|
446
|
+
});
|
440
447
|
if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
|
441
448
|
return stories;
|
442
449
|
}
|
443
450
|
|
444
|
-
async function getBrowser(config,
|
451
|
+
async function getBrowser(config, options) {
|
445
452
|
if (browser) return browser;
|
446
|
-
browserName =
|
453
|
+
browserName = options.browser;
|
447
454
|
const browserConfig = config.browsers[browserName];
|
448
455
|
const {
|
449
456
|
gridUrl = config.gridUrl,
|
@@ -473,7 +480,7 @@ async function getBrowser(config, name) {
|
|
473
480
|
const url = new URL(gridUrl);
|
474
481
|
url.username = url.username ? '********' : '';
|
475
482
|
url.password = url.password ? '********' : '';
|
476
|
-
browserLogger.debug(`(${
|
483
|
+
browserLogger.debug(`(${browserName}) Connecting to Selenium ${_chalk.default.magenta(url.toString())}`);
|
477
484
|
browser = await new _seleniumWebdriver.Builder().usingServer(gridUrl).withCapabilities(capabilities).build();
|
478
485
|
const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
|
479
486
|
let browserHost = '';
|
@@ -487,14 +494,14 @@ async function getBrowser(config, name) {
|
|
487
494
|
/* noop */
|
488
495
|
}
|
489
496
|
|
490
|
-
browserLogger.debug(`(${
|
497
|
+
browserLogger.debug(`(${browserName}) Connected successful with ${[_chalk.default.green(browserHost), _chalk.default.magenta(sessionId)].filter(Boolean).join(':')}`);
|
491
498
|
browserLogger = (0, _loglevel.getLogger)(sessionId);
|
492
499
|
|
493
500
|
_loglevelPluginPrefix.default.apply(browserLogger, {
|
494
501
|
format(level) {
|
495
502
|
const levelColor = _logger.colors[level.toUpperCase()];
|
496
503
|
|
497
|
-
return `[${
|
504
|
+
return `[${browserName}:${_chalk.default.gray(sessionId)}] ${levelColor(level)} =>`;
|
498
505
|
}
|
499
506
|
|
500
507
|
});
|
@@ -528,9 +535,12 @@ async function getBrowser(config, name) {
|
|
528
535
|
await updateStorybookGlobals(browser, _storybookGlobals);
|
529
536
|
}
|
530
537
|
|
531
|
-
await browser.
|
538
|
+
const creeveyHost = await resolveCreeveyHost(browser, options.port);
|
539
|
+
await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
|
532
540
|
window.__CREEVEY_WORKER_ID__ = workerId;
|
533
|
-
|
541
|
+
window.__CREEVEY_SERVER_HOST__ = creeveyHost;
|
542
|
+
window.__CREEVEY_SERVER_PORT__ = creeveyPort;
|
543
|
+
}, process.pid, creeveyHost, options.port);
|
534
544
|
return browser;
|
535
545
|
}
|
536
546
|
|
@@ -581,7 +591,7 @@ async function switchStory() {
|
|
581
591
|
parameters
|
582
592
|
} = story;
|
583
593
|
const {
|
584
|
-
captureElement =
|
594
|
+
captureElement = `#${storybookRootID}`,
|
585
595
|
waitForReady,
|
586
596
|
ignoreElements
|
587
597
|
} = parameters.creevey ?? {};
|
@@ -88,7 +88,7 @@ function getStorybookVersion() {
|
|
88
88
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
89
89
|
const {
|
90
90
|
version
|
91
|
-
} = require(resolveFromStorybook('@storybook/core/package.json'));
|
91
|
+
} = require(resolveFromStorybook('@storybook/core-server/package.json'));
|
92
92
|
|
93
93
|
return version;
|
94
94
|
}
|
@@ -3,7 +3,7 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.loadStories =
|
6
|
+
exports.loadStories = void 0;
|
7
7
|
|
8
8
|
var _cluster = _interopRequireDefault(require("cluster"));
|
9
9
|
|
@@ -17,9 +17,7 @@ var _logger = require("../../logger");
|
|
17
17
|
|
18
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
19
19
|
|
20
|
-
async
|
21
|
-
port
|
22
|
-
}, storiesListener) {
|
20
|
+
const loadStories = async (_config, _options, storiesListener) => {
|
23
21
|
if (_cluster.default.isPrimary) {
|
24
22
|
return new Promise(resolve => {
|
25
23
|
const worker = Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).find(worker => worker.isConnected());
|
@@ -57,7 +55,7 @@ async function loadStories(_config, {
|
|
57
55
|
});
|
58
56
|
if (message.type == 'update') storiesListener(new Map(message.payload));
|
59
57
|
});
|
60
|
-
const stories = await (0, _selenium.loadStoriesFromBrowser)(
|
58
|
+
const stories = await (0, _selenium.loadStoriesFromBrowser)();
|
61
59
|
const storiesWithOldTests = [];
|
62
60
|
Object.values(stories).forEach(story => {
|
63
61
|
var _parameters, _parameters$creevey;
|
@@ -71,4 +69,6 @@ async function loadStories(_config, {
|
|
71
69
|
});
|
72
70
|
return stories;
|
73
71
|
}
|
74
|
-
}
|
72
|
+
};
|
73
|
+
|
74
|
+
exports.loadStories = loadStories;
|
@@ -3,7 +3,7 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.loadStories =
|
6
|
+
exports.loadStories = void 0;
|
7
7
|
|
8
8
|
var _chokidar = _interopRequireDefault(require("chokidar"));
|
9
9
|
|
@@ -23,9 +23,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
|
|
23
23
|
|
24
24
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
25
25
|
|
26
|
-
async
|
27
|
-
port
|
28
|
-
}, storiesListener) {
|
26
|
+
const loadStories = async (_config, _options, storiesListener) => {
|
29
27
|
let creeveyParamsByStoryId = {};
|
30
28
|
|
31
29
|
const mergeParamsFromTestsToStory = (story, creeveyParams) => {
|
@@ -34,9 +32,7 @@ async function loadStories(_config, {
|
|
34
32
|
}
|
35
33
|
};
|
36
34
|
|
37
|
-
const stories = await (0, _browser.loadStories)(_config, {
|
38
|
-
port
|
39
|
-
}, updatedStoriesByFiles => {
|
35
|
+
const stories = await (0, _browser.loadStories)(_config, {}, updatedStoriesByFiles => {
|
40
36
|
Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
|
41
37
|
storiesArray.forEach(story => {
|
42
38
|
const creeveyParams = creeveyParamsByStoryId[story.id];
|
@@ -56,7 +52,9 @@ async function loadStories(_config, {
|
|
56
52
|
mergeParamsFromTestsToStory(story, creeveyParamsByStoryId[storyId]);
|
57
53
|
});
|
58
54
|
return stories;
|
59
|
-
}
|
55
|
+
};
|
56
|
+
|
57
|
+
exports.loadStories = loadStories;
|
60
58
|
|
61
59
|
async function parseParams(config, listener) {
|
62
60
|
if (!config.testsDir) {
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.extractStoriesData = extractStoriesData;
|
7
|
-
exports.loadStories =
|
7
|
+
exports.loadStories = void 0;
|
8
8
|
|
9
9
|
var _path = _interopRequireDefault(require("path"));
|
10
10
|
|
@@ -189,10 +189,10 @@ async function loadStoriesDirectly(config, {
|
|
189
189
|
} // TODO Do we need to support multiple storybooks here?
|
190
190
|
|
191
191
|
|
192
|
-
async
|
192
|
+
const loadStories = async (config, {
|
193
193
|
watch,
|
194
194
|
debug
|
195
|
-
}, storiesListener) {
|
195
|
+
}, storiesListener) => {
|
196
196
|
const storybookApi = await initStorybookEnvironment();
|
197
197
|
const Events = await (0, _helpers.importStorybookCoreEvents)();
|
198
198
|
const {
|
@@ -217,7 +217,9 @@ async function loadStories(config, {
|
|
217
217
|
debug
|
218
218
|
});
|
219
219
|
return loadPromise;
|
220
|
-
}
|
220
|
+
};
|
221
|
+
|
222
|
+
exports.loadStories = loadStories;
|
221
223
|
|
222
224
|
async function extractStoriesData(config, {
|
223
225
|
watch,
|
@@ -40,9 +40,5 @@ async function register(config) {
|
|
40
40
|
plugins: [['@babel/plugin-transform-runtime'], ['babel-plugin-tsconfig-paths', {
|
41
41
|
tsconfig: tsConfigPath
|
42
42
|
}]]
|
43
|
-
}));
|
44
|
-
(await Promise.resolve().then(() => _interopRequireWildcard(require('ts-node')))).register({
|
45
|
-
project: tsConfigPath,
|
46
|
-
transpileOnly: true
|
47
|
-
});
|
43
|
+
})); // (await import('ts-node')).register({ project: tsConfigPath, transpileOnly: true });
|
48
44
|
}
|
@@ -194,7 +194,7 @@ async function worker(config, options) {
|
|
194
194
|
|
195
195
|
_chai.default.use((0, _chaiImage.default)(getExpected, config.diffOptions));
|
196
196
|
|
197
|
-
if ((await (0, _selenium.getBrowser)(config, options
|
197
|
+
if ((await (0, _selenium.getBrowser)(config, options)) == null) return;
|
198
198
|
await (0, _helpers.addTestsFromStories)(mocha.suite, config, {
|
199
199
|
browser: options.browser,
|
200
200
|
watch: options.ui,
|
@@ -205,12 +205,12 @@ async function worker(config, options) {
|
|
205
205
|
try {
|
206
206
|
var _await$getBrowser;
|
207
207
|
|
208
|
-
await ((_await$getBrowser = await (0, _selenium.getBrowser)(config, options
|
208
|
+
await ((_await$getBrowser = await (0, _selenium.getBrowser)(config, options)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
|
209
209
|
} catch (_) {
|
210
210
|
await (0, _selenium.closeBrowser)();
|
211
211
|
}
|
212
212
|
|
213
|
-
const browser = await (0, _selenium.getBrowser)(config, options
|
213
|
+
const browser = await (0, _selenium.getBrowser)(config, options);
|
214
214
|
const sessionId = (_await$browser$getSes = await (browser === null || browser === void 0 ? void 0 : browser.getSession())) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
|
215
215
|
if (browser == null) return;
|
216
216
|
const interval = setInterval(() => void browser.getCurrentUrl().then(url => {
|
package/lib/cjs/types.js
CHANGED
@@ -10,8 +10,9 @@ import { PageLoadStrategy } from 'selenium-webdriver/lib/capabilities';
|
|
10
10
|
import { isDefined, noop } from '../../types';
|
11
11
|
import { colors, logger } from '../logger';
|
12
12
|
import { emitStoriesMessage, subscribeOn } from '../messages';
|
13
|
-
import { importStorybookCoreEvents } from '../storybook/helpers';
|
13
|
+
import { importStorybookCoreEvents, isStorybookVersionLessThan } from '../storybook/helpers';
|
14
14
|
import { isShuttingDown, LOCALHOST_REGEXP, runSequence } from '../utils';
|
15
|
+
const storybookRootID = isStorybookVersionLessThan(7) ? 'root' : 'storybook-root';
|
15
16
|
const DOCKER_INTERNAL = 'host.docker.internal';
|
16
17
|
let browserLogger = logger;
|
17
18
|
let browserName = '';
|
@@ -88,10 +89,10 @@ function getUrlChecker(browser) {
|
|
88
89
|
// We don't use any page load strategies except `NONE`
|
89
90
|
// because other add significant delay and some of them don't work in earlier chrome versions
|
90
91
|
// Browsers always load page successful even it's failed
|
91
|
-
// So we just check
|
92
|
+
// So we just check `root` element
|
92
93
|
|
93
|
-
browserLogger.debug(`Checking ${chalk.cyan(
|
94
|
-
return source.includes(
|
94
|
+
browserLogger.debug(`Checking ${chalk.cyan(`#${storybookRootID}`)} existence on ${chalk.magenta(url)}`);
|
95
|
+
return source.includes(`id="${storybookRootID}"`);
|
95
96
|
} catch (error) {
|
96
97
|
return false;
|
97
98
|
}
|
@@ -109,11 +110,18 @@ async function waitForStorybook(browser) {
|
|
109
110
|
}, 60000);
|
110
111
|
|
111
112
|
while (wait) {
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
113
|
+
if (isStorybookVersionLessThan(7)) {
|
114
|
+
wait = await browser.executeAsyncScript(function (SET_STORIES, callback) {
|
115
|
+
if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return callback(true);
|
116
|
+
if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_STORIES) == undefined) return callback(true);
|
117
|
+
return callback(false);
|
118
|
+
}, Events.SET_STORIES);
|
119
|
+
} else {
|
120
|
+
wait = await browser.executeAsyncScript(function (callback) {
|
121
|
+
return callback(typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined');
|
122
|
+
});
|
123
|
+
}
|
124
|
+
|
117
125
|
if (!wait) clearTimeout(initiateTimeout);
|
118
126
|
}
|
119
127
|
|
@@ -383,10 +391,12 @@ async function resolveCreeveyHost(browser, port) {
|
|
383
391
|
const addresses = getAddresses();
|
384
392
|
creeveyServerHost = await browser.executeAsyncScript(function (hosts, port, callback) {
|
385
393
|
void Promise.all(hosts.map(function (host) {
|
386
|
-
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
387
|
-
|
394
|
+
return Promise.race([// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
395
|
+
fetch('http://' + host + ':' + port + '/ping').then(function (response) {
|
388
396
|
return response.text();
|
389
|
-
})
|
397
|
+
}), new Promise((_resolve, reject) => {
|
398
|
+
setTimeout(reject, 5000);
|
399
|
+
})]).then(function (pong) {
|
390
400
|
return pong == 'pong' ? host : null;
|
391
401
|
}).catch(function () {
|
392
402
|
return null;
|
@@ -401,20 +411,17 @@ async function resolveCreeveyHost(browser, port) {
|
|
401
411
|
return creeveyServerHost;
|
402
412
|
}
|
403
413
|
|
404
|
-
export async function loadStoriesFromBrowser(
|
414
|
+
export async function loadStoriesFromBrowser() {
|
405
415
|
if (!browser) throw new Error("Can't get stories from browser if webdriver isn't connected");
|
406
|
-
const
|
407
|
-
const stories = await browser.executeAsyncScript(function (creeveyHost, creeveyPort, callback) {
|
408
|
-
window.__CREEVEY_SERVER_HOST__ = creeveyHost;
|
409
|
-
window.__CREEVEY_SERVER_PORT__ = creeveyPort;
|
416
|
+
const stories = await browser.executeAsyncScript(function (callback) {
|
410
417
|
void window.__CREEVEY_GET_STORIES__().then(callback);
|
411
|
-
}
|
418
|
+
});
|
412
419
|
if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
|
413
420
|
return stories;
|
414
421
|
}
|
415
|
-
export async function getBrowser(config,
|
422
|
+
export async function getBrowser(config, options) {
|
416
423
|
if (browser) return browser;
|
417
|
-
browserName =
|
424
|
+
browserName = options.browser;
|
418
425
|
const browserConfig = config.browsers[browserName];
|
419
426
|
const {
|
420
427
|
gridUrl = config.gridUrl,
|
@@ -444,7 +451,7 @@ export async function getBrowser(config, name) {
|
|
444
451
|
const url = new URL(gridUrl);
|
445
452
|
url.username = url.username ? '********' : '';
|
446
453
|
url.password = url.password ? '********' : '';
|
447
|
-
browserLogger.debug(`(${
|
454
|
+
browserLogger.debug(`(${browserName}) Connecting to Selenium ${chalk.magenta(url.toString())}`);
|
448
455
|
browser = await new Builder().usingServer(gridUrl).withCapabilities(capabilities).build();
|
449
456
|
const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
|
450
457
|
let browserHost = '';
|
@@ -458,12 +465,12 @@ export async function getBrowser(config, name) {
|
|
458
465
|
/* noop */
|
459
466
|
}
|
460
467
|
|
461
|
-
browserLogger.debug(`(${
|
468
|
+
browserLogger.debug(`(${browserName}) Connected successful with ${[chalk.green(browserHost), chalk.magenta(sessionId)].filter(Boolean).join(':')}`);
|
462
469
|
browserLogger = getLogger(sessionId);
|
463
470
|
prefix.apply(browserLogger, {
|
464
471
|
format(level) {
|
465
472
|
const levelColor = colors[level.toUpperCase()];
|
466
|
-
return `[${
|
473
|
+
return `[${browserName}:${chalk.gray(sessionId)}] ${levelColor(level)} =>`;
|
467
474
|
}
|
468
475
|
|
469
476
|
});
|
@@ -496,9 +503,12 @@ export async function getBrowser(config, name) {
|
|
496
503
|
await updateStorybookGlobals(browser, _storybookGlobals);
|
497
504
|
}
|
498
505
|
|
499
|
-
await browser.
|
506
|
+
const creeveyHost = await resolveCreeveyHost(browser, options.port);
|
507
|
+
await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
|
500
508
|
window.__CREEVEY_WORKER_ID__ = workerId;
|
501
|
-
|
509
|
+
window.__CREEVEY_SERVER_HOST__ = creeveyHost;
|
510
|
+
window.__CREEVEY_SERVER_PORT__ = creeveyPort;
|
511
|
+
}, process.pid, creeveyHost, options.port);
|
502
512
|
return browser;
|
503
513
|
}
|
504
514
|
|
@@ -548,7 +558,7 @@ export async function switchStory() {
|
|
548
558
|
parameters
|
549
559
|
} = story;
|
550
560
|
const {
|
551
|
-
captureElement =
|
561
|
+
captureElement = `#${storybookRootID}`,
|
552
562
|
waitForReady,
|
553
563
|
ignoreElements
|
554
564
|
} = parameters.creevey ?? {};
|
@@ -35,7 +35,7 @@ export function getStorybookVersion() {
|
|
35
35
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
36
36
|
const {
|
37
37
|
version
|
38
|
-
} = require(resolveFromStorybook('@storybook/core/package.json'));
|
38
|
+
} = require(resolveFromStorybook('@storybook/core-server/package.json'));
|
39
39
|
|
40
40
|
return version;
|
41
41
|
}
|
@@ -3,9 +3,7 @@ import { loadStoriesFromBrowser } from '../../selenium';
|
|
3
3
|
import { emitStoriesMessage, sendStoriesMessage, subscribeOn, subscribeOnWorker } from '../../messages';
|
4
4
|
import { isDefined } from '../../../types';
|
5
5
|
import { logger } from '../../logger';
|
6
|
-
export async
|
7
|
-
port
|
8
|
-
}, storiesListener) {
|
6
|
+
export const loadStories = async (_config, _options, storiesListener) => {
|
9
7
|
if (cluster.isPrimary) {
|
10
8
|
return new Promise(resolve => {
|
11
9
|
const worker = Object.values(cluster.workers ?? {}).filter(isDefined).find(worker => worker.isConnected());
|
@@ -43,7 +41,7 @@ export async function loadStories(_config, {
|
|
43
41
|
});
|
44
42
|
if (message.type == 'update') storiesListener(new Map(message.payload));
|
45
43
|
});
|
46
|
-
const stories = await loadStoriesFromBrowser(
|
44
|
+
const stories = await loadStoriesFromBrowser();
|
47
45
|
const storiesWithOldTests = [];
|
48
46
|
Object.values(stories).forEach(story => {
|
49
47
|
var _parameters, _parameters$creevey;
|
@@ -57,4 +55,4 @@ export async function loadStories(_config, {
|
|
57
55
|
});
|
58
56
|
return stories;
|
59
57
|
}
|
60
|
-
}
|
58
|
+
};
|
@@ -4,9 +4,7 @@ import { logger } from '../../logger';
|
|
4
4
|
import parse from '../../testsFiles/parser';
|
5
5
|
import { readDirRecursive } from '../../../server/utils';
|
6
6
|
import { combineParameters } from '../../../shared';
|
7
|
-
export async
|
8
|
-
port
|
9
|
-
}, storiesListener) {
|
7
|
+
export const loadStories = async (_config, _options, storiesListener) => {
|
10
8
|
let creeveyParamsByStoryId = {};
|
11
9
|
|
12
10
|
const mergeParamsFromTestsToStory = (story, creeveyParams) => {
|
@@ -15,9 +13,7 @@ export async function loadStories(_config, {
|
|
15
13
|
}
|
16
14
|
};
|
17
15
|
|
18
|
-
const stories = await browserProvider(_config, {
|
19
|
-
port
|
20
|
-
}, updatedStoriesByFiles => {
|
16
|
+
const stories = await browserProvider(_config, {}, updatedStoriesByFiles => {
|
21
17
|
Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
|
22
18
|
storiesArray.forEach(story => {
|
23
19
|
const creeveyParams = creeveyParamsByStoryId[story.id];
|
@@ -37,7 +33,7 @@ export async function loadStories(_config, {
|
|
37
33
|
mergeParamsFromTestsToStory(story, creeveyParamsByStoryId[storyId]);
|
38
34
|
});
|
39
35
|
return stories;
|
40
|
-
}
|
36
|
+
};
|
41
37
|
|
42
38
|
async function parseParams(config, listener) {
|
43
39
|
if (!config.testsDir) {
|
@@ -169,10 +169,10 @@ async function loadStoriesDirectly(config, {
|
|
169
169
|
} // TODO Do we need to support multiple storybooks here?
|
170
170
|
|
171
171
|
|
172
|
-
export async
|
172
|
+
export const loadStories = async (config, {
|
173
173
|
watch,
|
174
174
|
debug
|
175
|
-
}, storiesListener) {
|
175
|
+
}, storiesListener) => {
|
176
176
|
const storybookApi = await initStorybookEnvironment();
|
177
177
|
const Events = await importStorybookCoreEvents();
|
178
178
|
const {
|
@@ -197,7 +197,7 @@ export async function loadStories(config, {
|
|
197
197
|
debug
|
198
198
|
});
|
199
199
|
return loadPromise;
|
200
|
-
}
|
200
|
+
};
|
201
201
|
export async function extractStoriesData(config, {
|
202
202
|
watch,
|
203
203
|
debug
|
@@ -27,9 +27,5 @@ export default async function register(config) {
|
|
27
27
|
plugins: [['@babel/plugin-transform-runtime'], ['babel-plugin-tsconfig-paths', {
|
28
28
|
tsconfig: tsConfigPath
|
29
29
|
}]]
|
30
|
-
}));
|
31
|
-
(await import('ts-node')).register({
|
32
|
-
project: tsConfigPath,
|
33
|
-
transpileOnly: true
|
34
|
-
});
|
30
|
+
})); // (await import('ts-node')).register({ project: tsConfigPath, transpileOnly: true });
|
35
31
|
}
|
@@ -166,7 +166,7 @@ export default async function worker(config, options) {
|
|
166
166
|
const mocha = new Mocha(mochaOptions);
|
167
167
|
mocha.cleanReferencesAfterRun(false);
|
168
168
|
chai.use(chaiImage(getExpected, config.diffOptions));
|
169
|
-
if ((await getBrowser(config, options
|
169
|
+
if ((await getBrowser(config, options)) == null) return;
|
170
170
|
await addTestsFromStories(mocha.suite, config, {
|
171
171
|
browser: options.browser,
|
172
172
|
watch: options.ui,
|
@@ -177,12 +177,12 @@ export default async function worker(config, options) {
|
|
177
177
|
try {
|
178
178
|
var _await$getBrowser;
|
179
179
|
|
180
|
-
await ((_await$getBrowser = await getBrowser(config, options
|
180
|
+
await ((_await$getBrowser = await getBrowser(config, options)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
|
181
181
|
} catch (_) {
|
182
182
|
await closeBrowser();
|
183
183
|
}
|
184
184
|
|
185
|
-
const browser = await getBrowser(config, options
|
185
|
+
const browser = await getBrowser(config, options);
|
186
186
|
const sessionId = (_await$browser$getSes = await (browser === null || browser === void 0 ? void 0 : browser.getSession())) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
|
187
187
|
if (browser == null) return;
|
188
188
|
const interval = setInterval(() => void browser.getCurrentUrl().then(url => {
|
package/lib/esm/types.js
CHANGED
package/lib/types/cli.d.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
#!/usr/bin/env node
|
1
|
+
#!/usr/bin/env node
|