creevey 0.10.0-beta.43 → 0.10.0-beta.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +282 -0
- package/dist/client/addon/controller.js +1 -1
- package/dist/client/addon/controller.js.map +1 -1
- package/dist/client/addon/withCreevey.js +1 -18
- package/dist/client/addon/withCreevey.js.map +1 -1
- package/dist/client/shared/components/PageHeader/PageHeader.js +13 -4
- package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/client/shared/creeveyClientApi.js +10 -0
- package/dist/client/shared/creeveyClientApi.js.map +1 -1
- package/dist/client/web/CreeveyApp.d.ts +1 -0
- package/dist/client/web/CreeveyApp.js +1 -0
- package/dist/client/web/CreeveyApp.js.map +1 -1
- package/dist/client/web/CreeveyContext.d.ts +1 -0
- package/dist/client/web/CreeveyContext.js +1 -0
- package/dist/client/web/CreeveyContext.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +9 -8
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +13 -3
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +2 -3
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestLink.js +2 -3
- package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +1 -0
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
- package/dist/client/web/assets/{index-C47njyZV.js → index-BU4jjKVC.js} +68 -68
- package/dist/client/web/index.html +1 -1
- package/dist/client/web/index.js +8 -3
- package/dist/client/web/index.js.map +1 -1
- package/dist/creevey.d.ts +1 -1
- package/dist/creevey.js +1 -22
- package/dist/creevey.js.map +1 -1
- package/dist/playwright-reporter.d.ts +2 -0
- package/dist/playwright-reporter.js +5 -0
- package/dist/playwright-reporter.js.map +1 -0
- package/dist/playwright.d.ts +1 -1
- package/dist/server/config.js +8 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/index.js +12 -5
- package/dist/server/index.js.map +1 -1
- package/dist/server/master/api.d.ts +11 -6
- package/dist/server/master/api.js +88 -25
- package/dist/server/master/api.js.map +1 -1
- package/dist/server/master/handlers/capture-handler.d.ts +5 -0
- package/dist/server/master/handlers/capture-handler.js +25 -0
- package/dist/server/master/handlers/capture-handler.js.map +1 -0
- package/dist/server/master/handlers/index.d.ts +4 -0
- package/dist/server/master/handlers/index.js +21 -0
- package/dist/server/master/handlers/index.js.map +1 -0
- package/dist/server/master/handlers/ping-handler.d.ts +2 -0
- package/dist/server/master/handlers/ping-handler.js +8 -0
- package/dist/server/master/handlers/ping-handler.js.map +1 -0
- package/dist/server/master/handlers/static-handler.d.ts +1 -0
- package/dist/server/master/handlers/static-handler.js +22 -0
- package/dist/server/master/handlers/static-handler.js.map +1 -0
- package/dist/server/master/handlers/stories-handler.d.ts +4 -0
- package/dist/server/master/handlers/stories-handler.js +24 -0
- package/dist/server/master/handlers/stories-handler.js.map +1 -0
- package/dist/server/master/master.js +7 -24
- package/dist/server/master/master.js.map +1 -1
- package/dist/server/master/runner.d.ts +4 -6
- package/dist/server/master/runner.js +30 -127
- package/dist/server/master/runner.js.map +1 -1
- package/dist/server/master/server.js +191 -89
- package/dist/server/master/server.js.map +1 -1
- package/dist/server/master/start.d.ts +1 -2
- package/dist/server/master/start.js +11 -29
- package/dist/server/master/start.js.map +1 -1
- package/dist/server/master/testsManager.d.ts +81 -0
- package/dist/server/master/testsManager.js +281 -0
- package/dist/server/master/testsManager.js.map +1 -0
- package/dist/server/playwright/docker-file.js +2 -2
- package/dist/server/playwright/docker-file.js.map +1 -1
- package/dist/server/playwright/reporter.d.ts +87 -0
- package/dist/server/playwright/reporter.js +351 -0
- package/dist/server/playwright/reporter.js.map +1 -0
- package/dist/server/selenium/internal.js +20 -2
- package/dist/server/selenium/internal.js.map +1 -1
- package/dist/server/selenium/selenoid.js +4 -0
- package/dist/server/selenium/selenoid.js.map +1 -1
- package/dist/server/shutdown.d.ts +1 -0
- package/dist/server/shutdown.js +23 -0
- package/dist/server/shutdown.js.map +1 -0
- package/dist/server/stories.d.ts +0 -1
- package/dist/server/stories.js +0 -12
- package/dist/server/stories.js.map +1 -1
- package/dist/server/ui-update.d.ts +10 -0
- package/dist/server/ui-update.js +39 -0
- package/dist/server/ui-update.js.map +1 -0
- package/dist/server/utils.d.ts +6 -0
- package/dist/server/utils.js +39 -8
- package/dist/server/utils.js.map +1 -1
- package/dist/server/worker/start.js +1 -1
- package/dist/server/worker/start.js.map +1 -1
- package/dist/types.d.ts +14 -8
- package/dist/types.js.map +1 -1
- package/docs/examples/playwright-reporter-example.ts +202 -0
- package/docs/migration-0.9-to-0.10.md +144 -0
- package/docs/playwright-reporter.md +357 -0
- package/package.json +10 -14
- package/src/client/addon/controller.ts +1 -1
- package/src/client/addon/withCreevey.ts +2 -16
- package/src/client/shared/components/PageHeader/PageHeader.tsx +18 -4
- package/src/client/shared/creeveyClientApi.ts +10 -0
- package/src/client/web/CreeveyApp.tsx +2 -0
- package/src/client/web/CreeveyContext.tsx +2 -0
- package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +19 -17
- package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +18 -3
- package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +9 -7
- package/src/client/web/CreeveyView/SideBar/TestLink.tsx +8 -6
- package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +1 -0
- package/src/client/web/index.tsx +8 -3
- package/src/creevey.ts +1 -24
- package/src/playwright-reporter.ts +3 -0
- package/src/server/config.ts +9 -1
- package/src/server/index.ts +13 -6
- package/src/server/master/api.ts +94 -28
- package/src/server/master/handlers/capture-handler.ts +20 -0
- package/src/server/master/handlers/index.ts +4 -0
- package/src/server/master/handlers/ping-handler.ts +6 -0
- package/src/server/master/handlers/static-handler.ts +18 -0
- package/src/server/master/handlers/stories-handler.ts +20 -0
- package/src/server/master/master.ts +10 -27
- package/src/server/master/runner.ts +38 -132
- package/src/server/master/server.ts +210 -98
- package/src/server/master/start.ts +17 -41
- package/src/server/master/testsManager.ts +315 -0
- package/src/server/playwright/docker-file.ts +2 -2
- package/src/server/playwright/reporter.ts +386 -0
- package/src/server/selenium/internal.ts +23 -3
- package/src/server/selenium/selenoid.ts +5 -0
- package/src/server/shutdown.ts +19 -0
- package/src/server/stories.ts +1 -12
- package/src/server/ui-update.ts +46 -0
- package/src/server/utils.ts +40 -9
- package/src/server/worker/start.ts +1 -1
- package/src/types.ts +14 -8
@@ -4,112 +4,214 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
exports.start = start;
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
8
|
+
const url_1 = __importDefault(require("url"));
|
7
9
|
const path_1 = __importDefault(require("path"));
|
8
|
-
const http_1 =
|
9
|
-
const
|
10
|
-
const
|
11
|
-
const
|
12
|
-
const koa_static_1 = __importDefault(require("koa-static"));
|
13
|
-
const koa_mount_1 = __importDefault(require("koa-mount"));
|
14
|
-
const koa_bodyparser_1 = __importDefault(require("koa-bodyparser"));
|
15
|
-
const ws_1 = __importDefault(require("ws"));
|
16
|
-
const url_1 = require("url");
|
10
|
+
const http_1 = require("http");
|
11
|
+
const ws_1 = require("ws");
|
12
|
+
const url_2 = require("url");
|
13
|
+
const utils_js_1 = require("../utils.js");
|
17
14
|
const messages_js_1 = require("../messages.js");
|
18
15
|
const types_js_1 = require("../../types.js");
|
19
16
|
const logger_js_1 = require("../logger.js");
|
20
|
-
const index_js_1 = require("
|
21
|
-
|
17
|
+
const index_js_1 = require("./handlers/index.js");
|
18
|
+
function json(handler, defaultValue) {
|
19
|
+
return (request, response) => {
|
20
|
+
const chunks = [];
|
21
|
+
request.on('data', (chunk) => {
|
22
|
+
chunks.push(chunk);
|
23
|
+
});
|
24
|
+
request.on('end', () => {
|
25
|
+
try {
|
26
|
+
const body = Buffer.concat(chunks);
|
27
|
+
const value = body.length === 0 ? defaultValue : JSON.parse(body.toString('utf-8'));
|
28
|
+
handler(value);
|
29
|
+
response.end();
|
30
|
+
}
|
31
|
+
catch (error) {
|
32
|
+
(0, logger_js_1.logger)().error('Failed to parse JSON', error);
|
33
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
34
|
+
response.statusCode = 500;
|
35
|
+
response.setHeader('Content-Type', 'text/plain');
|
36
|
+
response.end(`Failed to parse JSON: ${errorMessage}`);
|
37
|
+
}
|
38
|
+
});
|
39
|
+
request.on('error', (error) => {
|
40
|
+
(0, logger_js_1.logger)().error('Failed to parse JSON', error);
|
41
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
42
|
+
response.statusCode = 500;
|
43
|
+
response.setHeader('Content-Type', 'text/plain');
|
44
|
+
response.end(`Failed to parse JSON: ${errorMessage}`);
|
45
|
+
});
|
46
|
+
};
|
47
|
+
}
|
48
|
+
function file(handler) {
|
49
|
+
return (request, response) => {
|
50
|
+
const parsedUrl = url_1.default.parse(request.url ?? '/', true);
|
51
|
+
const requestedPath = parsedUrl.pathname ?? '/';
|
52
|
+
try {
|
53
|
+
const filePath = handler(requestedPath);
|
54
|
+
if (filePath) {
|
55
|
+
const stat = fs_1.default.statSync(filePath);
|
56
|
+
// Set appropriate MIME type
|
57
|
+
const ext = path_1.default.extname(filePath).toLowerCase();
|
58
|
+
const mimeTypes = {
|
59
|
+
'.html': 'text/html',
|
60
|
+
'.js': 'application/javascript',
|
61
|
+
'.css': 'text/css',
|
62
|
+
'.json': 'application/json',
|
63
|
+
'.png': 'image/png',
|
64
|
+
'.jpg': 'image/jpeg',
|
65
|
+
'.jpeg': 'image/jpeg',
|
66
|
+
'.gif': 'image/gif',
|
67
|
+
'.svg': 'image/svg+xml',
|
68
|
+
'.ico': 'image/x-icon',
|
69
|
+
};
|
70
|
+
const contentType = mimeTypes[ext] || 'application/octet-stream';
|
71
|
+
response.statusCode = 200;
|
72
|
+
response.setHeader('Content-Type', contentType);
|
73
|
+
response.setHeader('Content-Length', stat.size);
|
74
|
+
// Stream the file
|
75
|
+
const stream = fs_1.default.createReadStream(filePath);
|
76
|
+
stream.pipe(response);
|
77
|
+
stream.on('error', (error) => {
|
78
|
+
(0, logger_js_1.logger)().error('Error streaming file', error);
|
79
|
+
if (!response.headersSent) {
|
80
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
81
|
+
response.statusCode = 500;
|
82
|
+
response.setHeader('Content-Type', 'text/plain');
|
83
|
+
response.end(`Internal server error: ${errorMessage}`);
|
84
|
+
}
|
85
|
+
});
|
86
|
+
}
|
87
|
+
else {
|
88
|
+
(0, logger_js_1.logger)().error('File not found', requestedPath);
|
89
|
+
response.statusCode = 404;
|
90
|
+
response.setHeader('Content-Type', 'text/plain');
|
91
|
+
response.end('File not found');
|
92
|
+
}
|
93
|
+
}
|
94
|
+
catch (error) {
|
95
|
+
(0, logger_js_1.logger)().error('Failed to serve file', error);
|
96
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
97
|
+
response.statusCode = 500;
|
98
|
+
response.setHeader('Content-Type', 'text/plain');
|
99
|
+
response.end(`Failed to serve file: ${errorMessage}`);
|
100
|
+
}
|
101
|
+
};
|
102
|
+
}
|
103
|
+
const importMetaUrl = (0, url_2.pathToFileURL)(__filename).href;
|
22
104
|
function start(reportDir, port, ui) {
|
105
|
+
let wss = null;
|
106
|
+
let creeveyApi = null;
|
23
107
|
let resolveApi = types_js_1.noop;
|
24
|
-
|
25
|
-
const
|
26
|
-
const
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
108
|
+
const webDir = path_1.default.join(path_1.default.dirname((0, url_2.fileURLToPath)(importMetaUrl)), '../../client/web');
|
109
|
+
const server = (0, http_1.createServer)();
|
110
|
+
const routes = [
|
111
|
+
{
|
112
|
+
path: '/ping',
|
113
|
+
method: 'GET',
|
114
|
+
handler: index_js_1.pingHandler,
|
115
|
+
},
|
116
|
+
{
|
117
|
+
path: '/stories',
|
118
|
+
method: 'POST',
|
119
|
+
handler: json(index_js_1.storiesHandler, { stories: [] }),
|
120
|
+
},
|
121
|
+
{
|
122
|
+
path: '/capture',
|
123
|
+
method: 'POST',
|
124
|
+
handler: json(index_js_1.captureHandler, { workerId: 0, options: undefined }),
|
125
|
+
},
|
126
|
+
{
|
127
|
+
path: '/report/',
|
128
|
+
method: 'GET',
|
129
|
+
handler: file((0, index_js_1.staticHandler)(reportDir, '/report/')),
|
130
|
+
},
|
131
|
+
{
|
132
|
+
path: '/',
|
133
|
+
method: 'GET',
|
134
|
+
handler: file((0, index_js_1.staticHandler)(webDir)),
|
135
|
+
},
|
136
|
+
];
|
137
|
+
const router = (request, response) => {
|
138
|
+
const parsedUrl = url_1.default.parse(request.url ?? '/', true);
|
139
|
+
const path = parsedUrl.pathname ?? '/';
|
140
|
+
const method = request.method ?? 'GET';
|
141
|
+
try {
|
142
|
+
const route = routes.find((route) => path.startsWith(route.path) && route.method === method);
|
143
|
+
if (route) {
|
144
|
+
route.handler(request, response);
|
145
|
+
}
|
146
|
+
else {
|
147
|
+
response.statusCode = 404;
|
148
|
+
response.setHeader('Content-Type', 'text/plain');
|
149
|
+
response.end('Not Found');
|
150
|
+
}
|
151
|
+
}
|
152
|
+
catch (error) {
|
153
|
+
(0, logger_js_1.logger)().error('Request handling error', error);
|
154
|
+
response.statusCode = 500;
|
155
|
+
response.setHeader('Content-Type', 'text/plain');
|
156
|
+
response.end('Internal Server Error');
|
157
|
+
}
|
158
|
+
};
|
159
|
+
server.on('request', (request, response) => {
|
160
|
+
response.setHeader('Access-Control-Allow-Origin', '*');
|
161
|
+
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
162
|
+
response.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
|
163
|
+
if (request.method === 'OPTIONS') {
|
164
|
+
response.statusCode = 200;
|
165
|
+
response.end();
|
35
166
|
return;
|
36
167
|
}
|
37
|
-
|
168
|
+
router(request, response);
|
38
169
|
});
|
39
170
|
if (ui) {
|
40
|
-
|
41
|
-
|
42
|
-
|
171
|
+
wss = new ws_1.WebSocketServer({ server });
|
172
|
+
wss.on('connection', (ws) => {
|
173
|
+
ws.on('message', (message, isBinary) => {
|
174
|
+
if (creeveyApi) {
|
175
|
+
// NOTE Text messages are passed as Buffer https://github.com/websockets/ws/releases/tag/8.0.0
|
176
|
+
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
177
|
+
creeveyApi.handleMessage(ws, isBinary ? message : message.toString('utf-8'));
|
178
|
+
return;
|
179
|
+
}
|
180
|
+
});
|
181
|
+
ws.on('error', (error) => {
|
182
|
+
(0, logger_js_1.logger)().error('WebSocket error', error);
|
183
|
+
});
|
184
|
+
});
|
185
|
+
wss.on('error', (error) => {
|
186
|
+
(0, logger_js_1.logger)().error('WebSocket error', error);
|
43
187
|
});
|
44
188
|
}
|
45
|
-
|
46
|
-
if (
|
47
|
-
|
48
|
-
|
49
|
-
return;
|
50
|
-
const deserializedStories = stories.map(([file, stories]) => [
|
51
|
-
file,
|
52
|
-
stories.map(index_js_1.deserializeStory),
|
53
|
-
]);
|
54
|
-
setStoriesCounter = counter;
|
55
|
-
(0, messages_js_1.emitStoriesMessage)({ type: 'update', payload: deserializedStories });
|
56
|
-
Object.values(cluster_1.default.workers ?? {})
|
57
|
-
.filter(types_js_1.isDefined)
|
58
|
-
.filter((worker) => worker.isConnected())
|
59
|
-
.forEach((worker) => {
|
60
|
-
(0, messages_js_1.sendStoriesMessage)(worker, { type: 'update', payload: deserializedStories });
|
61
|
-
});
|
62
|
-
return;
|
63
|
-
}
|
64
|
-
await next();
|
65
|
-
});
|
66
|
-
app.use(async (ctx, next) => {
|
67
|
-
if (ctx.method == 'POST' && ctx.path == '/capture') {
|
68
|
-
const { workerId, options } = ctx.request.body;
|
69
|
-
const worker = Object.values(cluster_1.default.workers ?? {})
|
70
|
-
.filter(types_js_1.isDefined)
|
71
|
-
.find((worker) => worker.process.pid == workerId);
|
72
|
-
// NOTE: Hypothetical case when someone send to us capture req and we don't have a worker with browser session for it
|
73
|
-
if (!worker)
|
74
|
-
return;
|
75
|
-
await new Promise((resolve) => {
|
76
|
-
const unsubscribe = (0, messages_js_1.subscribeOnWorker)(worker, 'stories', (message) => {
|
77
|
-
if (message.type != 'capture')
|
78
|
-
return;
|
79
|
-
unsubscribe();
|
80
|
-
resolve();
|
81
|
-
});
|
82
|
-
(0, messages_js_1.sendStoriesMessage)(worker, { type: 'capture', payload: options });
|
189
|
+
(0, messages_js_1.subscribeOn)('shutdown', () => {
|
190
|
+
if (wss) {
|
191
|
+
wss.clients.forEach((ws) => {
|
192
|
+
ws.close();
|
83
193
|
});
|
84
|
-
|
85
|
-
ctx.body = 'Ok';
|
86
|
-
return;
|
194
|
+
wss.close();
|
87
195
|
}
|
88
|
-
await next();
|
89
|
-
});
|
90
|
-
app.use((0, koa_static_1.default)(path_1.default.join(path_1.default.dirname((0, url_1.fileURLToPath)(importMetaUrl)), '../../client/web')));
|
91
|
-
app.use((0, koa_mount_1.default)('/report', (0, koa_static_1.default)(reportDir)));
|
92
|
-
wss.on('error', (error) => {
|
93
|
-
(0, logger_js_1.logger)().error(error);
|
94
|
-
});
|
95
|
-
server.listen(port);
|
96
|
-
(0, messages_js_1.subscribeOn)('shutdown', () => {
|
97
196
|
server.close();
|
98
|
-
wss.close();
|
99
|
-
wss.clients.forEach((ws) => {
|
100
|
-
ws.close();
|
101
|
-
});
|
102
197
|
});
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
});
|
111
|
-
});
|
198
|
+
server
|
199
|
+
.listen(port, () => {
|
200
|
+
(0, logger_js_1.logger)().info(`Server starting on port ${port}`);
|
201
|
+
})
|
202
|
+
.on('error', (error) => {
|
203
|
+
(0, logger_js_1.logger)().error('Failed to start server', error);
|
204
|
+
process.exit(1);
|
112
205
|
});
|
206
|
+
void new Promise((resolve) => (resolveApi = resolve))
|
207
|
+
.then((api) => {
|
208
|
+
creeveyApi = api;
|
209
|
+
if (wss) {
|
210
|
+
creeveyApi.subscribe(wss);
|
211
|
+
}
|
212
|
+
})
|
213
|
+
.catch(utils_js_1.shutdownOnException);
|
214
|
+
// Return the function to resolve the API
|
113
215
|
return resolveApi;
|
114
216
|
}
|
115
217
|
//# sourceMappingURL=server.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/server/master/server.ts"],"names":[],"mappings":";;;;;
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/server/master/server.ts"],"names":[],"mappings":"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"}
|
@@ -1,3 +1,2 @@
|
|
1
|
-
import { CreeveyApi } from './api.js';
|
2
1
|
import { Config, Options } from '../../types.js';
|
3
|
-
export declare function start(gridUrl: string | undefined, config: Config, options: Options
|
2
|
+
export declare function start(gridUrl: string | undefined, config: Config, options: Options): Promise<void>;
|
@@ -6,38 +6,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.start = start;
|
7
7
|
const path_1 = __importDefault(require("path"));
|
8
8
|
const fs_1 = require("fs");
|
9
|
-
const url_1 = require("url");
|
10
|
-
const promises_1 = require("fs/promises");
|
11
9
|
const master_js_1 = __importDefault(require("./master.js"));
|
12
|
-
const api_js_1 =
|
10
|
+
const api_js_1 = require("./api.js");
|
13
11
|
const types_js_1 = require("../../types.js");
|
14
12
|
const utils_js_1 = require("../utils.js");
|
15
13
|
const messages_js_1 = require("../messages.js");
|
16
14
|
const logger_js_1 = require("../logger.js");
|
17
15
|
const telemetry_js_1 = require("../telemetry.js");
|
18
|
-
const
|
19
|
-
async function copyStatics(reportDir) {
|
20
|
-
const clientDir = path_1.default.join(path_1.default.dirname((0, url_1.fileURLToPath)(importMetaUrl)), '../../../dist/client/web');
|
21
|
-
const assets = (await (0, promises_1.readdir)(path_1.default.join(clientDir, 'assets'), { withFileTypes: true }))
|
22
|
-
.filter((dirent) => dirent.isFile())
|
23
|
-
.map((dirent) => dirent.name);
|
24
|
-
await (0, promises_1.mkdir)(path_1.default.join(reportDir, 'assets'), { recursive: true });
|
25
|
-
await (0, promises_1.copyFile)(path_1.default.join(clientDir, 'index.html'), path_1.default.join(reportDir, 'index.html'));
|
26
|
-
for (const asset of assets) {
|
27
|
-
await (0, promises_1.copyFile)(path_1.default.join(clientDir, 'assets', asset), path_1.default.join(reportDir, 'assets', asset));
|
28
|
-
}
|
29
|
-
}
|
30
|
-
function reportDataModule(data) {
|
31
|
-
return `
|
32
|
-
(function (root, factory) {
|
33
|
-
if (typeof module === 'object' && module.exports) {
|
34
|
-
module.exports = factory();
|
35
|
-
} else {
|
36
|
-
root.__CREEVEY_DATA__ = factory();
|
37
|
-
}
|
38
|
-
}(this, function () { return ${JSON.stringify(data)} }));
|
39
|
-
`;
|
40
|
-
}
|
16
|
+
const server_js_1 = require("./server.js");
|
41
17
|
function outputUnnecessaryImages(imagesDir, images) {
|
42
18
|
if (!(0, fs_1.existsSync)(imagesDir))
|
43
19
|
return;
|
@@ -48,7 +24,8 @@ function outputUnnecessaryImages(imagesDir, images) {
|
|
48
24
|
(0, logger_js_1.logger)().warn('We found unnecessary screenshot images, those can be safely removed:\n', unnecessaryImages.join('\n'));
|
49
25
|
}
|
50
26
|
}
|
51
|
-
async function start(gridUrl, config, options
|
27
|
+
async function start(gridUrl, config, options) {
|
28
|
+
const resolveApi = (0, server_js_1.start)(config.reportDir, options.port, options.ui);
|
52
29
|
let runner = null;
|
53
30
|
if (config.hooks.before) {
|
54
31
|
await config.hooks.before();
|
@@ -70,10 +47,15 @@ async function start(gridUrl, config, options, resolveApi) {
|
|
70
47
|
});
|
71
48
|
runner = await (0, master_js_1.default)(config, gridUrl);
|
72
49
|
runner.on('stop', () => {
|
73
|
-
void copyStatics(config.reportDir).then(() =>
|
50
|
+
void (0, utils_js_1.copyStatics)(config.reportDir).then(() => runner.testsManager.saveTestData());
|
74
51
|
});
|
75
52
|
if (options.ui) {
|
76
|
-
|
53
|
+
// Initialize TestsManager
|
54
|
+
const testsManager = runner.testsManager;
|
55
|
+
// Create the CreeveyApi instance using the existing runner
|
56
|
+
const api = new api_js_1.CreeveyApi(testsManager, runner);
|
57
|
+
// Resolve the API for the server
|
58
|
+
resolveApi(api);
|
77
59
|
(0, logger_js_1.logger)().info(`Started on http://localhost:${options.port}`);
|
78
60
|
}
|
79
61
|
else {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/server/master/start.ts"],"names":[],"mappings":";;;;;
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/server/master/start.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,81 @@
|
|
1
|
+
import EventEmitter from 'events';
|
2
|
+
import { ServerTest, TestResult, TestStatus, CreeveyUpdate, ApprovePayload, CreeveyStatus } from '../../types.js';
|
3
|
+
/**
|
4
|
+
* TestsManager is responsible for all operations related to test data management
|
5
|
+
* including loading, saving, merging, and updating test data.
|
6
|
+
* It extends EventEmitter to emit update events that can be subscribed to.
|
7
|
+
*/
|
8
|
+
export declare class TestsManager extends EventEmitter {
|
9
|
+
private tests;
|
10
|
+
private screenDir;
|
11
|
+
private reportDir;
|
12
|
+
/**
|
13
|
+
* Creates a new TestsManager instance
|
14
|
+
* @param screenDir Directory for storing reference images
|
15
|
+
* @param reportDir Directory for storing reports and screenshots
|
16
|
+
*/
|
17
|
+
constructor(screenDir: string, reportDir: string);
|
18
|
+
/**
|
19
|
+
* Get a copy of all tests
|
20
|
+
* @returns all tests
|
21
|
+
*/
|
22
|
+
getTests(): Partial<Record<string, ServerTest>>;
|
23
|
+
/**
|
24
|
+
* Get a test by ID
|
25
|
+
* @param id Test ID
|
26
|
+
* @returns Test data
|
27
|
+
*/
|
28
|
+
getTest(id: string): ServerTest | undefined;
|
29
|
+
/**
|
30
|
+
* Get test data in a format suitable for status reporting
|
31
|
+
* @returns Test data in the format needed for status
|
32
|
+
*/
|
33
|
+
getTestsData(): CreeveyStatus['tests'];
|
34
|
+
/**
|
35
|
+
* Load tests from a report file
|
36
|
+
*/
|
37
|
+
loadTestsFromReport(): Partial<Record<string, ServerTest>>;
|
38
|
+
/**
|
39
|
+
* Merge tests from report with tests from stories
|
40
|
+
*/
|
41
|
+
private mergeTests;
|
42
|
+
loadAndMergeTests(testsFromStories: Partial<Record<string, ServerTest>>): Partial<Record<string, ServerTest>>;
|
43
|
+
/**
|
44
|
+
* Update tests with incremental changes
|
45
|
+
* @param testsDiff Tests to update or remove
|
46
|
+
*/
|
47
|
+
updateTests(testsDiff: Partial<Record<string, ServerTest>>): CreeveyUpdate | null;
|
48
|
+
/**
|
49
|
+
* Update test result
|
50
|
+
* @param id Test ID
|
51
|
+
* @param status New test status
|
52
|
+
* @param result Optional test result
|
53
|
+
*/
|
54
|
+
updateTestStatus(id: string, status: TestStatus, result?: TestResult): CreeveyUpdate | null;
|
55
|
+
/**
|
56
|
+
* Save tests to JSON file
|
57
|
+
* @param reportDir Directory to save the JSON file
|
58
|
+
*/
|
59
|
+
saveTestsToJson(): void;
|
60
|
+
/**
|
61
|
+
* Save test data to a module
|
62
|
+
* @param data Test data to include in the module
|
63
|
+
*/
|
64
|
+
saveTestData(data?: CreeveyStatus['tests']): Promise<void>;
|
65
|
+
/**
|
66
|
+
* Copy image for approval
|
67
|
+
* @param test Test data
|
68
|
+
* @param image Image name
|
69
|
+
* @param actual Actual image path
|
70
|
+
*/
|
71
|
+
private copyImage;
|
72
|
+
/**
|
73
|
+
* Approve a specific test
|
74
|
+
* @param payload Approval payload with test ID, retry index, and image name
|
75
|
+
*/
|
76
|
+
approve({ id, retry, image }: ApprovePayload): Promise<CreeveyUpdate | null>;
|
77
|
+
/**
|
78
|
+
* Approve all failed tests
|
79
|
+
*/
|
80
|
+
approveAll(): Promise<CreeveyUpdate>;
|
81
|
+
}
|