@zuplo/cli 7.11.0 → 7.11.3
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 +80 -80
- package/node_modules/@zuplo/core/index.minified.js +85 -85
- 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-TPYCFLC7.js} +109 -109
- package/node_modules/@zuplo/runtime/out/esm/chunk-TPYCFLC7.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 +43 -43
- 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-TPYCFLC7.js.LEGAL.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read-linked-config.test.js","sourceRoot":"","sources":["../../src/common/read-linked-config.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert\";\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport readline from \"node:readline\";\nimport { afterEach, beforeEach, describe, it, mock } from \"node:test\";\nimport {\n confirmLinkedValue,\n readLinkedConfig,\n USE_LINKED_DETAILS,\n} from \"./read-linked-config.js\";\n\ndescribe(\"readLinkedConfig\", () => {\n let testDir: string;\n\n beforeEach(async () => {\n testDir = await mkdtemp(join(tmpdir(), \"zuplo-read-linked-config-test-\"));\n });\n\n afterEach(async () => {\n await rm(testDir, { recursive: true, force: true });\n });\n\n it(\"returns empty object when .env.zuplo does not exist\", async () => {\n const argv = { dir: testDir };\n const result = await readLinkedConfig(argv);\n assert.deepStrictEqual(result, {});\n });\n\n it(\"returns both fields when all are present\", async () => {\n await writeFile(\n join(testDir, \".env.zuplo\"),\n [\"ZUPLO_ACCOUNT_NAME=my-account\", \"ZUPLO_PROJECT_NAME=my-project\"].join(\n \"\\n\"\n ),\n \"utf-8\"\n );\n const argv = { dir: testDir };\n const result = await readLinkedConfig(argv);\n assert.deepStrictEqual(result, {\n accountName: \"my-account\",\n projectName: \"my-project\",\n environmentType: undefined,\n });\n });\n\n it(\"returns environmentType when ZUPLO_ENVIRONMENT_TYPE is present\", async () => {\n await writeFile(\n join(testDir, \".env.zuplo\"),\n [\n \"ZUPLO_ACCOUNT_NAME=my-account\",\n \"ZUPLO_PROJECT_NAME=my-project\",\n \"ZUPLO_ENVIRONMENT_TYPE=production\",\n ].join(\"\\n\"),\n \"utf-8\"\n );\n const argv = { dir: testDir };\n const result = await readLinkedConfig(argv);\n assert.deepStrictEqual(result, {\n accountName: \"my-account\",\n projectName: \"my-project\",\n environmentType: \"production\",\n });\n });\n\n it(\"returns undefined for fields that are missing from the file\", async () => {\n await writeFile(\n join(testDir, \".env.zuplo\"),\n \"ZUPLO_ACCOUNT_NAME=my-account\\n\",\n \"utf-8\"\n );\n const argv = { dir: testDir };\n const result = await readLinkedConfig(argv);\n assert.strictEqual(result.accountName, \"my-account\");\n assert.strictEqual(result.projectName, undefined);\n });\n\n it(\"returns undefined for fields set to empty string\", async () => {\n await writeFile(\n join(testDir, \".env.zuplo\"),\n 'ZUPLO_ACCOUNT_NAME=\\nZUPLO_PROJECT_NAME=\"\"\\n',\n \"utf-8\"\n );\n const argv = { dir: testDir };\n const result = await readLinkedConfig(argv);\n assert.strictEqual(result.accountName, undefined);\n assert.strictEqual(result.projectName, undefined);\n });\n\n it(\"caches the result on argv so the file is only read once\", async () => {\n await writeFile(\n join(testDir, \".env.zuplo\"),\n \"ZUPLO_ACCOUNT_NAME=my-account\\n\",\n \"utf-8\"\n );\n const argv: { [key: string]: unknown } = { dir: testDir };\n\n const first = await readLinkedConfig(argv);\n // Delete the file — a second call must return the cached value, not throw\n await rm(join(testDir, \".env.zuplo\"));\n const second = await readLinkedConfig(argv);\n\n assert.strictEqual(first, second); // same object reference\n assert.strictEqual(second.accountName, \"my-account\");\n });\n\n it(\"returns empty object and does not throw on a malformed file\", async () => {\n await writeFile(\n join(testDir, \".env.zuplo\"),\n \"THIS IS NOT VALID\\x00ENV\\n\",\n \"utf-8\"\n );\n const argv = { dir: testDir };\n // dotenv silently skips lines it cannot parse, so no throw is expected\n const result = await readLinkedConfig(argv);\n assert.ok(typeof result === \"object\");\n });\n\n it(\"defaults dir to '.' when argv.dir is not set\", async () => {\n // Use testDir so the test is not sensitive to whether .env.zuplo exists in the process CWD\n const argv: { [key: string]: unknown } = { dir: testDir };\n const result = await readLinkedConfig(argv);\n assert.deepStrictEqual(result, {});\n });\n});\n\ndescribe(\"confirmLinkedValue\", () => {\n let originalStdinIsTTY: PropertyDescriptor | undefined;\n let originalStdoutIsTTY: PropertyDescriptor | undefined;\n let originalCI: string | undefined;\n let hadCI: boolean;\n\n beforeEach(() => {\n originalStdinIsTTY = Object.getOwnPropertyDescriptor(\n process.stdin,\n \"isTTY\"\n );\n originalStdoutIsTTY = Object.getOwnPropertyDescriptor(\n process.stdout,\n \"isTTY\"\n );\n hadCI = Object.hasOwn(process.env, \"CI\");\n originalCI = process.env.CI;\n // Clear CI so isInteractiveTerminal() doesn't short-circuit the readline path\n // in CI environments (e.g. GitHub Actions sets CI=true automatically).\n delete process.env.CI;\n });\n\n afterEach(() => {\n mock.restoreAll();\n if (originalStdinIsTTY) {\n Object.defineProperty(process.stdin, \"isTTY\", originalStdinIsTTY);\n } else {\n delete (process.stdin as { isTTY?: boolean }).isTTY;\n }\n if (originalStdoutIsTTY) {\n Object.defineProperty(process.stdout, \"isTTY\", originalStdoutIsTTY);\n } else {\n delete (process.stdout as { isTTY?: boolean }).isTTY;\n }\n if (hadCI) {\n process.env.CI = originalCI;\n } else {\n delete process.env.CI;\n }\n });\n\n it(\"returns true immediately without prompting in non-interactive terminals\", async () => {\n // Make isInteractiveTerminal() return false by setting stdin to non-TTY.\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: false,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: false,\n configurable: true,\n });\n // readline must not be touched — if it were, the test would hang.\n const result = await confirmLinkedValue(\"Use linked account 'foo'?\");\n assert.strictEqual(result, true);\n });\n\n it(\"returns true when user enters 'y'\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"y\");\n assert.strictEqual(\n await confirmLinkedValue(\"Use linked account 'foo'?\"),\n true\n );\n });\n\n it(\"returns true when user enters 'Y' (case-insensitive)\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"Y\");\n assert.strictEqual(\n await confirmLinkedValue(\"Use linked account 'foo'?\"),\n true\n );\n });\n\n it(\"returns true when user presses Enter (empty input — default yes)\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"\");\n assert.strictEqual(\n await confirmLinkedValue(\"Use linked account 'foo'?\"),\n true\n );\n });\n\n it(\"returns false when user enters 'n'\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"n\");\n assert.strictEqual(\n await confirmLinkedValue(\"Use linked account 'foo'?\"),\n false\n );\n });\n\n it(\"returns false when user enters 'N' (case-insensitive)\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"N\");\n assert.strictEqual(\n await confirmLinkedValue(\"Use linked account 'foo'?\"),\n false\n );\n });\n\n it(\"returns false when user enters 'no'\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"no\");\n assert.strictEqual(\n await confirmLinkedValue(\"Use linked account 'foo'?\"),\n false\n );\n });\n\n it(\"returns false when user enters 'NO' (case-insensitive)\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"NO\");\n assert.strictEqual(\n await confirmLinkedValue(\"Use linked account 'foo'?\"),\n false\n );\n });\n\n it(\"falls back to defaultYes when input is unrecognized (preserves [Y/n] tolerance)\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"foo\");\n assert.strictEqual(\n await confirmLinkedValue(\"Use linked account 'foo'?\"),\n true\n );\n });\n\n describe(\"with { defaultYes: false }\", () => {\n it(\"returns false in non-interactive terminals\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: false,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: false,\n configurable: true,\n });\n const result = await confirmLinkedValue(\"Deploy to prod?\", {\n defaultYes: false,\n });\n assert.strictEqual(result, false);\n });\n\n it(\"returns false when user presses Enter (empty input — default no)\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"\");\n assert.strictEqual(\n await confirmLinkedValue(\"Deploy to prod?\", { defaultYes: false }),\n false\n );\n });\n\n it(\"returns true when user enters 'y'\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"y\");\n assert.strictEqual(\n await confirmLinkedValue(\"Deploy to prod?\", { defaultYes: false }),\n true\n );\n });\n\n it(\"returns true when user enters 'yes'\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"yes\");\n assert.strictEqual(\n await confirmLinkedValue(\"Deploy to prod?\", { defaultYes: false }),\n true\n );\n });\n\n it(\"returns false when input is unrecognized (falls back to default)\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n stubReadlineAnswer(\"foo\");\n assert.strictEqual(\n await confirmLinkedValue(\"Deploy to prod?\", { defaultYes: false }),\n false\n );\n });\n\n it(\"renders the prompt with [y/N] hint\", async () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n let capturedPrompt = \"\";\n mock.method(readline, \"createInterface\", () => ({\n on: () => {},\n question: (prompt: string, callback: (a: string) => void) => {\n capturedPrompt = prompt;\n callback(\"\");\n },\n close: mock.fn(),\n }));\n await confirmLinkedValue(\"Deploy to prod?\", { defaultYes: false });\n assert.match(capturedPrompt, /\\[y\\/N\\]/);\n });\n });\n\n it(\"exits the process when SIGINT is emitted on the readline interface\", () => {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: true,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: true,\n configurable: true,\n });\n\n const exitStub = mock.method(process, \"exit\", () => {\n throw new Error(\"process.exit called\");\n });\n\n let sigintEmitter: (() => void) | undefined;\n mock.method(readline, \"createInterface\", () => ({\n on: (event: string, handler: () => void) => {\n if (event === \"SIGINT\") sigintEmitter = handler;\n },\n question: () => {\n /* never resolves */\n },\n close: mock.fn(),\n }));\n\n // Start the prompt — it won't resolve (question callback never fires)\n void confirmLinkedValue(\"Use linked account 'foo'?\");\n\n // Emitting SIGINT calls process.exit(1) synchronously; our mock throws to intercept it\n assert.throws(() => sigintEmitter!(), /process\\.exit called/);\n assert.strictEqual(exitStub.mock.calls[0].arguments[0], 1);\n });\n});\n\ndescribe(\"USE_LINKED_DETAILS\", () => {\n let testDir: string;\n\n beforeEach(async () => {\n testDir = await mkdtemp(join(tmpdir(), \"zuplo-use-linked-details-test-\"));\n });\n\n afterEach(async () => {\n await rm(testDir, { recursive: true, force: true });\n });\n\n it(\"is exported and has the expected value\", () => {\n assert.strictEqual(USE_LINKED_DETAILS, \"useLinkedDetails\");\n });\n\n it(\"setting it to false on argv does not collide with the internal cache key\", async () => {\n // The useLinkedDetails key must not collide with the internal cache key so that\n // readLinkedConfig continues to work even when useLinkedDetails is false.\n const argv: { [key: string]: unknown } = {\n dir: testDir,\n [USE_LINKED_DETAILS]: false,\n };\n const result = await readLinkedConfig(argv);\n assert.deepStrictEqual(result, {});\n });\n});\n\n/**\n * Helper: stub readline.createInterface so that the `question` callback is\n * called synchronously with `answer`, simulating user input.\n */\nfunction stubReadlineAnswer(answer: string) {\n mock.method(readline, \"createInterface\", () => ({\n on: () => {\n /* ignore SIGINT in these tests */\n },\n question: (_prompt: string, callback: (a: string) => void) => {\n callback(answer);\n },\n close: mock.fn(),\n }));\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.test.d.ts","sourceRoot":"","sources":["../../src/common/terminal.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert";
|
|
2
|
-
import { afterEach, beforeEach, describe, it } from "node:test";
|
|
3
|
-
import { isInteractiveTerminal } from "./terminal.js";
|
|
4
|
-
describe("isInteractiveTerminal", () => {
|
|
5
|
-
let originalStdinIsTTY;
|
|
6
|
-
let originalStdoutIsTTY;
|
|
7
|
-
let originalCI;
|
|
8
|
-
let hadCI;
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
originalStdinIsTTY = Object.getOwnPropertyDescriptor(process.stdin, "isTTY");
|
|
11
|
-
originalStdoutIsTTY = Object.getOwnPropertyDescriptor(process.stdout, "isTTY");
|
|
12
|
-
hadCI = Object.hasOwn(process.env, "CI");
|
|
13
|
-
originalCI = process.env.CI;
|
|
14
|
-
});
|
|
15
|
-
afterEach(() => {
|
|
16
|
-
if (originalStdinIsTTY) {
|
|
17
|
-
Object.defineProperty(process.stdin, "isTTY", originalStdinIsTTY);
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
delete process.stdin.isTTY;
|
|
21
|
-
}
|
|
22
|
-
if (originalStdoutIsTTY) {
|
|
23
|
-
Object.defineProperty(process.stdout, "isTTY", originalStdoutIsTTY);
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
delete process.stdout.isTTY;
|
|
27
|
-
}
|
|
28
|
-
if (hadCI) {
|
|
29
|
-
process.env.CI = originalCI;
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
delete process.env.CI;
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
function setTTY(stdin, stdout) {
|
|
36
|
-
Object.defineProperty(process.stdin, "isTTY", {
|
|
37
|
-
value: stdin,
|
|
38
|
-
configurable: true,
|
|
39
|
-
});
|
|
40
|
-
Object.defineProperty(process.stdout, "isTTY", {
|
|
41
|
-
value: stdout,
|
|
42
|
-
configurable: true,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
it("returns true when both TTYs are interactive and CI is unset", () => {
|
|
46
|
-
setTTY(true, true);
|
|
47
|
-
delete process.env.CI;
|
|
48
|
-
assert.strictEqual(isInteractiveTerminal(), true);
|
|
49
|
-
});
|
|
50
|
-
it("returns false when stdin is not a TTY", () => {
|
|
51
|
-
setTTY(false, true);
|
|
52
|
-
delete process.env.CI;
|
|
53
|
-
assert.strictEqual(isInteractiveTerminal(), false);
|
|
54
|
-
});
|
|
55
|
-
it("returns false when stdout is not a TTY", () => {
|
|
56
|
-
setTTY(true, false);
|
|
57
|
-
delete process.env.CI;
|
|
58
|
-
assert.strictEqual(isInteractiveTerminal(), false);
|
|
59
|
-
});
|
|
60
|
-
it("returns false when neither TTY is interactive", () => {
|
|
61
|
-
setTTY(false, false);
|
|
62
|
-
delete process.env.CI;
|
|
63
|
-
assert.strictEqual(isInteractiveTerminal(), false);
|
|
64
|
-
});
|
|
65
|
-
it('returns false when CI is "true"', () => {
|
|
66
|
-
setTTY(true, true);
|
|
67
|
-
process.env.CI = "true";
|
|
68
|
-
assert.strictEqual(isInteractiveTerminal(), false);
|
|
69
|
-
});
|
|
70
|
-
it('returns false when CI is "1" (Vercel and others)', () => {
|
|
71
|
-
setTTY(true, true);
|
|
72
|
-
process.env.CI = "1";
|
|
73
|
-
assert.strictEqual(isInteractiveTerminal(), false);
|
|
74
|
-
});
|
|
75
|
-
it('returns false when CI is "True" (AppVeyor)', () => {
|
|
76
|
-
setTTY(true, true);
|
|
77
|
-
process.env.CI = "True";
|
|
78
|
-
assert.strictEqual(isInteractiveTerminal(), false);
|
|
79
|
-
});
|
|
80
|
-
it('returns false when CI is "yes"', () => {
|
|
81
|
-
setTTY(true, true);
|
|
82
|
-
process.env.CI = "yes";
|
|
83
|
-
assert.strictEqual(isInteractiveTerminal(), false);
|
|
84
|
-
});
|
|
85
|
-
it('returns true when CI is "false" (explicit opt-out of CI mode)', () => {
|
|
86
|
-
setTTY(true, true);
|
|
87
|
-
process.env.CI = "false";
|
|
88
|
-
assert.strictEqual(isInteractiveTerminal(), true);
|
|
89
|
-
});
|
|
90
|
-
it('returns true when CI is "0" (explicit opt-out of CI mode)', () => {
|
|
91
|
-
setTTY(true, true);
|
|
92
|
-
process.env.CI = "0";
|
|
93
|
-
assert.strictEqual(isInteractiveTerminal(), true);
|
|
94
|
-
});
|
|
95
|
-
it("returns true when CI is an empty string", () => {
|
|
96
|
-
setTTY(true, true);
|
|
97
|
-
process.env.CI = "";
|
|
98
|
-
assert.strictEqual(isInteractiveTerminal(), true);
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
//# sourceMappingURL=terminal.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.test.js","sourceRoot":"","sources":["../../src/common/terminal.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport { isInteractiveTerminal } from \"./terminal.js\";\n\ndescribe(\"isInteractiveTerminal\", () => {\n let originalStdinIsTTY: PropertyDescriptor | undefined;\n let originalStdoutIsTTY: PropertyDescriptor | undefined;\n let originalCI: string | undefined;\n let hadCI: boolean;\n\n beforeEach(() => {\n originalStdinIsTTY = Object.getOwnPropertyDescriptor(\n process.stdin,\n \"isTTY\"\n );\n originalStdoutIsTTY = Object.getOwnPropertyDescriptor(\n process.stdout,\n \"isTTY\"\n );\n hadCI = Object.hasOwn(process.env, \"CI\");\n originalCI = process.env.CI;\n });\n\n afterEach(() => {\n if (originalStdinIsTTY) {\n Object.defineProperty(process.stdin, \"isTTY\", originalStdinIsTTY);\n } else {\n delete (process.stdin as { isTTY?: boolean }).isTTY;\n }\n if (originalStdoutIsTTY) {\n Object.defineProperty(process.stdout, \"isTTY\", originalStdoutIsTTY);\n } else {\n delete (process.stdout as { isTTY?: boolean }).isTTY;\n }\n if (hadCI) {\n process.env.CI = originalCI;\n } else {\n delete process.env.CI;\n }\n });\n\n function setTTY(stdin: boolean, stdout: boolean) {\n Object.defineProperty(process.stdin, \"isTTY\", {\n value: stdin,\n configurable: true,\n });\n Object.defineProperty(process.stdout, \"isTTY\", {\n value: stdout,\n configurable: true,\n });\n }\n\n it(\"returns true when both TTYs are interactive and CI is unset\", () => {\n setTTY(true, true);\n delete process.env.CI;\n assert.strictEqual(isInteractiveTerminal(), true);\n });\n\n it(\"returns false when stdin is not a TTY\", () => {\n setTTY(false, true);\n delete process.env.CI;\n assert.strictEqual(isInteractiveTerminal(), false);\n });\n\n it(\"returns false when stdout is not a TTY\", () => {\n setTTY(true, false);\n delete process.env.CI;\n assert.strictEqual(isInteractiveTerminal(), false);\n });\n\n it(\"returns false when neither TTY is interactive\", () => {\n setTTY(false, false);\n delete process.env.CI;\n assert.strictEqual(isInteractiveTerminal(), false);\n });\n\n it('returns false when CI is \"true\"', () => {\n setTTY(true, true);\n process.env.CI = \"true\";\n assert.strictEqual(isInteractiveTerminal(), false);\n });\n\n it('returns false when CI is \"1\" (Vercel and others)', () => {\n setTTY(true, true);\n process.env.CI = \"1\";\n assert.strictEqual(isInteractiveTerminal(), false);\n });\n\n it('returns false when CI is \"True\" (AppVeyor)', () => {\n setTTY(true, true);\n process.env.CI = \"True\";\n assert.strictEqual(isInteractiveTerminal(), false);\n });\n\n it('returns false when CI is \"yes\"', () => {\n setTTY(true, true);\n process.env.CI = \"yes\";\n assert.strictEqual(isInteractiveTerminal(), false);\n });\n\n it('returns true when CI is \"false\" (explicit opt-out of CI mode)', () => {\n setTTY(true, true);\n process.env.CI = \"false\";\n assert.strictEqual(isInteractiveTerminal(), true);\n });\n\n it('returns true when CI is \"0\" (explicit opt-out of CI mode)', () => {\n setTTY(true, true);\n process.env.CI = \"0\";\n assert.strictEqual(isInteractiveTerminal(), true);\n });\n\n it(\"returns true when CI is an empty string\", () => {\n setTTY(true, true);\n process.env.CI = \"\";\n assert.strictEqual(isInteractiveTerminal(), true);\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-environment-prompt-choices.test.d.ts","sourceRoot":"","sources":["../../../src/common/utils/build-environment-prompt-choices.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert";
|
|
2
|
-
import { describe, it } from "node:test";
|
|
3
|
-
import { buildEnvironmentPromptChoices } from "./build-environment-prompt-choices.js";
|
|
4
|
-
function makeEnv(environmentType, name, branchName) {
|
|
5
|
-
return {
|
|
6
|
-
name,
|
|
7
|
-
accountName: "acme",
|
|
8
|
-
projectName: "my-project",
|
|
9
|
-
createdOn: null,
|
|
10
|
-
branchName,
|
|
11
|
-
environmentType,
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
function isSeparator(item) {
|
|
15
|
-
return (item != null &&
|
|
16
|
-
typeof item === "object" &&
|
|
17
|
-
item.type === "separator");
|
|
18
|
-
}
|
|
19
|
-
describe("buildEnvironmentPromptChoices", () => {
|
|
20
|
-
it("groups choices with a Separator header per non-empty bucket", () => {
|
|
21
|
-
const envs = [
|
|
22
|
-
makeEnv("preview", "env-test-staging-1", "staging"),
|
|
23
|
-
makeEnv("working_copy", "env-test-main-abc", "main"),
|
|
24
|
-
makeEnv("production", "env-test-prod-xyz", "main"),
|
|
25
|
-
makeEnv("preview", "env-test-feature-2", "feature-auth"),
|
|
26
|
-
];
|
|
27
|
-
const choices = buildEnvironmentPromptChoices(envs);
|
|
28
|
-
assert.strictEqual(choices.length, 7);
|
|
29
|
-
assert.ok(isSeparator(choices[0]));
|
|
30
|
-
assert.ok(isSeparator(choices[2]));
|
|
31
|
-
assert.ok(isSeparator(choices[5]));
|
|
32
|
-
assert.deepStrictEqual(choices[1], {
|
|
33
|
-
name: "env-test-main-abc — recommended for local development",
|
|
34
|
-
value: "env-test-main-abc",
|
|
35
|
-
});
|
|
36
|
-
assert.deepStrictEqual(choices[3], {
|
|
37
|
-
name: "feature-auth",
|
|
38
|
-
value: "env-test-feature-2",
|
|
39
|
-
description: "env-test-feature-2",
|
|
40
|
-
});
|
|
41
|
-
assert.deepStrictEqual(choices[4], {
|
|
42
|
-
name: "staging",
|
|
43
|
-
value: "env-test-staging-1",
|
|
44
|
-
description: "env-test-staging-1",
|
|
45
|
-
});
|
|
46
|
-
assert.deepStrictEqual(choices[6], {
|
|
47
|
-
name: "main",
|
|
48
|
-
value: "env-test-prod-xyz",
|
|
49
|
-
description: "env-test-prod-xyz",
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
it("skips a Separator for an empty bucket", () => {
|
|
53
|
-
const envs = [
|
|
54
|
-
makeEnv("preview", "env-test-staging-1", "staging"),
|
|
55
|
-
makeEnv("preview", "env-test-feature-2", "feature-auth"),
|
|
56
|
-
];
|
|
57
|
-
const choices = buildEnvironmentPromptChoices(envs);
|
|
58
|
-
const separators = choices.filter(isSeparator);
|
|
59
|
-
assert.strictEqual(separators.length, 1);
|
|
60
|
-
assert.strictEqual(choices.length, 3);
|
|
61
|
-
});
|
|
62
|
-
it("returns an empty array when there are no envs", () => {
|
|
63
|
-
assert.deepStrictEqual(buildEnvironmentPromptChoices([]), []);
|
|
64
|
-
});
|
|
65
|
-
it("normalizes all working-copy type spellings into the working-copy bucket", () => {
|
|
66
|
-
const envs = [
|
|
67
|
-
makeEnv("development", "env-test-main-1", "main"),
|
|
68
|
-
makeEnv("working_copy", "env-test-main-2", "main"),
|
|
69
|
-
makeEnv("working-copy", "env-test-main-3", "main"),
|
|
70
|
-
];
|
|
71
|
-
const choices = buildEnvironmentPromptChoices(envs);
|
|
72
|
-
assert.strictEqual(choices.length, 4);
|
|
73
|
-
assert.ok(isSeparator(choices[0]));
|
|
74
|
-
});
|
|
75
|
-
it("places envs with unknown environmentType into an 'Other' bucket at the end", () => {
|
|
76
|
-
const envs = [
|
|
77
|
-
makeEnv("preview", "env-test-staging-1", "staging"),
|
|
78
|
-
makeEnv("staging", "env-test-mystery-zzz", "mystery-branch"),
|
|
79
|
-
];
|
|
80
|
-
const choices = buildEnvironmentPromptChoices(envs);
|
|
81
|
-
assert.strictEqual(choices.length, 4);
|
|
82
|
-
assert.ok(isSeparator(choices[0]));
|
|
83
|
-
assert.deepStrictEqual(choices[1], {
|
|
84
|
-
name: "staging",
|
|
85
|
-
value: "env-test-staging-1",
|
|
86
|
-
description: "env-test-staging-1",
|
|
87
|
-
});
|
|
88
|
-
assert.ok(isSeparator(choices[2]));
|
|
89
|
-
assert.strictEqual(choices[2].separator, "── Other ──");
|
|
90
|
-
assert.deepStrictEqual(choices[3], {
|
|
91
|
-
name: "mystery-branch",
|
|
92
|
-
value: "env-test-mystery-zzz",
|
|
93
|
-
description: "env-test-mystery-zzz",
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
//# sourceMappingURL=build-environment-prompt-choices.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-environment-prompt-choices.test.js","sourceRoot":"","sources":["../../../src/common/utils/build-environment-prompt-choices.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AAEtF,SAAS,OAAO,CACd,eAA+C,EAC/C,IAAY,EACZ,UAAkB;IAElB,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,IAAI;QACf,UAAU;QACV,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IAChC,OAAO,CACL,IAAI,IAAI,IAAI;QACZ,OAAO,IAAI,KAAK,QAAQ;QACvB,IAA2B,CAAC,IAAI,KAAK,WAAW,CAClD,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,IAAI,GAAkB;YAC1B,OAAO,CAAC,SAAS,EAAE,oBAAoB,EAAE,SAAS,CAAC;YACnD,OAAO,CAAC,cAAc,EAAE,mBAAmB,EAAE,MAAM,CAAC;YACpD,OAAO,CAAC,YAAY,EAAE,mBAAmB,EAAE,MAAM,CAAC;YAClD,OAAO,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,CAAC;SACzD,CAAC;QAEF,MAAM,OAAO,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAGpD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAGnC,MAAM,CAAC,eAAe,CACpB,OAAO,CAAC,CAAC,CAA0D,EACnE;YACE,IAAI,EAAE,uDAAuD;YAC7D,KAAK,EAAE,mBAAmB;SAC3B,CACF,CAAC;QAGF,MAAM,CAAC,eAAe,CACpB,OAAO,CAAC,CAAC,CAA0D,EACnE;YACE,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,oBAAoB;YAC3B,WAAW,EAAE,oBAAoB;SAClC,CACF,CAAC;QACF,MAAM,CAAC,eAAe,CACpB,OAAO,CAAC,CAAC,CAA0D,EACnE;YACE,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,oBAAoB;YAC3B,WAAW,EAAE,oBAAoB;SAClC,CACF,CAAC;QAGF,MAAM,CAAC,eAAe,CACpB,OAAO,CAAC,CAAC,CAA0D,EACnE;YACE,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE,mBAAmB;SACjC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAkB;YAC1B,OAAO,CAAC,SAAS,EAAE,oBAAoB,EAAE,SAAS,CAAC;YACnD,OAAO,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,CAAC;SACzD,CAAC;QAEF,MAAM,OAAO,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAGpD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,eAAe,CAAC,6BAA6B,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,IAAI,GAAkB;YAC1B,OAAO,CAAC,aAAa,EAAE,iBAAiB,EAAE,MAAM,CAAC;YACjD,OAAO,CAAC,cAAc,EAAE,iBAAiB,EAAE,MAAM,CAAC;YAClD,OAAO,CAAC,cAAc,EAAE,iBAAiB,EAAE,MAAM,CAAC;SACnD,CAAC;QAEF,MAAM,OAAO,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAGpD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAMH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,IAAI,GAAkB;YAC1B,OAAO,CAAC,SAAS,EAAE,oBAAoB,EAAE,SAAS,CAAC;YAGnD,OAAO,CACL,SAAsD,EACtD,sBAAsB,EACtB,gBAAgB,CACjB;SACF,CAAC;QAEF,MAAM,OAAO,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;QAEpD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,eAAe,CACpB,OAAO,CAAC,CAAC,CAA0D,EACnE;YACE,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,oBAAoB;YAC3B,WAAW,EAAE,oBAAoB;SAClC,CACF,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,WAAW,CAAE,OAAO,CAAC,CAAC,CAAe,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACvE,MAAM,CAAC,eAAe,CACpB,OAAO,CAAC,CAAC,CAA0D,EACnE;YACE,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,sBAAsB;YAC7B,WAAW,EAAE,sBAAsB;SACpC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import assert from \"node:assert\";\nimport { describe, it } from \"node:test\";\nimport { Separator } from \"@inquirer/prompts\";\nimport { Environment } from \"../api/lib.js\";\nimport { buildEnvironmentPromptChoices } from \"./build-environment-prompt-choices.js\";\n\nfunction makeEnv(\n environmentType: Environment[\"environmentType\"],\n name: string,\n branchName: string\n): Environment {\n return {\n name,\n accountName: \"acme\",\n projectName: \"my-project\",\n createdOn: null,\n branchName,\n environmentType,\n };\n}\n\nfunction isSeparator(item: unknown): item is Separator {\n return (\n item != null &&\n typeof item === \"object\" &&\n (item as { type?: unknown }).type === \"separator\"\n );\n}\n\ndescribe(\"buildEnvironmentPromptChoices\", () => {\n it(\"groups choices with a Separator header per non-empty bucket\", () => {\n const envs: Environment[] = [\n makeEnv(\"preview\", \"env-test-staging-1\", \"staging\"),\n makeEnv(\"working_copy\", \"env-test-main-abc\", \"main\"),\n makeEnv(\"production\", \"env-test-prod-xyz\", \"main\"),\n makeEnv(\"preview\", \"env-test-feature-2\", \"feature-auth\"),\n ];\n\n const choices = buildEnvironmentPromptChoices(envs);\n\n // Expected shape: [Sep(\"Working copy\"), wc, Sep(\"Preview\"), feat, staging, Sep(\"Production\"), prod]\n assert.strictEqual(choices.length, 7);\n assert.ok(isSeparator(choices[0]));\n assert.ok(isSeparator(choices[2]));\n assert.ok(isSeparator(choices[5]));\n\n // Working copy bucket\n assert.deepStrictEqual(\n choices[1] as { name: string; value: string; description?: string },\n {\n name: \"env-test-main-abc — recommended for local development\",\n value: \"env-test-main-abc\",\n }\n );\n\n // Preview bucket — alpha sorted, branchName as visible name, slug as description\n assert.deepStrictEqual(\n choices[3] as { name: string; value: string; description?: string },\n {\n name: \"feature-auth\",\n value: \"env-test-feature-2\",\n description: \"env-test-feature-2\",\n }\n );\n assert.deepStrictEqual(\n choices[4] as { name: string; value: string; description?: string },\n {\n name: \"staging\",\n value: \"env-test-staging-1\",\n description: \"env-test-staging-1\",\n }\n );\n\n // Production bucket\n assert.deepStrictEqual(\n choices[6] as { name: string; value: string; description?: string },\n {\n name: \"main\",\n value: \"env-test-prod-xyz\",\n description: \"env-test-prod-xyz\",\n }\n );\n });\n\n it(\"skips a Separator for an empty bucket\", () => {\n const envs: Environment[] = [\n makeEnv(\"preview\", \"env-test-staging-1\", \"staging\"),\n makeEnv(\"preview\", \"env-test-feature-2\", \"feature-auth\"),\n ];\n\n const choices = buildEnvironmentPromptChoices(envs);\n\n // Only one Separator — for the preview bucket\n const separators = choices.filter(isSeparator);\n assert.strictEqual(separators.length, 1);\n assert.strictEqual(choices.length, 3);\n });\n\n it(\"returns an empty array when there are no envs\", () => {\n assert.deepStrictEqual(buildEnvironmentPromptChoices([]), []);\n });\n\n it(\"normalizes all working-copy type spellings into the working-copy bucket\", () => {\n const envs: Environment[] = [\n makeEnv(\"development\", \"env-test-main-1\", \"main\"),\n makeEnv(\"working_copy\", \"env-test-main-2\", \"main\"),\n makeEnv(\"working-copy\", \"env-test-main-3\", \"main\"),\n ];\n\n const choices = buildEnvironmentPromptChoices(envs);\n\n // 1 Separator + 3 entries\n assert.strictEqual(choices.length, 4);\n assert.ok(isSeparator(choices[0]));\n });\n\n // Regression: an env whose normalized type isn't one of the three known\n // buckets must still be selectable. Without the \"Other\" fallback bucket a\n // future server-side env type or a malformed `environmentType` value would\n // silently disappear from the prompt.\n it(\"places envs with unknown environmentType into an 'Other' bucket at the end\", () => {\n const envs: Environment[] = [\n makeEnv(\"preview\", \"env-test-staging-1\", \"staging\"),\n // Cast through unknown to bypass the closed TS union — simulates the\n // server returning a value the CLI doesn't yet know about.\n makeEnv(\n \"staging\" as unknown as Environment[\"environmentType\"],\n \"env-test-mystery-zzz\",\n \"mystery-branch\"\n ),\n ];\n\n const choices = buildEnvironmentPromptChoices(envs);\n\n assert.strictEqual(choices.length, 4);\n assert.ok(isSeparator(choices[0]));\n assert.deepStrictEqual(\n choices[1] as { name: string; value: string; description?: string },\n {\n name: \"staging\",\n value: \"env-test-staging-1\",\n description: \"env-test-staging-1\",\n }\n );\n assert.ok(isSeparator(choices[2]));\n assert.strictEqual((choices[2] as Separator).separator, \"── Other ──\");\n assert.deepStrictEqual(\n choices[3] as { name: string; value: string; description?: string },\n {\n name: \"mystery-branch\",\n value: \"env-test-mystery-zzz\",\n description: \"env-test-mystery-zzz\",\n }\n );\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format-environment-type.test.d.ts","sourceRoot":"","sources":["../../../src/common/utils/format-environment-type.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert";
|
|
2
|
-
import { describe, it } from "node:test";
|
|
3
|
-
import { formatEnvironmentTypeLabel } from "./format-environment-type.js";
|
|
4
|
-
describe("formatEnvironmentTypeLabel", () => {
|
|
5
|
-
it("returns 'production' unchanged", () => {
|
|
6
|
-
assert.strictEqual(formatEnvironmentTypeLabel("production"), "production");
|
|
7
|
-
});
|
|
8
|
-
it("returns 'preview' unchanged", () => {
|
|
9
|
-
assert.strictEqual(formatEnvironmentTypeLabel("preview"), "preview");
|
|
10
|
-
});
|
|
11
|
-
it("maps 'development' to 'working-copy'", () => {
|
|
12
|
-
assert.strictEqual(formatEnvironmentTypeLabel("development"), "working-copy");
|
|
13
|
-
});
|
|
14
|
-
it("maps 'working_copy' to 'working-copy'", () => {
|
|
15
|
-
assert.strictEqual(formatEnvironmentTypeLabel("working_copy"), "working-copy");
|
|
16
|
-
});
|
|
17
|
-
it("maps 'working-copy' to 'working-copy'", () => {
|
|
18
|
-
assert.strictEqual(formatEnvironmentTypeLabel("working-copy"), "working-copy");
|
|
19
|
-
});
|
|
20
|
-
it("lowercases the input", () => {
|
|
21
|
-
assert.strictEqual(formatEnvironmentTypeLabel("PRODUCTION"), "production");
|
|
22
|
-
assert.strictEqual(formatEnvironmentTypeLabel("Development"), "working-copy");
|
|
23
|
-
});
|
|
24
|
-
it("passes unknown types through (lowercased)", () => {
|
|
25
|
-
assert.strictEqual(formatEnvironmentTypeLabel("Some-Future-Type"), "some-future-type");
|
|
26
|
-
});
|
|
27
|
-
it("trims surrounding whitespace before matching", () => {
|
|
28
|
-
assert.strictEqual(formatEnvironmentTypeLabel(" development "), "working-copy");
|
|
29
|
-
assert.strictEqual(formatEnvironmentTypeLabel("\tproduction\n"), "production");
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
//# sourceMappingURL=format-environment-type.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format-environment-type.test.js","sourceRoot":"","sources":["../../../src/common/utils/format-environment-type.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,WAAW,CAAC,0BAA0B,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,WAAW,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,WAAW,CAChB,0BAA0B,CAAC,aAAa,CAAC,EACzC,cAAc,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,WAAW,CAChB,0BAA0B,CAAC,cAAc,CAAC,EAC1C,cAAc,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,WAAW,CAChB,0BAA0B,CAAC,cAAc,CAAC,EAC1C,cAAc,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,WAAW,CAAC,0BAA0B,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;QAC3E,MAAM,CAAC,WAAW,CAChB,0BAA0B,CAAC,aAAa,CAAC,EACzC,cAAc,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,WAAW,CAChB,0BAA0B,CAAC,kBAAkB,CAAC,EAC9C,kBAAkB,CACnB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,WAAW,CAChB,0BAA0B,CAAC,iBAAiB,CAAC,EAC7C,cAAc,CACf,CAAC;QACF,MAAM,CAAC,WAAW,CAChB,0BAA0B,CAAC,gBAAgB,CAAC,EAC5C,YAAY,CACb,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import assert from \"node:assert\";\nimport { describe, it } from \"node:test\";\nimport { formatEnvironmentTypeLabel } from \"./format-environment-type.js\";\n\ndescribe(\"formatEnvironmentTypeLabel\", () => {\n it(\"returns 'production' unchanged\", () => {\n assert.strictEqual(formatEnvironmentTypeLabel(\"production\"), \"production\");\n });\n\n it(\"returns 'preview' unchanged\", () => {\n assert.strictEqual(formatEnvironmentTypeLabel(\"preview\"), \"preview\");\n });\n\n it(\"maps 'development' to 'working-copy'\", () => {\n assert.strictEqual(\n formatEnvironmentTypeLabel(\"development\"),\n \"working-copy\"\n );\n });\n\n it(\"maps 'working_copy' to 'working-copy'\", () => {\n assert.strictEqual(\n formatEnvironmentTypeLabel(\"working_copy\"),\n \"working-copy\"\n );\n });\n\n it(\"maps 'working-copy' to 'working-copy'\", () => {\n assert.strictEqual(\n formatEnvironmentTypeLabel(\"working-copy\"),\n \"working-copy\"\n );\n });\n\n it(\"lowercases the input\", () => {\n assert.strictEqual(formatEnvironmentTypeLabel(\"PRODUCTION\"), \"production\");\n assert.strictEqual(\n formatEnvironmentTypeLabel(\"Development\"),\n \"working-copy\"\n );\n });\n\n it(\"passes unknown types through (lowercased)\", () => {\n assert.strictEqual(\n formatEnvironmentTypeLabel(\"Some-Future-Type\"),\n \"some-future-type\"\n );\n });\n\n it(\"trims surrounding whitespace before matching\", () => {\n assert.strictEqual(\n formatEnvironmentTypeLabel(\" development \"),\n \"working-copy\"\n );\n assert.strictEqual(\n formatEnvironmentTypeLabel(\"\\tproduction\\n\"),\n \"production\"\n );\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pnpm-lifecycle.test.d.ts","sourceRoot":"","sources":["../../../src/common/utils/pnpm-lifecycle.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert";
|
|
2
|
-
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
-
import os from "node:os";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import { afterEach, beforeEach, describe, it } from "node:test";
|
|
6
|
-
import { findCliModulesYaml, formatCommand, getBlockedCriticalDeps, isPnpmDlx, readBlockedBuilds, } from "./pnpm-lifecycle.js";
|
|
7
|
-
describe("pnpm-lifecycle", () => {
|
|
8
|
-
let tmp;
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
tmp = mkdtempSync(path.join(os.tmpdir(), "zup-pnpm-"));
|
|
11
|
-
});
|
|
12
|
-
afterEach(() => {
|
|
13
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
14
|
-
});
|
|
15
|
-
function writeModulesYaml(contents, dir = tmp) {
|
|
16
|
-
const nm = path.join(dir, "node_modules");
|
|
17
|
-
mkdirSync(nm, { recursive: true });
|
|
18
|
-
const file = path.join(nm, ".modules.yaml");
|
|
19
|
-
writeFileSync(file, contents);
|
|
20
|
-
return file;
|
|
21
|
-
}
|
|
22
|
-
describe("findCliModulesYaml", () => {
|
|
23
|
-
it("finds .modules.yaml in the start directory", () => {
|
|
24
|
-
const file = writeModulesYaml("ignoredBuilds: []\n");
|
|
25
|
-
assert.strictEqual(findCliModulesYaml(tmp), file);
|
|
26
|
-
});
|
|
27
|
-
it("walks up to find .modules.yaml in an ancestor", () => {
|
|
28
|
-
const file = writeModulesYaml("ignoredBuilds: []\n");
|
|
29
|
-
const nested = path.join(tmp, "a", "b", "c");
|
|
30
|
-
mkdirSync(nested, { recursive: true });
|
|
31
|
-
assert.strictEqual(findCliModulesYaml(nested), file);
|
|
32
|
-
});
|
|
33
|
-
it("returns null when no .modules.yaml exists in tree", () => {
|
|
34
|
-
const nested = path.join(tmp, "a", "b");
|
|
35
|
-
mkdirSync(nested, { recursive: true });
|
|
36
|
-
assert.strictEqual(findCliModulesYaml(nested), null);
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
describe("readBlockedBuilds", () => {
|
|
40
|
-
it("returns [] when file is missing", () => {
|
|
41
|
-
const missing = path.join(tmp, "does-not-exist.yaml");
|
|
42
|
-
assert.deepStrictEqual(readBlockedBuilds(missing), []);
|
|
43
|
-
});
|
|
44
|
-
it("returns [] for malformed YAML", () => {
|
|
45
|
-
const file = writeModulesYaml("not: valid: yaml: [\n");
|
|
46
|
-
assert.deepStrictEqual(readBlockedBuilds(file), []);
|
|
47
|
-
});
|
|
48
|
-
it("strips @version suffix from package names", () => {
|
|
49
|
-
const file = writeModulesYaml("ignoredBuilds:\n - deno@2.3.1\n - workerd@1.20241230.0\n");
|
|
50
|
-
const result = readBlockedBuilds(file).sort();
|
|
51
|
-
assert.deepStrictEqual(result, ["deno", "workerd"]);
|
|
52
|
-
});
|
|
53
|
-
it("preserves leading @ on scoped packages", () => {
|
|
54
|
-
const file = writeModulesYaml("ignoredBuilds:\n - '@swc/core@1.10.18'\n");
|
|
55
|
-
assert.deepStrictEqual(readBlockedBuilds(file), ["@swc/core"]);
|
|
56
|
-
});
|
|
57
|
-
it("dedupes repeated ignoredBuilds entries", () => {
|
|
58
|
-
const file = writeModulesYaml([
|
|
59
|
-
"ignoredBuilds:",
|
|
60
|
-
" - deno@2.3.1",
|
|
61
|
-
" - esbuild@0.25.2",
|
|
62
|
-
" - deno@2.3.1",
|
|
63
|
-
"",
|
|
64
|
-
].join("\n"));
|
|
65
|
-
const result = readBlockedBuilds(file).sort();
|
|
66
|
-
assert.deepStrictEqual(result, ["deno", "esbuild"]);
|
|
67
|
-
});
|
|
68
|
-
it("ignores pendingBuilds, which goes stale and blocked a working install", () => {
|
|
69
|
-
const file = writeModulesYaml([
|
|
70
|
-
"ignoredBuilds: []",
|
|
71
|
-
"pendingBuilds:",
|
|
72
|
-
" - '@swc/core@1.15.40'",
|
|
73
|
-
" - workerd@1.20241230.0",
|
|
74
|
-
"",
|
|
75
|
-
].join("\n"));
|
|
76
|
-
assert.deepStrictEqual(readBlockedBuilds(file), [], "pendingBuilds must not mark a dependency blocked — it is a queue of " +
|
|
77
|
-
"intended builds, not evidence that any of them failed");
|
|
78
|
-
});
|
|
79
|
-
it("still reports a dependency the user declined to build", () => {
|
|
80
|
-
const file = writeModulesYaml([
|
|
81
|
-
"ignoredBuilds:",
|
|
82
|
-
" - '@swc/core@1.15.40'",
|
|
83
|
-
"pendingBuilds:",
|
|
84
|
-
" - workerd@1.20241230.0",
|
|
85
|
-
"",
|
|
86
|
-
].join("\n"));
|
|
87
|
-
assert.deepStrictEqual(readBlockedBuilds(file), ["@swc/core"]);
|
|
88
|
-
});
|
|
89
|
-
it("returns [] when both lists are empty", () => {
|
|
90
|
-
const file = writeModulesYaml("ignoredBuilds: []\npendingBuilds: []\n");
|
|
91
|
-
assert.deepStrictEqual(readBlockedBuilds(file), []);
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
describe("isPnpmDlx", () => {
|
|
95
|
-
it("detects macOS pnpm dlx cache paths", () => {
|
|
96
|
-
assert.strictEqual(isPnpmDlx("/Users/me/Library/Caches/pnpm/dlx/abc/node_modules/foo"), true);
|
|
97
|
-
});
|
|
98
|
-
it("detects Linux pnpm dlx cache paths", () => {
|
|
99
|
-
assert.strictEqual(isPnpmDlx("/home/me/.local/share/pnpm/dlx/abc/node_modules/foo"), true);
|
|
100
|
-
});
|
|
101
|
-
it("detects Windows pnpm-cache dlx paths", () => {
|
|
102
|
-
assert.strictEqual(isPnpmDlx("C:\\Users\\me\\AppData\\Local\\pnpm-cache\\dlx\\abc\\node_modules\\foo"), true);
|
|
103
|
-
});
|
|
104
|
-
it("returns false for ordinary project paths", () => {
|
|
105
|
-
assert.strictEqual(isPnpmDlx("/Users/me/projects/foo/node_modules/.pnpm/bar"), false);
|
|
106
|
-
});
|
|
107
|
-
it("returns false for paths that contain dlx without pnpm", () => {
|
|
108
|
-
assert.strictEqual(isPnpmDlx("/Users/me/dlx/something/node_modules"), false);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
describe("getBlockedCriticalDeps", () => {
|
|
112
|
-
it("returns [] when no .modules.yaml is found", () => {
|
|
113
|
-
assert.deepStrictEqual(getBlockedCriticalDeps(tmp), []);
|
|
114
|
-
});
|
|
115
|
-
it("returns all matching critical deps", () => {
|
|
116
|
-
writeModulesYaml([
|
|
117
|
-
"ignoredBuilds:",
|
|
118
|
-
" - deno@2.3.1",
|
|
119
|
-
" - protobufjs@7.5.6",
|
|
120
|
-
" - workerd@1.20241230.0",
|
|
121
|
-
" - esbuild@0.25.2",
|
|
122
|
-
" - '@swc/core@1.10.18'",
|
|
123
|
-
" - esbuild@0.25.12",
|
|
124
|
-
"pendingBuilds: []",
|
|
125
|
-
"",
|
|
126
|
-
].join("\n"));
|
|
127
|
-
const result = getBlockedCriticalDeps(tmp);
|
|
128
|
-
assert.deepStrictEqual(result, [
|
|
129
|
-
"deno",
|
|
130
|
-
"workerd",
|
|
131
|
-
"esbuild",
|
|
132
|
-
"@swc/core",
|
|
133
|
-
"protobufjs",
|
|
134
|
-
]);
|
|
135
|
-
});
|
|
136
|
-
it("returns subset when only some criticals are blocked", () => {
|
|
137
|
-
writeModulesYaml([
|
|
138
|
-
"ignoredBuilds:",
|
|
139
|
-
" - '@swc/core@1.10.18'",
|
|
140
|
-
" - protobufjs@7.5.6",
|
|
141
|
-
"pendingBuilds: []",
|
|
142
|
-
"",
|
|
143
|
-
].join("\n"));
|
|
144
|
-
assert.deepStrictEqual(getBlockedCriticalDeps(tmp), [
|
|
145
|
-
"@swc/core",
|
|
146
|
-
"protobufjs",
|
|
147
|
-
]);
|
|
148
|
-
});
|
|
149
|
-
it("ignores unrelated packages", () => {
|
|
150
|
-
writeModulesYaml([
|
|
151
|
-
"ignoredBuilds:",
|
|
152
|
-
" - some-other-pkg@1.0.0",
|
|
153
|
-
"pendingBuilds: []",
|
|
154
|
-
"",
|
|
155
|
-
].join("\n"));
|
|
156
|
-
assert.deepStrictEqual(getBlockedCriticalDeps(tmp), []);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
describe("formatCommand", () => {
|
|
160
|
-
it("returns <cmd> for empty positionals", () => {
|
|
161
|
-
assert.strictEqual(formatCommand({ _: [] }), "<cmd>");
|
|
162
|
-
});
|
|
163
|
-
it("returns <cmd> when _ is missing entirely", () => {
|
|
164
|
-
assert.strictEqual(formatCommand({}), "<cmd>");
|
|
165
|
-
});
|
|
166
|
-
it("returns the single command unchanged", () => {
|
|
167
|
-
assert.strictEqual(formatCommand({ _: ["deploy"] }), "deploy");
|
|
168
|
-
});
|
|
169
|
-
it("preserves the full subcommand path", () => {
|
|
170
|
-
assert.strictEqual(formatCommand({ _: ["project", "create", "my-app"] }), "project create my-app");
|
|
171
|
-
});
|
|
172
|
-
it("stringifies non-string entries", () => {
|
|
173
|
-
assert.strictEqual(formatCommand({ _: [123, "create"] }), "123 create");
|
|
174
|
-
});
|
|
175
|
-
it("double-quotes positionals containing whitespace", () => {
|
|
176
|
-
assert.strictEqual(formatCommand({ _: ["init", "my project"] }), 'init "my project"');
|
|
177
|
-
});
|
|
178
|
-
it("double-quotes positionals with shell metacharacters", () => {
|
|
179
|
-
assert.strictEqual(formatCommand({
|
|
180
|
-
_: ["delete", "https://api.example.com/foo?bar=1&baz=2"],
|
|
181
|
-
}), 'delete "https://api.example.com/foo?bar=1&baz=2"');
|
|
182
|
-
});
|
|
183
|
-
it("escapes embedded double quotes via JSON encoding", () => {
|
|
184
|
-
assert.strictEqual(formatCommand({ _: ["init", 'say "hi"'] }), 'init "say \\"hi\\""');
|
|
185
|
-
});
|
|
186
|
-
it("leaves embedded single quotes alone (JSON doesn't need to escape them)", () => {
|
|
187
|
-
assert.strictEqual(formatCommand({ _: ["init", "don't"] }), `init "don't"`);
|
|
188
|
-
});
|
|
189
|
-
it("leaves dotted/URL-safe tokens unquoted", () => {
|
|
190
|
-
assert.strictEqual(formatCommand({
|
|
191
|
-
_: ["init", "./my-dir", "v1.2.3", "user@example.com"],
|
|
192
|
-
}), "init ./my-dir v1.2.3 user@example.com");
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
//# sourceMappingURL=pnpm-lifecycle.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pnpm-lifecycle.test.js","sourceRoot":"","sources":["../../../src/common/utils/pnpm-lifecycle.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert\";\nimport { mkdirSync, mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport {\n findCliModulesYaml,\n formatCommand,\n getBlockedCriticalDeps,\n isPnpmDlx,\n readBlockedBuilds,\n} from \"./pnpm-lifecycle.js\";\n\ndescribe(\"pnpm-lifecycle\", () => {\n let tmp: string;\n\n beforeEach(() => {\n tmp = mkdtempSync(path.join(os.tmpdir(), \"zup-pnpm-\"));\n });\n\n afterEach(() => {\n rmSync(tmp, { recursive: true, force: true });\n });\n\n function writeModulesYaml(contents: string, dir = tmp): string {\n const nm = path.join(dir, \"node_modules\");\n mkdirSync(nm, { recursive: true });\n const file = path.join(nm, \".modules.yaml\");\n writeFileSync(file, contents);\n return file;\n }\n\n describe(\"findCliModulesYaml\", () => {\n it(\"finds .modules.yaml in the start directory\", () => {\n const file = writeModulesYaml(\"ignoredBuilds: []\\n\");\n assert.strictEqual(findCliModulesYaml(tmp), file);\n });\n\n it(\"walks up to find .modules.yaml in an ancestor\", () => {\n const file = writeModulesYaml(\"ignoredBuilds: []\\n\");\n const nested = path.join(tmp, \"a\", \"b\", \"c\");\n mkdirSync(nested, { recursive: true });\n assert.strictEqual(findCliModulesYaml(nested), file);\n });\n\n it(\"returns null when no .modules.yaml exists in tree\", () => {\n const nested = path.join(tmp, \"a\", \"b\");\n mkdirSync(nested, { recursive: true });\n assert.strictEqual(findCliModulesYaml(nested), null);\n });\n });\n\n describe(\"readBlockedBuilds\", () => {\n it(\"returns [] when file is missing\", () => {\n const missing = path.join(tmp, \"does-not-exist.yaml\");\n assert.deepStrictEqual(readBlockedBuilds(missing), []);\n });\n\n it(\"returns [] for malformed YAML\", () => {\n const file = writeModulesYaml(\"not: valid: yaml: [\\n\");\n assert.deepStrictEqual(readBlockedBuilds(file), []);\n });\n\n it(\"strips @version suffix from package names\", () => {\n const file = writeModulesYaml(\n \"ignoredBuilds:\\n - deno@2.3.1\\n - workerd@1.20241230.0\\n\"\n );\n const result = readBlockedBuilds(file).sort();\n assert.deepStrictEqual(result, [\"deno\", \"workerd\"]);\n });\n\n it(\"preserves leading @ on scoped packages\", () => {\n const file = writeModulesYaml(\n \"ignoredBuilds:\\n - '@swc/core@1.10.18'\\n\"\n );\n assert.deepStrictEqual(readBlockedBuilds(file), [\"@swc/core\"]);\n });\n\n it(\"dedupes repeated ignoredBuilds entries\", () => {\n const file = writeModulesYaml(\n [\n \"ignoredBuilds:\",\n \" - deno@2.3.1\",\n \" - esbuild@0.25.2\",\n \" - deno@2.3.1\",\n \"\",\n ].join(\"\\n\")\n );\n const result = readBlockedBuilds(file).sort();\n assert.deepStrictEqual(result, [\"deno\", \"esbuild\"]);\n });\n\n // The regression this file exists to prevent. `pendingBuilds` is pnpm's\n // work queue, not a record that anything is broken, and nothing clears it\n // when the build later happens some other way — so a tree that used pnpm\n // once and npm since keeps a stale entry for a package that works fine.\n // Counting it made the CLI refuse to start on a healthy install.\n it(\"ignores pendingBuilds, which goes stale and blocked a working install\", () => {\n const file = writeModulesYaml(\n [\n \"ignoredBuilds: []\",\n \"pendingBuilds:\",\n \" - '@swc/core@1.15.40'\",\n \" - workerd@1.20241230.0\",\n \"\",\n ].join(\"\\n\")\n );\n assert.deepStrictEqual(\n readBlockedBuilds(file),\n [],\n \"pendingBuilds must not mark a dependency blocked — it is a queue of \" +\n \"intended builds, not evidence that any of them failed\"\n );\n });\n\n it(\"still reports a dependency the user declined to build\", () => {\n const file = writeModulesYaml(\n [\n \"ignoredBuilds:\",\n \" - '@swc/core@1.15.40'\",\n \"pendingBuilds:\",\n \" - workerd@1.20241230.0\",\n \"\",\n ].join(\"\\n\")\n );\n assert.deepStrictEqual(readBlockedBuilds(file), [\"@swc/core\"]);\n });\n\n it(\"returns [] when both lists are empty\", () => {\n const file = writeModulesYaml(\"ignoredBuilds: []\\npendingBuilds: []\\n\");\n assert.deepStrictEqual(readBlockedBuilds(file), []);\n });\n });\n\n describe(\"isPnpmDlx\", () => {\n it(\"detects macOS pnpm dlx cache paths\", () => {\n assert.strictEqual(\n isPnpmDlx(\"/Users/me/Library/Caches/pnpm/dlx/abc/node_modules/foo\"),\n true\n );\n });\n\n it(\"detects Linux pnpm dlx cache paths\", () => {\n assert.strictEqual(\n isPnpmDlx(\"/home/me/.local/share/pnpm/dlx/abc/node_modules/foo\"),\n true\n );\n });\n\n it(\"detects Windows pnpm-cache dlx paths\", () => {\n assert.strictEqual(\n isPnpmDlx(\n \"C:\\\\Users\\\\me\\\\AppData\\\\Local\\\\pnpm-cache\\\\dlx\\\\abc\\\\node_modules\\\\foo\"\n ),\n true\n );\n });\n\n it(\"returns false for ordinary project paths\", () => {\n assert.strictEqual(\n isPnpmDlx(\"/Users/me/projects/foo/node_modules/.pnpm/bar\"),\n false\n );\n });\n\n it(\"returns false for paths that contain dlx without pnpm\", () => {\n assert.strictEqual(\n isPnpmDlx(\"/Users/me/dlx/something/node_modules\"),\n false\n );\n });\n });\n\n describe(\"getBlockedCriticalDeps\", () => {\n it(\"returns [] when no .modules.yaml is found\", () => {\n assert.deepStrictEqual(getBlockedCriticalDeps(tmp), []);\n });\n\n it(\"returns all matching critical deps\", () => {\n writeModulesYaml(\n [\n \"ignoredBuilds:\",\n \" - deno@2.3.1\",\n \" - protobufjs@7.5.6\",\n \" - workerd@1.20241230.0\",\n \" - esbuild@0.25.2\",\n \" - '@swc/core@1.10.18'\",\n \" - esbuild@0.25.12\",\n \"pendingBuilds: []\",\n \"\",\n ].join(\"\\n\")\n );\n const result = getBlockedCriticalDeps(tmp);\n assert.deepStrictEqual(result, [\n \"deno\",\n \"workerd\",\n \"esbuild\",\n \"@swc/core\",\n \"protobufjs\",\n ]);\n });\n\n it(\"returns subset when only some criticals are blocked\", () => {\n writeModulesYaml(\n [\n \"ignoredBuilds:\",\n \" - '@swc/core@1.10.18'\",\n \" - protobufjs@7.5.6\",\n \"pendingBuilds: []\",\n \"\",\n ].join(\"\\n\")\n );\n assert.deepStrictEqual(getBlockedCriticalDeps(tmp), [\n \"@swc/core\",\n \"protobufjs\",\n ]);\n });\n\n it(\"ignores unrelated packages\", () => {\n writeModulesYaml(\n [\n \"ignoredBuilds:\",\n \" - some-other-pkg@1.0.0\",\n \"pendingBuilds: []\",\n \"\",\n ].join(\"\\n\")\n );\n assert.deepStrictEqual(getBlockedCriticalDeps(tmp), []);\n });\n });\n\n describe(\"formatCommand\", () => {\n it(\"returns <cmd> for empty positionals\", () => {\n assert.strictEqual(formatCommand({ _: [] }), \"<cmd>\");\n });\n\n it(\"returns <cmd> when _ is missing entirely\", () => {\n assert.strictEqual(formatCommand({}), \"<cmd>\");\n });\n\n it(\"returns the single command unchanged\", () => {\n assert.strictEqual(formatCommand({ _: [\"deploy\"] }), \"deploy\");\n });\n\n it(\"preserves the full subcommand path\", () => {\n assert.strictEqual(\n formatCommand({ _: [\"project\", \"create\", \"my-app\"] }),\n \"project create my-app\"\n );\n });\n\n it(\"stringifies non-string entries\", () => {\n assert.strictEqual(formatCommand({ _: [123, \"create\"] }), \"123 create\");\n });\n\n it(\"double-quotes positionals containing whitespace\", () => {\n assert.strictEqual(\n formatCommand({ _: [\"init\", \"my project\"] }),\n 'init \"my project\"'\n );\n });\n\n it(\"double-quotes positionals with shell metacharacters\", () => {\n assert.strictEqual(\n formatCommand({\n _: [\"delete\", \"https://api.example.com/foo?bar=1&baz=2\"],\n }),\n 'delete \"https://api.example.com/foo?bar=1&baz=2\"'\n );\n });\n\n it(\"escapes embedded double quotes via JSON encoding\", () => {\n assert.strictEqual(\n formatCommand({ _: [\"init\", 'say \"hi\"'] }),\n 'init \"say \\\\\"hi\\\\\"\"'\n );\n });\n\n it(\"leaves embedded single quotes alone (JSON doesn't need to escape them)\", () => {\n assert.strictEqual(\n formatCommand({ _: [\"init\", \"don't\"] }),\n `init \"don't\"`\n );\n });\n\n it(\"leaves dotted/URL-safe tokens unquoted\", () => {\n assert.strictEqual(\n formatCommand({\n _: [\"init\", \"./my-dir\", \"v1.2.3\", \"user@example.com\"],\n }),\n \"init ./my-dir v1.2.3 user@example.com\"\n );\n });\n });\n});\n"]}
|