creevey 0.9.0-beta.5 → 0.9.0-beta.6
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 +30 -22
- 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/worker/worker.js +3 -3
- package/lib/cjs/types.js +1 -0
- package/lib/esm/server/selenium/browser.js +31 -23
- 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/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 +27 -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 +2 -1
@@ -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
|
|
@@ -429,21 +437,18 @@ async function resolveCreeveyHost(browser, port) {
|
|
429
437
|
return creeveyServerHost;
|
430
438
|
}
|
431
439
|
|
432
|
-
async function loadStoriesFromBrowser(
|
440
|
+
async function loadStoriesFromBrowser() {
|
433
441
|
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;
|
442
|
+
const stories = await browser.executeAsyncScript(function (callback) {
|
438
443
|
void window.__CREEVEY_GET_STORIES__().then(callback);
|
439
|
-
}
|
444
|
+
});
|
440
445
|
if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
|
441
446
|
return stories;
|
442
447
|
}
|
443
448
|
|
444
|
-
async function getBrowser(config,
|
449
|
+
async function getBrowser(config, options) {
|
445
450
|
if (browser) return browser;
|
446
|
-
browserName =
|
451
|
+
browserName = options.browser;
|
447
452
|
const browserConfig = config.browsers[browserName];
|
448
453
|
const {
|
449
454
|
gridUrl = config.gridUrl,
|
@@ -473,7 +478,7 @@ async function getBrowser(config, name) {
|
|
473
478
|
const url = new URL(gridUrl);
|
474
479
|
url.username = url.username ? '********' : '';
|
475
480
|
url.password = url.password ? '********' : '';
|
476
|
-
browserLogger.debug(`(${
|
481
|
+
browserLogger.debug(`(${browserName}) Connecting to Selenium ${_chalk.default.magenta(url.toString())}`);
|
477
482
|
browser = await new _seleniumWebdriver.Builder().usingServer(gridUrl).withCapabilities(capabilities).build();
|
478
483
|
const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
|
479
484
|
let browserHost = '';
|
@@ -487,14 +492,14 @@ async function getBrowser(config, name) {
|
|
487
492
|
/* noop */
|
488
493
|
}
|
489
494
|
|
490
|
-
browserLogger.debug(`(${
|
495
|
+
browserLogger.debug(`(${browserName}) Connected successful with ${[_chalk.default.green(browserHost), _chalk.default.magenta(sessionId)].filter(Boolean).join(':')}`);
|
491
496
|
browserLogger = (0, _loglevel.getLogger)(sessionId);
|
492
497
|
|
493
498
|
_loglevelPluginPrefix.default.apply(browserLogger, {
|
494
499
|
format(level) {
|
495
500
|
const levelColor = _logger.colors[level.toUpperCase()];
|
496
501
|
|
497
|
-
return `[${
|
502
|
+
return `[${browserName}:${_chalk.default.gray(sessionId)}] ${levelColor(level)} =>`;
|
498
503
|
}
|
499
504
|
|
500
505
|
});
|
@@ -528,9 +533,12 @@ async function getBrowser(config, name) {
|
|
528
533
|
await updateStorybookGlobals(browser, _storybookGlobals);
|
529
534
|
}
|
530
535
|
|
531
|
-
await browser.
|
536
|
+
const creeveyHost = await resolveCreeveyHost(browser, options.port);
|
537
|
+
await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
|
532
538
|
window.__CREEVEY_WORKER_ID__ = workerId;
|
533
|
-
|
539
|
+
window.__CREEVEY_SERVER_HOST__ = creeveyHost;
|
540
|
+
window.__CREEVEY_SERVER_PORT__ = creeveyPort;
|
541
|
+
}, process.pid, creeveyHost, options.port);
|
534
542
|
return browser;
|
535
543
|
}
|
536
544
|
|
@@ -581,7 +589,7 @@ async function switchStory() {
|
|
581
589
|
parameters
|
582
590
|
} = story;
|
583
591
|
const {
|
584
|
-
captureElement =
|
592
|
+
captureElement = `#${storybookRootID}`,
|
585
593
|
waitForReady,
|
586
594
|
ignoreElements
|
587
595
|
} = 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,
|
@@ -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
|
|
@@ -401,20 +409,17 @@ async function resolveCreeveyHost(browser, port) {
|
|
401
409
|
return creeveyServerHost;
|
402
410
|
}
|
403
411
|
|
404
|
-
export async function loadStoriesFromBrowser(
|
412
|
+
export async function loadStoriesFromBrowser() {
|
405
413
|
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;
|
414
|
+
const stories = await browser.executeAsyncScript(function (callback) {
|
410
415
|
void window.__CREEVEY_GET_STORIES__().then(callback);
|
411
|
-
}
|
416
|
+
});
|
412
417
|
if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
|
413
418
|
return stories;
|
414
419
|
}
|
415
|
-
export async function getBrowser(config,
|
420
|
+
export async function getBrowser(config, options) {
|
416
421
|
if (browser) return browser;
|
417
|
-
browserName =
|
422
|
+
browserName = options.browser;
|
418
423
|
const browserConfig = config.browsers[browserName];
|
419
424
|
const {
|
420
425
|
gridUrl = config.gridUrl,
|
@@ -444,7 +449,7 @@ export async function getBrowser(config, name) {
|
|
444
449
|
const url = new URL(gridUrl);
|
445
450
|
url.username = url.username ? '********' : '';
|
446
451
|
url.password = url.password ? '********' : '';
|
447
|
-
browserLogger.debug(`(${
|
452
|
+
browserLogger.debug(`(${browserName}) Connecting to Selenium ${chalk.magenta(url.toString())}`);
|
448
453
|
browser = await new Builder().usingServer(gridUrl).withCapabilities(capabilities).build();
|
449
454
|
const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
|
450
455
|
let browserHost = '';
|
@@ -458,12 +463,12 @@ export async function getBrowser(config, name) {
|
|
458
463
|
/* noop */
|
459
464
|
}
|
460
465
|
|
461
|
-
browserLogger.debug(`(${
|
466
|
+
browserLogger.debug(`(${browserName}) Connected successful with ${[chalk.green(browserHost), chalk.magenta(sessionId)].filter(Boolean).join(':')}`);
|
462
467
|
browserLogger = getLogger(sessionId);
|
463
468
|
prefix.apply(browserLogger, {
|
464
469
|
format(level) {
|
465
470
|
const levelColor = colors[level.toUpperCase()];
|
466
|
-
return `[${
|
471
|
+
return `[${browserName}:${chalk.gray(sessionId)}] ${levelColor(level)} =>`;
|
467
472
|
}
|
468
473
|
|
469
474
|
});
|
@@ -496,9 +501,12 @@ export async function getBrowser(config, name) {
|
|
496
501
|
await updateStorybookGlobals(browser, _storybookGlobals);
|
497
502
|
}
|
498
503
|
|
499
|
-
await browser.
|
504
|
+
const creeveyHost = await resolveCreeveyHost(browser, options.port);
|
505
|
+
await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
|
500
506
|
window.__CREEVEY_WORKER_ID__ = workerId;
|
501
|
-
|
507
|
+
window.__CREEVEY_SERVER_HOST__ = creeveyHost;
|
508
|
+
window.__CREEVEY_SERVER_PORT__ = creeveyPort;
|
509
|
+
}, process.pid, creeveyHost, options.port);
|
502
510
|
return browser;
|
503
511
|
}
|
504
512
|
|
@@ -548,7 +556,7 @@ export async function switchStory() {
|
|
548
556
|
parameters
|
549
557
|
} = story;
|
550
558
|
const {
|
551
|
-
captureElement =
|
559
|
+
captureElement = `#${storybookRootID}`,
|
552
560
|
waitForReady,
|
553
561
|
ignoreElements
|
554
562
|
} = 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
|
@@ -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
|
@@ -1,37 +1,37 @@
|
|
1
|
-
import { API } from '@storybook/api';
|
2
|
-
import { denormalizeStoryParameters } from '../../shared';
|
3
|
-
import { CreeveyStatus, CreeveyUpdate, TestData, TestStatus, StoriesRaw } from '../../types';
|
4
|
-
import { CreeveyClientApi } from '../shared/creeveyClientApi';
|
5
|
-
export declare class CreeveyManager {
|
6
|
-
storybookApi: API;
|
7
|
-
storyId: string;
|
8
|
-
activeBrowser: string;
|
9
|
-
selectedTestId: string;
|
10
|
-
status: CreeveyStatus;
|
11
|
-
creeveyApi: CreeveyClientApi | null;
|
12
|
-
stories: StoriesRaw;
|
13
|
-
updateStatusListeners: Array<(update: CreeveyUpdate) => void>;
|
14
|
-
changeTestListeners: Array<(testId: string) => void>;
|
15
|
-
constructor(storybookApi: API);
|
16
|
-
initAll: () => Promise<void>;
|
17
|
-
onUpdateStatus(listener: (update: CreeveyUpdate) => void): () => void;
|
18
|
-
onChangeTest(listener: (testId: string) => void): () => void;
|
19
|
-
handleCreeveyUpdate: (update: CreeveyUpdate) => void;
|
20
|
-
getCurrentTest: () => TestData | undefined;
|
21
|
-
onStoryRendered: (storyId: string) => void;
|
22
|
-
onStart: () => void;
|
23
|
-
onStop: () => void;
|
24
|
-
onImageApprove: (id: string, retry: number, image: string) => void;
|
25
|
-
onStartAllStoryTests: () => void;
|
26
|
-
onStartAllTests: () => void;
|
27
|
-
onSetStories: (data: Parameters<typeof denormalizeStoryParameters>['0']) => void;
|
28
|
-
setActiveBrowser: (browser: string) => void;
|
29
|
-
setSelectedTestId: (testId: string) => void;
|
30
|
-
getStoryTests: (storyId: string) => TestData[];
|
31
|
-
getBrowsers: () => string[];
|
32
|
-
getTestsByStoryIdAndBrowser: (browser: string) => TestData[];
|
33
|
-
getTabTitle: (browser: string) => string;
|
34
|
-
setPanelsTitle: () => void;
|
35
|
-
addStatusesToSideBar(): Promise<void>;
|
36
|
-
addStatusToStoryName(name: string, status: TestStatus | undefined, skip: string | boolean): string;
|
37
|
-
}
|
1
|
+
import { API } from '@storybook/api';
|
2
|
+
import { denormalizeStoryParameters } from '../../shared';
|
3
|
+
import { CreeveyStatus, CreeveyUpdate, TestData, TestStatus, StoriesRaw } from '../../types';
|
4
|
+
import { CreeveyClientApi } from '../shared/creeveyClientApi';
|
5
|
+
export declare class CreeveyManager {
|
6
|
+
storybookApi: API;
|
7
|
+
storyId: string;
|
8
|
+
activeBrowser: string;
|
9
|
+
selectedTestId: string;
|
10
|
+
status: CreeveyStatus;
|
11
|
+
creeveyApi: CreeveyClientApi | null;
|
12
|
+
stories: StoriesRaw;
|
13
|
+
updateStatusListeners: Array<(update: CreeveyUpdate) => void>;
|
14
|
+
changeTestListeners: Array<(testId: string) => void>;
|
15
|
+
constructor(storybookApi: API);
|
16
|
+
initAll: () => Promise<void>;
|
17
|
+
onUpdateStatus(listener: (update: CreeveyUpdate) => void): () => void;
|
18
|
+
onChangeTest(listener: (testId: string) => void): () => void;
|
19
|
+
handleCreeveyUpdate: (update: CreeveyUpdate) => void;
|
20
|
+
getCurrentTest: () => TestData | undefined;
|
21
|
+
onStoryRendered: (storyId: string) => void;
|
22
|
+
onStart: () => void;
|
23
|
+
onStop: () => void;
|
24
|
+
onImageApprove: (id: string, retry: number, image: string) => void;
|
25
|
+
onStartAllStoryTests: () => void;
|
26
|
+
onStartAllTests: () => void;
|
27
|
+
onSetStories: (data: Parameters<typeof denormalizeStoryParameters>['0']) => void;
|
28
|
+
setActiveBrowser: (browser: string) => void;
|
29
|
+
setSelectedTestId: (testId: string) => void;
|
30
|
+
getStoryTests: (storyId: string) => TestData[];
|
31
|
+
getBrowsers: () => string[];
|
32
|
+
getTestsByStoryIdAndBrowser: (browser: string) => TestData[];
|
33
|
+
getTabTitle: (browser: string) => string;
|
34
|
+
setPanelsTitle: () => void;
|
35
|
+
addStatusesToSideBar(): Promise<void>;
|
36
|
+
addStatusToStoryName(name: string, status: TestStatus | undefined, skip: string | boolean): string;
|
37
|
+
}
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import { CreeveyManager } from '../Manager';
|
2
|
-
interface AddonProps {
|
3
|
-
active?: boolean;
|
4
|
-
browser: string;
|
5
|
-
manager: CreeveyManager;
|
6
|
-
}
|
7
|
-
export declare const Addon: ({ active, browser, manager }: AddonProps) => JSX.Element | null;
|
8
|
-
export {};
|
1
|
+
import { CreeveyManager } from '../Manager';
|
2
|
+
interface AddonProps {
|
3
|
+
active?: boolean;
|
4
|
+
browser: string;
|
5
|
+
manager: CreeveyManager;
|
6
|
+
}
|
7
|
+
export declare const Addon: ({ active, browser, manager }: AddonProps) => JSX.Element | null;
|
8
|
+
export {};
|
@@ -1,7 +1,7 @@
|
|
1
|
-
interface IconProps {
|
2
|
-
width?: number;
|
3
|
-
height?: number;
|
4
|
-
}
|
5
|
-
export declare const NextIcon: ({ width, height }: IconProps) => JSX.Element;
|
6
|
-
export declare const ForwardIcon: ({ width, height }: IconProps) => JSX.Element;
|
7
|
-
export {};
|
1
|
+
interface IconProps {
|
2
|
+
width?: number;
|
3
|
+
height?: number;
|
4
|
+
}
|
5
|
+
export declare const NextIcon: ({ width, height }: IconProps) => JSX.Element;
|
6
|
+
export declare const ForwardIcon: ({ width, height }: IconProps) => JSX.Element;
|
7
|
+
export {};
|
@@ -1,9 +1,9 @@
|
|
1
|
-
import { TestData } from '../../../types';
|
2
|
-
interface PanelProps {
|
3
|
-
tests: TestData[];
|
4
|
-
selectedTestId: string;
|
5
|
-
onChangeTest: (testId: string) => void;
|
6
|
-
onImageApprove: (id: string, retry: number, image: string) => void;
|
7
|
-
}
|
8
|
-
export declare const Panel: ({ tests, selectedTestId, onChangeTest, onImageApprove }: PanelProps) => JSX.Element;
|
9
|
-
export {};
|
1
|
+
import { TestData } from '../../../types';
|
2
|
+
interface PanelProps {
|
3
|
+
tests: TestData[];
|
4
|
+
selectedTestId: string;
|
5
|
+
onChangeTest: (testId: string) => void;
|
6
|
+
onImageApprove: (id: string, retry: number, image: string) => void;
|
7
|
+
}
|
8
|
+
export declare const Panel: ({ tests, selectedTestId, onChangeTest, onImageApprove }: PanelProps) => JSX.Element;
|
9
|
+
export {};
|