@zuplo/cli 7.10.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 (310) hide show
  1. package/dist/common/worker-output.d.ts +7 -0
  2. package/dist/common/worker-output.d.ts.map +1 -1
  3. package/dist/common/worker-output.js +39 -0
  4. package/dist/common/worker-output.js.map +1 -1
  5. package/dist/tsconfig.tsbuildinfo +1 -1
  6. package/node_modules/@hono/node-server/README.md +2 -0
  7. package/node_modules/@hono/node-server/dist/index.cjs +1 -1
  8. package/node_modules/@hono/node-server/dist/index.mjs +1 -1
  9. package/node_modules/@hono/node-server/dist/serve-static.cjs +2 -1
  10. package/node_modules/@hono/node-server/dist/serve-static.mjs +2 -1
  11. package/node_modules/@hono/node-server/package.json +1 -1
  12. package/node_modules/@posthog/core/dist/metrics/index.d.ts +9 -0
  13. package/node_modules/@posthog/core/dist/metrics/index.d.ts.map +1 -1
  14. package/node_modules/@posthog/core/dist/metrics/index.js +38 -3
  15. package/node_modules/@posthog/core/dist/metrics/index.mjs +38 -3
  16. package/node_modules/@posthog/core/dist/metrics/types.d.ts +7 -2
  17. package/node_modules/@posthog/core/dist/metrics/types.d.ts.map +1 -1
  18. package/node_modules/@posthog/core/dist/traces/ids.d.ts.map +1 -1
  19. package/node_modules/@posthog/core/dist/traces/ids.js +2 -2
  20. package/node_modules/@posthog/core/dist/traces/ids.mjs +2 -2
  21. package/node_modules/@posthog/core/dist/types.d.ts +1 -1
  22. package/node_modules/@posthog/core/dist/types.d.ts.map +1 -1
  23. package/node_modules/@posthog/core/package.json +4 -3
  24. package/node_modules/@posthog/core/src/metrics/index.spec.ts +75 -0
  25. package/node_modules/@posthog/core/src/metrics/index.ts +60 -0
  26. package/node_modules/@posthog/core/src/metrics/types.ts +7 -1
  27. package/node_modules/@posthog/core/src/traces/ids.ts +4 -2
  28. package/node_modules/@posthog/core/src/types.ts +1 -1
  29. package/node_modules/@posthog/types/dist/capture-metric.d.ts +10 -0
  30. package/node_modules/@posthog/types/dist/capture-metric.d.ts.map +1 -1
  31. package/node_modules/@posthog/types/dist/capture.d.ts +1 -1
  32. package/node_modules/@posthog/types/dist/capture.d.ts.map +1 -1
  33. package/node_modules/@posthog/types/dist/index.d.ts +1 -1
  34. package/node_modules/@posthog/types/dist/index.d.ts.map +1 -1
  35. package/node_modules/@posthog/types/package.json +1 -1
  36. package/node_modules/@posthog/types/src/capture-metric.ts +11 -0
  37. package/node_modules/@posthog/types/src/capture.ts +1 -1
  38. package/node_modules/@posthog/types/src/index.ts +1 -0
  39. package/node_modules/@zuplo/core/customer.cli.minified.js +272 -261
  40. package/node_modules/@zuplo/core/index.minified.js +276 -265
  41. package/node_modules/@zuplo/core/package.json +1 -1
  42. package/node_modules/@zuplo/graphql/package.json +1 -1
  43. package/node_modules/@zuplo/openapi-tools/package.json +5 -2
  44. package/node_modules/@zuplo/otel/package.json +1 -1
  45. package/node_modules/@zuplo/runtime/out/esm/{chunk-YJ2BHVUH.js → chunk-CDEAY3VY.js} +2 -2
  46. package/node_modules/@zuplo/runtime/out/esm/chunk-LVSZ3WTO.js +37 -0
  47. package/node_modules/@zuplo/runtime/out/esm/chunk-LVSZ3WTO.js.map +1 -0
  48. package/node_modules/@zuplo/runtime/out/esm/{chunk-VTO3F6DK.js → chunk-NUVXDVLJ.js} +2 -2
  49. package/node_modules/@zuplo/runtime/out/esm/{chunk-6YPRGG62.js → chunk-RHU3Z7DA.js} +108 -108
  50. package/node_modules/@zuplo/runtime/out/esm/chunk-RHU3Z7DA.js.map +1 -0
  51. package/node_modules/@zuplo/runtime/out/esm/index.js +1 -1
  52. package/node_modules/@zuplo/runtime/out/esm/internal/index.js +1 -1
  53. package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js +1 -1
  54. package/node_modules/@zuplo/runtime/out/esm/mocks/index.js +1 -1
  55. package/node_modules/@zuplo/runtime/out/esm/sdks/aws/index.js +1 -1
  56. package/node_modules/@zuplo/runtime/out/types/index.d.ts +15 -24
  57. package/node_modules/@zuplo/runtime/out/types/internal/index.d.ts +14 -0
  58. package/node_modules/@zuplo/runtime/package.json +1 -1
  59. package/package.json +15 -12
  60. package/dist/__tests__/archive-utils.test.d.ts +0 -2
  61. package/dist/__tests__/archive-utils.test.d.ts.map +0 -1
  62. package/dist/__tests__/archive-utils.test.js +0 -50
  63. package/dist/__tests__/archive-utils.test.js.map +0 -1
  64. package/dist/__tests__/import-openapi.test.d.ts +0 -2
  65. package/dist/__tests__/import-openapi.test.d.ts.map +0 -1
  66. package/dist/__tests__/import-openapi.test.js +0 -251
  67. package/dist/__tests__/import-openapi.test.js.map +0 -1
  68. package/dist/__tests__/integration/confirm-linked-config.integration.test.d.ts +0 -2
  69. package/dist/__tests__/integration/confirm-linked-config.integration.test.d.ts.map +0 -1
  70. package/dist/__tests__/integration/confirm-linked-config.integration.test.js +0 -202
  71. package/dist/__tests__/integration/confirm-linked-config.integration.test.js.map +0 -1
  72. package/dist/__tests__/integration/confirm-production-deploy.integration.test.d.ts +0 -2
  73. package/dist/__tests__/integration/confirm-production-deploy.integration.test.d.ts.map +0 -1
  74. package/dist/__tests__/integration/confirm-production-deploy.integration.test.js +0 -184
  75. package/dist/__tests__/integration/confirm-production-deploy.integration.test.js.map +0 -1
  76. package/dist/__tests__/integration/custom-domain.integration.test.d.ts +0 -2
  77. package/dist/__tests__/integration/custom-domain.integration.test.d.ts.map +0 -1
  78. package/dist/__tests__/integration/custom-domain.integration.test.js +0 -563
  79. package/dist/__tests__/integration/custom-domain.integration.test.js.map +0 -1
  80. package/dist/__tests__/integration/delete.integration.test.d.ts +0 -2
  81. package/dist/__tests__/integration/delete.integration.test.d.ts.map +0 -1
  82. package/dist/__tests__/integration/delete.integration.test.js +0 -262
  83. package/dist/__tests__/integration/delete.integration.test.js.map +0 -1
  84. package/dist/__tests__/integration/deploy.integration.test.d.ts +0 -2
  85. package/dist/__tests__/integration/deploy.integration.test.d.ts.map +0 -1
  86. package/dist/__tests__/integration/deploy.integration.test.js +0 -519
  87. package/dist/__tests__/integration/deploy.integration.test.js.map +0 -1
  88. package/dist/__tests__/integration/get-project-param.integration.test.d.ts +0 -2
  89. package/dist/__tests__/integration/get-project-param.integration.test.d.ts.map +0 -1
  90. package/dist/__tests__/integration/get-project-param.integration.test.js +0 -305
  91. package/dist/__tests__/integration/get-project-param.integration.test.js.map +0 -1
  92. package/dist/__tests__/integration/info.integration.test.d.ts +0 -2
  93. package/dist/__tests__/integration/info.integration.test.d.ts.map +0 -1
  94. package/dist/__tests__/integration/info.integration.test.js +0 -293
  95. package/dist/__tests__/integration/info.integration.test.js.map +0 -1
  96. package/dist/__tests__/integration/jest-mocks-setup.d.ts +0 -2
  97. package/dist/__tests__/integration/jest-mocks-setup.d.ts.map +0 -1
  98. package/dist/__tests__/integration/jest-mocks-setup.js +0 -104
  99. package/dist/__tests__/integration/jest-mocks-setup.js.map +0 -1
  100. package/dist/__tests__/integration/jest-setup.d.ts +0 -2
  101. package/dist/__tests__/integration/jest-setup.d.ts.map +0 -1
  102. package/dist/__tests__/integration/jest-setup.js +0 -12
  103. package/dist/__tests__/integration/jest-setup.js.map +0 -1
  104. package/dist/__tests__/integration/link.integration.test.d.ts +0 -2
  105. package/dist/__tests__/integration/link.integration.test.d.ts.map +0 -1
  106. package/dist/__tests__/integration/link.integration.test.js +0 -395
  107. package/dist/__tests__/integration/link.integration.test.js.map +0 -1
  108. package/dist/__tests__/integration/linked-config-cascade.integration.test.d.ts +0 -2
  109. package/dist/__tests__/integration/linked-config-cascade.integration.test.d.ts.map +0 -1
  110. package/dist/__tests__/integration/linked-config-cascade.integration.test.js +0 -179
  111. package/dist/__tests__/integration/linked-config-cascade.integration.test.js.map +0 -1
  112. package/dist/__tests__/integration/list.integration.test.d.ts +0 -2
  113. package/dist/__tests__/integration/list.integration.test.d.ts.map +0 -1
  114. package/dist/__tests__/integration/list.integration.test.js +0 -300
  115. package/dist/__tests__/integration/list.integration.test.js.map +0 -1
  116. package/dist/__tests__/integration/source-upgrade.integration.test.d.ts +0 -2
  117. package/dist/__tests__/integration/source-upgrade.integration.test.d.ts.map +0 -1
  118. package/dist/__tests__/integration/source-upgrade.integration.test.js +0 -100
  119. package/dist/__tests__/integration/source-upgrade.integration.test.js.map +0 -1
  120. package/dist/__tests__/integration/test-utils.d.ts +0 -30
  121. package/dist/__tests__/integration/test-utils.d.ts.map +0 -1
  122. package/dist/__tests__/integration/test-utils.js +0 -82
  123. package/dist/__tests__/integration/test-utils.js.map +0 -1
  124. package/dist/__tests__/integration/tunnel.integration.test.d.ts +0 -2
  125. package/dist/__tests__/integration/tunnel.integration.test.d.ts.map +0 -1
  126. package/dist/__tests__/integration/tunnel.integration.test.js +0 -486
  127. package/dist/__tests__/integration/tunnel.integration.test.js.map +0 -1
  128. package/dist/__tests__/integration/variable.integration.test.d.ts +0 -2
  129. package/dist/__tests__/integration/variable.integration.test.d.ts.map +0 -1
  130. package/dist/__tests__/integration/variable.integration.test.js +0 -258
  131. package/dist/__tests__/integration/variable.integration.test.js.map +0 -1
  132. package/dist/__tests__/integration/whoami.integration.test.d.ts +0 -2
  133. package/dist/__tests__/integration/whoami.integration.test.d.ts.map +0 -1
  134. package/dist/__tests__/integration/whoami.integration.test.js +0 -116
  135. package/dist/__tests__/integration/whoami.integration.test.js.map +0 -1
  136. package/dist/__tests__/outdated.test.d.ts +0 -2
  137. package/dist/__tests__/outdated.test.d.ts.map +0 -1
  138. package/dist/__tests__/outdated.test.js +0 -67
  139. package/dist/__tests__/outdated.test.js.map +0 -1
  140. package/dist/__tests__/populate.test.d.ts +0 -2
  141. package/dist/__tests__/populate.test.d.ts.map +0 -1
  142. package/dist/__tests__/populate.test.js +0 -445
  143. package/dist/__tests__/populate.test.js.map +0 -1
  144. package/dist/__tests__/tsconfig-upgrader.test.d.ts +0 -2
  145. package/dist/__tests__/tsconfig-upgrader.test.d.ts.map +0 -1
  146. package/dist/__tests__/tsconfig-upgrader.test.js +0 -31
  147. package/dist/__tests__/tsconfig-upgrader.test.js.map +0 -1
  148. package/dist/ca-certificate/validation.test.d.ts +0 -2
  149. package/dist/ca-certificate/validation.test.d.ts.map +0 -1
  150. package/dist/ca-certificate/validation.test.js +0 -131
  151. package/dist/ca-certificate/validation.test.js.map +0 -1
  152. package/dist/common/analytics/cli-invocation.test.d.ts +0 -2
  153. package/dist/common/analytics/cli-invocation.test.d.ts.map +0 -1
  154. package/dist/common/analytics/cli-invocation.test.js +0 -51
  155. package/dist/common/analytics/cli-invocation.test.js.map +0 -1
  156. package/dist/common/analytics/package-manager.test.d.ts +0 -2
  157. package/dist/common/analytics/package-manager.test.d.ts.map +0 -1
  158. package/dist/common/analytics/package-manager.test.js +0 -163
  159. package/dist/common/analytics/package-manager.test.js.map +0 -1
  160. package/dist/common/cli-dispatcher.test.d.ts +0 -2
  161. package/dist/common/cli-dispatcher.test.d.ts.map +0 -1
  162. package/dist/common/cli-dispatcher.test.js +0 -80
  163. package/dist/common/cli-dispatcher.test.js.map +0 -1
  164. package/dist/common/middleware/check-pnpm-lifecycle.test.d.ts +0 -2
  165. package/dist/common/middleware/check-pnpm-lifecycle.test.d.ts.map +0 -1
  166. package/dist/common/middleware/check-pnpm-lifecycle.test.js +0 -125
  167. package/dist/common/middleware/check-pnpm-lifecycle.test.js.map +0 -1
  168. package/dist/common/middleware/get-environment-param.test.d.ts +0 -2
  169. package/dist/common/middleware/get-environment-param.test.d.ts.map +0 -1
  170. package/dist/common/middleware/get-environment-param.test.js +0 -57
  171. package/dist/common/middleware/get-environment-param.test.js.map +0 -1
  172. package/dist/common/read-linked-config.test.d.ts +0 -2
  173. package/dist/common/read-linked-config.test.d.ts.map +0 -1
  174. package/dist/common/read-linked-config.test.js +0 -363
  175. package/dist/common/read-linked-config.test.js.map +0 -1
  176. package/dist/common/terminal.test.d.ts +0 -2
  177. package/dist/common/terminal.test.d.ts.map +0 -1
  178. package/dist/common/terminal.test.js +0 -101
  179. package/dist/common/terminal.test.js.map +0 -1
  180. package/dist/common/utils/build-environment-prompt-choices.test.d.ts +0 -2
  181. package/dist/common/utils/build-environment-prompt-choices.test.d.ts.map +0 -1
  182. package/dist/common/utils/build-environment-prompt-choices.test.js +0 -97
  183. package/dist/common/utils/build-environment-prompt-choices.test.js.map +0 -1
  184. package/dist/common/utils/format-environment-type.test.d.ts +0 -2
  185. package/dist/common/utils/format-environment-type.test.d.ts.map +0 -1
  186. package/dist/common/utils/format-environment-type.test.js +0 -32
  187. package/dist/common/utils/format-environment-type.test.js.map +0 -1
  188. package/dist/common/utils/pnpm-lifecycle.test.d.ts +0 -2
  189. package/dist/common/utils/pnpm-lifecycle.test.d.ts.map +0 -1
  190. package/dist/common/utils/pnpm-lifecycle.test.js +0 -196
  191. package/dist/common/utils/pnpm-lifecycle.test.js.map +0 -1
  192. package/dist/common/utils/pretty-print-environment-prompt.test.d.ts +0 -2
  193. package/dist/common/utils/pretty-print-environment-prompt.test.d.ts.map +0 -1
  194. package/dist/common/utils/pretty-print-environment-prompt.test.js +0 -42
  195. package/dist/common/utils/pretty-print-environment-prompt.test.js.map +0 -1
  196. package/dist/common/utils/sort-environments-for-prompt.test.d.ts +0 -2
  197. package/dist/common/utils/sort-environments-for-prompt.test.d.ts.map +0 -1
  198. package/dist/common/utils/sort-environments-for-prompt.test.js +0 -82
  199. package/dist/common/utils/sort-environments-for-prompt.test.js.map +0 -1
  200. package/dist/common/utils/stringify-config.test.d.ts +0 -2
  201. package/dist/common/utils/stringify-config.test.d.ts.map +0 -1
  202. package/dist/common/utils/stringify-config.test.js +0 -80
  203. package/dist/common/utils/stringify-config.test.js.map +0 -1
  204. package/dist/common/validators/argument-validators.spec.d.ts +0 -2
  205. package/dist/common/validators/argument-validators.spec.d.ts.map +0 -1
  206. package/dist/common/validators/argument-validators.spec.js +0 -181
  207. package/dist/common/validators/argument-validators.spec.js.map +0 -1
  208. package/dist/deploy/archive.local-registry.test.d.ts +0 -2
  209. package/dist/deploy/archive.local-registry.test.d.ts.map +0 -1
  210. package/dist/deploy/archive.local-registry.test.js +0 -100
  211. package/dist/deploy/archive.local-registry.test.js.map +0 -1
  212. package/dist/deploy/archive.test.d.ts +0 -2
  213. package/dist/deploy/archive.test.d.ts.map +0 -1
  214. package/dist/deploy/archive.test.js +0 -248
  215. package/dist/deploy/archive.test.js.map +0 -1
  216. package/dist/deploy/classify-build-probe.test.d.ts +0 -2
  217. package/dist/deploy/classify-build-probe.test.d.ts.map +0 -1
  218. package/dist/deploy/classify-build-probe.test.js +0 -51
  219. package/dist/deploy/classify-build-probe.test.js.map +0 -1
  220. package/dist/deploy/poll-deployment.test.d.ts +0 -2
  221. package/dist/deploy/poll-deployment.test.d.ts.map +0 -1
  222. package/dist/deploy/poll-deployment.test.js +0 -158
  223. package/dist/deploy/poll-deployment.test.js.map +0 -1
  224. package/dist/dev/zuplo-local-gitignore.test.d.ts +0 -2
  225. package/dist/dev/zuplo-local-gitignore.test.d.ts.map +0 -1
  226. package/dist/dev/zuplo-local-gitignore.test.js +0 -58
  227. package/dist/dev/zuplo-local-gitignore.test.js.map +0 -1
  228. package/dist/editor/e2e/editor.spec.d.ts +0 -2
  229. package/dist/editor/e2e/editor.spec.d.ts.map +0 -1
  230. package/dist/editor/e2e/editor.spec.js +0 -44
  231. package/dist/editor/e2e/editor.spec.js.map +0 -1
  232. package/dist/link/project-type.test.d.ts +0 -2
  233. package/dist/link/project-type.test.d.ts.map +0 -1
  234. package/dist/link/project-type.test.js +0 -225
  235. package/dist/link/project-type.test.js.map +0 -1
  236. package/dist/lint/resolve-binary.test.d.ts +0 -2
  237. package/dist/lint/resolve-binary.test.d.ts.map +0 -1
  238. package/dist/lint/resolve-binary.test.js +0 -155
  239. package/dist/lint/resolve-binary.test.js.map +0 -1
  240. package/dist/open-api/convert/handler.spec.d.ts +0 -2
  241. package/dist/open-api/convert/handler.spec.d.ts.map +0 -1
  242. package/dist/open-api/convert/handler.spec.js +0 -301
  243. package/dist/open-api/convert/handler.spec.js.map +0 -1
  244. package/dist/open-api/merge/handler.spec.d.ts +0 -2
  245. package/dist/open-api/merge/handler.spec.d.ts.map +0 -1
  246. package/dist/open-api/merge/handler.spec.js +0 -673
  247. package/dist/open-api/merge/handler.spec.js.map +0 -1
  248. package/dist/open-api/overlay/handler.spec.d.ts +0 -2
  249. package/dist/open-api/overlay/handler.spec.d.ts.map +0 -1
  250. package/dist/open-api/overlay/handler.spec.js +0 -346
  251. package/dist/open-api/overlay/handler.spec.js.map +0 -1
  252. package/dist/source/ai-gateway/files.test.d.ts +0 -2
  253. package/dist/source/ai-gateway/files.test.d.ts.map +0 -1
  254. package/dist/source/ai-gateway/files.test.js +0 -135
  255. package/dist/source/ai-gateway/files.test.js.map +0 -1
  256. package/dist/source/ai-gateway/handler.test.d.ts +0 -2
  257. package/dist/source/ai-gateway/handler.test.d.ts.map +0 -1
  258. package/dist/source/ai-gateway/handler.test.js +0 -113
  259. package/dist/source/ai-gateway/handler.test.js.map +0 -1
  260. package/dist/source/ai-gateway/package.test.d.ts +0 -2
  261. package/dist/source/ai-gateway/package.test.d.ts.map +0 -1
  262. package/dist/source/ai-gateway/package.test.js +0 -30
  263. package/dist/source/ai-gateway/package.test.js.map +0 -1
  264. package/dist/source/ai-gateway/planner.test.d.ts +0 -2
  265. package/dist/source/ai-gateway/planner.test.d.ts.map +0 -1
  266. package/dist/source/ai-gateway/planner.test.js +0 -330
  267. package/dist/source/ai-gateway/planner.test.js.map +0 -1
  268. package/dist/source/ai-gateway/release.test.d.ts +0 -2
  269. package/dist/source/ai-gateway/release.test.d.ts.map +0 -1
  270. package/dist/source/ai-gateway/release.test.js +0 -62
  271. package/dist/source/ai-gateway/release.test.js.map +0 -1
  272. package/dist/test/invoke-test.test.d.ts +0 -2
  273. package/dist/test/invoke-test.test.d.ts.map +0 -1
  274. package/dist/test/invoke-test.test.js +0 -150
  275. package/dist/test/invoke-test.test.js.map +0 -1
  276. package/dist/test/test-files.test.d.ts +0 -2
  277. package/dist/test/test-files.test.d.ts.map +0 -1
  278. package/dist/test/test-files.test.js +0 -57
  279. package/dist/test/test-files.test.js.map +0 -1
  280. package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.d.ts +0 -2
  281. package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.d.ts.map +0 -1
  282. package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.js +0 -289
  283. package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.js.map +0 -1
  284. package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.d.ts +0 -2
  285. package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.d.ts.map +0 -1
  286. package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.js +0 -181
  287. package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.js.map +0 -1
  288. package/node_modules/@zuplo/openapi-tools/dist/merge.spec.d.ts +0 -2
  289. package/node_modules/@zuplo/openapi-tools/dist/merge.spec.d.ts.map +0 -1
  290. package/node_modules/@zuplo/openapi-tools/dist/merge.spec.js +0 -399
  291. package/node_modules/@zuplo/openapi-tools/dist/merge.spec.js.map +0 -1
  292. package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.d.ts +0 -2
  293. package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.d.ts.map +0 -1
  294. package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.js +0 -779
  295. package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.js.map +0 -1
  296. package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.d.ts +0 -2
  297. package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.d.ts.map +0 -1
  298. package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.js +0 -269
  299. package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.js.map +0 -1
  300. package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.d.ts +0 -2
  301. package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.d.ts.map +0 -1
  302. package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.js +0 -93
  303. package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.js.map +0 -1
  304. package/node_modules/@zuplo/runtime/out/esm/chunk-6YPRGG62.js.map +0 -1
  305. package/node_modules/@zuplo/runtime/out/esm/chunk-PBDT4FDO.js +0 -37
  306. package/node_modules/@zuplo/runtime/out/esm/chunk-PBDT4FDO.js.map +0 -1
  307. /package/node_modules/@zuplo/runtime/out/esm/{chunk-YJ2BHVUH.js.map → chunk-CDEAY3VY.js.map} +0 -0
  308. /package/node_modules/@zuplo/runtime/out/esm/{chunk-PBDT4FDO.js.LEGAL.txt → chunk-LVSZ3WTO.js.LEGAL.txt} +0 -0
  309. /package/node_modules/@zuplo/runtime/out/esm/{chunk-VTO3F6DK.js.map → chunk-NUVXDVLJ.js.map} +0 -0
  310. /package/node_modules/@zuplo/runtime/out/esm/{chunk-6YPRGG62.js.LEGAL.txt → chunk-RHU3Z7DA.js.LEGAL.txt} +0 -0
@@ -1,82 +0,0 @@
1
- import nock from "nock";
2
- import settings from "../../common/settings.js";
3
- export const TEST_AUTH_TOKEN = "test-auth-token-123";
4
- export const TEST_ACCOUNT_NAME = "test-account";
5
- export const TEST_PROJECT_NAME = "test-project";
6
- export const TEST_BRANCH_NAME = "main";
7
- export const TEST_DEPLOYMENT_NAME = "test-deployment";
8
- export const TEST_API_BASE = settings.ZUPLO_DEVELOPER_API_ENDPOINT;
9
- export function setupAuthenticatedNock(scope) {
10
- return scope.matchHeader("authorization", `Bearer ${TEST_AUTH_TOKEN}`);
11
- }
12
- export function setupTestEnvironment() {
13
- process.env.ZUPLO_DEVELOPER_API_ENDPOINT =
14
- settings.ZUPLO_DEVELOPER_API_ENDPOINT;
15
- process.env.ZUPLO_API_KEY = TEST_AUTH_TOKEN;
16
- setupAuthenticatedNock(nock(TEST_API_BASE))
17
- .get("/v1/who-am-i")
18
- .reply(200, { user: "test-user@example.com" })
19
- .persist();
20
- }
21
- export function cleanupTest() {
22
- nock.cleanAll();
23
- delete process.env.ZUPLO_DEVELOPER_API_ENDPOINT;
24
- delete process.env.ZUPLO_API_KEY;
25
- }
26
- export class RequestCapture {
27
- requests = [];
28
- capture(req, _interceptor, body) {
29
- const captured = {
30
- method: req.method || "GET",
31
- path: req.path || "",
32
- headers: this.normalizeHeaders(req.headers || {}),
33
- };
34
- if (body) {
35
- if (typeof body === "string") {
36
- try {
37
- captured.body = JSON.parse(body);
38
- }
39
- catch {
40
- captured.body = "[FormData or non-JSON body]";
41
- }
42
- }
43
- else {
44
- captured.body = body;
45
- }
46
- }
47
- this.requests.push(captured);
48
- }
49
- getRequests() {
50
- return [...this.requests];
51
- }
52
- clear() {
53
- this.requests = [];
54
- }
55
- normalizeHeaders(headers) {
56
- const normalized = {};
57
- for (const [key, value] of Object.entries(headers)) {
58
- const normalizedKey = key.toLowerCase();
59
- if (normalizedKey === "authorization") {
60
- normalized[normalizedKey] = "[REDACTED]";
61
- }
62
- else if (normalizedKey === "user-agent") {
63
- normalized[normalizedKey] = "[USER_AGENT]";
64
- }
65
- else if (normalizedKey === "content-length") {
66
- normalized[normalizedKey] = "[CONTENT_LENGTH]";
67
- }
68
- else if (normalizedKey === "host") {
69
- normalized[normalizedKey] = "[HOST]";
70
- }
71
- else if (normalizedKey === "content-type" &&
72
- String(value).startsWith("multipart/form-data")) {
73
- normalized[normalizedKey] = "multipart/form-data; boundary=[BOUNDARY]";
74
- }
75
- else {
76
- normalized[normalizedKey] = String(value);
77
- }
78
- }
79
- return normalized;
80
- }
81
- }
82
- //# sourceMappingURL=test-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../../src/__tests__/integration/test-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Test utilities for CLI integration tests with nock interceptors\n */\nimport nock from \"nock\";\nimport settings from \"../../common/settings.js\";\n\n// Constants for testing\nexport const TEST_AUTH_TOKEN = \"test-auth-token-123\";\nexport const TEST_ACCOUNT_NAME = \"test-account\";\nexport const TEST_PROJECT_NAME = \"test-project\";\nexport const TEST_BRANCH_NAME = \"main\";\nexport const TEST_DEPLOYMENT_NAME = \"test-deployment\";\n\n// Base API endpoint for tests\nexport const TEST_API_BASE = settings.ZUPLO_DEVELOPER_API_ENDPOINT;\n\n/**\n * Common nock setup for authenticated requests\n */\nexport function setupAuthenticatedNock(scope: nock.Scope): nock.Scope {\n return scope.matchHeader(\"authorization\", `Bearer ${TEST_AUTH_TOKEN}`);\n}\n\n/**\n * Setup common environment variables for tests\n */\nexport function setupTestEnvironment() {\n process.env.ZUPLO_DEVELOPER_API_ENDPOINT =\n settings.ZUPLO_DEVELOPER_API_ENDPOINT;\n\n process.env.ZUPLO_API_KEY = TEST_AUTH_TOKEN;\n\n // Add a catch-all for any authentication validation calls\n setupAuthenticatedNock(nock(TEST_API_BASE))\n .get(\"/v1/who-am-i\")\n .reply(200, { user: \"test-user@example.com\" })\n .persist();\n}\n\n/**\n * Clean up environment and nock after tests\n */\nexport function cleanupTest() {\n nock.cleanAll();\n\n delete process.env.ZUPLO_DEVELOPER_API_ENDPOINT;\n\n delete process.env.ZUPLO_API_KEY;\n}\n\n/**\n * Helper to capture and normalize nock requests for snapshots\n */\nexport interface CapturedRequest {\n method: string;\n path: string;\n headers: Record<string, string>;\n body?: unknown;\n}\n\ninterface NockRequest {\n method?: string;\n path?: string;\n headers?: Record<string, unknown>;\n}\n\nexport class RequestCapture {\n private requests: CapturedRequest[] = [];\n\n capture(req: NockRequest, _interceptor?: unknown, body?: unknown): void {\n const captured: CapturedRequest = {\n method: req.method || \"GET\",\n path: req.path || \"\",\n headers: this.normalizeHeaders(req.headers || {}),\n };\n\n if (body) {\n if (typeof body === \"string\") {\n try {\n captured.body = JSON.parse(body);\n } catch {\n // If JSON parsing fails, store as string (e.g., FormData)\n captured.body = \"[FormData or non-JSON body]\";\n }\n } else {\n captured.body = body;\n }\n }\n\n this.requests.push(captured);\n }\n\n getRequests(): CapturedRequest[] {\n return [...this.requests];\n }\n\n clear(): void {\n this.requests = [];\n }\n\n private normalizeHeaders(\n headers: Record<string, unknown>\n ): Record<string, string> {\n const normalized: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(headers)) {\n // Normalize header names to lowercase and exclude dynamic values\n const normalizedKey = key.toLowerCase();\n\n if (normalizedKey === \"authorization\") {\n normalized[normalizedKey] = \"[REDACTED]\";\n } else if (normalizedKey === \"user-agent\") {\n normalized[normalizedKey] = \"[USER_AGENT]\";\n } else if (normalizedKey === \"content-length\") {\n normalized[normalizedKey] = \"[CONTENT_LENGTH]\";\n } else if (normalizedKey === \"host\") {\n normalized[normalizedKey] = \"[HOST]\";\n } else if (\n normalizedKey === \"content-type\" &&\n String(value).startsWith(\"multipart/form-data\")\n ) {\n normalized[normalizedKey] = \"multipart/form-data; boundary=[BOUNDARY]\";\n } else {\n normalized[normalizedKey] = String(value);\n }\n }\n\n return normalized;\n }\n}\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tunnel.integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tunnel.integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/tunnel.integration.test.ts"],"names":[],"mappings":""}
@@ -1,486 +0,0 @@
1
- import nock from "nock";
2
- import tmp from "tmp";
3
- import yargs from "yargs/yargs";
4
- import tunnelCommand from "../../cmds/tunnel/index.js";
5
- import { cleanupTest, RequestCapture, setupAuthenticatedNock, setupTestEnvironment, TEST_ACCOUNT_NAME, TEST_API_BASE, TEST_AUTH_TOKEN, } from "./test-utils.js";
6
- async function executeTunnelCommand(subcommand, args) {
7
- const yargsInstance = yargs([])
8
- .command(tunnelCommand)
9
- .help(false)
10
- .version(false)
11
- .exitProcess(false);
12
- const commandArgs = ["tunnel", subcommand];
13
- if (args.account) {
14
- commandArgs.push("--account", args.account);
15
- }
16
- if (args["api-key"]) {
17
- commandArgs.push("--api-key", args["api-key"]);
18
- }
19
- if (args["tunnel-name"]) {
20
- commandArgs.push("--tunnel-name", args["tunnel-name"]);
21
- }
22
- if (args["tunnel-id"]) {
23
- commandArgs.push("--tunnel-id", args["tunnel-id"]);
24
- }
25
- return await yargsInstance.parse(commandArgs);
26
- }
27
- async function executeTunnelServicesCommand(subcommand, args) {
28
- const yargsInstance = yargs([])
29
- .command(tunnelCommand)
30
- .help(false)
31
- .version(false)
32
- .exitProcess(false);
33
- const commandArgs = ["tunnel", "services", subcommand];
34
- if (args.account) {
35
- commandArgs.push("--account", args.account);
36
- }
37
- if (args["api-key"]) {
38
- commandArgs.push("--api-key", args["api-key"]);
39
- }
40
- if (args["tunnel-id"]) {
41
- commandArgs.push("--tunnel-id", args["tunnel-id"]);
42
- }
43
- if (args["configuration-file"]) {
44
- commandArgs.push("--configuration-file", args["configuration-file"]);
45
- }
46
- return await yargsInstance.parse(commandArgs);
47
- }
48
- const mockPrintResult = jest.mocked(require("../../common/output.js").printResultToConsoleAndExitGracefully);
49
- const mockPrintTable = jest.mocked(require("../../common/output.js").printTableToConsoleAndExitGracefully);
50
- const mockPrintDiagnostics = jest.mocked(require("../../common/output.js").printDiagnosticsToConsole);
51
- describe("Tunnel Command Integration Tests", () => {
52
- let requestCapture;
53
- beforeEach(() => {
54
- setupTestEnvironment();
55
- requestCapture = new RequestCapture();
56
- nock.disableNetConnect();
57
- jest.clearAllMocks();
58
- });
59
- afterEach(() => {
60
- cleanupTest();
61
- requestCapture.clear();
62
- });
63
- describe("Tunnel Create Command", () => {
64
- it("should intercept POST request to create tunnel", async () => {
65
- const testTunnelName = "my-test-tunnel";
66
- const mockResponse = {
67
- id: "tunnel-123",
68
- name: testTunnelName,
69
- token: "tunnel-token-abc123",
70
- };
71
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
72
- .post(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels`)
73
- .reply(201, mockResponse);
74
- scope.on("request", (req, interceptor, body) => {
75
- requestCapture.capture(req, interceptor, body);
76
- });
77
- await executeTunnelCommand("create", {
78
- account: TEST_ACCOUNT_NAME,
79
- "api-key": TEST_AUTH_TOKEN,
80
- "tunnel-name": testTunnelName,
81
- });
82
- expect(scope.isDone()).toBe(true);
83
- expect(mockPrintTable).toHaveBeenCalledWith(mockResponse);
84
- const capturedRequests = requestCapture.getRequests();
85
- expect(capturedRequests).toMatchSnapshot("tunnel-create-requests");
86
- const request = capturedRequests[0];
87
- expect(request.method).toBe("POST");
88
- expect(request.body).toEqual({
89
- name: testTunnelName,
90
- });
91
- });
92
- it("should handle tunnel creation error", async () => {
93
- const testTunnelName = "invalid-tunnel";
94
- const errorResponse = {
95
- error: "Bad Request",
96
- message: "Tunnel name already exists",
97
- statusCode: 400,
98
- };
99
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
100
- .post(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels`)
101
- .reply(400, errorResponse);
102
- scope.on("request", (req, interceptor, body) => {
103
- requestCapture.capture(req, interceptor, body);
104
- });
105
- await expect(executeTunnelCommand("create", {
106
- account: TEST_ACCOUNT_NAME,
107
- "api-key": TEST_AUTH_TOKEN,
108
- "tunnel-name": testTunnelName,
109
- })).rejects.toThrow("Failed to create tunnel for account");
110
- expect(scope.isDone()).toBe(true);
111
- expect(mockPrintDiagnostics).toHaveBeenCalled();
112
- const capturedRequests = requestCapture.getRequests();
113
- expect(capturedRequests).toMatchSnapshot("tunnel-create-error-requests");
114
- });
115
- });
116
- describe("Tunnel List Command", () => {
117
- it("should intercept GET request to list tunnels", async () => {
118
- const mockResponse = {
119
- data: [
120
- { id: "tunnel-123", name: "tunnel-1" },
121
- { id: "tunnel-456", name: "tunnel-2" },
122
- ],
123
- };
124
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
125
- .get(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels`)
126
- .reply(200, mockResponse);
127
- scope.on("request", (req, interceptor, body) => {
128
- requestCapture.capture(req, interceptor, body);
129
- });
130
- await executeTunnelCommand("list", {
131
- account: TEST_ACCOUNT_NAME,
132
- "api-key": TEST_AUTH_TOKEN,
133
- });
134
- expect(scope.isDone()).toBe(true);
135
- const expectedTable = [
136
- { "tunnel-id": "tunnel-123", name: "tunnel-1" },
137
- { "tunnel-id": "tunnel-456", name: "tunnel-2" },
138
- ];
139
- expect(mockPrintTable).toHaveBeenCalledWith(expectedTable);
140
- const capturedRequests = requestCapture.getRequests();
141
- expect(capturedRequests).toMatchSnapshot("tunnel-list-requests");
142
- });
143
- it("should handle empty tunnels list", async () => {
144
- const mockResponse = { data: [] };
145
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
146
- .get(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels`)
147
- .reply(200, mockResponse);
148
- scope.on("request", (req, interceptor, body) => {
149
- requestCapture.capture(req, interceptor, body);
150
- });
151
- await executeTunnelCommand("list", {
152
- account: TEST_ACCOUNT_NAME,
153
- "api-key": TEST_AUTH_TOKEN,
154
- });
155
- expect(scope.isDone()).toBe(true);
156
- expect(mockPrintResult).toHaveBeenCalledWith("No tunnels found");
157
- const capturedRequests = requestCapture.getRequests();
158
- expect(capturedRequests).toMatchSnapshot("tunnel-list-empty-requests");
159
- });
160
- it("should handle API error responses", async () => {
161
- const errorResponse = {
162
- error: "Forbidden",
163
- message: "Access denied",
164
- statusCode: 403,
165
- };
166
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
167
- .get(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels`)
168
- .reply(403, errorResponse);
169
- scope.on("request", (req, interceptor, body) => {
170
- requestCapture.capture(req, interceptor, body);
171
- });
172
- await expect(executeTunnelCommand("list", {
173
- account: TEST_ACCOUNT_NAME,
174
- "api-key": TEST_AUTH_TOKEN,
175
- })).rejects.toThrow("Failed to list tunnels for account");
176
- expect(scope.isDone()).toBe(true);
177
- expect(mockPrintDiagnostics).toHaveBeenCalled();
178
- const capturedRequests = requestCapture.getRequests();
179
- expect(capturedRequests).toMatchSnapshot("tunnel-list-error-requests");
180
- });
181
- });
182
- describe("Tunnel Delete Command", () => {
183
- it("should intercept DELETE request to delete tunnel", async () => {
184
- const tunnelId = "test-tunnel-123";
185
- const mockTeardownResponse = {
186
- id: "teardown-op-456",
187
- status: "in-progress",
188
- };
189
- const mockCompletedTeardown = {
190
- id: "teardown-op-456",
191
- status: "success",
192
- message: "Tunnel deleted successfully",
193
- };
194
- const deleteScope = setupAuthenticatedNock(nock(TEST_API_BASE))
195
- .delete(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels/${tunnelId}`)
196
- .reply(200, mockTeardownResponse);
197
- const pollScope = setupAuthenticatedNock(nock(TEST_API_BASE))
198
- .get(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels/${tunnelId}/teardown-operations/teardown-op-456`)
199
- .reply(200, mockCompletedTeardown);
200
- deleteScope.on("request", (req, interceptor, body) => {
201
- requestCapture.capture(req, interceptor, body);
202
- });
203
- pollScope.on("request", (req, interceptor, body) => {
204
- requestCapture.capture(req, interceptor, body);
205
- });
206
- await executeTunnelCommand("delete", {
207
- account: TEST_ACCOUNT_NAME,
208
- "api-key": TEST_AUTH_TOKEN,
209
- "tunnel-id": tunnelId,
210
- });
211
- expect(deleteScope.isDone()).toBe(true);
212
- expect(pollScope.isDone()).toBe(true);
213
- expect(mockPrintResult).toHaveBeenCalledWith("Tunnel test-tunnel-123 deleted successfully.");
214
- const capturedRequests = requestCapture.getRequests();
215
- expect(capturedRequests).toMatchSnapshot("tunnel-delete-requests");
216
- });
217
- it("should handle tunnel deletion error", async () => {
218
- const tunnelId = "nonexistent-tunnel";
219
- const errorResponse = {
220
- error: "Not Found",
221
- message: "Tunnel not found",
222
- statusCode: 404,
223
- };
224
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
225
- .delete(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels/${tunnelId}`)
226
- .reply(404, errorResponse);
227
- scope.on("request", (req, interceptor, body) => {
228
- requestCapture.capture(req, interceptor, body);
229
- });
230
- await expect(executeTunnelCommand("delete", {
231
- account: TEST_ACCOUNT_NAME,
232
- "api-key": TEST_AUTH_TOKEN,
233
- "tunnel-id": tunnelId,
234
- })).rejects.toThrow("Failed to delete tunnel for account");
235
- expect(scope.isDone()).toBe(true);
236
- expect(mockPrintDiagnostics).toHaveBeenCalled();
237
- const capturedRequests = requestCapture.getRequests();
238
- expect(capturedRequests).toMatchSnapshot("tunnel-delete-error-requests");
239
- });
240
- });
241
- describe("Tunnel Describe Command", () => {
242
- it("should intercept GET request to describe tunnel", async () => {
243
- const tunnelId = "test-tunnel-123";
244
- const mockTunnelDetails = {
245
- id: tunnelId,
246
- name: "Test Tunnel",
247
- status: "active",
248
- endpoint: "https://test-tunnel.zuplo.dev",
249
- };
250
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
251
- .get(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels/${tunnelId}`)
252
- .reply(200, mockTunnelDetails);
253
- scope.on("request", (req, interceptor, body) => {
254
- requestCapture.capture(req, interceptor, body);
255
- });
256
- await executeTunnelCommand("describe", {
257
- account: TEST_ACCOUNT_NAME,
258
- "api-key": TEST_AUTH_TOKEN,
259
- "tunnel-id": tunnelId,
260
- });
261
- expect(scope.isDone()).toBe(true);
262
- expect(mockPrintTable).toHaveBeenCalledWith(mockTunnelDetails);
263
- const capturedRequests = requestCapture.getRequests();
264
- expect(capturedRequests).toMatchSnapshot("tunnel-describe-requests");
265
- });
266
- it("should handle tunnel describe error", async () => {
267
- const tunnelId = "nonexistent-tunnel";
268
- const errorResponse = {
269
- error: "Not Found",
270
- message: "Tunnel not found",
271
- statusCode: 404,
272
- };
273
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
274
- .get(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels/${tunnelId}`)
275
- .reply(404, errorResponse);
276
- scope.on("request", (req, interceptor, body) => {
277
- requestCapture.capture(req, interceptor, body);
278
- });
279
- await expect(executeTunnelCommand("describe", {
280
- account: TEST_ACCOUNT_NAME,
281
- "api-key": TEST_AUTH_TOKEN,
282
- "tunnel-id": tunnelId,
283
- })).rejects.toThrow("Failed to describe tunnel for account");
284
- expect(scope.isDone()).toBe(true);
285
- expect(mockPrintDiagnostics).toHaveBeenCalled();
286
- const capturedRequests = requestCapture.getRequests();
287
- expect(capturedRequests).toMatchSnapshot("tunnel-describe-error-requests");
288
- });
289
- });
290
- describe("Tunnel Rotate Token Command", () => {
291
- it("should intercept POST request to rotate tunnel token", async () => {
292
- const tunnelId = "test-tunnel-123";
293
- const mockTokenResponse = {
294
- tunnelId: tunnelId,
295
- newToken: "new-token-abc123",
296
- message: "Token rotated successfully",
297
- };
298
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
299
- .post(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels/${tunnelId}/$rotate-token`)
300
- .reply(200, mockTokenResponse);
301
- scope.on("request", (req, interceptor, body) => {
302
- requestCapture.capture(req, interceptor, body);
303
- });
304
- await executeTunnelCommand("rotate-token", {
305
- account: TEST_ACCOUNT_NAME,
306
- "api-key": TEST_AUTH_TOKEN,
307
- "tunnel-id": tunnelId,
308
- });
309
- expect(scope.isDone()).toBe(true);
310
- expect(mockPrintTable).toHaveBeenCalledWith(mockTokenResponse);
311
- const capturedRequests = requestCapture.getRequests();
312
- expect(capturedRequests).toMatchSnapshot("tunnel-rotate-token-requests");
313
- });
314
- it("should handle token rotation error", async () => {
315
- const tunnelId = "nonexistent-tunnel";
316
- const errorResponse = {
317
- error: "Forbidden",
318
- message: "Access denied",
319
- statusCode: 403,
320
- };
321
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
322
- .post(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels/${tunnelId}/$rotate-token`)
323
- .reply(403, errorResponse);
324
- scope.on("request", (req, interceptor, body) => {
325
- requestCapture.capture(req, interceptor, body);
326
- });
327
- await expect(executeTunnelCommand("rotate-token", {
328
- account: TEST_ACCOUNT_NAME,
329
- "api-key": TEST_AUTH_TOKEN,
330
- "tunnel-id": tunnelId,
331
- })).rejects.toThrow("Failed to rotate token for tunnel");
332
- expect(scope.isDone()).toBe(true);
333
- expect(mockPrintDiagnostics).toHaveBeenCalled();
334
- const capturedRequests = requestCapture.getRequests();
335
- expect(capturedRequests).toMatchSnapshot("tunnel-rotate-token-error-requests");
336
- });
337
- });
338
- describe("Tunnel Services Describe Command", () => {
339
- it("should intercept GET request to describe tunnel services", async () => {
340
- const tunnelId = "test-tunnel-123";
341
- const mockServicesResponse = {
342
- tunnelId: tunnelId,
343
- services: [
344
- { name: "api-service", port: 3000, status: "running" },
345
- { name: "web-service", port: 8080, status: "running" },
346
- ],
347
- };
348
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
349
- .get(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels/${tunnelId}/services-configuration`)
350
- .reply(200, mockServicesResponse);
351
- scope.on("request", (req, interceptor, body) => {
352
- requestCapture.capture(req, interceptor, body);
353
- });
354
- await executeTunnelServicesCommand("describe", {
355
- account: TEST_ACCOUNT_NAME,
356
- "api-key": TEST_AUTH_TOKEN,
357
- "tunnel-id": tunnelId,
358
- });
359
- expect(scope.isDone()).toBe(true);
360
- expect(mockPrintResult).toHaveBeenCalledWith(JSON.stringify(mockServicesResponse, null, 2));
361
- const capturedRequests = requestCapture.getRequests();
362
- expect(capturedRequests).toMatchSnapshot("tunnel-services-describe-requests");
363
- });
364
- it("should handle services describe error", async () => {
365
- const tunnelId = "nonexistent-tunnel";
366
- const errorResponse = {
367
- error: "Not Found",
368
- message: "Tunnel not found",
369
- statusCode: 404,
370
- };
371
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
372
- .get(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels/${tunnelId}/services-configuration`)
373
- .reply(404, errorResponse);
374
- scope.on("request", (req, interceptor, body) => {
375
- requestCapture.capture(req, interceptor, body);
376
- });
377
- await expect(executeTunnelServicesCommand("describe", {
378
- account: TEST_ACCOUNT_NAME,
379
- "api-key": TEST_AUTH_TOKEN,
380
- "tunnel-id": tunnelId,
381
- })).rejects.toThrow("Failed to describe services for tunnel");
382
- expect(scope.isDone()).toBe(true);
383
- expect(mockPrintDiagnostics).toHaveBeenCalled();
384
- const capturedRequests = requestCapture.getRequests();
385
- expect(capturedRequests).toMatchSnapshot("tunnel-services-describe-error-requests");
386
- });
387
- });
388
- describe("Tunnel Services Update Command", () => {
389
- it("should handle services update error due to file not found", async () => {
390
- const tunnelId = "test-tunnel-123";
391
- const configFile = "/nonexistent/config.json";
392
- await expect(executeTunnelServicesCommand("update", {
393
- account: TEST_ACCOUNT_NAME,
394
- "api-key": TEST_AUTH_TOKEN,
395
- "tunnel-id": tunnelId,
396
- "configuration-file": configFile,
397
- })).rejects.toThrow("--configuration-file: File not found:");
398
- });
399
- it("should handle services update API error", async () => {
400
- const tunnelId = "test-tunnel-123";
401
- const fs = require("node:fs");
402
- const tmpFile = tmp.fileSync({ postfix: ".json" });
403
- fs.writeFileSync(tmpFile.fd, '{"services": []}');
404
- const tempConfigFile = tmpFile.name;
405
- try {
406
- const errorResponse = {
407
- error: "Bad Request",
408
- message: "Invalid configuration file",
409
- statusCode: 400,
410
- };
411
- const scope = setupAuthenticatedNock(nock(TEST_API_BASE))
412
- .put(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels/${tunnelId}/services-configuration`)
413
- .reply(400, errorResponse);
414
- scope.on("request", (req, interceptor, body) => {
415
- requestCapture.capture(req, interceptor, body);
416
- });
417
- await expect(executeTunnelServicesCommand("update", {
418
- account: TEST_ACCOUNT_NAME,
419
- "api-key": TEST_AUTH_TOKEN,
420
- "tunnel-id": tunnelId,
421
- "configuration-file": tempConfigFile,
422
- })).rejects.toThrow("Failed to update tunnel for account");
423
- expect(scope.isDone()).toBe(true);
424
- expect(mockPrintDiagnostics).toHaveBeenCalled();
425
- const capturedRequests = requestCapture.getRequests();
426
- expect(capturedRequests).toMatchSnapshot("tunnel-services-update-error-requests");
427
- }
428
- finally {
429
- try {
430
- if (tmpFile && typeof tmpFile.removeCallback === "function") {
431
- tmpFile.removeCallback();
432
- }
433
- }
434
- catch {
435
- }
436
- }
437
- });
438
- });
439
- describe("Request validation", () => {
440
- it("should include correct headers for create request", async () => {
441
- const testTunnelName = "test-tunnel";
442
- const mockResponse = {
443
- id: "tunnel-123",
444
- name: testTunnelName,
445
- token: "tunnel-token-abc123",
446
- };
447
- const scope = nock(TEST_API_BASE)
448
- .post(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels`)
449
- .matchHeader("authorization", `Bearer ${TEST_AUTH_TOKEN}`)
450
- .matchHeader("content-type", "application/json")
451
- .reply(201, mockResponse);
452
- scope.on("request", (req, interceptor, body) => {
453
- requestCapture.capture(req, interceptor, body);
454
- });
455
- await executeTunnelCommand("create", {
456
- account: TEST_ACCOUNT_NAME,
457
- "api-key": TEST_AUTH_TOKEN,
458
- "tunnel-name": testTunnelName,
459
- });
460
- expect(scope.isDone()).toBe(true);
461
- const capturedRequests = requestCapture.getRequests();
462
- expect(capturedRequests).toMatchSnapshot("tunnel-create-headers-validation");
463
- });
464
- it("should include correct headers for list request", async () => {
465
- const mockResponse = { data: [{ id: "tunnel-123", name: "tunnel-1" }] };
466
- const scope = nock(TEST_API_BASE)
467
- .get(`/v1/accounts/${TEST_ACCOUNT_NAME}/tunnels`)
468
- .matchHeader("authorization", `Bearer ${TEST_AUTH_TOKEN}`)
469
- .reply(200, mockResponse);
470
- scope.on("request", (req, interceptor, body) => {
471
- requestCapture.capture(req, interceptor, body);
472
- });
473
- await executeTunnelCommand("list", {
474
- account: TEST_ACCOUNT_NAME,
475
- "api-key": TEST_AUTH_TOKEN,
476
- });
477
- expect(scope.isDone()).toBe(true);
478
- const capturedRequests = requestCapture.getRequests();
479
- expect(capturedRequests).toMatchSnapshot("tunnel-list-headers-validation");
480
- const request = capturedRequests[0];
481
- expect(request.method).toBe("GET");
482
- expect(request.body).toBeUndefined();
483
- });
484
- });
485
- });
486
- //# sourceMappingURL=tunnel.integration.test.js.map