@testdroid-ai/cli 0.1.2

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 (229) hide show
  1. package/dist/adb/adb-path-resolver.d.ts +6 -0
  2. package/dist/adb/adb-path-resolver.d.ts.map +1 -0
  3. package/dist/adb/adb-path-resolver.js +93 -0
  4. package/dist/adb/adb-path-resolver.js.map +1 -0
  5. package/dist/adb/adb-shell.d.ts +29 -0
  6. package/dist/adb/adb-shell.d.ts.map +1 -0
  7. package/dist/adb/adb-shell.js +128 -0
  8. package/dist/adb/adb-shell.js.map +1 -0
  9. package/dist/adb/detector.d.ts +12 -0
  10. package/dist/adb/detector.d.ts.map +1 -0
  11. package/dist/adb/detector.js +44 -0
  12. package/dist/adb/detector.js.map +1 -0
  13. package/dist/adb/device-tracker.d.ts +23 -0
  14. package/dist/adb/device-tracker.d.ts.map +1 -0
  15. package/dist/adb/device-tracker.js +134 -0
  16. package/dist/adb/device-tracker.js.map +1 -0
  17. package/dist/adb/emulator-detector.d.ts +11 -0
  18. package/dist/adb/emulator-detector.d.ts.map +1 -0
  19. package/dist/adb/emulator-detector.js +54 -0
  20. package/dist/adb/emulator-detector.js.map +1 -0
  21. package/dist/appium/health-check.d.ts +6 -0
  22. package/dist/appium/health-check.d.ts.map +1 -0
  23. package/dist/appium/health-check.js +61 -0
  24. package/dist/appium/health-check.js.map +1 -0
  25. package/dist/appium/session-manager.d.ts +15 -0
  26. package/dist/appium/session-manager.d.ts.map +1 -0
  27. package/dist/appium/session-manager.js +82 -0
  28. package/dist/appium/session-manager.js.map +1 -0
  29. package/dist/auth/credential-store.d.ts +31 -0
  30. package/dist/auth/credential-store.d.ts.map +1 -0
  31. package/dist/auth/credential-store.js +154 -0
  32. package/dist/auth/credential-store.js.map +1 -0
  33. package/dist/auth/pairing-auth.d.ts +26 -0
  34. package/dist/auth/pairing-auth.d.ts.map +1 -0
  35. package/dist/auth/pairing-auth.js +177 -0
  36. package/dist/auth/pairing-auth.js.map +1 -0
  37. package/dist/auth/token-manager.d.ts +20 -0
  38. package/dist/auth/token-manager.d.ts.map +1 -0
  39. package/dist/auth/token-manager.js +101 -0
  40. package/dist/auth/token-manager.js.map +1 -0
  41. package/dist/commands/connect.d.ts +9 -0
  42. package/dist/commands/connect.d.ts.map +1 -0
  43. package/dist/commands/connect.js +270 -0
  44. package/dist/commands/connect.js.map +1 -0
  45. package/dist/commands/devices.d.ts +2 -0
  46. package/dist/commands/devices.d.ts.map +1 -0
  47. package/dist/commands/devices.js +52 -0
  48. package/dist/commands/devices.js.map +1 -0
  49. package/dist/commands/doctor.d.ts +2 -0
  50. package/dist/commands/doctor.d.ts.map +1 -0
  51. package/dist/commands/doctor.js +214 -0
  52. package/dist/commands/doctor.js.map +1 -0
  53. package/dist/commands/mirror.d.ts +2 -0
  54. package/dist/commands/mirror.d.ts.map +1 -0
  55. package/dist/commands/mirror.js +77 -0
  56. package/dist/commands/mirror.js.map +1 -0
  57. package/dist/commands/prompt.d.ts +12 -0
  58. package/dist/commands/prompt.d.ts.map +1 -0
  59. package/dist/commands/prompt.js +174 -0
  60. package/dist/commands/prompt.js.map +1 -0
  61. package/dist/commands/record.d.ts +7 -0
  62. package/dist/commands/record.d.ts.map +1 -0
  63. package/dist/commands/record.js +129 -0
  64. package/dist/commands/record.js.map +1 -0
  65. package/dist/commands/run.d.ts +16 -0
  66. package/dist/commands/run.d.ts.map +1 -0
  67. package/dist/commands/run.js +271 -0
  68. package/dist/commands/run.js.map +1 -0
  69. package/dist/commands/setup.d.ts +6 -0
  70. package/dist/commands/setup.d.ts.map +1 -0
  71. package/dist/commands/setup.js +50 -0
  72. package/dist/commands/setup.js.map +1 -0
  73. package/dist/commands/status.d.ts +2 -0
  74. package/dist/commands/status.d.ts.map +1 -0
  75. package/dist/commands/status.js +32 -0
  76. package/dist/commands/status.js.map +1 -0
  77. package/dist/healing/ai-adapter.d.ts +44 -0
  78. package/dist/healing/ai-adapter.d.ts.map +1 -0
  79. package/dist/healing/ai-adapter.js +87 -0
  80. package/dist/healing/ai-adapter.js.map +1 -0
  81. package/dist/healing/healer.d.ts +109 -0
  82. package/dist/healing/healer.d.ts.map +1 -0
  83. package/dist/healing/healer.js +475 -0
  84. package/dist/healing/healer.js.map +1 -0
  85. package/dist/healing/similarity.d.ts +63 -0
  86. package/dist/healing/similarity.d.ts.map +1 -0
  87. package/dist/healing/similarity.js +172 -0
  88. package/dist/healing/similarity.js.map +1 -0
  89. package/dist/index.d.ts +3 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +107 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/recording/capture-strategies/capture-strategy.interface.d.ts +6 -0
  94. package/dist/recording/capture-strategies/capture-strategy.interface.d.ts.map +1 -0
  95. package/dist/recording/capture-strategies/capture-strategy.interface.js +3 -0
  96. package/dist/recording/capture-strategies/capture-strategy.interface.js.map +1 -0
  97. package/dist/recording/capture-strategies/getevent.strategy.d.ts +27 -0
  98. package/dist/recording/capture-strategies/getevent.strategy.d.ts.map +1 -0
  99. package/dist/recording/capture-strategies/getevent.strategy.js +163 -0
  100. package/dist/recording/capture-strategies/getevent.strategy.js.map +1 -0
  101. package/dist/recording/capture-strategies/key-capture.strategy.d.ts +16 -0
  102. package/dist/recording/capture-strategies/key-capture.strategy.d.ts.map +1 -0
  103. package/dist/recording/capture-strategies/key-capture.strategy.js +67 -0
  104. package/dist/recording/capture-strategies/key-capture.strategy.js.map +1 -0
  105. package/dist/recording/capture-strategies/logcat-capture.strategy.d.ts +32 -0
  106. package/dist/recording/capture-strategies/logcat-capture.strategy.d.ts.map +1 -0
  107. package/dist/recording/capture-strategies/logcat-capture.strategy.js +176 -0
  108. package/dist/recording/capture-strategies/logcat-capture.strategy.js.map +1 -0
  109. package/dist/recording/confidence-scorer.d.ts +13 -0
  110. package/dist/recording/confidence-scorer.d.ts.map +1 -0
  111. package/dist/recording/confidence-scorer.js +34 -0
  112. package/dist/recording/confidence-scorer.js.map +1 -0
  113. package/dist/recording/event-capture.d.ts +40 -0
  114. package/dist/recording/event-capture.d.ts.map +1 -0
  115. package/dist/recording/event-capture.js +168 -0
  116. package/dist/recording/event-capture.js.map +1 -0
  117. package/dist/recording/recorder.d.ts +32 -0
  118. package/dist/recording/recorder.d.ts.map +1 -0
  119. package/dist/recording/recorder.js +107 -0
  120. package/dist/recording/recorder.js.map +1 -0
  121. package/dist/runner/adb-executor.d.ts +116 -0
  122. package/dist/runner/adb-executor.d.ts.map +1 -0
  123. package/dist/runner/adb-executor.js +323 -0
  124. package/dist/runner/adb-executor.js.map +1 -0
  125. package/dist/runner/appium-executor.d.ts +35 -0
  126. package/dist/runner/appium-executor.d.ts.map +1 -0
  127. package/dist/runner/appium-executor.js +191 -0
  128. package/dist/runner/appium-executor.js.map +1 -0
  129. package/dist/runner/parse-strategies/appium-default.strategy.d.ts +12 -0
  130. package/dist/runner/parse-strategies/appium-default.strategy.d.ts.map +1 -0
  131. package/dist/runner/parse-strategies/appium-default.strategy.js +342 -0
  132. package/dist/runner/parse-strategies/appium-default.strategy.js.map +1 -0
  133. package/dist/runner/parse-strategies/index.d.ts +7 -0
  134. package/dist/runner/parse-strategies/index.d.ts.map +1 -0
  135. package/dist/runner/parse-strategies/index.js +14 -0
  136. package/dist/runner/parse-strategies/index.js.map +1 -0
  137. package/dist/runner/parse-strategies/java.strategy.d.ts +8 -0
  138. package/dist/runner/parse-strategies/java.strategy.d.ts.map +1 -0
  139. package/dist/runner/parse-strategies/java.strategy.js +170 -0
  140. package/dist/runner/parse-strategies/java.strategy.js.map +1 -0
  141. package/dist/runner/parse-strategies/maestro.strategy.d.ts +8 -0
  142. package/dist/runner/parse-strategies/maestro.strategy.d.ts.map +1 -0
  143. package/dist/runner/parse-strategies/maestro.strategy.js +105 -0
  144. package/dist/runner/parse-strategies/maestro.strategy.js.map +1 -0
  145. package/dist/runner/parse-strategies/python.strategy.d.ts +8 -0
  146. package/dist/runner/parse-strategies/python.strategy.d.ts.map +1 -0
  147. package/dist/runner/parse-strategies/python.strategy.js +140 -0
  148. package/dist/runner/parse-strategies/python.strategy.js.map +1 -0
  149. package/dist/runner/parse-strategies/robot.strategy.d.ts +8 -0
  150. package/dist/runner/parse-strategies/robot.strategy.d.ts.map +1 -0
  151. package/dist/runner/parse-strategies/robot.strategy.js +81 -0
  152. package/dist/runner/parse-strategies/robot.strategy.js.map +1 -0
  153. package/dist/runner/parse-strategies/types.d.ts +17 -0
  154. package/dist/runner/parse-strategies/types.d.ts.map +1 -0
  155. package/dist/runner/parse-strategies/types.js +3 -0
  156. package/dist/runner/parse-strategies/types.js.map +1 -0
  157. package/dist/runner/parse-strategies/utils.d.ts +39 -0
  158. package/dist/runner/parse-strategies/utils.d.ts.map +1 -0
  159. package/dist/runner/parse-strategies/utils.js +217 -0
  160. package/dist/runner/parse-strategies/utils.js.map +1 -0
  161. package/dist/runner/script-parser.d.ts +43 -0
  162. package/dist/runner/script-parser.d.ts.map +1 -0
  163. package/dist/runner/script-parser.js +68 -0
  164. package/dist/runner/script-parser.js.map +1 -0
  165. package/dist/runner/selector-resolver.d.ts +87 -0
  166. package/dist/runner/selector-resolver.d.ts.map +1 -0
  167. package/dist/runner/selector-resolver.js +206 -0
  168. package/dist/runner/selector-resolver.js.map +1 -0
  169. package/dist/runner/step-executor.d.ts +112 -0
  170. package/dist/runner/step-executor.d.ts.map +1 -0
  171. package/dist/runner/step-executor.js +518 -0
  172. package/dist/runner/step-executor.js.map +1 -0
  173. package/dist/runner/test-runner.d.ts +89 -0
  174. package/dist/runner/test-runner.d.ts.map +1 -0
  175. package/dist/runner/test-runner.js +320 -0
  176. package/dist/runner/test-runner.js.map +1 -0
  177. package/dist/scrcpy/launcher.d.ts +16 -0
  178. package/dist/scrcpy/launcher.d.ts.map +1 -0
  179. package/dist/scrcpy/launcher.js +87 -0
  180. package/dist/scrcpy/launcher.js.map +1 -0
  181. package/dist/services/device-poller.d.ts +10 -0
  182. package/dist/services/device-poller.d.ts.map +1 -0
  183. package/dist/services/device-poller.js +44 -0
  184. package/dist/services/device-poller.js.map +1 -0
  185. package/dist/services/execution-manager.d.ts +18 -0
  186. package/dist/services/execution-manager.d.ts.map +1 -0
  187. package/dist/services/execution-manager.js +185 -0
  188. package/dist/services/execution-manager.js.map +1 -0
  189. package/dist/services/recording-manager.d.ts +13 -0
  190. package/dist/services/recording-manager.d.ts.map +1 -0
  191. package/dist/services/recording-manager.js +234 -0
  192. package/dist/services/recording-manager.js.map +1 -0
  193. package/dist/setup/adb-installer.d.ts +8 -0
  194. package/dist/setup/adb-installer.d.ts.map +1 -0
  195. package/dist/setup/adb-installer.js +115 -0
  196. package/dist/setup/adb-installer.js.map +1 -0
  197. package/dist/setup/appium-installer.d.ts +8 -0
  198. package/dist/setup/appium-installer.d.ts.map +1 -0
  199. package/dist/setup/appium-installer.js +113 -0
  200. package/dist/setup/appium-installer.js.map +1 -0
  201. package/dist/setup/base-installer.d.ts +33 -0
  202. package/dist/setup/base-installer.d.ts.map +1 -0
  203. package/dist/setup/base-installer.js +170 -0
  204. package/dist/setup/base-installer.js.map +1 -0
  205. package/dist/setup/build-tools-installer.d.ts +8 -0
  206. package/dist/setup/build-tools-installer.d.ts.map +1 -0
  207. package/dist/setup/build-tools-installer.js +109 -0
  208. package/dist/setup/build-tools-installer.js.map +1 -0
  209. package/dist/setup/java-installer.d.ts +8 -0
  210. package/dist/setup/java-installer.d.ts.map +1 -0
  211. package/dist/setup/java-installer.js +132 -0
  212. package/dist/setup/java-installer.js.map +1 -0
  213. package/dist/setup/paths.d.ts +12 -0
  214. package/dist/setup/paths.d.ts.map +1 -0
  215. package/dist/setup/paths.js +90 -0
  216. package/dist/setup/paths.js.map +1 -0
  217. package/dist/setup/scrcpy-installer.d.ts +8 -0
  218. package/dist/setup/scrcpy-installer.d.ts.map +1 -0
  219. package/dist/setup/scrcpy-installer.js +143 -0
  220. package/dist/setup/scrcpy-installer.js.map +1 -0
  221. package/dist/setup/setup-manager.d.ts +18 -0
  222. package/dist/setup/setup-manager.d.ts.map +1 -0
  223. package/dist/setup/setup-manager.js +113 -0
  224. package/dist/setup/setup-manager.js.map +1 -0
  225. package/dist/ws/socket.d.ts +38 -0
  226. package/dist/ws/socket.d.ts.map +1 -0
  227. package/dist/ws/socket.js +91 -0
  228. package/dist/ws/socket.js.map +1 -0
  229. package/package.json +53 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Remove aspas e prefixos de seletor para extrair o valor util.
3
+ * Ex: "'~com.app:id/btn'" -> "com.app:id/btn"
4
+ * "'//*[@text=\"Login\"]'" -> '//*[@text="Login"]'
5
+ */
6
+ export declare function cleanSelector(raw: string): string;
7
+ /**
8
+ * Encontra a proxima linha contendo um texto especifico.
9
+ */
10
+ export declare function findLineContaining(lines: string[], currentIndex: number, text: string): string | null;
11
+ /**
12
+ * Coleta N linhas a partir do indice atual como um bloco de texto.
13
+ */
14
+ export declare function collectBlock(lines: string[], startIndex: number, count: number): string;
15
+ /**
16
+ * Determina se uma linha deve ser ignorada (nao e uma acao).
17
+ */
18
+ export declare function shouldSkipLine(line: string): boolean;
19
+ /**
20
+ * Extract the full XPath argument from an AppiumBy.xpath(...) call.
21
+ * Handles concat() expressions that contain internal double-quotes.
22
+ * Returns the content between the outermost quotes, supporting nested parens.
23
+ * e.g. AppiumBy.xpath("//*[@text=concat(\"Don\", \"'\", \"t\")]")
24
+ * -> //*[@text=concat("Don", "'", "t")]
25
+ */
26
+ export declare function extractXpathArg(fragment: string): string | null;
27
+ /**
28
+ * Extract text from an XPath expression, handling both @text='...' and concat().
29
+ * For @text='Some text' -> returns "Some text"
30
+ * For @text=concat("Don", "'", "t") -> returns "Don't"
31
+ * Returns null if no text could be extracted.
32
+ */
33
+ export declare function extractTextFromXpath(xpath: string): string | null;
34
+ /**
35
+ * Resolve const string variables to their values.
36
+ * e.g. const sel = 'android=...'; await $(sel).click() -> await $('android=...').click()
37
+ */
38
+ export declare function resolveVariables(code: string): string;
39
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/runner/parse-strategies/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAOf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA2CpD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA6B/D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBjE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqBrD"}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cleanSelector = cleanSelector;
4
+ exports.findLineContaining = findLineContaining;
5
+ exports.collectBlock = collectBlock;
6
+ exports.shouldSkipLine = shouldSkipLine;
7
+ exports.extractXpathArg = extractXpathArg;
8
+ exports.extractTextFromXpath = extractTextFromXpath;
9
+ exports.resolveVariables = resolveVariables;
10
+ /**
11
+ * Remove aspas e prefixos de seletor para extrair o valor util.
12
+ * Ex: "'~com.app:id/btn'" -> "com.app:id/btn"
13
+ * "'//*[@text=\"Login\"]'" -> '//*[@text="Login"]'
14
+ */
15
+ function cleanSelector(raw) {
16
+ let s = raw.trim();
17
+ // Remover aspas externas
18
+ if ((s.startsWith("'") && s.endsWith("'")) ||
19
+ (s.startsWith('"') && s.endsWith('"'))) {
20
+ s = s.slice(1, -1);
21
+ }
22
+ return s;
23
+ }
24
+ /**
25
+ * Encontra a proxima linha contendo um texto especifico.
26
+ */
27
+ function findLineContaining(lines, currentIndex, text) {
28
+ for (let i = currentIndex + 1; i < lines.length && i < currentIndex + 10; i++) {
29
+ if (lines[i].includes(text)) {
30
+ return lines[i].trim();
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * Coleta N linhas a partir do indice atual como um bloco de texto.
37
+ */
38
+ function collectBlock(lines, startIndex, count) {
39
+ const end = Math.min(startIndex + count, lines.length);
40
+ return lines.slice(startIndex, end).join('\n');
41
+ }
42
+ /**
43
+ * Determina se uma linha deve ser ignorada (nao e uma acao).
44
+ */
45
+ function shouldSkipLine(line) {
46
+ if (!line)
47
+ return true;
48
+ if (line.startsWith('//'))
49
+ return true;
50
+ if (line.startsWith('import '))
51
+ return true;
52
+ if (line.startsWith('const {'))
53
+ return true;
54
+ if (line.startsWith('const capabilities'))
55
+ return true;
56
+ if (line.startsWith('const wdOpts'))
57
+ return true;
58
+ if (line.startsWith('describe('))
59
+ return true;
60
+ if (line.startsWith('test.describe('))
61
+ return true;
62
+ if (line.startsWith('it('))
63
+ return true;
64
+ if (line.startsWith('test('))
65
+ return true;
66
+ if (line.startsWith('beforeAll('))
67
+ return true;
68
+ if (line.startsWith('test.beforeAll('))
69
+ return true;
70
+ if (line.startsWith('afterAll('))
71
+ return true;
72
+ if (line.startsWith('test.afterAll('))
73
+ return true;
74
+ if (line.startsWith('let '))
75
+ return true;
76
+ if (line.startsWith('driver = '))
77
+ return true;
78
+ if (line.startsWith('});'))
79
+ return true;
80
+ if (line === '});')
81
+ return true;
82
+ if (line === '{')
83
+ return true;
84
+ if (line === '}')
85
+ return true;
86
+ if (line === ']);')
87
+ return true;
88
+ if (line.startsWith('platformName'))
89
+ return true;
90
+ if (line.startsWith("'appium:"))
91
+ return true;
92
+ if (line.startsWith('hostname:'))
93
+ return true;
94
+ if (line.startsWith('port:'))
95
+ return true;
96
+ if (line.startsWith('logLevel:'))
97
+ return true;
98
+ if (line.startsWith('capabilities'))
99
+ return true;
100
+ if (line.startsWith('if (driver)'))
101
+ return true;
102
+ if (line.startsWith('if (browser)'))
103
+ return true;
104
+ if (line.startsWith('await driver.deleteSession()'))
105
+ return true;
106
+ if (line.startsWith('console.log('))
107
+ return true;
108
+ if (line.startsWith('expect('))
109
+ return true;
110
+ if (line.startsWith('const [androidDevice]'))
111
+ return true;
112
+ if (line.startsWith('device = '))
113
+ return true;
114
+ if (line.startsWith('await device.close()'))
115
+ return true;
116
+ if (line.startsWith('await device.shell('))
117
+ return true;
118
+ if (line.startsWith("'appium:noReset'"))
119
+ return true;
120
+ if (line.startsWith('driver = await remote'))
121
+ return true;
122
+ if (line.startsWith('@Test'))
123
+ return true;
124
+ if (line.startsWith('@DisplayName'))
125
+ return true;
126
+ return false;
127
+ }
128
+ /**
129
+ * Extract the full XPath argument from an AppiumBy.xpath(...) call.
130
+ * Handles concat() expressions that contain internal double-quotes.
131
+ * Returns the content between the outermost quotes, supporting nested parens.
132
+ * e.g. AppiumBy.xpath("//*[@text=concat(\"Don\", \"'\", \"t\")]")
133
+ * -> //*[@text=concat("Don", "'", "t")]
134
+ */
135
+ function extractXpathArg(fragment) {
136
+ const idx = fragment.indexOf('AppiumBy.xpath(');
137
+ if (idx === -1)
138
+ return null;
139
+ // Start after 'AppiumBy.xpath('
140
+ const start = idx + 'AppiumBy.xpath('.length;
141
+ // Find the quote char that opens the string argument
142
+ const quoteChar = fragment[start];
143
+ if (quoteChar !== '"' && quoteChar !== "'")
144
+ return null;
145
+ // Walk forward counting parens to find the matching close
146
+ let depth = 0;
147
+ let i = start + 1;
148
+ for (; i < fragment.length; i++) {
149
+ const ch = fragment[i];
150
+ if (ch === '(')
151
+ depth++;
152
+ else if (ch === ')') {
153
+ if (depth === 0) {
154
+ // We found the closing paren of xpath(...) — the quote should be just before
155
+ // Actually we need the closing quote before this paren
156
+ break;
157
+ }
158
+ depth--;
159
+ }
160
+ }
161
+ // The xpath arg is from start+1 to the last quote before the closing paren
162
+ // Find the last occurrence of quoteChar before position i
163
+ let end = i - 1;
164
+ while (end > start && fragment[end] !== quoteChar)
165
+ end--;
166
+ if (end <= start)
167
+ return null;
168
+ return fragment.slice(start + 1, end);
169
+ }
170
+ /**
171
+ * Extract text from an XPath expression, handling both @text='...' and concat().
172
+ * For @text='Some text' -> returns "Some text"
173
+ * For @text=concat("Don", "'", "t") -> returns "Don't"
174
+ * Returns null if no text could be extracted.
175
+ */
176
+ function extractTextFromXpath(xpath) {
177
+ // Try standard @text='...' first
178
+ const simpleMatch = xpath.match(/@text='([^']+)'/);
179
+ if (simpleMatch)
180
+ return simpleMatch[1];
181
+ // Try concat() pattern: @text=concat("part1", "'", "part2", ...)
182
+ const concatMatch = xpath.match(/@text=concat\((.+)\)/);
183
+ if (concatMatch) {
184
+ const inner = concatMatch[1];
185
+ // Extract all quoted string parts and join them
186
+ const parts = [];
187
+ const partRegex = /["']([^"']*)["']/g;
188
+ let m;
189
+ while ((m = partRegex.exec(inner)) !== null) {
190
+ parts.push(m[1]);
191
+ }
192
+ if (parts.length > 0)
193
+ return parts.join('');
194
+ }
195
+ return null;
196
+ }
197
+ /**
198
+ * Resolve const string variables to their values.
199
+ * e.g. const sel = 'android=...'; await $(sel).click() -> await $('android=...').click()
200
+ */
201
+ function resolveVariables(code) {
202
+ const vars = new Map();
203
+ // Find all const string declarations
204
+ const constRegex = /const\s+(\w+)\s*=\s*(['"`])(.*?)\2\s*;/g;
205
+ let match;
206
+ while ((match = constRegex.exec(code)) !== null) {
207
+ vars.set(match[1], match[3]);
208
+ }
209
+ // Replace variable references in $() calls
210
+ let result = code;
211
+ for (const [name, value] of vars) {
212
+ // Replace $(varName) with $('value')
213
+ result = result.replace(new RegExp(`\\$\\(${name}\\)`, 'g'), `$('${value}')`);
214
+ }
215
+ return result;
216
+ }
217
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/runner/parse-strategies/utils.ts"],"names":[],"mappings":";;AAKA,sCAUC;AAKD,gDAWC;AAKD,oCAOC;AAKD,wCA2CC;AASD,0CA6BC;AAQD,oDAoBC;AAMD,4CAqBC;AAxLD;;;;GAIG;AACH,SAAgB,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACnB,yBAAyB;IACzB,IACE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EACtC,CAAC;QACD,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAChC,KAAe,EACf,YAAoB,EACpB,IAAY;IAEZ,KAAK,IAAI,CAAC,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,YAAY,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9E,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAC1B,KAAe,EACf,UAAkB,EAClB,KAAa;IAEb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,8BAA8B,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,IAAI,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,QAAgB;IAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChD,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,gCAAgC;IAChC,MAAM,KAAK,GAAG,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAC7C,qDAAqD;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACxD,0DAA0D;IAC1D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,6EAA6E;gBAC7E,uDAAuD;gBACvD,MAAM;YACR,CAAC;YACD,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IACD,2EAA2E;IAC3E,0DAA0D;IAC1D,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,GAAG,GAAG,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,CAAC;IACzD,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,KAAa;IAChD,iCAAiC;IACjC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACnD,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IAEvC,iEAAiE;IACjE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACxD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,gDAAgD;QAChD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,mBAAmB,CAAC;QACtC,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvC,qCAAqC;IACrC,MAAM,UAAU,GAAG,yCAAyC,CAAC;IAC7D,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,2CAA2C;IAC3C,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QACjC,qCAAqC;QACrC,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,IAAI,MAAM,CAAC,SAAS,IAAI,KAAK,EAAE,GAAG,CAAC,EACnC,MAAM,KAAK,IAAI,CAChB,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Tipo de acao de teste reconhecida pelo parser.
3
+ */
4
+ export type TestAction = 'tap' | 'swipe' | 'type_text' | 'press_key' | 'press_back' | 'press_home' | 'launch_app' | 'wait' | 'assert_element' | 'assert_text' | 'long_press' | 'pinch' | 'zoom' | 'rotate';
5
+ /**
6
+ * Passo individual de teste extraido do codigo gerado.
7
+ */
8
+ export interface TestStep {
9
+ action: TestAction;
10
+ params: Record<string, any>;
11
+ line: number;
12
+ raw: string;
13
+ }
14
+ /**
15
+ * Parser que converte codigo Appium/Playwright gerado em passos executaveis.
16
+ *
17
+ * Reconhece os padroes gerados pelos templates:
18
+ * - appium-ts.template.ts
19
+ * - appium-js.template.ts
20
+ * - playwright.template.ts
21
+ * - Maestro YAML
22
+ * - Java Appium
23
+ * - Robot Framework
24
+ * - Python Appium
25
+ */
26
+ export declare class ScriptParser {
27
+ private strategies;
28
+ private context;
29
+ constructor(screenSize?: {
30
+ width: number;
31
+ height: number;
32
+ });
33
+ /**
34
+ * Analisa o codigo de teste e extrai os passos executaveis.
35
+ * Detecta automaticamente o formato e delega para a estrategia correta.
36
+ */
37
+ parse(code: string): TestStep[];
38
+ /**
39
+ * Calcula coordenadas de swipe relativas ao ecra do device.
40
+ */
41
+ private calcSwipeCoords;
42
+ }
43
+ //# sourceMappingURL=script-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-parser.d.ts","sourceRoot":"","sources":["../../src/runner/script-parser.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,OAAO,GACP,WAAW,GACX,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,MAAM,GACN,gBAAgB,GAChB,aAAa,GACb,YAAY,GACZ,OAAO,GACP,MAAM,GACN,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,OAAO,CAAe;gBAElB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAmB1D;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE;IAS/B;;OAEG;IACH,OAAO,CAAC,eAAe;CAgBxB"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScriptParser = void 0;
4
+ const parse_strategies_1 = require("./parse-strategies");
5
+ /**
6
+ * Parser que converte codigo Appium/Playwright gerado em passos executaveis.
7
+ *
8
+ * Reconhece os padroes gerados pelos templates:
9
+ * - appium-ts.template.ts
10
+ * - appium-js.template.ts
11
+ * - playwright.template.ts
12
+ * - Maestro YAML
13
+ * - Java Appium
14
+ * - Robot Framework
15
+ * - Python Appium
16
+ */
17
+ class ScriptParser {
18
+ strategies;
19
+ context;
20
+ constructor(screenSize) {
21
+ const w = screenSize?.width || 1080;
22
+ const h = screenSize?.height || 1920;
23
+ this.context = {
24
+ screenWidth: w,
25
+ screenHeight: h,
26
+ getSwipeCoords: (direction) => this.calcSwipeCoords(direction, w, h),
27
+ };
28
+ this.strategies = [
29
+ new parse_strategies_1.MaestroStrategy(),
30
+ new parse_strategies_1.JavaStrategy(),
31
+ new parse_strategies_1.RobotStrategy(),
32
+ new parse_strategies_1.PythonStrategy(),
33
+ new parse_strategies_1.AppiumDefaultStrategy(), // fallback — always matches
34
+ ];
35
+ }
36
+ /**
37
+ * Analisa o codigo de teste e extrai os passos executaveis.
38
+ * Detecta automaticamente o formato e delega para a estrategia correta.
39
+ */
40
+ parse(code) {
41
+ for (const strategy of this.strategies) {
42
+ if (strategy.detect(code)) {
43
+ return strategy.parse(code, this.context);
44
+ }
45
+ }
46
+ return [];
47
+ }
48
+ /**
49
+ * Calcula coordenadas de swipe relativas ao ecra do device.
50
+ */
51
+ calcSwipeCoords(direction, w, h) {
52
+ const cx = Math.round(w / 2);
53
+ const top = Math.round(h * 0.25);
54
+ const bottom = Math.round(h * 0.75);
55
+ const left = Math.round(w * 0.1);
56
+ const right = Math.round(w * 0.9);
57
+ const cy = Math.round(h / 2);
58
+ switch (direction) {
59
+ case 'UP': return { x1: cx, y1: bottom, x2: cx, y2: top };
60
+ case 'DOWN': return { x1: cx, y1: top, x2: cx, y2: bottom };
61
+ case 'LEFT': return { x1: right, y1: cy, x2: left, y2: cy };
62
+ case 'RIGHT': return { x1: left, y1: cy, x2: right, y2: cy };
63
+ default: return { x1: cx, y1: bottom, x2: cx, y2: top };
64
+ }
65
+ }
66
+ }
67
+ exports.ScriptParser = ScriptParser;
68
+ //# sourceMappingURL=script-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-parser.js","sourceRoot":"","sources":["../../src/runner/script-parser.ts"],"names":[],"mappings":";;;AACA,yDAAyH;AA+BzH;;;;;;;;;;;GAWG;AACH,MAAa,YAAY;IACf,UAAU,CAAkB;IAC5B,OAAO,CAAe;IAE9B,YAAY,UAA8C;QACxD,MAAM,CAAC,GAAG,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC;QACpC,MAAM,CAAC,GAAG,UAAU,EAAE,MAAM,IAAI,IAAI,CAAC;QAErC,IAAI,CAAC,OAAO,GAAG;YACb,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;SACrE,CAAC;QAEF,IAAI,CAAC,UAAU,GAAG;YAChB,IAAI,kCAAe,EAAE;YACrB,IAAI,+BAAY,EAAE;YAClB,IAAI,gCAAa,EAAE;YACnB,IAAI,iCAAc,EAAE;YACpB,IAAI,wCAAqB,EAAE,EAAE,4BAA4B;SAC1D,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAY;QAChB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,SAAiB,EAAE,CAAS,EAAE,CAAS;QAC7D,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE7B,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;YAC1D,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;YAC5D,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAC5D,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAC7D,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;QAC1D,CAAC;IACH,CAAC;CACF;AAvDD,oCAuDC"}
@@ -0,0 +1,87 @@
1
+ import { AdbExecutor } from './adb-executor';
2
+ /**
3
+ * Coordenadas do centro de um elemento resolvido.
4
+ */
5
+ export interface ResolvedElement {
6
+ x: number;
7
+ y: number;
8
+ }
9
+ /**
10
+ * Interface para resolvedores de seletores (Chain of Responsibility).
11
+ * Cada resolver sabe identificar e resolver um formato especifico de seletor.
12
+ */
13
+ export interface SelectorResolver {
14
+ name: string;
15
+ canResolve(selector: string): boolean;
16
+ resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
17
+ }
18
+ /**
19
+ * Resolve seletores por accessibility id (prefixo ~) ou contendo :id/.
20
+ * Ex: ~com.app:id/button, com.app:id/button
21
+ *
22
+ * @deprecated Only needed for pre-v2 test code using ~ prefix.
23
+ * New codegen v2 uses UiSelector().resourceId() format, handled by UiSelectorResolver.
24
+ * Keep for backward compatibility with existing test files.
25
+ */
26
+ export declare class ResourceIdResolver implements SelectorResolver {
27
+ name: string;
28
+ canResolve(selector: string): boolean;
29
+ resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
30
+ }
31
+ /**
32
+ * Resolve seletores XPath por texto: //*[@text="..."]
33
+ */
34
+ export declare class TextXPathResolver implements SelectorResolver {
35
+ name: string;
36
+ canResolve(selector: string): boolean;
37
+ resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
38
+ }
39
+ /**
40
+ * Resolve seletores Playwright por resource-id: [resource-id="..."] ou resource-id="..."
41
+ */
42
+ export declare class PlaywrightResourceIdResolver implements SelectorResolver {
43
+ name: string;
44
+ canResolve(selector: string): boolean;
45
+ resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
46
+ }
47
+ /**
48
+ * Resolve seletores Playwright por texto: text="..."
49
+ */
50
+ export declare class PlaywrightTextResolver implements SelectorResolver {
51
+ name: string;
52
+ canResolve(selector: string): boolean;
53
+ resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
54
+ }
55
+ /**
56
+ * Resolve seletores XPath simples por classe: //android.widget.Button
57
+ */
58
+ export declare class XPathClassResolver implements SelectorResolver {
59
+ name: string;
60
+ canResolve(selector: string): boolean;
61
+ resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
62
+ }
63
+ /**
64
+ * Resolve seletores UiAutomator UiSelector.
65
+ * Extrai .text("..."), .resourceId("..."), .description("..."), .className("...")
66
+ * e tenta cada um em ordem. Como ultimo recurso, tenta o primeiro elemento clicavel.
67
+ */
68
+ export declare class UiSelectorResolver implements SelectorResolver {
69
+ name: string;
70
+ canResolve(selector: string): boolean;
71
+ resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
72
+ }
73
+ /**
74
+ * Resolver de ultimo recurso: tenta como resource-id direto, depois como texto.
75
+ * Aceita qualquer seletor (canResolve sempre retorna true).
76
+ */
77
+ export declare class FallbackResolver implements SelectorResolver {
78
+ name: string;
79
+ canResolve(_selector: string): boolean;
80
+ resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
81
+ }
82
+ /**
83
+ * Cria a cadeia de resolvers na ordem correta de prioridade.
84
+ * A ordem importa: resolvers mais especificos primeiro, fallback por ultimo.
85
+ */
86
+ export declare function createResolverChain(): SelectorResolver[];
87
+ //# sourceMappingURL=selector-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector-resolver.d.ts","sourceRoot":"","sources":["../../src/runner/selector-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;CAClF;AA8CD;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,IAAI,SAAwB;IAE5B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAMjF;AAED;;GAEG;AACH,qBAAa,iBAAkB,YAAW,gBAAgB;IACxD,IAAI,SAAuB;IAE3B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAOjF;AAED;;GAEG;AACH,qBAAa,4BAA6B,YAAW,gBAAgB;IACnE,IAAI,SAAkC;IAEtC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAOjF;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,IAAI,SAA4B;IAEhC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAMjF;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,IAAI,SAAwB;IAE5B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAMjF;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,IAAI,SAAwB;IAE5B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CA+BjF;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,IAAI,SAAsB;IAE1B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAItC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAUjF;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,EAAE,CAUxD"}