@zuplo/cli 6.63.3 → 6.63.5

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 (154) hide show
  1. package/dist/cmds/delete.d.ts.map +1 -1
  2. package/dist/cmds/delete.js +3 -6
  3. package/dist/cmds/delete.js.map +1 -1
  4. package/dist/cmds/deploy.d.ts.map +1 -1
  5. package/dist/cmds/deploy.js +6 -13
  6. package/dist/cmds/deploy.js.map +1 -1
  7. package/dist/cmds/dev.d.ts.map +1 -1
  8. package/dist/cmds/dev.js +1 -0
  9. package/dist/cmds/dev.js.map +1 -1
  10. package/dist/cmds/editor.d.ts.map +1 -1
  11. package/dist/cmds/editor.js +8 -0
  12. package/dist/cmds/editor.js.map +1 -1
  13. package/dist/cmds/link.d.ts.map +1 -1
  14. package/dist/cmds/link.js +4 -14
  15. package/dist/cmds/link.js.map +1 -1
  16. package/dist/cmds/list.d.ts.map +1 -1
  17. package/dist/cmds/list.js +4 -10
  18. package/dist/cmds/list.js.map +1 -1
  19. package/dist/cmds/mtls-certificates/create.d.ts.map +1 -1
  20. package/dist/cmds/mtls-certificates/create.js +19 -4
  21. package/dist/cmds/mtls-certificates/create.js.map +1 -1
  22. package/dist/cmds/mtls-certificates/delete.d.ts.map +1 -1
  23. package/dist/cmds/mtls-certificates/delete.js +12 -1
  24. package/dist/cmds/mtls-certificates/delete.js.map +1 -1
  25. package/dist/cmds/mtls-certificates/describe.d.ts.map +1 -1
  26. package/dist/cmds/mtls-certificates/describe.js +12 -1
  27. package/dist/cmds/mtls-certificates/describe.js.map +1 -1
  28. package/dist/cmds/mtls-certificates/disable.d.ts +9 -0
  29. package/dist/cmds/mtls-certificates/disable.d.ts.map +1 -0
  30. package/dist/cmds/mtls-certificates/disable.js +57 -0
  31. package/dist/cmds/mtls-certificates/disable.js.map +1 -0
  32. package/dist/cmds/mtls-certificates/index.d.ts.map +1 -1
  33. package/dist/cmds/mtls-certificates/index.js +3 -1
  34. package/dist/cmds/mtls-certificates/index.js.map +1 -1
  35. package/dist/cmds/mtls-certificates/list.d.ts.map +1 -1
  36. package/dist/cmds/mtls-certificates/list.js +12 -1
  37. package/dist/cmds/mtls-certificates/list.js.map +1 -1
  38. package/dist/cmds/mtls-certificates/update.d.ts.map +1 -1
  39. package/dist/cmds/mtls-certificates/update.js +19 -4
  40. package/dist/cmds/mtls-certificates/update.js.map +1 -1
  41. package/dist/cmds/open-api/convert.d.ts.map +1 -1
  42. package/dist/cmds/open-api/convert.js +15 -0
  43. package/dist/cmds/open-api/convert.js.map +1 -1
  44. package/dist/cmds/open-api/merge.d.ts.map +1 -1
  45. package/dist/cmds/open-api/merge.js +15 -0
  46. package/dist/cmds/open-api/merge.js.map +1 -1
  47. package/dist/cmds/open-api/overlay.d.ts.map +1 -1
  48. package/dist/cmds/open-api/overlay.js +16 -1
  49. package/dist/cmds/open-api/overlay.js.map +1 -1
  50. package/dist/cmds/project/create.d.ts.map +1 -1
  51. package/dist/cmds/project/create.js +12 -0
  52. package/dist/cmds/project/create.js.map +1 -1
  53. package/dist/cmds/proxies/create.d.ts.map +1 -1
  54. package/dist/cmds/proxies/create.js +11 -0
  55. package/dist/cmds/proxies/create.js.map +1 -1
  56. package/dist/cmds/proxies/delete.d.ts.map +1 -1
  57. package/dist/cmds/proxies/delete.js +11 -0
  58. package/dist/cmds/proxies/delete.js.map +1 -1
  59. package/dist/cmds/proxies/describe.d.ts.map +1 -1
  60. package/dist/cmds/proxies/describe.js +11 -0
  61. package/dist/cmds/proxies/describe.js.map +1 -1
  62. package/dist/cmds/proxies/update.d.ts.map +1 -1
  63. package/dist/cmds/proxies/update.js +11 -0
  64. package/dist/cmds/proxies/update.js.map +1 -1
  65. package/dist/cmds/source/import-openapi.d.ts.map +1 -1
  66. package/dist/cmds/source/import-openapi.js +1 -0
  67. package/dist/cmds/source/import-openapi.js.map +1 -1
  68. package/dist/cmds/source/migrate.d.ts.map +1 -1
  69. package/dist/cmds/source/migrate.js +15 -0
  70. package/dist/cmds/source/migrate.js.map +1 -1
  71. package/dist/cmds/source/upgrade.d.ts.map +1 -1
  72. package/dist/cmds/source/upgrade.js +11 -0
  73. package/dist/cmds/source/upgrade.js.map +1 -1
  74. package/dist/cmds/test.d.ts.map +1 -1
  75. package/dist/cmds/test.js +1 -0
  76. package/dist/cmds/test.js.map +1 -1
  77. package/dist/cmds/tunnel/create.d.ts.map +1 -1
  78. package/dist/cmds/tunnel/create.js +8 -0
  79. package/dist/cmds/tunnel/create.js.map +1 -1
  80. package/dist/cmds/tunnel/delete.d.ts.map +1 -1
  81. package/dist/cmds/tunnel/delete.js +11 -0
  82. package/dist/cmds/tunnel/delete.js.map +1 -1
  83. package/dist/cmds/tunnel/describe.d.ts.map +1 -1
  84. package/dist/cmds/tunnel/describe.js +11 -0
  85. package/dist/cmds/tunnel/describe.js.map +1 -1
  86. package/dist/cmds/tunnel/list.d.ts.map +1 -1
  87. package/dist/cmds/tunnel/list.js +8 -0
  88. package/dist/cmds/tunnel/list.js.map +1 -1
  89. package/dist/cmds/tunnel/rotate-token.d.ts.map +1 -1
  90. package/dist/cmds/tunnel/rotate-token.js +11 -0
  91. package/dist/cmds/tunnel/rotate-token.js.map +1 -1
  92. package/dist/cmds/tunnel/services/describe.d.ts.map +1 -1
  93. package/dist/cmds/tunnel/services/describe.js +11 -0
  94. package/dist/cmds/tunnel/services/describe.js.map +1 -1
  95. package/dist/cmds/tunnel/services/update.d.ts.map +1 -1
  96. package/dist/cmds/tunnel/services/update.js +11 -0
  97. package/dist/cmds/tunnel/services/update.js.map +1 -1
  98. package/dist/cmds/variable/create.d.ts.map +1 -1
  99. package/dist/cmds/variable/create.js +15 -0
  100. package/dist/cmds/variable/create.js.map +1 -1
  101. package/dist/cmds/variable/update.d.ts.map +1 -1
  102. package/dist/cmds/variable/update.js +11 -0
  103. package/dist/cmds/variable/update.js.map +1 -1
  104. package/dist/common/open-api/constants.d.ts +13 -0
  105. package/dist/common/open-api/constants.d.ts.map +1 -0
  106. package/dist/common/open-api/constants.js +16 -0
  107. package/dist/common/open-api/constants.js.map +1 -0
  108. package/dist/common/open-api/index.d.ts +3 -0
  109. package/dist/common/open-api/index.d.ts.map +1 -0
  110. package/dist/common/open-api/index.js +3 -0
  111. package/dist/common/open-api/index.js.map +1 -0
  112. package/dist/common/open-api/validation.d.ts +297 -0
  113. package/dist/common/open-api/validation.d.ts.map +1 -0
  114. package/dist/common/open-api/validation.js +88 -0
  115. package/dist/common/open-api/validation.js.map +1 -0
  116. package/dist/deploy/handler.js +3 -2
  117. package/dist/deploy/handler.js.map +1 -1
  118. package/dist/mtls-certificates/create/handler.js +1 -1
  119. package/dist/mtls-certificates/create/handler.js.map +1 -1
  120. package/dist/mtls-certificates/describe/handler.js +3 -3
  121. package/dist/mtls-certificates/describe/handler.js.map +1 -1
  122. package/dist/mtls-certificates/disable/handler.d.ts +3 -0
  123. package/dist/mtls-certificates/disable/handler.d.ts.map +1 -0
  124. package/dist/mtls-certificates/disable/handler.js +32 -0
  125. package/dist/mtls-certificates/disable/handler.js.map +1 -0
  126. package/dist/mtls-certificates/list/handler.js +3 -3
  127. package/dist/mtls-certificates/list/handler.js.map +1 -1
  128. package/dist/mtls-certificates/models.d.ts +8 -2
  129. package/dist/mtls-certificates/models.d.ts.map +1 -1
  130. package/dist/mtls-certificates/models.js.map +1 -1
  131. package/dist/mtls-certificates/update/handler.js +2 -2
  132. package/dist/mtls-certificates/update/handler.js.map +1 -1
  133. package/dist/open-api/merge/merge-engine.d.ts +2 -5
  134. package/dist/open-api/merge/merge-engine.d.ts.map +1 -1
  135. package/dist/open-api/merge/merge-engine.js +2 -1
  136. package/dist/open-api/merge/merge-engine.js.map +1 -1
  137. package/dist/open-api/merge/utils.d.ts +0 -1
  138. package/dist/open-api/merge/utils.d.ts.map +1 -1
  139. package/dist/open-api/merge/utils.js +2 -11
  140. package/dist/open-api/merge/utils.js.map +1 -1
  141. package/dist/open-api/overlay/handler.d.ts.map +1 -1
  142. package/dist/open-api/overlay/handler.js +33 -33
  143. package/dist/open-api/overlay/handler.js.map +1 -1
  144. package/dist/open-api/overlay/overlay-engine.d.ts +20 -30
  145. package/dist/open-api/overlay/overlay-engine.d.ts.map +1 -1
  146. package/dist/open-api/overlay/overlay-engine.js +75 -46
  147. package/dist/open-api/overlay/overlay-engine.js.map +1 -1
  148. package/dist/open-api/overlay/overlay-engine.spec.js +109 -31
  149. package/dist/open-api/overlay/overlay-engine.spec.js.map +1 -1
  150. package/dist/source/migrate/dev-portal/handler.d.ts.map +1 -1
  151. package/dist/source/migrate/dev-portal/handler.js +48 -1
  152. package/dist/source/migrate/dev-portal/handler.js.map +1 -1
  153. package/dist/tsconfig.tsbuildinfo +1 -1
  154. package/package.json +6 -5
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/deploy/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,sBAAsB,IAAI,wBAAwB,EAClD,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,oCAAoC,EACpC,yBAAyB,EACzB,qCAAqC,EACrC,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,iCAAiC,EACjC,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkBjE,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAe;IAC1C,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAsB,CAAC;QACpC,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAe;IAEzC,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,8BAA8B,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAGtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElC,MAAM,OAAO,GAAG;QACd,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC,MAAM;QAC5C,aAAa,EAAE,eAAe,CAAC,QAAQ,CAAC,OAAO;QAC/C,GAAG,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG;KAClC,CAAC;IAEF,MAAM,iBAAiB,GAAG,MAAM,KAAK,CACnC,GAAG,QAAQ,CAAC,4BAA4B,4BAA4B,EACpE;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;SAC1C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CACF,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,wBAAwB,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjE,IAAI,iBAAiB,CAAC,EAAE,EAAE,CAAC;QAEzB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAEnE,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC;YAClC,WAAW,EAAE,eAAe,CAAC,OAAO;YACpC,SAAS;YACT,YAAY;YACZ,GAAG,OAAO;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,oBAAoB,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAE1D,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,qBAAqB,CACnC,kBAAkB,OAAO,CAAC,WAAW,qBAAqB,OAAO,iBAAiB,OAAO,MAAM,CAChG,CAAC;YAEF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAC1C,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,OAAO,EACP,OAAO,CACR,CAAC;YACF,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,qCAAqC,CACzC,eAAe,GAAG,EAAE,EACpB,OAAO,CACR,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,oCAAoC,CACxC,oCACE,eAAe,CAAC,QAAQ,CAAC,MAC3B,eAAe,OAAO,eAAe,OAAO,qBAAqB,YAAY;MACjF,MAAM,EAAE,EACJ,OAAO,CACR,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CACV;gBACE,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;aACtC,EACD,0CAA0C,CAC3C,CAAC;YACF,yBAAyB,CACvB,8DAA8D,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,iBAAiB,CAAC,MAAM;YAChC,UAAU,EAAE,iBAAiB,CAAC,UAAU;SACzC,EACD,8BAA8B,CAC/B,CAAC;QACF,MAAM,oCAAoC,CACxC,8DAA8D,CAC/D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAoB;IACpD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElC,IAAI,gBAAoC,CAAC;IAEzC,IAAI,CAAC;QAEH,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAI5D,gBAAgB,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,qBAAqB,GAAG,MAAM,2BAA2B,CAC7D,MAAM,EACN,IAAI,CACL,CAAC;YACF,MAAM,gBAAgB,CAAC;gBACrB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,WAAW,EAAE,qBAAqB,CAAC,IAAI;gBACvC,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,KAAK,YAAY,iCAAiC;gBAElD,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAC9C,CAAC;gBACD,qBAAqB,CACnB;;;uCAG6B,IAAI,CAAC,OAAO,4CAA4C,CACtF,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,YAAY,iCAAiC,EAAE,CAAC;gBAC9D,MAAM,oCAAoC,CACxC;uCAC6B,IAAI,CAAC,OAAO;mHACgE,CAC1G,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,uCAAuC,CAAC,CAAC;gBAC7D,MAAM,oCAAoC,CACxC;uCAC6B,IAAI,CAAC,OAAO,4CAA4C,CACtF,CAAC;YACJ,CAAC;QACH,CAAC;QAGD,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,8BAA8B,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAGtE,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,GAAG,OAAO,IAAI,eAAe,CAClD,eAAe,CAAC,QAAQ,CAAC,MAAM,CAChC,EAAE,CAAC;QACJ,IAAI,CAAC,GAAG,CACN,MAAM,EACN,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE;YAChD,IAAI,EAAE,kBAAkB;SACzB,CAAC,CACH,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAE3C,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,uBAAuB,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;aAC1C;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,wBAAwB,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;QAEjE,IAAI,iBAAiB,CAAC,EAAE,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,qBAAqB,CACnC,gCAAgC,eAAe,CAAC,QAAQ,CAAC,MAAM,eAAe,OAAO,eAAe,OAAO,KAAK,CACjH,CAAC;YAGF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;YAErD,MAAM,CAAC,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;YAEpD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAExE,IAAI,WAAW,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;gBAE7C,MAAM,kBAAkB,GAAG,MAAM,KAAK,CACpC,GAAG,QAAQ,mBAAmB,cAAc,EAAE,EAC9C;oBACE,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE;wBAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;qBAC1C;iBACF,CACF,CAAC;gBACF,MAAM,cAAc,GAClB,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAAC;gBAClC,kCAAkC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBAE3D,MAAM,qCAAqC,CACzC,eAAe,cAAc,CAAC,aAAa,EAAE,EAC7C,OAAO,CACR,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,kCAAkC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBAC3D,MAAM,oCAAoC,CACxC,qEAAqE,IAAI,CAAC,SAAS,CACjF,WAAW,CACZ,EAAE,EACH,OAAO,CACR,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CACV,MAAM,iBAAiB,CAAC,IAAI,EAAE,EAC9B,gDAAgD,CACjD,CAAC;YACF,MAAM,oCAAoC,CACxC,uDAAuD,CACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,kCAAkC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAoB;IACpD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IAC9D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,cAAc,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,kCAAkC,CACzC,IAAoB,EACpB,aAAiC;IAEjC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;QAC9D,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,MAAc,EAAU,EAAE;IAEjD,OAAO,MAAM;SACV,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACpB,WAAW,EAAE;SACb,SAAS,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;AAC5C,CAAC,CAAC","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport {\n MAX_PRETTY_BRANCH_NAME as MAX_PRETTY_BRANCH_LENGTH,\n ZUPLO_SYSTEM_ENV_VAR,\n} from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n printSpinnerToConsole,\n printWarningToConsole,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { RequiredProperties } from \"../common/utils/types.js\";\nimport { normalizeUrl } from \"../common/utils/urls.js\";\nimport { pullSystemConfig } from \"../common/populate.js\";\nimport { archive, generateMetadata } from \"./archive.js\";\nimport {\n UnableToAutoLinkToExistingProject,\n retrieveOrCreateEnvironment,\n} from \"./environments.js\";\nimport { upload } from \"./file-upload.js\";\nimport { pollBuild, pollDeployment } from \"./poll-deployment.js\";\n\nexport interface Arguments {\n account: string;\n project: string;\n dir: string;\n environment?: string;\n authToken: string;\n \"verify-remote\"?: boolean;\n \"self-hosted-endpoint\"?: string;\n \"override-repo-url\"?: string;\n}\n\nexport type SelfHostedArgs = RequiredProperties<\n Arguments,\n \"self-hosted-endpoint\"\n>;\n\nexport async function deploy(argv: Arguments) {\n if (argv[\"self-hosted-endpoint\"]) {\n const args = argv as SelfHostedArgs;\n await deployToSelfHosted(args);\n } else {\n await deployToSaas(argv);\n }\n}\n\nasync function deployToSaas(argv: Arguments) {\n // 1. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata.tarball}`);\n\n // 2. Build uploadUrl request\n const { account, project } = argv;\n\n const payload = {\n accountName: account,\n projectName: project,\n environment: archiveMetadata.metadata.branch,\n repositoryUrl: archiveMetadata.metadata.repoUrl,\n sha: archiveMetadata.metadata.sha,\n };\n\n const uploadUrlResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/deployments/source-url`,\n {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n body: JSON.stringify(payload),\n }\n );\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n // 3. Upload to request URL\n const { uploadUrl, deploymentId } = await uploadUrlResponse.json();\n\n const uploadResponse = await upload({\n tarballPath: archiveMetadata.tarball,\n uploadUrl,\n deploymentId,\n ...payload,\n });\n\n logger.debug(`Upload response: ${uploadResponse.status}`);\n\n if (uploadResponse.ok) {\n const spinner = printSpinnerToConsole(\n `Deploying the '${payload.environment}' environment to '${project}' on account '${account}'...`\n );\n\n const { url, logUrl } = await pollDeployment(\n argv,\n deploymentId,\n account,\n project,\n spinner\n );\n if (url) {\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${url}`,\n spinner\n );\n } else {\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the environment ${\n archiveMetadata.metadata.branch\n } to project ${project} on account ${account}.\\nDeployment ID: ${deploymentId}\\nFor more information, check the deployment logs in the Zuplo dashboard.\\n\n ${logUrl}`,\n spinner\n );\n }\n } else {\n logger.error(\n {\n status: uploadResponse.status,\n statusText: uploadResponse.statusText,\n },\n \"Failed to upload source to cloud storage\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to upload deployment source. Please try again.\"\n );\n }\n } else {\n logger.error(\n {\n status: uploadUrlResponse.status,\n statusText: uploadUrlResponse.statusText,\n },\n \"Failed to retrieve uploadUrl\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to upload deployment source. Please try again.\"\n );\n }\n}\n\nasync function deployToSelfHosted(argv: SelfHostedArgs) {\n const { account, project } = argv;\n\n let existingZuploEnv: string | undefined;\n\n try {\n // 0. Finagle the URL first\n const endpoint = normalizeUrl(argv[\"self-hosted-endpoint\"]);\n\n // 1. Perform the link on-behalf-of-the-user\n // Store the current .env.zuplo if there is one and restore it later\n existingZuploEnv = retrieveExistingZuploEnv(argv);\n const branch = (await generateMetadata(argv)).branch;\n try {\n const environmentToAutoLink = await retrieveOrCreateEnvironment(\n branch,\n argv\n );\n await pullSystemConfig({\n dir: argv.dir,\n environment: environmentToAutoLink.name,\n authToken: argv.authToken,\n });\n } catch (error) {\n if (\n error instanceof UnableToAutoLinkToExistingProject &&\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n process.env.ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS\n ) {\n printWarningToConsole(\n `We are unable to fetch the environment variables from Zuplo for this project. \nDeployment will proceed because ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS is set. \nHowever, the environment variables will not be available. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.`\n );\n } else if (error instanceof UnableToAutoLinkToExistingProject) {\n await printCriticalFailureToConsoleAndExit(\n `We are unable to fetch the environment variables from Zuplo for this project. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.\nIf you want to force deployment without the environment variables, set ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS to true.`\n );\n } else {\n logger.error(error, \"Failed to fetch environment variables\");\n await printCriticalFailureToConsoleAndExit(\n `We are unable to fetch the environment variables from Zuplo for this project. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.`\n );\n }\n }\n\n // 2. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata.tarball}`);\n\n // 3. Build uploadUrl request\n const form = new FormData();\n const deploymentName = `${project}-${getPrettyBranch(\n archiveMetadata.metadata.branch\n )}`;\n form.set(\n \"file\",\n new Blob([readFileSync(archiveMetadata.tarball)], {\n type: \"application/gzip\",\n })\n );\n form.set(\"projectName\", project);\n form.set(\"deploymentName\", deploymentName);\n\n const uploadUrlResponse = await fetch(`${endpoint}/v1/deployments/build`, {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n body: form,\n });\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n const spinner = printSpinnerToConsole(\n `Deploying the current branch ${archiveMetadata.metadata.branch} to project ${project} on account ${account}...`\n );\n\n // 4. Poll for build\n const { buildName } = await uploadUrlResponse.json();\n\n logger.debug(`Deployment started for ${buildName}`);\n\n const buildResult = await pollBuild(argv, endpoint, buildName, spinner);\n\n if (buildResult.conditionType === \"Complete\") {\n // Retrieve the deployment\n const deploymentResponse = await fetch(\n `${endpoint}/v1/deployments/${deploymentName}`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n const deploymentJSON: { deploymentUrl: string } =\n await deploymentResponse.json();\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${deploymentJSON.deploymentUrl}`,\n spinner\n );\n } else {\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the current environment. Here's the diagnostics: ${JSON.stringify(\n buildResult\n )}`,\n spinner\n );\n }\n } else {\n logger.error(\n await uploadUrlResponse.text(),\n \"Failed to upload to self-hosted build endpoint\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to upload to self-hosted build endpoint\"\n );\n }\n } catch (error) {\n logger.error(error);\n } finally {\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n }\n}\n\nfunction retrieveExistingZuploEnv(argv: SelfHostedArgs): string | undefined {\n const normalizedDir = resolve(argv.dir);\n const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n if (existsSync(envFilePath)) {\n const envFileContent = readFileSync(envFilePath, \"utf-8\");\n return envFileContent;\n } else {\n return undefined;\n }\n}\n\nfunction restoreExistingZuploEnvAsNecessary(\n argv: SelfHostedArgs,\n originalValue: string | undefined\n) {\n if (originalValue) {\n const normalizedDir = resolve(argv.dir);\n const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n writeFileSync(envFilePath, originalValue);\n }\n}\n\nconst getPrettyBranch = (branch: string): string => {\n // https://ricardometring.com/javascript-replace-special-characters\n return branch\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\") // Remove accents\n .replace(/([^\\w]+|\\s+)/g, \"-\") // Replace space and other characters by hyphen\n .replace(/--+/g, \"-\") // Replaces multiple hyphens by one hyphen\n .replace(/(^-+|-+$)/, \"\") // Remove extra hyphens from beginning or end of the string\n .replaceAll(\"_\", \"-\") // Replace underscores by hyphens (Url hosts cannot have underscores)\n .toLowerCase()\n .substring(0, MAX_PRETTY_BRANCH_LENGTH);\n};\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/deploy/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,sBAAsB,IAAI,wBAAwB,EAClD,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,oCAAoC,EACpC,yBAAyB,EACzB,qCAAqC,EACrC,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,iCAAiC,EACjC,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkBjE,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAe;IAC1C,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAsB,CAAC;QACpC,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAe;IAEzC,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,8BAA8B,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAGtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElC,MAAM,OAAO,GAAG;QACd,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC,MAAM;QAC5C,aAAa,EAAE,eAAe,CAAC,QAAQ,CAAC,OAAO;QAC/C,GAAG,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG;KAClC,CAAC;IAEF,MAAM,iBAAiB,GAAG,MAAM,KAAK,CACnC,GAAG,QAAQ,CAAC,4BAA4B,4BAA4B,EACpE;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;SAC1C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CACF,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,wBAAwB,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjE,IAAI,iBAAiB,CAAC,EAAE,EAAE,CAAC;QAEzB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAEnE,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC;YAClC,WAAW,EAAE,eAAe,CAAC,OAAO;YACpC,SAAS;YACT,YAAY;YACZ,GAAG,OAAO;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,oBAAoB,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAE1D,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,qBAAqB,CACnC,kBAAkB,OAAO,CAAC,WAAW,qBAAqB,OAAO,iBAAiB,OAAO,MAAM,CAChG,CAAC;YAEF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAC1C,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,OAAO,EACP,OAAO,CACR,CAAC;YACF,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,qCAAqC,CACzC,eAAe,GAAG,EAAE,EACpB,OAAO,CACR,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,oCAAoC,CACxC,oCACE,eAAe,CAAC,QAAQ,CAAC,MAC3B,eAAe,OAAO,eAAe,OAAO,qBAAqB,YAAY;MACjF,MAAM,EAAE,EACJ,OAAO,CACR,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CACV;gBACE,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;aACtC,EACD,0CAA0C,CAC3C,CAAC;YACF,yBAAyB,CACvB,8DAA8D,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,iBAAiB,CAAC,MAAM;YAChC,UAAU,EAAE,iBAAiB,CAAC,UAAU;SACzC,EACD,8BAA8B,CAC/B,CAAC;QACF,MAAM,oCAAoC,CACxC,8DAA8D,CAC/D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAoB;IACpD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElC,IAAI,gBAAoC,CAAC;IAEzC,IAAI,CAAC;QAEH,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAI5D,gBAAgB,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,qBAAqB,GAAG,MAAM,2BAA2B,CAC7D,MAAM,EACN,IAAI,CACL,CAAC;YACF,MAAM,gBAAgB,CAAC;gBACrB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,WAAW,EAAE,qBAAqB,CAAC,IAAI;gBACvC,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,KAAK,YAAY,iCAAiC;gBAElD,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAC9C,CAAC;gBACD,qBAAqB,CACnB;;;uCAG6B,IAAI,CAAC,OAAO,4CAA4C,CACtF,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,YAAY,iCAAiC,EAAE,CAAC;gBAC9D,MAAM,oCAAoC,CACxC;uCAC6B,IAAI,CAAC,OAAO;mHACgE,CAC1G,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,uCAAuC,CAAC,CAAC;gBAC7D,MAAM,oCAAoC,CACxC;uCAC6B,IAAI,CAAC,OAAO,4CAA4C,CACtF,CAAC;YACJ,CAAC;QACH,CAAC;QAGD,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,8BAA8B,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAGtE,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,GAAG,OAAO,IAAI,eAAe,CAClD,eAAe,CAAC,QAAQ,CAAC,MAAM,CAChC,EAAE,CAAC;QACJ,IAAI,CAAC,GAAG,CACN,MAAM,EACN,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE;YAChD,IAAI,EAAE,kBAAkB;SACzB,CAAC,CACH,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAE3C,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,uBAAuB,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;aAC1C;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,wBAAwB,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;QAEjE,IAAI,iBAAiB,CAAC,EAAE,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,qBAAqB,CACnC,gCAAgC,eAAe,CAAC,QAAQ,CAAC,MAAM,eAAe,OAAO,eAAe,OAAO,KAAK,CACjH,CAAC;YAGF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;YAErD,MAAM,CAAC,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;YAEpD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAExE,IAAI,WAAW,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;gBAE7C,MAAM,kBAAkB,GAAG,MAAM,KAAK,CACpC,GAAG,QAAQ,mBAAmB,cAAc,EAAE,EAC9C;oBACE,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE;wBAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;qBAC1C;iBACF,CACF,CAAC;gBACF,MAAM,cAAc,GAClB,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAAC;gBAClC,kCAAkC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBAE3D,MAAM,qCAAqC,CACzC,eAAe,cAAc,CAAC,aAAa,EAAE,EAC7C,OAAO,CACR,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,kCAAkC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBAC3D,MAAM,oCAAoC,CACxC,qEAAqE,IAAI,CAAC,SAAS,CACjF,WAAW,CACZ,EAAE,EACH,OAAO,CACR,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CACV,MAAM,iBAAiB,CAAC,IAAI,EAAE,EAC9B,gDAAgD,CACjD,CAAC;YACF,MAAM,oCAAoC,CACxC,uDAAuD,CACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,kCAAkC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAoB;IACpD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IAC9D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,cAAc,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,kCAAkC,CACzC,IAAoB,EACpB,aAAiC;IAEjC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;QAC9D,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,MAAc,EAAU,EAAE;IAEjD,OAAO,CACL,MAAM;SACH,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACpB,WAAW,EAAE;SACb,SAAS,CAAC,CAAC,EAAE,wBAAwB,CAAC;SAEtC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CACrB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport {\n MAX_PRETTY_BRANCH_NAME as MAX_PRETTY_BRANCH_LENGTH,\n ZUPLO_SYSTEM_ENV_VAR,\n} from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n printSpinnerToConsole,\n printWarningToConsole,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { RequiredProperties } from \"../common/utils/types.js\";\nimport { normalizeUrl } from \"../common/utils/urls.js\";\nimport { pullSystemConfig } from \"../common/populate.js\";\nimport { archive, generateMetadata } from \"./archive.js\";\nimport {\n UnableToAutoLinkToExistingProject,\n retrieveOrCreateEnvironment,\n} from \"./environments.js\";\nimport { upload } from \"./file-upload.js\";\nimport { pollBuild, pollDeployment } from \"./poll-deployment.js\";\n\nexport interface Arguments {\n account: string;\n project: string;\n dir: string;\n environment?: string;\n authToken: string;\n \"verify-remote\"?: boolean;\n \"self-hosted-endpoint\"?: string;\n \"override-repo-url\"?: string;\n}\n\nexport type SelfHostedArgs = RequiredProperties<\n Arguments,\n \"self-hosted-endpoint\"\n>;\n\nexport async function deploy(argv: Arguments) {\n if (argv[\"self-hosted-endpoint\"]) {\n const args = argv as SelfHostedArgs;\n await deployToSelfHosted(args);\n } else {\n await deployToSaas(argv);\n }\n}\n\nasync function deployToSaas(argv: Arguments) {\n // 1. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata.tarball}`);\n\n // 2. Build uploadUrl request\n const { account, project } = argv;\n\n const payload = {\n accountName: account,\n projectName: project,\n environment: archiveMetadata.metadata.branch,\n repositoryUrl: archiveMetadata.metadata.repoUrl,\n sha: archiveMetadata.metadata.sha,\n };\n\n const uploadUrlResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/deployments/source-url`,\n {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n body: JSON.stringify(payload),\n }\n );\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n // 3. Upload to request URL\n const { uploadUrl, deploymentId } = await uploadUrlResponse.json();\n\n const uploadResponse = await upload({\n tarballPath: archiveMetadata.tarball,\n uploadUrl,\n deploymentId,\n ...payload,\n });\n\n logger.debug(`Upload response: ${uploadResponse.status}`);\n\n if (uploadResponse.ok) {\n const spinner = printSpinnerToConsole(\n `Deploying the '${payload.environment}' environment to '${project}' on account '${account}'...`\n );\n\n const { url, logUrl } = await pollDeployment(\n argv,\n deploymentId,\n account,\n project,\n spinner\n );\n if (url) {\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${url}`,\n spinner\n );\n } else {\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the environment ${\n archiveMetadata.metadata.branch\n } to project ${project} on account ${account}.\\nDeployment ID: ${deploymentId}\\nFor more information, check the deployment logs in the Zuplo dashboard.\\n\n ${logUrl}`,\n spinner\n );\n }\n } else {\n logger.error(\n {\n status: uploadResponse.status,\n statusText: uploadResponse.statusText,\n },\n \"Failed to upload source to cloud storage\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to upload deployment source. Please try again.\"\n );\n }\n } else {\n logger.error(\n {\n status: uploadUrlResponse.status,\n statusText: uploadUrlResponse.statusText,\n },\n \"Failed to retrieve uploadUrl\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to upload deployment source. Please try again.\"\n );\n }\n}\n\nasync function deployToSelfHosted(argv: SelfHostedArgs) {\n const { account, project } = argv;\n\n let existingZuploEnv: string | undefined;\n\n try {\n // 0. Finagle the URL first\n const endpoint = normalizeUrl(argv[\"self-hosted-endpoint\"]);\n\n // 1. Perform the link on-behalf-of-the-user\n // Store the current .env.zuplo if there is one and restore it later\n existingZuploEnv = retrieveExistingZuploEnv(argv);\n const branch = (await generateMetadata(argv)).branch;\n try {\n const environmentToAutoLink = await retrieveOrCreateEnvironment(\n branch,\n argv\n );\n await pullSystemConfig({\n dir: argv.dir,\n environment: environmentToAutoLink.name,\n authToken: argv.authToken,\n });\n } catch (error) {\n if (\n error instanceof UnableToAutoLinkToExistingProject &&\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n process.env.ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS\n ) {\n printWarningToConsole(\n `We are unable to fetch the environment variables from Zuplo for this project. \nDeployment will proceed because ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS is set. \nHowever, the environment variables will not be available. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.`\n );\n } else if (error instanceof UnableToAutoLinkToExistingProject) {\n await printCriticalFailureToConsoleAndExit(\n `We are unable to fetch the environment variables from Zuplo for this project. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.\nIf you want to force deployment without the environment variables, set ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS to true.`\n );\n } else {\n logger.error(error, \"Failed to fetch environment variables\");\n await printCriticalFailureToConsoleAndExit(\n `We are unable to fetch the environment variables from Zuplo for this project. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.`\n );\n }\n }\n\n // 2. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata.tarball}`);\n\n // 3. Build uploadUrl request\n const form = new FormData();\n const deploymentName = `${project}-${getPrettyBranch(\n archiveMetadata.metadata.branch\n )}`;\n form.set(\n \"file\",\n new Blob([readFileSync(archiveMetadata.tarball)], {\n type: \"application/gzip\",\n })\n );\n form.set(\"projectName\", project);\n form.set(\"deploymentName\", deploymentName);\n\n const uploadUrlResponse = await fetch(`${endpoint}/v1/deployments/build`, {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n body: form,\n });\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n const spinner = printSpinnerToConsole(\n `Deploying the current branch ${archiveMetadata.metadata.branch} to project ${project} on account ${account}...`\n );\n\n // 4. Poll for build\n const { buildName } = await uploadUrlResponse.json();\n\n logger.debug(`Deployment started for ${buildName}`);\n\n const buildResult = await pollBuild(argv, endpoint, buildName, spinner);\n\n if (buildResult.conditionType === \"Complete\") {\n // Retrieve the deployment\n const deploymentResponse = await fetch(\n `${endpoint}/v1/deployments/${deploymentName}`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n const deploymentJSON: { deploymentUrl: string } =\n await deploymentResponse.json();\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${deploymentJSON.deploymentUrl}`,\n spinner\n );\n } else {\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the current environment. Here's the diagnostics: ${JSON.stringify(\n buildResult\n )}`,\n spinner\n );\n }\n } else {\n logger.error(\n await uploadUrlResponse.text(),\n \"Failed to upload to self-hosted build endpoint\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to upload to self-hosted build endpoint\"\n );\n }\n } catch (error) {\n logger.error(error);\n } finally {\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n }\n}\n\nfunction retrieveExistingZuploEnv(argv: SelfHostedArgs): string | undefined {\n const normalizedDir = resolve(argv.dir);\n const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n if (existsSync(envFilePath)) {\n const envFileContent = readFileSync(envFilePath, \"utf-8\");\n return envFileContent;\n } else {\n return undefined;\n }\n}\n\nfunction restoreExistingZuploEnvAsNecessary(\n argv: SelfHostedArgs,\n originalValue: string | undefined\n) {\n if (originalValue) {\n const normalizedDir = resolve(argv.dir);\n const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n writeFileSync(envFilePath, originalValue);\n }\n}\n\nconst getPrettyBranch = (branch: string): string => {\n // https://ricardometring.com/javascript-replace-special-characters\n return (\n branch\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\") // Remove accents\n .replace(/([^\\w]+|\\s+)/g, \"-\") // Replace space and other characters by hyphen\n .replace(/--+/g, \"-\") // Replaces multiple hyphens by one hyphen\n .replace(/(^-+|-+$)/, \"\") // Remove extra hyphens from beginning or end of the string\n .replaceAll(\"_\", \"-\") // Replace underscores by hyphens (Url hosts cannot have underscores)\n .toLowerCase()\n .substring(0, MAX_PRETTY_BRANCH_LENGTH)\n // Remove trailing hyphens since this can cause issues with image names in managed dedicated deploys\n .replace(/-$/, \"\")\n );\n};\n"]}
@@ -32,7 +32,7 @@ export async function create(argv) {
32
32
  name: argv.name,
33
33
  certificate,
34
34
  key,
35
- environments: argv.environment,
35
+ environments: argv["environment-type"],
36
36
  }),
37
37
  });
38
38
  if (createResponse.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/mtls-certificates/create/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAGhD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAqB;IAChD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElC,IAAI,WAAmB,CAAC;IACxB,IAAI,GAAW,CAAC;IAEhB,IAAI,CAAC;QACH,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,iCAAiC,CAAC,CAAC;QACvD,yBAAyB,CACvB,6CAA6C,IAAI,CAAC,IAAI,EAAE,EACxD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAC/C,yBAAyB,CACvB,qCAAqC,IAAI,CAAC,GAAG,EAAE,EAC/C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,oBAAoB,EACvG;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;YACzC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW;YACX,GAAG;YACH,YAAY,EAAE,IAAI,CAAC,WAAW;SAC/B,CAAC;KACH,CACF,CAAC;IAEF,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,GAAoB,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1D,oBAAoB,CAClB,qBAAqB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,wBAAwB,CACpE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,QAAQ,EAAE,OAAO;SAClB,EACD,mCAAmC,CACpC,CAAC;QACF,yBAAyB,CACvB,gEAAgE,EAChE,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n printDiagnosticsToConsole,\n printResultToConsole,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { CreateArguments, MtlsCertificate } from \"../models.js\";\n\nexport async function create(argv: CreateArguments) {\n const { account, project } = argv;\n\n let certificate: string;\n let key: string;\n\n try {\n certificate = readFileSync(argv.cert, \"utf-8\");\n } catch (error) {\n logger.error(error, \"Failed to read certificate file\");\n printDiagnosticsToConsole(\n `Error: Failed to read certificate file at ${argv.cert}`,\n error instanceof Error ? error.message : String(error)\n );\n return;\n }\n\n try {\n key = readFileSync(argv.key, \"utf-8\");\n } catch (error) {\n logger.error(error, \"Failed to read key file\");\n printDiagnosticsToConsole(\n `Error: Failed to read key file at ${argv.key}`,\n error instanceof Error ? error.message : String(error)\n );\n return;\n }\n\n const createResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/mtls-certificates`,\n {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: argv.name,\n certificate,\n key,\n environments: argv.environment,\n }),\n }\n );\n\n if (createResponse.ok) {\n const cert: MtlsCertificate = await createResponse.json();\n printResultToConsole(\n `mTLS certificate '${cert.name}' (${cert.id}) created successfully`\n );\n } else {\n const problem = textOrJson(await createResponse.text());\n logger.error(\n {\n status: createResponse.status,\n statusText: createResponse.statusText,\n response: problem,\n },\n \"Failed to create mTLS certificate\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to create mTLS certificate. Check the arguments.\",\n problem\n );\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/mtls-certificates/create/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAGhD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAqB;IAChD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElC,IAAI,WAAmB,CAAC;IACxB,IAAI,GAAW,CAAC;IAEhB,IAAI,CAAC;QACH,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,iCAAiC,CAAC,CAAC;QACvD,yBAAyB,CACvB,6CAA6C,IAAI,CAAC,IAAI,EAAE,EACxD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAC/C,yBAAyB,CACvB,qCAAqC,IAAI,CAAC,GAAG,EAAE,EAC/C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,oBAAoB,EACvG;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;YACzC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW;YACX,GAAG;YACH,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC;SACvC,CAAC;KACH,CACF,CAAC;IAEF,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,GAAoB,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1D,oBAAoB,CAClB,qBAAqB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,wBAAwB,CACpE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,QAAQ,EAAE,OAAO;SAClB,EACD,mCAAmC,CACpC,CAAC;QACF,yBAAyB,CACvB,gEAAgE,EAChE,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n printDiagnosticsToConsole,\n printResultToConsole,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { CreateArguments, MtlsCertificate } from \"../models.js\";\n\nexport async function create(argv: CreateArguments) {\n const { account, project } = argv;\n\n let certificate: string;\n let key: string;\n\n try {\n certificate = readFileSync(argv.cert, \"utf-8\");\n } catch (error) {\n logger.error(error, \"Failed to read certificate file\");\n printDiagnosticsToConsole(\n `Error: Failed to read certificate file at ${argv.cert}`,\n error instanceof Error ? error.message : String(error)\n );\n return;\n }\n\n try {\n key = readFileSync(argv.key, \"utf-8\");\n } catch (error) {\n logger.error(error, \"Failed to read key file\");\n printDiagnosticsToConsole(\n `Error: Failed to read key file at ${argv.key}`,\n error instanceof Error ? error.message : String(error)\n );\n return;\n }\n\n const createResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/mtls-certificates`,\n {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: argv.name,\n certificate,\n key,\n environments: argv[\"environment-type\"],\n }),\n }\n );\n\n if (createResponse.ok) {\n const cert: MtlsCertificate = await createResponse.json();\n printResultToConsole(\n `mTLS certificate '${cert.name}' (${cert.id}) created successfully`\n );\n } else {\n const problem = textOrJson(await createResponse.text());\n logger.error(\n {\n status: createResponse.status,\n statusText: createResponse.statusText,\n response: problem,\n },\n \"Failed to create mTLS certificate\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to create mTLS certificate. Check the arguments.\",\n problem\n );\n }\n}\n"]}
@@ -20,9 +20,9 @@ export async function describe(argv) {
20
20
  printResultToConsole(` ID: ${cert.id}\n` +
21
21
  ` Name: ${cert.name}\n` +
22
22
  ` Subject: ${subject}\n` +
23
- ` Valid From: ${cert.certificateInfo.validFrom}\n` +
24
- ` Valid To: ${cert.certificateInfo.validTo}\n` +
25
- ` Environments: ${envs}`);
23
+ ` Valid from: ${cert.certificateInfo.validFrom}\n` +
24
+ ` Valid to: ${cert.certificateInfo.validTo}\n` +
25
+ ` Environment types: ${envs}`);
26
26
  }
27
27
  else {
28
28
  const problem = textOrJson(await describeResponse.text());
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/mtls-certificates/describe/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAGhD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAuB;IACpD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/B,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAClC,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EACrI;QACE,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;SAC1C;KACF,CACF,CAAC;IAEF,IAAI,gBAAgB,CAAC,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,GAAoB,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAE5D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;aAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;aACnB,IAAI,CAAC,IAAI,CAAC,CAAC;QAGd,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAElE,oBAAoB,CAClB,SAAS,IAAI,CAAC,EAAE,IAAI;YAClB,WAAW,IAAI,CAAC,IAAI,IAAI;YACxB,cAAc,OAAO,IAAI;YACzB,iBAAiB,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI;YACnD,eAAe,IAAI,CAAC,eAAe,CAAC,OAAO,IAAI;YAC/C,mBAAmB,IAAI,EAAE,CAC5B,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,gBAAgB,CAAC,MAAM;YAC/B,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,QAAQ,EAAE,OAAO;SAClB,EACD,qCAAqC,CACtC,CAAC;QACF,yBAAyB,CACvB,6CAA6C,EAC7C,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printDiagnosticsToConsole,\n printResultToConsole,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { DescribeArguments, MtlsCertificate } from \"../models.js\";\n\nexport async function describe(argv: DescribeArguments) {\n const { account, project } = argv;\n const certId = argv[\"cert-id\"];\n\n const describeResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/mtls-certificates/${encodeURIComponent(certId)}`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n\n if (describeResponse.ok) {\n const cert: MtlsCertificate = await describeResponse.json();\n\n const envs = Object.entries(cert.environments)\n .filter(([, enabled]) => enabled)\n .map(([env]) => env)\n .join(\", \");\n\n // Replace newlines in subject with comma-space for cleaner display\n const subject = cert.certificateInfo.subject.replace(/\\n/g, \", \");\n\n printResultToConsole(\n ` ID: ${cert.id}\\n` +\n ` Name: ${cert.name}\\n` +\n ` Subject: ${subject}\\n` +\n ` Valid From: ${cert.certificateInfo.validFrom}\\n` +\n ` Valid To: ${cert.certificateInfo.validTo}\\n` +\n ` Environments: ${envs}`\n );\n } else {\n const problem = textOrJson(await describeResponse.text());\n logger.error(\n {\n status: describeResponse.status,\n statusText: describeResponse.statusText,\n response: problem,\n },\n \"Failed to describe mTLS certificate\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to describe mTLS certificate.\",\n problem\n );\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/mtls-certificates/describe/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAGhD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAuB;IACpD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/B,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAClC,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EACrI;QACE,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;SAC1C;KACF,CACF,CAAC;IAEF,IAAI,gBAAgB,CAAC,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,GAAoB,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAE5D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;aAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;aACnB,IAAI,CAAC,IAAI,CAAC,CAAC;QAGd,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAElE,oBAAoB,CAClB,SAAS,IAAI,CAAC,EAAE,IAAI;YAClB,WAAW,IAAI,CAAC,IAAI,IAAI;YACxB,cAAc,OAAO,IAAI;YACzB,iBAAiB,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI;YACnD,eAAe,IAAI,CAAC,eAAe,CAAC,OAAO,IAAI;YAC/C,wBAAwB,IAAI,EAAE,CACjC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,gBAAgB,CAAC,MAAM;YAC/B,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,QAAQ,EAAE,OAAO;SAClB,EACD,qCAAqC,CACtC,CAAC;QACF,yBAAyB,CACvB,6CAA6C,EAC7C,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printDiagnosticsToConsole,\n printResultToConsole,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { DescribeArguments, MtlsCertificate } from \"../models.js\";\n\nexport async function describe(argv: DescribeArguments) {\n const { account, project } = argv;\n const certId = argv[\"cert-id\"];\n\n const describeResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/mtls-certificates/${encodeURIComponent(certId)}`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n\n if (describeResponse.ok) {\n const cert: MtlsCertificate = await describeResponse.json();\n\n const envs = Object.entries(cert.environments)\n .filter(([, enabled]) => enabled)\n .map(([env]) => env)\n .join(\", \");\n\n // Replace newlines in subject with comma-space for cleaner display\n const subject = cert.certificateInfo.subject.replace(/\\n/g, \", \");\n\n printResultToConsole(\n ` ID: ${cert.id}\\n` +\n ` Name: ${cert.name}\\n` +\n ` Subject: ${subject}\\n` +\n ` Valid from: ${cert.certificateInfo.validFrom}\\n` +\n ` Valid to: ${cert.certificateInfo.validTo}\\n` +\n ` Environment types: ${envs}`\n );\n } else {\n const problem = textOrJson(await describeResponse.text());\n logger.error(\n {\n status: describeResponse.status,\n statusText: describeResponse.statusText,\n response: problem,\n },\n \"Failed to describe mTLS certificate\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to describe mTLS certificate.\",\n problem\n );\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { DisableArguments } from "../models.js";
2
+ export declare function disable(argv: DisableArguments): Promise<void>;
3
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/mtls-certificates/disable/handler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,cAAc,CAAC;AAEjE,wBAAsB,OAAO,CAAC,IAAI,EAAE,gBAAgB,iBAyCnD"}
@@ -0,0 +1,32 @@
1
+ import { logger } from "../../common/logger.js";
2
+ import { printDiagnosticsToConsole, printResultToConsole, textOrJson, } from "../../common/output.js";
3
+ import settings from "../../common/settings.js";
4
+ export async function disable(argv) {
5
+ const { account, project } = argv;
6
+ const certId = argv["cert-id"];
7
+ const disableResponse = await fetch(`${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/mtls-certificates/${encodeURIComponent(certId)}`, {
8
+ method: "PATCH",
9
+ headers: {
10
+ Authorization: `Bearer ${argv.authToken}`,
11
+ "Content-Type": "application/json",
12
+ },
13
+ body: JSON.stringify({
14
+ environments: [],
15
+ }),
16
+ });
17
+ if (disableResponse.ok) {
18
+ const cert = await disableResponse.json();
19
+ printResultToConsole(`mTLS certificate '${cert.name}' (${cert.id}) disabled successfully\n` +
20
+ `Certificate is now disabled for all environment types`);
21
+ }
22
+ else {
23
+ const problem = textOrJson(await disableResponse.text());
24
+ logger.error({
25
+ status: disableResponse.status,
26
+ statusText: disableResponse.statusText,
27
+ response: problem,
28
+ }, "Failed to disable mTLS certificate");
29
+ printDiagnosticsToConsole("Error: Failed to disable mTLS certificate.", problem);
30
+ }
31
+ }
32
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/mtls-certificates/disable/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAGhD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAsB;IAClD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/B,MAAM,eAAe,GAAG,MAAM,KAAK,CACjC,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EACrI;QACE,MAAM,EAAE,OAAO;QACf,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;YACzC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,YAAY,EAAE,EAAE;SACjB,CAAC;KACH,CACF,CAAC;IAEF,IAAI,eAAe,CAAC,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,GAAoB,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;QAE3D,oBAAoB,CAClB,qBAAqB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,2BAA2B;YACpE,uDAAuD,CAC1D,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,eAAe,CAAC,MAAM;YAC9B,UAAU,EAAE,eAAe,CAAC,UAAU;YACtC,QAAQ,EAAE,OAAO;SAClB,EACD,oCAAoC,CACrC,CAAC;QACF,yBAAyB,CACvB,4CAA4C,EAC5C,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printDiagnosticsToConsole,\n printResultToConsole,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { DisableArguments, MtlsCertificate } from \"../models.js\";\n\nexport async function disable(argv: DisableArguments) {\n const { account, project } = argv;\n const certId = argv[\"cert-id\"];\n\n const disableResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/mtls-certificates/${encodeURIComponent(certId)}`,\n {\n method: \"PATCH\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n environments: [],\n }),\n }\n );\n\n if (disableResponse.ok) {\n const cert: MtlsCertificate = await disableResponse.json();\n\n printResultToConsole(\n `mTLS certificate '${cert.name}' (${cert.id}) disabled successfully\\n` +\n `Certificate is now disabled for all environment types`\n );\n } else {\n const problem = textOrJson(await disableResponse.text());\n logger.error(\n {\n status: disableResponse.status,\n statusText: disableResponse.statusText,\n response: problem,\n },\n \"Failed to disable mTLS certificate\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to disable mTLS certificate.\",\n problem\n );\n }\n}\n"]}
@@ -25,9 +25,9 @@ export async function list(argv) {
25
25
  printResultToConsole(` ID: ${cert.id}\n` +
26
26
  ` Name: ${cert.name}\n` +
27
27
  ` Subject: ${subject}\n` +
28
- ` Valid From: ${cert.certificateInfo.validFrom}\n` +
29
- ` Valid To: ${cert.certificateInfo.validTo}\n` +
30
- ` Environments: ${envs}\n`);
28
+ ` Valid from: ${cert.certificateInfo.validFrom}\n` +
29
+ ` Valid to: ${cert.certificateInfo.validTo}\n` +
30
+ ` Environment types: ${envs}\n`);
31
31
  }
32
32
  }
33
33
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/mtls-certificates/list/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAGhD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAmB;IAC5C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElC,MAAM,YAAY,GAAG,MAAM,KAAK,CAC9B,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,oBAAoB,EACvG;QACE,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;SAC1C;KACF,CACF,CAAC;IAEF,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAgC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAExE,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,oBAAoB,CAAC,4BAA4B,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,oBAAoB,CAClB,SAAS,QAAQ,CAAC,IAAI,CAAC,MAAM,yBAAyB,CACvD,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;iBAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;iBACnB,IAAI,CAAC,IAAI,CAAC,CAAC;YAGd,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAElE,oBAAoB,CAClB,SAAS,IAAI,CAAC,EAAE,IAAI;gBAClB,WAAW,IAAI,CAAC,IAAI,IAAI;gBACxB,cAAc,OAAO,IAAI;gBACzB,iBAAiB,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI;gBACnD,eAAe,IAAI,CAAC,eAAe,CAAC,OAAO,IAAI;gBAC/C,mBAAmB,IAAI,IAAI,CAC9B,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,QAAQ,EAAE,OAAO;SAClB,EACD,kCAAkC,CACnC,CAAC;QACF,yBAAyB,CACvB,0CAA0C,EAC1C,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printDiagnosticsToConsole,\n printResultToConsole,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { ListArguments, MtlsCertificateListResponse } from \"../models.js\";\n\nexport async function list(argv: ListArguments) {\n const { account, project } = argv;\n\n const listResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/mtls-certificates`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n\n if (listResponse.ok) {\n const response: MtlsCertificateListResponse = await listResponse.json();\n\n if (response.data.length === 0) {\n printResultToConsole(\"No mTLS certificates found\");\n return;\n }\n\n printResultToConsole(\n `Found ${response.data.length} mTLS certificate(s):\\n`\n );\n\n for (const cert of response.data) {\n const envs = Object.entries(cert.environments)\n .filter(([, enabled]) => enabled)\n .map(([env]) => env)\n .join(\", \");\n\n // Replace newlines in subject with comma-space for cleaner display\n const subject = cert.certificateInfo.subject.replace(/\\n/g, \", \");\n\n printResultToConsole(\n ` ID: ${cert.id}\\n` +\n ` Name: ${cert.name}\\n` +\n ` Subject: ${subject}\\n` +\n ` Valid From: ${cert.certificateInfo.validFrom}\\n` +\n ` Valid To: ${cert.certificateInfo.validTo}\\n` +\n ` Environments: ${envs}\\n`\n );\n }\n } else {\n const problem = textOrJson(await listResponse.text());\n logger.error(\n {\n status: listResponse.status,\n statusText: listResponse.statusText,\n response: problem,\n },\n \"Failed to list mTLS certificates\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to list mTLS certificates.\",\n problem\n );\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/mtls-certificates/list/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAGhD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAmB;IAC5C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElC,MAAM,YAAY,GAAG,MAAM,KAAK,CAC9B,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,oBAAoB,EACvG;QACE,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;SAC1C;KACF,CACF,CAAC;IAEF,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAgC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAExE,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,oBAAoB,CAAC,4BAA4B,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,oBAAoB,CAClB,SAAS,QAAQ,CAAC,IAAI,CAAC,MAAM,yBAAyB,CACvD,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;iBAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;iBACnB,IAAI,CAAC,IAAI,CAAC,CAAC;YAGd,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAElE,oBAAoB,CAClB,SAAS,IAAI,CAAC,EAAE,IAAI;gBAClB,WAAW,IAAI,CAAC,IAAI,IAAI;gBACxB,cAAc,OAAO,IAAI;gBACzB,iBAAiB,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI;gBACnD,eAAe,IAAI,CAAC,eAAe,CAAC,OAAO,IAAI;gBAC/C,wBAAwB,IAAI,IAAI,CACnC,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,QAAQ,EAAE,OAAO;SAClB,EACD,kCAAkC,CACnC,CAAC;QACF,yBAAyB,CACvB,0CAA0C,EAC1C,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printDiagnosticsToConsole,\n printResultToConsole,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { ListArguments, MtlsCertificateListResponse } from \"../models.js\";\n\nexport async function list(argv: ListArguments) {\n const { account, project } = argv;\n\n const listResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/mtls-certificates`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n\n if (listResponse.ok) {\n const response: MtlsCertificateListResponse = await listResponse.json();\n\n if (response.data.length === 0) {\n printResultToConsole(\"No mTLS certificates found\");\n return;\n }\n\n printResultToConsole(\n `Found ${response.data.length} mTLS certificate(s):\\n`\n );\n\n for (const cert of response.data) {\n const envs = Object.entries(cert.environments)\n .filter(([, enabled]) => enabled)\n .map(([env]) => env)\n .join(\", \");\n\n // Replace newlines in subject with comma-space for cleaner display\n const subject = cert.certificateInfo.subject.replace(/\\n/g, \", \");\n\n printResultToConsole(\n ` ID: ${cert.id}\\n` +\n ` Name: ${cert.name}\\n` +\n ` Subject: ${subject}\\n` +\n ` Valid from: ${cert.certificateInfo.validFrom}\\n` +\n ` Valid to: ${cert.certificateInfo.validTo}\\n` +\n ` Environment types: ${envs}\\n`\n );\n }\n } else {\n const problem = textOrJson(await listResponse.text());\n logger.error(\n {\n status: listResponse.status,\n statusText: listResponse.statusText,\n response: problem,\n },\n \"Failed to list mTLS certificates\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to list mTLS certificates.\",\n problem\n );\n }\n}\n"]}
@@ -30,7 +30,7 @@ export interface CreateArguments {
30
30
  name: string;
31
31
  cert: string;
32
32
  key: string;
33
- environment: string[];
33
+ "environment-type": string[];
34
34
  }
35
35
  export interface ListArguments {
36
36
  account: string;
@@ -48,7 +48,7 @@ export interface UpdateArguments {
48
48
  project: string;
49
49
  authToken: string;
50
50
  "cert-id": string;
51
- environment: string[];
51
+ "environment-type": string[];
52
52
  }
53
53
  export interface DeleteArguments {
54
54
  account: string;
@@ -56,4 +56,10 @@ export interface DeleteArguments {
56
56
  authToken: string;
57
57
  "cert-id": string;
58
58
  }
59
+ export interface DisableArguments {
60
+ account: string;
61
+ project: string;
62
+ authToken: string;
63
+ "cert-id": string;
64
+ }
59
65
  //# sourceMappingURL=models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/mtls-certificates/models.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/mtls-certificates/models.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/mtls-certificates/models.ts"],"names":[],"mappings":"","sourcesContent":["export interface CertificateInfo {\n subject: string;\n issuer: string;\n validFrom: string;\n validTo: string;\n serialNumber: string;\n}\n\nexport interface Environments {\n development: boolean;\n preview: boolean;\n production: boolean;\n}\n\nexport interface MtlsCertificate {\n id: string;\n name: string;\n certificateInfo: CertificateInfo;\n environments: Environments;\n createdOn: string;\n updatedOn: string;\n}\n\nexport interface MtlsCertificateListResponse {\n data: MtlsCertificate[];\n offset: number;\n limit: number;\n}\n\nexport interface CreateArguments {\n account: string;\n project: string;\n authToken: string;\n name: string;\n cert: string;\n key: string;\n environment: string[];\n}\n\nexport interface ListArguments {\n account: string;\n project: string;\n authToken: string;\n}\n\nexport interface DescribeArguments {\n account: string;\n project: string;\n authToken: string;\n \"cert-id\": string;\n}\n\nexport interface UpdateArguments {\n account: string;\n project: string;\n authToken: string;\n \"cert-id\": string;\n environment: string[];\n}\n\nexport interface DeleteArguments {\n account: string;\n project: string;\n authToken: string;\n \"cert-id\": string;\n}\n"]}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/mtls-certificates/models.ts"],"names":[],"mappings":"","sourcesContent":["export interface CertificateInfo {\n subject: string;\n issuer: string;\n validFrom: string;\n validTo: string;\n serialNumber: string;\n}\n\nexport interface Environments {\n development: boolean;\n preview: boolean;\n production: boolean;\n}\n\nexport interface MtlsCertificate {\n id: string;\n name: string;\n certificateInfo: CertificateInfo;\n environments: Environments;\n createdOn: string;\n updatedOn: string;\n}\n\nexport interface MtlsCertificateListResponse {\n data: MtlsCertificate[];\n offset: number;\n limit: number;\n}\n\nexport interface CreateArguments {\n account: string;\n project: string;\n authToken: string;\n name: string;\n cert: string;\n key: string;\n \"environment-type\": string[];\n}\n\nexport interface ListArguments {\n account: string;\n project: string;\n authToken: string;\n}\n\nexport interface DescribeArguments {\n account: string;\n project: string;\n authToken: string;\n \"cert-id\": string;\n}\n\nexport interface UpdateArguments {\n account: string;\n project: string;\n authToken: string;\n \"cert-id\": string;\n \"environment-type\": string[];\n}\n\nexport interface DeleteArguments {\n account: string;\n project: string;\n authToken: string;\n \"cert-id\": string;\n}\n\nexport interface DisableArguments {\n account: string;\n project: string;\n authToken: string;\n \"cert-id\": string;\n}\n"]}
@@ -11,7 +11,7 @@ export async function update(argv) {
11
11
  "Content-Type": "application/json",
12
12
  },
13
13
  body: JSON.stringify({
14
- environments: argv.environment,
14
+ environments: argv["environment-type"],
15
15
  }),
16
16
  });
17
17
  if (updateResponse.ok) {
@@ -21,7 +21,7 @@ export async function update(argv) {
21
21
  .map(([env]) => env)
22
22
  .join(", ");
23
23
  printResultToConsole(`mTLS certificate '${cert.name}' (${cert.id}) updated successfully\n` +
24
- `Environments: ${envs}`);
24
+ `Environment types: ${envs}`);
25
25
  }
26
26
  else {
27
27
  const problem = textOrJson(await updateResponse.text());
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/mtls-certificates/update/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAGhD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAqB;IAChD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/B,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EACrI;QACE,MAAM,EAAE,OAAO;QACf,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;YACzC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,YAAY,EAAE,IAAI,CAAC,WAAW;SAC/B,CAAC;KACH,CACF,CAAC;IAEF,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,GAAoB,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAE1D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;aAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;aACnB,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,oBAAoB,CAClB,qBAAqB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,0BAA0B;YACnE,iBAAiB,IAAI,EAAE,CAC1B,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,QAAQ,EAAE,OAAO;SAClB,EACD,mCAAmC,CACpC,CAAC;QACF,yBAAyB,CACvB,2CAA2C,EAC3C,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printDiagnosticsToConsole,\n printResultToConsole,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { MtlsCertificate, UpdateArguments } from \"../models.js\";\n\nexport async function update(argv: UpdateArguments) {\n const { account, project } = argv;\n const certId = argv[\"cert-id\"];\n\n const updateResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/mtls-certificates/${encodeURIComponent(certId)}`,\n {\n method: \"PATCH\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n environments: argv.environment,\n }),\n }\n );\n\n if (updateResponse.ok) {\n const cert: MtlsCertificate = await updateResponse.json();\n\n const envs = Object.entries(cert.environments)\n .filter(([, enabled]) => enabled)\n .map(([env]) => env)\n .join(\", \");\n\n printResultToConsole(\n `mTLS certificate '${cert.name}' (${cert.id}) updated successfully\\n` +\n `Environments: ${envs}`\n );\n } else {\n const problem = textOrJson(await updateResponse.text());\n logger.error(\n {\n status: updateResponse.status,\n statusText: updateResponse.statusText,\n response: problem,\n },\n \"Failed to update mTLS certificate\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to update mTLS certificate.\",\n problem\n );\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/mtls-certificates/update/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAGhD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAqB;IAChD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/B,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,GAAG,QAAQ,CAAC,4BAA4B,gBAAgB,OAAO,aAAa,OAAO,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EACrI;QACE,MAAM,EAAE,OAAO;QACf,OAAO,EAAE;YAEP,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;YACzC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC;SACvC,CAAC;KACH,CACF,CAAC;IAEF,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,GAAoB,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAE1D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;aAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;aACnB,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,oBAAoB,CAClB,qBAAqB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,0BAA0B;YACnE,sBAAsB,IAAI,EAAE,CAC/B,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CACV;YACE,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,QAAQ,EAAE,OAAO;SAClB,EACD,mCAAmC,CACpC,CAAC;QACF,yBAAyB,CACvB,2CAA2C,EAC3C,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { logger } from \"../../common/logger.js\";\nimport {\n printDiagnosticsToConsole,\n printResultToConsole,\n textOrJson,\n} from \"../../common/output.js\";\nimport settings from \"../../common/settings.js\";\nimport { MtlsCertificate, UpdateArguments } from \"../models.js\";\n\nexport async function update(argv: UpdateArguments) {\n const { account, project } = argv;\n const certId = argv[\"cert-id\"];\n\n const updateResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/accounts/${account}/projects/${project}/mtls-certificates/${encodeURIComponent(certId)}`,\n {\n method: \"PATCH\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n environments: argv[\"environment-type\"],\n }),\n }\n );\n\n if (updateResponse.ok) {\n const cert: MtlsCertificate = await updateResponse.json();\n\n const envs = Object.entries(cert.environments)\n .filter(([, enabled]) => enabled)\n .map(([env]) => env)\n .join(\", \");\n\n printResultToConsole(\n `mTLS certificate '${cert.name}' (${cert.id}) updated successfully\\n` +\n `Environment types: ${envs}`\n );\n } else {\n const problem = textOrJson(await updateResponse.text());\n logger.error(\n {\n status: updateResponse.status,\n statusText: updateResponse.statusText,\n response: problem,\n },\n \"Failed to update mTLS certificate\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to update mTLS certificate.\",\n problem\n );\n }\n}\n"]}
@@ -3,12 +3,9 @@ import {
3
3
  detectFormatFromExtension,
4
4
  type FileFormat,
5
5
  } from "../../common/file-format.js";
6
+ import { OPEN_API_FILE_TYPES } from "../../common/open-api/index.js";
6
7
  import type { ZuploOpenApiDocument } from "./interfaces.js";
7
- import {
8
- OPEN_API_FILE_TYPES,
9
- addOperationIdsAsNecessary,
10
- parseOpenApiFile,
11
- } from "./utils.js";
8
+ import { addOperationIdsAsNecessary, parseOpenApiFile } from "./utils.js";
12
9
  export type MergeMode = "path-method" | "operation-id";
13
10
  export type { ZuploOpenApiDocument, FileFormat };
14
11
  export { OPEN_API_FILE_TYPES, addOperationIdsAsNecessary, parseOpenApiFile };
@@ -1 +1 @@
1
- {"version":3,"file":"merge-engine.d.ts","sourceRoot":"","sources":["../../../src/open-api/merge/merge-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,IAAI,6BAA6B,EACxD,yBAAyB,EACzB,KAAK,UAAU,EAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,cAAc,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC;AAGjD,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,CAAC;AAG7E,OAAO,EACL,yBAAyB,IAAI,YAAY,EACzC,6BAA6B,IAAI,uBAAuB,GACzD,CAAC;AAEF,eAAO,MAAM,aAAa,8IAUzB,CAAC;AAKF,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAO7C;AAKD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOxD"}
1
+ {"version":3,"file":"merge-engine.d.ts","sourceRoot":"","sources":["../../../src/open-api/merge/merge-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,IAAI,6BAA6B,EACxD,yBAAyB,EACzB,KAAK,UAAU,EAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,cAAc,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC;AAGjD,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,CAAC;AAG7E,OAAO,EACL,yBAAyB,IAAI,YAAY,EACzC,6BAA6B,IAAI,uBAAuB,GACzD,CAAC;AAEF,eAAO,MAAM,aAAa,8IAUzB,CAAC;AAKF,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAO7C;AAKD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOxD"}
@@ -1,5 +1,6 @@
1
1
  import { detectFormatFromContent as detectFormatFromContentCommon, detectFormatFromExtension, } from "../../common/file-format.js";
2
- import { OPEN_API_FILE_TYPES, addOperationIdsAsNecessary, parseOpenApiFile, } from "./utils.js";
2
+ import { OPEN_API_FILE_TYPES } from "../../common/open-api/index.js";
3
+ import { addOperationIdsAsNecessary, parseOpenApiFile } from "./utils.js";
3
4
  export { OPEN_API_FILE_TYPES, addOperationIdsAsNecessary, parseOpenApiFile };
4
5
  export { detectFormatFromExtension as detectFormat, detectFormatFromContentCommon as detectFormatFromContent, };
5
6
  export const BASE_TEMPLATE = `
@@ -1 +1 @@
1
- {"version":3,"file":"merge-engine.js","sourceRoot":"","sources":["../../../src/open-api/merge/merge-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,IAAI,6BAA6B,EACxD,yBAAyB,GAE1B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,CAAC;AAG7E,OAAO,EACL,yBAAyB,IAAI,YAAY,EACzC,6BAA6B,IAAI,uBAAuB,GACzD,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;CAU5B,CAAC;AAKF,MAAM,UAAU,KAAK,CAAC,MAAc;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ;SAChC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,EAAE;QACN,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,QAAQ,IAAI,YAAY,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AACvE,CAAC","sourcesContent":["import {\n detectFormatFromContent as detectFormatFromContentCommon,\n detectFormatFromExtension,\n type FileFormat,\n} from \"../../common/file-format.js\";\nimport type { ZuploOpenApiDocument } from \"./interfaces.js\";\nimport {\n OPEN_API_FILE_TYPES,\n addOperationIdsAsNecessary,\n parseOpenApiFile,\n} from \"./utils.js\";\n\nexport type MergeMode = \"path-method\" | \"operation-id\";\nexport type { ZuploOpenApiDocument, FileFormat };\n\n// Re-export utilities\nexport { OPEN_API_FILE_TYPES, addOperationIdsAsNecessary, parseOpenApiFile };\n\n// Re-export common file format functions for backward compatibility\nexport {\n detectFormatFromExtension as detectFormat,\n detectFormatFromContentCommon as detectFormatFromContent,\n};\n\nexport const BASE_TEMPLATE = `\n{\n \"openapi\": \"3.1.0\",\n \"info\": {\n \"version\": \"1.0.0\",\n \"title\": \"My Zuplo API\"\n },\n \"paths\": {}\n}\n\n`;\n\n/**\n * Detect if source is a URL\n */\nexport function isUrl(source: string): boolean {\n try {\n new URL(source);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Guess file name from URL\n */\nexport function guessFileNameFromUrl(url: string): string {\n const parsedUrl = new URL(url);\n const basename = parsedUrl.pathname\n .split(\"/\")\n .pop()\n ?.replace(/\\.[^/.]+$/, \"\");\n return basename || `imported-${Buffer.from(url).toString(\"base64\")}`;\n}\n"]}
1
+ {"version":3,"file":"merge-engine.js","sourceRoot":"","sources":["../../../src/open-api/merge/merge-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,IAAI,6BAA6B,EACxD,yBAAyB,GAE1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAM1E,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,CAAC;AAG7E,OAAO,EACL,yBAAyB,IAAI,YAAY,EACzC,6BAA6B,IAAI,uBAAuB,GACzD,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;CAU5B,CAAC;AAKF,MAAM,UAAU,KAAK,CAAC,MAAc;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ;SAChC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,EAAE;QACN,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,QAAQ,IAAI,YAAY,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AACvE,CAAC","sourcesContent":["import {\n detectFormatFromContent as detectFormatFromContentCommon,\n detectFormatFromExtension,\n type FileFormat,\n} from \"../../common/file-format.js\";\nimport { OPEN_API_FILE_TYPES } from \"../../common/open-api/index.js\";\nimport type { ZuploOpenApiDocument } from \"./interfaces.js\";\nimport { addOperationIdsAsNecessary, parseOpenApiFile } from \"./utils.js\";\n\nexport type MergeMode = \"path-method\" | \"operation-id\";\nexport type { ZuploOpenApiDocument, FileFormat };\n\n// Re-export utilities\nexport { OPEN_API_FILE_TYPES, addOperationIdsAsNecessary, parseOpenApiFile };\n\n// Re-export common file format functions for backward compatibility\nexport {\n detectFormatFromExtension as detectFormat,\n detectFormatFromContentCommon as detectFormatFromContent,\n};\n\nexport const BASE_TEMPLATE = `\n{\n \"openapi\": \"3.1.0\",\n \"info\": {\n \"version\": \"1.0.0\",\n \"title\": \"My Zuplo API\"\n },\n \"paths\": {}\n}\n\n`;\n\n/**\n * Detect if source is a URL\n */\nexport function isUrl(source: string): boolean {\n try {\n new URL(source);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Guess file name from URL\n */\nexport function guessFileNameFromUrl(url: string): string {\n const parsedUrl = new URL(url);\n const basename = parsedUrl.pathname\n .split(\"/\")\n .pop()\n ?.replace(/\\.[^/.]+$/, \"\");\n return basename || `imported-${Buffer.from(url).toString(\"base64\")}`;\n}\n"]}
@@ -1,7 +1,6 @@
1
1
  import { OpenAPIV3_1 } from "openapi-types";
2
2
  import { ZuploOpenApiDocument } from "./interfaces.js";
3
3
  export declare const OPERATION_PATH_MERGE_DELIMITER = ">";
4
- export declare const OPEN_API_FILE_TYPES: string[];
5
4
  export declare const parseOpenApiFile: (
6
5
  extName: string,
7
6
  fileText: string
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/open-api/merge/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAClD,eAAO,MAAM,mBAAmB,UAA6B,CAAC;AAE9D,eAAO,MAAM,gBAAgB,GAAU,SAAS,MAAM,EAAE,UAAU,MAAM,6DAYvE,CAAC;AAMF,eAAO,MAAM,0BAA0B,GACrC,SAAS,WAAW,CAAC,QAAQ,GAAG,oBAAoB,SA4BrD,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/open-api/merge/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAM5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,eAAO,MAAM,gBAAgB,GAAU,SAAS,MAAM,EAAE,UAAU,MAAM,6DAYvE,CAAC;AAMF,eAAO,MAAM,0BAA0B,GACrC,SAAS,WAAW,CAAC,QAAQ,GAAG,oBAAoB,SAmBrD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import yaml from "js-yaml";
2
2
  import { v4 } from "uuid";
3
+ import { OPEN_API_FILE_TYPES, HTTP_METHODS, } from "../../common/open-api/index.js";
3
4
  export const OPERATION_PATH_MERGE_DELIMITER = ">";
4
- export const OPEN_API_FILE_TYPES = [".json", ".yml", ".yaml"];
5
5
  export const parseOpenApiFile = async (extName, fileText) => {
6
6
  if (!OPEN_API_FILE_TYPES.includes(extName)) {
7
7
  throw new Error(`Invalid file type. Supported file types are: ${OPEN_API_FILE_TYPES.join(", ")}`);
@@ -21,16 +21,7 @@ export const addOperationIdsAsNecessary = (openApi) => {
21
21
  if (!pathItem) {
22
22
  continue;
23
23
  }
24
- const methods = [
25
- "get",
26
- "put",
27
- "post",
28
- "delete",
29
- "options",
30
- "head",
31
- "patch",
32
- "trace",
33
- ];
24
+ const methods = HTTP_METHODS;
34
25
  for (const method of methods) {
35
26
  const operation = pathItem[method];
36
27
  if (operation && !operation.operationId) {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/open-api/merge/utils.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAG1B,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAe,EAAE,QAAgB,EAAE,EAAE;IAC1E,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,gDAAgD,mBAAmB,CAAC,IAAI,CACtE,IAAI,CACL,EAAE,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAgD,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAgD,CAAC;AAC5E,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAoD,EACpD,EAAE;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG;YACd,KAAK;YACL,KAAK;YACL,MAAM;YACN,QAAQ;YACR,SAAS;YACT,MAAM;YACN,OAAO;YACP,OAAO;SACqB,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;gBACxC,SAAS,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAC","sourcesContent":["import yaml from \"js-yaml\";\nimport { OpenAPIV3_1 } from \"openapi-types\";\nimport { v4 } from \"uuid\";\nimport { ZuploOpenApiDocument } from \"./interfaces.js\";\n\nexport const OPERATION_PATH_MERGE_DELIMITER = \">\";\nexport const OPEN_API_FILE_TYPES = [\".json\", \".yml\", \".yaml\"];\n\nexport const parseOpenApiFile = async (extName: string, fileText: string) => {\n if (!OPEN_API_FILE_TYPES.includes(extName)) {\n throw new Error(\n `Invalid file type. Supported file types are: ${OPEN_API_FILE_TYPES.join(\n \", \"\n )}`\n );\n }\n if (extName.includes(\"json\")) {\n return JSON.parse(fileText) as OpenAPIV3_1.Document | ZuploOpenApiDocument;\n }\n return yaml.load(fileText) as OpenAPIV3_1.Document | ZuploOpenApiDocument;\n};\n\n/**\n * Add operation ID to any operations that don't have one, this makes\n * onboarding smoother for new users\n */\nexport const addOperationIdsAsNecessary = (\n openApi: OpenAPIV3_1.Document | ZuploOpenApiDocument\n) => {\n const paths = openApi.paths;\n if (!paths) {\n return;\n }\n for (const path of Object.keys(paths)) {\n const pathItem = paths[path];\n if (!pathItem) {\n continue;\n }\n const methods = [\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"options\",\n \"head\",\n \"patch\",\n \"trace\",\n ] as OpenAPIV3_1.HttpMethods[];\n for (const method of methods) {\n const operation = pathItem[method];\n if (operation && !operation.operationId) {\n operation.operationId = v4();\n }\n }\n }\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/open-api/merge/utils.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAGxC,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAe,EAAE,QAAgB,EAAE,EAAE;IAC1E,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,gDAAgD,mBAAmB,CAAC,IAAI,CACtE,IAAI,CACL,EAAE,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAgD,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAgD,CAAC;AAC5E,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAoD,EACpD,EAAE;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAoD,CAAC;QACrE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;gBACxC,SAAS,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAC","sourcesContent":["import yaml from \"js-yaml\";\nimport { OpenAPIV3_1 } from \"openapi-types\";\nimport { v4 } from \"uuid\";\nimport {\n OPEN_API_FILE_TYPES,\n HTTP_METHODS,\n} from \"../../common/open-api/index.js\";\nimport { ZuploOpenApiDocument } from \"./interfaces.js\";\n\nexport const OPERATION_PATH_MERGE_DELIMITER = \">\";\n\nexport const parseOpenApiFile = async (extName: string, fileText: string) => {\n if (!OPEN_API_FILE_TYPES.includes(extName)) {\n throw new Error(\n `Invalid file type. Supported file types are: ${OPEN_API_FILE_TYPES.join(\n \", \"\n )}`\n );\n }\n if (extName.includes(\"json\")) {\n return JSON.parse(fileText) as OpenAPIV3_1.Document | ZuploOpenApiDocument;\n }\n return yaml.load(fileText) as OpenAPIV3_1.Document | ZuploOpenApiDocument;\n};\n\n/**\n * Add operation ID to any operations that don't have one, this makes\n * onboarding smoother for new users\n */\nexport const addOperationIdsAsNecessary = (\n openApi: OpenAPIV3_1.Document | ZuploOpenApiDocument\n) => {\n const paths = openApi.paths;\n if (!paths) {\n return;\n }\n for (const path of Object.keys(paths)) {\n const pathItem = paths[path];\n if (!pathItem) {\n continue;\n }\n const methods = HTTP_METHODS as unknown as OpenAPIV3_1.HttpMethods[];\n for (const method of methods) {\n const operation = pathItem[method];\n if (operation && !operation.operationId) {\n operation.operationId = v4();\n }\n }\n }\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA2DD,wBAAsB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EjE"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA6CD,wBAAsB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFjE"}
@@ -3,41 +3,26 @@ import path from "node:path";
3
3
  import { detectFormatFromExtension, parseFile, serializeContent, } from "../../common/file-format.js";
4
4
  import { printDiagnosticsToConsole } from "../../common/output.js";
5
5
  import { logger } from "../../common/logger.js";
6
- import { applyOverlay as applyOverlayEngine, applyAction, deepClone, } from "./overlay-engine.js";
6
+ import { applyOverlay as applyOverlayEngine } from "./overlay-engine.js";
7
7
  function applyOverlayWithProgress(openapi, overlay) {
8
- printDiagnosticsToConsole(`\nApplying overlay: ${overlay.info?.title || "Unnamed"}`);
9
- printDiagnosticsToConsole(`Version: ${overlay.overlay || "unknown"}\n`);
10
- const result = deepClone(openapi);
11
- const stats = { applied: 0, skipped: 0, totalNodes: 0 };
12
- for (const [index, action] of overlay.actions.entries()) {
13
- const desc = action.description || `Action ${index + 1}`;
14
- process.stdout.write(` [${index + 1}/${overlay.actions.length}] ${desc}... `);
15
- try {
16
- const { applied, count } = applyAction(result, action);
17
- if (applied) {
18
- printDiagnosticsToConsole(`✓ (${count} node${count !== 1 ? "s" : ""})`);
19
- stats.applied++;
20
- stats.totalNodes += count;
21
- }
22
- else {
23
- printDiagnosticsToConsole("⊘ skipped");
24
- stats.skipped++;
25
- }
26
- }
27
- catch (error) {
28
- printDiagnosticsToConsole(`✗ failed`);
29
- logger.warn(error, `Failed to apply action: ${desc}`);
30
- stats.skipped++;
8
+ let validatedOverlay;
9
+ try {
10
+ validatedOverlay = applyOverlayEngine(openapi, overlay);
11
+ }
12
+ catch (error) {
13
+ if (error instanceof Error) {
14
+ printDiagnosticsToConsole(`\n${error.message}`);
31
15
  }
16
+ throw error;
32
17
  }
18
+ const { result, stats } = validatedOverlay;
33
19
  printDiagnosticsToConsole(`\n=== Summary ===`);
34
- printDiagnosticsToConsole(`Applied: ${stats.applied}/${overlay.actions.length} actions`);
35
- printDiagnosticsToConsole(`Modified: ${stats.totalNodes} nodes`);
20
+ printDiagnosticsToConsole(`Applied: ${stats.applied} action${stats.applied !== 1 ? "s" : ""}`);
21
+ printDiagnosticsToConsole(`Modified: ${stats.totalNodes} node${stats.totalNodes !== 1 ? "s" : ""}`);
36
22
  if (stats.skipped > 0) {
37
- printDiagnosticsToConsole(`Skipped: ${stats.skipped} actions`);
23
+ printDiagnosticsToConsole(`Skipped: ${stats.skipped} action${stats.skipped !== 1 ? "s" : ""}`);
38
24
  }
39
- const { result: finalResult } = applyOverlayEngine(openapi, overlay);
40
- return finalResult;
25
+ return result;
41
26
  }
42
27
  export async function applyOverlay(args) {
43
28
  const openapiPath = path.resolve(args.input);
@@ -57,10 +42,25 @@ export async function applyOverlay(args) {
57
42
  try {
58
43
  const openapiContent = fs.readFileSync(openapiPath, "utf-8");
59
44
  const overlayContent = fs.readFileSync(overlayPath, "utf-8");
60
- const { document: openapi } = parseFile(openapiContent, openapiPath);
61
- const { document: overlay } = parseFile(overlayContent, overlayPath);
62
- if (!overlay.overlay || !overlay.actions) {
63
- throw new Error("Invalid overlay format. Must include 'overlay' version and 'actions' array.");
45
+ let openapi;
46
+ let overlay;
47
+ try {
48
+ const parsed = parseFile(openapiContent, openapiPath);
49
+ openapi = parsed.document;
50
+ }
51
+ catch (error) {
52
+ throw new Error(`Failed to parse OpenAPI file '${openapiPath}'`, {
53
+ cause: error,
54
+ });
55
+ }
56
+ try {
57
+ const parsed = parseFile(overlayContent, overlayPath);
58
+ overlay = parsed.document;
59
+ }
60
+ catch (error) {
61
+ throw new Error(`Failed to parse overlay file '${overlayPath}'`, {
62
+ cause: error,
63
+ });
64
64
  }
65
65
  const result = applyOverlayWithProgress(openapi, overlay);
66
66
  let outputFormat;
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.ts"],"names":[],"mappings":"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","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: CLI output file */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n detectFormatFromExtension,\n parseFile,\n serializeContent,\n type FileFormat,\n} from \"../../common/file-format.js\";\nimport { printDiagnosticsToConsole } from \"../../common/output.js\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n applyOverlay as applyOverlayEngine,\n applyAction,\n deepClone,\n type OverlayDocument,\n} from \"./overlay-engine.js\";\n\nexport interface Arguments {\n overlay: string;\n input: string;\n output: string;\n format?: \"json\" | \"yaml\";\n json?: boolean;\n yaml?: boolean;\n}\n\n/**\n * Apply overlay to OpenAPI document with console output\n */\n// biome-ignore lint/suspicious/noExplicitAny: Working with dynamic JSON structures\nfunction applyOverlayWithProgress(openapi: any, overlay: OverlayDocument): any {\n printDiagnosticsToConsole(\n `\\nApplying overlay: ${overlay.info?.title || \"Unnamed\"}`\n );\n printDiagnosticsToConsole(`Version: ${overlay.overlay || \"unknown\"}\\n`);\n\n // Clone the document for modification\n const result = deepClone(openapi);\n const stats = { applied: 0, skipped: 0, totalNodes: 0 };\n\n // Apply actions with progress reporting\n for (const [index, action] of overlay.actions.entries()) {\n const desc = action.description || `Action ${index + 1}`;\n process.stdout.write(\n ` [${index + 1}/${overlay.actions.length}] ${desc}... `\n );\n\n try {\n const { applied, count } = applyAction(result, action);\n\n if (applied) {\n printDiagnosticsToConsole(`✓ (${count} node${count !== 1 ? \"s\" : \"\"})`);\n stats.applied++;\n stats.totalNodes += count;\n } else {\n printDiagnosticsToConsole(\"⊘ skipped\");\n stats.skipped++;\n }\n } catch (error) {\n printDiagnosticsToConsole(`✗ failed`);\n logger.warn(error, `Failed to apply action: ${desc}`);\n stats.skipped++;\n }\n }\n\n printDiagnosticsToConsole(`\\n=== Summary ===`);\n printDiagnosticsToConsole(\n `Applied: ${stats.applied}/${overlay.actions.length} actions`\n );\n printDiagnosticsToConsole(`Modified: ${stats.totalNodes} nodes`);\n if (stats.skipped > 0) {\n printDiagnosticsToConsole(`Skipped: ${stats.skipped} actions`);\n }\n\n // Use the engine's reordering functions\n const { result: finalResult } = applyOverlayEngine(openapi, overlay);\n\n return finalResult;\n}\n\n/**\n * Main handler function\n */\nexport async function applyOverlay(args: Arguments): Promise<void> {\n const openapiPath = path.resolve(args.input);\n const overlayPath = path.resolve(args.overlay);\n const outputPath = path.resolve(args.output);\n\n // Validate input files exist\n if (!fs.existsSync(openapiPath)) {\n throw new Error(`OpenAPI file not found: ${openapiPath}`);\n }\n\n if (!fs.existsSync(overlayPath)) {\n throw new Error(`Overlay file not found: ${overlayPath}`);\n }\n\n printDiagnosticsToConsole(\"OpenAPI Overlay Applicator\");\n printDiagnosticsToConsole(\"===========================\");\n printDiagnosticsToConsole(`OpenAPI file: ${openapiPath}`);\n printDiagnosticsToConsole(`Overlay file: ${overlayPath}`);\n printDiagnosticsToConsole(`Output file: ${outputPath}`);\n\n try {\n // Load files with flexible parsing\n const openapiContent = fs.readFileSync(openapiPath, \"utf-8\");\n const overlayContent = fs.readFileSync(overlayPath, \"utf-8\");\n\n // Parse with automatic format detection\n const { document: openapi } = parseFile(openapiContent, openapiPath);\n const { document: overlay } = parseFile(overlayContent, overlayPath);\n\n // Validate overlay format\n if (!overlay.overlay || !overlay.actions) {\n throw new Error(\n \"Invalid overlay format. Must include 'overlay' version and 'actions' array.\"\n );\n }\n\n // Apply overlay with progress output\n const result = applyOverlayWithProgress(\n openapi,\n overlay as OverlayDocument\n );\n\n // Determine output format\n let outputFormat: FileFormat;\n if (args.format) {\n outputFormat = args.format;\n } else if (args.json) {\n outputFormat = \"json\";\n } else if (args.yaml) {\n outputFormat = \"yaml\";\n } else {\n // Try to detect from output file extension\n const formatFromExt = detectFormatFromExtension(outputPath);\n outputFormat = formatFromExt || \"json\"; // Default to JSON if no extension\n }\n\n // Serialize output\n const outputContent = serializeContent(result, outputFormat);\n\n // Create output directory if it doesn't exist\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, outputContent, \"utf-8\");\n\n printDiagnosticsToConsole(\n `\\n✓ Output written to: ${outputPath} (${outputFormat.toUpperCase()})`\n );\n } catch (error) {\n logger.error(error, \"Error applying overlay\");\n printDiagnosticsToConsole(`Error: ${(error as Error).message}`);\n throw error;\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.ts"],"names":[],"mappings":"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","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: CLI output file */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n detectFormatFromExtension,\n parseFile,\n serializeContent,\n type FileFormat,\n} from \"../../common/file-format.js\";\nimport { printDiagnosticsToConsole } from \"../../common/output.js\";\nimport { logger } from \"../../common/logger.js\";\nimport { applyOverlay as applyOverlayEngine } from \"./overlay-engine.js\";\n\nexport interface Arguments {\n overlay: string;\n input: string;\n output: string;\n format?: \"json\" | \"yaml\";\n json?: boolean;\n yaml?: boolean;\n}\n\n/**\n * Apply overlay to OpenAPI document with console output\n * Validates inputs and provides progress feedback\n */\nfunction applyOverlayWithProgress(\n openapi: unknown,\n overlay: unknown\n): Record<string, unknown> {\n // Apply overlay (includes validation)\n let validatedOverlay: ReturnType<typeof applyOverlayEngine>;\n\n try {\n validatedOverlay = applyOverlayEngine(openapi, overlay);\n } catch (error) {\n // Re-throw with better context for CLI users\n if (error instanceof Error) {\n printDiagnosticsToConsole(`\\n${error.message}`);\n }\n throw error;\n }\n\n const { result, stats } = validatedOverlay;\n\n // Show summary\n printDiagnosticsToConsole(`\\n=== Summary ===`);\n printDiagnosticsToConsole(\n `Applied: ${stats.applied} action${stats.applied !== 1 ? \"s\" : \"\"}`\n );\n printDiagnosticsToConsole(\n `Modified: ${stats.totalNodes} node${stats.totalNodes !== 1 ? \"s\" : \"\"}`\n );\n if (stats.skipped > 0) {\n printDiagnosticsToConsole(\n `Skipped: ${stats.skipped} action${stats.skipped !== 1 ? \"s\" : \"\"}`\n );\n }\n\n return result;\n}\n\n/**\n * Main handler function\n */\nexport async function applyOverlay(args: Arguments): Promise<void> {\n const openapiPath = path.resolve(args.input);\n const overlayPath = path.resolve(args.overlay);\n const outputPath = path.resolve(args.output);\n\n // Validate input files exist\n if (!fs.existsSync(openapiPath)) {\n throw new Error(`OpenAPI file not found: ${openapiPath}`);\n }\n\n if (!fs.existsSync(overlayPath)) {\n throw new Error(`Overlay file not found: ${overlayPath}`);\n }\n\n printDiagnosticsToConsole(\"OpenAPI Overlay Applicator\");\n printDiagnosticsToConsole(\"===========================\");\n printDiagnosticsToConsole(`OpenAPI file: ${openapiPath}`);\n printDiagnosticsToConsole(`Overlay file: ${overlayPath}`);\n printDiagnosticsToConsole(`Output file: ${outputPath}`);\n\n try {\n // Load files with flexible parsing\n const openapiContent = fs.readFileSync(openapiPath, \"utf-8\");\n const overlayContent = fs.readFileSync(overlayPath, \"utf-8\");\n\n // Parse with automatic format detection\n let openapi: unknown;\n let overlay: unknown;\n\n try {\n const parsed = parseFile(openapiContent, openapiPath);\n openapi = parsed.document;\n } catch (error) {\n throw new Error(`Failed to parse OpenAPI file '${openapiPath}'`, {\n cause: error,\n });\n }\n\n try {\n const parsed = parseFile(overlayContent, overlayPath);\n overlay = parsed.document;\n } catch (error) {\n throw new Error(`Failed to parse overlay file '${overlayPath}'`, {\n cause: error,\n });\n }\n\n // Apply overlay with progress output\n // Validation happens inside applyOverlayWithProgress\n const result = applyOverlayWithProgress(openapi, overlay);\n\n // Determine output format\n let outputFormat: FileFormat;\n if (args.format) {\n outputFormat = args.format;\n } else if (args.json) {\n outputFormat = \"json\";\n } else if (args.yaml) {\n outputFormat = \"yaml\";\n } else {\n // Try to detect from output file extension\n const formatFromExt = detectFormatFromExtension(outputPath);\n outputFormat = formatFromExt || \"json\"; // Default to JSON if no extension\n }\n\n // Serialize output\n const outputContent = serializeContent(result, outputFormat);\n\n // Create output directory if it doesn't exist\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, outputContent, \"utf-8\");\n\n printDiagnosticsToConsole(\n `\\n✓ Output written to: ${outputPath} (${outputFormat.toUpperCase()})`\n );\n } catch (error) {\n logger.error(error, \"Error applying overlay\");\n printDiagnosticsToConsole(`Error: ${(error as Error).message}`);\n throw error;\n }\n}\n"]}