creevey 0.9.0-beta.13 → 0.9.0-beta.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +1 -0
- package/lib/cjs/cli.js +1 -0
- package/lib/cjs/client/addon/Manager.js +151 -223
- package/lib/cjs/client/addon/components/Addon.js +2 -9
- package/lib/cjs/client/addon/components/Icons.js +1 -7
- package/lib/cjs/client/addon/components/Panel.js +5 -18
- package/lib/cjs/client/addon/components/TestSelect.js +12 -25
- package/lib/cjs/client/addon/components/Tools.js +17 -28
- package/lib/cjs/client/addon/decorator.js +1 -4
- package/lib/cjs/client/addon/index.js +0 -4
- package/lib/cjs/client/addon/preset.js +3 -12
- package/lib/cjs/client/addon/preview.js +1 -4
- package/lib/cjs/client/addon/readyForCapture.js +1 -4
- package/lib/cjs/client/addon/register.js +11 -26
- package/lib/cjs/client/addon/utils.js +1 -9
- package/lib/cjs/client/addon/withCreevey.js +55 -134
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +5 -17
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +8 -24
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +7 -23
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +7 -22
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +5 -17
- package/lib/cjs/client/shared/components/ImagesView/index.js +0 -5
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +1 -8
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +2 -19
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +21 -17
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +5 -24
- package/lib/cjs/client/shared/components/ResultsPage.js +9 -37
- package/lib/cjs/client/shared/creeveyClientApi.js +3 -13
- package/lib/cjs/client/shared/helpers.js +21 -75
- package/lib/cjs/client/shared/viewMode.js +2 -6
- package/lib/cjs/client/web/192.js +1 -0
- package/lib/cjs/client/web/632.js +43 -0
- package/lib/cjs/client/web/794.js +1 -0
- package/lib/cjs/client/web/main.js +78 -1
- package/lib/cjs/client/web/main.js.LICENSE.txt +0 -15
- package/lib/cjs/creevey.js +5 -21
- package/lib/cjs/index.js +0 -15
- package/lib/cjs/server/config.js +13 -33
- package/lib/cjs/server/docker.js +5 -27
- package/lib/cjs/server/index.js +8 -33
- package/lib/cjs/server/logger.js +5 -19
- package/lib/cjs/server/master/api.js +1 -14
- package/lib/cjs/server/master/index.js +15 -46
- package/lib/cjs/server/master/master.js +6 -21
- package/lib/cjs/server/master/pool.js +2 -37
- package/lib/cjs/server/master/runner.js +15 -42
- package/lib/cjs/server/master/server.js +5 -27
- package/lib/cjs/server/messages.js +7 -53
- package/lib/cjs/server/selenium/browser.js +51 -136
- package/lib/cjs/server/selenium/index.js +0 -4
- package/lib/cjs/server/selenium/selenoid.js +7 -33
- package/lib/cjs/server/stories.js +25 -30
- package/lib/cjs/server/storybook/providers/browser.js +5 -18
- package/lib/cjs/server/storybook/providers/hybrid.js +9 -29
- package/lib/cjs/server/testsFiles/parser.js +3 -19
- package/lib/cjs/server/testsFiles/register.js +7 -9
- package/lib/cjs/server/update.js +3 -20
- package/lib/cjs/server/utils.js +9 -41
- package/lib/cjs/server/worker/chai-image.js +1 -27
- package/lib/cjs/server/worker/helpers.js +2 -12
- package/lib/cjs/server/worker/index.js +1 -3
- package/lib/cjs/server/worker/reporter.js +8 -24
- package/lib/cjs/server/worker/worker.js +5 -49
- package/lib/cjs/shared/index.js +22 -36
- package/lib/cjs/shared/serializeRegExp.js +0 -8
- package/lib/cjs/types.js +4 -14
- package/lib/esm/cli.js +1 -1
- package/lib/esm/client/addon/Manager.js +151 -214
- package/lib/esm/client/addon/components/Panel.js +4 -6
- package/lib/esm/client/addon/components/TestSelect.js +11 -17
- package/lib/esm/client/addon/components/Tools.js +15 -14
- package/lib/esm/client/addon/preset.js +2 -8
- package/lib/esm/client/addon/readyForCapture.js +1 -3
- package/lib/esm/client/addon/register.js +6 -8
- package/lib/esm/client/addon/utils.js +0 -5
- package/lib/esm/client/addon/withCreevey.js +54 -116
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +1 -1
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +6 -8
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +3 -4
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +3 -3
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +1 -1
- package/lib/esm/client/shared/components/PageFooter/Paging.js +1 -11
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +18 -7
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +3 -8
- package/lib/esm/client/shared/components/ResultsPage.js +6 -15
- package/lib/esm/client/shared/creeveyClientApi.js +3 -10
- package/lib/esm/client/shared/helpers.js +21 -47
- package/lib/esm/client/web/192.js +1 -0
- package/lib/esm/client/web/632.js +43 -0
- package/lib/esm/client/web/794.js +1 -0
- package/lib/esm/client/web/index.html +19 -0
- package/lib/esm/client/web/main.js +79 -0
- package/lib/esm/client/web/main.js.LICENSE.txt +34 -0
- package/lib/esm/creevey.js +4 -8
- package/lib/esm/index.js +0 -1
- package/lib/esm/server/config.js +7 -14
- package/lib/esm/server/docker.js +4 -12
- package/lib/esm/server/index.js +7 -21
- package/lib/esm/server/logger.js +0 -1
- package/lib/esm/server/master/api.js +0 -9
- package/lib/esm/server/master/index.js +15 -32
- package/lib/esm/server/master/master.js +2 -7
- package/lib/esm/server/master/pool.js +0 -23
- package/lib/esm/server/master/runner.js +14 -27
- package/lib/esm/server/master/server.js +4 -9
- package/lib/esm/server/messages.js +6 -38
- package/lib/esm/server/selenium/browser.js +50 -114
- package/lib/esm/server/selenium/selenoid.js +6 -17
- package/lib/esm/server/stories.js +24 -20
- package/lib/esm/server/storybook/providers/browser.js +4 -8
- package/lib/esm/server/storybook/providers/hybrid.js +6 -14
- package/lib/esm/server/testsFiles/parser.js +0 -6
- package/lib/esm/server/testsFiles/register.js +5 -2
- package/lib/esm/server/update.js +0 -8
- package/lib/esm/server/utils.js +3 -11
- package/lib/esm/server/worker/chai-image.js +0 -21
- package/lib/esm/server/worker/helpers.js +2 -9
- package/lib/esm/server/worker/reporter.js +7 -10
- package/lib/esm/server/worker/worker.js +4 -25
- package/lib/esm/shared/index.js +24 -25
- package/lib/esm/types.js +4 -1
- package/lib/types/client/addon/Manager.d.ts +1 -1
- package/lib/types/client/addon/components/Addon.d.ts +1 -0
- package/lib/types/client/addon/components/Icons.d.ts +1 -0
- package/lib/types/client/addon/components/Panel.d.ts +1 -0
- package/lib/types/client/addon/components/TestSelect.d.ts +1 -0
- package/lib/types/client/addon/components/Tools.d.ts +1 -0
- package/lib/types/client/addon/decorator.d.ts +1 -1
- package/lib/types/client/addon/preset.d.ts +2 -2
- package/lib/types/client/addon/preview.d.ts +1 -1
- package/lib/types/client/addon/withCreevey.d.ts +3 -2
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +1 -0
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -1
- package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +1 -0
- package/lib/types/client/shared/components/PageFooter/Paging.d.ts +1 -0
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +3 -1
- package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +1 -0
- package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
- package/lib/types/client/web/CreeveyApp.d.ts +1 -0
- package/lib/types/client/web/CreeveyLoader.d.ts +2 -1
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +4 -1
- package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
- package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
- package/lib/types/shared/index.d.ts +1 -1
- package/lib/types/types.d.ts +7 -28
- package/package.json +60 -78
- package/lib/cjs/client/addon/preset.ie11.js +0 -74
- package/lib/cjs/client/addon/preset.sb7.js +0 -19
- package/lib/cjs/client/web/142.js +0 -2
- package/lib/cjs/client/web/142.js.LICENSE.txt +0 -12
- package/lib/cjs/client/web/32.js +0 -1
- package/lib/cjs/client/web/551.js +0 -1
- package/lib/cjs/client/web/566.js +0 -2
- package/lib/cjs/client/web/566.js.LICENSE.txt +0 -31
- package/lib/cjs/client/web/691.js +0 -2
- package/lib/cjs/client/web/691.js.LICENSE.txt +0 -8
- package/lib/cjs/client/web/725.js +0 -1
- package/lib/cjs/server/extract.js +0 -46
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -86
- package/lib/cjs/server/loaders/babel/helpers.js +0 -469
- package/lib/cjs/server/loaders/babel/register.js +0 -124
- package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
- package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
- package/lib/cjs/server/loaders/webpack/compile.js +0 -269
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -172
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -39
- package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
- package/lib/cjs/server/loaders/webpack/start.js +0 -41
- package/lib/cjs/server/storybook/entry.js +0 -53
- package/lib/cjs/server/storybook/helpers.js +0 -158
- package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
- package/lib/esm/client/addon/preset.ie11.js +0 -59
- package/lib/esm/client/addon/preset.sb7.js +0 -8
- package/lib/esm/server/extract.js +0 -32
- package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -72
- package/lib/esm/server/loaders/babel/helpers.js +0 -452
- package/lib/esm/server/loaders/babel/register.js +0 -103
- package/lib/esm/server/loaders/hooks/mdx.js +0 -15
- package/lib/esm/server/loaders/hooks/svelte.js +0 -49
- package/lib/esm/server/loaders/webpack/compile.js +0 -246
- package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -152
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -32
- package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
- package/lib/esm/server/loaders/webpack/start.js +0 -27
- package/lib/esm/server/storybook/entry.js +0 -27
- package/lib/esm/server/storybook/helpers.js +0 -97
- package/lib/esm/server/storybook/providers/nodejs.js +0 -216
- package/lib/types/client/addon/preset.ie11.d.ts +0 -10
- package/lib/types/client/addon/preset.sb7.d.ts +0 -2
- package/lib/types/server/extract.d.ts +0 -2
- package/lib/types/server/loaders/babel/creevey-plugin.d.ts +0 -1
- package/lib/types/server/loaders/babel/helpers.d.ts +0 -19
- package/lib/types/server/loaders/babel/register.d.ts +0 -5
- package/lib/types/server/loaders/hooks/mdx.d.ts +0 -1
- package/lib/types/server/loaders/hooks/svelte.d.ts +0 -1
- package/lib/types/server/loaders/webpack/compile.d.ts +0 -2
- package/lib/types/server/loaders/webpack/creevey-loader.d.ts +0 -4
- package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +0 -10
- package/lib/types/server/loaders/webpack/mdx-loader.d.ts +0 -6
- package/lib/types/server/loaders/webpack/start.d.ts +0 -1
- package/lib/types/server/storybook/entry.d.ts +0 -17
- package/lib/types/server/storybook/helpers.d.ts +0 -24
- package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
- package/preset/ie11.js +0 -5
- package/preset/index.js +0 -9
- package/preset/sb7.js +0 -5
- package/types/mdx.d.ts +0 -7
@@ -4,46 +4,32 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = _default;
|
7
|
-
|
8
7
|
var _path = _interopRequireDefault(require("path"));
|
9
|
-
|
10
8
|
var _fs = require("fs");
|
11
|
-
|
12
9
|
var _util = require("util");
|
13
|
-
|
14
10
|
var _master = _interopRequireDefault(require("./master"));
|
15
|
-
|
16
11
|
var _api = _interopRequireDefault(require("./api"));
|
17
|
-
|
18
12
|
var _types = require("../../types");
|
19
|
-
|
20
13
|
var _utils = require("../utils");
|
21
|
-
|
22
14
|
var _messages = require("../messages");
|
23
|
-
|
24
15
|
var _logger = require("../logger");
|
25
|
-
|
26
|
-
|
27
|
-
|
16
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
17
|
+
const writeFileAsync = (0, _util.promisify)(_fs.writeFile);
|
28
18
|
const copyFileAsync = (0, _util.promisify)(_fs.copyFile);
|
29
19
|
const readdirAsync = (0, _util.promisify)(_fs.readdir);
|
30
20
|
const mkdirAsync = (0, _util.promisify)(_fs.mkdir);
|
31
|
-
|
32
21
|
async function copyStatics(reportDir) {
|
33
22
|
const clientDir = _path.default.join(__dirname, '../../client/web');
|
34
|
-
|
35
23
|
const files = (await readdirAsync(clientDir, {
|
36
24
|
withFileTypes: true
|
37
25
|
})).filter(dirent => dirent.isFile() && !dirent.name.endsWith('.d.ts') && !dirent.name.endsWith('.tsx')).map(dirent => dirent.name);
|
38
26
|
await mkdirAsync(reportDir, {
|
39
27
|
recursive: true
|
40
28
|
});
|
41
|
-
|
42
29
|
for (const file of files) {
|
43
30
|
await copyFileAsync(_path.default.join(clientDir, file), _path.default.join(reportDir, file));
|
44
31
|
}
|
45
32
|
}
|
46
|
-
|
47
33
|
function reportDataModule(data) {
|
48
34
|
return `
|
49
35
|
(function (root, factory) {
|
@@ -55,44 +41,34 @@ function reportDataModule(data) {
|
|
55
41
|
}(this, function () { return ${JSON.stringify(data)} }));
|
56
42
|
`;
|
57
43
|
}
|
58
|
-
|
59
44
|
function outputUnnecessaryImages(imagesDir, images) {
|
60
45
|
if (!(0, _fs.existsSync)(imagesDir)) return;
|
61
46
|
const unnecessaryImages = (0, _utils.readDirRecursive)(imagesDir).map(imagePath => _path.default.posix.relative(imagesDir, imagePath)).filter(imagePath => !images.has(imagePath));
|
62
|
-
|
63
47
|
if (unnecessaryImages.length > 0) {
|
64
48
|
_logger.logger.warn('We found unnecessary screenshot images, those can be safely removed:\n', unnecessaryImages.join('\n'));
|
65
49
|
}
|
66
50
|
}
|
67
|
-
|
68
51
|
async function _default(config, options, resolveApi) {
|
69
52
|
let runner = null;
|
70
|
-
|
71
53
|
if (config.hooks.before) {
|
72
54
|
await config.hooks.before();
|
73
55
|
}
|
74
|
-
|
75
56
|
(0, _messages.subscribeOn)('shutdown', () => {
|
76
57
|
var _config$hooks$after, _config$hooks;
|
77
|
-
|
78
58
|
return (_config$hooks$after = (_config$hooks = config.hooks).after) === null || _config$hooks$after === void 0 ? void 0 : _config$hooks$after.call(_config$hooks);
|
79
59
|
});
|
80
60
|
process.removeListener('SIGINT', _utils.shutdown);
|
81
61
|
process.on('SIGINT', () => {
|
82
62
|
var _runner, _runner2;
|
83
|
-
|
84
|
-
(_runner = runner) === null || _runner === void 0 ? void 0 : _runner.removeAllListeners('stop');
|
85
|
-
|
63
|
+
(_runner = runner) === null || _runner === void 0 || _runner.removeAllListeners('stop');
|
86
64
|
if ((_runner2 = runner) !== null && _runner2 !== void 0 && _runner2.isRunning) {
|
87
65
|
var _runner4;
|
88
|
-
|
89
66
|
// TODO Better handle stop
|
90
67
|
void Promise.race([new Promise(resolve => setTimeout(resolve, 10000)), new Promise(resolve => {
|
91
68
|
var _runner3;
|
92
|
-
|
93
69
|
return (_runner3 = runner) === null || _runner3 === void 0 ? void 0 : _runner3.once('stop', resolve);
|
94
70
|
})]).then(() => (0, _utils.shutdownWorkers)());
|
95
|
-
(_runner4 = runner) === null || _runner4 === void 0
|
71
|
+
(_runner4 = runner) === null || _runner4 === void 0 || _runner4.stop();
|
96
72
|
} else {
|
97
73
|
void (0, _utils.shutdownWorkers)();
|
98
74
|
}
|
@@ -102,45 +78,38 @@ async function _default(config, options, resolveApi) {
|
|
102
78
|
debug: options.debug,
|
103
79
|
port: options.port
|
104
80
|
});
|
105
|
-
|
106
81
|
if (options.saveReport) {
|
107
|
-
|
108
|
-
runner.on('stop', () => {
|
82
|
+
runner.on('stop', async () => {
|
109
83
|
var _runner5;
|
110
|
-
|
111
|
-
|
84
|
+
await copyStatics(config.reportDir);
|
85
|
+
await writeFileAsync(_path.default.join(config.reportDir, 'data.js'), reportDataModule((_runner5 = runner) === null || _runner5 === void 0 ? void 0 : _runner5.status.tests));
|
112
86
|
});
|
113
87
|
}
|
114
|
-
|
115
88
|
if (options.ui) {
|
116
89
|
resolveApi((0, _api.default)(runner));
|
117
|
-
|
118
90
|
_logger.logger.info(`Started on http://localhost:${options.port}`);
|
119
91
|
} else {
|
120
92
|
if (Object.values(runner.status.tests).filter(test => test && !test.skip).length == 0) {
|
121
|
-
_logger.logger.warn("Don't have any tests to run");
|
122
|
-
|
123
|
-
|
93
|
+
_logger.logger.warn("Don't have any tests to run");
|
94
|
+
// eslint-disable-next-line no-process-exit
|
124
95
|
void (0, _utils.shutdownWorkers)().then(() => process.exit());
|
125
96
|
return;
|
126
97
|
}
|
127
|
-
|
128
98
|
runner.once('stop', () => {
|
129
99
|
var _runner6;
|
130
|
-
|
131
100
|
const tests = Object.values(((_runner6 = runner) === null || _runner6 === void 0 ? void 0 : _runner6.status.tests) ?? {});
|
132
101
|
const isSuccess = tests.filter(_types.isDefined).filter(({
|
133
102
|
skip
|
134
103
|
}) => !skip).every(({
|
135
104
|
status
|
136
|
-
}) => status == 'success');
|
137
|
-
|
105
|
+
}) => status == 'success');
|
106
|
+
// TODO output summary
|
138
107
|
process.exitCode = isSuccess ? 0 : -1;
|
139
|
-
if (!config.failFast) outputUnnecessaryImages(config.screenDir, (0, _utils.testsToImages)(tests));
|
140
|
-
|
108
|
+
if (!config.failFast) outputUnnecessaryImages(config.screenDir, (0, _utils.testsToImages)(tests));
|
109
|
+
// eslint-disable-next-line no-process-exit
|
141
110
|
void (0, _utils.shutdownWorkers)().then(() => process.exit());
|
142
|
-
});
|
143
|
-
|
111
|
+
});
|
112
|
+
// TODO grep
|
144
113
|
runner.start(Object.keys(runner.status.tests));
|
145
114
|
}
|
146
115
|
}
|
@@ -4,23 +4,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = master;
|
7
|
-
|
8
7
|
var _path = _interopRequireDefault(require("path"));
|
9
|
-
|
10
8
|
var _types = require("../../types");
|
11
|
-
|
12
9
|
var _stories = require("../stories");
|
13
|
-
|
14
10
|
var _runner = _interopRequireDefault(require("./runner"));
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
19
|
-
|
20
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
21
|
-
|
22
|
-
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; }
|
23
|
-
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
24
14
|
function mergeTests(testsWithReports, testsFromStories) {
|
25
15
|
Object.values(testsFromStories).filter(_types.isDefined).forEach(test => {
|
26
16
|
const testWithReport = testsWithReports[test.id];
|
@@ -32,20 +22,15 @@ function mergeTests(testsWithReports, testsFromStories) {
|
|
32
22
|
});
|
33
23
|
return testsFromStories;
|
34
24
|
}
|
35
|
-
|
36
25
|
async function master(config, options) {
|
37
|
-
if (config.useWebpackToExtractTests) await (0, _start.startWebpackCompiler)();
|
38
26
|
const runner = new _runner.default(config);
|
39
|
-
|
40
27
|
const reportDataPath = _path.default.join(config.reportDir, 'data.js');
|
41
|
-
|
42
28
|
let testsFromReport = {};
|
43
|
-
|
44
29
|
try {
|
45
|
-
testsFromReport = await Promise
|
46
|
-
} catch (error) {
|
30
|
+
testsFromReport = await (specifier => new Promise(r => r(`${specifier}`)).then(s => _interopRequireWildcard(require(s))))(reportDataPath);
|
31
|
+
} catch (error) {
|
32
|
+
// Ignore error
|
47
33
|
}
|
48
|
-
|
49
34
|
await runner.init();
|
50
35
|
const tests = await (0, _stories.loadTestsFromStories)(Object.keys(config.browsers), listener => config.storiesProvider(config, options, listener), testsDiff => {
|
51
36
|
runner.updateTests(testsDiff);
|
@@ -4,32 +4,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
|
-
|
8
7
|
var _cluster = _interopRequireWildcard(require("cluster"));
|
9
|
-
|
10
8
|
var _events = require("events");
|
11
|
-
|
12
9
|
var _types = require("../../types");
|
13
|
-
|
14
10
|
var _messages = require("../messages");
|
15
|
-
|
16
11
|
var _utils = require("../utils");
|
17
|
-
|
18
|
-
function
|
19
|
-
|
20
|
-
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; }
|
21
|
-
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
22
14
|
const FORK_RETRIES = 5;
|
23
|
-
|
24
15
|
class Pool extends _events.EventEmitter {
|
25
16
|
workers = [];
|
26
17
|
queue = [];
|
27
18
|
forcedStop = false;
|
28
|
-
|
29
19
|
get isRunning() {
|
30
20
|
return this.workers.length !== this.freeWorkers.length;
|
31
21
|
}
|
32
|
-
|
33
22
|
constructor(config, browser) {
|
34
23
|
super();
|
35
24
|
this.browser = browser;
|
@@ -37,7 +26,6 @@ class Pool extends _events.EventEmitter {
|
|
37
26
|
this.maxRetries = config.maxRetries;
|
38
27
|
this.config = config.browsers[browser];
|
39
28
|
}
|
40
|
-
|
41
29
|
async init() {
|
42
30
|
const poolSize = this.config.limit || 1;
|
43
31
|
this.workers = (await Promise.all(Array.from({
|
@@ -46,7 +34,6 @@ class Pool extends _events.EventEmitter {
|
|
46
34
|
if (this.workers.length != poolSize) throw new Error(`Can't instantiate workers for ${this.browser} due many errors`);
|
47
35
|
this.workers.forEach(worker => this.exitHandler(worker));
|
48
36
|
}
|
49
|
-
|
50
37
|
start(tests) {
|
51
38
|
if (this.isRunning) return false;
|
52
39
|
this.queue = tests.map(({
|
@@ -60,27 +47,22 @@ class Pool extends _events.EventEmitter {
|
|
60
47
|
this.process();
|
61
48
|
return true;
|
62
49
|
}
|
63
|
-
|
64
50
|
stop() {
|
65
51
|
if (!this.isRunning) {
|
66
52
|
this.emit('stop');
|
67
53
|
return;
|
68
54
|
}
|
69
|
-
|
70
55
|
this.forcedStop = true;
|
71
56
|
this.queue = [];
|
72
57
|
}
|
73
|
-
|
74
58
|
process() {
|
75
59
|
const worker = this.getFreeWorker();
|
76
60
|
const [test] = this.queue;
|
77
|
-
|
78
61
|
if (this.queue.length == 0 && this.workers.length === this.freeWorkers.length) {
|
79
62
|
this.forcedStop = false;
|
80
63
|
this.emit('stop');
|
81
64
|
return;
|
82
65
|
}
|
83
|
-
|
84
66
|
if (!worker || !test) return;
|
85
67
|
worker.isRunning = true;
|
86
68
|
const {
|
@@ -98,37 +80,29 @@ class Pool extends _events.EventEmitter {
|
|
98
80
|
});
|
99
81
|
this.process();
|
100
82
|
}
|
101
|
-
|
102
83
|
sendStatus(message) {
|
103
84
|
this.emit('test', message);
|
104
85
|
}
|
105
|
-
|
106
86
|
getFreeWorker() {
|
107
87
|
return this.freeWorkers[Math.floor(Math.random() * this.freeWorkers.length)];
|
108
88
|
}
|
109
|
-
|
110
89
|
get aliveWorkers() {
|
111
90
|
return this.workers.filter(worker => !worker.exitedAfterDisconnect);
|
112
91
|
}
|
113
|
-
|
114
92
|
get freeWorkers() {
|
115
93
|
return this.aliveWorkers.filter(worker => !worker.isRunning);
|
116
94
|
}
|
117
|
-
|
118
95
|
async forkWorker(retry = 0) {
|
119
96
|
_cluster.default.setupMaster({
|
120
97
|
args: ['--browser', this.browser, ...process.argv.slice(2)]
|
121
98
|
});
|
122
|
-
|
123
99
|
const worker = _cluster.default.fork();
|
124
|
-
|
125
100
|
const message = await new Promise(resolve => {
|
126
101
|
const readyHandler = message => {
|
127
102
|
if (!(0, _types.isWorkerMessage)(message)) return;
|
128
103
|
worker.off('message', readyHandler);
|
129
104
|
resolve(message);
|
130
105
|
};
|
131
|
-
|
132
106
|
worker.on('message', readyHandler);
|
133
107
|
});
|
134
108
|
if (message.type != 'error') return worker;
|
@@ -136,7 +110,6 @@ class Pool extends _events.EventEmitter {
|
|
136
110
|
if (retry == FORK_RETRIES) return message.payload;
|
137
111
|
return this.forkWorker(retry + 1);
|
138
112
|
}
|
139
|
-
|
140
113
|
exitHandler(worker) {
|
141
114
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
142
115
|
worker.once('exit', async () => {
|
@@ -148,25 +121,20 @@ class Pool extends _events.EventEmitter {
|
|
148
121
|
this.process();
|
149
122
|
});
|
150
123
|
}
|
151
|
-
|
152
124
|
gracefullyKill(worker) {
|
153
125
|
const timeout = setTimeout(() => worker.kill(), 10000);
|
154
126
|
worker.on('exit', () => clearTimeout(timeout));
|
155
127
|
(0, _messages.sendShutdownMessage)(worker);
|
156
128
|
}
|
157
|
-
|
158
129
|
shouldRetry(test) {
|
159
130
|
return test.retries < this.maxRetries && !this.forcedStop;
|
160
131
|
}
|
161
|
-
|
162
132
|
handleTestResult(worker, test, result) {
|
163
133
|
const shouldRetry = result.status == 'failed' && this.shouldRetry(test);
|
164
|
-
|
165
134
|
if (shouldRetry) {
|
166
135
|
test.retries += 1;
|
167
136
|
this.queue[this.failFast ? 'unshift' : 'push'](test);
|
168
137
|
}
|
169
|
-
|
170
138
|
this.sendStatus({
|
171
139
|
id: test.id,
|
172
140
|
status: shouldRetry ? 'retrying' : result.status,
|
@@ -175,7 +143,6 @@ class Pool extends _events.EventEmitter {
|
|
175
143
|
worker.isRunning = false;
|
176
144
|
setImmediate(() => this.process());
|
177
145
|
}
|
178
|
-
|
179
146
|
subscribe(worker, test) {
|
180
147
|
const subscriptions = [(0, _messages.subscribeOnWorker)(worker, 'worker', message => {
|
181
148
|
if (message.type != 'error') return;
|
@@ -191,7 +158,5 @@ class Pool extends _events.EventEmitter {
|
|
191
158
|
this.handleTestResult(worker, test, message.payload);
|
192
159
|
})];
|
193
160
|
}
|
194
|
-
|
195
161
|
}
|
196
|
-
|
197
162
|
exports.default = Pool;
|
@@ -4,32 +4,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
|
-
|
8
7
|
var _path = _interopRequireDefault(require("path"));
|
9
|
-
|
10
8
|
var _fs = require("fs");
|
11
|
-
|
12
9
|
var _util = require("util");
|
13
|
-
|
14
10
|
var _events = require("events");
|
15
|
-
|
16
11
|
var _types = require("../../types");
|
17
|
-
|
18
12
|
var _pool = _interopRequireDefault(require("./pool"));
|
19
|
-
|
20
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
21
|
-
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
22
14
|
const copyFileAsync = (0, _util.promisify)(_fs.copyFile);
|
23
15
|
const mkdirAsync = (0, _util.promisify)(_fs.mkdir);
|
24
|
-
|
25
16
|
class Runner extends _events.EventEmitter {
|
26
17
|
pools = {};
|
27
18
|
tests = {};
|
28
|
-
|
29
19
|
get isRunning() {
|
30
20
|
return Object.values(this.pools).some(pool => pool.isRunning);
|
31
21
|
}
|
32
|
-
|
33
22
|
constructor(config) {
|
34
23
|
super();
|
35
24
|
this.failFast = config.failFast;
|
@@ -38,7 +27,6 @@ class Runner extends _events.EventEmitter {
|
|
38
27
|
this.browsers = Object.keys(config.browsers);
|
39
28
|
this.browsers.map(browser => this.pools[browser] = new _pool.default(config, browser)).map(pool => pool.on('test', this.handlePoolMessage));
|
40
29
|
}
|
41
|
-
|
42
30
|
handlePoolMessage = message => {
|
43
31
|
const {
|
44
32
|
id,
|
@@ -52,10 +40,9 @@ class Runner extends _events.EventEmitter {
|
|
52
40
|
testName,
|
53
41
|
storyPath,
|
54
42
|
storyId
|
55
|
-
} = test;
|
56
|
-
|
43
|
+
} = test;
|
44
|
+
// TODO Handle 'retrying' status
|
57
45
|
test.status = status == 'retrying' ? 'failed' : status;
|
58
|
-
|
59
46
|
if (!result) {
|
60
47
|
this.sendUpdate({
|
61
48
|
tests: {
|
@@ -71,11 +58,9 @@ class Runner extends _events.EventEmitter {
|
|
71
58
|
});
|
72
59
|
return;
|
73
60
|
}
|
74
|
-
|
75
61
|
if (!test.results) {
|
76
62
|
test.results = [];
|
77
63
|
}
|
78
|
-
|
79
64
|
test.results.push(result);
|
80
65
|
this.sendUpdate({
|
81
66
|
tests: {
|
@@ -100,33 +85,32 @@ class Runner extends _events.EventEmitter {
|
|
100
85
|
this.emit('stop');
|
101
86
|
}
|
102
87
|
};
|
103
|
-
|
104
88
|
async init() {
|
105
89
|
await Promise.all(Object.values(this.pools).map(pool => pool.init()));
|
106
90
|
}
|
107
|
-
|
108
91
|
updateTests(testsDiff) {
|
109
92
|
const tests = {};
|
110
93
|
const removedTests = [];
|
111
94
|
Object.entries(testsDiff).forEach(([id, newTest]) => {
|
112
95
|
const oldTest = this.tests[id];
|
113
|
-
|
114
96
|
if (newTest) {
|
115
97
|
if (oldTest) {
|
116
|
-
this.tests[id] = {
|
98
|
+
this.tests[id] = {
|
99
|
+
...newTest,
|
117
100
|
retries: oldTest.retries,
|
118
101
|
results: oldTest.results,
|
119
102
|
approved: oldTest.approved
|
120
103
|
};
|
121
|
-
} else this.tests[id] = newTest;
|
122
|
-
|
104
|
+
} else this.tests[id] = newTest;
|
123
105
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
124
107
|
const {
|
125
108
|
story,
|
126
109
|
fn,
|
127
110
|
...restTest
|
128
111
|
} = newTest;
|
129
|
-
tests[id] = {
|
112
|
+
tests[id] = {
|
113
|
+
...restTest,
|
130
114
|
status: 'unknown'
|
131
115
|
};
|
132
116
|
} else if (oldTest) {
|
@@ -152,7 +136,6 @@ class Runner extends _events.EventEmitter {
|
|
152
136
|
removedTests
|
153
137
|
});
|
154
138
|
}
|
155
|
-
|
156
139
|
start(ids) {
|
157
140
|
if (this.isRunning) return;
|
158
141
|
const testsToStart = ids.map(id => this.tests[id]).filter(_types.isDefined).filter(test => !test.skip);
|
@@ -165,7 +148,8 @@ class Runner extends _events.EventEmitter {
|
|
165
148
|
browser,
|
166
149
|
testName,
|
167
150
|
storyPath
|
168
|
-
}) => ({
|
151
|
+
}) => ({
|
152
|
+
...update,
|
169
153
|
[id]: {
|
170
154
|
id,
|
171
155
|
browser,
|
@@ -185,7 +169,8 @@ class Runner extends _events.EventEmitter {
|
|
185
169
|
} = test;
|
186
170
|
const restPath = [...storyPath, testName].filter(_types.isDefined);
|
187
171
|
test.status = 'pending';
|
188
|
-
return {
|
172
|
+
return {
|
173
|
+
...tests,
|
189
174
|
[browser]: [...(tests[browser] || []), {
|
190
175
|
id,
|
191
176
|
path: restPath
|
@@ -195,21 +180,19 @@ class Runner extends _events.EventEmitter {
|
|
195
180
|
this.browsers.forEach(browser => {
|
196
181
|
const pool = this.pools[browser];
|
197
182
|
const tests = testsByBrowser[browser];
|
198
|
-
|
199
183
|
if (tests && tests.length > 0 && pool.start(tests)) {
|
200
184
|
pool.once('stop', this.handlePoolStop);
|
201
185
|
}
|
202
186
|
});
|
203
187
|
}
|
204
|
-
|
205
188
|
stop() {
|
206
189
|
if (!this.isRunning) return;
|
207
190
|
this.browsers.forEach(browser => this.pools[browser].stop());
|
208
191
|
}
|
209
|
-
|
210
192
|
get status() {
|
211
193
|
const tests = {};
|
212
|
-
Object.values(this.tests).filter(_types.isDefined)
|
194
|
+
Object.values(this.tests).filter(_types.isDefined)
|
195
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
213
196
|
.forEach(({
|
214
197
|
story,
|
215
198
|
fn,
|
@@ -221,7 +204,6 @@ class Runner extends _events.EventEmitter {
|
|
221
204
|
browsers: this.browsers
|
222
205
|
};
|
223
206
|
}
|
224
|
-
|
225
207
|
async approve({
|
226
208
|
id,
|
227
209
|
retry,
|
@@ -233,24 +215,18 @@ class Runner extends _events.EventEmitter {
|
|
233
215
|
if (!result || !result.images) return;
|
234
216
|
const images = result.images[image];
|
235
217
|
if (!images) return;
|
236
|
-
|
237
218
|
if (!test.approved) {
|
238
219
|
test.approved = {};
|
239
220
|
}
|
240
|
-
|
241
221
|
const {
|
242
222
|
browser,
|
243
223
|
testName,
|
244
224
|
storyPath
|
245
225
|
} = test;
|
246
226
|
const restPath = [...storyPath, testName].filter(_types.isDefined);
|
247
|
-
|
248
227
|
const testPath = _path.default.join(...restPath, image == browser ? '' : browser);
|
249
|
-
|
250
228
|
const srcImagePath = _path.default.join(this.reportDir, testPath, images.actual);
|
251
|
-
|
252
229
|
const dstImagePath = _path.default.join(this.screenDir, testPath, `${image}.png`);
|
253
|
-
|
254
230
|
await mkdirAsync(_path.default.join(this.screenDir, testPath), {
|
255
231
|
recursive: true
|
256
232
|
});
|
@@ -271,11 +247,8 @@ class Runner extends _events.EventEmitter {
|
|
271
247
|
}
|
272
248
|
});
|
273
249
|
}
|
274
|
-
|
275
250
|
sendUpdate(data) {
|
276
251
|
this.emit('update', data);
|
277
252
|
}
|
278
|
-
|
279
253
|
}
|
280
|
-
|
281
254
|
exports.default = Runner;
|
@@ -4,43 +4,26 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = server;
|
7
|
-
|
8
7
|
var _path = _interopRequireDefault(require("path"));
|
9
|
-
|
10
8
|
var _http = _interopRequireDefault(require("http"));
|
11
|
-
|
12
9
|
var _cluster = _interopRequireDefault(require("cluster"));
|
13
|
-
|
14
10
|
var _koa = _interopRequireDefault(require("koa"));
|
15
|
-
|
16
11
|
var _cors = _interopRequireDefault(require("@koa/cors"));
|
17
|
-
|
18
12
|
var _koaStatic = _interopRequireDefault(require("koa-static"));
|
19
|
-
|
20
13
|
var _koaMount = _interopRequireDefault(require("koa-mount"));
|
21
|
-
|
22
14
|
var _koaBodyparser = _interopRequireDefault(require("koa-bodyparser"));
|
23
|
-
|
24
15
|
var _ws = _interopRequireDefault(require("ws"));
|
25
|
-
|
26
16
|
var _messages = require("../messages");
|
27
|
-
|
28
17
|
var _types = require("../../types");
|
29
|
-
|
30
18
|
var _logger = require("../logger");
|
31
|
-
|
32
19
|
var _shared = require("../../shared");
|
33
|
-
|
34
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
35
|
-
|
20
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
36
21
|
function server(reportDir, port, ui) {
|
37
22
|
let resolveApi = _types.noop;
|
38
23
|
let setStoriesCounter = 0;
|
39
24
|
const creeveyApi = new Promise(resolve => resolveApi = resolve);
|
40
25
|
const app = new _koa.default();
|
41
|
-
|
42
26
|
const server = _http.default.createServer(app.callback());
|
43
|
-
|
44
27
|
const wss = new _ws.default.Server({
|
45
28
|
server
|
46
29
|
});
|
@@ -51,17 +34,14 @@ function server(reportDir, port, ui) {
|
|
51
34
|
ctx.body = 'pong';
|
52
35
|
return;
|
53
36
|
}
|
54
|
-
|
55
37
|
await next();
|
56
38
|
});
|
57
|
-
|
58
39
|
if (ui) {
|
59
40
|
app.use(async (_, next) => {
|
60
41
|
await creeveyApi;
|
61
42
|
await next();
|
62
43
|
});
|
63
44
|
}
|
64
|
-
|
65
45
|
app.use(async (ctx, next) => {
|
66
46
|
if (ctx.method == 'POST' && ctx.path == '/stories') {
|
67
47
|
const {
|
@@ -81,7 +61,6 @@ function server(reportDir, port, ui) {
|
|
81
61
|
}));
|
82
62
|
return;
|
83
63
|
}
|
84
|
-
|
85
64
|
await next();
|
86
65
|
});
|
87
66
|
app.use(async (ctx, next) => {
|
@@ -90,8 +69,8 @@ function server(reportDir, port, ui) {
|
|
90
69
|
workerId,
|
91
70
|
options
|
92
71
|
} = ctx.request.body;
|
93
|
-
const worker = Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).find(worker => worker.process.pid == workerId);
|
94
|
-
|
72
|
+
const worker = Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).find(worker => worker.process.pid == workerId);
|
73
|
+
// NOTE: Hypothetical case when someone send to us capture req and we don't have a worker with browser session for it
|
95
74
|
if (!worker) return;
|
96
75
|
await new Promise(resolve => {
|
97
76
|
const unsubscribe = (0, _messages.subscribeOnWorker)(worker, 'stories', message => {
|
@@ -103,12 +82,11 @@ function server(reportDir, port, ui) {
|
|
103
82
|
type: 'capture',
|
104
83
|
payload: options
|
105
84
|
});
|
106
|
-
});
|
107
|
-
|
85
|
+
});
|
86
|
+
// TODO Pass screenshot result to show it in inspector
|
108
87
|
ctx.body = 'Ok';
|
109
88
|
return;
|
110
89
|
}
|
111
|
-
|
112
90
|
await next();
|
113
91
|
});
|
114
92
|
app.use((0, _koaStatic.default)(_path.default.join(__dirname, '../../client/web')));
|