@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.
Files changed (303) hide show
  1. package/node_modules/@hono/node-server/README.md +2 -0
  2. package/node_modules/@hono/node-server/dist/index.cjs +1 -1
  3. package/node_modules/@hono/node-server/dist/index.mjs +1 -1
  4. package/node_modules/@hono/node-server/dist/serve-static.cjs +2 -1
  5. package/node_modules/@hono/node-server/dist/serve-static.mjs +2 -1
  6. package/node_modules/@hono/node-server/package.json +1 -1
  7. package/node_modules/@posthog/core/dist/metrics/index.d.ts +9 -0
  8. package/node_modules/@posthog/core/dist/metrics/index.d.ts.map +1 -1
  9. package/node_modules/@posthog/core/dist/metrics/index.js +38 -3
  10. package/node_modules/@posthog/core/dist/metrics/index.mjs +38 -3
  11. package/node_modules/@posthog/core/dist/metrics/types.d.ts +7 -2
  12. package/node_modules/@posthog/core/dist/metrics/types.d.ts.map +1 -1
  13. package/node_modules/@posthog/core/dist/traces/ids.d.ts.map +1 -1
  14. package/node_modules/@posthog/core/dist/traces/ids.js +2 -2
  15. package/node_modules/@posthog/core/dist/traces/ids.mjs +2 -2
  16. package/node_modules/@posthog/core/package.json +2 -2
  17. package/node_modules/@posthog/core/src/metrics/index.spec.ts +75 -0
  18. package/node_modules/@posthog/core/src/metrics/index.ts +60 -0
  19. package/node_modules/@posthog/core/src/metrics/types.ts +7 -1
  20. package/node_modules/@posthog/core/src/traces/ids.ts +4 -2
  21. package/node_modules/@posthog/types/dist/capture-metric.d.ts +10 -0
  22. package/node_modules/@posthog/types/dist/capture-metric.d.ts.map +1 -1
  23. package/node_modules/@posthog/types/dist/index.d.ts +1 -1
  24. package/node_modules/@posthog/types/dist/index.d.ts.map +1 -1
  25. package/node_modules/@posthog/types/package.json +1 -1
  26. package/node_modules/@posthog/types/src/capture-metric.ts +11 -0
  27. package/node_modules/@posthog/types/src/index.ts +1 -0
  28. package/node_modules/@zuplo/core/customer.cli.minified.js +2 -2
  29. package/node_modules/@zuplo/core/index.minified.js +2 -2
  30. package/node_modules/@zuplo/core/package.json +1 -1
  31. package/node_modules/@zuplo/graphql/package.json +1 -1
  32. package/node_modules/@zuplo/openapi-tools/package.json +5 -2
  33. package/node_modules/@zuplo/otel/package.json +1 -1
  34. package/node_modules/@zuplo/runtime/out/esm/{chunk-YJ2BHVUH.js → chunk-CDEAY3VY.js} +2 -2
  35. package/node_modules/@zuplo/runtime/out/esm/chunk-LVSZ3WTO.js +37 -0
  36. package/node_modules/@zuplo/runtime/out/esm/chunk-LVSZ3WTO.js.map +1 -0
  37. package/node_modules/@zuplo/runtime/out/esm/{chunk-VTO3F6DK.js → chunk-NUVXDVLJ.js} +2 -2
  38. package/node_modules/@zuplo/runtime/out/esm/{chunk-6YPRGG62.js → chunk-RHU3Z7DA.js} +108 -108
  39. package/node_modules/@zuplo/runtime/out/esm/chunk-RHU3Z7DA.js.map +1 -0
  40. package/node_modules/@zuplo/runtime/out/esm/index.js +1 -1
  41. package/node_modules/@zuplo/runtime/out/esm/internal/index.js +1 -1
  42. package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js +1 -1
  43. package/node_modules/@zuplo/runtime/out/esm/mocks/index.js +1 -1
  44. package/node_modules/@zuplo/runtime/out/esm/sdks/aws/index.js +1 -1
  45. package/node_modules/@zuplo/runtime/out/types/index.d.ts +15 -24
  46. package/node_modules/@zuplo/runtime/out/types/internal/index.d.ts +14 -0
  47. package/node_modules/@zuplo/runtime/package.json +1 -1
  48. package/package.json +15 -12
  49. package/dist/__tests__/archive-utils.test.d.ts +0 -2
  50. package/dist/__tests__/archive-utils.test.d.ts.map +0 -1
  51. package/dist/__tests__/archive-utils.test.js +0 -50
  52. package/dist/__tests__/archive-utils.test.js.map +0 -1
  53. package/dist/__tests__/import-openapi.test.d.ts +0 -2
  54. package/dist/__tests__/import-openapi.test.d.ts.map +0 -1
  55. package/dist/__tests__/import-openapi.test.js +0 -251
  56. package/dist/__tests__/import-openapi.test.js.map +0 -1
  57. package/dist/__tests__/integration/confirm-linked-config.integration.test.d.ts +0 -2
  58. package/dist/__tests__/integration/confirm-linked-config.integration.test.d.ts.map +0 -1
  59. package/dist/__tests__/integration/confirm-linked-config.integration.test.js +0 -202
  60. package/dist/__tests__/integration/confirm-linked-config.integration.test.js.map +0 -1
  61. package/dist/__tests__/integration/confirm-production-deploy.integration.test.d.ts +0 -2
  62. package/dist/__tests__/integration/confirm-production-deploy.integration.test.d.ts.map +0 -1
  63. package/dist/__tests__/integration/confirm-production-deploy.integration.test.js +0 -184
  64. package/dist/__tests__/integration/confirm-production-deploy.integration.test.js.map +0 -1
  65. package/dist/__tests__/integration/custom-domain.integration.test.d.ts +0 -2
  66. package/dist/__tests__/integration/custom-domain.integration.test.d.ts.map +0 -1
  67. package/dist/__tests__/integration/custom-domain.integration.test.js +0 -563
  68. package/dist/__tests__/integration/custom-domain.integration.test.js.map +0 -1
  69. package/dist/__tests__/integration/delete.integration.test.d.ts +0 -2
  70. package/dist/__tests__/integration/delete.integration.test.d.ts.map +0 -1
  71. package/dist/__tests__/integration/delete.integration.test.js +0 -262
  72. package/dist/__tests__/integration/delete.integration.test.js.map +0 -1
  73. package/dist/__tests__/integration/deploy.integration.test.d.ts +0 -2
  74. package/dist/__tests__/integration/deploy.integration.test.d.ts.map +0 -1
  75. package/dist/__tests__/integration/deploy.integration.test.js +0 -519
  76. package/dist/__tests__/integration/deploy.integration.test.js.map +0 -1
  77. package/dist/__tests__/integration/get-project-param.integration.test.d.ts +0 -2
  78. package/dist/__tests__/integration/get-project-param.integration.test.d.ts.map +0 -1
  79. package/dist/__tests__/integration/get-project-param.integration.test.js +0 -305
  80. package/dist/__tests__/integration/get-project-param.integration.test.js.map +0 -1
  81. package/dist/__tests__/integration/info.integration.test.d.ts +0 -2
  82. package/dist/__tests__/integration/info.integration.test.d.ts.map +0 -1
  83. package/dist/__tests__/integration/info.integration.test.js +0 -293
  84. package/dist/__tests__/integration/info.integration.test.js.map +0 -1
  85. package/dist/__tests__/integration/jest-mocks-setup.d.ts +0 -2
  86. package/dist/__tests__/integration/jest-mocks-setup.d.ts.map +0 -1
  87. package/dist/__tests__/integration/jest-mocks-setup.js +0 -104
  88. package/dist/__tests__/integration/jest-mocks-setup.js.map +0 -1
  89. package/dist/__tests__/integration/jest-setup.d.ts +0 -2
  90. package/dist/__tests__/integration/jest-setup.d.ts.map +0 -1
  91. package/dist/__tests__/integration/jest-setup.js +0 -12
  92. package/dist/__tests__/integration/jest-setup.js.map +0 -1
  93. package/dist/__tests__/integration/link.integration.test.d.ts +0 -2
  94. package/dist/__tests__/integration/link.integration.test.d.ts.map +0 -1
  95. package/dist/__tests__/integration/link.integration.test.js +0 -395
  96. package/dist/__tests__/integration/link.integration.test.js.map +0 -1
  97. package/dist/__tests__/integration/linked-config-cascade.integration.test.d.ts +0 -2
  98. package/dist/__tests__/integration/linked-config-cascade.integration.test.d.ts.map +0 -1
  99. package/dist/__tests__/integration/linked-config-cascade.integration.test.js +0 -179
  100. package/dist/__tests__/integration/linked-config-cascade.integration.test.js.map +0 -1
  101. package/dist/__tests__/integration/list.integration.test.d.ts +0 -2
  102. package/dist/__tests__/integration/list.integration.test.d.ts.map +0 -1
  103. package/dist/__tests__/integration/list.integration.test.js +0 -300
  104. package/dist/__tests__/integration/list.integration.test.js.map +0 -1
  105. package/dist/__tests__/integration/source-upgrade.integration.test.d.ts +0 -2
  106. package/dist/__tests__/integration/source-upgrade.integration.test.d.ts.map +0 -1
  107. package/dist/__tests__/integration/source-upgrade.integration.test.js +0 -100
  108. package/dist/__tests__/integration/source-upgrade.integration.test.js.map +0 -1
  109. package/dist/__tests__/integration/test-utils.d.ts +0 -30
  110. package/dist/__tests__/integration/test-utils.d.ts.map +0 -1
  111. package/dist/__tests__/integration/test-utils.js +0 -82
  112. package/dist/__tests__/integration/test-utils.js.map +0 -1
  113. package/dist/__tests__/integration/tunnel.integration.test.d.ts +0 -2
  114. package/dist/__tests__/integration/tunnel.integration.test.d.ts.map +0 -1
  115. package/dist/__tests__/integration/tunnel.integration.test.js +0 -486
  116. package/dist/__tests__/integration/tunnel.integration.test.js.map +0 -1
  117. package/dist/__tests__/integration/variable.integration.test.d.ts +0 -2
  118. package/dist/__tests__/integration/variable.integration.test.d.ts.map +0 -1
  119. package/dist/__tests__/integration/variable.integration.test.js +0 -258
  120. package/dist/__tests__/integration/variable.integration.test.js.map +0 -1
  121. package/dist/__tests__/integration/whoami.integration.test.d.ts +0 -2
  122. package/dist/__tests__/integration/whoami.integration.test.d.ts.map +0 -1
  123. package/dist/__tests__/integration/whoami.integration.test.js +0 -116
  124. package/dist/__tests__/integration/whoami.integration.test.js.map +0 -1
  125. package/dist/__tests__/outdated.test.d.ts +0 -2
  126. package/dist/__tests__/outdated.test.d.ts.map +0 -1
  127. package/dist/__tests__/outdated.test.js +0 -67
  128. package/dist/__tests__/outdated.test.js.map +0 -1
  129. package/dist/__tests__/populate.test.d.ts +0 -2
  130. package/dist/__tests__/populate.test.d.ts.map +0 -1
  131. package/dist/__tests__/populate.test.js +0 -445
  132. package/dist/__tests__/populate.test.js.map +0 -1
  133. package/dist/__tests__/tsconfig-upgrader.test.d.ts +0 -2
  134. package/dist/__tests__/tsconfig-upgrader.test.d.ts.map +0 -1
  135. package/dist/__tests__/tsconfig-upgrader.test.js +0 -31
  136. package/dist/__tests__/tsconfig-upgrader.test.js.map +0 -1
  137. package/dist/ca-certificate/validation.test.d.ts +0 -2
  138. package/dist/ca-certificate/validation.test.d.ts.map +0 -1
  139. package/dist/ca-certificate/validation.test.js +0 -131
  140. package/dist/ca-certificate/validation.test.js.map +0 -1
  141. package/dist/common/analytics/cli-invocation.test.d.ts +0 -2
  142. package/dist/common/analytics/cli-invocation.test.d.ts.map +0 -1
  143. package/dist/common/analytics/cli-invocation.test.js +0 -51
  144. package/dist/common/analytics/cli-invocation.test.js.map +0 -1
  145. package/dist/common/analytics/package-manager.test.d.ts +0 -2
  146. package/dist/common/analytics/package-manager.test.d.ts.map +0 -1
  147. package/dist/common/analytics/package-manager.test.js +0 -163
  148. package/dist/common/analytics/package-manager.test.js.map +0 -1
  149. package/dist/common/cli-dispatcher.test.d.ts +0 -2
  150. package/dist/common/cli-dispatcher.test.d.ts.map +0 -1
  151. package/dist/common/cli-dispatcher.test.js +0 -80
  152. package/dist/common/cli-dispatcher.test.js.map +0 -1
  153. package/dist/common/middleware/check-pnpm-lifecycle.test.d.ts +0 -2
  154. package/dist/common/middleware/check-pnpm-lifecycle.test.d.ts.map +0 -1
  155. package/dist/common/middleware/check-pnpm-lifecycle.test.js +0 -125
  156. package/dist/common/middleware/check-pnpm-lifecycle.test.js.map +0 -1
  157. package/dist/common/middleware/get-environment-param.test.d.ts +0 -2
  158. package/dist/common/middleware/get-environment-param.test.d.ts.map +0 -1
  159. package/dist/common/middleware/get-environment-param.test.js +0 -57
  160. package/dist/common/middleware/get-environment-param.test.js.map +0 -1
  161. package/dist/common/read-linked-config.test.d.ts +0 -2
  162. package/dist/common/read-linked-config.test.d.ts.map +0 -1
  163. package/dist/common/read-linked-config.test.js +0 -363
  164. package/dist/common/read-linked-config.test.js.map +0 -1
  165. package/dist/common/terminal.test.d.ts +0 -2
  166. package/dist/common/terminal.test.d.ts.map +0 -1
  167. package/dist/common/terminal.test.js +0 -101
  168. package/dist/common/terminal.test.js.map +0 -1
  169. package/dist/common/utils/build-environment-prompt-choices.test.d.ts +0 -2
  170. package/dist/common/utils/build-environment-prompt-choices.test.d.ts.map +0 -1
  171. package/dist/common/utils/build-environment-prompt-choices.test.js +0 -97
  172. package/dist/common/utils/build-environment-prompt-choices.test.js.map +0 -1
  173. package/dist/common/utils/format-environment-type.test.d.ts +0 -2
  174. package/dist/common/utils/format-environment-type.test.d.ts.map +0 -1
  175. package/dist/common/utils/format-environment-type.test.js +0 -32
  176. package/dist/common/utils/format-environment-type.test.js.map +0 -1
  177. package/dist/common/utils/pnpm-lifecycle.test.d.ts +0 -2
  178. package/dist/common/utils/pnpm-lifecycle.test.d.ts.map +0 -1
  179. package/dist/common/utils/pnpm-lifecycle.test.js +0 -196
  180. package/dist/common/utils/pnpm-lifecycle.test.js.map +0 -1
  181. package/dist/common/utils/pretty-print-environment-prompt.test.d.ts +0 -2
  182. package/dist/common/utils/pretty-print-environment-prompt.test.d.ts.map +0 -1
  183. package/dist/common/utils/pretty-print-environment-prompt.test.js +0 -42
  184. package/dist/common/utils/pretty-print-environment-prompt.test.js.map +0 -1
  185. package/dist/common/utils/sort-environments-for-prompt.test.d.ts +0 -2
  186. package/dist/common/utils/sort-environments-for-prompt.test.d.ts.map +0 -1
  187. package/dist/common/utils/sort-environments-for-prompt.test.js +0 -82
  188. package/dist/common/utils/sort-environments-for-prompt.test.js.map +0 -1
  189. package/dist/common/utils/stringify-config.test.d.ts +0 -2
  190. package/dist/common/utils/stringify-config.test.d.ts.map +0 -1
  191. package/dist/common/utils/stringify-config.test.js +0 -80
  192. package/dist/common/utils/stringify-config.test.js.map +0 -1
  193. package/dist/common/validators/argument-validators.spec.d.ts +0 -2
  194. package/dist/common/validators/argument-validators.spec.d.ts.map +0 -1
  195. package/dist/common/validators/argument-validators.spec.js +0 -181
  196. package/dist/common/validators/argument-validators.spec.js.map +0 -1
  197. package/dist/common/worker-output.test.d.ts +0 -2
  198. package/dist/common/worker-output.test.d.ts.map +0 -1
  199. package/dist/common/worker-output.test.js +0 -32
  200. package/dist/common/worker-output.test.js.map +0 -1
  201. package/dist/deploy/archive.local-registry.test.d.ts +0 -2
  202. package/dist/deploy/archive.local-registry.test.d.ts.map +0 -1
  203. package/dist/deploy/archive.local-registry.test.js +0 -100
  204. package/dist/deploy/archive.local-registry.test.js.map +0 -1
  205. package/dist/deploy/archive.test.d.ts +0 -2
  206. package/dist/deploy/archive.test.d.ts.map +0 -1
  207. package/dist/deploy/archive.test.js +0 -248
  208. package/dist/deploy/archive.test.js.map +0 -1
  209. package/dist/deploy/classify-build-probe.test.d.ts +0 -2
  210. package/dist/deploy/classify-build-probe.test.d.ts.map +0 -1
  211. package/dist/deploy/classify-build-probe.test.js +0 -51
  212. package/dist/deploy/classify-build-probe.test.js.map +0 -1
  213. package/dist/deploy/poll-deployment.test.d.ts +0 -2
  214. package/dist/deploy/poll-deployment.test.d.ts.map +0 -1
  215. package/dist/deploy/poll-deployment.test.js +0 -158
  216. package/dist/deploy/poll-deployment.test.js.map +0 -1
  217. package/dist/dev/zuplo-local-gitignore.test.d.ts +0 -2
  218. package/dist/dev/zuplo-local-gitignore.test.d.ts.map +0 -1
  219. package/dist/dev/zuplo-local-gitignore.test.js +0 -58
  220. package/dist/dev/zuplo-local-gitignore.test.js.map +0 -1
  221. package/dist/editor/e2e/editor.spec.d.ts +0 -2
  222. package/dist/editor/e2e/editor.spec.d.ts.map +0 -1
  223. package/dist/editor/e2e/editor.spec.js +0 -44
  224. package/dist/editor/e2e/editor.spec.js.map +0 -1
  225. package/dist/link/project-type.test.d.ts +0 -2
  226. package/dist/link/project-type.test.d.ts.map +0 -1
  227. package/dist/link/project-type.test.js +0 -225
  228. package/dist/link/project-type.test.js.map +0 -1
  229. package/dist/lint/resolve-binary.test.d.ts +0 -2
  230. package/dist/lint/resolve-binary.test.d.ts.map +0 -1
  231. package/dist/lint/resolve-binary.test.js +0 -155
  232. package/dist/lint/resolve-binary.test.js.map +0 -1
  233. package/dist/open-api/convert/handler.spec.d.ts +0 -2
  234. package/dist/open-api/convert/handler.spec.d.ts.map +0 -1
  235. package/dist/open-api/convert/handler.spec.js +0 -301
  236. package/dist/open-api/convert/handler.spec.js.map +0 -1
  237. package/dist/open-api/merge/handler.spec.d.ts +0 -2
  238. package/dist/open-api/merge/handler.spec.d.ts.map +0 -1
  239. package/dist/open-api/merge/handler.spec.js +0 -673
  240. package/dist/open-api/merge/handler.spec.js.map +0 -1
  241. package/dist/open-api/overlay/handler.spec.d.ts +0 -2
  242. package/dist/open-api/overlay/handler.spec.d.ts.map +0 -1
  243. package/dist/open-api/overlay/handler.spec.js +0 -346
  244. package/dist/open-api/overlay/handler.spec.js.map +0 -1
  245. package/dist/source/ai-gateway/files.test.d.ts +0 -2
  246. package/dist/source/ai-gateway/files.test.d.ts.map +0 -1
  247. package/dist/source/ai-gateway/files.test.js +0 -135
  248. package/dist/source/ai-gateway/files.test.js.map +0 -1
  249. package/dist/source/ai-gateway/handler.test.d.ts +0 -2
  250. package/dist/source/ai-gateway/handler.test.d.ts.map +0 -1
  251. package/dist/source/ai-gateway/handler.test.js +0 -113
  252. package/dist/source/ai-gateway/handler.test.js.map +0 -1
  253. package/dist/source/ai-gateway/package.test.d.ts +0 -2
  254. package/dist/source/ai-gateway/package.test.d.ts.map +0 -1
  255. package/dist/source/ai-gateway/package.test.js +0 -30
  256. package/dist/source/ai-gateway/package.test.js.map +0 -1
  257. package/dist/source/ai-gateway/planner.test.d.ts +0 -2
  258. package/dist/source/ai-gateway/planner.test.d.ts.map +0 -1
  259. package/dist/source/ai-gateway/planner.test.js +0 -330
  260. package/dist/source/ai-gateway/planner.test.js.map +0 -1
  261. package/dist/source/ai-gateway/release.test.d.ts +0 -2
  262. package/dist/source/ai-gateway/release.test.d.ts.map +0 -1
  263. package/dist/source/ai-gateway/release.test.js +0 -62
  264. package/dist/source/ai-gateway/release.test.js.map +0 -1
  265. package/dist/test/invoke-test.test.d.ts +0 -2
  266. package/dist/test/invoke-test.test.d.ts.map +0 -1
  267. package/dist/test/invoke-test.test.js +0 -150
  268. package/dist/test/invoke-test.test.js.map +0 -1
  269. package/dist/test/test-files.test.d.ts +0 -2
  270. package/dist/test/test-files.test.d.ts.map +0 -1
  271. package/dist/test/test-files.test.js +0 -57
  272. package/dist/test/test-files.test.js.map +0 -1
  273. package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.d.ts +0 -2
  274. package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.d.ts.map +0 -1
  275. package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.js +0 -289
  276. package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.js.map +0 -1
  277. package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.d.ts +0 -2
  278. package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.d.ts.map +0 -1
  279. package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.js +0 -181
  280. package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.js.map +0 -1
  281. package/node_modules/@zuplo/openapi-tools/dist/merge.spec.d.ts +0 -2
  282. package/node_modules/@zuplo/openapi-tools/dist/merge.spec.d.ts.map +0 -1
  283. package/node_modules/@zuplo/openapi-tools/dist/merge.spec.js +0 -399
  284. package/node_modules/@zuplo/openapi-tools/dist/merge.spec.js.map +0 -1
  285. package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.d.ts +0 -2
  286. package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.d.ts.map +0 -1
  287. package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.js +0 -779
  288. package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.js.map +0 -1
  289. package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.d.ts +0 -2
  290. package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.d.ts.map +0 -1
  291. package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.js +0 -269
  292. package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.js.map +0 -1
  293. package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.d.ts +0 -2
  294. package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.d.ts.map +0 -1
  295. package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.js +0 -93
  296. package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.js.map +0 -1
  297. package/node_modules/@zuplo/runtime/out/esm/chunk-6YPRGG62.js.map +0 -1
  298. package/node_modules/@zuplo/runtime/out/esm/chunk-PBDT4FDO.js +0 -37
  299. package/node_modules/@zuplo/runtime/out/esm/chunk-PBDT4FDO.js.map +0 -1
  300. /package/node_modules/@zuplo/runtime/out/esm/{chunk-YJ2BHVUH.js.map → chunk-CDEAY3VY.js.map} +0 -0
  301. /package/node_modules/@zuplo/runtime/out/esm/{chunk-PBDT4FDO.js.LEGAL.txt → chunk-LVSZ3WTO.js.LEGAL.txt} +0 -0
  302. /package/node_modules/@zuplo/runtime/out/esm/{chunk-VTO3F6DK.js.map → chunk-NUVXDVLJ.js.map} +0 -0
  303. /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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=info.integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"info.integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/info.integration.test.ts"],"names":[],"mappings":""}