donobu 2.27.2 → 2.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apis/FlowsApi.d.ts +6 -15
- package/dist/apis/FlowsApi.d.ts.map +1 -1
- package/dist/apis/FlowsApi.js +18 -65
- package/dist/apis/FlowsApi.js.map +1 -1
- package/dist/assets/generated/version +1 -1
- package/dist/assets/playwright-json-to-markdown.js +1 -1
- package/dist/assets/playwright-json-to-slack-json.js +171 -0
- package/dist/esm/apis/FlowsApi.d.ts +6 -15
- package/dist/esm/apis/FlowsApi.d.ts.map +1 -1
- package/dist/esm/apis/FlowsApi.js +18 -65
- package/dist/esm/apis/FlowsApi.js.map +1 -1
- package/dist/esm/assets/generated/version +1 -1
- package/dist/esm/assets/playwright-json-to-markdown.js +1 -1
- package/dist/esm/assets/playwright-json-to-slack-json.js +171 -0
- package/dist/esm/lib/testExtension.d.ts.map +1 -1
- package/dist/esm/lib/testExtension.js +88 -100
- package/dist/esm/lib/testExtension.js.map +1 -1
- package/dist/esm/lib/utils/selfHealing.d.ts.map +1 -1
- package/dist/esm/lib/utils/selfHealing.js +20 -4
- package/dist/esm/lib/utils/selfHealing.js.map +1 -1
- package/dist/esm/managers/CodeGenerator.d.ts +1 -1
- package/dist/esm/managers/CodeGenerator.d.ts.map +1 -1
- package/dist/esm/managers/CodeGenerator.js +65 -34
- package/dist/esm/managers/CodeGenerator.js.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.js +1 -1
- package/dist/esm/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/esm/models/CodeGenerationOptions.d.ts +12 -6
- package/dist/esm/models/CodeGenerationOptions.d.ts.map +1 -1
- package/dist/esm/models/CodeGenerationOptions.js +15 -2
- package/dist/esm/models/CodeGenerationOptions.js.map +1 -1
- package/dist/esm/models/FlowMetadata.js +3 -3
- package/dist/esm/models/FlowMetadata.js.map +1 -1
- package/dist/esm/tools/ReplayableInteraction.d.ts +11 -3
- package/dist/esm/tools/ReplayableInteraction.d.ts.map +1 -1
- package/dist/esm/tools/ReplayableInteraction.js +45 -21
- package/dist/esm/tools/ReplayableInteraction.js.map +1 -1
- package/dist/lib/testExtension.d.ts.map +1 -1
- package/dist/lib/testExtension.js +88 -100
- package/dist/lib/testExtension.js.map +1 -1
- package/dist/lib/utils/selfHealing.d.ts.map +1 -1
- package/dist/lib/utils/selfHealing.js +20 -4
- package/dist/lib/utils/selfHealing.js.map +1 -1
- package/dist/managers/CodeGenerator.d.ts +1 -1
- package/dist/managers/CodeGenerator.d.ts.map +1 -1
- package/dist/managers/CodeGenerator.js +65 -34
- package/dist/managers/CodeGenerator.js.map +1 -1
- package/dist/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/managers/DonobuFlowsManager.js +1 -1
- package/dist/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/models/CodeGenerationOptions.d.ts +12 -6
- package/dist/models/CodeGenerationOptions.d.ts.map +1 -1
- package/dist/models/CodeGenerationOptions.js +15 -2
- package/dist/models/CodeGenerationOptions.js.map +1 -1
- package/dist/models/FlowMetadata.js +3 -3
- package/dist/models/FlowMetadata.js.map +1 -1
- package/dist/tools/ReplayableInteraction.d.ts +11 -3
- package/dist/tools/ReplayableInteraction.d.ts.map +1 -1
- package/dist/tools/ReplayableInteraction.js +45 -21
- package/dist/tools/ReplayableInteraction.js.map +1 -1
- package/package.json +3 -2
package/dist/apis/FlowsApi.d.ts
CHANGED
|
@@ -25,6 +25,7 @@ import { DonobuFlowsManager } from '../managers/DonobuFlowsManager';
|
|
|
25
25
|
*/
|
|
26
26
|
export declare class FlowsApi {
|
|
27
27
|
private readonly donobuFlowsManager;
|
|
28
|
+
private static DEFAULT_CODE_OPTIONS;
|
|
28
29
|
constructor(donobuFlowsManager: DonobuFlowsManager);
|
|
29
30
|
/**
|
|
30
31
|
* Generates Playwright code that can replay a completed flow.
|
|
@@ -61,7 +62,11 @@ export declare class FlowsApi {
|
|
|
61
62
|
* Content-Type: application/json
|
|
62
63
|
*
|
|
63
64
|
* {
|
|
64
|
-
* "flowIds": ["
|
|
65
|
+
* "flowIds": [ "flowId1", "flowId2", "flowId3" ],
|
|
66
|
+
* "options": {
|
|
67
|
+
* "areElementIdsVolatile": true,
|
|
68
|
+
* "disableSelectorFailover": true
|
|
69
|
+
* }
|
|
65
70
|
* }
|
|
66
71
|
*
|
|
67
72
|
* Response:
|
|
@@ -95,8 +100,6 @@ export declare class FlowsApi {
|
|
|
95
100
|
*
|
|
96
101
|
* Response: CreateDonobuFlow object ready for POST to /api/flows
|
|
97
102
|
* ```
|
|
98
|
-
*
|
|
99
|
-
* @public
|
|
100
103
|
*/
|
|
101
104
|
getFlowAsRerun(req: Request, res: Response): Promise<void>;
|
|
102
105
|
/**
|
|
@@ -214,8 +217,6 @@ export declare class FlowsApi {
|
|
|
214
217
|
*
|
|
215
218
|
* Response: Complete FlowMetadata object
|
|
216
219
|
* ```
|
|
217
|
-
*
|
|
218
|
-
* @public
|
|
219
220
|
*/
|
|
220
221
|
getFlowMetadata(req: Request, res: Response): Promise<void>;
|
|
221
222
|
/**
|
|
@@ -279,15 +280,5 @@ export declare class FlowsApi {
|
|
|
279
280
|
* Cannot be undone - the flow will need to be recreated to retry.
|
|
280
281
|
*/
|
|
281
282
|
cancelFlow(req: Request, res: Response): Promise<void>;
|
|
282
|
-
/**
|
|
283
|
-
* Parses and validates the limit query parameter.
|
|
284
|
-
*
|
|
285
|
-
* Converts the limit string to a number with appropriate defaults and bounds.
|
|
286
|
-
* Returns Number.MAX_SAFE_INTEGER if parsing fails to avoid artificial limits.
|
|
287
|
-
*
|
|
288
|
-
* @param limit - The limit query parameter value
|
|
289
|
-
* @returns Parsed limit number or maximum safe integer
|
|
290
|
-
*/
|
|
291
|
-
private parseLimit;
|
|
292
283
|
}
|
|
293
284
|
//# sourceMappingURL=FlowsApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsApi.d.ts","sourceRoot":"","sources":["../../src/apis/FlowsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"FlowsApi.d.ts","sourceRoot":"","sources":["../../src/apis/FlowsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AASpE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,QAAQ;IAMA,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IALtD,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAGjC;gBAEkC,kBAAkB,EAAE,kBAAkB;IAE1E;;;;;;;;;;;;;;;;;;OAkBG;IACU,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACU,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1E;;;;;;;;;;;;;;;OAeG;IACU,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACU,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnE;;;;;;;;;;;;;;;;;;OAkBG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnE;;;;;;;;;;;;;;;OAeG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnE;;;;;;;;;;;;;;OAcG;IACU,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxE;;;;;;;;;;;;;;;;;;;OAmBG;IACU,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlE;;;;;;;;;;;;;;;;;;OAkBG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnE;;;;;;;;;;;;;;;;;;OAkBG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAKpE"}
|
package/dist/apis/FlowsApi.js
CHANGED
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.FlowsApi = void 0;
|
|
4
4
|
const CreateDonobuFlow_1 = require("../models/CreateDonobuFlow");
|
|
5
5
|
const FlowMetadata_1 = require("../models/FlowMetadata");
|
|
6
|
-
const InvalidParamValueException_1 = require("../exceptions/InvalidParamValueException");
|
|
7
6
|
const zod_1 = require("zod");
|
|
7
|
+
const CodeGenerationOptions_1 = require("../models/CodeGenerationOptions");
|
|
8
8
|
/**
|
|
9
9
|
* API controller for managing Donobu flows throughout their lifecycle.
|
|
10
10
|
*
|
|
@@ -53,10 +53,8 @@ class FlowsApi {
|
|
|
53
53
|
*/
|
|
54
54
|
async getFlowAsCode(req, res) {
|
|
55
55
|
const flowId = req.params.flowId;
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
disableSelectorFailover: false,
|
|
59
|
-
});
|
|
56
|
+
const options = CodeGenerationOptions_1.CodeGenerationOptionsSchema.optional().parse(req.query);
|
|
57
|
+
const draftedPlaywrightScript = await this.donobuFlowsManager.getFlowAsPlaywrightScript(flowId, options ?? FlowsApi.DEFAULT_CODE_OPTIONS);
|
|
60
58
|
res.send({ script: draftedPlaywrightScript });
|
|
61
59
|
}
|
|
62
60
|
/**
|
|
@@ -74,7 +72,11 @@ class FlowsApi {
|
|
|
74
72
|
* Content-Type: application/json
|
|
75
73
|
*
|
|
76
74
|
* {
|
|
77
|
-
* "flowIds": ["
|
|
75
|
+
* "flowIds": [ "flowId1", "flowId2", "flowId3" ],
|
|
76
|
+
* "options": {
|
|
77
|
+
* "areElementIdsVolatile": true,
|
|
78
|
+
* "disableSelectorFailover": true
|
|
79
|
+
* }
|
|
78
80
|
* }
|
|
79
81
|
*
|
|
80
82
|
* Response:
|
|
@@ -94,12 +96,12 @@ class FlowsApi {
|
|
|
94
96
|
*/
|
|
95
97
|
async getFlowsAsProject(req, res) {
|
|
96
98
|
const parsedBody = zod_1.z
|
|
97
|
-
.object({
|
|
99
|
+
.object({
|
|
100
|
+
flowIds: zod_1.z.array(zod_1.z.string()),
|
|
101
|
+
options: CodeGenerationOptions_1.CodeGenerationOptionsSchema.optional(),
|
|
102
|
+
})
|
|
98
103
|
.parse(req.body);
|
|
99
|
-
const project = await this.donobuFlowsManager.getFlowsAsPlaywrightProject(parsedBody.flowIds,
|
|
100
|
-
areElementIdsVolatile: false,
|
|
101
|
-
disableSelectorFailover: false,
|
|
102
|
-
});
|
|
104
|
+
const project = await this.donobuFlowsManager.getFlowsAsPlaywrightProject(parsedBody.flowIds, parsedBody.options ?? FlowsApi.DEFAULT_CODE_OPTIONS);
|
|
103
105
|
res.json({
|
|
104
106
|
files: project.files,
|
|
105
107
|
});
|
|
@@ -119,8 +121,6 @@ class FlowsApi {
|
|
|
119
121
|
*
|
|
120
122
|
* Response: CreateDonobuFlow object ready for POST to /api/flows
|
|
121
123
|
* ```
|
|
122
|
-
*
|
|
123
|
-
* @public
|
|
124
124
|
*/
|
|
125
125
|
async getFlowAsRerun(req, res) {
|
|
126
126
|
const flowId = req.params.flowId;
|
|
@@ -168,39 +168,7 @@ class FlowsApi {
|
|
|
168
168
|
* - `startedBefore`: Unix timestamp - flows started before this time
|
|
169
169
|
*/
|
|
170
170
|
async getFlows(req, res) {
|
|
171
|
-
const query =
|
|
172
|
-
pageToken: req.query.pageToken,
|
|
173
|
-
limit: this.parseLimit(req.query.limit),
|
|
174
|
-
name: req.query.name,
|
|
175
|
-
runMode: req.query.runMode,
|
|
176
|
-
state: req.query.state,
|
|
177
|
-
startedAfter: req.query.startedAfter
|
|
178
|
-
? parseInt(req.query.startedAfter)
|
|
179
|
-
: undefined,
|
|
180
|
-
startedBefore: req.query.startedBefore
|
|
181
|
-
? parseInt(req.query.startedBefore)
|
|
182
|
-
: undefined,
|
|
183
|
-
};
|
|
184
|
-
// Validate numeric startedAfter.
|
|
185
|
-
if (req.query.startedAfter &&
|
|
186
|
-
query.startedAfter &&
|
|
187
|
-
isNaN(query.startedAfter)) {
|
|
188
|
-
throw new InvalidParamValueException_1.InvalidParamValueException('startedAfter', '' + req.query.startedAfter);
|
|
189
|
-
}
|
|
190
|
-
// Validate numeric startedBefore.
|
|
191
|
-
if (req.query.startedBefore &&
|
|
192
|
-
query.startedBefore &&
|
|
193
|
-
isNaN(query.startedBefore)) {
|
|
194
|
-
throw new InvalidParamValueException_1.InvalidParamValueException('startedBefore', '' + req.query.startedBefore);
|
|
195
|
-
}
|
|
196
|
-
// Validate that runMode is a valid enum value.
|
|
197
|
-
if (query.runMode && !FlowMetadata_1.RunModeSchema.options.includes(query.runMode)) {
|
|
198
|
-
throw new InvalidParamValueException_1.InvalidParamValueException('runMode', query.runMode);
|
|
199
|
-
}
|
|
200
|
-
// Validate that state is a valid enum value.
|
|
201
|
-
if (query.state && !FlowMetadata_1.StateSchema.options.includes(query.state)) {
|
|
202
|
-
throw new InvalidParamValueException_1.InvalidParamValueException('state', query.state);
|
|
203
|
-
}
|
|
171
|
+
const query = FlowMetadata_1.FlowsQuerySchema.parse(req.query);
|
|
204
172
|
const flows = await this.donobuFlowsManager.getFlows(query);
|
|
205
173
|
res.json({ flows: flows.items, nextPageToken: flows.nextPageToken });
|
|
206
174
|
}
|
|
@@ -295,8 +263,6 @@ class FlowsApi {
|
|
|
295
263
|
*
|
|
296
264
|
* Response: Complete FlowMetadata object
|
|
297
265
|
* ```
|
|
298
|
-
*
|
|
299
|
-
* @public
|
|
300
266
|
*/
|
|
301
267
|
async getFlowMetadata(req, res) {
|
|
302
268
|
const flowId = req.params.flowId;
|
|
@@ -382,23 +348,10 @@ class FlowsApi {
|
|
|
382
348
|
const metadata = await this.donobuFlowsManager.cancelFlow(flowId);
|
|
383
349
|
res.json(metadata);
|
|
384
350
|
}
|
|
385
|
-
/**
|
|
386
|
-
* Parses and validates the limit query parameter.
|
|
387
|
-
*
|
|
388
|
-
* Converts the limit string to a number with appropriate defaults and bounds.
|
|
389
|
-
* Returns Number.MAX_SAFE_INTEGER if parsing fails to avoid artificial limits.
|
|
390
|
-
*
|
|
391
|
-
* @param limit - The limit query parameter value
|
|
392
|
-
* @returns Parsed limit number or maximum safe integer
|
|
393
|
-
*/
|
|
394
|
-
parseLimit(limit) {
|
|
395
|
-
try {
|
|
396
|
-
return limit ? parseInt(limit) : Number.MAX_SAFE_INTEGER;
|
|
397
|
-
}
|
|
398
|
-
catch {
|
|
399
|
-
return Number.MAX_SAFE_INTEGER;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
351
|
}
|
|
403
352
|
exports.FlowsApi = FlowsApi;
|
|
353
|
+
FlowsApi.DEFAULT_CODE_OPTIONS = {
|
|
354
|
+
areElementIdsVolatile: false,
|
|
355
|
+
disableSelectorFailover: false,
|
|
356
|
+
};
|
|
404
357
|
//# sourceMappingURL=FlowsApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsApi.js","sourceRoot":"","sources":["../../src/apis/FlowsApi.ts"],"names":[],"mappings":";;;AAEA,iEAAoE;AACpE,
|
|
1
|
+
{"version":3,"file":"FlowsApi.js","sourceRoot":"","sources":["../../src/apis/FlowsApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
1281
|
|
@@ -241,7 +241,7 @@ function generateMarkdown(jsonData) {
|
|
|
241
241
|
});
|
|
242
242
|
|
|
243
243
|
// Add timestamp footer
|
|
244
|
-
markdown += `_Report generated on ${new Date().toLocaleString()}
|
|
244
|
+
markdown += `_Report generated on ${new Date().toLocaleString()} by Donobu_\n`;
|
|
245
245
|
|
|
246
246
|
return markdown;
|
|
247
247
|
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Convert Playwright JSON test results to a simplified Slack-compatible report.
|
|
5
|
+
*
|
|
6
|
+
* Usage: node playwright-json-to-slack-json.js input.json [--report-url <url>]
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
|
|
11
|
+
// Read the JSON data from file or stdin
|
|
12
|
+
function readInput() {
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
|
|
15
|
+
// Parse arguments to extract report URL and input file
|
|
16
|
+
let reportUrl = null;
|
|
17
|
+
let inputFile = null;
|
|
18
|
+
|
|
19
|
+
for (let i = 0; i < args.length; i++) {
|
|
20
|
+
if (args[i] === '--report-url' && i + 1 < args.length) {
|
|
21
|
+
reportUrl = args[i + 1];
|
|
22
|
+
i++; // Skip the URL value
|
|
23
|
+
} else if (!args[i].startsWith('--')) {
|
|
24
|
+
inputFile = args[i];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let jsonData;
|
|
29
|
+
|
|
30
|
+
if (inputFile) {
|
|
31
|
+
jsonData = JSON.parse(fs.readFileSync(inputFile, 'utf8'));
|
|
32
|
+
} else {
|
|
33
|
+
jsonData = JSON.parse(fs.readFileSync(0, 'utf8')); // Read from stdin
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return { jsonData, reportUrl };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Process JSON and create simplified Slack blocks
|
|
40
|
+
function generateSlackBlocks(jsonData, reportUrl) {
|
|
41
|
+
const { suites } = jsonData;
|
|
42
|
+
|
|
43
|
+
const blocks = [];
|
|
44
|
+
|
|
45
|
+
// Header block
|
|
46
|
+
blocks.push({
|
|
47
|
+
type: 'header',
|
|
48
|
+
text: {
|
|
49
|
+
type: 'plain_text',
|
|
50
|
+
text: '🎭 Playwright Test Summary',
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Track totals
|
|
55
|
+
let totalPassed = 0;
|
|
56
|
+
let totalFailed = 0;
|
|
57
|
+
let totalTimedOut = 0;
|
|
58
|
+
let totalSkipped = 0;
|
|
59
|
+
let totalInterrupted = 0;
|
|
60
|
+
let totalSelfHealed = 0;
|
|
61
|
+
|
|
62
|
+
// Process each suite to get totals
|
|
63
|
+
suites.forEach((suite) => {
|
|
64
|
+
suite.specs.forEach((spec) => {
|
|
65
|
+
spec.tests.forEach((test) => {
|
|
66
|
+
const result = test.results && test.results.at(-1);
|
|
67
|
+
const isSelfHealed =
|
|
68
|
+
test.annotations &&
|
|
69
|
+
test.annotations.some((a) => a.type === 'self-healed');
|
|
70
|
+
|
|
71
|
+
if (
|
|
72
|
+
test.status === 'skipped' ||
|
|
73
|
+
(!result && test.status === undefined)
|
|
74
|
+
) {
|
|
75
|
+
totalSkipped++;
|
|
76
|
+
} else if (result) {
|
|
77
|
+
if (isSelfHealed) {
|
|
78
|
+
totalSelfHealed++;
|
|
79
|
+
} else {
|
|
80
|
+
switch (result.status) {
|
|
81
|
+
case 'passed':
|
|
82
|
+
totalPassed++;
|
|
83
|
+
break;
|
|
84
|
+
case 'failed':
|
|
85
|
+
totalFailed++;
|
|
86
|
+
break;
|
|
87
|
+
case 'timedOut':
|
|
88
|
+
totalTimedOut++;
|
|
89
|
+
break;
|
|
90
|
+
case 'skipped':
|
|
91
|
+
totalSkipped++;
|
|
92
|
+
break;
|
|
93
|
+
case 'interrupted':
|
|
94
|
+
totalInterrupted++;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Create status summary table
|
|
104
|
+
const statusRows = [
|
|
105
|
+
{ name: 'Passed', emoji: '✅', count: totalPassed },
|
|
106
|
+
{ name: 'Self-Healed', emoji: '❤️🩹', count: totalSelfHealed },
|
|
107
|
+
{ name: 'Failed', emoji: '❌', count: totalFailed },
|
|
108
|
+
{ name: 'Timed Out', emoji: '⏰', count: totalTimedOut },
|
|
109
|
+
{ name: 'Skipped', emoji: '⏭️', count: totalSkipped },
|
|
110
|
+
{ name: 'Interrupted', emoji: '⚡', count: totalInterrupted },
|
|
111
|
+
];
|
|
112
|
+
|
|
113
|
+
// Add each status row as a section with two fields
|
|
114
|
+
statusRows.forEach((row) => {
|
|
115
|
+
blocks.push({
|
|
116
|
+
type: 'section',
|
|
117
|
+
fields: [
|
|
118
|
+
{
|
|
119
|
+
type: 'mrkdwn',
|
|
120
|
+
text: `${row.emoji} ${row.name}`,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
type: 'mrkdwn',
|
|
124
|
+
text: `${row.count}`,
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Add report URL link if provided
|
|
131
|
+
if (reportUrl) {
|
|
132
|
+
blocks.push({
|
|
133
|
+
type: 'divider',
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
blocks.push({
|
|
137
|
+
type: 'section',
|
|
138
|
+
text: {
|
|
139
|
+
type: 'mrkdwn',
|
|
140
|
+
text: `📊 <${reportUrl}|View Full Report>`,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Add timestamp footer
|
|
146
|
+
blocks.push({
|
|
147
|
+
type: 'divider',
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
blocks.push({
|
|
151
|
+
type: 'context',
|
|
152
|
+
elements: [
|
|
153
|
+
{
|
|
154
|
+
type: 'mrkdwn',
|
|
155
|
+
text: `Report generated on ${new Date().toLocaleString()} by Donobu`,
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
return { blocks };
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Main execution
|
|
164
|
+
try {
|
|
165
|
+
const { jsonData, reportUrl } = readInput();
|
|
166
|
+
const slackBlocks = generateSlackBlocks(jsonData, reportUrl);
|
|
167
|
+
console.log(JSON.stringify(slackBlocks, null, 2));
|
|
168
|
+
} catch (error) {
|
|
169
|
+
console.error('Error processing JSON:', error.message);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
@@ -25,6 +25,7 @@ import { DonobuFlowsManager } from '../managers/DonobuFlowsManager';
|
|
|
25
25
|
*/
|
|
26
26
|
export declare class FlowsApi {
|
|
27
27
|
private readonly donobuFlowsManager;
|
|
28
|
+
private static DEFAULT_CODE_OPTIONS;
|
|
28
29
|
constructor(donobuFlowsManager: DonobuFlowsManager);
|
|
29
30
|
/**
|
|
30
31
|
* Generates Playwright code that can replay a completed flow.
|
|
@@ -61,7 +62,11 @@ export declare class FlowsApi {
|
|
|
61
62
|
* Content-Type: application/json
|
|
62
63
|
*
|
|
63
64
|
* {
|
|
64
|
-
* "flowIds": ["
|
|
65
|
+
* "flowIds": [ "flowId1", "flowId2", "flowId3" ],
|
|
66
|
+
* "options": {
|
|
67
|
+
* "areElementIdsVolatile": true,
|
|
68
|
+
* "disableSelectorFailover": true
|
|
69
|
+
* }
|
|
65
70
|
* }
|
|
66
71
|
*
|
|
67
72
|
* Response:
|
|
@@ -95,8 +100,6 @@ export declare class FlowsApi {
|
|
|
95
100
|
*
|
|
96
101
|
* Response: CreateDonobuFlow object ready for POST to /api/flows
|
|
97
102
|
* ```
|
|
98
|
-
*
|
|
99
|
-
* @public
|
|
100
103
|
*/
|
|
101
104
|
getFlowAsRerun(req: Request, res: Response): Promise<void>;
|
|
102
105
|
/**
|
|
@@ -214,8 +217,6 @@ export declare class FlowsApi {
|
|
|
214
217
|
*
|
|
215
218
|
* Response: Complete FlowMetadata object
|
|
216
219
|
* ```
|
|
217
|
-
*
|
|
218
|
-
* @public
|
|
219
220
|
*/
|
|
220
221
|
getFlowMetadata(req: Request, res: Response): Promise<void>;
|
|
221
222
|
/**
|
|
@@ -279,15 +280,5 @@ export declare class FlowsApi {
|
|
|
279
280
|
* Cannot be undone - the flow will need to be recreated to retry.
|
|
280
281
|
*/
|
|
281
282
|
cancelFlow(req: Request, res: Response): Promise<void>;
|
|
282
|
-
/**
|
|
283
|
-
* Parses and validates the limit query parameter.
|
|
284
|
-
*
|
|
285
|
-
* Converts the limit string to a number with appropriate defaults and bounds.
|
|
286
|
-
* Returns Number.MAX_SAFE_INTEGER if parsing fails to avoid artificial limits.
|
|
287
|
-
*
|
|
288
|
-
* @param limit - The limit query parameter value
|
|
289
|
-
* @returns Parsed limit number or maximum safe integer
|
|
290
|
-
*/
|
|
291
|
-
private parseLimit;
|
|
292
283
|
}
|
|
293
284
|
//# sourceMappingURL=FlowsApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsApi.d.ts","sourceRoot":"","sources":["../../../src/apis/FlowsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"FlowsApi.d.ts","sourceRoot":"","sources":["../../../src/apis/FlowsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AASpE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,QAAQ;IAMA,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IALtD,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAGjC;gBAEkC,kBAAkB,EAAE,kBAAkB;IAE1E;;;;;;;;;;;;;;;;;;OAkBG;IACU,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACU,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1E;;;;;;;;;;;;;;;OAeG;IACU,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACU,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnE;;;;;;;;;;;;;;;;;;OAkBG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnE;;;;;;;;;;;;;;;OAeG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnE;;;;;;;;;;;;;;OAcG;IACU,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxE;;;;;;;;;;;;;;;;;;;OAmBG;IACU,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlE;;;;;;;;;;;;;;;;;;OAkBG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnE;;;;;;;;;;;;;;;;;;OAkBG;IACU,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAKpE"}
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.FlowsApi = void 0;
|
|
4
4
|
const CreateDonobuFlow_1 = require("../models/CreateDonobuFlow");
|
|
5
5
|
const FlowMetadata_1 = require("../models/FlowMetadata");
|
|
6
|
-
const InvalidParamValueException_1 = require("../exceptions/InvalidParamValueException");
|
|
7
6
|
const zod_1 = require("zod");
|
|
7
|
+
const CodeGenerationOptions_1 = require("../models/CodeGenerationOptions");
|
|
8
8
|
/**
|
|
9
9
|
* API controller for managing Donobu flows throughout their lifecycle.
|
|
10
10
|
*
|
|
@@ -53,10 +53,8 @@ class FlowsApi {
|
|
|
53
53
|
*/
|
|
54
54
|
async getFlowAsCode(req, res) {
|
|
55
55
|
const flowId = req.params.flowId;
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
disableSelectorFailover: false,
|
|
59
|
-
});
|
|
56
|
+
const options = CodeGenerationOptions_1.CodeGenerationOptionsSchema.optional().parse(req.query);
|
|
57
|
+
const draftedPlaywrightScript = await this.donobuFlowsManager.getFlowAsPlaywrightScript(flowId, options ?? FlowsApi.DEFAULT_CODE_OPTIONS);
|
|
60
58
|
res.send({ script: draftedPlaywrightScript });
|
|
61
59
|
}
|
|
62
60
|
/**
|
|
@@ -74,7 +72,11 @@ class FlowsApi {
|
|
|
74
72
|
* Content-Type: application/json
|
|
75
73
|
*
|
|
76
74
|
* {
|
|
77
|
-
* "flowIds": ["
|
|
75
|
+
* "flowIds": [ "flowId1", "flowId2", "flowId3" ],
|
|
76
|
+
* "options": {
|
|
77
|
+
* "areElementIdsVolatile": true,
|
|
78
|
+
* "disableSelectorFailover": true
|
|
79
|
+
* }
|
|
78
80
|
* }
|
|
79
81
|
*
|
|
80
82
|
* Response:
|
|
@@ -94,12 +96,12 @@ class FlowsApi {
|
|
|
94
96
|
*/
|
|
95
97
|
async getFlowsAsProject(req, res) {
|
|
96
98
|
const parsedBody = zod_1.z
|
|
97
|
-
.object({
|
|
99
|
+
.object({
|
|
100
|
+
flowIds: zod_1.z.array(zod_1.z.string()),
|
|
101
|
+
options: CodeGenerationOptions_1.CodeGenerationOptionsSchema.optional(),
|
|
102
|
+
})
|
|
98
103
|
.parse(req.body);
|
|
99
|
-
const project = await this.donobuFlowsManager.getFlowsAsPlaywrightProject(parsedBody.flowIds,
|
|
100
|
-
areElementIdsVolatile: false,
|
|
101
|
-
disableSelectorFailover: false,
|
|
102
|
-
});
|
|
104
|
+
const project = await this.donobuFlowsManager.getFlowsAsPlaywrightProject(parsedBody.flowIds, parsedBody.options ?? FlowsApi.DEFAULT_CODE_OPTIONS);
|
|
103
105
|
res.json({
|
|
104
106
|
files: project.files,
|
|
105
107
|
});
|
|
@@ -119,8 +121,6 @@ class FlowsApi {
|
|
|
119
121
|
*
|
|
120
122
|
* Response: CreateDonobuFlow object ready for POST to /api/flows
|
|
121
123
|
* ```
|
|
122
|
-
*
|
|
123
|
-
* @public
|
|
124
124
|
*/
|
|
125
125
|
async getFlowAsRerun(req, res) {
|
|
126
126
|
const flowId = req.params.flowId;
|
|
@@ -168,39 +168,7 @@ class FlowsApi {
|
|
|
168
168
|
* - `startedBefore`: Unix timestamp - flows started before this time
|
|
169
169
|
*/
|
|
170
170
|
async getFlows(req, res) {
|
|
171
|
-
const query =
|
|
172
|
-
pageToken: req.query.pageToken,
|
|
173
|
-
limit: this.parseLimit(req.query.limit),
|
|
174
|
-
name: req.query.name,
|
|
175
|
-
runMode: req.query.runMode,
|
|
176
|
-
state: req.query.state,
|
|
177
|
-
startedAfter: req.query.startedAfter
|
|
178
|
-
? parseInt(req.query.startedAfter)
|
|
179
|
-
: undefined,
|
|
180
|
-
startedBefore: req.query.startedBefore
|
|
181
|
-
? parseInt(req.query.startedBefore)
|
|
182
|
-
: undefined,
|
|
183
|
-
};
|
|
184
|
-
// Validate numeric startedAfter.
|
|
185
|
-
if (req.query.startedAfter &&
|
|
186
|
-
query.startedAfter &&
|
|
187
|
-
isNaN(query.startedAfter)) {
|
|
188
|
-
throw new InvalidParamValueException_1.InvalidParamValueException('startedAfter', '' + req.query.startedAfter);
|
|
189
|
-
}
|
|
190
|
-
// Validate numeric startedBefore.
|
|
191
|
-
if (req.query.startedBefore &&
|
|
192
|
-
query.startedBefore &&
|
|
193
|
-
isNaN(query.startedBefore)) {
|
|
194
|
-
throw new InvalidParamValueException_1.InvalidParamValueException('startedBefore', '' + req.query.startedBefore);
|
|
195
|
-
}
|
|
196
|
-
// Validate that runMode is a valid enum value.
|
|
197
|
-
if (query.runMode && !FlowMetadata_1.RunModeSchema.options.includes(query.runMode)) {
|
|
198
|
-
throw new InvalidParamValueException_1.InvalidParamValueException('runMode', query.runMode);
|
|
199
|
-
}
|
|
200
|
-
// Validate that state is a valid enum value.
|
|
201
|
-
if (query.state && !FlowMetadata_1.StateSchema.options.includes(query.state)) {
|
|
202
|
-
throw new InvalidParamValueException_1.InvalidParamValueException('state', query.state);
|
|
203
|
-
}
|
|
171
|
+
const query = FlowMetadata_1.FlowsQuerySchema.parse(req.query);
|
|
204
172
|
const flows = await this.donobuFlowsManager.getFlows(query);
|
|
205
173
|
res.json({ flows: flows.items, nextPageToken: flows.nextPageToken });
|
|
206
174
|
}
|
|
@@ -295,8 +263,6 @@ class FlowsApi {
|
|
|
295
263
|
*
|
|
296
264
|
* Response: Complete FlowMetadata object
|
|
297
265
|
* ```
|
|
298
|
-
*
|
|
299
|
-
* @public
|
|
300
266
|
*/
|
|
301
267
|
async getFlowMetadata(req, res) {
|
|
302
268
|
const flowId = req.params.flowId;
|
|
@@ -382,23 +348,10 @@ class FlowsApi {
|
|
|
382
348
|
const metadata = await this.donobuFlowsManager.cancelFlow(flowId);
|
|
383
349
|
res.json(metadata);
|
|
384
350
|
}
|
|
385
|
-
/**
|
|
386
|
-
* Parses and validates the limit query parameter.
|
|
387
|
-
*
|
|
388
|
-
* Converts the limit string to a number with appropriate defaults and bounds.
|
|
389
|
-
* Returns Number.MAX_SAFE_INTEGER if parsing fails to avoid artificial limits.
|
|
390
|
-
*
|
|
391
|
-
* @param limit - The limit query parameter value
|
|
392
|
-
* @returns Parsed limit number or maximum safe integer
|
|
393
|
-
*/
|
|
394
|
-
parseLimit(limit) {
|
|
395
|
-
try {
|
|
396
|
-
return limit ? parseInt(limit) : Number.MAX_SAFE_INTEGER;
|
|
397
|
-
}
|
|
398
|
-
catch {
|
|
399
|
-
return Number.MAX_SAFE_INTEGER;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
351
|
}
|
|
403
352
|
exports.FlowsApi = FlowsApi;
|
|
353
|
+
FlowsApi.DEFAULT_CODE_OPTIONS = {
|
|
354
|
+
areElementIdsVolatile: false,
|
|
355
|
+
disableSelectorFailover: false,
|
|
356
|
+
};
|
|
404
357
|
//# sourceMappingURL=FlowsApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsApi.js","sourceRoot":"","sources":["../../../src/apis/FlowsApi.ts"],"names":[],"mappings":";;;AAEA,iEAAoE;AACpE,
|
|
1
|
+
{"version":3,"file":"FlowsApi.js","sourceRoot":"","sources":["../../../src/apis/FlowsApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
1281
|
|
@@ -241,7 +241,7 @@ function generateMarkdown(jsonData) {
|
|
|
241
241
|
});
|
|
242
242
|
|
|
243
243
|
// Add timestamp footer
|
|
244
|
-
markdown += `_Report generated on ${new Date().toLocaleString()}
|
|
244
|
+
markdown += `_Report generated on ${new Date().toLocaleString()} by Donobu_\n`;
|
|
245
245
|
|
|
246
246
|
return markdown;
|
|
247
247
|
}
|