@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2026 TestMu AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # @testmuai/playwright-bindings
2
+
3
+ Thin runtime for testmu-style Playwright tests in TypeScript/JavaScript. Companion to [`testmuai-playwright-bindings`](../playwright-python/) (Python).
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @testmuai/playwright-bindings playwright
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import testmu, { v, setVar } from "@testmuai/playwright-bindings";
15
+ import { expect } from "@playwright/test";
16
+
17
+ testmu.configure({
18
+ build: "build-123",
19
+ name: "Login Test",
20
+ variables: { email: "user@test.com" },
21
+ testParams: { BASE_URL: "https://example.com" },
22
+ });
23
+
24
+ testmu.test("Login flow", async (page) => {
25
+ testmu.step("Navigate");
26
+ await page.goto(v("${BASE_URL}"));
27
+ testmu.done();
28
+
29
+ testmu.step("Fill credentials");
30
+ await page.locator("#email").fill(v("{{email}}"));
31
+ testmu.done();
32
+ });
33
+
34
+ testmu.run();
35
+ ```
36
+
37
+ ## Env vars
38
+
39
+ | Var | Purpose |
40
+ | ------------------------------ | ---------------------------------------------------------------- |
41
+ | `TESTMU_RUN_TARGET` | `local` (default) or `cloud` |
42
+ | `LT_USERNAME`, `LT_ACCESS_KEY` | LambdaTest credentials (enables ATMS + vision) |
43
+ | `TESTMU_SMART` | `1` enables vision/heal (validated at run() — requires LT creds) |
44
+
45
+ ## Build
46
+
47
+ ```bash
48
+ npm run build # tsc → dist/
49
+ npm test # vitest run
50
+ npm run typecheck # tsc --noEmit
51
+ ```
@@ -0,0 +1,60 @@
1
+ export interface ChromeOption {
2
+ key: string;
3
+ value?: string;
4
+ type?: 'file' | 'no-args' | string;
5
+ }
6
+ export interface LTOptions {
7
+ platform: string;
8
+ user: string | undefined;
9
+ accessKey: string | undefined;
10
+ video: boolean;
11
+ resolution: string;
12
+ network: boolean;
13
+ 'network.full.har': boolean;
14
+ build: string;
15
+ project: string;
16
+ name: string;
17
+ w3c: true;
18
+ plugin: string;
19
+ visual: boolean;
20
+ console: boolean;
21
+ 'tms.tc_id': string;
22
+ loadExtensions: (string | undefined)[];
23
+ playwrightClientVersion: string;
24
+ tunnel: boolean;
25
+ performance: boolean;
26
+ dedicatedProxy: boolean;
27
+ idleTimeout: number;
28
+ accessibility: boolean;
29
+ hideInternalCommandLogs: true;
30
+ dependentTestsInScenario: boolean;
31
+ timezone?: string;
32
+ geoLocation?: string;
33
+ customHeaders?: Record<string, string>;
34
+ 'goog:chromeOptions'?: string[];
35
+ 'ms:edgeOptions'?: string[];
36
+ firefoxUserPrefs?: Record<string, unknown>;
37
+ }
38
+ export interface Capabilities {
39
+ browserName: string;
40
+ browserVersion: string;
41
+ 'LT:Options': LTOptions;
42
+ }
43
+ /**
44
+ * Build and return the LambdaTest capabilities dict.
45
+ * Async because testConfig resolution is async.
46
+ */
47
+ export declare function buildCapabilities(): Promise<Capabilities>;
48
+ /**
49
+ * Build the LambdaTest CDP WebSocket URL from a capabilities dict.
50
+ * Credentials live inside LT:Options — no user/accessKey URL params.
51
+ */
52
+ export declare function getCdpUrl(caps: Capabilities): string;
53
+ /**
54
+ * Parse a resolution string like '1920x1080' into a viewport dict.
55
+ */
56
+ export declare function getViewport(resolution?: string): {
57
+ width: number;
58
+ height: number;
59
+ };
60
+ //# sourceMappingURL=capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IACvC,uBAAuB,EAAE,MAAM,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,uBAAuB,EAAE,IAAI,CAAC;IAC9B,wBAAwB,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,SAAS,CAAC;CACzB;AAwBD;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,YAAY,CAAC,CA6J/D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAKpD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAKlF"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * LambdaTest capability builder for Playwright TypeScript.
3
+ *
4
+ * Fallback chain: configure() > HE testConfig > env vars > defaults.
5
+ * Sets smart_os / smart_browser_name / etc. env vars as side-effect
6
+ * so that vars.ts {{smart.os_type}} / {{smart.browser_name}} resolve.
7
+ *
8
+ * Full Python parity with testmu/_capability.py::get_capabilities().
9
+ * Intentional deviation: plugin = "node-node" (Python uses "python-python").
10
+ */
11
+ import { createRequire } from 'node:module';
12
+ import { get, wasSet } from './configure.js';
13
+ import { getCapValue, loadTestConfig } from './testConfig.js';
14
+ // ESM-safe require for reading playwright/package.json at runtime
15
+ const _require = createRequire(import.meta.url);
16
+ function getPwVersion() {
17
+ try {
18
+ return _require('playwright/package.json').version;
19
+ }
20
+ catch {
21
+ return 'unknown';
22
+ }
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // Internal helpers
26
+ // ---------------------------------------------------------------------------
27
+ function getDownloadsFolder() {
28
+ if (process.platform === 'win32') {
29
+ return `${process.env['USERPROFILE'] ?? ''}\\Downloads`;
30
+ }
31
+ return `${process.env['HOME'] ?? '~'}/Downloads`;
32
+ }
33
+ async function boolHe(key, def) {
34
+ const v = await getCapValue(key, undefined);
35
+ if (v === undefined || v === null)
36
+ return def;
37
+ if (typeof v === 'boolean')
38
+ return v;
39
+ return ['1', 'true', 'yes'].includes(String(v).toLowerCase());
40
+ }
41
+ // ---------------------------------------------------------------------------
42
+ // Public API
43
+ // ---------------------------------------------------------------------------
44
+ /**
45
+ * Build and return the LambdaTest capabilities dict.
46
+ * Async because testConfig resolution is async.
47
+ */
48
+ export async function buildCapabilities() {
49
+ // Top-level fields: configure() not in scope for these, so env > default
50
+ const browserName = process.env['LT_BROWSER'] ?? 'Chrome';
51
+ const browserVersion = process.env['LT_BROWSER_VERSION'] ?? 'latest';
52
+ const resolution = process.env['LT_RESOLUTION'] ?? '1920x1080';
53
+ const platform = process.env['LT_PLATFORM'] ?? 'linux';
54
+ const user = process.env['LT_USERNAME'];
55
+ const accessKey = process.env['LT_ACCESS_KEY'];
56
+ // build + name + tc_id: configure() > HE testConfig > env > default
57
+ const build = String((wasSet('build') ? get('build') : '') ||
58
+ (await getCapValue('BUILD', process.env['BUILD'] ?? '')));
59
+ const name = String((wasSet('name') ? get('name') : '') ||
60
+ (await getCapValue('TEST_NAME', process.env['TEST_NAME'] ?? '')));
61
+ const tcId = String((wasSet('tcId') ? get('tcId') : '') ||
62
+ (process.env['LT_TC_ID'] ?? ''));
63
+ // network: configure() wins when explicitly set, else HE testConfig > env > false
64
+ const network = wasSet('network')
65
+ ? Boolean(get('network'))
66
+ : await boolHe('NETWORK', false);
67
+ // multipleProfiles: configure() wins when explicitly set, else false
68
+ const multipleProfiles = wasSet('multipleProfiles')
69
+ ? Boolean(get('multipleProfiles'))
70
+ : false;
71
+ // Bool caps: configure() has no explicit setters → HE testConfig > env > default
72
+ const video = await boolHe('VIDEO', true);
73
+ const visual = await boolHe('VISUAL', true);
74
+ const consoleLog = await boolHe('CONSOLE', true);
75
+ const tunnel = await boolHe('TUNNEL', false);
76
+ const performance = await boolHe('PERFORMANCE', false);
77
+ const dedicatedProxy = await boolHe('DEDICATED_PROXY', false);
78
+ const accessibility = await boolHe('ACCESSIBILITY', false);
79
+ const idleTimeout = Number((await getCapValue('IDLE_TIMEOUT', process.env['IDLE_TIMEOUT'] ?? '1800')) ?? '1800');
80
+ const caps = {
81
+ browserName,
82
+ browserVersion,
83
+ 'LT:Options': {
84
+ platform,
85
+ user,
86
+ accessKey,
87
+ video,
88
+ resolution,
89
+ network,
90
+ 'network.full.har': network,
91
+ build,
92
+ project: 'Auteur-Code-Export',
93
+ name,
94
+ w3c: true,
95
+ plugin: 'node-node', // intentional deviation: Python uses "python-python"
96
+ visual,
97
+ console: consoleLog,
98
+ 'tms.tc_id': tcId,
99
+ loadExtensions: [process.env['EXTENSION']],
100
+ playwrightClientVersion: getPwVersion(),
101
+ tunnel,
102
+ performance,
103
+ dedicatedProxy,
104
+ idleTimeout,
105
+ accessibility,
106
+ hideInternalCommandLogs: true,
107
+ dependentTestsInScenario: multipleProfiles,
108
+ },
109
+ };
110
+ // Geolocation — conditional (only set if env var present)
111
+ if (process.env['GEO_LOCATION']) {
112
+ caps['LT:Options'].geoLocation = process.env['GEO_LOCATION'];
113
+ }
114
+ // Timezone — configure() > testConfig.timezone.region > env var
115
+ let tz = wasSet('timezone') ? String(get('timezone')) : '';
116
+ if (!tz) {
117
+ const tc = await loadTestConfig();
118
+ if (tc) {
119
+ const tzVal = tc['timezone'];
120
+ if (tzVal && typeof tzVal === 'object' && 'region' in tzVal) {
121
+ const region = tzVal.region;
122
+ if (region)
123
+ tz = region;
124
+ }
125
+ }
126
+ }
127
+ if (!tz)
128
+ tz = process.env['TIMEZONE'] ?? '';
129
+ if (tz)
130
+ caps['LT:Options'].timezone = tz;
131
+ // Custom headers — conditional
132
+ const hdrs = get('customHeaders');
133
+ if (Object.keys(hdrs).length > 0) {
134
+ caps['LT:Options'].customHeaders = hdrs;
135
+ }
136
+ // Browser-specific options
137
+ const bLow = browserName.toLowerCase();
138
+ if (bLow === 'chrome' || bLow === 'pw-chromium') {
139
+ const defaultArgs = [
140
+ '--enable-logging',
141
+ '--disable-notifications',
142
+ '--no-sandbox',
143
+ '--log-level=0',
144
+ '--ignore-certificate-errors',
145
+ '--disable-blink-features=AutomationControlled',
146
+ '--password-store=basic',
147
+ '--safebrowsing-disable-auto-update',
148
+ '--disable-sync',
149
+ ];
150
+ caps['LT:Options']['goog:chromeOptions'] = [...defaultArgs];
151
+ const chromeOpts = get('chromeOptions');
152
+ for (const op of chromeOpts) {
153
+ const k = op.key ?? '';
154
+ const t = op.type ?? '';
155
+ const val = op.value ?? '';
156
+ if (t === 'no-args') {
157
+ caps['LT:Options']['goog:chromeOptions'].push(k);
158
+ }
159
+ else if (t === 'file') {
160
+ const filePath = `${getDownloadsFolder()}/${val}`;
161
+ caps['LT:Options']['goog:chromeOptions'].push(`${k}=${filePath}`);
162
+ }
163
+ else {
164
+ caps['LT:Options']['goog:chromeOptions'].push(`${k}=${val}`);
165
+ }
166
+ }
167
+ }
168
+ else if (bLow === 'microsoftedge') {
169
+ caps['LT:Options']['ms:edgeOptions'] = [
170
+ '--enable-logging',
171
+ '--disable-notifications',
172
+ '--log-level=0',
173
+ '--disable-blink-features=AutomationControlled',
174
+ '--password-store=basic',
175
+ '--safebrowsing-disable-auto-update',
176
+ '--disable-sync',
177
+ ];
178
+ }
179
+ else if (bLow === 'firefox' || bLow === 'pw-firefox') {
180
+ caps['LT:Options'].firefoxUserPrefs = {
181
+ 'dom.webnotifications.enabled': false,
182
+ 'signon.rememberSignons': false,
183
+ 'signon.autofillForms': false,
184
+ 'permissions.default.desktop-notification': 2,
185
+ };
186
+ }
187
+ // Side-effect: set smart_* env vars (same as Python template)
188
+ process.env['smart_os'] = caps['LT:Options'].platform;
189
+ process.env['smart_os_version'] = 'latest';
190
+ process.env['smart_browser_name'] = caps.browserName;
191
+ process.env['smart_browser_version'] = caps.browserVersion;
192
+ return caps;
193
+ }
194
+ /**
195
+ * Build the LambdaTest CDP WebSocket URL from a capabilities dict.
196
+ * Credentials live inside LT:Options — no user/accessKey URL params.
197
+ */
198
+ export function getCdpUrl(caps) {
199
+ return ('wss://cdp.lambdatest.com/playwright?capabilities=' +
200
+ encodeURIComponent(JSON.stringify(caps)));
201
+ }
202
+ /**
203
+ * Parse a resolution string like '1920x1080' into a viewport dict.
204
+ */
205
+ export function getViewport(resolution) {
206
+ const res = resolution ?? process.env['LT_RESOLUTION'] ?? '1920x1080';
207
+ const m = res.toLowerCase().match(/^(\d+)x(\d+)$/);
208
+ if (!m)
209
+ return { width: 1920, height: 1080 };
210
+ return { width: Number(m[1]), height: Number(m[2]) };
211
+ }
212
+ //# sourceMappingURL=capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.js","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type RunTarget = 'local' | 'cloud';
2
+ export interface Config {
3
+ runTarget: RunTarget;
4
+ ltAuth: boolean;
5
+ smart: boolean;
6
+ }
7
+ export declare function readConfig(): Config;
8
+ export declare const config: {
9
+ readonly current: Config;
10
+ };
11
+ export declare function _refresh(): void;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1C,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,UAAU,IAAI,MAAM,CAOnC;AAGD,eAAO,MAAM,MAAM,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAI9C,CAAC;AACF,wBAAgB,QAAQ,IAAI,IAAI,CAE/B"}
package/dist/config.js ADDED
@@ -0,0 +1,16 @@
1
+ export function readConfig() {
2
+ const runTarget = process.env['TESTMU_RUN_TARGET'] === 'cloud' ? 'cloud' : 'local';
3
+ const ltAuth = Boolean(process.env['LT_USERNAME']) && Boolean(process.env['LT_ACCESS_KEY']);
4
+ const smart = process.env['TESTMU_SMART'] === '1';
5
+ return { runTarget, ltAuth, smart };
6
+ }
7
+ let _snapshot = readConfig();
8
+ export const config = {
9
+ get current() {
10
+ return _snapshot;
11
+ },
12
+ };
13
+ export function _refresh() {
14
+ _snapshot = readConfig();
15
+ }
16
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,UAAU;IACxB,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACnE,MAAM,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC;IAClD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,IAAI,SAAS,GAAW,UAAU,EAAE,CAAC;AACrC,MAAM,CAAC,MAAM,MAAM,GAAiC;IAClD,IAAI,OAAO;QACT,OAAO,SAAS,CAAC;IACnB,CAAC;CACF,CAAC;AACF,MAAM,UAAU,QAAQ;IACtB,SAAS,GAAG,UAAU,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface GlobalVariable {
2
+ name: string;
3
+ value: string;
4
+ is_persist: boolean;
5
+ session_value?: string;
6
+ }
7
+ export interface ConfigureOptions {
8
+ build?: string;
9
+ name?: string;
10
+ tcId?: string;
11
+ network?: boolean;
12
+ timezone?: string;
13
+ chromeOptions?: string[];
14
+ customHeaders?: Record<string, string>;
15
+ multipleProfiles?: boolean;
16
+ variables?: Record<string, unknown>;
17
+ testParams?: Record<string, unknown>;
18
+ globalVariables?: GlobalVariable[];
19
+ uploadedFiles?: string[];
20
+ }
21
+ declare const DEFAULTS: Required<ConfigureOptions>;
22
+ type ConfigKey = keyof typeof DEFAULTS;
23
+ type ConfigureHook = (opts: ConfigureOptions) => void;
24
+ export declare function _registerConfigureHook(hook: ConfigureHook): void;
25
+ export declare function configure(opts: ConfigureOptions): void;
26
+ export declare function get<K extends ConfigKey>(key: K): (typeof DEFAULTS)[K];
27
+ export declare function wasSet(key: ConfigKey): boolean;
28
+ export declare function _reset(): void;
29
+ export {};
30
+ //# sourceMappingURL=configure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,QAAA,MAAM,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAaxC,CAAC;AAEF,KAAK,SAAS,GAAG,MAAM,OAAO,QAAQ,CAAC;AAKvC,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAGtD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAEhE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAUtD;AAED,wBAAgB,GAAG,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAErE;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAE9C;AAED,wBAAgB,MAAM,IAAI,IAAI,CAU7B"}
@@ -0,0 +1,53 @@
1
+ const DEFAULTS = {
2
+ build: '',
3
+ name: '',
4
+ tcId: '',
5
+ network: false,
6
+ timezone: '',
7
+ chromeOptions: [],
8
+ customHeaders: {},
9
+ multipleProfiles: false,
10
+ variables: {},
11
+ testParams: {},
12
+ globalVariables: [],
13
+ uploadedFiles: [],
14
+ };
15
+ const data = { ...DEFAULTS };
16
+ const setKeys = new Set();
17
+ const hooks = [];
18
+ export function _registerConfigureHook(hook) {
19
+ hooks.push(hook);
20
+ }
21
+ export function configure(opts) {
22
+ for (const key of Object.keys(opts)) {
23
+ if (!(key in DEFAULTS)) {
24
+ console.warn(`testmu.configure: unknown key '${key}', ignoring`);
25
+ continue;
26
+ }
27
+ data[key] = opts[key];
28
+ setKeys.add(key);
29
+ }
30
+ for (const hook of hooks)
31
+ hook(opts);
32
+ }
33
+ export function get(key) {
34
+ return data[key];
35
+ }
36
+ export function wasSet(key) {
37
+ return setKeys.has(key);
38
+ }
39
+ export function _reset() {
40
+ for (const key of Object.keys(DEFAULTS)) {
41
+ const def = DEFAULTS[key];
42
+ if (Array.isArray(def))
43
+ data[key] = [];
44
+ else if (typeof def === 'object' && def !== null)
45
+ data[key] = {};
46
+ else
47
+ data[key] = def;
48
+ }
49
+ setKeys.clear();
50
+ // NOTE: hooks are NOT cleared — they are registered once at module load and are stable
51
+ // for the process lifetime. Clearing them would break configure→vars wiring after _reset().
52
+ }
53
+ //# sourceMappingURL=configure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAsBA,MAAM,QAAQ,GAA+B;IAC3C,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,EAAE;IACZ,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,gBAAgB,EAAE,KAAK;IACvB,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,eAAe,EAAE,EAAE;IACnB,aAAa,EAAE,EAAE;CAClB,CAAC;AAIF,MAAM,IAAI,GAA+B,EAAE,GAAG,QAAQ,EAAE,CAAC;AACzD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAa,CAAC;AAGrC,MAAM,KAAK,GAAoB,EAAE,CAAC;AAElC,MAAM,UAAU,sBAAsB,CAAC,IAAmB;IACxD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAsB;IAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAgB,EAAE,CAAC;QACnD,IAAI,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,kCAAkC,GAAG,aAAa,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,GAAG,CAAsB,GAAM;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAyB,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAc;IACnC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAgB,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAG,IAAmC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;aAClE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAG,IAAmC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;;YAC3F,IAAmC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACvD,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,uFAAuF;IACvF,4FAA4F;AAC9F,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare class TestmuConfigError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B"}
package/dist/errors.js ADDED
@@ -0,0 +1,7 @@
1
+ export class TestmuConfigError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'TestmuConfigError';
5
+ }
6
+ }
7
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Install heal wrappers on Locator.prototype.
3
+ * Idempotent: safe to call multiple times; the second call is a no-op.
4
+ */
5
+ export declare function installHealPatch(): void;
6
+ /**
7
+ * Restore Locator.prototype to its original state.
8
+ * Used by tests to prevent patch leakage across test files.
9
+ */
10
+ export declare function _uninstallHealPatch(): void;
11
+ //# sourceMappingURL=healPatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healPatch.d.ts","sourceRoot":"","sources":["../src/healPatch.ts"],"names":[],"mappings":"AAqEA;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAYvC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAO1C"}
@@ -0,0 +1,82 @@
1
+ import { currentStep } from './step.js';
2
+ import { config } from './config.js';
3
+ import { getVisionCoordinates } from './helpers/vision.js';
4
+ const HEAL_METHODS = [
5
+ 'click', 'dblclick', 'fill', 'type', 'press',
6
+ 'hover', 'check', 'uncheck', 'selectOption',
7
+ 'setInputFiles', 'scrollIntoViewIfNeeded', 'focus', 'tap',
8
+ ];
9
+ const COORD_METHODS = new Set(['click', 'dblclick', 'hover']);
10
+ const originals = new Map();
11
+ let installed = false;
12
+ function wrap(name, original) {
13
+ return async function wrapped(...args) {
14
+ const stepInfo = currentStep();
15
+ // Outside a step or smart mode off — pure passthrough, no overhead.
16
+ if (!stepInfo || !config.current.smart)
17
+ return original.apply(this, args);
18
+ try {
19
+ return await original.apply(this, args);
20
+ }
21
+ catch (e) {
22
+ const err = e;
23
+ if (err?.name === 'TimeoutError' &&
24
+ (await this.count()) === 0 &&
25
+ COORD_METHODS.has(name)) {
26
+ // Element is genuinely absent — try vision-coordinate heal.
27
+ // getVisionCoordinates may throw (Python 13d9f6b: no silent fallback
28
+ // when smart is ON); on any vision failure, re-throw the original
29
+ // TimeoutError so the test surfaces the real problem.
30
+ try {
31
+ const page = this.page();
32
+ const coords = await getVisionCoordinates(page, stepInfo.description, name);
33
+ if (coords) {
34
+ if (name === 'hover')
35
+ return page.mouse.move(coords.x, coords.y);
36
+ // click and dblclick exist on page.mouse under the same name.
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ return page.mouse[name](coords.x, coords.y);
39
+ }
40
+ }
41
+ catch {
42
+ // Vision heal failed — surface original TimeoutError below.
43
+ }
44
+ }
45
+ // Heal not applicable or heal failed — surface original error.
46
+ throw e;
47
+ }
48
+ };
49
+ }
50
+ /**
51
+ * Install heal wrappers on Locator.prototype.
52
+ * Idempotent: safe to call multiple times; the second call is a no-op.
53
+ */
54
+ export function installHealPatch() {
55
+ if (installed)
56
+ return;
57
+ // @ts-ignore — Locator is an interface in TS but a concrete class at runtime.
58
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
+ const proto = Locator.prototype;
60
+ for (const name of HEAL_METHODS) {
61
+ const orig = proto[name];
62
+ if (typeof orig !== 'function')
63
+ continue;
64
+ originals.set(name, orig);
65
+ proto[name] = wrap(name, orig);
66
+ }
67
+ installed = true;
68
+ }
69
+ /**
70
+ * Restore Locator.prototype to its original state.
71
+ * Used by tests to prevent patch leakage across test files.
72
+ */
73
+ export function _uninstallHealPatch() {
74
+ // @ts-ignore — Locator is an interface in TS but a concrete class at runtime.
75
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
76
+ const proto = Locator.prototype;
77
+ for (const [name, orig] of originals)
78
+ proto[name] = orig;
79
+ originals.clear();
80
+ installed = false;
81
+ }
82
+ //# sourceMappingURL=healPatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healPatch.js","sourceRoot":"","sources":["../src/healPatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Page } from 'playwright';
2
+ export interface SubCheck {
3
+ store_key?: string;
4
+ operator: string;
5
+ expected_value?: unknown;
6
+ expected?: unknown;
7
+ extracted_value?: unknown;
8
+ description?: string;
9
+ transforms?: string[];
10
+ }
11
+ export interface AssertionTree {
12
+ composite_operator: 'and' | 'or';
13
+ sub_checks: SubCheck[];
14
+ claim?: string;
15
+ verification?: unknown;
16
+ }
17
+ export interface AssertionResult {
18
+ status: 'passed' | 'failed';
19
+ sub_results?: unknown[];
20
+ }
21
+ export declare function verifyAssertion(page: Page, claim: string, tree: AssertionTree): Promise<AssertionResult>;
22
+ export declare function evaluateBranch(subChecks: SubCheck[], compositeOperator?: 'and' | 'or'): Promise<boolean>;
23
+ //# sourceMappingURL=assertion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertion.d.ts","sourceRoot":"","sources":["../../src/helpers/assertion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAQvC,MAAM,WAAW,QAAQ;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,KAAK,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;CACzB;AAkCD,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,eAAe,CAAC,CA+C1B;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,QAAQ,EAAE,EACrB,iBAAiB,GAAE,KAAK,GAAG,IAAY,GACtC,OAAO,CAAC,OAAO,CAAC,CAWlB"}