@desplega.ai/qa-use 2.10.1 → 2.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/README.md +16 -6
  2. package/dist/lib/api/browser-types.d.ts +1 -0
  3. package/dist/lib/api/browser-types.d.ts.map +1 -1
  4. package/dist/lib/api/browser.d.ts +1 -0
  5. package/dist/lib/api/browser.d.ts.map +1 -1
  6. package/dist/lib/api/browser.js +14 -1
  7. package/dist/lib/api/browser.js.map +1 -1
  8. package/dist/lib/api/index.d.ts +4 -3
  9. package/dist/lib/api/index.d.ts.map +1 -1
  10. package/dist/lib/api/index.js +18 -2
  11. package/dist/lib/api/index.js.map +1 -1
  12. package/dist/lib/env/index.d.ts +12 -2
  13. package/dist/lib/env/index.d.ts.map +1 -1
  14. package/dist/lib/env/index.js +56 -5
  15. package/dist/lib/env/index.js.map +1 -1
  16. package/dist/package.json +2 -1
  17. package/dist/src/cli/commands/api/examples.d.ts +3 -0
  18. package/dist/src/cli/commands/api/examples.d.ts.map +1 -0
  19. package/dist/src/cli/commands/api/examples.js +48 -0
  20. package/dist/src/cli/commands/api/examples.js.map +1 -0
  21. package/dist/src/cli/commands/api/index.d.ts.map +1 -1
  22. package/dist/src/cli/commands/api/index.js +22 -0
  23. package/dist/src/cli/commands/api/index.js.map +1 -1
  24. package/dist/src/cli/commands/api/info.d.ts +3 -0
  25. package/dist/src/cli/commands/api/info.d.ts.map +1 -0
  26. package/dist/src/cli/commands/api/info.js +59 -0
  27. package/dist/src/cli/commands/api/info.js.map +1 -0
  28. package/dist/src/cli/commands/api/lib/openapi-spec.d.ts +22 -0
  29. package/dist/src/cli/commands/api/lib/openapi-spec.d.ts.map +1 -1
  30. package/dist/src/cli/commands/api/lib/openapi-spec.js +33 -1
  31. package/dist/src/cli/commands/api/lib/openapi-spec.js.map +1 -1
  32. package/dist/src/cli/commands/api/lib/output.d.ts +4 -0
  33. package/dist/src/cli/commands/api/lib/output.d.ts.map +1 -1
  34. package/dist/src/cli/commands/api/lib/output.js +90 -0
  35. package/dist/src/cli/commands/api/lib/output.js.map +1 -1
  36. package/dist/src/cli/commands/api/lib/route-matching.d.ts +4 -0
  37. package/dist/src/cli/commands/api/lib/route-matching.d.ts.map +1 -0
  38. package/dist/src/cli/commands/api/lib/route-matching.js +9 -0
  39. package/dist/src/cli/commands/api/lib/route-matching.js.map +1 -0
  40. package/dist/src/cli/commands/api/lib/schema-resolver.d.ts +30 -0
  41. package/dist/src/cli/commands/api/lib/schema-resolver.d.ts.map +1 -0
  42. package/dist/src/cli/commands/api/lib/schema-resolver.js +91 -0
  43. package/dist/src/cli/commands/api/lib/schema-resolver.js.map +1 -0
  44. package/dist/src/cli/commands/api/ls.d.ts.map +1 -1
  45. package/dist/src/cli/commands/api/ls.js +6 -1
  46. package/dist/src/cli/commands/api/ls.js.map +1 -1
  47. package/dist/src/cli/commands/api/openapi.d.ts +3 -0
  48. package/dist/src/cli/commands/api/openapi.d.ts.map +1 -0
  49. package/dist/src/cli/commands/api/openapi.js +55 -0
  50. package/dist/src/cli/commands/api/openapi.js.map +1 -0
  51. package/dist/src/cli/commands/api/request.d.ts.map +1 -1
  52. package/dist/src/cli/commands/api/request.js +9 -11
  53. package/dist/src/cli/commands/api/request.js.map +1 -1
  54. package/dist/src/cli/commands/app-config/create.d.ts +6 -0
  55. package/dist/src/cli/commands/app-config/create.d.ts.map +1 -0
  56. package/dist/src/cli/commands/app-config/create.js +32 -0
  57. package/dist/src/cli/commands/app-config/create.js.map +1 -0
  58. package/dist/src/cli/commands/app-config/delete.d.ts +6 -0
  59. package/dist/src/cli/commands/app-config/delete.d.ts.map +1 -0
  60. package/dist/src/cli/commands/app-config/delete.js +31 -0
  61. package/dist/src/cli/commands/app-config/delete.js.map +1 -0
  62. package/dist/src/cli/commands/app-config/index.d.ts +6 -0
  63. package/dist/src/cli/commands/app-config/index.d.ts.map +1 -0
  64. package/dist/src/cli/commands/app-config/index.js +16 -0
  65. package/dist/src/cli/commands/app-config/index.js.map +1 -0
  66. package/dist/src/cli/commands/app-config/info.d.ts +6 -0
  67. package/dist/src/cli/commands/app-config/info.d.ts.map +1 -0
  68. package/dist/src/cli/commands/app-config/info.js +67 -0
  69. package/dist/src/cli/commands/app-config/info.js.map +1 -0
  70. package/dist/src/cli/commands/app-config/list.d.ts +6 -0
  71. package/dist/src/cli/commands/app-config/list.d.ts.map +1 -0
  72. package/dist/src/cli/commands/app-config/list.js +58 -0
  73. package/dist/src/cli/commands/app-config/list.js.map +1 -0
  74. package/dist/src/cli/commands/app-config/update.d.ts +6 -0
  75. package/dist/src/cli/commands/app-config/update.d.ts.map +1 -0
  76. package/dist/src/cli/commands/app-config/update.js +31 -0
  77. package/dist/src/cli/commands/app-config/update.js.map +1 -0
  78. package/dist/src/cli/commands/app-context/create.d.ts +6 -0
  79. package/dist/src/cli/commands/app-context/create.d.ts.map +1 -0
  80. package/dist/src/cli/commands/app-context/create.js +32 -0
  81. package/dist/src/cli/commands/app-context/create.js.map +1 -0
  82. package/dist/src/cli/commands/app-context/delete.d.ts +6 -0
  83. package/dist/src/cli/commands/app-context/delete.d.ts.map +1 -0
  84. package/dist/src/cli/commands/app-context/delete.js +31 -0
  85. package/dist/src/cli/commands/app-context/delete.js.map +1 -0
  86. package/dist/src/cli/commands/app-context/index.d.ts +6 -0
  87. package/dist/src/cli/commands/app-context/index.d.ts.map +1 -0
  88. package/dist/src/cli/commands/app-context/index.js +16 -0
  89. package/dist/src/cli/commands/app-context/index.js.map +1 -0
  90. package/dist/src/cli/commands/app-context/info.d.ts +6 -0
  91. package/dist/src/cli/commands/app-context/info.d.ts.map +1 -0
  92. package/dist/src/cli/commands/app-context/info.js +51 -0
  93. package/dist/src/cli/commands/app-context/info.js.map +1 -0
  94. package/dist/src/cli/commands/app-context/list.d.ts +6 -0
  95. package/dist/src/cli/commands/app-context/list.d.ts.map +1 -0
  96. package/dist/src/cli/commands/app-context/list.js +58 -0
  97. package/dist/src/cli/commands/app-context/list.js.map +1 -0
  98. package/dist/src/cli/commands/app-context/update.d.ts +6 -0
  99. package/dist/src/cli/commands/app-context/update.d.ts.map +1 -0
  100. package/dist/src/cli/commands/app-context/update.js +31 -0
  101. package/dist/src/cli/commands/app-context/update.js.map +1 -0
  102. package/dist/src/cli/commands/browser/back.d.ts.map +1 -1
  103. package/dist/src/cli/commands/browser/back.js +2 -4
  104. package/dist/src/cli/commands/browser/back.js.map +1 -1
  105. package/dist/src/cli/commands/browser/blur.d.ts.map +1 -1
  106. package/dist/src/cli/commands/browser/blur.js +2 -4
  107. package/dist/src/cli/commands/browser/blur.js.map +1 -1
  108. package/dist/src/cli/commands/browser/check.d.ts.map +1 -1
  109. package/dist/src/cli/commands/browser/check.js +2 -4
  110. package/dist/src/cli/commands/browser/check.js.map +1 -1
  111. package/dist/src/cli/commands/browser/click.d.ts.map +1 -1
  112. package/dist/src/cli/commands/browser/click.js +2 -4
  113. package/dist/src/cli/commands/browser/click.js.map +1 -1
  114. package/dist/src/cli/commands/browser/close.d.ts.map +1 -1
  115. package/dist/src/cli/commands/browser/close.js +2 -4
  116. package/dist/src/cli/commands/browser/close.js.map +1 -1
  117. package/dist/src/cli/commands/browser/create.d.ts.map +1 -1
  118. package/dist/src/cli/commands/browser/create.js +7 -4
  119. package/dist/src/cli/commands/browser/create.js.map +1 -1
  120. package/dist/src/cli/commands/browser/downloads.d.ts.map +1 -1
  121. package/dist/src/cli/commands/browser/downloads.js +2 -4
  122. package/dist/src/cli/commands/browser/downloads.js.map +1 -1
  123. package/dist/src/cli/commands/browser/drag.d.ts.map +1 -1
  124. package/dist/src/cli/commands/browser/drag.js +2 -4
  125. package/dist/src/cli/commands/browser/drag.js.map +1 -1
  126. package/dist/src/cli/commands/browser/evaluate.d.ts.map +1 -1
  127. package/dist/src/cli/commands/browser/evaluate.js +2 -4
  128. package/dist/src/cli/commands/browser/evaluate.js.map +1 -1
  129. package/dist/src/cli/commands/browser/fill.d.ts.map +1 -1
  130. package/dist/src/cli/commands/browser/fill.js +2 -4
  131. package/dist/src/cli/commands/browser/fill.js.map +1 -1
  132. package/dist/src/cli/commands/browser/focus.d.ts.map +1 -1
  133. package/dist/src/cli/commands/browser/focus.js +2 -4
  134. package/dist/src/cli/commands/browser/focus.js.map +1 -1
  135. package/dist/src/cli/commands/browser/forward.d.ts.map +1 -1
  136. package/dist/src/cli/commands/browser/forward.js +2 -4
  137. package/dist/src/cli/commands/browser/forward.js.map +1 -1
  138. package/dist/src/cli/commands/browser/generate-test.d.ts.map +1 -1
  139. package/dist/src/cli/commands/browser/generate-test.js +2 -4
  140. package/dist/src/cli/commands/browser/generate-test.js.map +1 -1
  141. package/dist/src/cli/commands/browser/get-blocks.d.ts.map +1 -1
  142. package/dist/src/cli/commands/browser/get-blocks.js +2 -4
  143. package/dist/src/cli/commands/browser/get-blocks.js.map +1 -1
  144. package/dist/src/cli/commands/browser/goto.d.ts.map +1 -1
  145. package/dist/src/cli/commands/browser/goto.js +2 -4
  146. package/dist/src/cli/commands/browser/goto.js.map +1 -1
  147. package/dist/src/cli/commands/browser/hover.d.ts.map +1 -1
  148. package/dist/src/cli/commands/browser/hover.js +2 -4
  149. package/dist/src/cli/commands/browser/hover.js.map +1 -1
  150. package/dist/src/cli/commands/browser/list.d.ts.map +1 -1
  151. package/dist/src/cli/commands/browser/list.js +2 -4
  152. package/dist/src/cli/commands/browser/list.js.map +1 -1
  153. package/dist/src/cli/commands/browser/logs.d.ts.map +1 -1
  154. package/dist/src/cli/commands/browser/logs.js +3 -6
  155. package/dist/src/cli/commands/browser/logs.js.map +1 -1
  156. package/dist/src/cli/commands/browser/mfa-totp.d.ts.map +1 -1
  157. package/dist/src/cli/commands/browser/mfa-totp.js +2 -4
  158. package/dist/src/cli/commands/browser/mfa-totp.js.map +1 -1
  159. package/dist/src/cli/commands/browser/press.d.ts.map +1 -1
  160. package/dist/src/cli/commands/browser/press.js +2 -4
  161. package/dist/src/cli/commands/browser/press.js.map +1 -1
  162. package/dist/src/cli/commands/browser/reload.d.ts.map +1 -1
  163. package/dist/src/cli/commands/browser/reload.js +2 -4
  164. package/dist/src/cli/commands/browser/reload.js.map +1 -1
  165. package/dist/src/cli/commands/browser/run.d.ts.map +1 -1
  166. package/dist/src/cli/commands/browser/run.js +5 -4
  167. package/dist/src/cli/commands/browser/run.js.map +1 -1
  168. package/dist/src/cli/commands/browser/screenshot.d.ts.map +1 -1
  169. package/dist/src/cli/commands/browser/screenshot.js +2 -4
  170. package/dist/src/cli/commands/browser/screenshot.js.map +1 -1
  171. package/dist/src/cli/commands/browser/scroll-into-view.d.ts.map +1 -1
  172. package/dist/src/cli/commands/browser/scroll-into-view.js +2 -4
  173. package/dist/src/cli/commands/browser/scroll-into-view.js.map +1 -1
  174. package/dist/src/cli/commands/browser/scroll.d.ts.map +1 -1
  175. package/dist/src/cli/commands/browser/scroll.js +2 -4
  176. package/dist/src/cli/commands/browser/scroll.js.map +1 -1
  177. package/dist/src/cli/commands/browser/select.d.ts.map +1 -1
  178. package/dist/src/cli/commands/browser/select.js +2 -4
  179. package/dist/src/cli/commands/browser/select.js.map +1 -1
  180. package/dist/src/cli/commands/browser/snapshot.d.ts.map +1 -1
  181. package/dist/src/cli/commands/browser/snapshot.js +2 -4
  182. package/dist/src/cli/commands/browser/snapshot.js.map +1 -1
  183. package/dist/src/cli/commands/browser/status.d.ts.map +1 -1
  184. package/dist/src/cli/commands/browser/status.js +6 -4
  185. package/dist/src/cli/commands/browser/status.js.map +1 -1
  186. package/dist/src/cli/commands/browser/stream.d.ts.map +1 -1
  187. package/dist/src/cli/commands/browser/stream.js +2 -4
  188. package/dist/src/cli/commands/browser/stream.js.map +1 -1
  189. package/dist/src/cli/commands/browser/type.d.ts.map +1 -1
  190. package/dist/src/cli/commands/browser/type.js +2 -4
  191. package/dist/src/cli/commands/browser/type.js.map +1 -1
  192. package/dist/src/cli/commands/browser/uncheck.d.ts.map +1 -1
  193. package/dist/src/cli/commands/browser/uncheck.js +2 -4
  194. package/dist/src/cli/commands/browser/uncheck.js.map +1 -1
  195. package/dist/src/cli/commands/browser/upload.d.ts.map +1 -1
  196. package/dist/src/cli/commands/browser/upload.js +2 -4
  197. package/dist/src/cli/commands/browser/upload.js.map +1 -1
  198. package/dist/src/cli/commands/browser/url.d.ts.map +1 -1
  199. package/dist/src/cli/commands/browser/url.js +2 -4
  200. package/dist/src/cli/commands/browser/url.js.map +1 -1
  201. package/dist/src/cli/commands/browser/wait-for-load.d.ts.map +1 -1
  202. package/dist/src/cli/commands/browser/wait-for-load.js +2 -4
  203. package/dist/src/cli/commands/browser/wait-for-load.js.map +1 -1
  204. package/dist/src/cli/commands/browser/wait-for-selector.d.ts.map +1 -1
  205. package/dist/src/cli/commands/browser/wait-for-selector.js +2 -4
  206. package/dist/src/cli/commands/browser/wait-for-selector.js.map +1 -1
  207. package/dist/src/cli/commands/browser/wait.d.ts.map +1 -1
  208. package/dist/src/cli/commands/browser/wait.js +2 -4
  209. package/dist/src/cli/commands/browser/wait.js.map +1 -1
  210. package/dist/src/cli/commands/data-asset/delete.d.ts +6 -0
  211. package/dist/src/cli/commands/data-asset/delete.d.ts.map +1 -0
  212. package/dist/src/cli/commands/data-asset/delete.js +31 -0
  213. package/dist/src/cli/commands/data-asset/delete.js.map +1 -0
  214. package/dist/src/cli/commands/data-asset/index.d.ts +6 -0
  215. package/dist/src/cli/commands/data-asset/index.d.ts.map +1 -0
  216. package/dist/src/cli/commands/data-asset/index.js +14 -0
  217. package/dist/src/cli/commands/data-asset/index.js.map +1 -0
  218. package/dist/src/cli/commands/data-asset/info.d.ts +6 -0
  219. package/dist/src/cli/commands/data-asset/info.d.ts.map +1 -0
  220. package/dist/src/cli/commands/data-asset/info.js +75 -0
  221. package/dist/src/cli/commands/data-asset/info.js.map +1 -0
  222. package/dist/src/cli/commands/data-asset/list.d.ts +6 -0
  223. package/dist/src/cli/commands/data-asset/list.d.ts.map +1 -0
  224. package/dist/src/cli/commands/data-asset/list.js +76 -0
  225. package/dist/src/cli/commands/data-asset/list.js.map +1 -0
  226. package/dist/src/cli/commands/data-asset/upload.d.ts +6 -0
  227. package/dist/src/cli/commands/data-asset/upload.d.ts.map +1 -0
  228. package/dist/src/cli/commands/data-asset/upload.js +83 -0
  229. package/dist/src/cli/commands/data-asset/upload.js.map +1 -0
  230. package/dist/src/cli/commands/docs.d.ts.map +1 -1
  231. package/dist/src/cli/commands/docs.js +7 -1
  232. package/dist/src/cli/commands/docs.js.map +1 -1
  233. package/dist/src/cli/commands/info.d.ts.map +1 -1
  234. package/dist/src/cli/commands/info.js +15 -6
  235. package/dist/src/cli/commands/info.js.map +1 -1
  236. package/dist/src/cli/commands/issues/index.d.ts +6 -0
  237. package/dist/src/cli/commands/issues/index.d.ts.map +1 -0
  238. package/dist/src/cli/commands/issues/index.js +12 -0
  239. package/dist/src/cli/commands/issues/index.js.map +1 -0
  240. package/dist/src/cli/commands/issues/info.d.ts +6 -0
  241. package/dist/src/cli/commands/issues/info.d.ts.map +1 -0
  242. package/dist/src/cli/commands/issues/info.js +57 -0
  243. package/dist/src/cli/commands/issues/info.js.map +1 -0
  244. package/dist/src/cli/commands/issues/list.d.ts +6 -0
  245. package/dist/src/cli/commands/issues/list.d.ts.map +1 -0
  246. package/dist/src/cli/commands/issues/list.js +71 -0
  247. package/dist/src/cli/commands/issues/list.js.map +1 -0
  248. package/dist/src/cli/commands/issues/occurrences.d.ts +6 -0
  249. package/dist/src/cli/commands/issues/occurrences.d.ts.map +1 -0
  250. package/dist/src/cli/commands/issues/occurrences.js +54 -0
  251. package/dist/src/cli/commands/issues/occurrences.js.map +1 -0
  252. package/dist/src/cli/commands/persona/create.d.ts +6 -0
  253. package/dist/src/cli/commands/persona/create.d.ts.map +1 -0
  254. package/dist/src/cli/commands/persona/create.js +30 -0
  255. package/dist/src/cli/commands/persona/create.js.map +1 -0
  256. package/dist/src/cli/commands/persona/delete.d.ts +6 -0
  257. package/dist/src/cli/commands/persona/delete.d.ts.map +1 -0
  258. package/dist/src/cli/commands/persona/delete.js +31 -0
  259. package/dist/src/cli/commands/persona/delete.js.map +1 -0
  260. package/dist/src/cli/commands/persona/index.d.ts +6 -0
  261. package/dist/src/cli/commands/persona/index.d.ts.map +1 -0
  262. package/dist/src/cli/commands/persona/index.js +16 -0
  263. package/dist/src/cli/commands/persona/index.js.map +1 -0
  264. package/dist/src/cli/commands/persona/info.d.ts +6 -0
  265. package/dist/src/cli/commands/persona/info.d.ts.map +1 -0
  266. package/dist/src/cli/commands/persona/info.js +51 -0
  267. package/dist/src/cli/commands/persona/info.js.map +1 -0
  268. package/dist/src/cli/commands/persona/list.d.ts +6 -0
  269. package/dist/src/cli/commands/persona/list.d.ts.map +1 -0
  270. package/dist/src/cli/commands/persona/list.js +58 -0
  271. package/dist/src/cli/commands/persona/list.js.map +1 -0
  272. package/dist/src/cli/commands/persona/update.d.ts +6 -0
  273. package/dist/src/cli/commands/persona/update.d.ts.map +1 -0
  274. package/dist/src/cli/commands/persona/update.js +31 -0
  275. package/dist/src/cli/commands/persona/update.js.map +1 -0
  276. package/dist/src/cli/commands/setup.d.ts.map +1 -1
  277. package/dist/src/cli/commands/setup.js +4 -2
  278. package/dist/src/cli/commands/setup.js.map +1 -1
  279. package/dist/src/cli/commands/suite/create.d.ts +6 -0
  280. package/dist/src/cli/commands/suite/create.d.ts.map +1 -0
  281. package/dist/src/cli/commands/suite/create.js +30 -0
  282. package/dist/src/cli/commands/suite/create.js.map +1 -0
  283. package/dist/src/cli/commands/suite/delete.d.ts +6 -0
  284. package/dist/src/cli/commands/suite/delete.d.ts.map +1 -0
  285. package/dist/src/cli/commands/suite/delete.js +31 -0
  286. package/dist/src/cli/commands/suite/delete.js.map +1 -0
  287. package/dist/src/cli/commands/suite/index.d.ts +6 -0
  288. package/dist/src/cli/commands/suite/index.d.ts.map +1 -0
  289. package/dist/src/cli/commands/suite/index.js +18 -0
  290. package/dist/src/cli/commands/suite/index.js.map +1 -0
  291. package/dist/src/cli/commands/suite/info.d.ts +6 -0
  292. package/dist/src/cli/commands/suite/info.d.ts.map +1 -0
  293. package/dist/src/cli/commands/suite/info.js +66 -0
  294. package/dist/src/cli/commands/suite/info.js.map +1 -0
  295. package/dist/src/cli/commands/suite/list.d.ts +6 -0
  296. package/dist/src/cli/commands/suite/list.d.ts.map +1 -0
  297. package/dist/src/cli/commands/suite/list.js +58 -0
  298. package/dist/src/cli/commands/suite/list.js.map +1 -0
  299. package/dist/src/cli/commands/suite/run.d.ts +6 -0
  300. package/dist/src/cli/commands/suite/run.d.ts.map +1 -0
  301. package/dist/src/cli/commands/suite/run.js +34 -0
  302. package/dist/src/cli/commands/suite/run.js.map +1 -0
  303. package/dist/src/cli/commands/suite/update.d.ts +6 -0
  304. package/dist/src/cli/commands/suite/update.d.ts.map +1 -0
  305. package/dist/src/cli/commands/suite/update.js +31 -0
  306. package/dist/src/cli/commands/suite/update.js.map +1 -0
  307. package/dist/src/cli/commands/test/diff.d.ts.map +1 -1
  308. package/dist/src/cli/commands/test/diff.js +2 -4
  309. package/dist/src/cli/commands/test/diff.js.map +1 -1
  310. package/dist/src/cli/commands/test/export.d.ts.map +1 -1
  311. package/dist/src/cli/commands/test/export.js +2 -4
  312. package/dist/src/cli/commands/test/export.js.map +1 -1
  313. package/dist/src/cli/commands/test/index.js +1 -1
  314. package/dist/src/cli/commands/test/index.js.map +1 -1
  315. package/dist/src/cli/commands/test/info.d.ts.map +1 -1
  316. package/dist/src/cli/commands/test/info.js +150 -46
  317. package/dist/src/cli/commands/test/info.js.map +1 -1
  318. package/dist/src/cli/commands/test/list.d.ts.map +1 -1
  319. package/dist/src/cli/commands/test/list.js +78 -23
  320. package/dist/src/cli/commands/test/list.js.map +1 -1
  321. package/dist/src/cli/commands/test/run.d.ts.map +1 -1
  322. package/dist/src/cli/commands/test/run.js +2 -4
  323. package/dist/src/cli/commands/test/run.js.map +1 -1
  324. package/dist/src/cli/commands/test/runs/cancel.d.ts +6 -0
  325. package/dist/src/cli/commands/test/runs/cancel.d.ts.map +1 -0
  326. package/dist/src/cli/commands/test/runs/cancel.js +31 -0
  327. package/dist/src/cli/commands/test/runs/cancel.js.map +1 -0
  328. package/dist/src/cli/commands/test/runs/index.d.ts +6 -0
  329. package/dist/src/cli/commands/test/runs/index.d.ts.map +1 -0
  330. package/dist/src/cli/commands/test/runs/index.js +16 -0
  331. package/dist/src/cli/commands/test/runs/index.js.map +1 -0
  332. package/dist/src/cli/commands/test/runs/info.d.ts +6 -0
  333. package/dist/src/cli/commands/test/runs/info.d.ts.map +1 -0
  334. package/dist/src/cli/commands/test/runs/info.js +72 -0
  335. package/dist/src/cli/commands/test/runs/info.js.map +1 -0
  336. package/dist/src/cli/commands/test/runs/list.d.ts +6 -0
  337. package/dist/src/cli/commands/test/runs/list.d.ts.map +1 -0
  338. package/dist/src/cli/commands/test/runs/list.js +128 -0
  339. package/dist/src/cli/commands/test/runs/list.js.map +1 -0
  340. package/dist/src/cli/commands/test/runs/logs.d.ts +6 -0
  341. package/dist/src/cli/commands/test/runs/logs.d.ts.map +1 -0
  342. package/dist/src/cli/commands/test/runs/logs.js +88 -0
  343. package/dist/src/cli/commands/test/runs/logs.js.map +1 -0
  344. package/dist/src/cli/commands/test/runs/steps.d.ts +6 -0
  345. package/dist/src/cli/commands/test/runs/steps.d.ts.map +1 -0
  346. package/dist/src/cli/commands/test/runs/steps.js +110 -0
  347. package/dist/src/cli/commands/test/runs/steps.js.map +1 -0
  348. package/dist/src/cli/commands/test/runs.d.ts.map +1 -1
  349. package/dist/src/cli/commands/test/runs.js +2 -4
  350. package/dist/src/cli/commands/test/runs.js.map +1 -1
  351. package/dist/src/cli/commands/test/schema.d.ts.map +1 -1
  352. package/dist/src/cli/commands/test/schema.js +2 -6
  353. package/dist/src/cli/commands/test/schema.js.map +1 -1
  354. package/dist/src/cli/commands/test/sync.d.ts.map +1 -1
  355. package/dist/src/cli/commands/test/sync.js +3 -6
  356. package/dist/src/cli/commands/test/sync.js.map +1 -1
  357. package/dist/src/cli/commands/test/validate.d.ts.map +1 -1
  358. package/dist/src/cli/commands/test/validate.js +2 -4
  359. package/dist/src/cli/commands/test/validate.js.map +1 -1
  360. package/dist/src/cli/commands/usage.d.ts +6 -0
  361. package/dist/src/cli/commands/usage.d.ts.map +1 -0
  362. package/dist/src/cli/commands/usage.js +106 -0
  363. package/dist/src/cli/commands/usage.js.map +1 -0
  364. package/dist/src/cli/generated/docs-content.d.ts +1 -1
  365. package/dist/src/cli/generated/docs-content.d.ts.map +1 -1
  366. package/dist/src/cli/generated/docs-content.js +12 -5
  367. package/dist/src/cli/generated/docs-content.js.map +1 -1
  368. package/dist/src/cli/index.js +43 -1
  369. package/dist/src/cli/index.js.map +1 -1
  370. package/dist/src/cli/lib/api-helpers.d.ts +59 -0
  371. package/dist/src/cli/lib/api-helpers.d.ts.map +1 -0
  372. package/dist/src/cli/lib/api-helpers.js +149 -0
  373. package/dist/src/cli/lib/api-helpers.js.map +1 -0
  374. package/dist/src/cli/lib/config.d.ts +20 -7
  375. package/dist/src/cli/lib/config.d.ts.map +1 -1
  376. package/dist/src/cli/lib/config.js +88 -26
  377. package/dist/src/cli/lib/config.js.map +1 -1
  378. package/dist/src/cli/lib/table.d.ts +47 -0
  379. package/dist/src/cli/lib/table.d.ts.map +1 -0
  380. package/dist/src/cli/lib/table.js +161 -0
  381. package/dist/src/cli/lib/table.js.map +1 -0
  382. package/dist/src/types/test-definition.d.ts +29 -2
  383. package/dist/src/types/test-definition.d.ts.map +1 -1
  384. package/dist/src/types/test-definition.js +2 -2
  385. package/lib/api/browser-types.ts +1 -0
  386. package/lib/api/browser.test.ts +28 -0
  387. package/lib/api/browser.ts +15 -1
  388. package/lib/api/index.ts +28 -5
  389. package/lib/env/index.ts +65 -5
  390. package/package.json +2 -1
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Shared API request helpers for CLI commands.
3
+ *
4
+ * Config-aware wrapper around executeApiRequest (from api/lib/http.ts)
5
+ * so individual CLI commands don't repeat boilerplate.
6
+ */
7
+ import * as fs from 'node:fs/promises';
8
+ import * as readline from 'node:readline/promises';
9
+ import { executeApiRequest, formatApiResponseError } from '../commands/api/lib/http.js';
10
+ // ---------------------------------------------------------------------------
11
+ // requireApiKey
12
+ // ---------------------------------------------------------------------------
13
+ /**
14
+ * Validates that the config contains an API key.
15
+ * Exits the process with a helpful message when missing.
16
+ */
17
+ export function requireApiKey(config) {
18
+ if (!config.api_key) {
19
+ console.log('\x1b[31m✗\x1b[0m API key not configured');
20
+ console.log(' Run `qa-use setup` to configure');
21
+ process.exit(1);
22
+ }
23
+ }
24
+ /**
25
+ * Makes an authenticated API request using the CLI config.
26
+ * Throws on HTTP errors (status >= 400) with a human-readable message.
27
+ */
28
+ export async function apiCall(config, method, path, options = {}) {
29
+ requireApiKey(config);
30
+ const apiUrl = config.api_url || 'https://api.desplega.ai';
31
+ const response = await executeApiRequest({
32
+ apiUrl,
33
+ apiKey: config.api_key,
34
+ method,
35
+ path,
36
+ headers: { ...config.headers, ...options.headers },
37
+ query: options.query,
38
+ body: options.body,
39
+ });
40
+ if (response.status >= 400) {
41
+ throw new Error(formatApiResponseError(response.status, response.statusText, response.data));
42
+ }
43
+ return response.data;
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // paginationQuery
47
+ // ---------------------------------------------------------------------------
48
+ /**
49
+ * Builds pagination query params from common CLI options.
50
+ * Only includes keys whose values are defined.
51
+ */
52
+ export function paginationQuery(options) {
53
+ const query = {};
54
+ if (options.limit !== undefined)
55
+ query.limit = options.limit;
56
+ if (options.offset !== undefined)
57
+ query.offset = options.offset;
58
+ return query;
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // collectFields
62
+ // ---------------------------------------------------------------------------
63
+ /**
64
+ * Collector for Commander's repeatable `-F`/`--field` option.
65
+ *
66
+ * Usage with Commander:
67
+ * ```
68
+ * .option('-F, --field <key=value>', 'Set field', collectFields, [])
69
+ * ```
70
+ */
71
+ export function collectFields(value, previous) {
72
+ previous.push(value);
73
+ return previous;
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // parseResourceInput
77
+ // ---------------------------------------------------------------------------
78
+ /**
79
+ * Reads body from `--input` file and/or `-F` fields and merges them.
80
+ * Values that parse as valid JSON are treated as JSON
81
+ * (e.g. `-F test_ids='["id1","id2"]'`).
82
+ *
83
+ * Stdin (piped) is intentionally **not** read here — that would complicate
84
+ * interactive commands. Add it later if needed.
85
+ */
86
+ export async function parseResourceInput(options) {
87
+ let base = {};
88
+ // 1. --input file
89
+ if (options.input) {
90
+ const raw = await fs.readFile(options.input, 'utf-8');
91
+ try {
92
+ const parsed = JSON.parse(raw);
93
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
94
+ base = parsed;
95
+ }
96
+ else {
97
+ throw new Error(`Input file must contain a JSON object, got ${typeof parsed}`);
98
+ }
99
+ }
100
+ catch (err) {
101
+ if (err instanceof SyntaxError) {
102
+ throw new Error(`Failed to parse JSON input file: ${options.input}`);
103
+ }
104
+ throw err;
105
+ }
106
+ }
107
+ // 2. -F fields (override --input values)
108
+ if (options.field) {
109
+ for (const entry of options.field) {
110
+ const idx = entry.indexOf('=');
111
+ if (idx <= 0) {
112
+ throw new Error(`Invalid field \`${entry}\`. Expected format key=value`);
113
+ }
114
+ const key = entry.slice(0, idx).trim();
115
+ const rawValue = entry.slice(idx + 1).trim();
116
+ // Try to parse as JSON (arrays, objects, numbers, booleans)
117
+ let value = rawValue;
118
+ try {
119
+ value = JSON.parse(rawValue);
120
+ }
121
+ catch {
122
+ // Not valid JSON — keep as string
123
+ }
124
+ base[key] = value;
125
+ }
126
+ }
127
+ return base;
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // confirmAction
131
+ // ---------------------------------------------------------------------------
132
+ /**
133
+ * Confirmation prompt for destructive operations.
134
+ * Returns `true` when the user types y/yes (case-insensitive).
135
+ */
136
+ export async function confirmAction(message) {
137
+ const rl = readline.createInterface({
138
+ input: process.stdin,
139
+ output: process.stderr,
140
+ });
141
+ try {
142
+ const answer = await rl.question(`${message} [y/N] `);
143
+ return /^y(es)?$/i.test(answer.trim());
144
+ }
145
+ finally {
146
+ rl.close();
147
+ }
148
+ }
149
+ //# sourceMappingURL=api-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-helpers.js","sourceRoot":"","sources":["../../../../src/cli/lib/api-helpers.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,15 @@
1
1
  /**
2
- * Configuration file management for .qa-use-tests.json
2
+ * Configuration file management for .qa-use.json
3
3
  */
4
+ import { BrowserApiClient } from '../../../lib/api/browser.js';
5
+ import { ApiClient } from '../../../lib/api/index.js';
4
6
  export interface CliConfig {
5
7
  env?: Record<string, string>;
6
8
  api_key?: string;
7
9
  api_url?: string;
8
10
  default_app_config_id?: string;
9
11
  test_directory?: string;
12
+ headers?: Record<string, string>;
10
13
  defaults?: {
11
14
  headless?: boolean;
12
15
  persist?: boolean;
@@ -15,24 +18,34 @@ export interface CliConfig {
15
18
  };
16
19
  }
17
20
  /**
18
- * Search for config file in current directory and home directory
21
+ * Search for config file in current directory and home directory.
22
+ * Checks .qa-use.json first, falls back to .qa-use-tests.json (deprecated).
19
23
  */
20
24
  export declare function findConfigFile(): Promise<string | null>;
21
25
  /**
22
- * Load CLI configuration from .qa-use-tests.json
26
+ * Load CLI configuration from .qa-use.json
23
27
  *
24
28
  * Priority order (highest to lowest):
25
- * 1. Project config file (.qa-use-tests.json in cwd or home)
26
- * 2. Environment variables (QA_USE_API_KEY, QA_USE_API_URL, etc.)
27
- * 3. Built-in defaults
29
+ * 1. Environment variables (QA_USE_API_KEY, QA_USE_API_URL, etc.)
30
+ * 2. Project config file (.qa-use.json in cwd)
31
+ * 3. User config file (~/.qa-use.json in home)
32
+ * 4. Built-in defaults
28
33
  */
29
34
  export declare function loadConfig(): Promise<CliConfig>;
30
35
  /**
31
- * Save configuration to .qa-use-tests.json in current directory
36
+ * Save configuration to .qa-use.json in current directory
32
37
  */
33
38
  export declare function saveConfig(config: CliConfig): Promise<void>;
34
39
  /**
35
40
  * Check if config file exists
36
41
  */
37
42
  export declare function configExists(): Promise<boolean>;
43
+ /**
44
+ * Create a BrowserApiClient pre-configured with API key and custom headers from config.
45
+ */
46
+ export declare function createBrowserClient(config: CliConfig): BrowserApiClient;
47
+ /**
48
+ * Create an ApiClient pre-configured with API key and custom headers from config.
49
+ */
50
+ export declare function createApiClient(config: CliConfig): ApiClient;
38
51
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AAID;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsB7D;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAgDrD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAErD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AAqCD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU7D;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAsErD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAErD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,gBAAgB,CAKvE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAK5D"}
@@ -1,42 +1,63 @@
1
1
  /**
2
- * Configuration file management for .qa-use-tests.json
2
+ * Configuration file management for .qa-use.json
3
3
  */
4
4
  import * as fs from 'node:fs/promises';
5
5
  import { homedir } from 'node:os';
6
6
  import * as path from 'node:path';
7
- const CONFIG_FILENAME = '.qa-use-tests.json';
7
+ import { BrowserApiClient } from '../../../lib/api/browser.js';
8
+ import { ApiClient } from '../../../lib/api/index.js';
9
+ const CONFIG_FILENAME = '.qa-use.json';
10
+ const LEGACY_CONFIG_FILENAME = '.qa-use-tests.json';
11
+ const legacyWarningShown = new Set();
8
12
  /**
9
- * Search for config file in current directory and home directory
13
+ * Try to access a config file, checking the primary name first then the legacy name.
14
+ * Returns the resolved path or null. Logs a deprecation warning (once per dir) for legacy files.
10
15
  */
11
- export async function findConfigFile() {
12
- // Check current directory
13
- const cwd = process.cwd();
14
- const localConfig = path.join(cwd, CONFIG_FILENAME);
16
+ async function resolveConfigInDir(dir) {
17
+ const primary = path.join(dir, CONFIG_FILENAME);
15
18
  try {
16
- await fs.access(localConfig);
17
- return localConfig;
19
+ await fs.access(primary);
20
+ return primary;
18
21
  }
19
22
  catch {
20
- // Not in current directory
23
+ // Primary not found, try legacy
21
24
  }
22
- // Check home directory
23
- const homeConfig = path.join(homedir(), CONFIG_FILENAME);
25
+ const legacy = path.join(dir, LEGACY_CONFIG_FILENAME);
24
26
  try {
25
- await fs.access(homeConfig);
26
- return homeConfig;
27
+ await fs.access(legacy);
28
+ if (!legacyWarningShown.has(dir)) {
29
+ legacyWarningShown.add(dir);
30
+ console.error(`Warning: ${legacy} is deprecated. Rename to ${CONFIG_FILENAME} — legacy support will be removed in a future version.`);
31
+ }
32
+ return legacy;
27
33
  }
28
34
  catch {
29
- // Not in home directory
35
+ // Neither found
30
36
  }
31
37
  return null;
32
38
  }
33
39
  /**
34
- * Load CLI configuration from .qa-use-tests.json
40
+ * Search for config file in current directory and home directory.
41
+ * Checks .qa-use.json first, falls back to .qa-use-tests.json (deprecated).
42
+ */
43
+ export async function findConfigFile() {
44
+ const cwd = process.cwd();
45
+ const localConfig = await resolveConfigInDir(cwd);
46
+ if (localConfig)
47
+ return localConfig;
48
+ const homeConfig = await resolveConfigInDir(homedir());
49
+ if (homeConfig)
50
+ return homeConfig;
51
+ return null;
52
+ }
53
+ /**
54
+ * Load CLI configuration from .qa-use.json
35
55
  *
36
56
  * Priority order (highest to lowest):
37
- * 1. Project config file (.qa-use-tests.json in cwd or home)
38
- * 2. Environment variables (QA_USE_API_KEY, QA_USE_API_URL, etc.)
39
- * 3. Built-in defaults
57
+ * 1. Environment variables (QA_USE_API_KEY, QA_USE_API_URL, etc.)
58
+ * 2. Project config file (.qa-use.json in cwd)
59
+ * 3. User config file (~/.qa-use.json in home)
60
+ * 4. Built-in defaults
40
61
  */
41
62
  export async function loadConfig() {
42
63
  const configPath = await findConfigFile();
@@ -60,29 +81,48 @@ export async function loadConfig() {
60
81
  console.error(error);
61
82
  }
62
83
  }
63
- // Apply env block from config (after file merge, before env fallback)
84
+ // Apply env block from config (only if shell env doesn't already set them)
64
85
  if (config.env) {
65
86
  for (const [key, value] of Object.entries(config.env)) {
66
87
  if (!process.env[key]) {
67
- // Don't override existing shell env vars
68
88
  process.env[key] = value;
69
89
  }
70
90
  }
71
91
  }
72
- // Environment variables are fallbacks only used when config file doesn't set the value
73
- if (!config.api_key && process.env.QA_USE_API_KEY) {
92
+ // Environment variables take precedence over config file values
93
+ if (process.env.QA_USE_API_KEY) {
74
94
  config.api_key = process.env.QA_USE_API_KEY;
75
95
  }
76
- if (!config.api_url && process.env.QA_USE_API_URL) {
96
+ if (process.env.QA_USE_API_URL) {
77
97
  config.api_url = process.env.QA_USE_API_URL;
78
98
  }
79
- if (!config.default_app_config_id && process.env.QA_USE_DEFAULT_APP_CONFIG_ID) {
99
+ if (process.env.QA_USE_DEFAULT_APP_CONFIG_ID) {
80
100
  config.default_app_config_id = process.env.QA_USE_DEFAULT_APP_CONFIG_ID;
81
101
  }
102
+ // Resolve custom headers: config file headers + QA_USE_HEADERS env var (env wins)
103
+ const resolvedHeaders = {};
104
+ if (config.headers) {
105
+ Object.assign(resolvedHeaders, config.headers);
106
+ }
107
+ const envHeaders = process.env.QA_USE_HEADERS;
108
+ if (envHeaders) {
109
+ try {
110
+ const parsed = JSON.parse(envHeaders);
111
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
112
+ Object.assign(resolvedHeaders, parsed);
113
+ }
114
+ }
115
+ catch {
116
+ console.error('Warning: QA_USE_HEADERS is not valid JSON, ignoring');
117
+ }
118
+ }
119
+ if (Object.keys(resolvedHeaders).length > 0) {
120
+ config.headers = resolvedHeaders;
121
+ }
82
122
  return config;
83
123
  }
84
124
  /**
85
- * Save configuration to .qa-use-tests.json in current directory
125
+ * Save configuration to .qa-use.json in current directory
86
126
  */
87
127
  export async function saveConfig(config) {
88
128
  const configPath = path.join(process.cwd(), CONFIG_FILENAME);
@@ -95,4 +135,26 @@ export async function saveConfig(config) {
95
135
  export async function configExists() {
96
136
  return (await findConfigFile()) !== null;
97
137
  }
138
+ /**
139
+ * Create a BrowserApiClient pre-configured with API key and custom headers from config.
140
+ */
141
+ export function createBrowserClient(config) {
142
+ const client = new BrowserApiClient(config.api_url);
143
+ if (config.api_key)
144
+ client.setApiKey(config.api_key);
145
+ if (config.headers)
146
+ client.setCustomHeaders(config.headers);
147
+ return client;
148
+ }
149
+ /**
150
+ * Create an ApiClient pre-configured with API key and custom headers from config.
151
+ */
152
+ export function createApiClient(config) {
153
+ const client = new ApiClient(config.api_url);
154
+ if (config.api_key)
155
+ client.setApiKey(config.api_key);
156
+ if (config.headers)
157
+ client.setCustomHeaders(config.headers);
158
+ return client;
159
+ }
98
160
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/cli/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/cli/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Reusable table formatter for CLI output.
3
+ *
4
+ * Supports column definitions, auto-width, JSON mode, empty state,
5
+ * and pagination hints.
6
+ */
7
+ export interface Column {
8
+ /** Property key to extract from each row */
9
+ key: string;
10
+ /** Column header label */
11
+ header: string;
12
+ /** Fixed width; when omitted, auto-calculated from data */
13
+ width?: number;
14
+ /** Optional formatter for the cell value */
15
+ format?: (value: unknown, row: Record<string, unknown>) => string;
16
+ }
17
+ export interface PrintTableOptions {
18
+ /** When true, output raw JSON instead of a formatted table */
19
+ json?: boolean;
20
+ /** Title printed above the table */
21
+ title?: string;
22
+ /** Message shown when there are no rows */
23
+ emptyMessage?: string;
24
+ /** Page size — used to decide whether to show pagination hint */
25
+ limit?: number;
26
+ /** Current offset — used in pagination hint */
27
+ offset?: number;
28
+ }
29
+ export declare function printTable(columns: Column[], rows: Record<string, unknown>[], options?: PrintTableOptions): void;
30
+ /**
31
+ * Color-coded status string (padded to 9 chars).
32
+ */
33
+ export declare function formatStatus(status: string): string;
34
+ /**
35
+ * Human-readable timestamp from an ISO string.
36
+ * Returns `YYYY-MM-DD HH:mm:ss` (19 chars).
37
+ */
38
+ export declare function formatTimestamp(iso: string): string;
39
+ /**
40
+ * Human-readable duration from seconds.
41
+ */
42
+ export declare function formatDuration(seconds: number | undefined): string;
43
+ /**
44
+ * Truncate a string to `maxLen` characters, appending an ellipsis if needed.
45
+ */
46
+ export declare function truncate(str: string, maxLen: number): string;
47
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/table.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,MAAM,WAAW,MAAM;IACrB,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;CACnE;AAMD,MAAM,WAAW,iBAAiB;IAChC,8DAA8D;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6BD,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,GAAE,iBAAsB,GAC9B,IAAI,CAoDN;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAsBnD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQlE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK5D"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Reusable table formatter for CLI output.
3
+ *
4
+ * Supports column definitions, auto-width, JSON mode, empty state,
5
+ * and pagination hints.
6
+ */
7
+ // ANSI color codes
8
+ const colors = {
9
+ reset: '\x1b[0m',
10
+ green: '\x1b[32m',
11
+ red: '\x1b[31m',
12
+ yellow: '\x1b[33m',
13
+ gray: '\x1b[90m',
14
+ cyan: '\x1b[36m',
15
+ blue: '\x1b[34m',
16
+ };
17
+ /**
18
+ * Strip ANSI escape codes so we can measure visible width.
19
+ */
20
+ function stripAnsi(str) {
21
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: stripping ANSI escapes
22
+ return str.replace(/\x1b\[[0-9;]*m/g, '').length;
23
+ }
24
+ /**
25
+ * Pad a string that may contain ANSI codes to a target *visible* width.
26
+ */
27
+ function padCell(str, targetWidth) {
28
+ const visible = stripAnsi(str);
29
+ const needed = targetWidth - visible;
30
+ return needed > 0 ? str + ' '.repeat(needed) : str;
31
+ }
32
+ /**
33
+ * Render a value as a string for table display.
34
+ */
35
+ function cellToString(value) {
36
+ if (value === null || value === undefined)
37
+ return '-';
38
+ if (typeof value === 'string')
39
+ return value;
40
+ if (typeof value === 'number' || typeof value === 'boolean')
41
+ return String(value);
42
+ return JSON.stringify(value);
43
+ }
44
+ export function printTable(columns, rows, options = {}) {
45
+ // JSON mode — dump raw data and return
46
+ if (options.json) {
47
+ console.log(JSON.stringify(rows, null, 2));
48
+ return;
49
+ }
50
+ // Empty state
51
+ if (rows.length === 0) {
52
+ console.log(options.emptyMessage ?? `${colors.yellow}⚠${colors.reset} No results found`);
53
+ return;
54
+ }
55
+ // Title
56
+ if (options.title) {
57
+ console.log(`${options.title}\n`);
58
+ }
59
+ // Resolve column widths: use explicit width, or max of header + cell values
60
+ const resolvedWidths = columns.map((col) => {
61
+ if (col.width !== undefined)
62
+ return col.width;
63
+ let max = col.header.length;
64
+ for (const row of rows) {
65
+ const formatted = col.format ? col.format(row[col.key], row) : cellToString(row[col.key]);
66
+ const len = stripAnsi(formatted);
67
+ if (len > max)
68
+ max = len;
69
+ }
70
+ return max;
71
+ });
72
+ // Header line
73
+ const headerLine = columns.map((col, i) => padCell(col.header, resolvedWidths[i])).join(' ');
74
+ console.log(headerLine);
75
+ // Separator
76
+ const totalWidth = resolvedWidths.reduce((s, w) => s + w, 0) + (columns.length - 1) * 2;
77
+ console.log('─'.repeat(totalWidth));
78
+ // Rows
79
+ for (const row of rows) {
80
+ const cells = columns.map((col, i) => {
81
+ const formatted = col.format ? col.format(row[col.key], row) : cellToString(row[col.key]);
82
+ return padCell(formatted, resolvedWidths[i]);
83
+ });
84
+ console.log(cells.join(' '));
85
+ }
86
+ // Pagination hint
87
+ if (options.limit !== undefined && rows.length >= options.limit) {
88
+ const nextOffset = (options.offset ?? 0) + options.limit;
89
+ console.log(`\n${colors.gray}Use --offset ${nextOffset} to see more${colors.reset}`);
90
+ }
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Shared formatters
94
+ // ---------------------------------------------------------------------------
95
+ /**
96
+ * Color-coded status string (padded to 9 chars).
97
+ */
98
+ export function formatStatus(status) {
99
+ const padded = status.padEnd(9);
100
+ switch (status) {
101
+ case 'passed':
102
+ case 'active':
103
+ case 'completed':
104
+ return `${colors.green}${padded}${colors.reset}`;
105
+ case 'failed':
106
+ case 'error':
107
+ return `${colors.red}${padded}${colors.reset}`;
108
+ case 'running':
109
+ case 'pending':
110
+ case 'queued':
111
+ return `${colors.yellow}${padded}${colors.reset}`;
112
+ case 'cancelled':
113
+ case 'timeout':
114
+ case 'skipped':
115
+ case 'inactive':
116
+ return `${colors.gray}${padded}${colors.reset}`;
117
+ default:
118
+ return padded;
119
+ }
120
+ }
121
+ /**
122
+ * Human-readable timestamp from an ISO string.
123
+ * Returns `YYYY-MM-DD HH:mm:ss` (19 chars).
124
+ */
125
+ export function formatTimestamp(iso) {
126
+ if (!iso)
127
+ return '-';
128
+ try {
129
+ const date = new Date(iso);
130
+ return date.toISOString().replace('T', ' ').slice(0, 19);
131
+ }
132
+ catch {
133
+ return iso;
134
+ }
135
+ }
136
+ /**
137
+ * Human-readable duration from seconds.
138
+ */
139
+ export function formatDuration(seconds) {
140
+ if (seconds === undefined || seconds === null)
141
+ return '-';
142
+ if (seconds < 60) {
143
+ return `${seconds.toFixed(1)}s`;
144
+ }
145
+ const mins = Math.floor(seconds / 60);
146
+ const secs = Math.round(seconds % 60);
147
+ return `${mins}m ${secs}s`;
148
+ }
149
+ /**
150
+ * Truncate a string to `maxLen` characters, appending an ellipsis if needed.
151
+ */
152
+ export function truncate(str, maxLen) {
153
+ if (maxLen < 1)
154
+ return '';
155
+ if (str.length <= maxLen)
156
+ return str;
157
+ if (maxLen <= 3)
158
+ return str.slice(0, maxLen);
159
+ return `${str.slice(0, maxLen - 1)}…`;
160
+ }
161
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../../src/cli/lib/table.ts"],"names":[],"mappings":"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"}