@zuplo/cli 7.11.0 → 7.11.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/node_modules/@hono/node-server/README.md +2 -0
- package/node_modules/@hono/node-server/dist/index.cjs +1 -1
- package/node_modules/@hono/node-server/dist/index.mjs +1 -1
- package/node_modules/@hono/node-server/dist/serve-static.cjs +2 -1
- package/node_modules/@hono/node-server/dist/serve-static.mjs +2 -1
- package/node_modules/@hono/node-server/package.json +1 -1
- package/node_modules/@posthog/core/dist/metrics/index.d.ts +9 -0
- package/node_modules/@posthog/core/dist/metrics/index.d.ts.map +1 -1
- package/node_modules/@posthog/core/dist/metrics/index.js +38 -3
- package/node_modules/@posthog/core/dist/metrics/index.mjs +38 -3
- package/node_modules/@posthog/core/dist/metrics/types.d.ts +7 -2
- package/node_modules/@posthog/core/dist/metrics/types.d.ts.map +1 -1
- package/node_modules/@posthog/core/dist/traces/ids.d.ts.map +1 -1
- package/node_modules/@posthog/core/dist/traces/ids.js +2 -2
- package/node_modules/@posthog/core/dist/traces/ids.mjs +2 -2
- package/node_modules/@posthog/core/package.json +2 -2
- package/node_modules/@posthog/core/src/metrics/index.spec.ts +75 -0
- package/node_modules/@posthog/core/src/metrics/index.ts +60 -0
- package/node_modules/@posthog/core/src/metrics/types.ts +7 -1
- package/node_modules/@posthog/core/src/traces/ids.ts +4 -2
- package/node_modules/@posthog/types/dist/capture-metric.d.ts +10 -0
- package/node_modules/@posthog/types/dist/capture-metric.d.ts.map +1 -1
- package/node_modules/@posthog/types/dist/index.d.ts +1 -1
- package/node_modules/@posthog/types/dist/index.d.ts.map +1 -1
- package/node_modules/@posthog/types/package.json +1 -1
- package/node_modules/@posthog/types/src/capture-metric.ts +11 -0
- package/node_modules/@posthog/types/src/index.ts +1 -0
- package/node_modules/@zuplo/core/customer.cli.minified.js +2 -2
- package/node_modules/@zuplo/core/index.minified.js +2 -2
- package/node_modules/@zuplo/core/package.json +1 -1
- package/node_modules/@zuplo/graphql/package.json +1 -1
- package/node_modules/@zuplo/openapi-tools/package.json +5 -2
- package/node_modules/@zuplo/otel/package.json +1 -1
- package/node_modules/@zuplo/runtime/out/esm/{chunk-YJ2BHVUH.js → chunk-CDEAY3VY.js} +2 -2
- package/node_modules/@zuplo/runtime/out/esm/chunk-LVSZ3WTO.js +37 -0
- package/node_modules/@zuplo/runtime/out/esm/chunk-LVSZ3WTO.js.map +1 -0
- package/node_modules/@zuplo/runtime/out/esm/{chunk-VTO3F6DK.js → chunk-NUVXDVLJ.js} +2 -2
- package/node_modules/@zuplo/runtime/out/esm/{chunk-6YPRGG62.js → chunk-RHU3Z7DA.js} +108 -108
- package/node_modules/@zuplo/runtime/out/esm/chunk-RHU3Z7DA.js.map +1 -0
- package/node_modules/@zuplo/runtime/out/esm/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/internal/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/mocks/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/sdks/aws/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/types/index.d.ts +15 -24
- package/node_modules/@zuplo/runtime/out/types/internal/index.d.ts +14 -0
- package/node_modules/@zuplo/runtime/package.json +1 -1
- package/package.json +15 -12
- package/dist/__tests__/archive-utils.test.d.ts +0 -2
- package/dist/__tests__/archive-utils.test.d.ts.map +0 -1
- package/dist/__tests__/archive-utils.test.js +0 -50
- package/dist/__tests__/archive-utils.test.js.map +0 -1
- package/dist/__tests__/import-openapi.test.d.ts +0 -2
- package/dist/__tests__/import-openapi.test.d.ts.map +0 -1
- package/dist/__tests__/import-openapi.test.js +0 -251
- package/dist/__tests__/import-openapi.test.js.map +0 -1
- package/dist/__tests__/integration/confirm-linked-config.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/confirm-linked-config.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/confirm-linked-config.integration.test.js +0 -202
- package/dist/__tests__/integration/confirm-linked-config.integration.test.js.map +0 -1
- package/dist/__tests__/integration/confirm-production-deploy.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/confirm-production-deploy.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/confirm-production-deploy.integration.test.js +0 -184
- package/dist/__tests__/integration/confirm-production-deploy.integration.test.js.map +0 -1
- package/dist/__tests__/integration/custom-domain.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/custom-domain.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/custom-domain.integration.test.js +0 -563
- package/dist/__tests__/integration/custom-domain.integration.test.js.map +0 -1
- package/dist/__tests__/integration/delete.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/delete.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/delete.integration.test.js +0 -262
- package/dist/__tests__/integration/delete.integration.test.js.map +0 -1
- package/dist/__tests__/integration/deploy.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/deploy.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/deploy.integration.test.js +0 -519
- package/dist/__tests__/integration/deploy.integration.test.js.map +0 -1
- package/dist/__tests__/integration/get-project-param.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/get-project-param.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/get-project-param.integration.test.js +0 -305
- package/dist/__tests__/integration/get-project-param.integration.test.js.map +0 -1
- package/dist/__tests__/integration/info.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/info.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/info.integration.test.js +0 -293
- package/dist/__tests__/integration/info.integration.test.js.map +0 -1
- package/dist/__tests__/integration/jest-mocks-setup.d.ts +0 -2
- package/dist/__tests__/integration/jest-mocks-setup.d.ts.map +0 -1
- package/dist/__tests__/integration/jest-mocks-setup.js +0 -104
- package/dist/__tests__/integration/jest-mocks-setup.js.map +0 -1
- package/dist/__tests__/integration/jest-setup.d.ts +0 -2
- package/dist/__tests__/integration/jest-setup.d.ts.map +0 -1
- package/dist/__tests__/integration/jest-setup.js +0 -12
- package/dist/__tests__/integration/jest-setup.js.map +0 -1
- package/dist/__tests__/integration/link.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/link.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/link.integration.test.js +0 -395
- package/dist/__tests__/integration/link.integration.test.js.map +0 -1
- package/dist/__tests__/integration/linked-config-cascade.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/linked-config-cascade.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/linked-config-cascade.integration.test.js +0 -179
- package/dist/__tests__/integration/linked-config-cascade.integration.test.js.map +0 -1
- package/dist/__tests__/integration/list.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/list.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/list.integration.test.js +0 -300
- package/dist/__tests__/integration/list.integration.test.js.map +0 -1
- package/dist/__tests__/integration/source-upgrade.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/source-upgrade.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/source-upgrade.integration.test.js +0 -100
- package/dist/__tests__/integration/source-upgrade.integration.test.js.map +0 -1
- package/dist/__tests__/integration/test-utils.d.ts +0 -30
- package/dist/__tests__/integration/test-utils.d.ts.map +0 -1
- package/dist/__tests__/integration/test-utils.js +0 -82
- package/dist/__tests__/integration/test-utils.js.map +0 -1
- package/dist/__tests__/integration/tunnel.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/tunnel.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/tunnel.integration.test.js +0 -486
- package/dist/__tests__/integration/tunnel.integration.test.js.map +0 -1
- package/dist/__tests__/integration/variable.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/variable.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/variable.integration.test.js +0 -258
- package/dist/__tests__/integration/variable.integration.test.js.map +0 -1
- package/dist/__tests__/integration/whoami.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/whoami.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/whoami.integration.test.js +0 -116
- package/dist/__tests__/integration/whoami.integration.test.js.map +0 -1
- package/dist/__tests__/outdated.test.d.ts +0 -2
- package/dist/__tests__/outdated.test.d.ts.map +0 -1
- package/dist/__tests__/outdated.test.js +0 -67
- package/dist/__tests__/outdated.test.js.map +0 -1
- package/dist/__tests__/populate.test.d.ts +0 -2
- package/dist/__tests__/populate.test.d.ts.map +0 -1
- package/dist/__tests__/populate.test.js +0 -445
- package/dist/__tests__/populate.test.js.map +0 -1
- package/dist/__tests__/tsconfig-upgrader.test.d.ts +0 -2
- package/dist/__tests__/tsconfig-upgrader.test.d.ts.map +0 -1
- package/dist/__tests__/tsconfig-upgrader.test.js +0 -31
- package/dist/__tests__/tsconfig-upgrader.test.js.map +0 -1
- package/dist/ca-certificate/validation.test.d.ts +0 -2
- package/dist/ca-certificate/validation.test.d.ts.map +0 -1
- package/dist/ca-certificate/validation.test.js +0 -131
- package/dist/ca-certificate/validation.test.js.map +0 -1
- package/dist/common/analytics/cli-invocation.test.d.ts +0 -2
- package/dist/common/analytics/cli-invocation.test.d.ts.map +0 -1
- package/dist/common/analytics/cli-invocation.test.js +0 -51
- package/dist/common/analytics/cli-invocation.test.js.map +0 -1
- package/dist/common/analytics/package-manager.test.d.ts +0 -2
- package/dist/common/analytics/package-manager.test.d.ts.map +0 -1
- package/dist/common/analytics/package-manager.test.js +0 -163
- package/dist/common/analytics/package-manager.test.js.map +0 -1
- package/dist/common/cli-dispatcher.test.d.ts +0 -2
- package/dist/common/cli-dispatcher.test.d.ts.map +0 -1
- package/dist/common/cli-dispatcher.test.js +0 -80
- package/dist/common/cli-dispatcher.test.js.map +0 -1
- package/dist/common/middleware/check-pnpm-lifecycle.test.d.ts +0 -2
- package/dist/common/middleware/check-pnpm-lifecycle.test.d.ts.map +0 -1
- package/dist/common/middleware/check-pnpm-lifecycle.test.js +0 -125
- package/dist/common/middleware/check-pnpm-lifecycle.test.js.map +0 -1
- package/dist/common/middleware/get-environment-param.test.d.ts +0 -2
- package/dist/common/middleware/get-environment-param.test.d.ts.map +0 -1
- package/dist/common/middleware/get-environment-param.test.js +0 -57
- package/dist/common/middleware/get-environment-param.test.js.map +0 -1
- package/dist/common/read-linked-config.test.d.ts +0 -2
- package/dist/common/read-linked-config.test.d.ts.map +0 -1
- package/dist/common/read-linked-config.test.js +0 -363
- package/dist/common/read-linked-config.test.js.map +0 -1
- package/dist/common/terminal.test.d.ts +0 -2
- package/dist/common/terminal.test.d.ts.map +0 -1
- package/dist/common/terminal.test.js +0 -101
- package/dist/common/terminal.test.js.map +0 -1
- package/dist/common/utils/build-environment-prompt-choices.test.d.ts +0 -2
- package/dist/common/utils/build-environment-prompt-choices.test.d.ts.map +0 -1
- package/dist/common/utils/build-environment-prompt-choices.test.js +0 -97
- package/dist/common/utils/build-environment-prompt-choices.test.js.map +0 -1
- package/dist/common/utils/format-environment-type.test.d.ts +0 -2
- package/dist/common/utils/format-environment-type.test.d.ts.map +0 -1
- package/dist/common/utils/format-environment-type.test.js +0 -32
- package/dist/common/utils/format-environment-type.test.js.map +0 -1
- package/dist/common/utils/pnpm-lifecycle.test.d.ts +0 -2
- package/dist/common/utils/pnpm-lifecycle.test.d.ts.map +0 -1
- package/dist/common/utils/pnpm-lifecycle.test.js +0 -196
- package/dist/common/utils/pnpm-lifecycle.test.js.map +0 -1
- package/dist/common/utils/pretty-print-environment-prompt.test.d.ts +0 -2
- package/dist/common/utils/pretty-print-environment-prompt.test.d.ts.map +0 -1
- package/dist/common/utils/pretty-print-environment-prompt.test.js +0 -42
- package/dist/common/utils/pretty-print-environment-prompt.test.js.map +0 -1
- package/dist/common/utils/sort-environments-for-prompt.test.d.ts +0 -2
- package/dist/common/utils/sort-environments-for-prompt.test.d.ts.map +0 -1
- package/dist/common/utils/sort-environments-for-prompt.test.js +0 -82
- package/dist/common/utils/sort-environments-for-prompt.test.js.map +0 -1
- package/dist/common/utils/stringify-config.test.d.ts +0 -2
- package/dist/common/utils/stringify-config.test.d.ts.map +0 -1
- package/dist/common/utils/stringify-config.test.js +0 -80
- package/dist/common/utils/stringify-config.test.js.map +0 -1
- package/dist/common/validators/argument-validators.spec.d.ts +0 -2
- package/dist/common/validators/argument-validators.spec.d.ts.map +0 -1
- package/dist/common/validators/argument-validators.spec.js +0 -181
- package/dist/common/validators/argument-validators.spec.js.map +0 -1
- package/dist/common/worker-output.test.d.ts +0 -2
- package/dist/common/worker-output.test.d.ts.map +0 -1
- package/dist/common/worker-output.test.js +0 -32
- package/dist/common/worker-output.test.js.map +0 -1
- package/dist/deploy/archive.local-registry.test.d.ts +0 -2
- package/dist/deploy/archive.local-registry.test.d.ts.map +0 -1
- package/dist/deploy/archive.local-registry.test.js +0 -100
- package/dist/deploy/archive.local-registry.test.js.map +0 -1
- package/dist/deploy/archive.test.d.ts +0 -2
- package/dist/deploy/archive.test.d.ts.map +0 -1
- package/dist/deploy/archive.test.js +0 -248
- package/dist/deploy/archive.test.js.map +0 -1
- package/dist/deploy/classify-build-probe.test.d.ts +0 -2
- package/dist/deploy/classify-build-probe.test.d.ts.map +0 -1
- package/dist/deploy/classify-build-probe.test.js +0 -51
- package/dist/deploy/classify-build-probe.test.js.map +0 -1
- package/dist/deploy/poll-deployment.test.d.ts +0 -2
- package/dist/deploy/poll-deployment.test.d.ts.map +0 -1
- package/dist/deploy/poll-deployment.test.js +0 -158
- package/dist/deploy/poll-deployment.test.js.map +0 -1
- package/dist/dev/zuplo-local-gitignore.test.d.ts +0 -2
- package/dist/dev/zuplo-local-gitignore.test.d.ts.map +0 -1
- package/dist/dev/zuplo-local-gitignore.test.js +0 -58
- package/dist/dev/zuplo-local-gitignore.test.js.map +0 -1
- package/dist/editor/e2e/editor.spec.d.ts +0 -2
- package/dist/editor/e2e/editor.spec.d.ts.map +0 -1
- package/dist/editor/e2e/editor.spec.js +0 -44
- package/dist/editor/e2e/editor.spec.js.map +0 -1
- package/dist/link/project-type.test.d.ts +0 -2
- package/dist/link/project-type.test.d.ts.map +0 -1
- package/dist/link/project-type.test.js +0 -225
- package/dist/link/project-type.test.js.map +0 -1
- package/dist/lint/resolve-binary.test.d.ts +0 -2
- package/dist/lint/resolve-binary.test.d.ts.map +0 -1
- package/dist/lint/resolve-binary.test.js +0 -155
- package/dist/lint/resolve-binary.test.js.map +0 -1
- package/dist/open-api/convert/handler.spec.d.ts +0 -2
- package/dist/open-api/convert/handler.spec.d.ts.map +0 -1
- package/dist/open-api/convert/handler.spec.js +0 -301
- package/dist/open-api/convert/handler.spec.js.map +0 -1
- package/dist/open-api/merge/handler.spec.d.ts +0 -2
- package/dist/open-api/merge/handler.spec.d.ts.map +0 -1
- package/dist/open-api/merge/handler.spec.js +0 -673
- package/dist/open-api/merge/handler.spec.js.map +0 -1
- package/dist/open-api/overlay/handler.spec.d.ts +0 -2
- package/dist/open-api/overlay/handler.spec.d.ts.map +0 -1
- package/dist/open-api/overlay/handler.spec.js +0 -346
- package/dist/open-api/overlay/handler.spec.js.map +0 -1
- package/dist/source/ai-gateway/files.test.d.ts +0 -2
- package/dist/source/ai-gateway/files.test.d.ts.map +0 -1
- package/dist/source/ai-gateway/files.test.js +0 -135
- package/dist/source/ai-gateway/files.test.js.map +0 -1
- package/dist/source/ai-gateway/handler.test.d.ts +0 -2
- package/dist/source/ai-gateway/handler.test.d.ts.map +0 -1
- package/dist/source/ai-gateway/handler.test.js +0 -113
- package/dist/source/ai-gateway/handler.test.js.map +0 -1
- package/dist/source/ai-gateway/package.test.d.ts +0 -2
- package/dist/source/ai-gateway/package.test.d.ts.map +0 -1
- package/dist/source/ai-gateway/package.test.js +0 -30
- package/dist/source/ai-gateway/package.test.js.map +0 -1
- package/dist/source/ai-gateway/planner.test.d.ts +0 -2
- package/dist/source/ai-gateway/planner.test.d.ts.map +0 -1
- package/dist/source/ai-gateway/planner.test.js +0 -330
- package/dist/source/ai-gateway/planner.test.js.map +0 -1
- package/dist/source/ai-gateway/release.test.d.ts +0 -2
- package/dist/source/ai-gateway/release.test.d.ts.map +0 -1
- package/dist/source/ai-gateway/release.test.js +0 -62
- package/dist/source/ai-gateway/release.test.js.map +0 -1
- package/dist/test/invoke-test.test.d.ts +0 -2
- package/dist/test/invoke-test.test.d.ts.map +0 -1
- package/dist/test/invoke-test.test.js +0 -150
- package/dist/test/invoke-test.test.js.map +0 -1
- package/dist/test/test-files.test.d.ts +0 -2
- package/dist/test/test-files.test.d.ts.map +0 -1
- package/dist/test/test-files.test.js +0 -57
- package/dist/test/test-files.test.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.js +0 -289
- package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.js +0 -181
- package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/merge.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/merge.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/merge.spec.js +0 -399
- package/node_modules/@zuplo/openapi-tools/dist/merge.spec.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.js +0 -779
- package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.js +0 -269
- package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.js +0 -93
- package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.js.map +0 -1
- package/node_modules/@zuplo/runtime/out/esm/chunk-6YPRGG62.js.map +0 -1
- package/node_modules/@zuplo/runtime/out/esm/chunk-PBDT4FDO.js +0 -37
- package/node_modules/@zuplo/runtime/out/esm/chunk-PBDT4FDO.js.map +0 -1
- /package/node_modules/@zuplo/runtime/out/esm/{chunk-YJ2BHVUH.js.map → chunk-CDEAY3VY.js.map} +0 -0
- /package/node_modules/@zuplo/runtime/out/esm/{chunk-PBDT4FDO.js.LEGAL.txt → chunk-LVSZ3WTO.js.LEGAL.txt} +0 -0
- /package/node_modules/@zuplo/runtime/out/esm/{chunk-VTO3F6DK.js.map → chunk-NUVXDVLJ.js.map} +0 -0
- /package/node_modules/@zuplo/runtime/out/esm/{chunk-6YPRGG62.js.LEGAL.txt → chunk-RHU3Z7DA.js.LEGAL.txt} +0 -0
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { input, select } from "@inquirer/prompts";
|
|
3
|
-
import nock from "nock";
|
|
4
|
-
import { fetchProject } from "../../common/middleware/get-project-param.js";
|
|
5
|
-
import { printResultToConsoleAndExitGracefully } from "../../common/output.js";
|
|
6
|
-
import { cleanupTest, setupAuthenticatedNock, setupTestEnvironment, TEST_ACCOUNT_NAME, TEST_API_BASE, TEST_AUTH_TOKEN, TEST_PROJECT_NAME, } from "./test-utils.js";
|
|
7
|
-
jest.mock("node:fs/promises", () => ({
|
|
8
|
-
readFile: jest.fn().mockRejectedValue(new Error("no package.json")),
|
|
9
|
-
}));
|
|
10
|
-
jest.mock("../../common/terminal.js", () => ({
|
|
11
|
-
isInteractiveTerminal: jest.fn().mockReturnValue(true),
|
|
12
|
-
}));
|
|
13
|
-
jest.mock("../../common/read-linked-config.js", () => ({
|
|
14
|
-
__esModule: true,
|
|
15
|
-
confirmLinkedValue: jest.fn().mockResolvedValue(false),
|
|
16
|
-
readLinkedConfig: jest.fn().mockResolvedValue({}),
|
|
17
|
-
USE_LINKED_DETAILS: "useLinkedDetails",
|
|
18
|
-
ignoreLinkedDetails: jest
|
|
19
|
-
.fn()
|
|
20
|
-
.mockImplementation((argv) => {
|
|
21
|
-
argv["useLinkedDetails"] = false;
|
|
22
|
-
}),
|
|
23
|
-
}));
|
|
24
|
-
const NEW_PROJECT_NAME = "my-new-project";
|
|
25
|
-
const PACKAGE_JSON_NAME = "my-package-from-json";
|
|
26
|
-
const baseArgv = () => ({
|
|
27
|
-
authToken: TEST_AUTH_TOKEN,
|
|
28
|
-
account: TEST_ACCOUNT_NAME,
|
|
29
|
-
useLinkedDetails: false,
|
|
30
|
-
});
|
|
31
|
-
describe("fetchProject middleware", () => {
|
|
32
|
-
beforeEach(() => {
|
|
33
|
-
setupTestEnvironment();
|
|
34
|
-
nock.disableNetConnect();
|
|
35
|
-
jest.clearAllMocks();
|
|
36
|
-
jest
|
|
37
|
-
.mocked(readFile)
|
|
38
|
-
.mockRejectedValue(new Error("ENOENT: no package.json"));
|
|
39
|
-
});
|
|
40
|
-
afterEach(() => {
|
|
41
|
-
cleanupTest();
|
|
42
|
-
});
|
|
43
|
-
describe("when projects exist and user selects an existing project", () => {
|
|
44
|
-
it("sets argv.project to the selected project name", async () => {
|
|
45
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
46
|
-
.get("/v1/projects")
|
|
47
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
48
|
-
.reply(200, { data: [{ name: TEST_PROJECT_NAME }] });
|
|
49
|
-
const argv = baseArgv();
|
|
50
|
-
await fetchProject(argv);
|
|
51
|
-
expect(argv.project).toBe(TEST_PROJECT_NAME);
|
|
52
|
-
expect(select).toHaveBeenCalledTimes(1);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe("when projects exist and user selects '+ Create a new project'", () => {
|
|
56
|
-
it("prompts for a name, calls the create API, and sets argv.project", async () => {
|
|
57
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
58
|
-
.get("/v1/projects")
|
|
59
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
60
|
-
.reply(200, { data: [{ name: TEST_PROJECT_NAME }] });
|
|
61
|
-
const createScope = setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
62
|
-
.post(`/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`, { name: NEW_PROJECT_NAME })
|
|
63
|
-
.reply(200, { name: NEW_PROJECT_NAME });
|
|
64
|
-
jest.mocked(select).mockResolvedValueOnce(null);
|
|
65
|
-
jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);
|
|
66
|
-
const argv = baseArgv();
|
|
67
|
-
await fetchProject(argv);
|
|
68
|
-
expect(argv.project).toBe(NEW_PROJECT_NAME);
|
|
69
|
-
expect(select).toHaveBeenCalledTimes(1);
|
|
70
|
-
expect(input).toHaveBeenCalledTimes(1);
|
|
71
|
-
expect(input).toHaveBeenCalledWith(expect.objectContaining({
|
|
72
|
-
message: `Enter a name for the new project in account '${TEST_ACCOUNT_NAME}'`,
|
|
73
|
-
}));
|
|
74
|
-
expect(createScope.isDone()).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
it("uses package.json name as the default input value when available", async () => {
|
|
77
|
-
jest
|
|
78
|
-
.mocked(readFile)
|
|
79
|
-
.mockResolvedValueOnce(JSON.stringify({ name: PACKAGE_JSON_NAME }));
|
|
80
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
81
|
-
.get("/v1/projects")
|
|
82
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
83
|
-
.reply(200, { data: [{ name: TEST_PROJECT_NAME }] });
|
|
84
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
85
|
-
.post(`/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`, { name: NEW_PROJECT_NAME })
|
|
86
|
-
.reply(200, { name: NEW_PROJECT_NAME });
|
|
87
|
-
jest.mocked(select).mockResolvedValueOnce(null);
|
|
88
|
-
jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);
|
|
89
|
-
const argv = baseArgv();
|
|
90
|
-
await fetchProject(argv);
|
|
91
|
-
expect(input).toHaveBeenCalledWith(expect.objectContaining({
|
|
92
|
-
message: `Enter a name for the new project in account '${TEST_ACCOUNT_NAME}'`,
|
|
93
|
-
default: PACKAGE_JSON_NAME,
|
|
94
|
-
}));
|
|
95
|
-
});
|
|
96
|
-
it("calls process.exit(1) when user aborts the project name prompt", async () => {
|
|
97
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
98
|
-
.get("/v1/projects")
|
|
99
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
100
|
-
.reply(200, { data: [{ name: TEST_PROJECT_NAME }] });
|
|
101
|
-
jest.mocked(select).mockResolvedValueOnce(null);
|
|
102
|
-
const exitError = Object.assign(new Error("User aborted"), {
|
|
103
|
-
name: "ExitPromptError",
|
|
104
|
-
});
|
|
105
|
-
jest.mocked(input).mockRejectedValueOnce(exitError);
|
|
106
|
-
const exitSpy = jest.spyOn(process, "exit").mockImplementation((() => {
|
|
107
|
-
throw new Error("process.exit(1) called");
|
|
108
|
-
}));
|
|
109
|
-
try {
|
|
110
|
-
await expect(fetchProject(baseArgv())).rejects.toThrow("process.exit(1) called");
|
|
111
|
-
expect(exitSpy).toHaveBeenCalledWith(1);
|
|
112
|
-
}
|
|
113
|
-
finally {
|
|
114
|
-
exitSpy.mockRestore();
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
it("propagates unexpected errors thrown by the input prompt", async () => {
|
|
118
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
119
|
-
.get("/v1/projects")
|
|
120
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
121
|
-
.reply(200, { data: [{ name: TEST_PROJECT_NAME }] });
|
|
122
|
-
jest.mocked(select).mockResolvedValueOnce(null);
|
|
123
|
-
jest.mocked(input).mockRejectedValueOnce(new Error("keyboard exploded"));
|
|
124
|
-
await expect(fetchProject(baseArgv())).rejects.toThrow("keyboard exploded");
|
|
125
|
-
});
|
|
126
|
-
it("exits with code 1 on non-retryable HTTP errors from the create API without retrying", async () => {
|
|
127
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
128
|
-
.get("/v1/projects")
|
|
129
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
130
|
-
.reply(200, { data: [{ name: TEST_PROJECT_NAME }] });
|
|
131
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
132
|
-
.post(`/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`, { name: NEW_PROJECT_NAME })
|
|
133
|
-
.reply(401, { title: "Unauthorized" });
|
|
134
|
-
jest.mocked(select).mockResolvedValueOnce(null);
|
|
135
|
-
jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);
|
|
136
|
-
const exitSpy = jest.spyOn(process, "exit").mockImplementation((() => {
|
|
137
|
-
throw new Error("process.exit(1) called");
|
|
138
|
-
}));
|
|
139
|
-
try {
|
|
140
|
-
await expect(fetchProject(baseArgv())).rejects.toThrow("process.exit(1) called");
|
|
141
|
-
expect(exitSpy).toHaveBeenCalledWith(1);
|
|
142
|
-
expect(input).toHaveBeenCalledTimes(1);
|
|
143
|
-
}
|
|
144
|
-
finally {
|
|
145
|
-
exitSpy.mockRestore();
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
it("exits with code 1 on network errors from the create API without retrying", async () => {
|
|
149
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
150
|
-
.get("/v1/projects")
|
|
151
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
152
|
-
.reply(200, { data: [{ name: TEST_PROJECT_NAME }] });
|
|
153
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
154
|
-
.post(`/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`, { name: NEW_PROJECT_NAME })
|
|
155
|
-
.replyWithError("connect ECONNREFUSED");
|
|
156
|
-
jest.mocked(select).mockResolvedValueOnce(null);
|
|
157
|
-
jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);
|
|
158
|
-
const exitSpy = jest.spyOn(process, "exit").mockImplementation((() => {
|
|
159
|
-
throw new Error("process.exit(1) called");
|
|
160
|
-
}));
|
|
161
|
-
try {
|
|
162
|
-
await expect(fetchProject(baseArgv())).rejects.toThrow("process.exit(1) called");
|
|
163
|
-
expect(exitSpy).toHaveBeenCalledWith(1);
|
|
164
|
-
expect(input).toHaveBeenCalledTimes(1);
|
|
165
|
-
}
|
|
166
|
-
finally {
|
|
167
|
-
exitSpy.mockRestore();
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
it("re-prompts after a failed create API call and succeeds on retry", async () => {
|
|
171
|
-
const RETRY_PROJECT_NAME = "my-new-project-retry";
|
|
172
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
173
|
-
.get("/v1/projects")
|
|
174
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
175
|
-
.reply(200, { data: [{ name: TEST_PROJECT_NAME }] });
|
|
176
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
177
|
-
.post(`/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`, { name: NEW_PROJECT_NAME })
|
|
178
|
-
.reply(422, { detail: "Project name already taken" });
|
|
179
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
180
|
-
.post(`/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`, { name: RETRY_PROJECT_NAME })
|
|
181
|
-
.reply(200, { name: RETRY_PROJECT_NAME });
|
|
182
|
-
jest.mocked(select).mockResolvedValueOnce(null);
|
|
183
|
-
jest
|
|
184
|
-
.mocked(input)
|
|
185
|
-
.mockResolvedValueOnce(NEW_PROJECT_NAME)
|
|
186
|
-
.mockResolvedValueOnce(RETRY_PROJECT_NAME);
|
|
187
|
-
const argv = baseArgv();
|
|
188
|
-
await fetchProject(argv);
|
|
189
|
-
expect(argv.project).toBe(RETRY_PROJECT_NAME);
|
|
190
|
-
expect(input).toHaveBeenCalledTimes(2);
|
|
191
|
-
expect(input).toHaveBeenNthCalledWith(2, expect.objectContaining({ default: NEW_PROJECT_NAME }));
|
|
192
|
-
expect(jest.mocked(printResultToConsoleAndExitGracefully)).not.toHaveBeenCalled();
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
describe("when user cancels the project picker (select prompt)", () => {
|
|
196
|
-
it("calls process.exit(1) when select throws ExitPromptError", async () => {
|
|
197
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
198
|
-
.get("/v1/projects")
|
|
199
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
200
|
-
.reply(200, { data: [{ name: TEST_PROJECT_NAME }] });
|
|
201
|
-
const exitError = Object.assign(new Error("User force-closed the prompt"), {
|
|
202
|
-
name: "ExitPromptError",
|
|
203
|
-
});
|
|
204
|
-
jest.mocked(select).mockRejectedValueOnce(exitError);
|
|
205
|
-
const exitSpy = jest.spyOn(process, "exit").mockImplementation((() => {
|
|
206
|
-
throw new Error("process.exit(1) called");
|
|
207
|
-
}));
|
|
208
|
-
try {
|
|
209
|
-
await expect(fetchProject(baseArgv())).rejects.toThrow("process.exit(1) called");
|
|
210
|
-
expect(exitSpy).toHaveBeenCalledWith(1);
|
|
211
|
-
}
|
|
212
|
-
finally {
|
|
213
|
-
exitSpy.mockRestore();
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
it("calls process.exit(1) when select throws isTtyError", async () => {
|
|
217
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
218
|
-
.get("/v1/projects")
|
|
219
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
220
|
-
.reply(200, { data: [{ name: TEST_PROJECT_NAME }] });
|
|
221
|
-
const ttyError = Object.assign(new Error("Input is not a TTY"), {
|
|
222
|
-
isTtyError: true,
|
|
223
|
-
});
|
|
224
|
-
jest.mocked(select).mockRejectedValueOnce(ttyError);
|
|
225
|
-
const exitSpy = jest.spyOn(process, "exit").mockImplementation((() => {
|
|
226
|
-
throw new Error("process.exit(1) called");
|
|
227
|
-
}));
|
|
228
|
-
try {
|
|
229
|
-
await expect(fetchProject(baseArgv())).rejects.toThrow("process.exit(1) called");
|
|
230
|
-
expect(exitSpy).toHaveBeenCalledWith(1);
|
|
231
|
-
}
|
|
232
|
-
finally {
|
|
233
|
-
exitSpy.mockRestore();
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
describe("when the projects list API fails", () => {
|
|
238
|
-
it("exits critically on a 500 response", async () => {
|
|
239
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
240
|
-
.get("/v1/projects")
|
|
241
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
242
|
-
.reply(500, { error: "Internal Server Error" });
|
|
243
|
-
await expect(fetchProject(baseArgv())).rejects.toThrow("Process would exit");
|
|
244
|
-
});
|
|
245
|
-
it("exits critically with a 404 response", async () => {
|
|
246
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
247
|
-
.get("/v1/projects")
|
|
248
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
249
|
-
.reply(404, {});
|
|
250
|
-
await expect(fetchProject(baseArgv())).rejects.toThrow("Process would exit");
|
|
251
|
-
});
|
|
252
|
-
it("does not call select or input when the projects list request fails", async () => {
|
|
253
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
254
|
-
.get("/v1/projects")
|
|
255
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
256
|
-
.reply(500, {});
|
|
257
|
-
try {
|
|
258
|
-
await fetchProject(baseArgv());
|
|
259
|
-
}
|
|
260
|
-
catch {
|
|
261
|
-
}
|
|
262
|
-
expect(select).not.toHaveBeenCalled();
|
|
263
|
-
expect(input).not.toHaveBeenCalled();
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
describe("when user has no projects", () => {
|
|
267
|
-
it("skips the picker, prompts directly for a name, and calls the create API", async () => {
|
|
268
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
269
|
-
.get("/v1/projects")
|
|
270
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
271
|
-
.reply(200, { data: [] });
|
|
272
|
-
const createScope = setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
273
|
-
.post(`/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`, { name: NEW_PROJECT_NAME })
|
|
274
|
-
.reply(200, { name: NEW_PROJECT_NAME });
|
|
275
|
-
jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);
|
|
276
|
-
const argv = baseArgv();
|
|
277
|
-
await fetchProject(argv);
|
|
278
|
-
expect(argv.project).toBe(NEW_PROJECT_NAME);
|
|
279
|
-
expect(select).not.toHaveBeenCalled();
|
|
280
|
-
expect(input).toHaveBeenCalledTimes(1);
|
|
281
|
-
expect(input).toHaveBeenCalledWith(expect.objectContaining({
|
|
282
|
-
message: "You don't have any projects configured for this account. Please enter a project name to create one.",
|
|
283
|
-
}));
|
|
284
|
-
expect(createScope.isDone()).toBe(true);
|
|
285
|
-
});
|
|
286
|
-
it("uses package.json name as the default input value when available", async () => {
|
|
287
|
-
jest
|
|
288
|
-
.mocked(readFile)
|
|
289
|
-
.mockResolvedValueOnce(JSON.stringify({ name: PACKAGE_JSON_NAME }));
|
|
290
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
291
|
-
.get("/v1/projects")
|
|
292
|
-
.query({ accountName: TEST_ACCOUNT_NAME })
|
|
293
|
-
.reply(200, { data: [] });
|
|
294
|
-
setupAuthenticatedNock(nock(TEST_API_BASE))
|
|
295
|
-
.post(`/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`, { name: NEW_PROJECT_NAME })
|
|
296
|
-
.reply(200, { name: NEW_PROJECT_NAME });
|
|
297
|
-
jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);
|
|
298
|
-
await fetchProject(baseArgv());
|
|
299
|
-
expect(input).toHaveBeenCalledWith(expect.objectContaining({
|
|
300
|
-
default: PACKAGE_JSON_NAME,
|
|
301
|
-
}));
|
|
302
|
-
});
|
|
303
|
-
});
|
|
304
|
-
});
|
|
305
|
-
//# sourceMappingURL=get-project-param.integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-project-param.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/get-project-param.integration.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Integration tests for the fetchProject middleware, covering the project\n * picker flows including the \"+ Create a new project\" option.\n */\n/// <reference types=\"jest\" />\n\nimport { readFile } from \"node:fs/promises\";\nimport { input, select } from \"@inquirer/prompts\";\nimport nock from \"nock\";\nimport { fetchProject } from \"../../common/middleware/get-project-param.js\";\nimport { printResultToConsoleAndExitGracefully } from \"../../common/output.js\";\nimport {\n cleanupTest,\n setupAuthenticatedNock,\n setupTestEnvironment,\n TEST_ACCOUNT_NAME,\n TEST_API_BASE,\n TEST_AUTH_TOKEN,\n TEST_PROJECT_NAME,\n} from \"./test-utils.js\";\n\njest.mock(\"node:fs/promises\", () => ({\n readFile: jest.fn().mockRejectedValue(new Error(\"no package.json\")),\n}));\n\njest.mock(\"../../common/terminal.js\", () => ({\n isInteractiveTerminal: jest.fn().mockReturnValue(true),\n}));\n\njest.mock(\"../../common/read-linked-config.js\", () => ({\n __esModule: true,\n confirmLinkedValue: jest.fn().mockResolvedValue(false),\n readLinkedConfig: jest.fn().mockResolvedValue({}),\n USE_LINKED_DETAILS: \"useLinkedDetails\",\n ignoreLinkedDetails: jest\n .fn()\n .mockImplementation((argv: Record<string, unknown>) => {\n argv[\"useLinkedDetails\"] = false;\n }),\n}));\n\nconst NEW_PROJECT_NAME = \"my-new-project\";\nconst PACKAGE_JSON_NAME = \"my-package-from-json\";\n\nconst baseArgv = (): Record<string, unknown> => ({\n authToken: TEST_AUTH_TOKEN,\n account: TEST_ACCOUNT_NAME,\n useLinkedDetails: false,\n});\n\ndescribe(\"fetchProject middleware\", () => {\n beforeEach(() => {\n setupTestEnvironment();\n nock.disableNetConnect();\n jest.clearAllMocks();\n // Default: package.json not found\n jest\n .mocked(readFile)\n .mockRejectedValue(new Error(\"ENOENT: no package.json\"));\n });\n\n afterEach(() => {\n cleanupTest();\n });\n\n describe(\"when projects exist and user selects an existing project\", () => {\n it(\"sets argv.project to the selected project name\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [{ name: TEST_PROJECT_NAME }] });\n\n const argv = baseArgv();\n await fetchProject(argv);\n\n // Global mock skips null and returns first real project\n expect(argv.project).toBe(TEST_PROJECT_NAME);\n expect(select).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"when projects exist and user selects '+ Create a new project'\", () => {\n it(\"prompts for a name, calls the create API, and sets argv.project\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [{ name: TEST_PROJECT_NAME }] });\n\n const createScope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\n `/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`,\n { name: NEW_PROJECT_NAME }\n )\n .reply(200, { name: NEW_PROJECT_NAME });\n\n jest.mocked(select).mockResolvedValueOnce(null as unknown as string);\n jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);\n\n const argv = baseArgv();\n await fetchProject(argv);\n\n expect(argv.project).toBe(NEW_PROJECT_NAME);\n expect(select).toHaveBeenCalledTimes(1);\n expect(input).toHaveBeenCalledTimes(1);\n expect(input).toHaveBeenCalledWith(\n expect.objectContaining({\n message: `Enter a name for the new project in account '${TEST_ACCOUNT_NAME}'`,\n })\n );\n expect(createScope.isDone()).toBe(true);\n });\n\n it(\"uses package.json name as the default input value when available\", async () => {\n jest\n .mocked(readFile)\n .mockResolvedValueOnce(\n JSON.stringify({ name: PACKAGE_JSON_NAME }) as unknown as Buffer\n );\n\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [{ name: TEST_PROJECT_NAME }] });\n\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\n `/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`,\n { name: NEW_PROJECT_NAME }\n )\n .reply(200, { name: NEW_PROJECT_NAME });\n\n jest.mocked(select).mockResolvedValueOnce(null as unknown as string);\n jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);\n\n const argv = baseArgv();\n await fetchProject(argv);\n\n expect(input).toHaveBeenCalledWith(\n expect.objectContaining({\n message: `Enter a name for the new project in account '${TEST_ACCOUNT_NAME}'`,\n default: PACKAGE_JSON_NAME,\n })\n );\n });\n\n it(\"calls process.exit(1) when user aborts the project name prompt\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [{ name: TEST_PROJECT_NAME }] });\n\n jest.mocked(select).mockResolvedValueOnce(null as unknown as string);\n const exitError = Object.assign(new Error(\"User aborted\"), {\n name: \"ExitPromptError\",\n });\n jest.mocked(input).mockRejectedValueOnce(exitError);\n\n const exitSpy = jest.spyOn(process, \"exit\").mockImplementation((() => {\n throw new Error(\"process.exit(1) called\");\n }) as never);\n\n try {\n await expect(fetchProject(baseArgv())).rejects.toThrow(\n \"process.exit(1) called\"\n );\n expect(exitSpy).toHaveBeenCalledWith(1);\n } finally {\n exitSpy.mockRestore();\n }\n });\n\n it(\"propagates unexpected errors thrown by the input prompt\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [{ name: TEST_PROJECT_NAME }] });\n\n jest.mocked(select).mockResolvedValueOnce(null as unknown as string);\n jest.mocked(input).mockRejectedValueOnce(new Error(\"keyboard exploded\"));\n\n await expect(fetchProject(baseArgv())).rejects.toThrow(\n \"keyboard exploded\"\n );\n });\n\n it(\"exits with code 1 on non-retryable HTTP errors from the create API without retrying\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [{ name: TEST_PROJECT_NAME }] });\n\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\n `/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`,\n { name: NEW_PROJECT_NAME }\n )\n .reply(401, { title: \"Unauthorized\" });\n\n jest.mocked(select).mockResolvedValueOnce(null as unknown as string);\n jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);\n\n const exitSpy = jest.spyOn(process, \"exit\").mockImplementation((() => {\n throw new Error(\"process.exit(1) called\");\n }) as never);\n\n try {\n await expect(fetchProject(baseArgv())).rejects.toThrow(\n \"process.exit(1) called\"\n );\n expect(exitSpy).toHaveBeenCalledWith(1);\n expect(input).toHaveBeenCalledTimes(1);\n } finally {\n exitSpy.mockRestore();\n }\n });\n\n it(\"exits with code 1 on network errors from the create API without retrying\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [{ name: TEST_PROJECT_NAME }] });\n\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\n `/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`,\n { name: NEW_PROJECT_NAME }\n )\n .replyWithError(\"connect ECONNREFUSED\");\n\n jest.mocked(select).mockResolvedValueOnce(null as unknown as string);\n jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);\n\n const exitSpy = jest.spyOn(process, \"exit\").mockImplementation((() => {\n throw new Error(\"process.exit(1) called\");\n }) as never);\n\n try {\n await expect(fetchProject(baseArgv())).rejects.toThrow(\n \"process.exit(1) called\"\n );\n expect(exitSpy).toHaveBeenCalledWith(1);\n expect(input).toHaveBeenCalledTimes(1);\n } finally {\n exitSpy.mockRestore();\n }\n });\n\n it(\"re-prompts after a failed create API call and succeeds on retry\", async () => {\n const RETRY_PROJECT_NAME = \"my-new-project-retry\";\n\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [{ name: TEST_PROJECT_NAME }] });\n\n // First attempt fails\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\n `/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`,\n { name: NEW_PROJECT_NAME }\n )\n .reply(422, { detail: \"Project name already taken\" });\n\n // Second attempt succeeds\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\n `/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`,\n { name: RETRY_PROJECT_NAME }\n )\n .reply(200, { name: RETRY_PROJECT_NAME });\n\n jest.mocked(select).mockResolvedValueOnce(null as unknown as string);\n jest\n .mocked(input)\n .mockResolvedValueOnce(NEW_PROJECT_NAME)\n .mockResolvedValueOnce(RETRY_PROJECT_NAME);\n\n const argv = baseArgv();\n await fetchProject(argv);\n\n expect(argv.project).toBe(RETRY_PROJECT_NAME);\n expect(input).toHaveBeenCalledTimes(2);\n // Second prompt should default to the name the user previously typed, not the original package.json default\n expect(input).toHaveBeenNthCalledWith(\n 2,\n expect.objectContaining({ default: NEW_PROJECT_NAME })\n );\n expect(\n jest.mocked(printResultToConsoleAndExitGracefully)\n ).not.toHaveBeenCalled();\n });\n });\n\n describe(\"when user cancels the project picker (select prompt)\", () => {\n it(\"calls process.exit(1) when select throws ExitPromptError\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [{ name: TEST_PROJECT_NAME }] });\n\n const exitError = Object.assign(\n new Error(\"User force-closed the prompt\"),\n {\n name: \"ExitPromptError\",\n }\n );\n jest.mocked(select).mockRejectedValueOnce(exitError);\n\n const exitSpy = jest.spyOn(process, \"exit\").mockImplementation((() => {\n throw new Error(\"process.exit(1) called\");\n }) as never);\n\n try {\n await expect(fetchProject(baseArgv())).rejects.toThrow(\n \"process.exit(1) called\"\n );\n expect(exitSpy).toHaveBeenCalledWith(1);\n } finally {\n exitSpy.mockRestore();\n }\n });\n\n it(\"calls process.exit(1) when select throws isTtyError\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [{ name: TEST_PROJECT_NAME }] });\n\n const ttyError = Object.assign(new Error(\"Input is not a TTY\"), {\n isTtyError: true,\n });\n jest.mocked(select).mockRejectedValueOnce(ttyError);\n\n const exitSpy = jest.spyOn(process, \"exit\").mockImplementation((() => {\n throw new Error(\"process.exit(1) called\");\n }) as never);\n\n try {\n await expect(fetchProject(baseArgv())).rejects.toThrow(\n \"process.exit(1) called\"\n );\n expect(exitSpy).toHaveBeenCalledWith(1);\n } finally {\n exitSpy.mockRestore();\n }\n });\n });\n\n describe(\"when the projects list API fails\", () => {\n it(\"exits critically on a 500 response\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(500, { error: \"Internal Server Error\" });\n\n await expect(fetchProject(baseArgv())).rejects.toThrow(\n \"Process would exit\"\n );\n });\n\n it(\"exits critically with a 404 response\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(404, {});\n\n await expect(fetchProject(baseArgv())).rejects.toThrow(\n \"Process would exit\"\n );\n });\n\n it(\"does not call select or input when the projects list request fails\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(500, {});\n\n try {\n await fetchProject(baseArgv());\n } catch {\n // expected\n }\n\n expect(select).not.toHaveBeenCalled();\n expect(input).not.toHaveBeenCalled();\n });\n });\n\n describe(\"when user has no projects\", () => {\n it(\"skips the picker, prompts directly for a name, and calls the create API\", async () => {\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [] });\n\n const createScope = setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\n `/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`,\n { name: NEW_PROJECT_NAME }\n )\n .reply(200, { name: NEW_PROJECT_NAME });\n\n jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);\n\n const argv = baseArgv();\n await fetchProject(argv);\n\n expect(argv.project).toBe(NEW_PROJECT_NAME);\n expect(select).not.toHaveBeenCalled();\n expect(input).toHaveBeenCalledTimes(1);\n expect(input).toHaveBeenCalledWith(\n expect.objectContaining({\n message:\n \"You don't have any projects configured for this account. Please enter a project name to create one.\",\n })\n );\n expect(createScope.isDone()).toBe(true);\n });\n\n it(\"uses package.json name as the default input value when available\", async () => {\n jest\n .mocked(readFile)\n .mockResolvedValueOnce(\n JSON.stringify({ name: PACKAGE_JSON_NAME }) as unknown as Buffer\n );\n\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/projects\")\n .query({ accountName: TEST_ACCOUNT_NAME })\n .reply(200, { data: [] });\n\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .post(\n `/v1/projects?accountName=${encodeURIComponent(TEST_ACCOUNT_NAME)}`,\n { name: NEW_PROJECT_NAME }\n )\n .reply(200, { name: NEW_PROJECT_NAME });\n\n jest.mocked(input).mockResolvedValueOnce(NEW_PROJECT_NAME);\n\n await fetchProject(baseArgv());\n\n expect(input).toHaveBeenCalledWith(\n expect.objectContaining({\n default: PACKAGE_JSON_NAME,\n })\n );\n });\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"info.integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/info.integration.test.ts"],"names":[],"mappings":""}
|