swipium 1.5.0 → 2.0.0

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 (498) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +173 -280
  3. package/THREAT_MODEL.md +223 -47
  4. package/dist/appMap/automationLink.js +30 -27
  5. package/dist/appMap/automationLink.js.map +1 -1
  6. package/dist/appMap/build.js +47 -21
  7. package/dist/appMap/build.js.map +1 -1
  8. package/dist/appMap/codeIndex.js +2 -2
  9. package/dist/appMap/codeIndex.js.map +1 -1
  10. package/dist/appMap/featureIndex.js +3 -3
  11. package/dist/appMap/featureIndex.js.map +1 -1
  12. package/dist/appMap/featureModel.js +2 -2
  13. package/dist/appMap/featureModel.js.map +1 -1
  14. package/dist/appMap/firstRunApply.js +2 -2
  15. package/dist/appMap/firstRunApply.js.map +1 -1
  16. package/dist/appMap/issues.js +10 -10
  17. package/dist/appMap/issues.js.map +1 -1
  18. package/dist/appMap/migrations.js +5 -5
  19. package/dist/appMap/migrations.js.map +1 -1
  20. package/dist/appMap/prelaunch.js +2 -2
  21. package/dist/appMap/prelaunch.js.map +1 -1
  22. package/dist/appMap/projectRegistry.js +77 -11
  23. package/dist/appMap/projectRegistry.js.map +1 -1
  24. package/dist/appMap/provenance.js +2 -2
  25. package/dist/appMap/provenance.js.map +1 -1
  26. package/dist/appMap/query.js +2 -2
  27. package/dist/appMap/query.js.map +1 -1
  28. package/dist/appMap/runtimeMerge.js +3 -3
  29. package/dist/appMap/runtimeMerge.js.map +1 -1
  30. package/dist/appMap/schema.js +1 -1
  31. package/dist/appMap/schema.js.map +1 -1
  32. package/dist/appMap/screenMatch.js +1 -1
  33. package/dist/appMap/screenMatch.js.map +1 -1
  34. package/dist/appMap/staticScan.js +17 -17
  35. package/dist/appMap/staticScan.js.map +1 -1
  36. package/dist/appMap/store.js +55 -7
  37. package/dist/appMap/store.js.map +1 -1
  38. package/dist/appMap/tsAstScan.js +3 -3
  39. package/dist/appMap/tsAstScan.js.map +1 -1
  40. package/dist/artifacts/bundletool.js +5 -5
  41. package/dist/artifacts/bundletool.js.map +1 -1
  42. package/dist/artifacts/resolve.js +10 -10
  43. package/dist/artifacts/resolve.js.map +1 -1
  44. package/dist/automation/capabilities.js +3 -3
  45. package/dist/automation/capabilities.js.map +1 -1
  46. package/dist/automation/gestures.js +1 -1
  47. package/dist/automation/gestures.js.map +1 -1
  48. package/dist/automation/plan.js +7 -7
  49. package/dist/automation/plan.js.map +1 -1
  50. package/dist/automation/report.js +3 -3
  51. package/dist/automation/report.js.map +1 -1
  52. package/dist/automation/selectors.js +14 -25
  53. package/dist/automation/selectors.js.map +1 -1
  54. package/dist/automation/types.js +1 -1
  55. package/dist/automation/types.js.map +1 -1
  56. package/dist/automation/waits.js +5 -5
  57. package/dist/automation/waits.js.map +1 -1
  58. package/dist/automation/webview.js +2 -2
  59. package/dist/automation/webview.js.map +1 -1
  60. package/dist/automationGen/appiumModel.js +13 -7
  61. package/dist/automationGen/appiumModel.js.map +1 -1
  62. package/dist/automationGen/ciEmitter.js +5 -5
  63. package/dist/automationGen/ciEmitter.js.map +1 -1
  64. package/dist/automationGen/identifiers.js +224 -0
  65. package/dist/automationGen/identifiers.js.map +1 -0
  66. package/dist/automationGen/jsEmitter.js +265 -106
  67. package/dist/automationGen/jsEmitter.js.map +1 -1
  68. package/dist/automationGen/packagePatch.js +2 -2
  69. package/dist/automationGen/packagePatch.js.map +1 -1
  70. package/dist/automationGen/platformResolve.js +36 -0
  71. package/dist/automationGen/platformResolve.js.map +1 -0
  72. package/dist/automationGen/projectProfile.js +71 -26
  73. package/dist/automationGen/projectProfile.js.map +1 -1
  74. package/dist/automationGen/pythonEmitter.js +276 -105
  75. package/dist/automationGen/pythonEmitter.js.map +1 -1
  76. package/dist/automationGen/readmeEmitter.js +7 -6
  77. package/dist/automationGen/readmeEmitter.js.map +1 -1
  78. package/dist/{tools/automationGenerate.js → automationGen/run.js} +72 -113
  79. package/dist/automationGen/run.js.map +1 -0
  80. package/dist/automationGen/suitePlan.js +6 -4
  81. package/dist/automationGen/suitePlan.js.map +1 -1
  82. package/dist/automationGen/validation.js +20 -8
  83. package/dist/automationGen/validation.js.map +1 -1
  84. package/dist/build/parseBuildLog.js +2 -2
  85. package/dist/build/parseBuildLog.js.map +1 -1
  86. package/dist/build/plan.js +7 -7
  87. package/dist/build/plan.js.map +1 -1
  88. package/dist/ci/preflight.js +13 -4
  89. package/dist/ci/preflight.js.map +1 -1
  90. package/dist/cli/gc.js +74 -0
  91. package/dist/cli/gc.js.map +1 -0
  92. package/dist/cli/init.js +217 -26
  93. package/dist/cli/init.js.map +1 -1
  94. package/dist/cli/main.js +50 -0
  95. package/dist/cli/main.js.map +1 -0
  96. package/dist/cli/report.js +218 -0
  97. package/dist/cli/report.js.map +1 -0
  98. package/dist/cli/scan.js +35 -14
  99. package/dist/cli/scan.js.map +1 -1
  100. package/dist/cli/suite.js +6 -6
  101. package/dist/cli/suite.js.map +1 -1
  102. package/dist/cli/verify.js +7 -7
  103. package/dist/cli/verify.js.map +1 -1
  104. package/dist/consent/consent.js +162 -5
  105. package/dist/consent/consent.js.map +1 -1
  106. package/dist/context/detect.js +45 -14
  107. package/dist/context/detect.js.map +1 -1
  108. package/dist/context/findApps.js +6 -6
  109. package/dist/context/findApps.js.map +1 -1
  110. package/dist/context/projectRoot.js +174 -19
  111. package/dist/context/projectRoot.js.map +1 -1
  112. package/dist/context/scan.js +1 -1
  113. package/dist/context/scan.js.map +1 -1
  114. package/dist/core/capabilityGroups.js +90 -0
  115. package/dist/core/capabilityGroups.js.map +1 -0
  116. package/dist/core/target.js +3 -3
  117. package/dist/core/target.js.map +1 -1
  118. package/dist/core/targetPlan.js +65 -62
  119. package/dist/core/targetPlan.js.map +1 -1
  120. package/dist/drivers/DirectDriver.js +300 -36
  121. package/dist/drivers/DirectDriver.js.map +1 -1
  122. package/dist/drivers/SimctlDriver.js +120 -7
  123. package/dist/drivers/SimctlDriver.js.map +1 -1
  124. package/dist/drivers/WdaDriver.js +350 -50
  125. package/dist/drivers/WdaDriver.js.map +1 -1
  126. package/dist/explore/candidates.js +2 -2
  127. package/dist/explore/candidates.js.map +1 -1
  128. package/dist/explore/graph.js +5 -5
  129. package/dist/explore/graph.js.map +1 -1
  130. package/dist/explore/policy.js +5 -5
  131. package/dist/explore/policy.js.map +1 -1
  132. package/dist/explore/runner.js +301 -284
  133. package/dist/explore/runner.js.map +1 -1
  134. package/dist/explore/signatures.js +1 -1
  135. package/dist/featureTesting/executionBootstrap.js +29 -30
  136. package/dist/featureTesting/executionBootstrap.js.map +1 -1
  137. package/dist/featureTesting/featureMap.js +2 -2
  138. package/dist/featureTesting/featureMap.js.map +1 -1
  139. package/dist/featureTesting/featureScope.js +12 -12
  140. package/dist/featureTesting/featureScope.js.map +1 -1
  141. package/dist/featureTesting/mapFeatureScope.js +7 -7
  142. package/dist/featureTesting/mapFeatureScope.js.map +1 -1
  143. package/dist/featureTesting/objectiveModel.js +10 -10
  144. package/dist/featureTesting/objectiveModel.js.map +1 -1
  145. package/dist/featureTesting/resultMerge.js +6 -6
  146. package/dist/featureTesting/resultMerge.js.map +1 -1
  147. package/dist/featureTesting/sources.js +4 -4
  148. package/dist/featureTesting/sources.js.map +1 -1
  149. package/dist/featureTesting/suiteBridge.js +1 -1
  150. package/dist/featureTesting/suiteBridge.js.map +1 -1
  151. package/dist/featureTesting/synonyms.js +1 -1
  152. package/dist/featureTesting/synonyms.js.map +1 -1
  153. package/dist/featureTesting/testCaseFactory.js +11 -11
  154. package/dist/featureTesting/testCaseFactory.js.map +1 -1
  155. package/dist/featureTesting/testPlan.js +3 -3
  156. package/dist/featureTesting/testPlan.js.map +1 -1
  157. package/dist/firstRun/authStateMachine.js +1 -1
  158. package/dist/firstRun/authStateMachine.js.map +1 -1
  159. package/dist/firstRun/classifyScreen.js +5 -5
  160. package/dist/firstRun/classifyScreen.js.map +1 -1
  161. package/dist/firstRun/firstRunPlanner.js +11 -11
  162. package/dist/firstRun/firstRunPlanner.js.map +1 -1
  163. package/dist/firstRun/firstRunRunner.js +8 -8
  164. package/dist/firstRun/firstRunRunner.js.map +1 -1
  165. package/dist/firstRun/generatedDataPolicy.js +9 -9
  166. package/dist/firstRun/generatedDataPolicy.js.map +1 -1
  167. package/dist/firstRun/inputPlanner.js +5 -5
  168. package/dist/firstRun/inputPlanner.js.map +1 -1
  169. package/dist/firstRun/onboardingStateMachine.js +1 -1
  170. package/dist/firstRun/onboardingStateMachine.js.map +1 -1
  171. package/dist/firstRun/paywallPolicy.js +3 -3
  172. package/dist/firstRun/paywallPolicy.js.map +1 -1
  173. package/dist/firstRun/types.js +1 -1
  174. package/dist/firstRun/types.js.map +1 -1
  175. package/dist/fixtures/catalog.js +33 -3
  176. package/dist/fixtures/catalog.js.map +1 -1
  177. package/dist/fixtures/load.js +50 -0
  178. package/dist/fixtures/load.js.map +1 -0
  179. package/dist/flows/discover.js +2 -2
  180. package/dist/flows/discover.js.map +1 -1
  181. package/dist/flows/generate.js +20 -10
  182. package/dist/flows/generate.js.map +1 -1
  183. package/dist/flows/pack.js +3 -3
  184. package/dist/flows/pack.js.map +1 -1
  185. package/dist/flows/paths.js +57 -0
  186. package/dist/flows/paths.js.map +1 -0
  187. package/dist/flows/repair.js +111 -23
  188. package/dist/flows/repair.js.map +1 -1
  189. package/dist/flows/run.js +153 -57
  190. package/dist/flows/run.js.map +1 -1
  191. package/dist/flows/schema.js +50 -5
  192. package/dist/flows/schema.js.map +1 -1
  193. package/dist/flows/seedExec.js +4 -4
  194. package/dist/flows/seedExec.js.map +1 -1
  195. package/dist/flows/templates.js +5 -5
  196. package/dist/index.js +50 -8
  197. package/dist/index.js.map +1 -1
  198. package/dist/issues/classify.js +16 -16
  199. package/dist/issues/classify.js.map +1 -1
  200. package/dist/issues/fingerprint.js +24 -4
  201. package/dist/issues/fingerprint.js.map +1 -1
  202. package/dist/issues/index.js +94 -31
  203. package/dist/issues/index.js.map +1 -1
  204. package/dist/issues/metrics.js +4 -4
  205. package/dist/issues/metrics.js.map +1 -1
  206. package/dist/issues/recurrence.js +35 -8
  207. package/dist/issues/recurrence.js.map +1 -1
  208. package/dist/issues/report.js +4 -4
  209. package/dist/issues/report.js.map +1 -1
  210. package/dist/issues/reportBridge.js +4 -4
  211. package/dist/issues/reportBridge.js.map +1 -1
  212. package/dist/issues/schema.js +2 -2
  213. package/dist/issues/schema.js.map +1 -1
  214. package/dist/issues/sourceRevision.js +2 -2
  215. package/dist/issues/sourceRevision.js.map +1 -1
  216. package/dist/issues/store.js +110 -32
  217. package/dist/issues/store.js.map +1 -1
  218. package/dist/lib/abortScope.js +48 -0
  219. package/dist/lib/abortScope.js.map +1 -0
  220. package/dist/lib/android.js +75 -7
  221. package/dist/lib/android.js.map +1 -1
  222. package/dist/lib/coordSpace.js +1 -1
  223. package/dist/lib/coordSpace.js.map +1 -1
  224. package/dist/lib/device.js +32 -7
  225. package/dist/lib/device.js.map +1 -1
  226. package/dist/lib/gestures.js +141 -0
  227. package/dist/lib/gestures.js.map +1 -0
  228. package/dist/lib/gitignore.js +4 -3
  229. package/dist/lib/gitignore.js.map +1 -1
  230. package/dist/lib/image.js +1 -1
  231. package/dist/lib/image.js.map +1 -1
  232. package/dist/lib/lockfile.js +370 -31
  233. package/dist/lib/lockfile.js.map +1 -1
  234. package/dist/lib/needsInput.js +3 -3
  235. package/dist/lib/needsInput.js.map +1 -1
  236. package/dist/lib/png.js +2 -2
  237. package/dist/lib/png.js.map +1 -1
  238. package/dist/lib/redact.js +170 -9
  239. package/dist/lib/redact.js.map +1 -1
  240. package/dist/lib/result.js +79 -10
  241. package/dist/lib/result.js.map +1 -1
  242. package/dist/lib/schemaHash.js +3 -3
  243. package/dist/lib/schemaHash.js.map +1 -1
  244. package/dist/lib/sensitive.js +3 -2
  245. package/dist/lib/sensitive.js.map +1 -1
  246. package/dist/lib/simctl.js +3 -3
  247. package/dist/lib/simctl.js.map +1 -1
  248. package/dist/lib/spawn.js +52 -10
  249. package/dist/lib/spawn.js.map +1 -1
  250. package/dist/lib/toolAnnotations.js +114 -0
  251. package/dist/lib/toolAnnotations.js.map +1 -0
  252. package/dist/lib/wda.js +294 -15
  253. package/dist/lib/wda.js.map +1 -1
  254. package/dist/mobileAudit/checks.js +12 -12
  255. package/dist/mobileAudit/checks.js.map +1 -1
  256. package/dist/mobileAudit/evidence.js +4 -4
  257. package/dist/mobileAudit/evidence.js.map +1 -1
  258. package/dist/mobileAudit/profiles.js +1 -1
  259. package/dist/mobileAudit/profiles.js.map +1 -1
  260. package/dist/mobileAudit/results.js +3 -3
  261. package/dist/mobileAudit/results.js.map +1 -1
  262. package/dist/mobileAudit/runner.js +72 -18
  263. package/dist/mobileAudit/runner.js.map +1 -1
  264. package/dist/oracle/auth.js +1 -1
  265. package/dist/oracle/auth.js.map +1 -1
  266. package/dist/oracle/failures.js +219 -36
  267. package/dist/oracle/failures.js.map +1 -1
  268. package/dist/oracle/health.js +63 -17
  269. package/dist/oracle/health.js.map +1 -1
  270. package/dist/oracle/locator.js +13 -13
  271. package/dist/oracle/locator.js.map +1 -1
  272. package/dist/oracle/record.js +3 -3
  273. package/dist/oracle/record.js.map +1 -1
  274. package/dist/orchestration/envelope.js +2 -2
  275. package/dist/orchestration/envelope.js.map +1 -1
  276. package/dist/orchestration/goal.js +4 -4
  277. package/dist/orchestration/goal.js.map +1 -1
  278. package/dist/orchestration/testThis/execute.js +62 -21
  279. package/dist/orchestration/testThis/execute.js.map +1 -1
  280. package/dist/orchestration/testThis/pipeline.js +119 -30
  281. package/dist/orchestration/testThis/pipeline.js.map +1 -1
  282. package/dist/orchestration/testThis/plan.js +162 -73
  283. package/dist/orchestration/testThis/plan.js.map +1 -1
  284. package/dist/orchestration/testThis/sessionIntent.js +72 -0
  285. package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
  286. package/dist/orchestration/testThis/terminal.js +34 -16
  287. package/dist/orchestration/testThis/terminal.js.map +1 -1
  288. package/dist/orchestration/testThis/types.js +1 -1
  289. package/dist/orchestration/testThis/types.js.map +1 -1
  290. package/dist/plan/plan.js +9 -9
  291. package/dist/plan/plan.js.map +1 -1
  292. package/dist/prompts/index.js +22 -22
  293. package/dist/prompts/index.js.map +1 -1
  294. package/dist/report/export.js +392 -37
  295. package/dist/report/export.js.map +1 -1
  296. package/dist/report/findingsDedupe.js +41 -0
  297. package/dist/report/findingsDedupe.js.map +1 -0
  298. package/dist/report/policy.js +7 -4
  299. package/dist/report/policy.js.map +1 -1
  300. package/dist/report/qaLevel.js +8 -8
  301. package/dist/report/qaLevel.js.map +1 -1
  302. package/dist/report/sarifSources.js +160 -0
  303. package/dist/report/sarifSources.js.map +1 -0
  304. package/dist/report/summary.js +2 -2
  305. package/dist/report/summary.js.map +1 -1
  306. package/dist/report/testCatalog.js +4 -4
  307. package/dist/report/testCatalog.js.map +1 -1
  308. package/dist/report/toolHealth.js +124 -0
  309. package/dist/report/toolHealth.js.map +1 -0
  310. package/dist/server.js +472 -45
  311. package/dist/server.js.map +1 -1
  312. package/dist/services/automationGenerate.js +8 -2
  313. package/dist/services/automationGenerate.js.map +1 -1
  314. package/dist/services/build.js +2 -2
  315. package/dist/services/build.js.map +1 -1
  316. package/dist/{tools → services}/flowGenerate.js +29 -13
  317. package/dist/services/flowGenerate.js.map +1 -0
  318. package/dist/services/preflight.js +4 -4
  319. package/dist/services/preflight.js.map +1 -1
  320. package/dist/services/prepareAndroid.js +46 -8
  321. package/dist/services/prepareAndroid.js.map +1 -1
  322. package/dist/services/prepareIos.js +24 -9
  323. package/dist/services/prepareIos.js.map +1 -1
  324. package/dist/services/report.js +100 -45
  325. package/dist/services/report.js.map +1 -1
  326. package/dist/services/smoke.js +32 -16
  327. package/dist/services/smoke.js.map +1 -1
  328. package/dist/services/suiteGenerate.js +28 -3
  329. package/dist/services/suiteGenerate.js.map +1 -1
  330. package/dist/services/testSuiteKnowledge.js +40 -27
  331. package/dist/services/testSuiteKnowledge.js.map +1 -1
  332. package/dist/session/attach.js +270 -6
  333. package/dist/session/attach.js.map +1 -1
  334. package/dist/session/processRegistry.js +317 -48
  335. package/dist/session/processRegistry.js.map +1 -1
  336. package/dist/session/progress.js +1 -1
  337. package/dist/session/retention.js +201 -0
  338. package/dist/session/retention.js.map +1 -0
  339. package/dist/session/store.js +275 -48
  340. package/dist/session/store.js.map +1 -1
  341. package/dist/snapshot/overlays.js +53 -8
  342. package/dist/snapshot/overlays.js.map +1 -1
  343. package/dist/snapshot/parse.js +28 -4
  344. package/dist/snapshot/parse.js.map +1 -1
  345. package/dist/snapshot/present.js +11 -5
  346. package/dist/snapshot/present.js.map +1 -1
  347. package/dist/snapshot/settle.js +39 -9
  348. package/dist/snapshot/settle.js.map +1 -1
  349. package/dist/state/consent.js +99 -0
  350. package/dist/state/consent.js.map +1 -0
  351. package/dist/state/profile.js +46 -2
  352. package/dist/state/profile.js.map +1 -1
  353. package/dist/suite/compile.js +9 -5
  354. package/dist/suite/compile.js.map +1 -1
  355. package/dist/suite/lint.js +4 -4
  356. package/dist/suite/lint.js.map +1 -1
  357. package/dist/suite/pom.js +50 -41
  358. package/dist/suite/pom.js.map +1 -1
  359. package/dist/suite/secretGuard.js +266 -0
  360. package/dist/suite/secretGuard.js.map +1 -0
  361. package/dist/suite/testcase.js +9 -7
  362. package/dist/suite/testcase.js.map +1 -1
  363. package/dist/testSuite/exporter.js +4 -4
  364. package/dist/testSuite/exporter.js.map +1 -1
  365. package/dist/testSuite/generator.js +13 -9
  366. package/dist/testSuite/generator.js.map +1 -1
  367. package/dist/testSuite/history.js +1 -1
  368. package/dist/testSuite/history.js.map +1 -1
  369. package/dist/testSuite/issueLinks.js +3 -3
  370. package/dist/testSuite/issueLinks.js.map +1 -1
  371. package/dist/testSuite/lint.js +4 -4
  372. package/dist/testSuite/lint.js.map +1 -1
  373. package/dist/testSuite/merge.js +5 -5
  374. package/dist/testSuite/merge.js.map +1 -1
  375. package/dist/testSuite/schema.js +5 -5
  376. package/dist/testSuite/schema.js.map +1 -1
  377. package/dist/testSuite/store.js +3 -3
  378. package/dist/testSuite/store.js.map +1 -1
  379. package/dist/testSuite/traceability.js +2 -2
  380. package/dist/testSuite/traceability.js.map +1 -1
  381. package/dist/tools/act.js +794 -164
  382. package/dist/tools/act.js.map +1 -1
  383. package/dist/tools/agent.js +451 -128
  384. package/dist/tools/agent.js.map +1 -1
  385. package/dist/tools/appControl.js +69 -19
  386. package/dist/tools/appControl.js.map +1 -1
  387. package/dist/tools/appMap.js +188 -130
  388. package/dist/tools/appMap.js.map +1 -1
  389. package/dist/tools/build.js +32 -42
  390. package/dist/tools/build.js.map +1 -1
  391. package/dist/tools/bundletool.js +21 -31
  392. package/dist/tools/bundletool.js.map +1 -1
  393. package/dist/tools/clearOverlay.js +55 -12
  394. package/dist/tools/clearOverlay.js.map +1 -1
  395. package/dist/tools/device.js +76 -24
  396. package/dist/tools/device.js.map +1 -1
  397. package/dist/tools/doctor.js +68 -28
  398. package/dist/tools/doctor.js.map +1 -1
  399. package/dist/tools/explore.js +41 -47
  400. package/dist/tools/explore.js.map +1 -1
  401. package/dist/tools/featureTesting.js +31 -48
  402. package/dist/tools/featureTesting.js.map +1 -1
  403. package/dist/tools/firstRun.js +34 -41
  404. package/dist/tools/firstRun.js.map +1 -1
  405. package/dist/tools/flow.js +183 -103
  406. package/dist/tools/flow.js.map +1 -1
  407. package/dist/tools/flowRepair.js +25 -13
  408. package/dist/tools/flowRepair.js.map +1 -1
  409. package/dist/tools/generate.js +52 -89
  410. package/dist/tools/generate.js.map +1 -1
  411. package/dist/tools/getArtifact.js +16 -5
  412. package/dist/tools/getArtifact.js.map +1 -1
  413. package/dist/tools/health.js +15 -12
  414. package/dist/tools/health.js.map +1 -1
  415. package/dist/tools/ios.js +45 -223
  416. package/dist/tools/ios.js.map +1 -1
  417. package/dist/tools/issues.js +251 -35
  418. package/dist/tools/issues.js.map +1 -1
  419. package/dist/tools/jobs.js +41 -16
  420. package/dist/tools/jobs.js.map +1 -1
  421. package/dist/tools/metro.js +36 -35
  422. package/dist/tools/metro.js.map +1 -1
  423. package/dist/tools/mobileAudit.js +50 -45
  424. package/dist/tools/mobileAudit.js.map +1 -1
  425. package/dist/tools/network.js +31 -14
  426. package/dist/tools/network.js.map +1 -1
  427. package/dist/tools/note.js +26 -26
  428. package/dist/tools/note.js.map +1 -1
  429. package/dist/tools/prepareIosTarget.js +10 -16
  430. package/dist/tools/prepareIosTarget.js.map +1 -1
  431. package/dist/tools/prepareTarget.js +117 -50
  432. package/dist/tools/prepareTarget.js.map +1 -1
  433. package/dist/tools/report.js +11 -22
  434. package/dist/tools/report.js.map +1 -1
  435. package/dist/tools/resolveArtifact.js +11 -15
  436. package/dist/tools/resolveArtifact.js.map +1 -1
  437. package/dist/tools/resolveTarget.js +78 -24
  438. package/dist/tools/resolveTarget.js.map +1 -1
  439. package/dist/tools/screenRecord.js +23 -21
  440. package/dist/tools/screenRecord.js.map +1 -1
  441. package/dist/tools/screenshot.js +23 -16
  442. package/dist/tools/screenshot.js.map +1 -1
  443. package/dist/tools/smoke.js +20 -16
  444. package/dist/tools/smoke.js.map +1 -1
  445. package/dist/tools/snapshot.js +155 -118
  446. package/dist/tools/snapshot.js.map +1 -1
  447. package/dist/tools/startSession.js +104 -116
  448. package/dist/tools/startSession.js.map +1 -1
  449. package/dist/tools/suite.js +72 -43
  450. package/dist/tools/suite.js.map +1 -1
  451. package/dist/tools/testSuite.js +30 -20
  452. package/dist/tools/testSuite.js.map +1 -1
  453. package/dist/tools/testThis.js +24 -28
  454. package/dist/tools/testThis.js.map +1 -1
  455. package/dist/tools/visual.js +686 -210
  456. package/dist/tools/visual.js.map +1 -1
  457. package/dist/tools/wait.js +9 -38
  458. package/dist/tools/wait.js.map +1 -1
  459. package/dist/tools/wda.js +187 -57
  460. package/dist/tools/wda.js.map +1 -1
  461. package/dist/version.js +31 -22
  462. package/dist/version.js.map +1 -1
  463. package/dist/visual/ocr.js +53 -6
  464. package/dist/visual/ocr.js.map +1 -1
  465. package/dist/visual/provider.js +80 -12
  466. package/dist/visual/provider.js.map +1 -1
  467. package/docs/README.md +24 -10
  468. package/docs/ci-reports.md +328 -0
  469. package/docs/concepts.md +227 -0
  470. package/docs/flows.md +153 -0
  471. package/docs/mcp-server.md +194 -128
  472. package/docs/physical-devices.md +84 -0
  473. package/docs/tools.md +812 -152
  474. package/package.json +3 -2
  475. package/dist/tools/assertVisual.js +0 -84
  476. package/dist/tools/assertVisual.js.map +0 -1
  477. package/dist/tools/automationGenerate.js.map +0 -1
  478. package/dist/tools/capabilities.js +0 -179
  479. package/dist/tools/capabilities.js.map +0 -1
  480. package/dist/tools/detectContext.js +0 -41
  481. package/dist/tools/detectContext.js.map +0 -1
  482. package/dist/tools/flowGenerate.js.map +0 -1
  483. package/dist/tools/history.js +0 -86
  484. package/dist/tools/history.js.map +0 -1
  485. package/dist/tools/locator.js +0 -85
  486. package/dist/tools/locator.js.map +0 -1
  487. package/dist/tools/permissions.js +0 -174
  488. package/dist/tools/permissions.js.map +0 -1
  489. package/dist/tools/plan.js +0 -52
  490. package/dist/tools/plan.js.map +0 -1
  491. package/dist/tools/screenInfo.js +0 -76
  492. package/dist/tools/screenInfo.js.map +0 -1
  493. package/dist/tools/seed.js +0 -133
  494. package/dist/tools/seed.js.map +0 -1
  495. package/dist/tools/state.js +0 -217
  496. package/dist/tools/state.js.map +0 -1
  497. package/dist/tools/visualText.js +0 -106
  498. package/dist/tools/visualText.js.map +0 -1
@@ -1,8 +1,11 @@
1
- // SWIPIUM-REQ-04 — Python Appium emitter. Pure: turns the shared Appium model into a runnable
1
+ // Python Appium emitter. Pure: turns the shared Appium model into a runnable
2
2
  // Python Appium-Python-Client POM suite (pytest when the project uses it, else unittest). POM
3
3
  // classes centralize selectors; AppiumBy strategies prefer accessibility id / id; iOS predicate /
4
4
  // class-chain only where required; XPath is never emitted. Aligns with the Appium Python quickstart.
5
+ import { defaultPlatformOf } from './platformResolve.js';
6
+ import { NameAllocator, UnemittableStepError, checkDirection, checkKey, className, commentSafe, pyName, screensOf } from './identifiers.js';
5
7
  const DEFAULT_TIMEOUT = 15;
8
+ const MAX_SCROLLS = 8;
6
9
  function snake(s) {
7
10
  return (s
8
11
  .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
@@ -10,7 +13,72 @@ function snake(s) {
10
13
  .replace(/^_+|_+$/g, '')
11
14
  .toLowerCase() || 'x');
12
15
  }
13
- /** Env var (SWIPIUM_TEST_PASSWORD) → a stable test_data key (password). */
16
+ /** Every attribute BaseScreen defines. A generated attribute/method must never shadow one (a class
17
+ * attribute named `tap` would replace the tap() helper at runtime). */
18
+ const PY_BASE_MEMBERS = [
19
+ 'driver',
20
+ 'find',
21
+ 'tap',
22
+ 'type',
23
+ 'type_focused',
24
+ 'scroll_to',
25
+ 'scroll_to_text',
26
+ 'is_visible',
27
+ 'assert_visible',
28
+ 'assert_text_visible',
29
+ 'tap_at',
30
+ 'press_key',
31
+ 'swipe',
32
+ 'open_url',
33
+ 'self',
34
+ 'cls',
35
+ ];
36
+ function methodKey(action, element) {
37
+ return `${action}|${element}`;
38
+ }
39
+ function planPyNames(model) {
40
+ const classes = new NameAllocator(['BaseScreen', 'AppiumBy', 'SmokeTest', 'WebDriverWait', 'EC'], (s) => s.toLowerCase());
41
+ const modules = new NameAllocator(['base_screen', '__init__'], (s) => s.toLowerCase());
42
+ const instances = new NameAllocator([
43
+ 'driver',
44
+ 'test_data',
45
+ 'self',
46
+ 'os',
47
+ 'unittest',
48
+ 'pytest',
49
+ 'webdriver',
50
+ 'build_options',
51
+ 'AppiumBy',
52
+ ]);
53
+ const plan = new Map();
54
+ for (const screen of screensOf(model)) {
55
+ const cls = classes.alloc(className(screen.className));
56
+ const module = modules.alloc(pyName(cls, 'screen'), '_');
57
+ const instance = instances.alloc(pyName(cls, 'screen'), '_');
58
+ // Leading-underscore names are private helpers (_spec, _scroll_once …); pyName never emits them.
59
+ const members = new NameAllocator(PY_BASE_MEMBERS);
60
+ const attrs = new Map();
61
+ for (const el of screen.elements)
62
+ if (!attrs.has(el.name))
63
+ attrs.set(el.name, members.alloc(pyName(el.name), '_'));
64
+ const methods = new Map();
65
+ for (const s of model.steps) {
66
+ if (s.screen !== screen.className || !s.element)
67
+ continue;
68
+ const attr = attrs.get(s.element);
69
+ if (!attr) {
70
+ throw new UnemittableStepError(`cannot emit ${s.action} step on ${screen.className}: element ${JSON.stringify(s.element)} is not declared on that screen`);
71
+ }
72
+ const key = methodKey(s.action, s.element);
73
+ if (methods.has(key))
74
+ continue;
75
+ methods.set(key, members.alloc(methodBase(s.action, attr.replace(/_+$/, '')), '_'));
76
+ }
77
+ plan.set(screen.className, { cls, module, instance, attrs, methods });
78
+ }
79
+ return plan;
80
+ }
81
+ /** Env var (SWIPIUM_TEST_PASSWORD) > a stable test_data key (password). */
14
82
  export function pyVarToKey(v) {
15
83
  const stripped = v.replace(/^SWIPIUM_(TEST_)?/i, '');
16
84
  return snake(stripped) || 'value';
@@ -18,6 +86,12 @@ export function pyVarToKey(v) {
18
86
  function pyStr(s) {
19
87
  return JSON.stringify(s);
20
88
  }
89
+ /** Escape a value embedded inside a double-quoted literal WITHIN a selector expression
90
+ * (UiSelector text / iOS predicate). Backslashes FIRST, then quotes. pyStr() only wraps the
91
+ * OUTER Python string, so the inner quoted literal must escape its own \ and " itself. */
92
+ function innerQuoted(s) {
93
+ return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
94
+ }
21
95
  /** (AppiumBy.<X>, "<value>") tuple for one Appium locator. No XPath, ever. */
22
96
  export function appiumByTuple(loc) {
23
97
  switch (loc.strategy) {
@@ -26,9 +100,9 @@ export function appiumByTuple(loc) {
26
100
  case 'id':
27
101
  return `(AppiumBy.ID, ${pyStr(loc.value)})`;
28
102
  case 'androidUiautomator':
29
- return `(AppiumBy.ANDROID_UIAUTOMATOR, ${pyStr(`new UiSelector().text("${loc.value.replace(/"/g, '\\"')}")`)})`;
103
+ return `(AppiumBy.ANDROID_UIAUTOMATOR, ${pyStr(`new UiSelector().text("${innerQuoted(loc.value)}")`)})`;
30
104
  case 'name':
31
- return `(AppiumBy.IOS_PREDICATE, ${pyStr(`name == "${loc.value.replace(/"/g, '\\"')}" OR label == "${loc.value.replace(/"/g, '\\"')}"`)})`;
105
+ return `(AppiumBy.IOS_PREDICATE, ${pyStr(`name == "${innerQuoted(loc.value)}" OR label == "${innerQuoted(loc.value)}"`)})`;
32
106
  case 'iosPredicate':
33
107
  return `(AppiumBy.IOS_PREDICATE, ${pyStr(loc.value)})`;
34
108
  case 'iosClassChain':
@@ -61,6 +135,10 @@ function locatorDict(el) {
61
135
  return `{${parts.join(', ')}}`;
62
136
  }
63
137
  export function emitPythonSuite(input) {
138
+ // Plan every class/attribute/method name up front (H4) and validate every step is emittable
139
+ // (§4). Generation fails loudly here rather than writing a suite with silent no-op steps.
140
+ const names = planPyNames(input.model);
141
+ const smoke = input.framework === 'pytest' ? pytestSmoke(input.model, names) : unittestSmoke(input.model, names);
64
142
  const files = [];
65
143
  files.push({ path: 'requirements.txt', content: requirementsTxt(input) });
66
144
  if (input.framework === 'pytest')
@@ -68,20 +146,18 @@ export function emitPythonSuite(input) {
68
146
  files.push({ path: 'conftest.py', content: conftest(input) });
69
147
  files.push({ path: 'screens/__init__.py', content: '' });
70
148
  files.push({ path: 'screens/base_screen.py', content: baseScreen() });
71
- for (const screen of input.model.screens) {
72
- files.push({ path: `screens/${snake(screen.className)}.py`, content: screenClass(screen, input.model.steps) });
149
+ for (const screen of screensOf(input.model)) {
150
+ const n = names.get(screen.className);
151
+ files.push({ path: `screens/${n.module}.py`, content: screenClass(screen, n, input.model.steps) });
73
152
  }
74
153
  files.push({ path: 'data/__init__.py', content: '' });
75
154
  files.push({ path: 'data/test_data.py', content: testData(input.model) });
76
155
  files.push({ path: 'tests/__init__.py', content: '' });
77
- files.push({
78
- path: input.framework === 'pytest' ? 'tests/test_smoke.py' : 'tests/test_smoke.py',
79
- content: input.framework === 'pytest' ? pytestSmoke(input.model) : unittestSmoke(input.model, input),
80
- });
156
+ files.push({ path: 'tests/test_smoke.py', content: smoke });
81
157
  return files;
82
158
  }
83
159
  function requirementsTxt(input) {
84
- const lines = ['# Generated by Swipium — review before committing.', 'Appium-Python-Client>=4.0.0', 'selenium>=4.20.0'];
160
+ const lines = ['# Generated by Swipium. Review before committing.', 'Appium-Python-Client>=4.0.0', 'selenium>=4.20.0'];
85
161
  if (input.framework === 'pytest')
86
162
  lines.push('pytest>=8.0.0');
87
163
  return lines.join('\n') + '\n';
@@ -96,8 +172,8 @@ addopts = -ra
96
172
  }
97
173
  function conftest(input) {
98
174
  const appId = input.appId ?? '';
99
- return `# Generated by Swipium. Appium driver fixture — ALL device/app config is environment-driven.
100
- # Android UiAutomator2 is the default fast-feedback backend; set SWIPIUM_PLATFORM=ios for XCUITest.
175
+ return `# Generated by Swipium. Appium driver fixture. ALL device/app config is environment-driven.
176
+ # Default platform: ${defaultPlatformOf(input.profile, input.model)}. Override with SWIPIUM_PLATFORM=android|ios.
101
177
  import os
102
178
  import pytest
103
179
  from appium import webdriver
@@ -106,7 +182,7 @@ from appium.options.ios import XCUITestOptions
106
182
 
107
183
 
108
184
  def build_options():
109
- platform = os.environ.get("SWIPIUM_PLATFORM", "${input.model.platforms.android ? 'android' : 'ios'}").lower()
185
+ platform = os.environ.get("SWIPIUM_PLATFORM", "${defaultPlatformOf(input.profile, input.model)}").lower()
110
186
  if platform == "ios":
111
187
  opts = XCUITestOptions()
112
188
  opts.device_name = os.environ.get("IOS_DEVICE_NAME", "iPhone 15")
@@ -145,27 +221,46 @@ def driver():
145
221
  function baseScreen() {
146
222
  return `# Generated by Swipium. BaseScreen centralizes element interaction so selectors resolve
147
223
  # per-platform in ONE place and tests never touch raw selectors.
148
- from appium.webdriver.common.appiumby import AppiumBy # noqa: F401 (used by screen subclasses)
224
+ from appium.webdriver.common.appiumby import AppiumBy
149
225
  from selenium.webdriver.support.ui import WebDriverWait
150
226
  from selenium.webdriver.support import expected_conditions as EC
151
227
 
152
228
  DEFAULT_TIMEOUT = ${DEFAULT_TIMEOUT}
229
+ # Upper bound on scroll gestures while looking for an element, so never an endless loop.
230
+ MAX_SCROLLS = ${MAX_SCROLLS}
231
+
232
+ # Finger-direction swipe vectors as fractions of the window size: (x1, y1, x2, y2).
233
+ _SWIPES = {
234
+ "up": (0.5, 0.8, 0.5, 0.2),
235
+ "down": (0.5, 0.2, 0.5, 0.8),
236
+ "left": (0.8, 0.5, 0.2, 0.5),
237
+ "right": (0.2, 0.5, 0.8, 0.5),
238
+ }
153
239
 
154
240
 
155
241
  class BaseScreen:
156
242
  def __init__(self, driver):
157
243
  self.driver = driver
158
244
 
245
+ def _platform(self):
246
+ return (self.driver.capabilities.get("platformName") or "").lower()
247
+
159
248
  def _spec(self, loc):
160
- platform = (self.driver.capabilities.get("platformName") or "").lower()
161
- spec = loc.get("ios") if platform == "ios" else loc.get("android")
249
+ spec = loc.get("ios") if self._platform() == "ios" else loc.get("android")
162
250
  if not spec:
163
251
  raise RuntimeError(
164
- "No durable selector for this platform — element relies on a coordinate fallback "
252
+ "No durable selector for this platform. Element relies on a coordinate fallback "
165
253
  "(non-release-grade). Add an accessibility id / resource-id / testID."
166
254
  )
167
255
  return spec
168
256
 
257
+ def _text_spec(self, text):
258
+ # Escape backslashes first, then quotes, so the runtime text cannot break the selector.
259
+ escaped = text.replace("\\\\", "\\\\\\\\").replace('"', '\\\\"')
260
+ if self._platform() == "ios":
261
+ return (AppiumBy.IOS_PREDICATE, 'label CONTAINS "%s" OR name CONTAINS "%s"' % (escaped, escaped))
262
+ return (AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textContains("%s")' % escaped)
263
+
169
264
  def find(self, loc, timeout=DEFAULT_TIMEOUT):
170
265
  by, value = self._spec(loc)
171
266
  return WebDriverWait(self.driver, timeout).until(
@@ -180,9 +275,50 @@ class BaseScreen:
180
275
  el.clear()
181
276
  el.send_keys(value)
182
277
 
183
- def scroll_to(self, loc):
184
- # Best-effort scroll; Appium resolves visibility on find.
185
- self.find(loc)
278
+ def type_focused(self, value):
279
+ # The recording had no locator for this field, so type into whatever has focus.
280
+ self.driver.switch_to.active_element.send_keys(value)
281
+
282
+ def _displayed_now(self, spec):
283
+ try:
284
+ return any(el.is_displayed() for el in self.driver.find_elements(*spec))
285
+ except Exception:
286
+ return False
287
+
288
+ def _scroll_once(self, direction):
289
+ """One real content-scroll gesture. direction is the CONTENT direction ("down" reveals
290
+ what is below). Returns False once Android reports the end of the scrollable area."""
291
+ if self._platform() == "ios":
292
+ self.driver.execute_script("mobile: scroll", {"direction": direction})
293
+ return True
294
+ size = self.driver.get_window_size()
295
+ w, h = size["width"], size["height"]
296
+ can_scroll_more = self.driver.execute_script("mobile: scrollGesture", {
297
+ "left": int(w * 0.1),
298
+ "top": int(h * 0.2),
299
+ "width": int(w * 0.8),
300
+ "height": int(h * 0.6),
301
+ "direction": direction,
302
+ "percent": 0.75,
303
+ })
304
+ return can_scroll_more is not False
305
+
306
+ def _scroll_until(self, spec, direction, max_scrolls, what):
307
+ at_end = False
308
+ for i in range(max_scrolls + 1):
309
+ if self._displayed_now(spec):
310
+ return
311
+ if i == max_scrolls or at_end:
312
+ break
313
+ at_end = not self._scroll_once(direction)
314
+ raise AssertionError("%s not visible after scrolling %s (max %d scrolls)" % (what, direction, max_scrolls))
315
+
316
+ def scroll_to(self, loc, direction="down", max_scrolls=MAX_SCROLLS):
317
+ spec = self._spec(loc)
318
+ self._scroll_until(spec, direction, max_scrolls, "element %r" % (spec,))
319
+
320
+ def scroll_to_text(self, text, direction="down", max_scrolls=MAX_SCROLLS):
321
+ self._scroll_until(self._text_spec(text), direction, max_scrolls, "text %r" % (text,))
186
322
 
187
323
  def is_visible(self, loc):
188
324
  try:
@@ -194,26 +330,54 @@ class BaseScreen:
194
330
  assert self.find(loc).is_displayed()
195
331
 
196
332
  def assert_text_visible(self, text):
197
- # Non-release-grade text assertion — prefer a structured locator.
198
- spec = (AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textContains("%s")' % text)
333
+ # Non-release-grade text assertion. Prefer a structured locator.
334
+ spec = self._text_spec(text)
199
335
  assert WebDriverWait(self.driver, DEFAULT_TIMEOUT).until(
200
336
  EC.presence_of_element_located(spec)
201
337
  ).is_displayed()
202
338
 
203
339
  def tap_at(self, x, y):
204
- # Coordinate tap — brittle, non-release-grade fallback.
340
+ # Coordinate tap: brittle, non-release-grade fallback.
205
341
  self.driver.tap([(x, y)])
206
342
 
343
+ def swipe(self, direction):
344
+ """Real window-size-relative swipe. direction is the FINGER direction ("up" drags bottom > top)."""
345
+ if direction not in _SWIPES:
346
+ raise ValueError("Unsupported swipe direction: %r" % (direction,))
347
+ size = self.driver.get_window_size()
348
+ w, h = size["width"], size["height"]
349
+ fx1, fy1, fx2, fy2 = _SWIPES[direction]
350
+ self.driver.swipe(int(w * fx1), int(h * fy1), int(w * fx2), int(h * fy2), 600)
351
+
207
352
  def press_key(self, key):
353
+ ios = self._platform() == "ios"
208
354
  if key == "back":
209
- self.driver.back()
355
+ if not ios:
356
+ self.driver.back()
357
+ return
358
+ # iOS has no system back key: swipe in from the left edge (navigation back gesture).
359
+ size = self.driver.get_window_size()
360
+ w, h = size["width"], size["height"]
361
+ self.driver.swipe(2, h // 2, int(w * 0.7), h // 2, 400)
362
+ elif key == "home":
363
+ if ios:
364
+ self.driver.execute_script("mobile: pressButton", {"name": "home"})
365
+ else:
366
+ self.driver.press_keycode(3)
367
+ elif key == "enter":
368
+ if ios:
369
+ self.type_focused("\\n")
370
+ else:
371
+ self.driver.press_keycode(66)
372
+ else:
373
+ raise ValueError("Unsupported key: %r" % (key,))
210
374
 
211
375
  def open_url(self, url):
212
376
  self.driver.get(url)
213
377
  `;
214
378
  }
215
- function methodName(action, element) {
216
- const e = snake(element);
379
+ /** Base (pre-dedupe) action-method name for an (action, attribute) pair. */
380
+ function methodBase(action, e) {
217
381
  switch (action) {
218
382
  case 'tap':
219
383
  return `tap_${e}`;
@@ -224,142 +388,148 @@ function methodName(action, element) {
224
388
  case 'assertVisible':
225
389
  return `assert_${e}_visible`;
226
390
  default:
227
- return `act_${e}`;
391
+ throw new UnemittableStepError(`cannot emit a ${action} step bound to an element: no generated action exists for it`);
228
392
  }
229
393
  }
230
- function screenClass(screen, steps) {
394
+ function screenClass(screen, names, steps) {
231
395
  const lines = [];
232
- lines.push(`# Generated by Swipium. Screen object for ${screen.pageName}${screen.screenSignature ? ` (${screen.screenSignature})` : ''}.`);
233
- lines.push('from appium.webdriver.common.appiumby import AppiumBy');
396
+ lines.push(`# Generated by Swipium. Screen object for ${commentSafe(screen.pageName)}${screen.screenSignature ? ` (${commentSafe(screen.screenSignature)})` : ''}.`);
397
+ lines.push('from appium.webdriver.common.appiumby import AppiumBy # noqa: F401');
234
398
  lines.push('from .base_screen import BaseScreen');
235
399
  lines.push('');
236
400
  lines.push('');
237
- lines.push(`class ${screen.className}(BaseScreen):`);
238
- if (screen.elements.length === 0)
239
- lines.push(' pass');
401
+ lines.push(`class ${names.cls}(BaseScreen):`);
402
+ const body = [];
240
403
  for (const el of screen.elements) {
241
- const note = el.durability === 'durable' ? '' : ` # ${el.durability}${el.remediation ? ` — ${el.remediation}` : ''}`;
242
- lines.push(` ${snake(el.name)} = ${locatorDict(el)}${note}`);
404
+ const note = el.durability === 'durable' ? '' : ` # ${el.durability}${el.remediation ? `: ${commentSafe(el.remediation)}` : ''}`;
405
+ body.push(` ${names.attrs.get(el.name)} = ${locatorDict(el)}${note}`);
243
406
  }
244
- if (screen.elements.length)
245
- lines.push('');
407
+ if (body.length)
408
+ body.push('');
246
409
  const seen = new Set();
247
410
  for (const s of steps) {
248
411
  if (s.screen !== screen.className || !s.element)
249
412
  continue;
250
- const el = screen.elements.find((e) => e.name === s.element);
251
- if (!el)
413
+ const key = methodKey(s.action, s.element);
414
+ if (seen.has(key))
252
415
  continue;
253
- const name = methodName(s.action, s.element);
254
- if (seen.has(name))
255
- continue;
256
- seen.add(name);
257
- const attr = snake(s.element);
416
+ seen.add(key);
417
+ const name = names.methods.get(key);
418
+ const attr = `self.${names.attrs.get(s.element)}`;
258
419
  if (s.action === 'inputText') {
259
- lines.push(` def ${name}(self, value):`);
260
- lines.push(` self.type(self.${attr}, value)`);
261
- lines.push('');
420
+ body.push(` def ${name}(self, value):`);
421
+ body.push(` self.type(${attr}, value)`);
262
422
  }
263
423
  else if (s.action === 'tap') {
264
- lines.push(` def ${name}(self):`);
265
- lines.push(` self.tap(self.${attr})`);
266
- lines.push('');
424
+ body.push(` def ${name}(self):`);
425
+ body.push(` self.tap(${attr})`);
267
426
  }
268
427
  else if (s.action === 'scrollTo') {
269
- lines.push(` def ${name}(self):`);
270
- lines.push(` self.scroll_to(self.${attr})`);
271
- lines.push('');
428
+ body.push(` def ${name}(self, direction="down"):`);
429
+ body.push(` self.scroll_to(${attr}, direction)`);
272
430
  }
273
- else if (s.action === 'assertVisible') {
274
- lines.push(` def ${name}(self):`);
275
- lines.push(` self.assert_visible(self.${attr})`);
276
- lines.push('');
431
+ else {
432
+ body.push(` def ${name}(self):`);
433
+ body.push(` self.assert_visible(${attr})`);
277
434
  }
435
+ body.push('');
278
436
  }
437
+ if (!body.length)
438
+ body.push(' pass');
439
+ lines.push(...body);
279
440
  return lines.join('\n').replace(/\n+$/, '\n');
280
441
  }
281
442
  function testData(model) {
282
443
  const lines = [];
283
- lines.push('# Generated by Swipium. Test data comes from the ENVIRONMENT — secrets are never inlined.');
444
+ lines.push('# Generated by Swipium. Test data comes from the ENVIRONMENT. Secrets are never inlined.');
284
445
  lines.push('import os');
285
446
  lines.push('');
286
447
  lines.push('test_data = {');
287
448
  for (const v of model.variables)
288
449
  lines.push(` ${pyStr(pyVarToKey(v))}: os.environ.get(${pyStr(v)}, ""),`);
289
450
  for (const v of model.secrets)
290
- lines.push(` ${pyStr(pyVarToKey(v))}: os.environ.get(${pyStr(v)}, ""), # secret — environment only`);
451
+ lines.push(` ${pyStr(pyVarToKey(v))}: os.environ.get(${pyStr(v)}, ""), # secret, environment only`);
291
452
  lines.push('}');
292
453
  return lines.join('\n') + '\n';
293
454
  }
294
- function importsForTest(model) {
295
- const classes = [...new Set(model.steps.map((s) => s.screen))];
296
- return classes.map((c) => `from screens.${snake(c)} import ${c}`);
455
+ function stepClasses(model) {
456
+ return [...new Set(model.steps.map((s) => s.screen))];
457
+ }
458
+ function importsForTest(model, names) {
459
+ return stepClasses(model).map((c) => `from screens.${names.get(c).module} import ${names.get(c).cls}`);
460
+ }
461
+ function dataArg(s) {
462
+ return s.varName ? `test_data[${pyStr(pyVarToKey(s.varName))}]` : pyStr(s.text ?? '');
463
+ }
464
+ function num(n) {
465
+ return Number.isFinite(n) ? Math.round(n) : 0;
297
466
  }
298
- function stepCall(screenVar, s) {
467
+ function stepCall(n, s) {
468
+ const v = n.instance;
299
469
  if (s.element) {
300
- const name = methodName(s.action, s.element);
301
- if (s.action === 'inputText') {
302
- const arg = s.varName ? `test_data[${pyStr(pyVarToKey(s.varName))}]` : pyStr(s.text ?? '');
303
- return `${screenVar}.${name}(${arg})`;
304
- }
305
- return `${screenVar}.${name}()`;
470
+ const name = n.methods.get(methodKey(s.action, s.element));
471
+ if (s.action === 'inputText')
472
+ return `${v}.${name}(${dataArg(s)})`;
473
+ if (s.action === 'scrollTo')
474
+ return `${v}.${name}(${pyStr(checkDirection(s.direction ?? 'down', 'scrollTo step'))})`;
475
+ return `${v}.${name}()`;
306
476
  }
307
477
  switch (s.action) {
308
478
  case 'tapAt':
309
- return `${screenVar}.tap_at(${s.coords?.[0] ?? 0}, ${s.coords?.[1] ?? 0}) # coordinate fallback — non-release-grade`;
310
- case 'inputText': {
311
- const arg = s.varName ? `test_data[${pyStr(pyVarToKey(s.varName))}]` : pyStr(s.text ?? '');
312
- return `${screenVar}.type({"android": (AppiumBy.ACCESSIBILITY_ID, "")}, ${arg}) # focused-field input`;
313
- }
479
+ if (!s.coords)
480
+ throw new UnemittableStepError('cannot emit a coordinate tap without coordinates');
481
+ return `${v}.tap_at(${num(s.coords[0])}, ${num(s.coords[1])}) # coordinate fallback, non-release-grade`;
482
+ case 'inputText':
483
+ return `${v}.type_focused(${dataArg(s)}) # focused-field input`;
314
484
  case 'press':
315
- return `${screenVar}.press_key(${pyStr(s.key ?? 'back')})`;
485
+ return `${v}.press_key(${pyStr(checkKey(s.key))})`;
316
486
  case 'swipe':
317
- return `${screenVar}.driver.swipe(0, 0, 0, 0) # swipe ${s.direction ?? 'up'} — adjust coordinates`;
487
+ return `${v}.swipe(${pyStr(checkDirection(s.direction ?? 'up', 'swipe step'))})`;
488
+ case 'scrollTo':
489
+ if (!s.text)
490
+ throw new UnemittableStepError('cannot emit a scrollTo step with neither an element nor a target text');
491
+ return `${v}.scroll_to_text(${pyStr(s.text)}, ${pyStr(checkDirection(s.direction ?? 'down', 'scrollTo step'))})`;
318
492
  case 'openUrl':
319
- return `${screenVar}.open_url(${pyStr(s.url ?? '')})`;
493
+ if (!s.url)
494
+ throw new UnemittableStepError('cannot emit an openUrl step without a URL');
495
+ return `${v}.open_url(${pyStr(s.url)})`;
320
496
  case 'assertVisible':
321
- return `${screenVar}.assert_text_visible(${pyStr(s.text ?? '')})`;
497
+ if (!s.text)
498
+ throw new UnemittableStepError('cannot emit a text assertion without text');
499
+ return `${v}.assert_text_visible(${pyStr(s.text)})`;
500
+ case 'visualCheck':
501
+ // Visual judgement prose is not on-screen text. It's a manual checkpoint, never a failing text check.
502
+ // A comment line is safe here: the test body always instantiates the step's screen first.
503
+ return `# TODO(manual visual check, not automated): ${commentSafe(s.text ?? 'visual checkpoint')}`;
322
504
  default:
323
- return `pass # unsupported step: ${s.action}`;
505
+ throw new UnemittableStepError(`cannot emit step action ${JSON.stringify(s.action)}: no Appium Python equivalent is generated for it`);
324
506
  }
325
507
  }
326
- function instanceVars(model) {
327
- const classes = [...new Set(model.steps.map((s) => s.screen))];
328
- const m = new Map();
329
- for (const c of classes)
330
- m.set(c, snake(c));
331
- return m;
332
- }
333
- function pytestSmoke(model) {
508
+ function pytestSmoke(model, names) {
334
509
  const lines = [];
335
510
  lines.push('# Generated by Swipium. Smoke test driving the recorded flow through the screen objects.');
336
- lines.push(...importsForTest(model));
511
+ lines.push(...importsForTest(model, names));
337
512
  lines.push('from data.test_data import test_data # noqa: F401');
338
- const usesFocused = model.steps.some((s) => !s.element && s.action === 'inputText');
339
- if (usesFocused)
340
- lines.push('from appium.webdriver.common.appiumby import AppiumBy # noqa: F401');
341
513
  lines.push('');
342
514
  lines.push('');
343
515
  lines.push('def test_smoke(driver):');
344
- const inst = instanceVars(model);
345
- for (const [c, v] of inst)
346
- lines.push(` ${v} = ${c}(driver)`);
516
+ for (const c of stepClasses(model))
517
+ lines.push(` ${names.get(c).instance} = ${names.get(c).cls}(driver)`);
347
518
  for (const s of model.steps)
348
- lines.push(` ${stepCall(inst.get(s.screen), s)}`);
519
+ lines.push(` ${stepCall(names.get(s.screen), s)}`);
520
+ if (!model.steps.length)
521
+ lines.push(' pass');
349
522
  return lines.join('\n') + '\n';
350
523
  }
351
- function unittestSmoke(model, _input) {
524
+ function unittestSmoke(model, names) {
352
525
  const lines = [];
353
526
  lines.push('# Generated by Swipium. Smoke test (unittest) driving the recorded flow through screen objects.');
354
527
  lines.push('import os');
355
528
  lines.push('import unittest');
356
529
  lines.push('from appium import webdriver');
357
530
  lines.push('from conftest import build_options');
358
- lines.push(...importsForTest(model));
531
+ lines.push(...importsForTest(model, names));
359
532
  lines.push('from data.test_data import test_data # noqa: F401');
360
- const usesFocused = model.steps.some((s) => !s.element && s.action === 'inputText');
361
- if (usesFocused)
362
- lines.push('from appium.webdriver.common.appiumby import AppiumBy # noqa: F401');
363
533
  lines.push('');
364
534
  lines.push('');
365
535
  lines.push('class SmokeTest(unittest.TestCase):');
@@ -372,11 +542,12 @@ function unittestSmoke(model, _input) {
372
542
  lines.push(' self.driver.quit()');
373
543
  lines.push('');
374
544
  lines.push(' def test_smoke(self):');
375
- const inst = instanceVars(model);
376
- for (const [c, v] of inst)
377
- lines.push(` ${v} = ${c}(self.driver)`);
545
+ for (const c of stepClasses(model))
546
+ lines.push(` ${names.get(c).instance} = ${names.get(c).cls}(self.driver)`);
378
547
  for (const s of model.steps)
379
- lines.push(` ${stepCall(inst.get(s.screen), s)}`);
548
+ lines.push(` ${stepCall(names.get(s.screen), s)}`);
549
+ if (!model.steps.length)
550
+ lines.push(' pass');
380
551
  lines.push('');
381
552
  lines.push('');
382
553
  lines.push('if __name__ == "__main__":');
@@ -1 +1 @@
1
- {"version":3,"file":"pythonEmitter.js","sourceRoot":"","sources":["../../src/automationGen/pythonEmitter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pythonEmitter.js","sourceRoot":"","sources":["../../src/automationGen/pythonEmitter.ts"],"names":[],"mappings":"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"}