creevey 0.9.4 → 0.9.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/dist/server/config.js +2 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/index.js +28 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/selenium/browser.js +1 -1
- package/dist/server/storybook/connection.d.ts +4 -0
- package/dist/server/storybook/connection.js +35 -0
- package/dist/server/storybook/connection.js.map +1 -0
- package/dist/server/utils.d.ts +2 -0
- package/dist/server/utils.js +29 -2
- package/dist/server/utils.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.js.map +1 -1
- package/docs/config.md +3 -0
- package/package.json +1 -1
- package/src/server/config.ts +1 -0
- package/src/server/index.ts +30 -0
- package/src/server/selenium/browser.ts +1 -1
- package/src/server/storybook/connection.ts +32 -0
- package/src/server/utils.ts +30 -2
- package/src/types.ts +6 -0
package/dist/server/config.js
CHANGED
@@ -79,6 +79,8 @@ async function readConfig(options) {
|
|
79
79
|
userConfig.screenDir = path_1.default.resolve(options.screenDir);
|
80
80
|
if (options.storybookUrl)
|
81
81
|
userConfig.storybookUrl = options.storybookUrl;
|
82
|
+
if (options.storybookAutorunCmd)
|
83
|
+
userConfig.storybookAutorunCmd = options.storybookAutorunCmd;
|
82
84
|
// NOTE: Hack to pass typescript checking
|
83
85
|
const config = userConfig;
|
84
86
|
Object.entries(config.browsers).forEach(([browser, browserConfig]) => (config.browsers[browser] = normalizeBrowserConfig(browser, browserConfig)));
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":";;;;;;AAsDA,
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.js
CHANGED
@@ -7,6 +7,8 @@ exports.default = default_1;
|
|
7
7
|
const cluster_1 = __importDefault(require("cluster"));
|
8
8
|
const config_js_1 = require("./config.js");
|
9
9
|
const logger_js_1 = require("./logger.js");
|
10
|
+
const utils_js_1 = require("./utils.js");
|
11
|
+
const connection_js_1 = require("./storybook/connection.js");
|
10
12
|
// NOTE: Impure function, mutate config by adding gridUrl prop
|
11
13
|
async function startWebdriverServer(config, options) {
|
12
14
|
if (config.useDocker) {
|
@@ -25,6 +27,32 @@ async function default_1(options) {
|
|
25
27
|
!update) {
|
26
28
|
await startWebdriverServer(config, options);
|
27
29
|
}
|
30
|
+
if (cluster_1.default.isPrimary) {
|
31
|
+
const url = await (0, connection_js_1.getStorybookUrl)(config);
|
32
|
+
if (!url) {
|
33
|
+
(0, logger_js_1.logger)().error(`Creevey can't access storybook. Set \`storybookUrl\` or \`resolveStorybookUrl\` in config`);
|
34
|
+
(0, utils_js_1.shutdownWithError)();
|
35
|
+
return;
|
36
|
+
}
|
37
|
+
if (url && config.storybookAutorunCmd) {
|
38
|
+
(0, logger_js_1.logger)().info(`Storybook should be started via \`${config.storybookAutorunCmd}\` and be accessible at ${url}`);
|
39
|
+
(0, logger_js_1.logger)().info('Waiting Storybook...');
|
40
|
+
await (0, connection_js_1.tryAutorunStorybook)(url, config.storybookAutorunCmd);
|
41
|
+
}
|
42
|
+
else {
|
43
|
+
(0, logger_js_1.logger)().info(`Storybook should be started and be accessible at ${url}`);
|
44
|
+
(0, logger_js_1.logger)().info("Tip: you can start Storybook automatically by adding `storybookAutorunCmd` to Creevey's config");
|
45
|
+
(0, logger_js_1.logger)().info('Waiting Storybook...');
|
46
|
+
}
|
47
|
+
const isConnected = await (0, connection_js_1.checkIsStorybookConnected)(url);
|
48
|
+
if (isConnected) {
|
49
|
+
(0, logger_js_1.logger)().info('Storybook connected!\n');
|
50
|
+
}
|
51
|
+
else {
|
52
|
+
(0, logger_js_1.logger)().error('Storybook is not responding. Please start Storybook and restart Creevey');
|
53
|
+
(0, utils_js_1.shutdownWithError)();
|
54
|
+
}
|
55
|
+
}
|
28
56
|
switch (true) {
|
29
57
|
case Boolean(update): {
|
30
58
|
(await import('./update.js')).update(config, typeof update == 'string' ? update : undefined);
|
package/dist/server/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;;;
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;;;AAkBA,4BA8DC;AAhFD,sDAA8B;AAC9B,2CAAyD;AAEzD,2CAAqC;AACrC,yCAA+C;AAC/C,6DAA4G;AAE5G,8DAA8D;AAC9D,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,OAAgB;IAClE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAClF,CAAC,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CACvF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAEc,KAAK,oBAAW,OAAgB;IAC7C,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAU,EAAC,OAAO,CAAC,CAAC;IACzC,MAAM,EAAE,OAAO,GAAG,0BAAc,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEtE,wEAAwE;IACxE,IACE,CAAC,CAAC,MAAM,CAAC,OAAO,IAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAqB,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;QACxG,CAAC,KAAK;QACN,CAAC,MAAM,EACP,CAAC;QACD,MAAM,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,iBAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,MAAM,IAAA,+BAAe,EAAC,MAAM,CAAC,CAAC;QAE1C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAA,kBAAM,GAAE,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;YAC5G,IAAA,4BAAiB,GAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,GAAG,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACtC,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAC,mBAAmB,2BAA2B,GAAG,EAAE,CAAC,CAAC;YAC/G,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACtC,MAAM,IAAA,mCAAmB,EAAC,GAAG,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,oDAAoD,GAAG,EAAE,CAAC,CAAC;YACzE,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,gGAAgG,CAAC,CAAC;YAChH,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAA,yCAAyB,EAAC,GAAG,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE,CAAC;YAChB,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAA,kBAAM,GAAE,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;YAC1F,IAAA,4BAAiB,GAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QACD,KAAK,iBAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACvB,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAEzC,MAAM,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAE1F,OAAO,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;YAEhD,OAAO,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE;gBACvD,GAAG,OAAO;gBACV,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC"}
|
@@ -538,7 +538,7 @@ async function getBrowser(config, options) {
|
|
538
538
|
});
|
539
539
|
try {
|
540
540
|
await (0, utils_js_1.runSequence)([
|
541
|
-
() => browser?.manage().setTimeouts({ pageLoad:
|
541
|
+
() => browser?.manage().setTimeouts({ pageLoad: 60000, script: 60000 }),
|
542
542
|
() => browser && openStorybookPage(browser, realAddress, config.resolveStorybookUrl),
|
543
543
|
() => browser && waitForStorybook(browser),
|
544
544
|
() => browser && resolveCreeveyHost(browser, options.port),
|
@@ -0,0 +1,4 @@
|
|
1
|
+
import { Config } from 'src/types';
|
2
|
+
export declare function getStorybookUrl({ storybookUrl, resolveStorybookUrl }: Config): Promise<string>;
|
3
|
+
export declare function tryAutorunStorybook(url: string, storybookAutorunCmd: string): Promise<void>;
|
4
|
+
export declare function checkIsStorybookConnected(url: string): Promise<boolean>;
|
@@ -0,0 +1,35 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getStorybookUrl = getStorybookUrl;
|
4
|
+
exports.tryAutorunStorybook = tryAutorunStorybook;
|
5
|
+
exports.checkIsStorybookConnected = checkIsStorybookConnected;
|
6
|
+
const utils_1 = require("../utils");
|
7
|
+
const logger_1 = require("../logger");
|
8
|
+
const node_child_process_1 = require("node:child_process");
|
9
|
+
const RESPONSE_FAST_CHECK_TIMEOUT_MS = 3000;
|
10
|
+
const RESPONSE_CHECK_TIMEOUT_MS = 10000;
|
11
|
+
const RESPONSE_CHECK_INTERVAL_MS = 200;
|
12
|
+
async function getStorybookUrl({ storybookUrl, resolveStorybookUrl }) {
|
13
|
+
return resolveStorybookUrl ? resolveStorybookUrl() : storybookUrl;
|
14
|
+
}
|
15
|
+
async function tryAutorunStorybook(url, storybookAutorunCmd) {
|
16
|
+
try {
|
17
|
+
await (0, utils_1.waitOnUrl)(url, RESPONSE_FAST_CHECK_TIMEOUT_MS, RESPONSE_CHECK_INTERVAL_MS);
|
18
|
+
}
|
19
|
+
catch {
|
20
|
+
(0, logger_1.logger)().info(`Trying start Storybook automatically via \`${storybookAutorunCmd}\` from config...`);
|
21
|
+
(0, node_child_process_1.exec)(storybookAutorunCmd);
|
22
|
+
}
|
23
|
+
}
|
24
|
+
async function checkIsStorybookConnected(url) {
|
25
|
+
try {
|
26
|
+
await (0, utils_1.waitOnUrl)(url, RESPONSE_CHECK_TIMEOUT_MS, RESPONSE_CHECK_INTERVAL_MS);
|
27
|
+
return true;
|
28
|
+
}
|
29
|
+
catch (reason) {
|
30
|
+
const error = reason instanceof Error ? (reason.stack ?? reason.message) : reason;
|
31
|
+
(0, logger_1.logger)().error(error);
|
32
|
+
return false;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
//# sourceMappingURL=connection.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/server/storybook/connection.ts"],"names":[],"mappings":";;AASA,0CAEC;AAED,kDAOC;AAED,8DASC;AA9BD,oCAAqC;AACrC,sCAAmC;AACnC,2DAA0C;AAE1C,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAC5C,MAAM,yBAAyB,GAAG,KAAK,CAAC;AACxC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAEhC,KAAK,UAAU,eAAe,CAAC,EAAE,YAAY,EAAE,mBAAmB,EAAU;IACjF,OAAO,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;AACpE,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,GAAW,EAAE,mBAA2B;IAChF,IAAI,CAAC;QACH,MAAM,IAAA,iBAAS,EAAC,GAAG,EAAE,8BAA8B,EAAE,0BAA0B,CAAC,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,IAAA,eAAM,GAAE,CAAC,IAAI,CAAC,8CAA8C,mBAAmB,mBAAmB,CAAC,CAAC;QACpG,IAAA,yBAAI,EAAC,mBAAmB,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,yBAAyB,CAAC,GAAW;IACzD,IAAI,CAAC;QACH,MAAM,IAAA,iBAAS,EAAC,GAAG,EAAE,yBAAyB,EAAE,0BAA0B,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,MAAe,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,MAAiB,CAAC;QAC9F,IAAA,eAAM,GAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/dist/server/utils.d.ts
CHANGED
@@ -16,6 +16,7 @@ export declare function shouldSkipByOption(browser: string, meta: {
|
|
16
16
|
export declare function shutdownWorkers(): Promise<void>;
|
17
17
|
export declare function gracefullyKill(worker: Worker): void;
|
18
18
|
export declare function shutdown(): void;
|
19
|
+
export declare function shutdownWithError(): void;
|
19
20
|
export declare function getCreeveyCache(): string | undefined;
|
20
21
|
export declare function runSequence(seq: (() => unknown)[], predicate: () => boolean): Promise<void>;
|
21
22
|
export declare function testsToImages(tests: (TestData | undefined)[]): Set<string>;
|
@@ -24,3 +25,4 @@ export declare const downloadBinary: (downloadUrl: string, destination: string)
|
|
24
25
|
export declare function readDirRecursive(dirPath: string): string[];
|
25
26
|
export declare function tryToLoadTestsData(filename: string): Partial<Record<string, ServerTest>> | undefined;
|
26
27
|
export declare function loadThroughTSX<T>(callback: (load: (modulePath: string) => Promise<T>) => Promise<T>): Promise<T>;
|
28
|
+
export declare function waitOnUrl(url: string, timeout: number, delay: number): Promise<void>;
|
package/dist/server/utils.js
CHANGED
@@ -9,14 +9,17 @@ exports.shouldSkipByOption = shouldSkipByOption;
|
|
9
9
|
exports.shutdownWorkers = shutdownWorkers;
|
10
10
|
exports.gracefullyKill = gracefullyKill;
|
11
11
|
exports.shutdown = shutdown;
|
12
|
+
exports.shutdownWithError = shutdownWithError;
|
12
13
|
exports.getCreeveyCache = getCreeveyCache;
|
13
14
|
exports.runSequence = runSequence;
|
14
15
|
exports.testsToImages = testsToImages;
|
15
16
|
exports.readDirRecursive = readDirRecursive;
|
16
17
|
exports.tryToLoadTestsData = tryToLoadTestsData;
|
17
18
|
exports.loadThroughTSX = loadThroughTSX;
|
19
|
+
exports.waitOnUrl = waitOnUrl;
|
18
20
|
const fs_1 = __importDefault(require("fs"));
|
19
|
-
const https_1 = require("https");
|
21
|
+
const https_1 = __importDefault(require("https"));
|
22
|
+
const http_1 = __importDefault(require("http"));
|
20
23
|
const cluster_1 = __importDefault(require("cluster"));
|
21
24
|
const path_1 = require("path");
|
22
25
|
const url_1 = require("url");
|
@@ -95,6 +98,9 @@ function gracefullyKill(worker) {
|
|
95
98
|
function shutdown() {
|
96
99
|
process.exit();
|
97
100
|
}
|
101
|
+
function shutdownWithError() {
|
102
|
+
process.exit(1);
|
103
|
+
}
|
98
104
|
function getCreeveyCache() {
|
99
105
|
return (0, find_cache_dir_1.default)({ name: 'creevey', cwd: (0, path_1.dirname)((0, url_1.fileURLToPath)(importMetaUrl)) });
|
100
106
|
}
|
@@ -113,7 +119,7 @@ function testsToImages(tests) {
|
|
113
119
|
}
|
114
120
|
// https://tuhrig.de/how-to-know-you-are-inside-a-docker-container/
|
115
121
|
exports.isInsideDocker = fs_1.default.existsSync('/proc/1/cgroup') && fs_1.default.readFileSync('/proc/1/cgroup', 'utf-8').includes('docker');
|
116
|
-
const downloadBinary = (downloadUrl, destination) => new Promise((resolve, reject) =>
|
122
|
+
const downloadBinary = (downloadUrl, destination) => new Promise((resolve, reject) => https_1.default.get(downloadUrl, (response) => {
|
117
123
|
if (response.statusCode == 302) {
|
118
124
|
const { location } = response.headers;
|
119
125
|
if (!location) {
|
@@ -165,4 +171,25 @@ async function loadThroughTSX(callback) {
|
|
165
171
|
await unregister();
|
166
172
|
return result;
|
167
173
|
}
|
174
|
+
function waitOnUrl(url, timeout, delay) {
|
175
|
+
const startTime = Date.now();
|
176
|
+
return new Promise((resolve, reject) => {
|
177
|
+
const interval = setInterval(() => {
|
178
|
+
http_1.default
|
179
|
+
.get(url, (response) => {
|
180
|
+
if (response.statusCode === 200) {
|
181
|
+
clearInterval(interval);
|
182
|
+
resolve();
|
183
|
+
}
|
184
|
+
})
|
185
|
+
.on('error', () => {
|
186
|
+
// Ignore HTTP errors
|
187
|
+
});
|
188
|
+
if (Date.now() - startTime > timeout) {
|
189
|
+
clearInterval(interval);
|
190
|
+
reject(new Error(`${url} didn't respond within ${timeout / 1000} seconds`));
|
191
|
+
}
|
192
|
+
}, delay);
|
193
|
+
});
|
194
|
+
}
|
168
195
|
//# sourceMappingURL=utils.js.map
|
package/dist/server/utils.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":";;;;;;
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
@@ -127,6 +127,11 @@ export interface Config {
|
|
127
127
|
* Url where storybook hosted on
|
128
128
|
*/
|
129
129
|
resolveStorybookUrl?: () => Promise<string>;
|
130
|
+
/**
|
131
|
+
* Command to automatically start Storybook if it is not running.
|
132
|
+
* For example, `npm run storybook`, `yarn run storybook` etc.
|
133
|
+
*/
|
134
|
+
storybookAutorunCmd?: string;
|
130
135
|
/**
|
131
136
|
* Absolute path to directory with reference images
|
132
137
|
* @default path.join(process.cwd(), './images')
|
@@ -253,6 +258,7 @@ export interface Options {
|
|
253
258
|
screenDir?: string;
|
254
259
|
reportDir?: string;
|
255
260
|
storybookUrl?: string;
|
261
|
+
storybookAutorunCmd?: string;
|
256
262
|
saveReport: boolean;
|
257
263
|
failFast?: boolean;
|
258
264
|
}
|
package/dist/types.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;AAscA,oBAEC;AAED,8BAEC;AAED,wBASC;AAED,4BAEC;AAED,4BAEC;AAGD,gCAEC;AAED,oCAEC;AAED,4CAEC;AAED,0CAEC;AAED,4CAEC;AAED,sCAEC;AAED,4CAEC;AAED,0CAEC;AA1DD,SAAgB,IAAI;IAClB,UAAU;AACZ,CAAC;AAED,SAAgB,SAAS,CAAI,KAA2B;IACtD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AAC/C,CAAC;AAED,SAAgB,MAAM,CAAC,CAA8B;IACnD,OAAO,CACL,SAAS,CAAC,CAAC,CAAC;QACZ,QAAQ,CAAC,CAAC,CAAC;QACX,IAAI,IAAI,CAAC;QACT,SAAS,IAAI,CAAC;QACd,OAAO,CAAC,CAAC,EAAE,IAAI,QAAQ;QACvB,OAAO,CAAC,CAAC,OAAO,IAAI,QAAQ,CAC7B,CAAC;AACJ,CAAC;AAED,SAAgB,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAO,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,SAAgB,QAAQ,CAAC,CAAU;IACjC,OAAO,OAAO,CAAC,IAAI,QAAQ,CAAC;AAC9B,CAAC;AAED,8DAA8D;AAC9D,SAAgB,UAAU,CAAC,CAAU;IACnC,OAAO,OAAO,CAAC,IAAI,UAAU,CAAC;AAChC,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC;AACrD,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC;AACjD,CAAC;AAED,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;AAChE,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;AACjE,CAAC;AAED,SAAgB,aAAa,CAAC,OAAgB;IAC5C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;AAC9D,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;AACjE,CAAC;AAED,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;AAChE,CAAC"}
|
package/docs/config.md
CHANGED
@@ -47,6 +47,9 @@ module.exports = {
|
|
47
47
|
// Default Storybook url
|
48
48
|
storybookUrl: 'http://localhost:6006',
|
49
49
|
|
50
|
+
// Command to automatically start Storybook if it is not running
|
51
|
+
storybookAutorunCmd: 'yarn storybook',
|
52
|
+
|
50
53
|
// Where original images are stored
|
51
54
|
screenDir: path.join(__dirname, '../images'),
|
52
55
|
|
package/package.json
CHANGED
package/src/server/config.ts
CHANGED
@@ -72,6 +72,7 @@ export async function readConfig(options: Options): Promise<Config> {
|
|
72
72
|
if (options.reportDir) userConfig.reportDir = path.resolve(options.reportDir);
|
73
73
|
if (options.screenDir) userConfig.screenDir = path.resolve(options.screenDir);
|
74
74
|
if (options.storybookUrl) userConfig.storybookUrl = options.storybookUrl;
|
75
|
+
if (options.storybookAutorunCmd) userConfig.storybookAutorunCmd = options.storybookAutorunCmd;
|
75
76
|
|
76
77
|
// NOTE: Hack to pass typescript checking
|
77
78
|
const config = userConfig as Config;
|
package/src/server/index.ts
CHANGED
@@ -2,6 +2,8 @@ import cluster from 'cluster';
|
|
2
2
|
import { readConfig, defaultBrowser } from './config.js';
|
3
3
|
import { Options, Config, BrowserConfig } from '../types.js';
|
4
4
|
import { logger } from './logger.js';
|
5
|
+
import { shutdownWithError } from './utils.js';
|
6
|
+
import { getStorybookUrl, tryAutorunStorybook, checkIsStorybookConnected } from './storybook/connection.js';
|
5
7
|
|
6
8
|
// NOTE: Impure function, mutate config by adding gridUrl prop
|
7
9
|
async function startWebdriverServer(config: Config, options: Options): Promise<void> {
|
@@ -27,6 +29,34 @@ export default async function (options: Options): Promise<void> {
|
|
27
29
|
await startWebdriverServer(config, options);
|
28
30
|
}
|
29
31
|
|
32
|
+
if (cluster.isPrimary) {
|
33
|
+
const url = await getStorybookUrl(config);
|
34
|
+
|
35
|
+
if (!url) {
|
36
|
+
logger().error(`Creevey can't access storybook. Set \`storybookUrl\` or \`resolveStorybookUrl\` in config`);
|
37
|
+
shutdownWithError();
|
38
|
+
return;
|
39
|
+
}
|
40
|
+
|
41
|
+
if (url && config.storybookAutorunCmd) {
|
42
|
+
logger().info(`Storybook should be started via \`${config.storybookAutorunCmd}\` and be accessible at ${url}`);
|
43
|
+
logger().info('Waiting Storybook...');
|
44
|
+
await tryAutorunStorybook(url, config.storybookAutorunCmd);
|
45
|
+
} else {
|
46
|
+
logger().info(`Storybook should be started and be accessible at ${url}`);
|
47
|
+
logger().info("Tip: you can start Storybook automatically by adding `storybookAutorunCmd` to Creevey's config");
|
48
|
+
logger().info('Waiting Storybook...');
|
49
|
+
}
|
50
|
+
|
51
|
+
const isConnected = await checkIsStorybookConnected(url);
|
52
|
+
if (isConnected) {
|
53
|
+
logger().info('Storybook connected!\n');
|
54
|
+
} else {
|
55
|
+
logger().error('Storybook is not responding. Please start Storybook and restart Creevey');
|
56
|
+
shutdownWithError();
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
30
60
|
switch (true) {
|
31
61
|
case Boolean(update): {
|
32
62
|
(await import('./update.js')).update(config, typeof update == 'string' ? update : undefined);
|
@@ -698,7 +698,7 @@ export async function getBrowser(config: Config, options: Options & { browser: s
|
|
698
698
|
try {
|
699
699
|
await runSequence(
|
700
700
|
[
|
701
|
-
() => browser?.manage().setTimeouts({ pageLoad:
|
701
|
+
() => browser?.manage().setTimeouts({ pageLoad: 60000, script: 60000 }),
|
702
702
|
() => browser && openStorybookPage(browser, realAddress, config.resolveStorybookUrl),
|
703
703
|
() => browser && waitForStorybook(browser),
|
704
704
|
() => browser && resolveCreeveyHost(browser, options.port),
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import { Config } from 'src/types';
|
2
|
+
import { waitOnUrl } from '../utils';
|
3
|
+
import { logger } from '../logger';
|
4
|
+
import { exec } from 'node:child_process';
|
5
|
+
|
6
|
+
const RESPONSE_FAST_CHECK_TIMEOUT_MS = 3000;
|
7
|
+
const RESPONSE_CHECK_TIMEOUT_MS = 10000;
|
8
|
+
const RESPONSE_CHECK_INTERVAL_MS = 200;
|
9
|
+
|
10
|
+
export async function getStorybookUrl({ storybookUrl, resolveStorybookUrl }: Config) {
|
11
|
+
return resolveStorybookUrl ? resolveStorybookUrl() : storybookUrl;
|
12
|
+
}
|
13
|
+
|
14
|
+
export async function tryAutorunStorybook(url: string, storybookAutorunCmd: string) {
|
15
|
+
try {
|
16
|
+
await waitOnUrl(url, RESPONSE_FAST_CHECK_TIMEOUT_MS, RESPONSE_CHECK_INTERVAL_MS);
|
17
|
+
} catch {
|
18
|
+
logger().info(`Trying start Storybook automatically via \`${storybookAutorunCmd}\` from config...`);
|
19
|
+
exec(storybookAutorunCmd);
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
export async function checkIsStorybookConnected(url: string) {
|
24
|
+
try {
|
25
|
+
await waitOnUrl(url, RESPONSE_CHECK_TIMEOUT_MS, RESPONSE_CHECK_INTERVAL_MS);
|
26
|
+
return true;
|
27
|
+
} catch (reason: unknown) {
|
28
|
+
const error = reason instanceof Error ? (reason.stack ?? reason.message) : (reason as string);
|
29
|
+
logger().error(error);
|
30
|
+
return false;
|
31
|
+
}
|
32
|
+
}
|
package/src/server/utils.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import fs from 'fs';
|
2
|
-
import
|
2
|
+
import https from 'https';
|
3
|
+
import http from 'http';
|
3
4
|
import cluster from 'cluster';
|
4
5
|
import { dirname } from 'path';
|
5
6
|
import { fileURLToPath, pathToFileURL } from 'url';
|
@@ -114,6 +115,10 @@ export function shutdown(): void {
|
|
114
115
|
process.exit();
|
115
116
|
}
|
116
117
|
|
118
|
+
export function shutdownWithError(): void {
|
119
|
+
process.exit(1);
|
120
|
+
}
|
121
|
+
|
117
122
|
export function getCreeveyCache(): string | undefined {
|
118
123
|
return findCacheDir({ name: 'creevey', cwd: dirname(fileURLToPath(importMetaUrl)) });
|
119
124
|
}
|
@@ -147,7 +152,7 @@ export const isInsideDocker =
|
|
147
152
|
|
148
153
|
export const downloadBinary = (downloadUrl: string, destination: string): Promise<void> =>
|
149
154
|
new Promise((resolve, reject) =>
|
150
|
-
get(downloadUrl, (response) => {
|
155
|
+
https.get(downloadUrl, (response) => {
|
151
156
|
if (response.statusCode == 302) {
|
152
157
|
const { location } = response.headers;
|
153
158
|
if (!location) {
|
@@ -215,3 +220,26 @@ export async function loadThroughTSX<T>(
|
|
215
220
|
|
216
221
|
return result;
|
217
222
|
}
|
223
|
+
|
224
|
+
export function waitOnUrl(url: string, timeout: number, delay: number) {
|
225
|
+
const startTime = Date.now();
|
226
|
+
return new Promise<void>((resolve, reject) => {
|
227
|
+
const interval = setInterval(() => {
|
228
|
+
http
|
229
|
+
.get(url, (response) => {
|
230
|
+
if (response.statusCode === 200) {
|
231
|
+
clearInterval(interval);
|
232
|
+
resolve();
|
233
|
+
}
|
234
|
+
})
|
235
|
+
.on('error', () => {
|
236
|
+
// Ignore HTTP errors
|
237
|
+
});
|
238
|
+
|
239
|
+
if (Date.now() - startTime > timeout) {
|
240
|
+
clearInterval(interval);
|
241
|
+
reject(new Error(`${url} didn't respond within ${timeout / 1000} seconds`));
|
242
|
+
}
|
243
|
+
}, delay);
|
244
|
+
});
|
245
|
+
}
|
package/src/types.ts
CHANGED
@@ -146,6 +146,11 @@ export interface Config {
|
|
146
146
|
* Url where storybook hosted on
|
147
147
|
*/
|
148
148
|
resolveStorybookUrl?: () => Promise<string>;
|
149
|
+
/**
|
150
|
+
* Command to automatically start Storybook if it is not running.
|
151
|
+
* For example, `npm run storybook`, `yarn run storybook` etc.
|
152
|
+
*/
|
153
|
+
storybookAutorunCmd?: string;
|
149
154
|
/**
|
150
155
|
* Absolute path to directory with reference images
|
151
156
|
* @default path.join(process.cwd(), './images')
|
@@ -276,6 +281,7 @@ export interface Options {
|
|
276
281
|
screenDir?: string;
|
277
282
|
reportDir?: string;
|
278
283
|
storybookUrl?: string;
|
284
|
+
storybookAutorunCmd?: string;
|
279
285
|
saveReport: boolean;
|
280
286
|
failFast?: boolean;
|
281
287
|
}
|