@testspectra/cli 1.0.69 → 1.1.0-rc.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 (366) hide show
  1. package/LICENSE.md +48 -0
  2. package/README.md +36 -270
  3. package/bin/spectra.js +1 -1
  4. package/bin/testspectra-runner +0 -0
  5. package/demo-app/assets/index-BGllUp7o.js +140 -0
  6. package/demo-app/assets/index-BhlW-eXG.css +1 -0
  7. package/demo-app/index.html +2 -2
  8. package/dist/.tsbuildinfo +1 -0
  9. package/dist/commands/__tests__/doctor.test.d.ts +1 -0
  10. package/dist/commands/__tests__/doctor.test.js +39 -0
  11. package/dist/commands/__tests__/init.test.d.ts +1 -0
  12. package/dist/commands/__tests__/init.test.js +148 -0
  13. package/dist/commands/__tests__/license.test.d.ts +1 -0
  14. package/dist/commands/__tests__/license.test.js +13 -0
  15. package/dist/commands/__tests__/refactor.test.d.ts +1 -0
  16. package/dist/commands/__tests__/refactor.test.js +64 -0
  17. package/dist/commands/__tests__/run-e2e.test.d.ts +1 -0
  18. package/dist/commands/__tests__/run-e2e.test.js +422 -0
  19. package/dist/commands/__tests__/run.test.d.ts +1 -0
  20. package/dist/commands/__tests__/run.test.js +277 -0
  21. package/dist/commands/__tests__/watch.test.d.ts +1 -0
  22. package/dist/commands/__tests__/watch.test.js +155 -0
  23. package/dist/commands/add.js +86 -85
  24. package/dist/commands/demo.js +21 -11
  25. package/dist/commands/devices.d.ts +14 -2
  26. package/dist/commands/devices.js +44 -34
  27. package/dist/commands/doctor.d.ts +3 -1
  28. package/dist/commands/doctor.js +43 -264
  29. package/dist/commands/init.d.ts +1 -1
  30. package/dist/commands/init.js +206 -196
  31. package/dist/commands/install.d.ts +4 -0
  32. package/dist/commands/install.js +59 -0
  33. package/dist/commands/license.d.ts +4 -0
  34. package/dist/commands/license.js +30 -0
  35. package/dist/commands/lint.d.ts +5 -0
  36. package/dist/commands/lint.js +55 -0
  37. package/dist/commands/refactor.d.ts +9 -0
  38. package/dist/commands/refactor.js +172 -0
  39. package/dist/commands/run.d.ts +23 -2
  40. package/dist/commands/run.js +321 -111
  41. package/dist/commands/skills.d.ts +9 -0
  42. package/dist/commands/skills.js +28 -0
  43. package/dist/commands/sync-types.d.ts +4 -0
  44. package/dist/commands/sync-types.js +14 -0
  45. package/dist/commands/update.d.ts +3 -0
  46. package/dist/commands/update.js +109 -0
  47. package/dist/commands/watch.d.ts +6 -0
  48. package/dist/commands/watch.js +46 -43
  49. package/dist/config/loader.d.ts +1 -1
  50. package/dist/config/loader.js +40 -25
  51. package/dist/config/schema.d.ts +117 -54
  52. package/dist/config/schema.js +41 -35
  53. package/dist/generator/__tests__/tsconfig-isolation.test.d.ts +1 -0
  54. package/dist/generator/__tests__/tsconfig-isolation.test.js +278 -0
  55. package/dist/generator/__tests__/type-generator.test.d.ts +1 -0
  56. package/dist/generator/__tests__/type-generator.test.js +386 -0
  57. package/dist/generator/index.d.ts +2 -0
  58. package/dist/generator/index.js +2 -0
  59. package/dist/generator/tsconfig-generator.d.ts +27 -0
  60. package/dist/generator/tsconfig-generator.js +384 -0
  61. package/dist/generator/type-generator.d.ts +36 -0
  62. package/dist/generator/type-generator.js +644 -0
  63. package/dist/index.d.ts +9 -5
  64. package/dist/index.js +153 -47
  65. package/dist/lifecycle/__tests__/lifecycle-engine.test.d.ts +1 -0
  66. package/dist/lifecycle/__tests__/lifecycle-engine.test.js +290 -0
  67. package/dist/lifecycle/hook-discovery.d.ts +24 -0
  68. package/dist/lifecycle/hook-discovery.js +60 -0
  69. package/dist/lifecycle/hook-dispatcher.d.ts +34 -0
  70. package/dist/lifecycle/hook-dispatcher.js +190 -0
  71. package/dist/lifecycle/index.d.ts +3 -0
  72. package/dist/lifecycle/index.js +3 -0
  73. package/dist/lifecycle/parallel-grouping.d.ts +27 -0
  74. package/dist/lifecycle/parallel-grouping.js +151 -0
  75. package/dist/linter/__tests__/anonymous-export.test.d.ts +1 -0
  76. package/dist/linter/__tests__/anonymous-export.test.js +184 -0
  77. package/dist/linter/__tests__/shared-lib-boundary.test.d.ts +1 -0
  78. package/dist/linter/__tests__/shared-lib-boundary.test.js +270 -0
  79. package/dist/linter/__tests__/spec-schema.test.d.ts +1 -0
  80. package/dist/linter/__tests__/spec-schema.test.js +369 -0
  81. package/dist/linter/__tests__/step-parity.test.d.ts +1 -0
  82. package/dist/linter/__tests__/step-parity.test.js +372 -0
  83. package/dist/linter/discovery.d.ts +30 -0
  84. package/dist/linter/discovery.js +249 -0
  85. package/dist/linter/extractor.d.ts +66 -0
  86. package/dist/linter/extractor.js +235 -0
  87. package/dist/linter/index.d.ts +7 -0
  88. package/dist/linter/index.js +7 -0
  89. package/dist/linter/parser.d.ts +24 -0
  90. package/dist/linter/parser.js +219 -0
  91. package/dist/linter/schemas/spec.schema.d.ts +83 -0
  92. package/dist/linter/schemas/spec.schema.js +150 -0
  93. package/dist/linter/schemas/suite.schema.d.ts +59 -0
  94. package/dist/linter/schemas/suite.schema.js +83 -0
  95. package/dist/linter/spec-linter.d.ts +23 -0
  96. package/dist/linter/spec-linter.js +595 -0
  97. package/dist/linter/types.d.ts +28 -0
  98. package/dist/linter/types.js +1 -0
  99. package/dist/mobile/__tests__/android-device-e2e.test.d.ts +1 -0
  100. package/dist/mobile/__tests__/android-device-e2e.test.js +53 -0
  101. package/dist/mobile/__tests__/device-pool.test.d.ts +1 -0
  102. package/dist/mobile/__tests__/device-pool.test.js +97 -0
  103. package/dist/mobile/device-pool.d.ts +23 -0
  104. package/dist/mobile/device-pool.js +1 -0
  105. package/dist/mobile/index.d.ts +1 -0
  106. package/dist/mobile/index.js +1 -0
  107. package/dist/refactor/__tests__/refactor-engine.test.d.ts +1 -0
  108. package/dist/refactor/__tests__/refactor-engine.test.js +873 -0
  109. package/dist/refactor/index.d.ts +1 -0
  110. package/dist/refactor/index.js +1 -0
  111. package/dist/refactor/refactor-engine.d.ts +50 -0
  112. package/dist/refactor/refactor-engine.js +587 -0
  113. package/dist/reporter/__tests__/semantic-formatter.test.d.ts +1 -0
  114. package/dist/reporter/__tests__/semantic-formatter.test.js +73 -0
  115. package/dist/reporter/semantic-formatter.d.ts +6 -0
  116. package/dist/reporter/semantic-formatter.js +191 -0
  117. package/dist/reporter/summary-view.d.ts +12 -0
  118. package/dist/reporter/summary-view.js +19 -0
  119. package/dist/reporter/terminal-stream.d.ts +32 -0
  120. package/dist/reporter/terminal-stream.js +82 -0
  121. package/dist/reporter/types.d.ts +2 -0
  122. package/dist/reporter/types.js +1 -0
  123. package/dist/runner/bridge.d.ts +10 -5
  124. package/dist/runner/bridge.js +101 -45
  125. package/dist/runner/reporter.d.ts +32 -2
  126. package/dist/runner/reporter.js +423 -13
  127. package/dist/server/demo.js +43 -44
  128. package/dist/types/generator.d.ts +1 -17
  129. package/dist/types/generator.js +1 -443
  130. package/dist/utils/__tests__/api-server.test.d.ts +1 -0
  131. package/dist/utils/__tests__/api-server.test.js +62 -0
  132. package/dist/utils/__tests__/demo-server.test.d.ts +1 -0
  133. package/dist/utils/__tests__/demo-server.test.js +35 -0
  134. package/dist/utils/api-server.d.ts +19 -0
  135. package/dist/utils/api-server.js +134 -0
  136. package/dist/utils/demo-server.d.ts +5 -0
  137. package/dist/utils/demo-server.js +46 -36
  138. package/package.json +24 -13
  139. package/templates/default/CLAUDE.md +12 -5
  140. package/templates/default/fixtures/apiData.json +24 -0
  141. package/templates/default/package.json +12 -3
  142. package/templates/default/page-objects/MatchersPage/mobile.ts +53 -17
  143. package/templates/default/page-objects/MatchersPage/web.ts +17 -2
  144. package/templates/default/page-objects/NavigationPage/mobile.ts +11 -2
  145. package/templates/default/page-objects/NavigationPage/web.ts +1 -1
  146. package/templates/default/page-objects/PlaygroundPage/mobile.ts +28 -18
  147. package/templates/default/page-objects/PlaygroundPage/web.ts +4 -2
  148. package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +53 -0
  149. package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +19 -0
  150. package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +31 -0
  151. package/templates/default/specs/ApiInterception/TC-0009-post-mocking/android.test.ts +3 -0
  152. package/templates/default/specs/ApiInterception/TC-0009-post-mocking/common.test.ts +3 -0
  153. package/templates/default/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +27 -0
  154. package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +19 -0
  155. package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +26 -0
  156. package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/common.test.ts +33 -0
  157. package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/spec.md +22 -0
  158. package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/common.test.ts +27 -0
  159. package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/spec.md +20 -0
  160. package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/spec.md +24 -0
  161. package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/web.test.ts +26 -0
  162. package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/spec.md +37 -0
  163. package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/web.test.ts +21 -0
  164. package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/spec.md +29 -0
  165. package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/web.test.ts +16 -0
  166. package/templates/default/specs/ApiInterception/suite.md +10 -0
  167. package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/common.test.ts +30 -0
  168. package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/spec.md +23 -0
  169. package/templates/default/specs/ApiSeeding/hooks/after/common.hook.ts +16 -0
  170. package/templates/default/specs/ApiSeeding/hooks/before/common.hook.ts +28 -0
  171. package/templates/default/specs/ApiSeeding/suite.md +9 -0
  172. package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +7 -1
  173. package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/spec.md +5 -0
  174. package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +17 -3
  175. package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/common.test.ts +26 -0
  176. package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/spec.md +7 -0
  177. package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +9 -1
  178. package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/spec.md +5 -0
  179. package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +9 -4
  180. package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/mobile.test.ts +28 -0
  181. package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/spec.md +29 -0
  182. package/templates/default/specs/DeepLink/suite.md +9 -0
  183. package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +9 -1
  184. package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/spec.md +5 -0
  185. package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +9 -3
  186. package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +27 -1
  187. package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/spec.md +7 -0
  188. package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +27 -6
  189. package/templates/default/specs/ElementMatchers/suite.md +2 -1
  190. package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/mobile.test.ts +26 -0
  191. package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/spec.md +22 -0
  192. package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/mobile.test.ts +13 -0
  193. package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/spec.md +20 -0
  194. package/templates/default/specs/PermissionRationale/suite.md +9 -0
  195. package/templates/default/specs/Playground/TC-0001-form-controls/mobile.test.ts +4 -1
  196. package/templates/default/specs/Playground/TC-0001-form-controls/spec.md +6 -0
  197. package/templates/default/specs/Playground/TC-0001-form-controls/web.test.ts +4 -4
  198. package/templates/default/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +4 -1
  199. package/templates/default/specs/Playground/TC-0002-toggle-elements/spec.md +6 -0
  200. package/templates/default/specs/Playground/TC-0002-toggle-elements/web.test.ts +3 -3
  201. package/templates/default/spectra.config.ts +21 -15
  202. package/templates/default/support/actions/fillCredentials/mobile.action.ts +3 -3
  203. package/templates/default/support/actions/fillCredentials/web.action.ts +1 -1
  204. package/templates/default/support/steps/togglePlaygroundStates/mobile.step.ts +3 -1
  205. package/templates/default/support/steps/togglePlaygroundStates/web.step.ts +3 -3
  206. package/templates/default/support/steps/verifyPlaygroundState/mobile.step.ts +4 -2
  207. package/templates/default/support/steps/verifyPlaygroundState/web.step.ts +4 -4
  208. package/templates/default/tsconfig.json +3 -1
  209. package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db +0 -0
  210. package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db-shm +0 -0
  211. package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db-wal +0 -0
  212. package/templates/nx/.nx/workspace-data/d/daemon.log +4306 -0
  213. package/templates/nx/.nx/workspace-data/d/server-process.json +3 -0
  214. package/templates/nx/.nx/workspace-data/file-map.json +452 -0
  215. package/templates/nx/.nx/workspace-data/lockfile.hash +1 -0
  216. package/templates/nx/.nx/workspace-data/nx_files.nxt +0 -0
  217. package/templates/nx/.nx/workspace-data/parsed-lock-file.json +13485 -0
  218. package/templates/nx/.nx/workspace-data/project-graph.json +14389 -0
  219. package/templates/nx/CLAUDE.md +2 -2
  220. package/templates/nx/package.json +6 -4
  221. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +27 -0
  222. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +12 -0
  223. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +27 -0
  224. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +24 -0
  225. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/spec.md +12 -0
  226. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +24 -0
  227. package/templates/nx/packages/matchers/e2e/specs/ApiInterception/suite.md +9 -0
  228. package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +1 -1
  229. package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +17 -3
  230. package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +1 -1
  231. package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +15 -5
  232. package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +1 -1
  233. package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +9 -4
  234. package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +1 -1
  235. package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +9 -3
  236. package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +1 -1
  237. package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +27 -6
  238. package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/mobile.test.ts +1 -1
  239. package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/web.test.ts +4 -4
  240. package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +1 -1
  241. package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/web.test.ts +3 -3
  242. package/templates/nx/pnpm-lock.yaml +6663 -0
  243. package/templates/nx/pnpm-workspace.yaml +2 -1
  244. package/templates/nx/shared/testing/fixtures/apiData.json +24 -0
  245. package/templates/nx/shared/testing/page-objects/MatchersPage/mobile.ts +13 -1
  246. package/templates/nx/shared/testing/page-objects/MatchersPage/web.ts +85 -17
  247. package/templates/nx/shared/testing/page-objects/NavigationPage/mobile.ts +1 -1
  248. package/templates/nx/shared/testing/page-objects/NavigationPage/web.ts +1 -1
  249. package/templates/nx/shared/testing/page-objects/PlaygroundPage/mobile.ts +1 -1
  250. package/templates/nx/shared/testing/page-objects/PlaygroundPage/web.ts +4 -2
  251. package/templates/nx/shared/testing/project.json +19 -0
  252. package/templates/nx/shared/testing/support/actions/fillCredentials/mobile.action.ts +1 -1
  253. package/templates/nx/shared/testing/support/actions/fillCredentials/web.action.ts +1 -1
  254. package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/mobile.step.ts +1 -1
  255. package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/web.step.ts +3 -3
  256. package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/mobile.step.ts +2 -2
  257. package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/web.step.ts +4 -4
  258. package/templates/nx/spectra.config.ts +19 -13
  259. package/templates/nx/tsconfig.json +3 -1
  260. package/demo-app/assets/index-DAUlrHTr.css +0 -1
  261. package/demo-app/assets/index-DN2Kb0A8.js +0 -100
  262. package/dist/index.cjs +0 -101
  263. package/dist/plugin.cjs +0 -575
  264. package/dist/plugin.d.ts +0 -16
  265. package/dist/plugin.js +0 -184
  266. package/dist/step/index.d.ts +0 -6
  267. package/dist/step/index.js +0 -6
  268. package/dist/step/matchers.d.ts +0 -14
  269. package/dist/step/matchers.js +0 -114
  270. package/dist/step/proto.d.ts +0 -46
  271. package/dist/step/proto.js +0 -114
  272. package/dist/step/runner/collection.d.ts +0 -13
  273. package/dist/step/runner/collection.js +0 -51
  274. package/dist/step/runner/single.d.ts +0 -21
  275. package/dist/step/runner/single.js +0 -138
  276. package/dist/step/spectra.d.ts +0 -34
  277. package/dist/step/spectra.js +0 -156
  278. package/dist/step/types.d.ts +0 -32
  279. package/dist/step/types.js +0 -5
  280. package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -3
  281. package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -7
  282. package/templates/default/tsconfig.spectra.android.json +0 -46
  283. package/templates/default/tsconfig.spectra.ios.json +0 -46
  284. package/templates/default/tsconfig.spectra.json +0 -22
  285. package/templates/default/tsconfig.spectra.web.json +0 -53
  286. package/templates/nx/fixtures/playgroundData.json +0 -7
  287. package/templates/nx/global-hooks/after/mobile.hook.ts +0 -3
  288. package/templates/nx/global-hooks/after/web.hook.ts +0 -3
  289. package/templates/nx/global-hooks/before/mobile.hook.ts +0 -3
  290. package/templates/nx/global-hooks/before/web.hook.ts +0 -3
  291. package/templates/nx/page-objects/MatchersPage/mobile.ts +0 -21
  292. package/templates/nx/page-objects/MatchersPage/web.ts +0 -23
  293. package/templates/nx/page-objects/NavigationPage/mobile.ts +0 -5
  294. package/templates/nx/page-objects/NavigationPage/web.ts +0 -8
  295. package/templates/nx/page-objects/PlaygroundPage/mobile.ts +0 -26
  296. package/templates/nx/page-objects/PlaygroundPage/web.ts +0 -29
  297. package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +0 -3
  298. package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/spec.md +0 -12
  299. package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +0 -5
  300. package/templates/nx/specs/BrowserContext/suite.md +0 -9
  301. package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -3
  302. package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/spec.md +0 -12
  303. package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -7
  304. package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +0 -3
  305. package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/spec.md +0 -12
  306. package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +0 -6
  307. package/templates/nx/specs/ContentMatchers/suite.md +0 -9
  308. package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +0 -3
  309. package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/spec.md +0 -12
  310. package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +0 -5
  311. package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +0 -3
  312. package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/spec.md +0 -12
  313. package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +0 -8
  314. package/templates/nx/specs/ElementMatchers/hooks/after/mobile.hook.ts +0 -1
  315. package/templates/nx/specs/ElementMatchers/hooks/after/web.hook.ts +0 -1
  316. package/templates/nx/specs/ElementMatchers/hooks/afterEach/mobile.hook.ts +0 -1
  317. package/templates/nx/specs/ElementMatchers/hooks/afterEach/web.hook.ts +0 -1
  318. package/templates/nx/specs/ElementMatchers/hooks/before/mobile.hook.ts +0 -1
  319. package/templates/nx/specs/ElementMatchers/hooks/before/web.hook.ts +0 -1
  320. package/templates/nx/specs/ElementMatchers/hooks/beforeEach/mobile.hook.ts +0 -1
  321. package/templates/nx/specs/ElementMatchers/hooks/beforeEach/web.hook.ts +0 -1
  322. package/templates/nx/specs/ElementMatchers/suite.md +0 -9
  323. package/templates/nx/specs/Playground/TC-0001-form-controls/mobile.test.ts +0 -3
  324. package/templates/nx/specs/Playground/TC-0001-form-controls/spec.md +0 -12
  325. package/templates/nx/specs/Playground/TC-0001-form-controls/web.test.ts +0 -6
  326. package/templates/nx/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +0 -3
  327. package/templates/nx/specs/Playground/TC-0002-toggle-elements/spec.md +0 -12
  328. package/templates/nx/specs/Playground/TC-0002-toggle-elements/web.test.ts +0 -6
  329. package/templates/nx/specs/Playground/hooks/after/mobile.hook.ts +0 -1
  330. package/templates/nx/specs/Playground/hooks/after/web.hook.ts +0 -1
  331. package/templates/nx/specs/Playground/hooks/afterEach/mobile.hook.ts +0 -1
  332. package/templates/nx/specs/Playground/hooks/afterEach/web.hook.ts +0 -1
  333. package/templates/nx/specs/Playground/hooks/before/mobile.hook.ts +0 -1
  334. package/templates/nx/specs/Playground/hooks/before/web.hook.ts +0 -1
  335. package/templates/nx/specs/Playground/hooks/beforeEach/mobile.hook.ts +0 -1
  336. package/templates/nx/specs/Playground/hooks/beforeEach/web.hook.ts +0 -1
  337. package/templates/nx/specs/Playground/suite.md +0 -9
  338. package/templates/nx/support/actions/fillCredentials/mobile.action.ts +0 -4
  339. package/templates/nx/support/actions/fillCredentials/web.action.ts +0 -4
  340. package/templates/nx/support/steps/togglePlaygroundStates/mobile.step.ts +0 -3
  341. package/templates/nx/support/steps/togglePlaygroundStates/step.md +0 -7
  342. package/templates/nx/support/steps/togglePlaygroundStates/web.step.ts +0 -5
  343. package/templates/nx/support/steps/verifyPlaygroundState/mobile.step.ts +0 -4
  344. package/templates/nx/support/steps/verifyPlaygroundState/step.md +0 -7
  345. package/templates/nx/support/steps/verifyPlaygroundState/web.step.ts +0 -6
  346. package/templates/nx/tsconfig.spectra.android.json +0 -39
  347. package/templates/nx/tsconfig.spectra.ios.json +0 -39
  348. package/templates/nx/tsconfig.spectra.json +0 -25
  349. package/templates/nx/tsconfig.spectra.shared.json +0 -25
  350. package/templates/nx/tsconfig.spectra.web.json +0 -45
  351. /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/after/mobile.hook.ts +0 -0
  352. /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/after/web.hook.ts +0 -0
  353. /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/afterEach/mobile.hook.ts +0 -0
  354. /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/afterEach/web.hook.ts +0 -0
  355. /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/before/mobile.hook.ts +0 -0
  356. /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/before/web.hook.ts +0 -0
  357. /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/beforeEach/mobile.hook.ts +0 -0
  358. /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/beforeEach/web.hook.ts +0 -0
  359. /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/after/mobile.hook.ts +0 -0
  360. /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/after/web.hook.ts +0 -0
  361. /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/afterEach/mobile.hook.ts +0 -0
  362. /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/afterEach/web.hook.ts +0 -0
  363. /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/before/mobile.hook.ts +0 -0
  364. /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/before/web.hook.ts +0 -0
  365. /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/beforeEach/mobile.hook.ts +0 -0
  366. /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/beforeEach/web.hook.ts +0 -0
@@ -1,63 +1,66 @@
1
- import fs from "fs";
2
- import path from "path";
3
- import chalk from "chalk";
4
- import { TypeGenerator } from "../types/generator.js";
5
- export async function watchCommand(options = {}) {
6
- const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
7
- console.log(chalk.bold.cyan("\n🔭 TestSpectra Ambient Types Watcher"));
8
- console.log(chalk.gray(`Watching workspace: ${cwd}\n`));
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import chalk from 'chalk';
4
+ import { TypeGenerator } from '../types/generator.js';
5
+ export function startWatcher(cwd, debounceMs = 60) {
9
6
  // Initial generation
10
- try {
11
- TypeGenerator.writeDeclarationFiles(cwd);
12
- console.log(chalk.green("✔ Initialized ambient declarations in .testspectra/types/"));
13
- }
14
- catch (err) {
15
- console.error(chalk.red(`✖ Failed initial type generation: ${err?.message}`));
16
- }
7
+ TypeGenerator.generateAll(cwd);
17
8
  let debounceTimer = null;
18
9
  const triggerRegen = (filePath, eventType) => {
19
10
  if (debounceTimer)
20
11
  clearTimeout(debounceTimer);
21
12
  debounceTimer = setTimeout(() => {
22
13
  try {
23
- TypeGenerator.writeDeclarationFiles(cwd);
14
+ TypeGenerator.generateAll(cwd);
24
15
  const time = new Date().toLocaleTimeString();
25
16
  const rel = path.relative(cwd, filePath) || filePath;
26
- console.log(chalk.gray(`[${time}] `) +
27
- chalk.cyan(`✨ Updated ambient types `) +
28
- chalk.gray(`(${eventType}: ${rel})`));
17
+ console.log(chalk.gray(`[${time}] `) + chalk.cyan(`✨ Updated ambient types `) + chalk.gray(`(${eventType}: ${rel})`));
29
18
  }
30
19
  catch (err) {
31
20
  console.error(chalk.red(`✖ Error regenerating declarations: ${err?.message}`));
32
21
  }
33
- }, 100);
22
+ }, debounceMs);
23
+ };
24
+ const watcher = fs.watch(cwd, { recursive: true }, (eventType, filename) => {
25
+ if (!filename)
26
+ return;
27
+ const fn = filename.toString();
28
+ if (fn.includes('.testspectra') ||
29
+ fn.includes('node_modules') ||
30
+ fn.includes('.git') ||
31
+ fn.includes('dist') ||
32
+ fn.includes('.nx')) {
33
+ return;
34
+ }
35
+ if (fn.includes('fixtures') ||
36
+ fn.includes('page-objects') ||
37
+ fn.includes('actions') ||
38
+ fn.includes('steps') ||
39
+ fn.includes('hooks') ||
40
+ fn.includes('spectra.config')) {
41
+ triggerRegen(path.join(cwd, fn), eventType);
42
+ }
43
+ });
44
+ return {
45
+ watcher,
46
+ close: () => {
47
+ if (debounceTimer)
48
+ clearTimeout(debounceTimer);
49
+ watcher.close();
50
+ },
34
51
  };
52
+ }
53
+ export async function watchCommand(options = {}) {
54
+ const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
55
+ console.log(chalk.bold.cyan('\n🔭 TestSpectra Ambient Types Watcher'));
56
+ console.log(chalk.gray(`Watching workspace: ${cwd}\n`));
35
57
  try {
36
- const watcher = fs.watch(cwd, { recursive: true }, (eventType, filename) => {
37
- if (!filename)
38
- return;
39
- const fn = filename.toString();
40
- if (fn.includes(".testspectra") ||
41
- fn.includes("node_modules") ||
42
- fn.includes(".git") ||
43
- fn.includes("dist") ||
44
- fn.includes(".nx")) {
45
- return;
46
- }
47
- if (fn.includes("fixtures") ||
48
- fn.includes("page-objects") ||
49
- fn.includes("pageobjects") ||
50
- fn.includes("actions") ||
51
- fn.includes("steps") ||
52
- fn.includes("hooks") ||
53
- fn.includes("spectra.config")) {
54
- triggerRegen(path.join(cwd, fn), eventType);
55
- }
56
- });
57
- watcher.on("error", (err) => {
58
+ const handle = startWatcher(cwd, options.debounceMs ?? 60);
59
+ console.log(chalk.green('✔ Initialized ambient declarations in .testspectra/types/'));
60
+ console.log(chalk.gray('Press Ctrl+C to stop watching.\n'));
61
+ handle.watcher.on('error', (err) => {
58
62
  console.error(chalk.red(`Watcher error: ${err?.message}`));
59
63
  });
60
- console.log(chalk.gray("Press Ctrl+C to stop watching.\n"));
61
64
  }
62
65
  catch (err) {
63
66
  console.error(chalk.red(`Failed to start workspace watcher: ${err?.message}`));
@@ -1,4 +1,4 @@
1
- import { ConfigData } from "./schema.js";
1
+ import { ConfigData } from './schema.js';
2
2
  export declare class ConfigLoader {
3
3
  static readonly CONFIG_FILE_NAMES: string[];
4
4
  static findConfigFile(cwd?: string): string | null;
@@ -1,14 +1,14 @@
1
- import fs from "fs";
2
- import path from "path";
3
- import { DEFAULT_CONFIG_DATA } from "./schema.js";
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { DEFAULT_CONFIG_DATA } from './schema.js';
4
4
  export class ConfigLoader {
5
5
  static CONFIG_FILE_NAMES = [
6
- "testspectra.config.ts",
7
- "spectra.config.ts",
8
- "testspectra.config.js",
9
- "spectra.config.js",
10
- "testspectra.config.json",
11
- ".testspectrarc.json",
6
+ 'testspectra.config.ts',
7
+ 'spectra.config.ts',
8
+ 'testspectra.config.js',
9
+ 'spectra.config.js',
10
+ 'testspectra.config.json',
11
+ '.testspectrarc.json',
12
12
  ];
13
13
  static findConfigFile(cwd = process.cwd()) {
14
14
  let cur = path.resolve(cwd);
@@ -30,16 +30,16 @@ export class ConfigLoader {
30
30
  const configPath = this.findConfigFile(cwd);
31
31
  let loaded = {};
32
32
  if (configPath) {
33
- if (configPath.endsWith(".json")) {
33
+ if (configPath.endsWith('.json')) {
34
34
  try {
35
- const raw = fs.readFileSync(configPath, "utf-8");
35
+ const raw = fs.readFileSync(configPath, 'utf-8');
36
36
  loaded = JSON.parse(raw);
37
37
  }
38
38
  catch (e) {
39
39
  console.warn(`[TestSpectra] Warning: Failed to parse ${configPath}:`, e);
40
40
  }
41
41
  }
42
- else if (configPath.endsWith(".ts") || configPath.endsWith(".js")) {
42
+ else if (configPath.endsWith('.ts') || configPath.endsWith('.js')) {
43
43
  try {
44
44
  const fileUrl = new URL(`file://${path.resolve(configPath)}`).href;
45
45
  const mod = await import(fileUrl);
@@ -56,31 +56,46 @@ export class ConfigLoader {
56
56
  ...overrides,
57
57
  webConfig: {
58
58
  ...DEFAULT_CONFIG_DATA.webConfig,
59
- ...(loaded.webConfig || {}),
60
- ...(overrides?.webConfig || {}),
59
+ ...loaded.webConfig,
60
+ ...overrides?.webConfig,
61
61
  },
62
62
  androidConfig: {
63
63
  ...DEFAULT_CONFIG_DATA.androidConfig,
64
- ...(loaded.androidConfig || {}),
65
- ...(overrides?.androidConfig || {}),
64
+ ...loaded.androidConfig,
65
+ ...overrides?.androidConfig,
66
66
  },
67
67
  iosConfig: {
68
68
  ...DEFAULT_CONFIG_DATA.iosConfig,
69
- ...(loaded.iosConfig || {}),
70
- ...(overrides?.iosConfig || {}),
69
+ ...loaded.iosConfig,
70
+ ...overrides?.iosConfig,
71
71
  },
72
72
  executionConfig: {
73
- networkMonitoringEnabled: overrides?.executionConfig?.networkMonitoringEnabled ?? loaded.executionConfig?.networkMonitoringEnabled ?? DEFAULT_CONFIG_DATA.executionConfig?.networkMonitoringEnabled ?? true,
74
- fastResponseTime: overrides?.executionConfig?.fastResponseTime ?? loaded.executionConfig?.fastResponseTime ?? DEFAULT_CONFIG_DATA.executionConfig?.fastResponseTime ?? "200",
75
- normalResponseTime: overrides?.executionConfig?.normalResponseTime ?? loaded.executionConfig?.normalResponseTime ?? DEFAULT_CONFIG_DATA.executionConfig?.normalResponseTime ?? "1000",
76
- monitoredDomains: overrides?.executionConfig?.monitoredDomains ?? loaded.executionConfig?.monitoredDomains ?? DEFAULT_CONFIG_DATA.executionConfig?.monitoredDomains ?? [],
77
- environmentVariables: overrides?.executionConfig?.environmentVariables ?? loaded.executionConfig?.environmentVariables ?? DEFAULT_CONFIG_DATA.executionConfig?.environmentVariables ?? [],
73
+ networkMonitoringEnabled: overrides?.executionConfig?.networkMonitoringEnabled ??
74
+ loaded.executionConfig?.networkMonitoringEnabled ??
75
+ DEFAULT_CONFIG_DATA.executionConfig?.networkMonitoringEnabled ??
76
+ true,
77
+ fastResponseTime: overrides?.executionConfig?.fastResponseTime ??
78
+ loaded.executionConfig?.fastResponseTime ??
79
+ DEFAULT_CONFIG_DATA.executionConfig?.fastResponseTime ??
80
+ '200',
81
+ normalResponseTime: overrides?.executionConfig?.normalResponseTime ??
82
+ loaded.executionConfig?.normalResponseTime ??
83
+ DEFAULT_CONFIG_DATA.executionConfig?.normalResponseTime ??
84
+ '1000',
85
+ monitoredDomains: overrides?.executionConfig?.monitoredDomains ??
86
+ loaded.executionConfig?.monitoredDomains ??
87
+ DEFAULT_CONFIG_DATA.executionConfig?.monitoredDomains ??
88
+ [],
89
+ environmentVariables: overrides?.executionConfig?.environmentVariables ??
90
+ loaded.executionConfig?.environmentVariables ??
91
+ DEFAULT_CONFIG_DATA.executionConfig?.environmentVariables ??
92
+ [],
78
93
  },
79
94
  };
80
95
  }
81
- static saveConfig(cwd, config, filename = "testspectra.config.json") {
96
+ static saveConfig(cwd, config, filename = 'testspectra.config.json') {
82
97
  const target = path.join(cwd, filename);
83
- fs.writeFileSync(target, JSON.stringify(config, null, 2), "utf-8");
98
+ fs.writeFileSync(target, JSON.stringify(config, null, 2), 'utf-8');
84
99
  return target;
85
100
  }
86
101
  }
@@ -9,14 +9,15 @@ export interface WebConfig {
9
9
  baseUrl: string;
10
10
  /**
11
11
  * Maximum number of parallel browser sessions/workers spawned during test execution.
12
- * @default "1"
12
+ * Can be an explicit number, numeric string, or `"auto"`.
13
+ * @default "auto"
13
14
  */
14
- maxConcurrentSessions: string;
15
+ maxConcurrentSessions: number | string | 'auto';
15
16
  /**
16
17
  * Whether to run browsers in headless mode without a visible GUI window.
17
18
  * @default true
18
19
  */
19
- headlessMode: boolean;
20
+ headless: boolean | 'new';
20
21
  /**
21
22
  * Implicit wait timeout (in milliseconds) for finding elements before throwing an error.
22
23
  * @default "5000"
@@ -32,13 +33,18 @@ export interface WebConfig {
32
33
  * @default "30000"
33
34
  */
34
35
  scriptTimeout: string;
36
+ /**
37
+ * Delay between consecutive actions and commands in milliseconds (slow motion).
38
+ * @default 0
39
+ */
40
+ stepDelay?: number;
35
41
  /**
36
42
  * Parallelization granularity:
37
43
  * - `"testcase"`: Each test case executes in parallel across available workers.
38
44
  * - `"suite"`: Test cases within a suite run serially, while different suites run in parallel.
39
45
  * @default "testcase"
40
46
  */
41
- parallelizationMode: "testcase" | "suite";
47
+ parallelizationMode: 'testcase' | 'suite';
42
48
  }
43
49
  /**
44
50
  * Browser target definition for web test execution.
@@ -72,34 +78,76 @@ export interface Browser {
72
78
  height?: string;
73
79
  }
74
80
  /**
75
- * Configuration for Android mobile test automation with Appium & UiAutomator2.
81
+ * Target Android device specification for multi-device parallel execution.
76
82
  */
77
- export interface AndroidConfig {
83
+ export interface AndroidDeviceTarget {
78
84
  /**
79
- * Appium server endpoint URL.
80
- * @default "http://127.0.0.1:4723"
85
+ * ADB serial or device ID (e.g. "emulator-5554", "192.168.1.50:5555").
81
86
  */
82
- appiumServer: string;
87
+ id: string;
83
88
  /**
84
- * Mobile platform name.
85
- * @default "Android"
89
+ * Emulator AVD name (e.g. "Pixel_7_Pro_API_34").
86
90
  */
87
- platformName: string;
91
+ avd?: string;
88
92
  /**
89
- * Android OS version (e.g. `"13"`, `"14"`).
90
- * @default "13"
93
+ * Friendly display/model name (e.g. "Pixel 7 Pro").
91
94
  */
92
- platformVersion: string;
95
+ name?: string;
93
96
  /**
94
- * Target Android device name or ADB serial ID (e.g. `"emulator-5554"`).
95
- * @default "emulator-5554"
97
+ * Android OS version (e.g. "14.0").
96
98
  */
97
- deviceName: string;
99
+ version?: string;
98
100
  /**
99
- * Appium mobile automation driver engine.
100
- * @default "UiAutomator2"
101
+ * UiAutomator2 port (e.g. 8200).
101
102
  */
102
- automationName: string;
103
+ systemPort?: number;
104
+ /**
105
+ * Custom Appium capabilities overrides for this specific device.
106
+ */
107
+ capabilities?: Record<string, any>;
108
+ }
109
+ /**
110
+ * Target iOS device specification for multi-device parallel execution.
111
+ */
112
+ export interface IosDeviceTarget {
113
+ /**
114
+ * Device ID or simulator slug (e.g. "iphone-15-pro").
115
+ */
116
+ id: string;
117
+ /**
118
+ * Friendly name (e.g. "iPhone 15 Pro Simulator").
119
+ */
120
+ name?: string;
121
+ /**
122
+ * iOS version (e.g. "17.0").
123
+ */
124
+ version?: string;
125
+ /**
126
+ * Physical device UDID or "auto".
127
+ */
128
+ udid?: string;
129
+ /**
130
+ * WebDriverAgent local port (e.g. 8100).
131
+ */
132
+ wdaLocalPort?: number;
133
+ /**
134
+ * Custom Appium capabilities overrides for this specific device.
135
+ */
136
+ capabilities?: Record<string, any>;
137
+ }
138
+ /**
139
+ * Configuration for Android mobile test automation with Spectra Android Native Driver.
140
+ */
141
+ export interface AndroidConfig {
142
+ /**
143
+ * Spectra Android Driver server endpoint URL.
144
+ * @default "tcp://127.0.0.1:8200"
145
+ */
146
+ driverServer?: string;
147
+ /**
148
+ * Legacy Appium server endpoint URL (fallback, deprecated — use `driverServer`).
149
+ */
150
+ appiumServer?: string;
103
151
  /**
104
152
  * Android application package name (e.g. `"com.example.app"`).
105
153
  */
@@ -108,11 +156,6 @@ export interface AndroidConfig {
108
156
  * Main activity name launched when starting the app.
109
157
  */
110
158
  appActivity: string;
111
- /**
112
- * Whether to automatically grant Android runtime permissions upon installation.
113
- * @default true
114
- */
115
- autoGrantPermissions: boolean;
116
159
  /**
117
160
  * Whether to preserve app state and prevent clearing app data/cache between sessions.
118
161
  * @default false
@@ -120,39 +163,47 @@ export interface AndroidConfig {
120
163
  noReset: boolean;
121
164
  /**
122
165
  * Implicit wait timeout (in milliseconds) for locating mobile elements.
123
- * @default "10000"
166
+ * @default 10000
124
167
  */
125
- implicitWait: string;
168
+ implicitWait: string | number;
126
169
  /**
127
170
  * Parallelization execution mode for Android mobile tests.
128
171
  * @default "suite"
129
172
  */
130
- parallelizationMode: "testcase" | "suite";
173
+ parallelizationMode: 'testcase' | 'suite';
174
+ /**
175
+ * Array of explicit target devices or configurations for multi-device parallel execution.
176
+ * Each entry can specify its own `id`, `name`, `version`, `avd`, `systemPort`, etc.
177
+ */
178
+ devices: (string | AndroidDeviceTarget)[] | 'auto';
179
+ /**
180
+ * Raw custom WebdriverIO / Appium capabilities array override.
181
+ */
182
+ capabilities?: Record<string, any>[];
183
+ /**
184
+ * Maximum concurrent mobile sessions/devices cap.
185
+ */
186
+ maxConcurrentSessions?: number | string;
187
+ /**
188
+ * Delay between consecutive actions and commands in milliseconds (slow motion).
189
+ * @default 0
190
+ */
191
+ stepDelay?: number;
131
192
  }
132
193
  /**
133
194
  * Configuration for iOS mobile test automation with Appium & XCUITest.
134
195
  */
135
196
  export interface IosConfig {
197
+ /**
198
+ * Delay between consecutive actions and commands in milliseconds (slow motion).
199
+ * @default 0
200
+ */
201
+ stepDelay?: number;
136
202
  /**
137
203
  * Appium server endpoint URL.
138
204
  * @default "http://127.0.0.1:4723"
139
205
  */
140
206
  appiumServer: string;
141
- /**
142
- * Mobile platform name.
143
- * @default "iOS"
144
- */
145
- platformName: string;
146
- /**
147
- * iOS version (e.g. `"16.0"`, `"17.0"`).
148
- * @default "16.0"
149
- */
150
- platformVersion: string;
151
- /**
152
- * iOS simulator or connected physical device name (e.g. `"iPhone 14"`).
153
- * @default "iPhone 14"
154
- */
155
- deviceName: string;
156
207
  /**
157
208
  * Appium mobile automation driver engine for iOS.
158
209
  * @default "XCUITest"
@@ -166,16 +217,28 @@ export interface IosConfig {
166
217
  * Target device Unique Device Identifier (UDID) or `"auto"`.
167
218
  * @default "auto"
168
219
  */
169
- udid: string;
220
+ udid?: string;
221
+ /**
222
+ * Array of explicit target devices or configurations for multi-device execution.
223
+ */
224
+ devices: (string | IosDeviceTarget)[] | 'auto';
225
+ /**
226
+ * Raw custom WebdriverIO / Appium capabilities array override.
227
+ */
228
+ capabilities?: Record<string, any>[];
229
+ /**
230
+ * Maximum concurrent mobile sessions/devices cap.
231
+ */
232
+ maxConcurrentSessions?: number | string;
170
233
  /**
171
234
  * Apple Developer Team 10-character Organization ID for code signing.
172
235
  */
173
- xcodeOrgId: string;
236
+ xcodeOrgId?: string;
174
237
  /**
175
238
  * Xcode code signing identity string (e.g. `"iPhone Developer"`).
176
239
  * @default "iPhone Developer"
177
240
  */
178
- xcodeSigningId: string;
241
+ xcodeSigningId?: string;
179
242
  /**
180
243
  * Whether to automatically accept iOS system permission alerts.
181
244
  * @default true
@@ -188,14 +251,14 @@ export interface IosConfig {
188
251
  noReset: boolean;
189
252
  /**
190
253
  * Implicit wait timeout (in milliseconds) for locating iOS UI elements.
191
- * @default "10000"
254
+ * @default 10000
192
255
  */
193
- implicitWait: string;
256
+ implicitWait: string | number;
194
257
  /**
195
258
  * Parallelization execution mode for iOS mobile tests.
196
259
  * @default "suite"
197
260
  */
198
- parallelizationMode: "testcase" | "suite";
261
+ parallelizationMode: 'testcase' | 'suite';
199
262
  }
200
263
  /**
201
264
  * Load testing stage ramp-up profile.
@@ -328,9 +391,9 @@ export interface ConfigData {
328
391
  /**
329
392
  * Deep recursive partial type for user-friendly configuration objects.
330
393
  */
331
- export type DeepPartial<T> = {
332
- [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
333
- };
394
+ export type DeepPartial<T> = T extends Function | boolean | number | string | symbol | null | undefined ? T : T extends Array<infer U> ? DeepPartial<U>[] : T extends ReadonlyArray<infer U> ? readonly DeepPartial<U>[] : T extends object ? {
395
+ [K in keyof T]?: DeepPartial<T[K]>;
396
+ } : T;
334
397
  /**
335
398
  * User-provided configuration options with optional deep partial properties.
336
399
  */
@@ -345,7 +408,7 @@ export type UserConfig = DeepPartial<ConfigData>;
345
408
  * export default defineConfig({
346
409
  * webConfig: {
347
410
  * baseUrl: "https://example.com",
348
- * headlessMode: false,
411
+ * headless: false,
349
412
  * },
350
413
  * });
351
414
  * ```
@@ -8,7 +8,7 @@
8
8
  * export default defineConfig({
9
9
  * webConfig: {
10
10
  * baseUrl: "https://example.com",
11
- * headlessMode: false,
11
+ * headless: false,
12
12
  * },
13
13
  * });
14
14
  * ```
@@ -21,59 +21,65 @@ export function defineConfig(config) {
21
21
  */
22
22
  export const DEFAULT_CONFIG_DATA = {
23
23
  webConfig: {
24
- baseUrl: "http://localhost:3000",
25
- maxConcurrentSessions: "1",
26
- headlessMode: true,
27
- implicitWait: "5000",
28
- pageLoadTimeout: "30000",
29
- scriptTimeout: "30000",
30
- parallelizationMode: "testcase",
24
+ baseUrl: 'http://localhost:3000',
25
+ maxConcurrentSessions: '1',
26
+ headless: true,
27
+ implicitWait: '5000',
28
+ pageLoadTimeout: '30000',
29
+ scriptTimeout: '30000',
30
+ parallelizationMode: 'testcase',
31
31
  },
32
32
  browsers: [
33
33
  {
34
- id: "chrome-desktop",
35
- type: "chrome",
34
+ id: 'chrome-desktop',
35
+ type: 'chrome',
36
36
  mobileEmulation: false,
37
37
  },
38
38
  ],
39
39
  androidConfig: {
40
- appiumServer: "http://127.0.0.1:4723",
41
- platformName: "Android",
42
- platformVersion: "13",
43
- deviceName: "emulator-5554",
44
- automationName: "UiAutomator2",
45
- appPackage: "",
46
- appActivity: "",
47
- autoGrantPermissions: true,
40
+ driverServer: 'http://127.0.0.1:4800',
41
+ appPackage: '',
42
+ appActivity: '',
48
43
  noReset: false,
49
- implicitWait: "10000",
50
- parallelizationMode: "suite",
44
+ implicitWait: 10000,
45
+ parallelizationMode: 'suite',
46
+ devices: [
47
+ {
48
+ id: 'emulator-5554',
49
+ name: 'Pixel 7 Pro Emulator',
50
+ version: '14.0',
51
+ systemPort: 8200,
52
+ },
53
+ ],
51
54
  },
52
55
  iosConfig: {
53
- appiumServer: "http://127.0.0.1:4723",
54
- platformName: "iOS",
55
- platformVersion: "16.0",
56
- deviceName: "iPhone 14",
57
- automationName: "XCUITest",
58
- bundleId: "",
59
- udid: "auto",
60
- xcodeOrgId: "",
61
- xcodeSigningId: "iPhone Developer",
56
+ appiumServer: 'http://127.0.0.1:4723',
57
+ automationName: 'XCUITest',
58
+ bundleId: '',
62
59
  autoAcceptAlerts: true,
63
60
  noReset: false,
64
- implicitWait: "10000",
65
- parallelizationMode: "suite",
61
+ implicitWait: 10000,
62
+ parallelizationMode: 'suite',
63
+ devices: [
64
+ {
65
+ id: 'iphone-15-pro',
66
+ name: 'iPhone 15 Pro Simulator',
67
+ version: '17.0',
68
+ udid: 'auto',
69
+ wdaLocalPort: 8100,
70
+ },
71
+ ],
66
72
  },
67
73
  loadConfig: {
68
- virtualUsers: "10",
69
- duration: "1m",
74
+ virtualUsers: '10',
75
+ duration: '1m',
70
76
  },
71
77
  loadStages: [],
72
78
  thresholds: [],
73
79
  executionConfig: {
74
80
  networkMonitoringEnabled: true,
75
- fastResponseTime: "200",
76
- normalResponseTime: "1000",
81
+ fastResponseTime: '200',
82
+ normalResponseTime: '1000',
77
83
  monitoredDomains: [],
78
84
  environmentVariables: [],
79
85
  },