automation_model 1.0.660-dev → 1.0.660-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 (60) hide show
  1. package/README.md +3 -1
  2. package/lib/analyze_helper.js.map +1 -1
  3. package/lib/api.d.ts +0 -1
  4. package/lib/api.js +6 -3
  5. package/lib/api.js.map +1 -1
  6. package/lib/auto_page.d.ts +1 -1
  7. package/lib/auto_page.js +145 -58
  8. package/lib/auto_page.js.map +1 -1
  9. package/lib/browser_manager.js +28 -8
  10. package/lib/browser_manager.js.map +1 -1
  11. package/lib/bruno.d.ts +2 -0
  12. package/lib/bruno.js +381 -0
  13. package/lib/bruno.js.map +1 -0
  14. package/lib/command_common.d.ts +1 -1
  15. package/lib/command_common.js +24 -4
  16. package/lib/command_common.js.map +1 -1
  17. package/lib/date_time.js.map +1 -1
  18. package/lib/drawRect.js.map +1 -1
  19. package/lib/environment.d.ts +1 -0
  20. package/lib/environment.js +1 -0
  21. package/lib/environment.js.map +1 -1
  22. package/lib/error-messages.js.map +1 -1
  23. package/lib/file_checker.d.ts +1 -0
  24. package/lib/file_checker.js +61 -0
  25. package/lib/file_checker.js.map +1 -0
  26. package/lib/find_function.js.map +1 -1
  27. package/lib/index.d.ts +2 -0
  28. package/lib/index.js +2 -0
  29. package/lib/index.js.map +1 -1
  30. package/lib/init_browser.js +4 -4
  31. package/lib/init_browser.js.map +1 -1
  32. package/lib/locate_element.js.map +1 -1
  33. package/lib/locator.d.ts +1 -0
  34. package/lib/locator.js +10 -3
  35. package/lib/locator.js.map +1 -1
  36. package/lib/locator_log.js.map +1 -1
  37. package/lib/network.js.map +1 -1
  38. package/lib/route.d.ts +33 -0
  39. package/lib/route.js +268 -0
  40. package/lib/route.js.map +1 -0
  41. package/lib/scripts/axe.mini.js +3 -3
  42. package/lib/snapshot_validation.d.ts +37 -0
  43. package/lib/snapshot_validation.js +357 -0
  44. package/lib/snapshot_validation.js.map +1 -0
  45. package/lib/stable_browser.d.ts +64 -25
  46. package/lib/stable_browser.js +1036 -223
  47. package/lib/stable_browser.js.map +1 -1
  48. package/lib/table.d.ts +9 -7
  49. package/lib/table.js +82 -12
  50. package/lib/table.js.map +1 -1
  51. package/lib/table_analyze.js.map +1 -1
  52. package/lib/table_helper.js +15 -0
  53. package/lib/table_helper.js.map +1 -1
  54. package/lib/test_context.d.ts +1 -0
  55. package/lib/test_context.js +1 -0
  56. package/lib/test_context.js.map +1 -1
  57. package/lib/utils.d.ts +16 -2
  58. package/lib/utils.js +104 -58
  59. package/lib/utils.js.map +1 -1
  60. package/package.json +13 -6
package/lib/route.js ADDED
@@ -0,0 +1,268 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+ let loadedRoutes = null;
4
+ async function loadRoutes() {
5
+ if (loadedRoutes !== null)
6
+ return loadedRoutes;
7
+ try {
8
+ const dir = path.join(process.cwd(), "data", "routes");
9
+ if (!(await folderExists(dir))) {
10
+ loadedRoutes = [];
11
+ return loadedRoutes;
12
+ }
13
+ const files = await fs.readdir(dir);
14
+ const jsonFiles = files.filter((f) => f.endsWith(".json"));
15
+ const allRoutes = [];
16
+ for (const file of jsonFiles) {
17
+ const content = await fs.readFile(path.join(dir, file), "utf-8");
18
+ const routeObj = JSON.parse(content);
19
+ allRoutes.push(routeObj);
20
+ }
21
+ loadedRoutes = allRoutes;
22
+ }
23
+ catch (error) {
24
+ console.error("Error loading routes:", error);
25
+ loadedRoutes = [];
26
+ }
27
+ return loadedRoutes;
28
+ }
29
+ function matchRoute(routeItem, req) {
30
+ const url = new URL(req.request().url());
31
+ const methodMatch = !routeItem.filters.method || routeItem.filters.method === req.request().method();
32
+ const pathMatch = routeItem.filters.path === url.pathname;
33
+ const queryMatch = !routeItem.filters.queryParams || routeItem.filters.queryParams.every((p) => url.searchParams.has(p));
34
+ return methodMatch && pathMatch && queryMatch;
35
+ }
36
+ let debug = false;
37
+ export async function registerBeforeStepRoutes(context, stepName) {
38
+ const page = context.web.page;
39
+ if (!page)
40
+ throw new Error("context.web.page is missing");
41
+ const stepTemplate = _stepNameToTemplate(stepName);
42
+ const routes = await loadRoutes();
43
+ const matchedRouteDefs = routes.filter((r) => r.template === stepTemplate);
44
+ const allRouteItems = matchedRouteDefs.flatMap((r) => r.routes);
45
+ if (!context.__routeState) {
46
+ context.__routeState = { matched: [] };
47
+ }
48
+ // Pre-register all mandatory routes
49
+ for (const item of allRouteItems) {
50
+ if (item.mandatory) {
51
+ const tracking = {
52
+ routeItem: item,
53
+ url: "",
54
+ completed: false,
55
+ startedAt: Date.now(),
56
+ actionResults: [],
57
+ };
58
+ tracking.timer = setTimeout(() => {
59
+ if (!tracking.completed) {
60
+ console.error(`[MANDATORY] Request to ${item.filters.path} did not complete within ${item.timeout}ms`);
61
+ }
62
+ }, item.timeout);
63
+ context.__routeState.matched.push(tracking);
64
+ }
65
+ }
66
+ page.route("**/*", async (route) => {
67
+ const request = route.request();
68
+ // print the url if debug is enabled
69
+ if (debug) {
70
+ console.log(`Intercepting request: ${request.method()} ${request.url()}`);
71
+ }
72
+ const matchedItem = allRouteItems.find((item) => matchRoute(item, route));
73
+ if (!matchedItem)
74
+ return route.continue();
75
+ if (debug) {
76
+ console.log(`Matched route item: ${JSON.stringify(matchedItem)}`);
77
+ }
78
+ // Find pre-registered tracker
79
+ let tracking = context.__routeState.matched.find((t) => t.routeItem === matchedItem && !t.completed);
80
+ // If not mandatory, register dynamically
81
+ if (!tracking) {
82
+ tracking = {
83
+ routeItem: matchedItem,
84
+ url: request.url(),
85
+ completed: false,
86
+ startedAt: Date.now(),
87
+ actionResults: [],
88
+ };
89
+ context.__routeState.matched.push(tracking);
90
+ }
91
+ else {
92
+ tracking.url = request.url();
93
+ }
94
+ let response;
95
+ try {
96
+ response = await route.fetch();
97
+ }
98
+ catch (e) {
99
+ console.error("Fetch failed for", request.url(), e);
100
+ if (tracking?.timer)
101
+ clearTimeout(tracking.timer);
102
+ return route.abort();
103
+ }
104
+ let status = response.status();
105
+ let body = await response.text();
106
+ let headers = response.headers();
107
+ let json;
108
+ try {
109
+ json = JSON.parse(body);
110
+ }
111
+ catch (_) { }
112
+ const actionResults = [];
113
+ for (const action of matchedItem.actions) {
114
+ let actionStatus = "success";
115
+ const description = JSON.stringify(action.config);
116
+ switch (action.type) {
117
+ case "status_code_verification":
118
+ if (status !== action.config) {
119
+ console.error(`[status_code_verification] Expected ${action.config}, got ${status}`);
120
+ actionStatus = "fail";
121
+ }
122
+ else {
123
+ console.log(`[status_code_verification] Passed`);
124
+ }
125
+ break;
126
+ case "json_modify":
127
+ if (!json) {
128
+ console.error(`[json_modify] Response is not JSON`);
129
+ actionStatus = "fail";
130
+ }
131
+ else {
132
+ for (const mod of action.config) {
133
+ const pathParts = mod.path.split(".");
134
+ let obj = json;
135
+ for (let i = 0; i < pathParts.length - 1; i++) {
136
+ obj = obj?.[pathParts[i]];
137
+ if (!obj)
138
+ break;
139
+ }
140
+ const lastKey = pathParts[pathParts.length - 1];
141
+ if (obj)
142
+ obj[lastKey] = mod.value;
143
+ }
144
+ console.log(`[json_modify] Modified JSON`);
145
+ }
146
+ break;
147
+ case "status_code_change":
148
+ status = action.config;
149
+ console.log(`[status_code_change] Status changed to ${status}`);
150
+ break;
151
+ case "change_text":
152
+ if (!headers["content-type"]?.includes("text/html")) {
153
+ console.error(`[change_text] Content-Type is not text/html`);
154
+ actionStatus = "fail";
155
+ }
156
+ else {
157
+ body = action.config;
158
+ console.log(`[change_text] HTML body replaced`);
159
+ }
160
+ break;
161
+ default:
162
+ console.warn(`Unknown action type: ${action.type}`);
163
+ }
164
+ actionResults.push({ type: action.type, description, status: actionStatus });
165
+ }
166
+ tracking.completed = true;
167
+ tracking.actionResults = actionResults;
168
+ if (tracking.timer)
169
+ clearTimeout(tracking.timer);
170
+ const responseBody = json ? JSON.stringify(json) : body;
171
+ await route.fulfill({ status, body: responseBody, headers });
172
+ });
173
+ }
174
+ export async function registerAfterStepRoutes(context) {
175
+ const state = context.__routeState;
176
+ if (!state)
177
+ return [];
178
+ const mandatoryRoutes = state.matched.filter((tracked) => tracked.routeItem.mandatory);
179
+ if (mandatoryRoutes.length === 0) {
180
+ context.__routeState = null;
181
+ return [];
182
+ }
183
+ const maxTimeout = Math.max(...mandatoryRoutes.map((r) => r.routeItem.timeout));
184
+ const startTime = Date.now();
185
+ await new Promise((resolve) => {
186
+ const interval = setInterval(() => {
187
+ const allCompleted = mandatoryRoutes.every((r) => r.completed);
188
+ const elapsed = Date.now() - startTime;
189
+ if (allCompleted || elapsed >= maxTimeout) {
190
+ mandatoryRoutes.forEach((r) => {
191
+ if (!r.completed) {
192
+ console.error(`[MANDATORY] Request to ${r.routeItem.filters.path} did not complete within ${r.routeItem.timeout}ms`);
193
+ }
194
+ });
195
+ clearInterval(interval);
196
+ resolve();
197
+ }
198
+ }, 100);
199
+ });
200
+ const results = mandatoryRoutes.map((tracked) => {
201
+ const { routeItem, url, completed, actionResults = [] } = tracked;
202
+ const actions = actionResults.map((ar) => {
203
+ let status = ar.status;
204
+ if (!completed)
205
+ status = "timeout";
206
+ return {
207
+ type: ar.type,
208
+ description: ar.description,
209
+ status,
210
+ };
211
+ });
212
+ let overallStatus;
213
+ if (!completed) {
214
+ overallStatus = "timeout";
215
+ }
216
+ else if (actions.some((a) => a.status === "fail")) {
217
+ overallStatus = "fail";
218
+ }
219
+ else {
220
+ overallStatus = "success";
221
+ }
222
+ return {
223
+ url,
224
+ filters: routeItem.filters,
225
+ actions,
226
+ overallStatus,
227
+ };
228
+ });
229
+ context.__routeState = null;
230
+ context.routeResults = results;
231
+ return results;
232
+ }
233
+ // Helper functions
234
+ const toCucumberExpression = (text) => text.replaceAll("/", "\\\\/").replaceAll("(", "\\\\(").replaceAll("{", "\\\\{");
235
+ function extractQuotedText(inputString) {
236
+ const regex = /("[^"]*")/g;
237
+ let matches = [];
238
+ let match;
239
+ const regexInside = /"\/(.*?)\/"/g;
240
+ while ((match = regexInside.exec(inputString)) !== null) {
241
+ matches.push(match[0]);
242
+ }
243
+ while ((match = regex.exec(inputString)) !== null) {
244
+ matches.push(match[1]);
245
+ }
246
+ return matches;
247
+ }
248
+ function _stepNameToTemplate(stepName) {
249
+ if (stepName.includes("{string}")) {
250
+ return stepName;
251
+ }
252
+ let result = toCucumberExpression(stepName);
253
+ const texts = extractQuotedText(result);
254
+ texts.forEach((t) => {
255
+ result = result.replace(t, "{string}");
256
+ });
257
+ return result;
258
+ }
259
+ async function folderExists(path) {
260
+ try {
261
+ const stat = await fs.stat(path);
262
+ return stat.isDirectory();
263
+ }
264
+ catch (err) {
265
+ return false;
266
+ }
267
+ }
268
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/route.ts"],"names":[],"mappings":"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"}