@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.
- package/README.md +16 -6
- package/dist/lib/api/browser-types.d.ts +1 -0
- package/dist/lib/api/browser-types.d.ts.map +1 -1
- package/dist/lib/api/browser.d.ts +1 -0
- package/dist/lib/api/browser.d.ts.map +1 -1
- package/dist/lib/api/browser.js +14 -1
- package/dist/lib/api/browser.js.map +1 -1
- package/dist/lib/api/index.d.ts +4 -3
- package/dist/lib/api/index.d.ts.map +1 -1
- package/dist/lib/api/index.js +18 -2
- package/dist/lib/api/index.js.map +1 -1
- package/dist/lib/env/index.d.ts +12 -2
- package/dist/lib/env/index.d.ts.map +1 -1
- package/dist/lib/env/index.js +56 -5
- package/dist/lib/env/index.js.map +1 -1
- package/dist/package.json +2 -1
- package/dist/src/cli/commands/api/examples.d.ts +3 -0
- package/dist/src/cli/commands/api/examples.d.ts.map +1 -0
- package/dist/src/cli/commands/api/examples.js +48 -0
- package/dist/src/cli/commands/api/examples.js.map +1 -0
- package/dist/src/cli/commands/api/index.d.ts.map +1 -1
- package/dist/src/cli/commands/api/index.js +22 -0
- package/dist/src/cli/commands/api/index.js.map +1 -1
- package/dist/src/cli/commands/api/info.d.ts +3 -0
- package/dist/src/cli/commands/api/info.d.ts.map +1 -0
- package/dist/src/cli/commands/api/info.js +59 -0
- package/dist/src/cli/commands/api/info.js.map +1 -0
- package/dist/src/cli/commands/api/lib/openapi-spec.d.ts +22 -0
- package/dist/src/cli/commands/api/lib/openapi-spec.d.ts.map +1 -1
- package/dist/src/cli/commands/api/lib/openapi-spec.js +33 -1
- package/dist/src/cli/commands/api/lib/openapi-spec.js.map +1 -1
- package/dist/src/cli/commands/api/lib/output.d.ts +4 -0
- package/dist/src/cli/commands/api/lib/output.d.ts.map +1 -1
- package/dist/src/cli/commands/api/lib/output.js +90 -0
- package/dist/src/cli/commands/api/lib/output.js.map +1 -1
- package/dist/src/cli/commands/api/lib/route-matching.d.ts +4 -0
- package/dist/src/cli/commands/api/lib/route-matching.d.ts.map +1 -0
- package/dist/src/cli/commands/api/lib/route-matching.js +9 -0
- package/dist/src/cli/commands/api/lib/route-matching.js.map +1 -0
- package/dist/src/cli/commands/api/lib/schema-resolver.d.ts +30 -0
- package/dist/src/cli/commands/api/lib/schema-resolver.d.ts.map +1 -0
- package/dist/src/cli/commands/api/lib/schema-resolver.js +91 -0
- package/dist/src/cli/commands/api/lib/schema-resolver.js.map +1 -0
- package/dist/src/cli/commands/api/ls.d.ts.map +1 -1
- package/dist/src/cli/commands/api/ls.js +6 -1
- package/dist/src/cli/commands/api/ls.js.map +1 -1
- package/dist/src/cli/commands/api/openapi.d.ts +3 -0
- package/dist/src/cli/commands/api/openapi.d.ts.map +1 -0
- package/dist/src/cli/commands/api/openapi.js +55 -0
- package/dist/src/cli/commands/api/openapi.js.map +1 -0
- package/dist/src/cli/commands/api/request.d.ts.map +1 -1
- package/dist/src/cli/commands/api/request.js +9 -11
- package/dist/src/cli/commands/api/request.js.map +1 -1
- package/dist/src/cli/commands/app-config/create.d.ts +6 -0
- package/dist/src/cli/commands/app-config/create.d.ts.map +1 -0
- package/dist/src/cli/commands/app-config/create.js +32 -0
- package/dist/src/cli/commands/app-config/create.js.map +1 -0
- package/dist/src/cli/commands/app-config/delete.d.ts +6 -0
- package/dist/src/cli/commands/app-config/delete.d.ts.map +1 -0
- package/dist/src/cli/commands/app-config/delete.js +31 -0
- package/dist/src/cli/commands/app-config/delete.js.map +1 -0
- package/dist/src/cli/commands/app-config/index.d.ts +6 -0
- package/dist/src/cli/commands/app-config/index.d.ts.map +1 -0
- package/dist/src/cli/commands/app-config/index.js +16 -0
- package/dist/src/cli/commands/app-config/index.js.map +1 -0
- package/dist/src/cli/commands/app-config/info.d.ts +6 -0
- package/dist/src/cli/commands/app-config/info.d.ts.map +1 -0
- package/dist/src/cli/commands/app-config/info.js +67 -0
- package/dist/src/cli/commands/app-config/info.js.map +1 -0
- package/dist/src/cli/commands/app-config/list.d.ts +6 -0
- package/dist/src/cli/commands/app-config/list.d.ts.map +1 -0
- package/dist/src/cli/commands/app-config/list.js +58 -0
- package/dist/src/cli/commands/app-config/list.js.map +1 -0
- package/dist/src/cli/commands/app-config/update.d.ts +6 -0
- package/dist/src/cli/commands/app-config/update.d.ts.map +1 -0
- package/dist/src/cli/commands/app-config/update.js +31 -0
- package/dist/src/cli/commands/app-config/update.js.map +1 -0
- package/dist/src/cli/commands/app-context/create.d.ts +6 -0
- package/dist/src/cli/commands/app-context/create.d.ts.map +1 -0
- package/dist/src/cli/commands/app-context/create.js +32 -0
- package/dist/src/cli/commands/app-context/create.js.map +1 -0
- package/dist/src/cli/commands/app-context/delete.d.ts +6 -0
- package/dist/src/cli/commands/app-context/delete.d.ts.map +1 -0
- package/dist/src/cli/commands/app-context/delete.js +31 -0
- package/dist/src/cli/commands/app-context/delete.js.map +1 -0
- package/dist/src/cli/commands/app-context/index.d.ts +6 -0
- package/dist/src/cli/commands/app-context/index.d.ts.map +1 -0
- package/dist/src/cli/commands/app-context/index.js +16 -0
- package/dist/src/cli/commands/app-context/index.js.map +1 -0
- package/dist/src/cli/commands/app-context/info.d.ts +6 -0
- package/dist/src/cli/commands/app-context/info.d.ts.map +1 -0
- package/dist/src/cli/commands/app-context/info.js +51 -0
- package/dist/src/cli/commands/app-context/info.js.map +1 -0
- package/dist/src/cli/commands/app-context/list.d.ts +6 -0
- package/dist/src/cli/commands/app-context/list.d.ts.map +1 -0
- package/dist/src/cli/commands/app-context/list.js +58 -0
- package/dist/src/cli/commands/app-context/list.js.map +1 -0
- package/dist/src/cli/commands/app-context/update.d.ts +6 -0
- package/dist/src/cli/commands/app-context/update.d.ts.map +1 -0
- package/dist/src/cli/commands/app-context/update.js +31 -0
- package/dist/src/cli/commands/app-context/update.js.map +1 -0
- package/dist/src/cli/commands/browser/back.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/back.js +2 -4
- package/dist/src/cli/commands/browser/back.js.map +1 -1
- package/dist/src/cli/commands/browser/blur.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/blur.js +2 -4
- package/dist/src/cli/commands/browser/blur.js.map +1 -1
- package/dist/src/cli/commands/browser/check.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/check.js +2 -4
- package/dist/src/cli/commands/browser/check.js.map +1 -1
- package/dist/src/cli/commands/browser/click.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/click.js +2 -4
- package/dist/src/cli/commands/browser/click.js.map +1 -1
- package/dist/src/cli/commands/browser/close.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/close.js +2 -4
- package/dist/src/cli/commands/browser/close.js.map +1 -1
- package/dist/src/cli/commands/browser/create.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/create.js +7 -4
- package/dist/src/cli/commands/browser/create.js.map +1 -1
- package/dist/src/cli/commands/browser/downloads.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/downloads.js +2 -4
- package/dist/src/cli/commands/browser/downloads.js.map +1 -1
- package/dist/src/cli/commands/browser/drag.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/drag.js +2 -4
- package/dist/src/cli/commands/browser/drag.js.map +1 -1
- package/dist/src/cli/commands/browser/evaluate.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/evaluate.js +2 -4
- package/dist/src/cli/commands/browser/evaluate.js.map +1 -1
- package/dist/src/cli/commands/browser/fill.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/fill.js +2 -4
- package/dist/src/cli/commands/browser/fill.js.map +1 -1
- package/dist/src/cli/commands/browser/focus.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/focus.js +2 -4
- package/dist/src/cli/commands/browser/focus.js.map +1 -1
- package/dist/src/cli/commands/browser/forward.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/forward.js +2 -4
- package/dist/src/cli/commands/browser/forward.js.map +1 -1
- package/dist/src/cli/commands/browser/generate-test.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/generate-test.js +2 -4
- package/dist/src/cli/commands/browser/generate-test.js.map +1 -1
- package/dist/src/cli/commands/browser/get-blocks.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/get-blocks.js +2 -4
- package/dist/src/cli/commands/browser/get-blocks.js.map +1 -1
- package/dist/src/cli/commands/browser/goto.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/goto.js +2 -4
- package/dist/src/cli/commands/browser/goto.js.map +1 -1
- package/dist/src/cli/commands/browser/hover.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/hover.js +2 -4
- package/dist/src/cli/commands/browser/hover.js.map +1 -1
- package/dist/src/cli/commands/browser/list.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/list.js +2 -4
- package/dist/src/cli/commands/browser/list.js.map +1 -1
- package/dist/src/cli/commands/browser/logs.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/logs.js +3 -6
- package/dist/src/cli/commands/browser/logs.js.map +1 -1
- package/dist/src/cli/commands/browser/mfa-totp.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/mfa-totp.js +2 -4
- package/dist/src/cli/commands/browser/mfa-totp.js.map +1 -1
- package/dist/src/cli/commands/browser/press.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/press.js +2 -4
- package/dist/src/cli/commands/browser/press.js.map +1 -1
- package/dist/src/cli/commands/browser/reload.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/reload.js +2 -4
- package/dist/src/cli/commands/browser/reload.js.map +1 -1
- package/dist/src/cli/commands/browser/run.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/run.js +5 -4
- package/dist/src/cli/commands/browser/run.js.map +1 -1
- package/dist/src/cli/commands/browser/screenshot.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/screenshot.js +2 -4
- package/dist/src/cli/commands/browser/screenshot.js.map +1 -1
- package/dist/src/cli/commands/browser/scroll-into-view.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/scroll-into-view.js +2 -4
- package/dist/src/cli/commands/browser/scroll-into-view.js.map +1 -1
- package/dist/src/cli/commands/browser/scroll.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/scroll.js +2 -4
- package/dist/src/cli/commands/browser/scroll.js.map +1 -1
- package/dist/src/cli/commands/browser/select.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/select.js +2 -4
- package/dist/src/cli/commands/browser/select.js.map +1 -1
- package/dist/src/cli/commands/browser/snapshot.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/snapshot.js +2 -4
- package/dist/src/cli/commands/browser/snapshot.js.map +1 -1
- package/dist/src/cli/commands/browser/status.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/status.js +6 -4
- package/dist/src/cli/commands/browser/status.js.map +1 -1
- package/dist/src/cli/commands/browser/stream.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/stream.js +2 -4
- package/dist/src/cli/commands/browser/stream.js.map +1 -1
- package/dist/src/cli/commands/browser/type.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/type.js +2 -4
- package/dist/src/cli/commands/browser/type.js.map +1 -1
- package/dist/src/cli/commands/browser/uncheck.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/uncheck.js +2 -4
- package/dist/src/cli/commands/browser/uncheck.js.map +1 -1
- package/dist/src/cli/commands/browser/upload.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/upload.js +2 -4
- package/dist/src/cli/commands/browser/upload.js.map +1 -1
- package/dist/src/cli/commands/browser/url.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/url.js +2 -4
- package/dist/src/cli/commands/browser/url.js.map +1 -1
- package/dist/src/cli/commands/browser/wait-for-load.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/wait-for-load.js +2 -4
- package/dist/src/cli/commands/browser/wait-for-load.js.map +1 -1
- package/dist/src/cli/commands/browser/wait-for-selector.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/wait-for-selector.js +2 -4
- package/dist/src/cli/commands/browser/wait-for-selector.js.map +1 -1
- package/dist/src/cli/commands/browser/wait.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/wait.js +2 -4
- package/dist/src/cli/commands/browser/wait.js.map +1 -1
- package/dist/src/cli/commands/data-asset/delete.d.ts +6 -0
- package/dist/src/cli/commands/data-asset/delete.d.ts.map +1 -0
- package/dist/src/cli/commands/data-asset/delete.js +31 -0
- package/dist/src/cli/commands/data-asset/delete.js.map +1 -0
- package/dist/src/cli/commands/data-asset/index.d.ts +6 -0
- package/dist/src/cli/commands/data-asset/index.d.ts.map +1 -0
- package/dist/src/cli/commands/data-asset/index.js +14 -0
- package/dist/src/cli/commands/data-asset/index.js.map +1 -0
- package/dist/src/cli/commands/data-asset/info.d.ts +6 -0
- package/dist/src/cli/commands/data-asset/info.d.ts.map +1 -0
- package/dist/src/cli/commands/data-asset/info.js +75 -0
- package/dist/src/cli/commands/data-asset/info.js.map +1 -0
- package/dist/src/cli/commands/data-asset/list.d.ts +6 -0
- package/dist/src/cli/commands/data-asset/list.d.ts.map +1 -0
- package/dist/src/cli/commands/data-asset/list.js +76 -0
- package/dist/src/cli/commands/data-asset/list.js.map +1 -0
- package/dist/src/cli/commands/data-asset/upload.d.ts +6 -0
- package/dist/src/cli/commands/data-asset/upload.d.ts.map +1 -0
- package/dist/src/cli/commands/data-asset/upload.js +83 -0
- package/dist/src/cli/commands/data-asset/upload.js.map +1 -0
- package/dist/src/cli/commands/docs.d.ts.map +1 -1
- package/dist/src/cli/commands/docs.js +7 -1
- package/dist/src/cli/commands/docs.js.map +1 -1
- package/dist/src/cli/commands/info.d.ts.map +1 -1
- package/dist/src/cli/commands/info.js +15 -6
- package/dist/src/cli/commands/info.js.map +1 -1
- package/dist/src/cli/commands/issues/index.d.ts +6 -0
- package/dist/src/cli/commands/issues/index.d.ts.map +1 -0
- package/dist/src/cli/commands/issues/index.js +12 -0
- package/dist/src/cli/commands/issues/index.js.map +1 -0
- package/dist/src/cli/commands/issues/info.d.ts +6 -0
- package/dist/src/cli/commands/issues/info.d.ts.map +1 -0
- package/dist/src/cli/commands/issues/info.js +57 -0
- package/dist/src/cli/commands/issues/info.js.map +1 -0
- package/dist/src/cli/commands/issues/list.d.ts +6 -0
- package/dist/src/cli/commands/issues/list.d.ts.map +1 -0
- package/dist/src/cli/commands/issues/list.js +71 -0
- package/dist/src/cli/commands/issues/list.js.map +1 -0
- package/dist/src/cli/commands/issues/occurrences.d.ts +6 -0
- package/dist/src/cli/commands/issues/occurrences.d.ts.map +1 -0
- package/dist/src/cli/commands/issues/occurrences.js +54 -0
- package/dist/src/cli/commands/issues/occurrences.js.map +1 -0
- package/dist/src/cli/commands/persona/create.d.ts +6 -0
- package/dist/src/cli/commands/persona/create.d.ts.map +1 -0
- package/dist/src/cli/commands/persona/create.js +30 -0
- package/dist/src/cli/commands/persona/create.js.map +1 -0
- package/dist/src/cli/commands/persona/delete.d.ts +6 -0
- package/dist/src/cli/commands/persona/delete.d.ts.map +1 -0
- package/dist/src/cli/commands/persona/delete.js +31 -0
- package/dist/src/cli/commands/persona/delete.js.map +1 -0
- package/dist/src/cli/commands/persona/index.d.ts +6 -0
- package/dist/src/cli/commands/persona/index.d.ts.map +1 -0
- package/dist/src/cli/commands/persona/index.js +16 -0
- package/dist/src/cli/commands/persona/index.js.map +1 -0
- package/dist/src/cli/commands/persona/info.d.ts +6 -0
- package/dist/src/cli/commands/persona/info.d.ts.map +1 -0
- package/dist/src/cli/commands/persona/info.js +51 -0
- package/dist/src/cli/commands/persona/info.js.map +1 -0
- package/dist/src/cli/commands/persona/list.d.ts +6 -0
- package/dist/src/cli/commands/persona/list.d.ts.map +1 -0
- package/dist/src/cli/commands/persona/list.js +58 -0
- package/dist/src/cli/commands/persona/list.js.map +1 -0
- package/dist/src/cli/commands/persona/update.d.ts +6 -0
- package/dist/src/cli/commands/persona/update.d.ts.map +1 -0
- package/dist/src/cli/commands/persona/update.js +31 -0
- package/dist/src/cli/commands/persona/update.js.map +1 -0
- package/dist/src/cli/commands/setup.d.ts.map +1 -1
- package/dist/src/cli/commands/setup.js +4 -2
- package/dist/src/cli/commands/setup.js.map +1 -1
- package/dist/src/cli/commands/suite/create.d.ts +6 -0
- package/dist/src/cli/commands/suite/create.d.ts.map +1 -0
- package/dist/src/cli/commands/suite/create.js +30 -0
- package/dist/src/cli/commands/suite/create.js.map +1 -0
- package/dist/src/cli/commands/suite/delete.d.ts +6 -0
- package/dist/src/cli/commands/suite/delete.d.ts.map +1 -0
- package/dist/src/cli/commands/suite/delete.js +31 -0
- package/dist/src/cli/commands/suite/delete.js.map +1 -0
- package/dist/src/cli/commands/suite/index.d.ts +6 -0
- package/dist/src/cli/commands/suite/index.d.ts.map +1 -0
- package/dist/src/cli/commands/suite/index.js +18 -0
- package/dist/src/cli/commands/suite/index.js.map +1 -0
- package/dist/src/cli/commands/suite/info.d.ts +6 -0
- package/dist/src/cli/commands/suite/info.d.ts.map +1 -0
- package/dist/src/cli/commands/suite/info.js +66 -0
- package/dist/src/cli/commands/suite/info.js.map +1 -0
- package/dist/src/cli/commands/suite/list.d.ts +6 -0
- package/dist/src/cli/commands/suite/list.d.ts.map +1 -0
- package/dist/src/cli/commands/suite/list.js +58 -0
- package/dist/src/cli/commands/suite/list.js.map +1 -0
- package/dist/src/cli/commands/suite/run.d.ts +6 -0
- package/dist/src/cli/commands/suite/run.d.ts.map +1 -0
- package/dist/src/cli/commands/suite/run.js +34 -0
- package/dist/src/cli/commands/suite/run.js.map +1 -0
- package/dist/src/cli/commands/suite/update.d.ts +6 -0
- package/dist/src/cli/commands/suite/update.d.ts.map +1 -0
- package/dist/src/cli/commands/suite/update.js +31 -0
- package/dist/src/cli/commands/suite/update.js.map +1 -0
- package/dist/src/cli/commands/test/diff.d.ts.map +1 -1
- package/dist/src/cli/commands/test/diff.js +2 -4
- package/dist/src/cli/commands/test/diff.js.map +1 -1
- package/dist/src/cli/commands/test/export.d.ts.map +1 -1
- package/dist/src/cli/commands/test/export.js +2 -4
- package/dist/src/cli/commands/test/export.js.map +1 -1
- package/dist/src/cli/commands/test/index.js +1 -1
- package/dist/src/cli/commands/test/index.js.map +1 -1
- package/dist/src/cli/commands/test/info.d.ts.map +1 -1
- package/dist/src/cli/commands/test/info.js +150 -46
- package/dist/src/cli/commands/test/info.js.map +1 -1
- package/dist/src/cli/commands/test/list.d.ts.map +1 -1
- package/dist/src/cli/commands/test/list.js +78 -23
- package/dist/src/cli/commands/test/list.js.map +1 -1
- package/dist/src/cli/commands/test/run.d.ts.map +1 -1
- package/dist/src/cli/commands/test/run.js +2 -4
- package/dist/src/cli/commands/test/run.js.map +1 -1
- package/dist/src/cli/commands/test/runs/cancel.d.ts +6 -0
- package/dist/src/cli/commands/test/runs/cancel.d.ts.map +1 -0
- package/dist/src/cli/commands/test/runs/cancel.js +31 -0
- package/dist/src/cli/commands/test/runs/cancel.js.map +1 -0
- package/dist/src/cli/commands/test/runs/index.d.ts +6 -0
- package/dist/src/cli/commands/test/runs/index.d.ts.map +1 -0
- package/dist/src/cli/commands/test/runs/index.js +16 -0
- package/dist/src/cli/commands/test/runs/index.js.map +1 -0
- package/dist/src/cli/commands/test/runs/info.d.ts +6 -0
- package/dist/src/cli/commands/test/runs/info.d.ts.map +1 -0
- package/dist/src/cli/commands/test/runs/info.js +72 -0
- package/dist/src/cli/commands/test/runs/info.js.map +1 -0
- package/dist/src/cli/commands/test/runs/list.d.ts +6 -0
- package/dist/src/cli/commands/test/runs/list.d.ts.map +1 -0
- package/dist/src/cli/commands/test/runs/list.js +128 -0
- package/dist/src/cli/commands/test/runs/list.js.map +1 -0
- package/dist/src/cli/commands/test/runs/logs.d.ts +6 -0
- package/dist/src/cli/commands/test/runs/logs.d.ts.map +1 -0
- package/dist/src/cli/commands/test/runs/logs.js +88 -0
- package/dist/src/cli/commands/test/runs/logs.js.map +1 -0
- package/dist/src/cli/commands/test/runs/steps.d.ts +6 -0
- package/dist/src/cli/commands/test/runs/steps.d.ts.map +1 -0
- package/dist/src/cli/commands/test/runs/steps.js +110 -0
- package/dist/src/cli/commands/test/runs/steps.js.map +1 -0
- package/dist/src/cli/commands/test/runs.d.ts.map +1 -1
- package/dist/src/cli/commands/test/runs.js +2 -4
- package/dist/src/cli/commands/test/runs.js.map +1 -1
- package/dist/src/cli/commands/test/schema.d.ts.map +1 -1
- package/dist/src/cli/commands/test/schema.js +2 -6
- package/dist/src/cli/commands/test/schema.js.map +1 -1
- package/dist/src/cli/commands/test/sync.d.ts.map +1 -1
- package/dist/src/cli/commands/test/sync.js +3 -6
- package/dist/src/cli/commands/test/sync.js.map +1 -1
- package/dist/src/cli/commands/test/validate.d.ts.map +1 -1
- package/dist/src/cli/commands/test/validate.js +2 -4
- package/dist/src/cli/commands/test/validate.js.map +1 -1
- package/dist/src/cli/commands/usage.d.ts +6 -0
- package/dist/src/cli/commands/usage.d.ts.map +1 -0
- package/dist/src/cli/commands/usage.js +106 -0
- package/dist/src/cli/commands/usage.js.map +1 -0
- package/dist/src/cli/generated/docs-content.d.ts +1 -1
- package/dist/src/cli/generated/docs-content.d.ts.map +1 -1
- package/dist/src/cli/generated/docs-content.js +12 -5
- package/dist/src/cli/generated/docs-content.js.map +1 -1
- package/dist/src/cli/index.js +43 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/lib/api-helpers.d.ts +59 -0
- package/dist/src/cli/lib/api-helpers.d.ts.map +1 -0
- package/dist/src/cli/lib/api-helpers.js +149 -0
- package/dist/src/cli/lib/api-helpers.js.map +1 -0
- package/dist/src/cli/lib/config.d.ts +20 -7
- package/dist/src/cli/lib/config.d.ts.map +1 -1
- package/dist/src/cli/lib/config.js +88 -26
- package/dist/src/cli/lib/config.js.map +1 -1
- package/dist/src/cli/lib/table.d.ts +47 -0
- package/dist/src/cli/lib/table.d.ts.map +1 -0
- package/dist/src/cli/lib/table.js +161 -0
- package/dist/src/cli/lib/table.js.map +1 -0
- package/dist/src/types/test-definition.d.ts +29 -2
- package/dist/src/types/test-definition.d.ts.map +1 -1
- package/dist/src/types/test-definition.js +2 -2
- package/lib/api/browser-types.ts +1 -0
- package/lib/api/browser.test.ts +28 -0
- package/lib/api/browser.ts +15 -1
- package/lib/api/index.ts +28 -5
- package/lib/env/index.ts +65 -5
- 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
|
|
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
|
|
26
|
+
* Load CLI configuration from .qa-use.json
|
|
23
27
|
*
|
|
24
28
|
* Priority order (highest to lowest):
|
|
25
|
-
* 1.
|
|
26
|
-
* 2.
|
|
27
|
-
* 3.
|
|
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
|
|
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;
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
12
|
-
|
|
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(
|
|
17
|
-
return
|
|
19
|
+
await fs.access(primary);
|
|
20
|
+
return primary;
|
|
18
21
|
}
|
|
19
22
|
catch {
|
|
20
|
-
//
|
|
23
|
+
// Primary not found, try legacy
|
|
21
24
|
}
|
|
22
|
-
|
|
23
|
-
const homeConfig = path.join(homedir(), CONFIG_FILENAME);
|
|
25
|
+
const legacy = path.join(dir, LEGACY_CONFIG_FILENAME);
|
|
24
26
|
try {
|
|
25
|
-
await fs.access(
|
|
26
|
-
|
|
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
|
-
//
|
|
35
|
+
// Neither found
|
|
30
36
|
}
|
|
31
37
|
return null;
|
|
32
38
|
}
|
|
33
39
|
/**
|
|
34
|
-
*
|
|
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.
|
|
38
|
-
* 2.
|
|
39
|
-
* 3.
|
|
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 (
|
|
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
|
|
73
|
-
if (
|
|
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 (
|
|
96
|
+
if (process.env.QA_USE_API_URL) {
|
|
77
97
|
config.api_url = process.env.QA_USE_API_URL;
|
|
78
98
|
}
|
|
79
|
-
if (
|
|
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
|
|
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":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
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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"}
|