@testmuai/playwright-bindings 0.1.1

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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/dist/capability.d.ts +60 -0
  4. package/dist/capability.d.ts.map +1 -0
  5. package/dist/capability.js +212 -0
  6. package/dist/capability.js.map +1 -0
  7. package/dist/config.d.ts +12 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +16 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/configure.d.ts +30 -0
  12. package/dist/configure.d.ts.map +1 -0
  13. package/dist/configure.js +53 -0
  14. package/dist/configure.js.map +1 -0
  15. package/dist/errors.d.ts +4 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +7 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/healPatch.d.ts +11 -0
  20. package/dist/healPatch.d.ts.map +1 -0
  21. package/dist/healPatch.js +82 -0
  22. package/dist/healPatch.js.map +1 -0
  23. package/dist/helpers/assertion.d.ts +23 -0
  24. package/dist/helpers/assertion.d.ts.map +1 -0
  25. package/dist/helpers/assertion.js +87 -0
  26. package/dist/helpers/assertion.js.map +1 -0
  27. package/dist/helpers/drag.d.ts +3 -0
  28. package/dist/helpers/drag.d.ts.map +1 -0
  29. package/dist/helpers/drag.js +7 -0
  30. package/dist/helpers/drag.js.map +1 -0
  31. package/dist/helpers/executeApi.d.ts +34 -0
  32. package/dist/helpers/executeApi.d.ts.map +1 -0
  33. package/dist/helpers/executeApi.js +83 -0
  34. package/dist/helpers/executeApi.js.map +1 -0
  35. package/dist/helpers/executeDb.d.ts +9 -0
  36. package/dist/helpers/executeDb.d.ts.map +1 -0
  37. package/dist/helpers/executeDb.js +23 -0
  38. package/dist/helpers/executeDb.js.map +1 -0
  39. package/dist/helpers/executeJs.d.ts +16 -0
  40. package/dist/helpers/executeJs.d.ts.map +1 -0
  41. package/dist/helpers/executeJs.js +58 -0
  42. package/dist/helpers/executeJs.js.map +1 -0
  43. package/dist/helpers/kaneCli.d.ts +2 -0
  44. package/dist/helpers/kaneCli.d.ts.map +1 -0
  45. package/dist/helpers/kaneCli.js +5 -0
  46. package/dist/helpers/kaneCli.js.map +1 -0
  47. package/dist/helpers/math.d.ts +6 -0
  48. package/dist/helpers/math.d.ts.map +1 -0
  49. package/dist/helpers/math.js +70 -0
  50. package/dist/helpers/math.js.map +1 -0
  51. package/dist/helpers/network.d.ts +23 -0
  52. package/dist/helpers/network.d.ts.map +1 -0
  53. package/dist/helpers/network.js +67 -0
  54. package/dist/helpers/network.js.map +1 -0
  55. package/dist/helpers/smartui.d.ts +3 -0
  56. package/dist/helpers/smartui.d.ts.map +1 -0
  57. package/dist/helpers/smartui.js +11 -0
  58. package/dist/helpers/smartui.js.map +1 -0
  59. package/dist/helpers/tabs.d.ts +3 -0
  60. package/dist/helpers/tabs.d.ts.map +1 -0
  61. package/dist/helpers/tabs.js +13 -0
  62. package/dist/helpers/tabs.js.map +1 -0
  63. package/dist/helpers/vision.d.ts +48 -0
  64. package/dist/helpers/vision.d.ts.map +1 -0
  65. package/dist/helpers/vision.js +169 -0
  66. package/dist/helpers/vision.js.map +1 -0
  67. package/dist/helpers/wait.d.ts +3 -0
  68. package/dist/helpers/wait.d.ts.map +1 -0
  69. package/dist/helpers/wait.js +21 -0
  70. package/dist/helpers/wait.js.map +1 -0
  71. package/dist/http.d.ts +12 -0
  72. package/dist/http.d.ts.map +1 -0
  73. package/dist/http.js +29 -0
  74. package/dist/http.js.map +1 -0
  75. package/dist/index.d.ts +56 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +34 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/log.d.ts +22 -0
  80. package/dist/log.d.ts.map +1 -0
  81. package/dist/log.js +43 -0
  82. package/dist/log.js.map +1 -0
  83. package/dist/reporters/index.d.ts +10 -0
  84. package/dist/reporters/index.d.ts.map +1 -0
  85. package/dist/reporters/index.js +7 -0
  86. package/dist/reporters/index.js.map +1 -0
  87. package/dist/reporters/local.d.ts +11 -0
  88. package/dist/reporters/local.d.ts.map +1 -0
  89. package/dist/reporters/local.js +29 -0
  90. package/dist/reporters/local.js.map +1 -0
  91. package/dist/reporters/lt.d.ts +15 -0
  92. package/dist/reporters/lt.d.ts.map +1 -0
  93. package/dist/reporters/lt.js +48 -0
  94. package/dist/reporters/lt.js.map +1 -0
  95. package/dist/reporters/null.d.ts +10 -0
  96. package/dist/reporters/null.d.ts.map +1 -0
  97. package/dist/reporters/null.js +9 -0
  98. package/dist/reporters/null.js.map +1 -0
  99. package/dist/session.d.ts +2 -0
  100. package/dist/session.d.ts.map +1 -0
  101. package/dist/session.js +61 -0
  102. package/dist/session.js.map +1 -0
  103. package/dist/step.d.ts +14 -0
  104. package/dist/step.d.ts.map +1 -0
  105. package/dist/step.js +36 -0
  106. package/dist/step.js.map +1 -0
  107. package/dist/test.d.ts +10 -0
  108. package/dist/test.d.ts.map +1 -0
  109. package/dist/test.js +5 -0
  110. package/dist/test.js.map +1 -0
  111. package/dist/testConfig.d.ts +11 -0
  112. package/dist/testConfig.d.ts.map +1 -0
  113. package/dist/testConfig.js +82 -0
  114. package/dist/testConfig.js.map +1 -0
  115. package/dist/vars.d.ts +61 -0
  116. package/dist/vars.d.ts.map +1 -0
  117. package/dist/vars.js +656 -0
  118. package/dist/vars.js.map +1 -0
  119. package/package.json +63 -0
@@ -0,0 +1,87 @@
1
+ import { fetchWithAuth } from '../http.js';
2
+ import { v } from '../vars.js';
3
+ import { config } from '../config.js';
4
+ import { log, preview } from '../log.js';
5
+ const AI_HOST = () => process.env['TESTMU_AI_API_HOST'] ?? 'http://localhost:8000';
6
+ /** Resolve a string value through the variable store; non-strings pass through. */
7
+ function resolveSub(sub) {
8
+ const rawExpected = sub.expected_value ?? sub.expected ?? '';
9
+ const rawExtracted = sub.extracted_value ?? '';
10
+ const rawDescription = sub.description ?? '';
11
+ return {
12
+ description: typeof rawDescription === 'string' ? v(rawDescription) ?? '' : rawDescription,
13
+ expected_value: typeof rawExpected === 'string' ? v(rawExpected) ?? '' : rawExpected,
14
+ extracted_value: typeof rawExtracted === 'string' ? v(rawExtracted) ?? '' : rawExtracted,
15
+ operator: sub.operator ?? 'contains',
16
+ transforms: sub.transforms ?? ['strip'],
17
+ };
18
+ }
19
+ async function callEvaluateApi(claim, compositeOp, subChecks) {
20
+ const resp = await fetchWithAuth(`${AI_HOST()}/api/v1/evaluate`, {
21
+ method: 'POST',
22
+ headers: { 'content-type': 'application/json' },
23
+ body: JSON.stringify({ claim, composite_operator: compositeOp, sub_checks: subChecks }),
24
+ });
25
+ if (!resp.ok) {
26
+ const text = await resp.text();
27
+ throw new Error(`Evaluate API error ${resp.status}: ${text}`);
28
+ }
29
+ return (await resp.json());
30
+ }
31
+ export async function verifyAssertion(page, claim, tree) {
32
+ const subChecks = tree.sub_checks ?? [];
33
+ const compositeOp = tree.composite_operator ?? 'and';
34
+ // Python prefers assertion_tree.claim over the passed-in claim
35
+ const assertionClaim = tree.claim ?? claim;
36
+ const hasStoreKeys = subChecks.some(s => s.store_key);
37
+ // Deterministic path: store_keys present, or smart mode is OFF
38
+ if (hasStoreKeys || !config.current.smart) {
39
+ log.helper(`[assertion] deterministic claim=${preview(assertionClaim, 80)}`);
40
+ const resolved = subChecks.map(resolveSub);
41
+ const result = await callEvaluateApi(assertionClaim, compositeOp, resolved);
42
+ log.helper(`[assertion] result status=${result.status ?? 'unknown'}`);
43
+ return result;
44
+ }
45
+ // Visual path: smart ON, no store_keys → screenshot-based LLM verification
46
+ log.helper(`[assertion] visual claim=${preview(assertionClaim, 80)}`);
47
+ const shotBytes = await page.screenshot();
48
+ const screenshotB64 = shotBytes.toString('base64');
49
+ const currentUrl = page.url();
50
+ const body = {
51
+ screenshot_b64: screenshotB64,
52
+ claim: assertionClaim,
53
+ current_url: currentUrl,
54
+ composite_operator: compositeOp,
55
+ sub_checks: subChecks,
56
+ step: 0,
57
+ };
58
+ if (tree.verification !== undefined) {
59
+ body['verification'] = tree.verification;
60
+ }
61
+ const resp = await fetchWithAuth(`${AI_HOST()}/api/v1/assertions/verify`, {
62
+ method: 'POST',
63
+ headers: { 'content-type': 'application/json' },
64
+ body: JSON.stringify(body),
65
+ });
66
+ if (!resp.ok) {
67
+ const text = await resp.text();
68
+ throw new Error(`Assertion API error ${resp.status}: ${text}`);
69
+ }
70
+ const result = (await resp.json());
71
+ log.helper(`[assertion] result status=${result.status ?? 'unknown'}`);
72
+ return result;
73
+ }
74
+ export async function evaluateBranch(subChecks, compositeOperator = 'and') {
75
+ const resolved = subChecks.map(resolveSub);
76
+ if (resolved.length === 0)
77
+ return false;
78
+ const claim = `Branch condition (${compositeOperator})`;
79
+ try {
80
+ const result = await callEvaluateApi(claim, compositeOperator, resolved);
81
+ return result.status === 'passed';
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ //# sourceMappingURL=assertion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertion.js","sourceRoot":"","sources":["../../src/helpers/assertion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,OAAO,GAAG,GAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,uBAAuB,CAAC;AAwB3F,mFAAmF;AACnF,SAAS,UAAU,CAAC,GAAa;IAC/B,MAAM,WAAW,GAAG,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC7D,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;IAC/C,MAAM,cAAc,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAE7C,OAAO;QACL,WAAW,EAAE,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAU,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc;QACnG,cAAc,EAAE,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAU,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW;QAC7F,eAAe,EAAE,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAU,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY;QACjG,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,UAAU;QACpC,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,KAAa,EACb,WAAmB,EACnB,SAAoC;IAEpC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,OAAO,EAAE,kBAAkB,EAAE;QAC/D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;KACxF,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAoB,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAU,EACV,KAAa,EACb,IAAmB;IAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC;IACrD,+DAA+D;IAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IAE3C,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEtD,+DAA+D;IAC/D,IAAI,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,mCAAmC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,cAAc,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC5E,GAAG,CAAC,MAAM,CAAC,6BAA6B,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,2EAA2E;IAC3E,GAAG,CAAC,MAAM,CAAC,4BAA4B,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE9B,MAAM,IAAI,GAA4B;QACpC,cAAc,EAAE,aAAa;QAC7B,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,UAAU;QACvB,kBAAkB,EAAE,WAAW;QAC/B,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,CAAC;KACR,CAAC;IACF,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,OAAO,EAAE,2BAA2B,EAAE;QACxE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAoB,CAAC;IACtD,GAAG,CAAC,MAAM,CAAC,6BAA6B,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAqB,EACrB,oBAAkC,KAAK;IAEvC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,MAAM,KAAK,GAAG,qBAAqB,iBAAiB,GAAG,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Page } from 'playwright';
2
+ export declare function clickDrag(page: Page, x1: number, y1: number, x2: number, y2: number, steps?: number): Promise<void>;
3
+ //# sourceMappingURL=drag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drag.d.ts","sourceRoot":"","sources":["../../src/helpers/drag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAKrH"}
@@ -0,0 +1,7 @@
1
+ export async function clickDrag(page, x1, y1, x2, y2, steps = 20) {
2
+ await page.mouse.move(x1, y1);
3
+ await page.mouse.down();
4
+ await page.mouse.move(x2, y2, { steps });
5
+ await page.mouse.up();
6
+ }
7
+ //# sourceMappingURL=drag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drag.js","sourceRoot":"","sources":["../../src/helpers/drag.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,KAAK,GAAG,EAAE;IACpG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9B,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACxB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface AuthBearer {
2
+ type: 'bearer';
3
+ data: {
4
+ token: string;
5
+ };
6
+ }
7
+ export interface AuthBasic {
8
+ type: 'basic';
9
+ data: {
10
+ username: string;
11
+ password?: string;
12
+ };
13
+ }
14
+ export type Authorization = AuthBearer | AuthBasic | string;
15
+ export interface ApiRequest {
16
+ method: string;
17
+ url: string;
18
+ headers?: Record<string, string>;
19
+ params?: Record<string, string>;
20
+ body?: unknown;
21
+ authorization?: Authorization;
22
+ timeout?: number;
23
+ verify?: boolean;
24
+ }
25
+ export interface ApiResponse {
26
+ status: number;
27
+ headers: Record<string, string>;
28
+ cookies: Record<string, string>;
29
+ response_body: unknown;
30
+ body: string;
31
+ time: number;
32
+ }
33
+ export declare function executeApi(req: ApiRequest): Promise<ApiResponse>;
34
+ //# sourceMappingURL=executeApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeApi.d.ts","sourceRoot":"","sources":["../../src/helpers/executeApi.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAAE;AACxE,MAAM,WAAW,SAAS;IAAI,IAAI,EAAE,OAAO,CAAC;IAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAAE;AAC9F,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAgEtE"}
@@ -0,0 +1,83 @@
1
+ import { v } from '../vars.js';
2
+ import { log, preview } from '../log.js';
3
+ function resolve(input) { return v(input); }
4
+ export async function executeApi(req) {
5
+ const url = new URL(resolve(req.url));
6
+ if (req.params) {
7
+ for (const [k, val] of Object.entries(req.params))
8
+ url.searchParams.set(k, resolve(val));
9
+ }
10
+ const headers = {};
11
+ for (const [k, val] of Object.entries(req.headers ?? {}))
12
+ headers[k] = resolve(val);
13
+ // Python: auth may be a dict OR a JSON-encoded string.
14
+ let auth;
15
+ if (typeof req.authorization === 'string') {
16
+ try {
17
+ auth = JSON.parse(req.authorization);
18
+ }
19
+ catch { /* ignore */ }
20
+ }
21
+ else {
22
+ auth = req.authorization;
23
+ }
24
+ if (auth?.type === 'bearer' && auth.data.token) {
25
+ headers['Authorization'] = `Bearer ${resolve(auth.data.token)}`;
26
+ }
27
+ else if (auth?.type === 'basic' && auth.data.username) {
28
+ const u = resolve(auth.data.username);
29
+ const p = resolve(auth.data.password ?? '');
30
+ headers['Authorization'] = `Basic ${Buffer.from(`${u}:${p}`).toString('base64')}`;
31
+ }
32
+ let body = null;
33
+ if (req.body !== undefined && req.body !== null) {
34
+ if (typeof req.body === 'string')
35
+ body = resolve(req.body);
36
+ else {
37
+ body = JSON.stringify(req.body);
38
+ if (!headers['content-type'])
39
+ headers['content-type'] = 'application/json';
40
+ }
41
+ }
42
+ log.helper(`[execute_api] ${req.method} ${preview(url.toString(), 80)}`);
43
+ const started = Date.now();
44
+ const ac = new AbortController();
45
+ const timer = setTimeout(() => ac.abort(), req.timeout ?? 30_000);
46
+ let resp;
47
+ try {
48
+ resp = await fetch(url.toString(), { method: req.method, headers, body, signal: ac.signal });
49
+ }
50
+ finally {
51
+ clearTimeout(timer);
52
+ }
53
+ const elapsed = Date.now() - started;
54
+ log.helper(`[execute_api] status=${resp.status} time=${elapsed}ms`);
55
+ const respHeaders = {};
56
+ resp.headers.forEach((val, key) => { respHeaders[key] = val; });
57
+ // Cookie parsing — getSetCookie() is Node >=18.14 / undici 5.25+. Fall back to raw header on older runtimes.
58
+ const cookies = {};
59
+ const setCookieFn = resp.headers.getSetCookie;
60
+ const setCookieList = typeof setCookieFn === 'function'
61
+ ? setCookieFn.call(resp.headers)
62
+ : (resp.headers.get('set-cookie') ? [resp.headers.get('set-cookie')] : []);
63
+ for (const setCookie of setCookieList) {
64
+ const first = setCookie.split(';')[0];
65
+ if (first && first.includes('=')) {
66
+ const eq = first.indexOf('=');
67
+ const n = first.slice(0, eq).trim();
68
+ const val = first.slice(eq + 1).trim();
69
+ if (n)
70
+ cookies[n] = val;
71
+ }
72
+ }
73
+ const text = await resp.text();
74
+ let parsed = text;
75
+ if (respHeaders['content-type']?.includes('application/json')) {
76
+ try {
77
+ parsed = JSON.parse(text);
78
+ }
79
+ catch { }
80
+ }
81
+ return { status: resp.status, headers: respHeaders, cookies, response_body: parsed, body: text, time: elapsed };
82
+ }
83
+ //# sourceMappingURL=executeApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeApi.js","sourceRoot":"","sources":["../../src/helpers/executeApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface DbRequest {
2
+ query: string;
3
+ db_id: string;
4
+ db_name: string;
5
+ timeout?: number;
6
+ tunnel_id?: string;
7
+ }
8
+ export declare function executeDb(req: DbRequest): Promise<unknown>;
9
+ //# sourceMappingURL=executeDb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeDb.d.ts","sourceRoot":"","sources":["../../src/helpers/executeDb.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBhE"}
@@ -0,0 +1,23 @@
1
+ import { fetchWithAuth, ltAuthHeader } from '../http.js';
2
+ import { TestmuConfigError } from '../errors.js';
3
+ import { log } from '../log.js';
4
+ export async function executeDb(req) {
5
+ if (!ltAuthHeader())
6
+ throw new TestmuConfigError('executeDb requires LT creds');
7
+ log.helper(`[execute_db] db_id=${JSON.stringify(req.db_id)} db_name=${JSON.stringify(req.db_name)}`);
8
+ const automindUrl = (process.env['AUTOMIND_URL'] ?? '').replace(/\/$/, '');
9
+ const tunnelId = req.tunnel_id ?? process.env['LT_PROXY_TUNNEL_ID'] ?? '';
10
+ const payload = {
11
+ query: req.query,
12
+ payload: { id: req.db_id, db_name: req.db_name, timeout: req.timeout ?? 10_000, tunnel_id: tunnelId },
13
+ };
14
+ const resp = await fetchWithAuth(`${automindUrl}/db-query`, {
15
+ method: 'POST',
16
+ headers: { 'content-type': 'application/json' },
17
+ body: JSON.stringify(payload),
18
+ });
19
+ if (!resp.ok)
20
+ throw new Error(`executeDb failed: HTTP ${resp.status}`);
21
+ return await resp.json();
22
+ }
23
+ //# sourceMappingURL=executeDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeDb.js","sourceRoot":"","sources":["../../src/helpers/executeDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAUhC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAc;IAC5C,IAAI,CAAC,YAAY,EAAE;QAAE,MAAM,IAAI,iBAAiB,CAAC,6BAA6B,CAAC,CAAC;IAChF,GAAG,CAAC,MAAM,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrG,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAM,OAAO,GAAG;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE;KACtG,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,WAAW,WAAW,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Page } from 'playwright';
2
+ /** Error raised when user JS throws inside the page context. */
3
+ export declare class ExecuteJsError extends Error {
4
+ readonly line: number | null;
5
+ constructor(message: string, line: number | null);
6
+ }
7
+ /**
8
+ * Execute user JavaScript in the page context. Returns the raw value the
9
+ * script returned. Throws ExecuteJsError if the script raised.
10
+ *
11
+ * Matches Python `testmu.execute_js` semantics — errors throw, success
12
+ * returns the value directly. Callers can `await` and treat the result
13
+ * like any normal value.
14
+ */
15
+ export declare function executeJs(page: Page, userCode: string): Promise<unknown>;
16
+ //# sourceMappingURL=executeJs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeJs.d.ts","sourceRoot":"","sources":["../../src/helpers/executeJs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAavC,gEAAgE;AAChE,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;gBACjB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;CAKjD;AAyBD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU9E"}
@@ -0,0 +1,58 @@
1
+ import { _getUserStore } from '../vars.js';
2
+ import { log, preview } from '../log.js';
3
+ const IDENT = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
4
+ /** Error raised when user JS throws inside the page context. */
5
+ export class ExecuteJsError extends Error {
6
+ line;
7
+ constructor(message, line) {
8
+ super(message);
9
+ this.name = 'ExecuteJsError';
10
+ this.line = line;
11
+ }
12
+ }
13
+ function buildWrapper(userCode, vars) {
14
+ const declarations = Object.entries(vars)
15
+ .filter(([k]) => IDENT.test(k))
16
+ .map(([k, v]) => {
17
+ let literal;
18
+ try {
19
+ literal = JSON.stringify(v);
20
+ }
21
+ catch {
22
+ literal = JSON.stringify(String(v));
23
+ }
24
+ return `const ${k} = ${literal};`;
25
+ })
26
+ .join('\n');
27
+ return `(() => {
28
+ try {
29
+ ${declarations}
30
+ const __result = (() => { ${userCode} })();
31
+ return { value: __result, error: null, line: null };
32
+ } catch (e) {
33
+ const stack = (e && e.stack) || '';
34
+ const lineMatch = stack.match(/<anonymous>:(\\d+):/);
35
+ return { value: null, error: e && e.message || String(e), line: lineMatch ? Number(lineMatch[1]) : null };
36
+ }
37
+ })()`;
38
+ }
39
+ /**
40
+ * Execute user JavaScript in the page context. Returns the raw value the
41
+ * script returned. Throws ExecuteJsError if the script raised.
42
+ *
43
+ * Matches Python `testmu.execute_js` semantics — errors throw, success
44
+ * returns the value directly. Callers can `await` and treat the result
45
+ * like any normal value.
46
+ */
47
+ export async function executeJs(page, userCode) {
48
+ log.helper(`[execute_js] ${preview(userCode, 80)}`);
49
+ const vars = _getUserStore();
50
+ const wrapped = buildWrapper(userCode, vars);
51
+ const result = (await page.evaluate(wrapped));
52
+ if (result.error !== null) {
53
+ throw new ExecuteJsError(result.error, result.line);
54
+ }
55
+ log.helper(`[execute_js] result=${preview(result.value, 100)}`);
56
+ return result.value;
57
+ }
58
+ //# sourceMappingURL=executeJs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeJs.js","sourceRoot":"","sources":["../../src/helpers/executeJs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,KAAK,GAAG,4BAA4B,CAAC;AAS3C,gEAAgE;AAChE,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAgB;IAC7B,YAAY,OAAe,EAAE,IAAmB;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,IAA6B;IACnE,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SACtC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACd,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACpC,MAAM,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAC9C,OAAO,SAAS,CAAC,MAAM,OAAO,GAAG,CAAC;IACpC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;;QAED,YAAY;kCACc,QAAQ;;;;;;;OAOnC,CAAC;AACR,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,QAAgB;IAC1D,GAAG,CAAC,MAAM,CAAC,gBAAgB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAmB,CAAC;IAChE,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,uBAAuB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function executeKaneCli(_objective: string): Promise<never>;
2
+ //# sourceMappingURL=kaneCli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kaneCli.d.ts","sourceRoot":"","sources":["../../src/helpers/kaneCli.ts"],"names":[],"mappings":"AAAA,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAKvE"}
@@ -0,0 +1,5 @@
1
+ export async function executeKaneCli(_objective) {
2
+ throw new Error('executeKaneCli is not implemented in the TypeScript port. ' +
3
+ 'Python relies on Playwright internals that are unavailable in Playwright JS.');
4
+ }
5
+ //# sourceMappingURL=kaneCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kaneCli.js","sourceRoot":"","sources":["../../src/helpers/kaneCli.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,IAAI,KAAK,CACb,4DAA4D;QAC5D,8EAA8E,CAC/E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface MathNode {
2
+ operator: string;
3
+ operands: Array<MathNode | number | string>;
4
+ }
5
+ export declare function evaluateMath(node: MathNode): number;
6
+ //# sourceMappingURL=math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;CAC7C;AAcD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CA+CnD"}
@@ -0,0 +1,70 @@
1
+ import { v } from '../vars.js';
2
+ // Matches Python's _OPERATORS frozenset
3
+ const OPERATORS = new Set([
4
+ 'add', 'subtract', 'multiply', 'divide', 'mod', 'pow', 'negate', 'abs',
5
+ // symbolic aliases
6
+ '+', '-', '*', '/',
7
+ ]);
8
+ function toNum(val) {
9
+ if (typeof val === 'number')
10
+ return val;
11
+ if (typeof val === 'string') {
12
+ // Resolve {{var}} / ${var} placeholders via the variable store
13
+ const resolved = v(val);
14
+ const n = Number(typeof resolved === 'string' ? resolved.trim() : resolved);
15
+ if (Number.isNaN(n))
16
+ throw new Error(`Non-numeric operand encountered: ${JSON.stringify(val)}`);
17
+ return n;
18
+ }
19
+ throw new Error(`Unsupported operand type: ${typeof val}`);
20
+ }
21
+ export function evaluateMath(node) {
22
+ const op = node.operator ?? 'add';
23
+ if (!OPERATORS.has(op))
24
+ throw new Error(`Unsupported math operator: ${JSON.stringify(op)}`);
25
+ const resolved = node.operands.map((operand) => {
26
+ if (typeof operand === 'object' && operand !== null)
27
+ return evaluateMath(operand);
28
+ return toNum(operand);
29
+ });
30
+ // Validate arity — matches Python's checks
31
+ if ((op === 'subtract' || op === '-' || op === 'divide' || op === '/' || op === 'mod') && resolved.length !== 2) {
32
+ throw new Error(`${op} requires exactly 2 operands, got ${resolved.length}`);
33
+ }
34
+ if ((op === 'negate' || op === 'abs') && resolved.length !== 1) {
35
+ throw new Error(`${op} requires exactly 1 operand, got ${resolved.length}`);
36
+ }
37
+ switch (op) {
38
+ case 'add':
39
+ case '+':
40
+ return resolved.reduce((a, b) => a + b, 0);
41
+ case 'subtract':
42
+ case '-':
43
+ return (resolved[0] ?? 0) - (resolved[1] ?? 0);
44
+ case 'multiply':
45
+ case '*':
46
+ return resolved.reduce((a, b) => a * b, 1);
47
+ case 'divide':
48
+ case '/': {
49
+ const divisor = resolved[1] ?? 1;
50
+ if (divisor === 0)
51
+ throw new Error('Division by zero');
52
+ return (resolved[0] ?? 0) / divisor;
53
+ }
54
+ case 'mod': {
55
+ const modBy = resolved[1] ?? 1;
56
+ if (modBy === 0)
57
+ throw new Error('Modulo by zero');
58
+ return (resolved[0] ?? 0) % modBy;
59
+ }
60
+ case 'pow':
61
+ return Math.pow(resolved[0] ?? 0, resolved[1] ?? 0);
62
+ case 'abs':
63
+ return Math.abs(resolved[0] ?? 0);
64
+ case 'negate':
65
+ return -(resolved[0] ?? 0);
66
+ default:
67
+ throw new Error(`Unsupported operator: ${op}`);
68
+ }
69
+ }
70
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ type Operator = 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'greater_than' | 'greater_than_or_equal' | 'less_than' | 'less_than_or_equal' | 'start_with' | 'end_with';
2
+ export interface NetworkLeaf {
3
+ operator: Operator;
4
+ left: unknown;
5
+ right: unknown;
6
+ }
7
+ export interface NetworkComposite {
8
+ operator: 'and' | 'or';
9
+ children: NetworkNode[];
10
+ }
11
+ export type NetworkNode = NetworkLeaf | NetworkComposite;
12
+ export declare function evaluateNetworkAssertion(node: NetworkNode): boolean;
13
+ export interface NetworkQueryOptions {
14
+ method: string;
15
+ url: string;
16
+ index: number;
17
+ networkLogId?: string;
18
+ pollingInterval?: number;
19
+ maxPollingTime?: number;
20
+ }
21
+ export declare function networkQuery(opts: NetworkQueryOptions): Promise<unknown>;
22
+ export {};
23
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/helpers/network.ts"],"names":[],"mappings":"AAGA,KAAK,QAAQ,GACT,QAAQ,GAAG,YAAY,GACvB,UAAU,GAAG,cAAc,GAC3B,cAAc,GAAG,uBAAuB,GACxC,WAAW,GAAG,oBAAoB,GAClC,YAAY,GAAG,UAAU,CAAC;AAE9B,MAAM,WAAW,WAAW;IAAG,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;CAAE;AACnF,MAAM,WAAW,gBAAgB;IAAG,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;CAAE;AACtF,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC;AA2BzD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAWnE;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuB9E"}
@@ -0,0 +1,67 @@
1
+ import { v } from '../vars.js';
2
+ import { config } from '../config.js';
3
+ function resolve(val) {
4
+ return typeof val === 'string' ? v(val) : val;
5
+ }
6
+ function evaluateLeaf(l) {
7
+ const a = resolve(l.left);
8
+ const b = resolve(l.right);
9
+ switch (l.operator) {
10
+ case 'equals': return a == b;
11
+ case 'not_equals': return a != b;
12
+ case 'contains': return String(a).includes(String(b));
13
+ case 'not_contains': return !String(a).includes(String(b));
14
+ case 'greater_than': return Number(a) > Number(b);
15
+ case 'greater_than_or_equal': return Number(a) >= Number(b);
16
+ case 'less_than': return Number(a) < Number(b);
17
+ case 'less_than_or_equal': return Number(a) <= Number(b);
18
+ case 'start_with': return String(a).startsWith(String(b));
19
+ case 'end_with': return String(a).endsWith(String(b));
20
+ }
21
+ }
22
+ function isComposite(n) {
23
+ return n.operator === 'and' || n.operator === 'or';
24
+ }
25
+ export function evaluateNetworkAssertion(node) {
26
+ let result;
27
+ if (isComposite(node)) {
28
+ result = node.operator === 'and'
29
+ ? node.children.every(evaluateNetworkAssertion)
30
+ : node.children.some(evaluateNetworkAssertion);
31
+ }
32
+ else {
33
+ result = evaluateLeaf(node);
34
+ }
35
+ if (!result)
36
+ throw new Error(`Network assertion failed: ${JSON.stringify(node)}`);
37
+ return true;
38
+ }
39
+ export async function networkQuery(opts) {
40
+ if (config.current.runTarget !== 'cloud')
41
+ return null;
42
+ const HAR = 'http://127.0.0.1:8181';
43
+ const interval = opts.pollingInterval ?? 2;
44
+ const maxTries = Math.max(1, Math.floor((opts.maxPollingTime ?? 10) / interval));
45
+ for (let i = 0; i < maxTries; i++) {
46
+ try {
47
+ const resp = await fetch(`${HAR}/logs`);
48
+ if (resp.ok) {
49
+ const entries = (await resp.json());
50
+ const matches = entries.filter(e => e.request?.method === opts.method && e.request?.url === opts.url);
51
+ const entry = matches[opts.index - 1];
52
+ if (entry) {
53
+ const detail = await fetch(`${HAR}/logs/entry?id=${entry.id}`);
54
+ if (detail.ok)
55
+ return await detail.json();
56
+ }
57
+ }
58
+ }
59
+ catch {
60
+ // HAR server unavailable — retry until exhausted
61
+ }
62
+ if (i < maxTries - 1)
63
+ await new Promise(r => setTimeout(r, interval * 1000));
64
+ }
65
+ return null;
66
+ }
67
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/helpers/network.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Page } from 'playwright';
2
+ export declare function smartuiSnapshot(page: Page, name: string): Promise<void>;
3
+ //# sourceMappingURL=smartui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smartui.d.ts","sourceRoot":"","sources":["../../src/helpers/smartui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7E"}
@@ -0,0 +1,11 @@
1
+ import { config } from '../config.js';
2
+ export async function smartuiSnapshot(page, name) {
3
+ if (!(config.current.smart && config.current.runTarget === 'cloud'))
4
+ return;
5
+ const payload = JSON.stringify({
6
+ action: 'smartui.takeScreenshot',
7
+ arguments: { screenshotName: name },
8
+ });
9
+ await page.evaluate('_ => {}', `lambdatest_action: ${payload}`);
10
+ }
11
+ //# sourceMappingURL=smartui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smartui.js","sourceRoot":"","sources":["../../src/helpers/smartui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU,EAAE,IAAY;IAC5D,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC;QAAE,OAAO;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,MAAM,EAAE,wBAAwB;QAChC,SAAS,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;KACpC,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,sBAAsB,OAAO,EAAE,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { BrowserContext, Page } from 'playwright';
2
+ export declare function switchTab(context: BrowserContext, index: number): Promise<Page>;
3
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/helpers/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvD,wBAAsB,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrF"}