creevey 0.9.0-beta.2 → 0.9.0-beta.20
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/CHANGELOG.md +51 -0
- package/README.md +9 -1
- package/addon/README.md +3 -0
- package/addon/package.json +5 -0
- package/docs/config.md +29 -26
- package/jest.config.js +6 -0
- package/lib/cjs/cli.js +1 -0
- package/lib/cjs/client/addon/Manager.js +170 -390
- package/lib/cjs/client/addon/components/Addon.js +17 -45
- package/lib/cjs/client/addon/components/Icons.js +12 -14
- package/lib/cjs/client/addon/components/Panel.js +21 -30
- package/lib/cjs/client/addon/components/TestSelect.js +20 -31
- package/lib/cjs/client/addon/components/Tools.js +35 -65
- package/lib/cjs/client/addon/decorator.js +1 -4
- package/lib/cjs/client/addon/index.js +27 -0
- package/lib/cjs/client/addon/preset.js +3 -76
- package/lib/cjs/client/addon/preview.js +11 -0
- package/lib/cjs/client/addon/readyForCapture.js +1 -4
- package/lib/cjs/client/addon/register.js +43 -82
- package/lib/cjs/client/addon/utils.js +4 -8
- package/lib/cjs/client/addon/withCreevey.js +145 -404
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +25 -35
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +29 -41
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +46 -83
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +39 -67
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -57
- package/lib/cjs/client/shared/components/ImagesView/index.js +9 -14
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +13 -16
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +16 -37
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +42 -34
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +40 -84
- package/lib/cjs/client/shared/components/ResultsPage.js +42 -99
- package/lib/cjs/client/shared/creeveyClientApi.js +56 -93
- package/lib/cjs/client/shared/helpers.js +149 -274
- package/lib/cjs/client/shared/viewMode.js +5 -9
- 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 +79 -38
- package/lib/cjs/client/web/main.js.LICENSE.txt +34 -0
- package/lib/cjs/creevey.js +15 -30
- package/lib/cjs/index.js +0 -15
- package/lib/cjs/server/config.js +16 -36
- package/lib/cjs/server/docker.js +8 -34
- package/lib/cjs/server/index.js +9 -34
- package/lib/cjs/server/logger.js +7 -20
- package/lib/cjs/server/master/api.js +1 -14
- package/lib/cjs/server/master/index.js +25 -49
- package/lib/cjs/server/master/master.js +6 -21
- package/lib/cjs/server/master/pool.js +10 -53
- package/lib/cjs/server/master/runner.js +65 -105
- package/lib/cjs/server/master/server.js +10 -29
- package/lib/cjs/server/messages.js +14 -62
- package/lib/cjs/server/selenium/browser.js +149 -185
- package/lib/cjs/server/selenium/index.js +0 -4
- package/lib/cjs/server/selenium/selenoid.js +18 -44
- package/lib/cjs/server/stories.js +35 -57
- package/lib/cjs/server/storybook/providers/browser.js +15 -29
- package/lib/cjs/server/storybook/providers/hybrid.js +16 -37
- package/lib/cjs/server/telemetry.js +167 -0
- package/lib/cjs/server/testsFiles/parser.js +3 -19
- package/lib/cjs/server/testsFiles/register.js +8 -14
- package/lib/cjs/server/update.js +4 -25
- package/lib/cjs/server/utils.js +35 -76
- 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 +16 -43
- package/lib/cjs/server/worker/worker.js +32 -72
- package/lib/cjs/shared/index.js +87 -0
- package/lib/cjs/shared/serializeRegExp.js +34 -0
- package/lib/cjs/types.js +11 -20
- package/lib/esm/cli.js +1 -1
- package/lib/esm/client/addon/Manager.js +170 -381
- package/lib/esm/client/addon/components/Addon.js +15 -34
- package/lib/esm/client/addon/components/Icons.js +10 -6
- package/lib/esm/client/addon/components/Panel.js +20 -18
- package/lib/esm/client/addon/components/TestSelect.js +19 -23
- package/lib/esm/client/addon/components/Tools.js +33 -49
- package/lib/esm/client/addon/decorator.js +1 -1
- package/lib/esm/client/addon/index.js +2 -0
- package/lib/esm/client/addon/preset.js +2 -56
- package/lib/esm/client/addon/preview.js +5 -0
- package/lib/esm/client/addon/readyForCapture.js +1 -3
- package/lib/esm/client/addon/register.js +41 -67
- package/lib/esm/client/addon/utils.js +3 -7
- package/lib/esm/client/addon/withCreevey.js +142 -388
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +22 -18
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +27 -25
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +43 -63
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +23 -40
- package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
- package/lib/esm/client/shared/components/PageFooter/Paging.js +15 -29
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +40 -25
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +38 -66
- package/lib/esm/client/shared/components/ResultsPage.js +39 -75
- package/lib/esm/client/shared/creeveyClientApi.js +56 -90
- package/lib/esm/client/shared/helpers.js +133 -230
- package/lib/esm/client/shared/viewMode.js +4 -4
- 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 +13 -16
- package/lib/esm/index.js +1 -4
- package/lib/esm/server/config.js +9 -16
- package/lib/esm/server/docker.js +6 -14
- package/lib/esm/server/index.js +8 -22
- package/lib/esm/server/logger.js +0 -1
- package/lib/esm/server/master/api.js +0 -9
- package/lib/esm/server/master/index.js +25 -35
- package/lib/esm/server/master/master.js +2 -7
- package/lib/esm/server/master/pool.js +8 -41
- package/lib/esm/server/master/runner.js +64 -90
- package/lib/esm/server/master/server.js +9 -11
- package/lib/esm/server/messages.js +8 -42
- package/lib/esm/server/selenium/browser.js +147 -163
- package/lib/esm/server/selenium/selenoid.js +16 -27
- package/lib/esm/server/stories.js +34 -46
- package/lib/esm/server/storybook/providers/browser.js +12 -17
- package/lib/esm/server/storybook/providers/hybrid.js +11 -22
- package/lib/esm/server/telemetry.js +160 -0
- package/lib/esm/server/testsFiles/parser.js +0 -6
- package/lib/esm/server/testsFiles/register.js +6 -7
- package/lib/esm/server/update.js +1 -13
- package/lib/esm/server/utils.js +20 -41
- 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 +15 -29
- package/lib/esm/server/worker/worker.js +31 -48
- package/lib/esm/shared/index.js +77 -0
- package/lib/esm/shared/serializeRegExp.js +24 -0
- package/lib/esm/types.js +5 -1
- package/lib/types/client/addon/Manager.d.ts +3 -3
- 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/Tools.d.ts +1 -0
- package/lib/types/client/addon/decorator.d.ts +1 -1
- package/lib/types/client/addon/index.d.ts +2 -0
- package/lib/types/client/addon/preset.d.ts +2 -24
- package/lib/types/client/addon/preview.d.ts +4 -0
- package/lib/types/client/addon/utils.d.ts +1 -0
- package/lib/types/client/addon/withCreevey.d.ts +4 -3
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
- 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/PageHeader/ImagePreview.d.ts +3 -1
- package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
- package/lib/types/client/web/CreeveyLoader.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +6 -3
- package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
- 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/client/web/KeyboardEventsContext.d.ts +4 -2
- package/lib/types/index.d.ts +4 -1
- package/lib/types/server/logger.d.ts +6 -2
- package/lib/types/server/messages.d.ts +14 -12
- package/lib/types/server/selenium/browser.d.ts +5 -3
- 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/telemetry.d.ts +2 -0
- package/lib/types/server/utils.d.ts +5 -1
- package/lib/types/shared/index.d.ts +7 -0
- package/lib/types/shared/serializeRegExp.d.ts +9 -0
- package/lib/types/types.d.ts +29 -36
- package/package.json +132 -133
- package/types/global.d.ts +5 -0
- package/lib/cjs/client/web/1.js +0 -13
- package/lib/cjs/client/web/2.js +0 -1
- package/lib/cjs/server/extract.js +0 -50
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -88
- package/lib/cjs/server/loaders/babel/helpers.js +0 -479
- package/lib/cjs/server/loaders/babel/register.js +0 -126
- 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 -286
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -174
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -44
- 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 -68
- package/lib/cjs/server/storybook/helpers.js +0 -165
- package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
- package/lib/cjs/shared.js +0 -124
- package/lib/esm/server/extract.js +0 -34
- package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -74
- package/lib/esm/server/loaders/babel/helpers.js +0 -462
- package/lib/esm/server/loaders/babel/register.js +0 -105
- 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 -263
- package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -153
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -36
- 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 -44
- package/lib/esm/server/storybook/helpers.js +0 -106
- package/lib/esm/server/storybook/providers/nodejs.js +0 -217
- package/lib/esm/shared.js +0 -93
- 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 -2
- 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 -18
- package/lib/types/server/storybook/helpers.d.ts +0 -24
- package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
- package/lib/types/shared.d.ts +0 -16
- package/preset.js +0 -9
- package/storybook-static/stories.json +0 -21
- package/types/mdx.d.ts +0 -6
@@ -4,84 +4,46 @@ 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
|
-
|
22
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
23
|
-
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
24
14
|
const copyFileAsync = (0, _util.promisify)(_fs.copyFile);
|
25
15
|
const mkdirAsync = (0, _util.promisify)(_fs.mkdir);
|
26
|
-
|
27
16
|
class Runner extends _events.EventEmitter {
|
17
|
+
pools = {};
|
18
|
+
tests = {};
|
28
19
|
get isRunning() {
|
29
20
|
return Object.values(this.pools).some(pool => pool.isRunning);
|
30
21
|
}
|
31
|
-
|
32
22
|
constructor(config) {
|
33
23
|
super();
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
testName,
|
58
|
-
storyPath,
|
59
|
-
storyId
|
60
|
-
} = test; // TODO Handle 'retrying' status
|
61
|
-
|
62
|
-
test.status = status == 'retrying' ? 'failed' : status;
|
63
|
-
|
64
|
-
if (!result) {
|
65
|
-
this.sendUpdate({
|
66
|
-
tests: {
|
67
|
-
[id]: {
|
68
|
-
id,
|
69
|
-
browser,
|
70
|
-
testName,
|
71
|
-
storyPath,
|
72
|
-
status: test.status,
|
73
|
-
storyId
|
74
|
-
}
|
75
|
-
}
|
76
|
-
});
|
77
|
-
return;
|
78
|
-
}
|
79
|
-
|
80
|
-
if (!test.results) {
|
81
|
-
test.results = [];
|
82
|
-
}
|
83
|
-
|
84
|
-
test.results.push(result);
|
24
|
+
this.failFast = config.failFast;
|
25
|
+
this.screenDir = config.screenDir;
|
26
|
+
this.reportDir = config.reportDir;
|
27
|
+
this.browsers = Object.keys(config.browsers);
|
28
|
+
this.browsers.map(browser => this.pools[browser] = new _pool.default(config, browser)).map(pool => pool.on('test', this.handlePoolMessage));
|
29
|
+
}
|
30
|
+
handlePoolMessage = message => {
|
31
|
+
const {
|
32
|
+
id,
|
33
|
+
status,
|
34
|
+
result
|
35
|
+
} = message;
|
36
|
+
const test = this.tests[id];
|
37
|
+
if (!test) return;
|
38
|
+
const {
|
39
|
+
browser,
|
40
|
+
testName,
|
41
|
+
storyPath,
|
42
|
+
storyId
|
43
|
+
} = test;
|
44
|
+
// TODO Handle 'retrying' status
|
45
|
+
test.status = status == 'retrying' ? 'failed' : status;
|
46
|
+
if (!result) {
|
85
47
|
this.sendUpdate({
|
86
48
|
tests: {
|
87
49
|
[id]: {
|
@@ -90,56 +52,65 @@ class Runner extends _events.EventEmitter {
|
|
90
52
|
testName,
|
91
53
|
storyPath,
|
92
54
|
status: test.status,
|
93
|
-
results: [result],
|
94
55
|
storyId
|
95
56
|
}
|
96
57
|
}
|
97
58
|
});
|
98
|
-
|
99
|
-
}
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
59
|
+
return;
|
60
|
+
}
|
61
|
+
if (!test.results) {
|
62
|
+
test.results = [];
|
63
|
+
}
|
64
|
+
test.results.push(result);
|
65
|
+
this.sendUpdate({
|
66
|
+
tests: {
|
67
|
+
[id]: {
|
68
|
+
id,
|
69
|
+
browser,
|
70
|
+
testName,
|
71
|
+
storyPath,
|
72
|
+
status: test.status,
|
73
|
+
results: [result],
|
74
|
+
storyId
|
75
|
+
}
|
107
76
|
}
|
108
77
|
});
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
this.
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
78
|
+
if (this.failFast && status == 'failed') this.stop();
|
79
|
+
};
|
80
|
+
handlePoolStop = () => {
|
81
|
+
if (!this.isRunning) {
|
82
|
+
this.sendUpdate({
|
83
|
+
isRunning: false
|
84
|
+
});
|
85
|
+
this.emit('stop');
|
86
|
+
}
|
87
|
+
};
|
117
88
|
async init() {
|
118
89
|
await Promise.all(Object.values(this.pools).map(pool => pool.init()));
|
119
90
|
}
|
120
|
-
|
121
91
|
updateTests(testsDiff) {
|
122
92
|
const tests = {};
|
123
93
|
const removedTests = [];
|
124
94
|
Object.entries(testsDiff).forEach(([id, newTest]) => {
|
125
95
|
const oldTest = this.tests[id];
|
126
|
-
|
127
96
|
if (newTest) {
|
128
97
|
if (oldTest) {
|
129
|
-
this.tests[id] = {
|
98
|
+
this.tests[id] = {
|
99
|
+
...newTest,
|
130
100
|
retries: oldTest.retries,
|
131
101
|
results: oldTest.results,
|
132
102
|
approved: oldTest.approved
|
133
103
|
};
|
134
|
-
} else this.tests[id] = newTest;
|
135
|
-
|
104
|
+
} else this.tests[id] = newTest;
|
136
105
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
137
107
|
const {
|
138
108
|
story,
|
139
109
|
fn,
|
140
110
|
...restTest
|
141
111
|
} = newTest;
|
142
|
-
tests[id] = {
|
112
|
+
tests[id] = {
|
113
|
+
...restTest,
|
143
114
|
status: 'unknown'
|
144
115
|
};
|
145
116
|
} else if (oldTest) {
|
@@ -165,7 +136,6 @@ class Runner extends _events.EventEmitter {
|
|
165
136
|
removedTests
|
166
137
|
});
|
167
138
|
}
|
168
|
-
|
169
139
|
start(ids) {
|
170
140
|
if (this.isRunning) return;
|
171
141
|
const testsToStart = ids.map(id => this.tests[id]).filter(_types.isDefined).filter(test => !test.skip);
|
@@ -178,7 +148,8 @@ class Runner extends _events.EventEmitter {
|
|
178
148
|
browser,
|
179
149
|
testName,
|
180
150
|
storyPath
|
181
|
-
}) => ({
|
151
|
+
}) => ({
|
152
|
+
...update,
|
182
153
|
[id]: {
|
183
154
|
id,
|
184
155
|
browser,
|
@@ -198,7 +169,8 @@ class Runner extends _events.EventEmitter {
|
|
198
169
|
} = test;
|
199
170
|
const restPath = [...storyPath, testName].filter(_types.isDefined);
|
200
171
|
test.status = 'pending';
|
201
|
-
return {
|
172
|
+
return {
|
173
|
+
...tests,
|
202
174
|
[browser]: [...(tests[browser] || []), {
|
203
175
|
id,
|
204
176
|
path: restPath
|
@@ -208,21 +180,19 @@ class Runner extends _events.EventEmitter {
|
|
208
180
|
this.browsers.forEach(browser => {
|
209
181
|
const pool = this.pools[browser];
|
210
182
|
const tests = testsByBrowser[browser];
|
211
|
-
|
212
183
|
if (tests && tests.length > 0 && pool.start(tests)) {
|
213
184
|
pool.once('stop', this.handlePoolStop);
|
214
185
|
}
|
215
186
|
});
|
216
187
|
}
|
217
|
-
|
218
188
|
stop() {
|
219
189
|
if (!this.isRunning) return;
|
220
190
|
this.browsers.forEach(browser => this.pools[browser].stop());
|
221
191
|
}
|
222
|
-
|
223
192
|
get status() {
|
224
193
|
const tests = {};
|
225
|
-
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
|
226
196
|
.forEach(({
|
227
197
|
story,
|
228
198
|
fn,
|
@@ -234,7 +204,6 @@ class Runner extends _events.EventEmitter {
|
|
234
204
|
browsers: this.browsers
|
235
205
|
};
|
236
206
|
}
|
237
|
-
|
238
207
|
async approve({
|
239
208
|
id,
|
240
209
|
retry,
|
@@ -246,24 +215,18 @@ class Runner extends _events.EventEmitter {
|
|
246
215
|
if (!result || !result.images) return;
|
247
216
|
const images = result.images[image];
|
248
217
|
if (!images) return;
|
249
|
-
|
250
218
|
if (!test.approved) {
|
251
219
|
test.approved = {};
|
252
220
|
}
|
253
|
-
|
254
221
|
const {
|
255
222
|
browser,
|
256
223
|
testName,
|
257
224
|
storyPath
|
258
225
|
} = test;
|
259
226
|
const restPath = [...storyPath, testName].filter(_types.isDefined);
|
260
|
-
|
261
227
|
const testPath = _path.default.join(...restPath, image == browser ? '' : browser);
|
262
|
-
|
263
228
|
const srcImagePath = _path.default.join(this.reportDir, testPath, images.actual);
|
264
|
-
|
265
229
|
const dstImagePath = _path.default.join(this.screenDir, testPath, `${image}.png`);
|
266
|
-
|
267
230
|
await mkdirAsync(_path.default.join(this.screenDir, testPath), {
|
268
231
|
recursive: true
|
269
232
|
});
|
@@ -284,11 +247,8 @@ class Runner extends _events.EventEmitter {
|
|
284
247
|
}
|
285
248
|
});
|
286
249
|
}
|
287
|
-
|
288
250
|
sendUpdate(data) {
|
289
251
|
this.emit('update', data);
|
290
252
|
}
|
291
|
-
|
292
253
|
}
|
293
|
-
|
294
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 {
|
@@ -75,13 +55,12 @@ function server(reportDir, port, ui) {
|
|
75
55
|
type: 'update',
|
76
56
|
payload: deserializedStories
|
77
57
|
});
|
78
|
-
Object.values(_cluster.default.workers).filter(_types.isDefined).filter(worker => worker.isConnected()).forEach(worker => (0, _messages.sendStoriesMessage)(worker, {
|
58
|
+
Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).filter(worker => worker.isConnected()).forEach(worker => (0, _messages.sendStoriesMessage)(worker, {
|
79
59
|
type: 'update',
|
80
60
|
payload: deserializedStories
|
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')));
|
@@ -118,11 +96,14 @@ function server(reportDir, port, ui) {
|
|
118
96
|
(0, _messages.subscribeOn)('shutdown', () => {
|
119
97
|
server.close();
|
120
98
|
wss.close();
|
99
|
+
wss.clients.forEach(ws => ws.close());
|
121
100
|
});
|
122
101
|
void creeveyApi.then(api => {
|
123
102
|
api.subscribe(wss);
|
124
103
|
wss.on('connection', ws => {
|
125
|
-
ws.on('message', message =>
|
104
|
+
ws.on('message', (message, isBinary) => {
|
105
|
+
api.handleMessage(ws, isBinary ? message : message.toString());
|
106
|
+
});
|
126
107
|
});
|
127
108
|
});
|
128
109
|
return resolveApi;
|
@@ -3,72 +3,62 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.
|
6
|
+
exports.emitDockerMessage = emitDockerMessage;
|
7
|
+
exports.emitShutdownMessage = emitShutdownMessage;
|
7
8
|
exports.emitStoriesMessage = emitStoriesMessage;
|
8
9
|
exports.emitTestMessage = emitTestMessage;
|
9
10
|
exports.emitWebpackMessage = emitWebpackMessage;
|
10
|
-
exports.
|
11
|
-
exports.emitShutdownMessage = emitShutdownMessage;
|
12
|
-
exports.sendStoriesMessage = sendStoriesMessage;
|
13
|
-
exports.sendTestMessage = sendTestMessage;
|
11
|
+
exports.emitWorkerMessage = emitWorkerMessage;
|
14
12
|
exports.sendDockerMessage = sendDockerMessage;
|
15
13
|
exports.sendShutdownMessage = sendShutdownMessage;
|
14
|
+
exports.sendStoriesMessage = sendStoriesMessage;
|
15
|
+
exports.sendTestMessage = sendTestMessage;
|
16
16
|
exports.subscribeOn = subscribeOn;
|
17
17
|
exports.subscribeOnWorker = subscribeOnWorker;
|
18
|
-
|
19
18
|
var _cluster = _interopRequireDefault(require("cluster"));
|
20
|
-
|
21
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
22
|
-
|
19
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
23
20
|
function emitMessage(message) {
|
24
|
-
var _process$send, _process
|
25
|
-
|
21
|
+
var _process$send, _process;
|
26
22
|
if (_cluster.default.isWorker && !process.connected) return false;
|
27
|
-
return (_process$send = (_process
|
23
|
+
return ((_process$send = (_process = process).send) === null || _process$send === void 0 ? void 0 : _process$send.call(_process, message)) ??
|
24
|
+
// @ts-expect-error: wrong typings `process.emit` return boolean
|
28
25
|
process.emit('message', message);
|
29
26
|
}
|
30
|
-
|
31
27
|
function emitWorkerMessage(message) {
|
32
28
|
return emitMessage({
|
33
29
|
scope: 'worker',
|
34
30
|
...message
|
35
31
|
});
|
36
32
|
}
|
37
|
-
|
38
33
|
function emitStoriesMessage(message) {
|
39
34
|
return emitMessage({
|
40
35
|
scope: 'stories',
|
41
36
|
...message
|
42
37
|
});
|
43
38
|
}
|
44
|
-
|
45
39
|
function emitTestMessage(message) {
|
46
40
|
return emitMessage({
|
47
41
|
scope: 'test',
|
48
42
|
...message
|
49
43
|
});
|
50
44
|
}
|
51
|
-
|
52
45
|
function emitWebpackMessage(message) {
|
53
46
|
return emitMessage({
|
54
47
|
scope: 'webpack',
|
55
48
|
...message
|
56
49
|
});
|
57
50
|
}
|
58
|
-
|
59
51
|
function emitDockerMessage(message) {
|
60
52
|
return emitMessage({
|
61
53
|
scope: 'docker',
|
62
54
|
...message
|
63
55
|
});
|
64
56
|
}
|
65
|
-
|
66
57
|
function emitShutdownMessage() {
|
67
58
|
return emitMessage({
|
68
59
|
scope: 'shutdown'
|
69
60
|
});
|
70
61
|
}
|
71
|
-
|
72
62
|
function createHandlers() {
|
73
63
|
return Object.assign(Object.create(null), {
|
74
64
|
worker: new Set(),
|
@@ -79,68 +69,51 @@ function createHandlers() {
|
|
79
69
|
shutdown: new Set()
|
80
70
|
});
|
81
71
|
}
|
82
|
-
|
83
72
|
const handlers = createHandlers();
|
84
|
-
|
85
73
|
const handler = message => {
|
86
74
|
switch (message.scope) {
|
87
75
|
case 'worker':
|
88
76
|
return handlers.worker.forEach(h => h(message));
|
89
|
-
|
90
77
|
case 'stories':
|
91
78
|
return handlers.stories.forEach(h => h(message));
|
92
|
-
|
93
79
|
case 'test':
|
94
80
|
return handlers.test.forEach(h => h(message));
|
95
|
-
|
96
81
|
case 'webpack':
|
97
82
|
return handlers.webpack.forEach(h => h(message));
|
98
|
-
|
99
83
|
case 'docker':
|
100
84
|
return handlers.docker.forEach(h => h(message));
|
101
|
-
|
102
85
|
case 'shutdown':
|
103
86
|
return handlers.shutdown.forEach(h => h(message));
|
104
87
|
}
|
105
88
|
};
|
106
|
-
|
107
89
|
process.on('message', handler);
|
108
|
-
|
109
90
|
function sendStoriesMessage(target, message) {
|
110
91
|
var _target$send;
|
111
|
-
|
112
|
-
(_target$send = target.send) === null || _target$send === void 0 ? void 0 : _target$send.call(target, {
|
92
|
+
(_target$send = target.send) === null || _target$send === void 0 || _target$send.call(target, {
|
113
93
|
scope: 'stories',
|
114
94
|
...message
|
115
95
|
});
|
116
96
|
}
|
117
|
-
|
118
97
|
function sendTestMessage(target, message) {
|
119
98
|
var _target$send2;
|
120
|
-
|
121
|
-
(_target$send2 = target.send) === null || _target$send2 === void 0 ? void 0 : _target$send2.call(target, {
|
99
|
+
(_target$send2 = target.send) === null || _target$send2 === void 0 || _target$send2.call(target, {
|
122
100
|
scope: 'test',
|
123
101
|
...message
|
124
102
|
});
|
125
103
|
}
|
126
|
-
|
127
104
|
function sendDockerMessage(target, message) {
|
128
105
|
var _target$send3;
|
129
|
-
|
130
|
-
(_target$send3 = target.send) === null || _target$send3 === void 0 ? void 0 : _target$send3.call(target, {
|
106
|
+
(_target$send3 = target.send) === null || _target$send3 === void 0 || _target$send3.call(target, {
|
131
107
|
scope: 'docker',
|
132
108
|
...message
|
133
109
|
});
|
134
110
|
}
|
135
|
-
|
136
111
|
function sendShutdownMessage(target) {
|
137
112
|
var _target$send4;
|
138
|
-
|
139
|
-
(_target$send4 = target.send) === null || _target$send4 === void 0 ? void 0 : _target$send4.call(target, {
|
113
|
+
(_target$send4 = target.send) === null || _target$send4 === void 0 || _target$send4.call(target, {
|
140
114
|
scope: 'shutdown'
|
141
115
|
});
|
142
116
|
}
|
143
|
-
|
144
117
|
function subscribeOn(scope, handler) {
|
145
118
|
switch (scope) {
|
146
119
|
case 'worker':
|
@@ -149,35 +122,30 @@ function subscribeOn(scope, handler) {
|
|
149
122
|
handlers.worker.add(workerHandler);
|
150
123
|
return () => handlers.worker.delete(workerHandler);
|
151
124
|
}
|
152
|
-
|
153
125
|
case 'stories':
|
154
126
|
{
|
155
127
|
const storiesHandler = handler;
|
156
128
|
handlers.stories.add(storiesHandler);
|
157
129
|
return () => handlers.stories.delete(storiesHandler);
|
158
130
|
}
|
159
|
-
|
160
131
|
case 'test':
|
161
132
|
{
|
162
133
|
const testHandler = handler;
|
163
134
|
handlers.test.add(testHandler);
|
164
135
|
return () => handlers.test.delete(testHandler);
|
165
136
|
}
|
166
|
-
|
167
137
|
case 'webpack':
|
168
138
|
{
|
169
139
|
const webpackHandler = handler;
|
170
140
|
handlers.webpack.add(webpackHandler);
|
171
141
|
return () => handlers.webpack.delete(webpackHandler);
|
172
142
|
}
|
173
|
-
|
174
143
|
case 'docker':
|
175
144
|
{
|
176
145
|
const dockerHandler = handler;
|
177
146
|
handlers.docker.add(dockerHandler);
|
178
147
|
return () => handlers.docker.delete(dockerHandler);
|
179
148
|
}
|
180
|
-
|
181
149
|
case 'shutdown':
|
182
150
|
{
|
183
151
|
const shutdownHandler = handler;
|
@@ -186,14 +154,9 @@ function subscribeOn(scope, handler) {
|
|
186
154
|
}
|
187
155
|
}
|
188
156
|
}
|
189
|
-
|
190
157
|
const workers = new Map();
|
191
|
-
|
192
158
|
function subscribeOnWorker(worker, scope, handler) {
|
193
|
-
|
194
|
-
|
195
|
-
const workerHandlers = (_workers$get = workers.get(worker)) !== null && _workers$get !== void 0 ? _workers$get : createHandlers();
|
196
|
-
|
159
|
+
const workerHandlers = workers.get(worker) ?? createHandlers();
|
197
160
|
if (!workers.has(worker)) {
|
198
161
|
workers.set(worker, workerHandlers);
|
199
162
|
worker.once('exit', () => workers.delete(worker));
|
@@ -201,25 +164,19 @@ function subscribeOnWorker(worker, scope, handler) {
|
|
201
164
|
switch (message.scope) {
|
202
165
|
case 'worker':
|
203
166
|
return workerHandlers.worker.forEach(h => h(message));
|
204
|
-
|
205
167
|
case 'stories':
|
206
168
|
return workerHandlers.stories.forEach(h => h(message));
|
207
|
-
|
208
169
|
case 'test':
|
209
170
|
return workerHandlers.test.forEach(h => h(message));
|
210
|
-
|
211
171
|
case 'webpack':
|
212
172
|
return workerHandlers.webpack.forEach(h => h(message));
|
213
|
-
|
214
173
|
case 'docker':
|
215
174
|
return workerHandlers.docker.forEach(h => h(message));
|
216
|
-
|
217
175
|
case 'shutdown':
|
218
176
|
return workerHandlers.shutdown.forEach(h => h(message));
|
219
177
|
}
|
220
178
|
});
|
221
179
|
}
|
222
|
-
|
223
180
|
switch (scope) {
|
224
181
|
case 'worker':
|
225
182
|
{
|
@@ -227,35 +184,30 @@ function subscribeOnWorker(worker, scope, handler) {
|
|
227
184
|
workerHandlers.worker.add(workerHandler);
|
228
185
|
return () => workerHandlers.worker.delete(workerHandler);
|
229
186
|
}
|
230
|
-
|
231
187
|
case 'stories':
|
232
188
|
{
|
233
189
|
const storiesHandler = handler;
|
234
190
|
workerHandlers.stories.add(storiesHandler);
|
235
191
|
return () => workerHandlers.stories.delete(storiesHandler);
|
236
192
|
}
|
237
|
-
|
238
193
|
case 'test':
|
239
194
|
{
|
240
195
|
const testHandler = handler;
|
241
196
|
workerHandlers.test.add(testHandler);
|
242
197
|
return () => workerHandlers.test.delete(testHandler);
|
243
198
|
}
|
244
|
-
|
245
199
|
case 'webpack':
|
246
200
|
{
|
247
201
|
const webpackHandler = handler;
|
248
202
|
workerHandlers.webpack.add(webpackHandler);
|
249
203
|
return () => workerHandlers.webpack.delete(webpackHandler);
|
250
204
|
}
|
251
|
-
|
252
205
|
case 'docker':
|
253
206
|
{
|
254
207
|
const dockerHandler = handler;
|
255
208
|
workerHandlers.docker.add(dockerHandler);
|
256
209
|
return () => workerHandlers.docker.delete(dockerHandler);
|
257
210
|
}
|
258
|
-
|
259
211
|
case 'shutdown':
|
260
212
|
{
|
261
213
|
const shutdownHandler = handler;
|