automation_model 1.0.731-dev → 1.0.731-stage

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.
Files changed (47) hide show
  1. package/README.md +4 -1
  2. package/lib/api.js +4 -3
  3. package/lib/api.js.map +1 -1
  4. package/lib/auto_page.d.ts +4 -2
  5. package/lib/auto_page.js +153 -86
  6. package/lib/auto_page.js.map +1 -1
  7. package/lib/browser_manager.js +19 -25
  8. package/lib/browser_manager.js.map +1 -1
  9. package/lib/bruno.js.map +1 -1
  10. package/lib/check_performance.d.ts +1 -0
  11. package/lib/check_performance.js +57 -0
  12. package/lib/check_performance.js.map +1 -0
  13. package/lib/command_common.js +18 -2
  14. package/lib/command_common.js.map +1 -1
  15. package/lib/file_checker.js +129 -25
  16. package/lib/file_checker.js.map +1 -1
  17. package/lib/index.js +1 -0
  18. package/lib/index.js.map +1 -1
  19. package/lib/init_browser.d.ts +1 -2
  20. package/lib/init_browser.js +121 -125
  21. package/lib/init_browser.js.map +1 -1
  22. package/lib/locator.d.ts +1 -0
  23. package/lib/locator.js +9 -2
  24. package/lib/locator.js.map +1 -1
  25. package/lib/network.d.ts +2 -0
  26. package/lib/network.js +374 -86
  27. package/lib/network.js.map +1 -1
  28. package/lib/route.d.ts +21 -0
  29. package/lib/route.js +535 -0
  30. package/lib/route.js.map +1 -0
  31. package/lib/scripts/axe.mini.js +3 -3
  32. package/lib/snapshot_validation.js.map +1 -1
  33. package/lib/stable_browser.d.ts +27 -2
  34. package/lib/stable_browser.js +791 -58
  35. package/lib/stable_browser.js.map +1 -1
  36. package/lib/table.d.ts +9 -7
  37. package/lib/table.js +82 -12
  38. package/lib/table.js.map +1 -1
  39. package/lib/table_helper.js +14 -0
  40. package/lib/table_helper.js.map +1 -1
  41. package/lib/test_context.d.ts +1 -0
  42. package/lib/test_context.js +1 -0
  43. package/lib/test_context.js.map +1 -1
  44. package/lib/utils.d.ts +3 -1
  45. package/lib/utils.js +38 -6
  46. package/lib/utils.js.map +1 -1
  47. package/package.json +11 -9
package/lib/route.js ADDED
@@ -0,0 +1,535 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+ import objectPath from "object-path";
4
+ import { tmpdir } from "os";
5
+ import createDebug from "debug";
6
+ import { existsSync } from "fs";
7
+ const debug = createDebug("automation_model:route");
8
+ async function loadRoutes(context) {
9
+ if (context.loadedRoutes !== null)
10
+ return context.loadedRoutes;
11
+ try {
12
+ let dir = path.join(process.cwd(), "data", "routes");
13
+ if (process.env.TEMP_RUN === "true") {
14
+ dir = path.join(tmpdir(), "blinq_temp_routes");
15
+ }
16
+ if (!(await folderExists(dir))) {
17
+ context.loadedRoutes = [];
18
+ return context.loadedRoutes;
19
+ }
20
+ const files = await fs.readdir(dir);
21
+ const jsonFiles = files.filter((f) => f.endsWith(".json"));
22
+ const allRoutes = [];
23
+ for (const file of jsonFiles) {
24
+ const content = await fs.readFile(path.join(dir, file), "utf-8");
25
+ const routeObj = JSON.parse(content);
26
+ allRoutes.push(routeObj);
27
+ }
28
+ context.loadedRoutes = allRoutes;
29
+ debug(`Loaded ${allRoutes.length} route definitions from ${dir}`);
30
+ }
31
+ catch (error) {
32
+ console.error("Error loading routes:", error);
33
+ context.loadedRoutes = [];
34
+ }
35
+ return context.loadedRoutes;
36
+ }
37
+ function matchRoute(routeItem, req) {
38
+ const url = new URL(req.request().url());
39
+ const methodMatch = !routeItem.filters.method || routeItem.filters.method === req.request().method();
40
+ const pathMatch = routeItem.filters.path === url.pathname;
41
+ const queryParams = routeItem.filters.queryParams;
42
+ const queryMatch = !queryParams || Object.entries(queryParams).every(([key, value]) => url.searchParams.get(key) === value);
43
+ return methodMatch && pathMatch && queryMatch;
44
+ }
45
+ export async function registerBeforeStepRoutes(context, stepName, world) {
46
+ const page = context.web.page;
47
+ if (!page)
48
+ throw new Error("context.web.page is missing");
49
+ const stepTemplate = _stepNameToTemplate(stepName);
50
+ const routes = await loadRoutes(context);
51
+ const matchedRouteDefs = routes.filter((r) => r.template === stepTemplate);
52
+ const allRouteItems = matchedRouteDefs.flatMap((r) => r.routes);
53
+ if (!context.__routeState) {
54
+ context.__routeState = { matched: [] };
55
+ }
56
+ for (const item of allRouteItems) {
57
+ if (item.mandatory) {
58
+ const tracking = {
59
+ routeItem: item,
60
+ url: "",
61
+ completed: false,
62
+ startedAt: Date.now(),
63
+ actionResults: [],
64
+ };
65
+ context.__routeState.matched.push(tracking);
66
+ }
67
+ }
68
+ let message = null;
69
+ page.route("**/*", async (route) => {
70
+ const request = route.request();
71
+ debug(`Intercepting request: ${request.method()} ${request.url()}`);
72
+ const matchedItem = allRouteItems.find((item) => matchRoute(item, route));
73
+ if (!matchedItem)
74
+ return route.continue();
75
+ debug(`Matched route item: ${JSON.stringify(matchedItem)}`);
76
+ let tracking = context.__routeState.matched.find((t) => t.routeItem === matchedItem && !t.completed);
77
+ let stubActionPerformed = false;
78
+ if (!tracking) {
79
+ tracking = {
80
+ routeItem: matchedItem,
81
+ url: request.url(),
82
+ completed: false,
83
+ startedAt: Date.now(),
84
+ actionResults: [],
85
+ };
86
+ context.__routeState.matched.push(tracking);
87
+ }
88
+ else {
89
+ tracking.url = request.url();
90
+ }
91
+ const stubAction = matchedItem.actions.find((a) => a.type === "stub_request");
92
+ if (stubAction) {
93
+ let actionStatus = "success";
94
+ const description = JSON.stringify(stubAction.config);
95
+ debug(`Stub action found for ${request.url()}. Skipping fetch.`);
96
+ if (tracking.timer)
97
+ clearTimeout(tracking.timer);
98
+ const fullFillConfig = {};
99
+ if (stubAction.config.path) {
100
+ const filePath = path.join(process.cwd(), "data", "fixtures", stubAction.config.path);
101
+ debug(`Stub action file path: ${filePath}`);
102
+ if (existsSync(filePath)) {
103
+ fullFillConfig.path = filePath;
104
+ debug(`Stub action fulfilled with file: ${filePath}`);
105
+ }
106
+ else {
107
+ actionStatus = "fail";
108
+ tracking.actionResults.push({
109
+ type: "stub_request",
110
+ description,
111
+ status: actionStatus,
112
+ message: `Stub action failed for ${tracking.url}: File not found at ${filePath}`,
113
+ });
114
+ stubActionPerformed = true;
115
+ }
116
+ }
117
+ if (!fullFillConfig.path) {
118
+ if (stubAction.config.statusCode) {
119
+ fullFillConfig.status = Number(stubAction.config.statusCode);
120
+ }
121
+ if (stubAction.config.contentType) {
122
+ if (stubAction.config.contentType === "application/json") {
123
+ fullFillConfig.contentType = "application/json";
124
+ if (stubAction.config.body) {
125
+ try {
126
+ fullFillConfig.json = JSON.parse(stubAction.config.body);
127
+ }
128
+ catch (e) {
129
+ debug(`Invalid JSON in stub action body: ${stubAction.config.body}, `, e instanceof Error ? e.message : String(e));
130
+ debug("Invalid JSON, defaulting to empty object");
131
+ fullFillConfig.json = {};
132
+ }
133
+ }
134
+ }
135
+ else {
136
+ fullFillConfig.contentType = stubAction.config.contentType;
137
+ fullFillConfig.body = stubAction.config.body || "";
138
+ }
139
+ }
140
+ if (!fullFillConfig.json && !fullFillConfig.body) {
141
+ if (stubAction.config.body) {
142
+ fullFillConfig.body = stubAction.config.body;
143
+ }
144
+ }
145
+ }
146
+ if (actionStatus === "success") {
147
+ try {
148
+ route.fulfill(fullFillConfig);
149
+ stubActionPerformed = true;
150
+ tracking.completed = true;
151
+ tracking.actionResults.push({
152
+ type: "stub_request",
153
+ description,
154
+ status: actionStatus,
155
+ message: `Stub action executed for ${request.url()}`,
156
+ });
157
+ }
158
+ catch (e) {
159
+ actionStatus = "fail";
160
+ debug(`Failed to fulfill stub request for ${request.url()}`, e);
161
+ tracking.actionResults.push({
162
+ type: "stub_request",
163
+ description,
164
+ status: actionStatus,
165
+ message: `Stub action failed for ${request.url()}: ${e instanceof Error ? e.message : String(e)}`,
166
+ });
167
+ }
168
+ }
169
+ }
170
+ if (!stubActionPerformed) {
171
+ let response;
172
+ try {
173
+ response = await route.fetch();
174
+ }
175
+ catch (e) {
176
+ console.error("Fetch failed for", request.url(), e);
177
+ if (tracking?.timer)
178
+ clearTimeout(tracking.timer);
179
+ return route.abort();
180
+ }
181
+ let status = response.status();
182
+ let headers = response.headers();
183
+ const isBinary = !headers["content-type"]?.includes("application/json") &&
184
+ !headers["content-type"]?.includes("text") &&
185
+ !headers["content-type"]?.includes("application/csv");
186
+ const isJSON = headers["content-type"]?.includes("application/json") || headers["content-type"]?.includes("json")
187
+ ? true
188
+ : false;
189
+ let body;
190
+ if (isBinary) {
191
+ body = await response.body(); // returns a Buffer
192
+ }
193
+ else {
194
+ body = await response.text();
195
+ }
196
+ let json;
197
+ try {
198
+ // check if the body is string
199
+ if (typeof body === "string") {
200
+ json = JSON.parse(body);
201
+ }
202
+ }
203
+ catch (_) { }
204
+ const actionResults = [];
205
+ let abortActionPerformed = false;
206
+ let finalBody = isJSON && json ? json : body;
207
+ for (const action of matchedItem.actions) {
208
+ let actionStatus = "success";
209
+ const description = JSON.stringify(action.config);
210
+ switch (action.type) {
211
+ case "abort_request":
212
+ if (tracking?.timer)
213
+ clearTimeout(tracking.timer);
214
+ const errorCode = action.config?.errorCode ?? "failed";
215
+ console.log(`[abort_request] Aborting with error code: ${errorCode}`);
216
+ await route.abort(errorCode);
217
+ abortActionPerformed = true;
218
+ tracking.completed = true;
219
+ break;
220
+ case "status_code_verification":
221
+ if (String(status) !== String(action.config)) {
222
+ actionStatus = "fail";
223
+ tracking.actionResults = actionResults;
224
+ message = `Status code verification failed. Expected ${action.config}, got ${status}`;
225
+ }
226
+ else {
227
+ console.log(`[status_code_verification] Passed`);
228
+ message = `Status code verification passed. Expected ${action.config}, got ${status}`;
229
+ }
230
+ break;
231
+ case "json_modify":
232
+ if (!json) {
233
+ actionStatus = "fail";
234
+ tracking.actionResults = actionResults;
235
+ message = "JSON modification failed. Response is not JSON";
236
+ }
237
+ else {
238
+ if (action.config && action.config.path && action.config.modifyValue) {
239
+ objectPath.set(json, action.config.path, action.config.modifyValue);
240
+ console.log(`[json_modify] Modified path ${action.config.path} to ${action.config.modifyValue}`);
241
+ console.log(`[json_modify] Modified JSON`);
242
+ message = `JSON modified successfully`;
243
+ finalBody = JSON.parse(JSON.stringify(json));
244
+ }
245
+ }
246
+ break;
247
+ case "json_whole_modify":
248
+ if (!json) {
249
+ actionStatus = "fail";
250
+ tracking.actionResults = actionResults;
251
+ message = "JSON modification failed. Response is not JSON";
252
+ }
253
+ else {
254
+ try {
255
+ const parsedConfig = JSON.parse(action.config);
256
+ json = parsedConfig;
257
+ finalBody = JSON.parse(JSON.stringify(json));
258
+ }
259
+ catch (e) {
260
+ actionStatus = "fail";
261
+ tracking.actionResults = actionResults;
262
+ message = `JSON modification failed. Invalid JSON: ${e instanceof Error ? e.message : String(e)}`;
263
+ console.error(`[json_whole_modify] Invalid JSON:`, e);
264
+ break;
265
+ }
266
+ console.log(`[json_whole_modify] Whole JSON replaced`);
267
+ message = `JSON replaced successfully`;
268
+ }
269
+ break;
270
+ case "status_code_change":
271
+ status = Number(action.config);
272
+ console.log(`[status_code_change] Status changed to ${status}`);
273
+ message = `Status code changed to ${status}`;
274
+ break;
275
+ case "change_text":
276
+ if (isBinary) {
277
+ actionStatus = "fail";
278
+ tracking.actionResults = actionResults;
279
+ message = "Change text action failed. Body is not a text";
280
+ }
281
+ else {
282
+ body = action.config;
283
+ console.log(`[change_text] HTML body replaced`);
284
+ message = `HTML body replaced successfully`;
285
+ finalBody = body;
286
+ }
287
+ break;
288
+ case "assert_json":
289
+ if (!json) {
290
+ actionStatus = "fail";
291
+ tracking.actionResults = actionResults;
292
+ message = "JSON assertion failed. Response is not JSON";
293
+ }
294
+ else {
295
+ const actual = objectPath.get(json, action.config.path);
296
+ if (typeof actual !== "object") {
297
+ if (JSON.stringify(actual) !== JSON.stringify(action.config.expectedValue)) {
298
+ actionStatus = "fail";
299
+ tracking.actionResults = actionResults;
300
+ message = `JSON assertion failed for path ${action.config.path}: expected ${JSON.stringify(action.config.expectedValue)}, got ${JSON.stringify(actual)}`;
301
+ }
302
+ }
303
+ else if (JSON.stringify(actual) !== action.config.expectedValue) {
304
+ actionStatus = "fail";
305
+ tracking.actionResults = actionResults;
306
+ message = `JSON assertion failed for path ${action.config.path}: expected ${action.config.expectedValue}, got ${JSON.stringify(actual)}`;
307
+ }
308
+ else {
309
+ console.log(`[assert_json] Assertion passed for path ${action.config.path}`);
310
+ message = `JSON assertion passed for path ${action.config.path}`;
311
+ }
312
+ }
313
+ break;
314
+ case "assert_whole_json":
315
+ if (!json) {
316
+ actionStatus = "fail";
317
+ tracking.actionResults = actionResults;
318
+ message = "Whole JSON assertion failed. Response is not JSON";
319
+ }
320
+ else {
321
+ if (action.config.contains) {
322
+ const originalJSON = JSON.stringify(json, null, 2);
323
+ if (!originalJSON.includes(action.config.contains)) {
324
+ actionStatus = "fail";
325
+ tracking.actionResults = actionResults;
326
+ message = `Whole JSON assertion failed. Expected to contain: "${action.config.contains}", actual: "${body}"`;
327
+ }
328
+ }
329
+ else if (action.config.equals) {
330
+ const originalJSON = JSON.stringify(json, null, 2);
331
+ if (originalJSON !== action.config.equals) {
332
+ actionStatus = "fail";
333
+ tracking.actionResults = actionResults;
334
+ message = `Whole JSON assertion failed. Expected exact match: "${action.config.equals}", actual: "${body}"`;
335
+ }
336
+ }
337
+ else {
338
+ console.log(`[assert_whole_json] Assertion passed`);
339
+ message = `Whole JSON assertion passed.`;
340
+ }
341
+ }
342
+ break;
343
+ case "assert_text":
344
+ if (typeof body !== "string") {
345
+ console.error(`[assert_text] Body is not text`);
346
+ actionStatus = "fail";
347
+ tracking.actionResults = actionResults;
348
+ message = "Text assertion failed. Body is not text";
349
+ }
350
+ else {
351
+ if (action.config.contains && !body.includes(action.config.contains)) {
352
+ actionStatus = "fail";
353
+ tracking.actionResults = actionResults;
354
+ message = `Text assertion failed. Expected to contain: "${action.config.contains}", actual: "${body}"`;
355
+ }
356
+ else if (action.config.equals && body !== action.config.equals) {
357
+ actionStatus = "fail";
358
+ tracking.actionResults = actionResults;
359
+ message = `Text assertion failed. Expected exact match: "${action.config.equals}", actual: "${body}"`;
360
+ }
361
+ else {
362
+ console.log(`[assert_text] Assertion passed`);
363
+ message = `Text assertion passed.`;
364
+ }
365
+ }
366
+ break;
367
+ default:
368
+ console.warn(`Unknown action type: ${action.type}`);
369
+ }
370
+ actionResults.push({ type: action.type, description, status: actionStatus, message: message });
371
+ }
372
+ tracking.completed = true;
373
+ tracking.actionResults = actionResults;
374
+ if (tracking.timer)
375
+ clearTimeout(tracking.timer);
376
+ if (!abortActionPerformed) {
377
+ try {
378
+ if (isJSON) {
379
+ await route.fulfill({ status, json: finalBody, headers });
380
+ }
381
+ else {
382
+ await route.fulfill({ status, body: finalBody, headers });
383
+ }
384
+ // await route.fulfill({ status, body: finalBody, headers });
385
+ }
386
+ catch (e) {
387
+ console.error("Failed to fulfill route:", e);
388
+ }
389
+ }
390
+ }
391
+ });
392
+ }
393
+ export async function registerAfterStepRoutes(context, world) {
394
+ const state = context.__routeState;
395
+ if (!state)
396
+ return [];
397
+ const mandatoryRoutes = state.matched.filter((tracked) => tracked.routeItem.mandatory);
398
+ if (mandatoryRoutes.length === 0) {
399
+ context.__routeState = null;
400
+ return [];
401
+ }
402
+ const maxTimeout = Math.max(...mandatoryRoutes.map((r) => r.routeItem.timeout));
403
+ const startTime = Date.now();
404
+ const mandatoryRouteReached = mandatoryRoutes.map((r) => true);
405
+ await new Promise((resolve) => {
406
+ const interval = setInterval(() => {
407
+ const now = Date.now();
408
+ const allCompleted = mandatoryRoutes.every((r) => r.completed);
409
+ const allTimedOut = mandatoryRoutes.every((r) => r.completed || now - startTime >= r.routeItem.timeout);
410
+ for (const r of mandatoryRoutes) {
411
+ const elapsed = now - startTime;
412
+ if (!r.completed && elapsed >= r.routeItem.timeout) {
413
+ mandatoryRouteReached[mandatoryRoutes.indexOf(r)] = false;
414
+ }
415
+ }
416
+ if (allCompleted || allTimedOut) {
417
+ clearInterval(interval);
418
+ resolve();
419
+ }
420
+ }, 100);
421
+ });
422
+ context.results = mandatoryRoutes.map((tracked) => {
423
+ const { routeItem, url, completed, actionResults = [] } = tracked;
424
+ const actions = actionResults.map((ar) => {
425
+ let status = ar.status;
426
+ if (!completed)
427
+ status = "timeout";
428
+ return {
429
+ type: ar.type,
430
+ description: ar.description,
431
+ status,
432
+ message: ar.message || null,
433
+ };
434
+ });
435
+ let overallStatus;
436
+ if (!completed) {
437
+ overallStatus = "timeout";
438
+ }
439
+ else if (actions.some((a) => a.status === "fail")) {
440
+ overallStatus = "fail";
441
+ }
442
+ else {
443
+ overallStatus = "success";
444
+ }
445
+ return {
446
+ url,
447
+ filters: routeItem.filters,
448
+ actions,
449
+ overallStatus,
450
+ };
451
+ });
452
+ try {
453
+ await context.web.page.unroute("**/*");
454
+ }
455
+ catch (e) {
456
+ console.error("Failed to unroute:", e);
457
+ }
458
+ context.__routeState = null;
459
+ if (context.results && context.results.length > 0) {
460
+ if (world && world.attach) {
461
+ await world.attach(JSON.stringify(context.results), "application/json+intercept-results");
462
+ }
463
+ }
464
+ const hasFailed = context.results.some((r) => r.overallStatus === "fail" || r.overallStatus === "timeout");
465
+ if (hasFailed) {
466
+ const errorMessage = context.results
467
+ .filter((r) => r.overallStatus === "fail" || r.overallStatus === "timeout")
468
+ .map((r) => `Route to ${r.url} failed with status: ${r.overallStatus}`)
469
+ .join("\n");
470
+ throw new Error(`Route verification failed:\n${errorMessage}`);
471
+ }
472
+ const hasTimedOut = context.results.some((r) => r.overallStatus === "timeout");
473
+ if (hasTimedOut) {
474
+ const timeoutMessage = context.results
475
+ .filter((r) => r.overallStatus === "timeout")
476
+ .map((r) => `Mandatory Route to ${r.url} timed out after ${r.actions[0]?.description}`)
477
+ .join("\n");
478
+ throw new Error(`Mandatory Route verification timed out:\n${timeoutMessage}`);
479
+ }
480
+ return context.results;
481
+ }
482
+ const toCucumberExpression = (text) => text.replaceAll("/", "\\\\/").replaceAll("(", "\\\\(").replaceAll("{", "\\\\{");
483
+ function extractQuotedText(inputString) {
484
+ const regex = /("[^"]*")/g;
485
+ let matches = [];
486
+ let match;
487
+ const regexInside = /"\/(.*?)\/"/g;
488
+ while ((match = regexInside.exec(inputString)) !== null) {
489
+ matches.push(match[0]);
490
+ }
491
+ while ((match = regex.exec(inputString)) !== null) {
492
+ matches.push(match[1]);
493
+ }
494
+ return matches;
495
+ }
496
+ export function _stepNameToTemplate(stepName) {
497
+ if (stepName.includes("{string}")) {
498
+ return stepName;
499
+ }
500
+ let result = toCucumberExpression(stepName);
501
+ const texts = extractQuotedText(result);
502
+ texts.forEach((t) => {
503
+ result = result.replace(t, "{string}");
504
+ });
505
+ return result;
506
+ }
507
+ async function folderExists(path) {
508
+ try {
509
+ const stat = await fs.stat(path);
510
+ return stat.isDirectory();
511
+ }
512
+ catch (err) {
513
+ return false;
514
+ }
515
+ }
516
+ const getValue = (data, pattern) => {
517
+ const path = pattern.split(".");
518
+ let lengthExists = false;
519
+ if (path[path.length - 1] === "length") {
520
+ path.pop();
521
+ lengthExists = true;
522
+ }
523
+ const value = objectPath.get(data, pattern);
524
+ if (lengthExists && Array.isArray(value)) {
525
+ return value?.length;
526
+ }
527
+ else if (hasValue(value)) {
528
+ return value;
529
+ }
530
+ return undefined;
531
+ };
532
+ const hasValue = (value) => {
533
+ return value !== undefined;
534
+ };
535
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/route.ts"],"names":[],"mappings":"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"}