@distilled.cloud/stackit 1.0.0-rc.15 → 1.0.0-rc.17

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 (346) hide show
  1. package/lib/.lazy.json +1 -0
  2. package/lib/_bundle/lazy.js +4 -0
  3. package/lib/_bundle/sdk.js +2 -0
  4. package/lib/_bundle/sdk.js.map +1 -0
  5. package/lib/credentials.d.ts +2 -2
  6. package/lib/credentials.d.ts.map +1 -1
  7. package/lib/credentials.js +1 -49
  8. package/lib/errors.d.ts +13 -13
  9. package/lib/errors.d.ts.map +1 -1
  10. package/lib/errors.js +1 -26
  11. package/lib/index.d.ts +2 -2
  12. package/lib/index.js +1 -24
  13. package/lib/index.lazy.js +7 -0
  14. package/lib/pagination.d.ts +1 -1
  15. package/lib/pagination.js +1 -45
  16. package/lib/protocol.d.ts +3 -3
  17. package/lib/protocol.d.ts.map +1 -1
  18. package/lib/protocol.js +1 -147
  19. package/lib/retry.d.ts +1 -1
  20. package/lib/retry.d.ts.map +1 -1
  21. package/lib/retry.js +1 -31
  22. package/lib/services/alb.d.ts +10 -87
  23. package/lib/services/alb.d.ts.map +1 -1
  24. package/lib/services/alb.js +28 -512
  25. package/lib/services/alb.js.map +1 -1
  26. package/lib/services/alb_waf.d.ts +9 -82
  27. package/lib/services/alb_waf.d.ts.map +1 -1
  28. package/lib/services/alb_waf.js +33 -520
  29. package/lib/services/alb_waf.js.map +1 -1
  30. package/lib/services/authorization.d.ts +5 -47
  31. package/lib/services/authorization.d.ts.map +1 -1
  32. package/lib/services/authorization.js +1 -322
  33. package/lib/services/authorization.js.map +1 -1
  34. package/lib/services/automation.d.ts +7 -47
  35. package/lib/services/automation.d.ts.map +1 -1
  36. package/lib/services/automation.js +1 -362
  37. package/lib/services/automation.js.map +1 -1
  38. package/lib/services/cdn.d.ts +8 -220
  39. package/lib/services/cdn.d.ts.map +1 -1
  40. package/lib/services/cdn.js +31 -905
  41. package/lib/services/cdn.js.map +1 -1
  42. package/lib/services/certificates.d.ts +8 -27
  43. package/lib/services/certificates.d.ts.map +1 -1
  44. package/lib/services/certificates.js +1 -178
  45. package/lib/services/certificates.js.map +1 -1
  46. package/lib/services/cost.d.ts +10 -37
  47. package/lib/services/cost.d.ts.map +1 -1
  48. package/lib/services/cost.js +1 -176
  49. package/lib/services/cost.js.map +1 -1
  50. package/lib/services/dns.d.ts +9 -104
  51. package/lib/services/dns.d.ts.map +1 -1
  52. package/lib/services/dns.js +40 -725
  53. package/lib/services/dns.js.map +1 -1
  54. package/lib/services/dremio.d.ts +8 -50
  55. package/lib/services/dremio.d.ts.map +1 -1
  56. package/lib/services/dremio.js +1 -316
  57. package/lib/services/dremio.js.map +1 -1
  58. package/lib/services/edge.d.ts +7 -40
  59. package/lib/services/edge.d.ts.map +1 -1
  60. package/lib/services/edge.js +1 -356
  61. package/lib/services/edge.js.map +1 -1
  62. package/lib/services/functions.d.ts +1 -48
  63. package/lib/services/functions.d.ts.map +1 -1
  64. package/lib/services/functions.js +1 -398
  65. package/lib/services/functions.js.map +1 -1
  66. package/lib/services/git.d.ts +8 -61
  67. package/lib/services/git.d.ts.map +1 -1
  68. package/lib/services/git.js +35 -519
  69. package/lib/services/git.js.map +1 -1
  70. package/lib/services/iaas.d.ts +9 -337
  71. package/lib/services/iaas.d.ts.map +1 -1
  72. package/lib/services/iaas.js +181 -3542
  73. package/lib/services/iaas.js.map +1 -1
  74. package/lib/services/index.js +0 -2
  75. package/lib/services/intake.d.ts +8 -75
  76. package/lib/services/intake.d.ts.map +1 -1
  77. package/lib/services/intake.js +29 -474
  78. package/lib/services/intake.js.map +1 -1
  79. package/lib/services/kms.d.ts +9 -92
  80. package/lib/services/kms.d.ts.map +1 -1
  81. package/lib/services/kms.js +41 -662
  82. package/lib/services/kms.js.map +1 -1
  83. package/lib/services/lb_ip_lists.d.ts +9 -25
  84. package/lib/services/lb_ip_lists.d.ts.map +1 -1
  85. package/lib/services/lb_ip_lists.js +1 -153
  86. package/lib/services/lb_ip_lists.js.map +1 -1
  87. package/lib/services/load_balancer.d.ts +10 -81
  88. package/lib/services/load_balancer.d.ts.map +1 -1
  89. package/lib/services/load_balancer.js +29 -496
  90. package/lib/services/load_balancer.js.map +1 -1
  91. package/lib/services/logme.d.ts +8 -69
  92. package/lib/services/logme.d.ts.map +1 -1
  93. package/lib/services/logme.js +33 -573
  94. package/lib/services/logme.js.map +1 -1
  95. package/lib/services/logs.d.ts +8 -64
  96. package/lib/services/logs.d.ts.map +1 -1
  97. package/lib/services/logs.js +34 -474
  98. package/lib/services/logs.js.map +1 -1
  99. package/lib/services/mariadb.d.ts +8 -65
  100. package/lib/services/mariadb.d.ts.map +1 -1
  101. package/lib/services/mariadb.js +34 -550
  102. package/lib/services/mariadb.js.map +1 -1
  103. package/lib/services/model_experiments.d.ts +9 -48
  104. package/lib/services/model_experiments.d.ts.map +1 -1
  105. package/lib/services/model_experiments.js +1 -335
  106. package/lib/services/model_experiments.js.map +1 -1
  107. package/lib/services/model_serving.d.ts +7 -47
  108. package/lib/services/model_serving.d.ts.map +1 -1
  109. package/lib/services/model_serving.js +1 -286
  110. package/lib/services/model_serving.js.map +1 -1
  111. package/lib/services/mongodb_flex.d.ts +8 -137
  112. package/lib/services/mongodb_flex.d.ts.map +1 -1
  113. package/lib/services/mongodb_flex.js +42 -802
  114. package/lib/services/mongodb_flex.js.map +1 -1
  115. package/lib/services/object_storage.d.ts +12 -59
  116. package/lib/services/object_storage.d.ts.map +1 -1
  117. package/lib/services/object_storage.js +38 -539
  118. package/lib/services/object_storage.js.map +1 -1
  119. package/lib/services/observability.d.ts +8 -407
  120. package/lib/services/observability.d.ts.map +1 -1
  121. package/lib/services/observability.js +159 -3157
  122. package/lib/services/observability.js.map +1 -1
  123. package/lib/services/opensearch.d.ts +8 -71
  124. package/lib/services/opensearch.d.ts.map +1 -1
  125. package/lib/services/opensearch.js +34 -562
  126. package/lib/services/opensearch.js.map +1 -1
  127. package/lib/services/pim.d.ts +12 -108
  128. package/lib/services/pim.d.ts.map +1 -1
  129. package/lib/services/pim.js +31 -735
  130. package/lib/services/pim.js.map +1 -1
  131. package/lib/services/postgres_flex.d.ts +14 -136
  132. package/lib/services/postgres_flex.d.ts.map +1 -1
  133. package/lib/services/postgres_flex.js +47 -852
  134. package/lib/services/postgres_flex.js.map +1 -1
  135. package/lib/services/pubsub.d.ts +11 -73
  136. package/lib/services/pubsub.d.ts.map +1 -1
  137. package/lib/services/pubsub.js +37 -518
  138. package/lib/services/pubsub.js.map +1 -1
  139. package/lib/services/rabbitmq.d.ts +8 -76
  140. package/lib/services/rabbitmq.d.ts.map +1 -1
  141. package/lib/services/rabbitmq.js +35 -573
  142. package/lib/services/rabbitmq.js.map +1 -1
  143. package/lib/services/registry.d.ts +10 -28
  144. package/lib/services/registry.d.ts.map +1 -1
  145. package/lib/services/registry.js +1 -197
  146. package/lib/services/registry.js.map +1 -1
  147. package/lib/services/resource_manager.d.ts +9 -61
  148. package/lib/services/resource_manager.d.ts.map +1 -1
  149. package/lib/services/resource_manager.js +36 -472
  150. package/lib/services/resource_manager.js.map +1 -1
  151. package/lib/services/run_command.d.ts +5 -28
  152. package/lib/services/run_command.d.ts.map +1 -1
  153. package/lib/services/run_command.js +1 -184
  154. package/lib/services/run_command.js.map +1 -1
  155. package/lib/services/sca.d.ts +8 -79
  156. package/lib/services/sca.d.ts.map +1 -1
  157. package/lib/services/sca.js +25 -444
  158. package/lib/services/sca.js.map +1 -1
  159. package/lib/services/scf.d.ts +8 -64
  160. package/lib/services/scf.d.ts.map +1 -1
  161. package/lib/services/scf.js +40 -669
  162. package/lib/services/scf.js.map +1 -1
  163. package/lib/services/secrets_manager.d.ts +8 -61
  164. package/lib/services/secrets_manager.d.ts.map +1 -1
  165. package/lib/services/secrets_manager.js +42 -612
  166. package/lib/services/secrets_manager.js.map +1 -1
  167. package/lib/services/server_backup.d.ts +7 -50
  168. package/lib/services/server_backup.d.ts.map +1 -1
  169. package/lib/services/server_backup.js +29 -453
  170. package/lib/services/server_backup.js.map +1 -1
  171. package/lib/services/server_update.d.ts +7 -35
  172. package/lib/services/server_update.d.ts.map +1 -1
  173. package/lib/services/server_update.js +1 -351
  174. package/lib/services/server_update.js.map +1 -1
  175. package/lib/services/service_account.d.ts +10 -68
  176. package/lib/services/service_account.d.ts.map +1 -1
  177. package/lib/services/service_account.js +30 -505
  178. package/lib/services/service_account.js.map +1 -1
  179. package/lib/services/service_enablement.d.ts +7 -29
  180. package/lib/services/service_enablement.d.ts.map +1 -1
  181. package/lib/services/service_enablement.js +1 -156
  182. package/lib/services/service_enablement.js.map +1 -1
  183. package/lib/services/sfs.d.ts +4 -96
  184. package/lib/services/sfs.d.ts.map +1 -1
  185. package/lib/services/sfs.js +46 -789
  186. package/lib/services/sfs.js.map +1 -1
  187. package/lib/services/ske.d.ts +9 -108
  188. package/lib/services/ske.d.ts.map +1 -1
  189. package/lib/services/ske.js +26 -557
  190. package/lib/services/ske.js.map +1 -1
  191. package/lib/services/sqlserverflex.d.ts +11 -152
  192. package/lib/services/sqlserverflex.d.ts.map +1 -1
  193. package/lib/services/sqlserverflex.js +46 -935
  194. package/lib/services/sqlserverflex.js.map +1 -1
  195. package/lib/services/stackit_marketplace.d.ts +9 -38
  196. package/lib/services/stackit_marketplace.d.ts.map +1 -1
  197. package/lib/services/stackit_marketplace.js +26 -378
  198. package/lib/services/stackit_marketplace.js.map +1 -1
  199. package/lib/services/telemetry_link.d.ts +8 -61
  200. package/lib/services/telemetry_link.d.ts.map +1 -1
  201. package/lib/services/telemetry_link.js +34 -531
  202. package/lib/services/telemetry_link.js.map +1 -1
  203. package/lib/services/telemetry_router.d.ts +8 -72
  204. package/lib/services/telemetry_router.d.ts.map +1 -1
  205. package/lib/services/telemetry_router.js +29 -483
  206. package/lib/services/telemetry_router.js.map +1 -1
  207. package/lib/services/ufw.d.ts +7 -42
  208. package/lib/services/ufw.d.ts.map +1 -1
  209. package/lib/services/ufw.js +1 -278
  210. package/lib/services/ufw.js.map +1 -1
  211. package/lib/services/valkey.d.ts +8 -68
  212. package/lib/services/valkey.d.ts.map +1 -1
  213. package/lib/services/valkey.js +34 -566
  214. package/lib/services/valkey.js.map +1 -1
  215. package/lib/services/vpn.d.ts +21 -186
  216. package/lib/services/vpn.d.ts.map +1 -1
  217. package/lib/services/vpn.js +43 -930
  218. package/lib/services/vpn.js.map +1 -1
  219. package/lib/services/workflows.d.ts +15 -84
  220. package/lib/services/workflows.d.ts.map +1 -1
  221. package/lib/services/workflows.js +27 -507
  222. package/lib/services/workflows.js.map +1 -1
  223. package/lib/services.lazy/alb.js +4 -0
  224. package/lib/services.lazy/alb_waf.js +4 -0
  225. package/lib/services.lazy/authorization.js +1 -0
  226. package/lib/services.lazy/automation.js +1 -0
  227. package/lib/services.lazy/cdn.js +4 -0
  228. package/lib/services.lazy/certificates.js +1 -0
  229. package/lib/services.lazy/cost.js +1 -0
  230. package/lib/services.lazy/dns.js +4 -0
  231. package/lib/services.lazy/dremio.js +1 -0
  232. package/lib/services.lazy/edge.js +1 -0
  233. package/lib/services.lazy/functions.js +1 -0
  234. package/lib/services.lazy/git.js +4 -0
  235. package/lib/services.lazy/iaas.js +4 -0
  236. package/lib/services.lazy/index.js +3 -0
  237. package/lib/services.lazy/intake.js +4 -0
  238. package/lib/services.lazy/kms.js +4 -0
  239. package/lib/services.lazy/lb_ip_lists.js +1 -0
  240. package/lib/services.lazy/load_balancer.js +4 -0
  241. package/lib/services.lazy/logme.js +4 -0
  242. package/lib/services.lazy/logs.js +4 -0
  243. package/lib/services.lazy/mariadb.js +4 -0
  244. package/lib/services.lazy/model_experiments.js +1 -0
  245. package/lib/services.lazy/model_serving.js +1 -0
  246. package/lib/services.lazy/mongodb_flex.js +4 -0
  247. package/lib/services.lazy/object_storage.js +4 -0
  248. package/lib/services.lazy/observability.js +4 -0
  249. package/lib/services.lazy/opensearch.js +4 -0
  250. package/lib/services.lazy/pim.js +4 -0
  251. package/lib/services.lazy/postgres_flex.js +4 -0
  252. package/lib/services.lazy/pubsub.js +4 -0
  253. package/lib/services.lazy/rabbitmq.js +4 -0
  254. package/lib/services.lazy/registry.js +1 -0
  255. package/lib/services.lazy/resource_manager.js +4 -0
  256. package/lib/services.lazy/run_command.js +1 -0
  257. package/lib/services.lazy/sca.js +4 -0
  258. package/lib/services.lazy/scf.js +4 -0
  259. package/lib/services.lazy/secrets_manager.js +4 -0
  260. package/lib/services.lazy/server_backup.js +4 -0
  261. package/lib/services.lazy/server_update.js +1 -0
  262. package/lib/services.lazy/service_account.js +4 -0
  263. package/lib/services.lazy/service_enablement.js +1 -0
  264. package/lib/services.lazy/sfs.js +4 -0
  265. package/lib/services.lazy/ske.js +4 -0
  266. package/lib/services.lazy/sqlserverflex.js +4 -0
  267. package/lib/services.lazy/stackit_marketplace.js +4 -0
  268. package/lib/services.lazy/telemetry_link.js +4 -0
  269. package/lib/services.lazy/telemetry_router.js +4 -0
  270. package/lib/services.lazy/ufw.js +1 -0
  271. package/lib/services.lazy/valkey.js +4 -0
  272. package/lib/services.lazy/vpn.js +4 -0
  273. package/lib/services.lazy/workflows.js +4 -0
  274. package/lib/traits.d.ts +1 -1
  275. package/lib/traits.js +1 -15
  276. package/package.json +9 -7
  277. package/src/credentials.ts +21 -18
  278. package/src/errors.ts +10 -14
  279. package/src/index.ts +2 -2
  280. package/src/pagination.ts +2 -2
  281. package/src/protocol.ts +12 -9
  282. package/src/retry.ts +6 -4
  283. package/src/services/alb.ts +599 -655
  284. package/src/services/alb_waf.ts +597 -637
  285. package/src/services/authorization.ts +400 -383
  286. package/src/services/automation.ts +422 -405
  287. package/src/services/cdn.ts +817 -1375
  288. package/src/services/certificates.ts +209 -190
  289. package/src/services/cost.ts +100 -207
  290. package/src/services/dns.ts +793 -833
  291. package/src/services/dremio.ts +356 -349
  292. package/src/services/edge.ts +406 -366
  293. package/src/services/functions.ts +465 -463
  294. package/src/services/git.ts +602 -547
  295. package/src/services/iaas.ts +3931 -3821
  296. package/src/services/intake.ts +521 -549
  297. package/src/services/kms.ts +715 -692
  298. package/src/services/lb_ip_lists.ts +173 -152
  299. package/src/services/load_balancer.ts +576 -619
  300. package/src/services/logme.ts +696 -641
  301. package/src/services/logs.ts +510 -493
  302. package/src/services/mariadb.ts +671 -604
  303. package/src/services/model_experiments.ts +343 -356
  304. package/src/services/model_serving.ts +337 -328
  305. package/src/services/mongodb_flex.ts +955 -1007
  306. package/src/services/object_storage.ts +614 -557
  307. package/src/services/observability.ts +3469 -3866
  308. package/src/services/opensearch.ts +679 -628
  309. package/src/services/pim.ts +672 -909
  310. package/src/services/postgres_flex.ts +966 -986
  311. package/src/services/pubsub.ts +524 -546
  312. package/src/services/rabbitmq.ts +693 -654
  313. package/src/services/registry.ts +227 -194
  314. package/src/services/resource_manager.ts +520 -517
  315. package/src/services/run_command.ts +219 -211
  316. package/src/services/sca.ts +543 -570
  317. package/src/services/scf.ts +790 -716
  318. package/src/services/secrets_manager.ts +707 -622
  319. package/src/services/server_backup.ts +490 -475
  320. package/src/services/server_update.ts +353 -356
  321. package/src/services/service_account.ts +515 -553
  322. package/src/services/service_enablement.ts +162 -166
  323. package/src/services/sfs.ts +879 -958
  324. package/src/services/ske.ts +694 -769
  325. package/src/services/sqlserverflex.ts +1042 -1117
  326. package/src/services/stackit_marketplace.ts +377 -372
  327. package/src/services/telemetry_link.ts +530 -531
  328. package/src/services/telemetry_router.ts +509 -534
  329. package/src/services/ufw.ts +305 -307
  330. package/src/services/valkey.ts +684 -629
  331. package/src/services/vpn.ts +935 -1195
  332. package/src/services/workflows.ts +426 -586
  333. package/src/traits.ts +1 -1
  334. package/lib/credentials.js.map +0 -1
  335. package/lib/errors.js.map +0 -1
  336. package/lib/pagination.js.map +0 -1
  337. package/lib/protocol.js.map +0 -1
  338. package/lib/protocol.test.d.ts +0 -2
  339. package/lib/protocol.test.d.ts.map +0 -1
  340. package/lib/protocol.test.js +0 -181
  341. package/lib/protocol.test.js.map +0 -1
  342. package/lib/retry.js.map +0 -1
  343. package/lib/services/index.js.map +0 -1
  344. package/lib/traits.js.map +0 -1
  345. package/src/protocol.test.ts +0 -304
  346. /package/lib/{index.js.map → index.lazy.js.map} +0 -0
package/src/traits.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * STACKIT SDK trait surface — hand-written.
2
+ * STACKIT SDK trait surface -- hand-written.
3
3
  *
4
4
  * Re-exports the generic protocol traits from core and extends `Http` with
5
5
  * the per-product base URL: every STACKIT service has its own host (from
@@ -1 +0,0 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAcrC,MAAM,OAAO,WAAY,SAAQ,OAAO,CAAC,OAAO,EAAsC,CACpF,oBAAoB,CACrB;CAAG;AAEJ,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC;IACjC,kEAAkE;IAClE,oDAAoD;IACpD,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,+BAA+B,CAAC;IAC3D,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC5F,UAAU,EAAE,YAAY,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;CAClF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAC7C,WAAW,EACX,SAAS,CAAC,IAAI,CACZ,MAAM,CAAC,QAAQ,CACb,GAAG,EAAE,CACH,IAAI,WAAW,CAAC;IACd,OAAO,EAAE,gEAAgE;CAC1E,CAAC,CACL,EACD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7C,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3B,MAAM;IACN,UAAU,EAAE,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;CACtE,CAAC,CAAC,EACH,MAAM,CAAC,KAAK,CACb,CACF,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAI3B,EAA4B,EAAE,CAC7B,KAAK,CAAC,OAAO,CACX,WAAW,EACX,MAAM,CAAC,OAAO,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,cAAc;IACvC,UAAU,EAAE,MAAM,CAAC,UAAU;CAC9B,CAAC,CACH,CAAC"}
package/lib/errors.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,MAAM,EACN,QAAQ,EACR,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,UAAU,GACX,MAAM,8BAA8B,CAAC;AAGtC,OAAO,KAAK,QAAQ,MAAM,gCAAgC,CAAC;AAC3D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,8EAA8E;AAC9E,MAAM,OAAO,mBAAoB,SAAQ,MAAM,CAAC,WAAW,EAAuB,CAChF,qBAAqB,EACrB;IACE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC,OAAO;CACrB,CACF,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;CAAG;AAEnC,kCAAkC;AAClC,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAC5E,mBAAmB,EACnB;IACE,IAAI,EAAE,MAAM,CAAC,OAAO;IACpB,KAAK,EAAE,MAAM,CAAC,OAAO;CACtB,CACF,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;CAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2B,MAAM,kCAAkC,CAAC;AACpF;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAuB,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;IACvF,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IACzC,MAAM,cAAc,GAAG,UAAU,CAAC,WAAW,CAAC;IAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC;IACnC,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,GAAG,CACf,IAAI,KAAK,CAAC,yEAAyE,CAAC,CACrF,CAAC;IACJ,CAAC;IAGD,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,UAAU,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5F,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CACxE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAEjC,MAAM,cAAc,GAAG;YACrB,GAAG,KAAK;YACR,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,IAAI;SACT,CAAC;QAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAElD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,SAAS;YACrB,CAAC,CAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAoC;YAClE,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,SAAS,GACb,OAAO,UAAU,KAAK,QAAQ;YAC9B,KAAK,CAAC,IAAI,IAAI,UAAU;YACxB,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAE9C,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAkB,CAAU,CAAC;IACxF,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=protocol.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.test.d.ts","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":""}
@@ -1,181 +0,0 @@
1
- import * as CoreErrors from "@distilled.cloud/core/errors";
2
- import * as ResponseValidation from "@distilled.cloud/core/response-validation";
3
- import * as Effect from "effect/Effect";
4
- import * as HttpClient from "effect/http/HttpClient";
5
- import * as HttpClientResponse from "effect/http/HttpClientResponse";
6
- import * as Layer from "effect/Layer";
7
- import * as Redacted from "effect/Redacted";
8
- import { describe, expect, test } from "vitest";
9
- import { Credentials, credentials } from "./credentials.js";
10
- import { StackitParseError, UnknownStackitError } from "./errors.js";
11
- import { applyRegion } from "./protocol.js";
12
- import * as Retry from "./retry.js";
13
- import { listServers } from "./services/iaas.js";
14
- import { BadRequest, Conflict, deleteProject, getProject, listProjects, NotFound, } from "./services/resource_manager.js";
15
- import { getInstance } from "./services/secrets_manager.js";
16
- const fakeStackit = (status = 200, body = "{}", headers = {}) => {
17
- const calls = [];
18
- const layer = Layer.succeed(HttpClient.HttpClient, HttpClient.make((request, url) => Effect.sync(() => {
19
- calls.push({
20
- method: request.method,
21
- url,
22
- headers: { ...request.headers },
23
- body: request.body._tag === "Uint8Array"
24
- ? new TextDecoder().decode(request.body.body)
25
- : undefined,
26
- });
27
- return HttpClientResponse.fromWeb(request, new Response(body, { status, headers }));
28
- })));
29
- return { calls, layer };
30
- };
31
- const creds = (config = {}) => credentials({ token: Redacted.make("stackit-token"), ...config });
32
- const run = (operation, http, credentialsLayer = creds()) => Effect.runPromise(operation.pipe(Retry.none, Effect.provide(credentialsLayer), Effect.provide(http)));
33
- const runFlip = (operation, http) => Effect.runPromise(operation.pipe(Retry.none, Effect.provide(creds()), Effect.provide(http), Effect.flip));
34
- const projectId = "11111111-2222-3333-4444-555555555555";
35
- describe("applyRegion", () => {
36
- test("inserts the region into a version-less product host", () => {
37
- expect(applyRegion("https://ske.api.stackit.cloud", "eu01")).toBe("https://ske.api.eu01.stackit.cloud");
38
- expect(applyRegion("https://load-balancer.api.stackit.cloud/", "eu02")).toBe("https://load-balancer.api.eu02.stackit.cloud/");
39
- });
40
- test("substitutes a glued {region} template, adding the trailing dot", () => {
41
- expect(applyRegion("https://argus.api.{region}stackit.cloud", "eu01")).toBe("https://argus.api.eu01.stackit.cloud");
42
- expect(applyRegion("https://argus.api.{region}stackit.cloud", "eu01.")).toBe("https://argus.api.eu01.stackit.cloud");
43
- });
44
- test("substitutes a non-glued {region} template verbatim", () => {
45
- expect(applyRegion("https://example.{region}.stackit.cloud", "eu01")).toBe("https://example.eu01.stackit.cloud");
46
- });
47
- test("'global' leaves hosts alone and drops a leftover {region}", () => {
48
- expect(applyRegion("https://dns.api.stackit.cloud", "global")).toBe("https://dns.api.stackit.cloud");
49
- expect(applyRegion("https://argus.api.{region}stackit.cloud", "global")).toBe("https://argus.api.stackit.cloud");
50
- });
51
- test("leaves non-STACKIT and already-regional hosts alone", () => {
52
- expect(applyRegion("https://proxy.example.com", "eu01")).toBe("https://proxy.example.com");
53
- expect(applyRegion("https://ske.api.eu01.stackit.cloud", "eu02")).toBe("https://ske.api.eu01.stackit.cloud");
54
- });
55
- });
56
- describe("request encoding", () => {
57
- test("sends Bearer auth to the product host in the default region (eu01)", async () => {
58
- const { calls, layer } = fakeStackit(200, JSON.stringify({}));
59
- await run(getProject({ id: projectId }), layer);
60
- expect(calls[0].headers.authorization).toBe("Bearer stackit-token");
61
- expect(calls[0].url.href).toBe(`https://resource-manager.api.eu01.stackit.cloud/v2/projects/${projectId}`);
62
- });
63
- test("each product uses its own host; the configured region is applied", async () => {
64
- const iaas = fakeStackit(200, JSON.stringify({ items: [] }));
65
- await run(listServers({ projectId, region: "eu02", details: true }), iaas.layer, creds({ region: "eu02" }));
66
- expect(iaas.calls[0].url.href).toBe(`https://iaas.api.eu02.stackit.cloud/v2/projects/${projectId}/regions/eu02/servers?details=true`);
67
- const secrets = fakeStackit(200, JSON.stringify({}));
68
- await run(getInstance({ projectId, instanceId: "i-1" }), secrets.layer, creds({ region: "eu02" }));
69
- expect(secrets.calls[0].url.href).toBe(`https://secrets-manager.api.eu02.stackit.cloud/v1/projects/${projectId}/instances/i-1`);
70
- });
71
- test("region 'global' keeps the spec host", async () => {
72
- const { calls, layer } = fakeStackit(200, JSON.stringify({}));
73
- await run(getProject({ id: projectId }), layer, creds({ region: "global" }));
74
- expect(calls[0].url.origin).toBe("https://resource-manager.api.stackit.cloud");
75
- });
76
- test("an explicit apiBaseUrl overrides every product host", async () => {
77
- const { calls, layer } = fakeStackit(200, JSON.stringify({}));
78
- await run(getInstance({ projectId, instanceId: "i-1" }), layer, creds({ apiBaseUrl: "http://localhost:8080" }));
79
- expect(calls[0].url.href).toBe(`http://localhost:8080/v1/projects/${projectId}/instances/i-1`);
80
- });
81
- test("resolves credentials per request", async () => {
82
- const { calls, layer } = fakeStackit(200, JSON.stringify({}));
83
- let n = 0;
84
- const rotating = Layer.succeed(Credentials, Effect.sync(() => ({ token: Redacted.make(`t${++n}`), region: n === 1 ? "eu01" : "eu02" })));
85
- await run(getProject({ id: projectId }), layer, rotating);
86
- await run(getProject({ id: projectId }), layer, rotating);
87
- expect(calls.map((c) => [c.headers.authorization, c.url.host])).toEqual([
88
- ["Bearer t1", "resource-manager.api.eu01.stackit.cloud"],
89
- ["Bearer t2", "resource-manager.api.eu02.stackit.cloud"],
90
- ]);
91
- });
92
- test("labels are encoded; array queries repeat; wire query names are used", async () => {
93
- const get = fakeStackit(200, JSON.stringify({}));
94
- await run(getProject({ id: "a b/c" }), get.layer);
95
- expect(get.calls[0].url.pathname).toBe("/v2/projects/a%20b%2Fc");
96
- const list = fakeStackit(200, JSON.stringify({ items: [] }));
97
- await run(listProjects({
98
- containerIds: ["p1", "p2"],
99
- limit: 10,
100
- creation_time_start: "2024-01-01T00:00:00Z",
101
- }), list.layer);
102
- const url = list.calls[0].url;
103
- expect(url.searchParams.getAll("containerIds")).toEqual(["p1", "p2"]);
104
- expect(url.searchParams.get("limit")).toBe("10");
105
- expect(url.searchParams.get("creation-time-start")).toBe("2024-01-01T00:00:00Z");
106
- });
107
- });
108
- describe("{ message, error } failure envelope", () => {
109
- test("a declared status class carries `message`", async () => {
110
- const { layer } = fakeStackit(404, JSON.stringify({ message: "project not found", error: "Not Found" }));
111
- const error = await runFlip(getProject({ id: projectId }), layer);
112
- expect(error).toBeInstanceOf(NotFound);
113
- expect(error).toMatchObject({ message: "project not found" });
114
- });
115
- test("409 matches the declared Conflict", async () => {
116
- const { layer } = fakeStackit(409, JSON.stringify({ message: "has children", error: "Conflict" }));
117
- const error = await runFlip(deleteProject({ id: projectId }), layer);
118
- expect(error).toBeInstanceOf(Conflict);
119
- });
120
- test("400 matches the declared BadRequest", async () => {
121
- const { layer } = fakeStackit(400, JSON.stringify({ message: "bad limit", error: "Bad Request" }));
122
- const error = await runFlip(listProjects({ limit: -1 }), layer);
123
- expect(error).toBeInstanceOf(BadRequest);
124
- expect(error).toMatchObject({ message: "bad limit" });
125
- });
126
- test("undeclared statuses fall back to the core HTTP classes with Retry-After", async () => {
127
- const { layer } = fakeStackit(429, JSON.stringify({ message: "slow down" }), {
128
- "retry-after": "4",
129
- });
130
- const error = await runFlip(getProject({ id: projectId }), layer);
131
- expect(error).toBeInstanceOf(CoreErrors.TooManyRequests);
132
- expect(error).toMatchObject({ message: "slow down" });
133
- expect(error.retryAfter).toBeDefined();
134
- });
135
- test("unmapped 5xx becomes InternalServerError; plain text is the message", async () => {
136
- const { layer } = fakeStackit(507, " insufficient storage\n");
137
- const error = await runFlip(getProject({ id: projectId }), layer);
138
- expect(error).toBeInstanceOf(CoreErrors.InternalServerError);
139
- expect(error).toMatchObject({ message: "insufficient storage" });
140
- });
141
- test("an empty body uses `HTTP <status>` as message", async () => {
142
- const { layer } = fakeStackit(404, "");
143
- const error = await runFlip(getProject({ id: projectId }), layer);
144
- expect(error).toBeInstanceOf(NotFound);
145
- expect(error).toMatchObject({ message: "HTTP 404" });
146
- });
147
- test("unmapped 4xx becomes UnknownStackitError with `error` as code", async () => {
148
- const body = { message: "teapot", error: "I'm a teapot" };
149
- const { layer } = fakeStackit(418, JSON.stringify(body));
150
- const error = await runFlip(getProject({ id: projectId }), layer);
151
- expect(error).toBeInstanceOf(UnknownStackitError);
152
- expect(error).toMatchObject({ code: "I'm a teapot", message: "teapot", body });
153
- });
154
- test("a numeric `code` is stringified when `error` is absent", async () => {
155
- const body = { message: "teapot", code: 4180 };
156
- const { layer } = fakeStackit(418, JSON.stringify(body));
157
- const error = await runFlip(getProject({ id: projectId }), layer);
158
- expect(error).toBeInstanceOf(UnknownStackitError);
159
- expect(error).toMatchObject({ code: "4180", message: "teapot" });
160
- });
161
- });
162
- describe("success decoding", () => {
163
- test("the 2xx JSON body is the payload; empty bodies decode to {}", async () => {
164
- const project = { containerId: "c", projectId, name: "p" };
165
- const get = fakeStackit(200, JSON.stringify(project));
166
- expect(await run(getProject({ id: projectId }), get.layer)).toEqual(project);
167
- for (const [status, body] of [
168
- [202, ""],
169
- [204, null],
170
- ]) {
171
- const del = fakeStackit(status, body);
172
- expect(await run(deleteProject({ id: projectId }), del.layer)).toEqual({});
173
- }
174
- });
175
- test("strict validation fails a mismatched payload with StackitParseError", async () => {
176
- const { layer } = fakeStackit(200, JSON.stringify({ name: 42 }));
177
- const error = await Effect.runPromise(getProject({ id: projectId }).pipe(Retry.none, Effect.provide(creds()), Effect.provide(layer), Effect.provide(ResponseValidation.strict), Effect.flip));
178
- expect(error).toBeInstanceOf(StackitParseError);
179
- });
180
- });
181
- //# sourceMappingURL=protocol.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":"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"}
package/lib/retry.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/F;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAIL,WAAW,EACX,QAAQ,EACR,MAAM,EACN,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAErC,uEAAuE;AACvE,MAAM,OAAO,KAAM,SAAQ,OAAO,CAAC,OAAO,EAAiB,CAAC,cAAc,CAAC;CAAG;AAE9E,yEAAyE;AACzE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,gBAAwB,EAAE,EAAE,CACjD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEzD,sCAAsC;AACtC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAEjF,kFAAkF;AAClF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEpD,oFAAoF;AACpF,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC"}
package/lib/traits.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"traits.js","sourceRoot":"","sources":["../src/traits.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAkB,MAAM,6BAA6B,CAAC;AAEzF,OAAO,EACL,IAAI,EACJ,MAAM,EACN,KAAK,EACL,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EAGd,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,cAAc,EACd,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC;AAY7C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAuB,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC"}
@@ -1,304 +0,0 @@
1
- import * as CoreErrors from "@distilled.cloud/core/errors";
2
- import * as ResponseValidation from "@distilled.cloud/core/response-validation";
3
- import * as Effect from "effect/Effect";
4
- import * as HttpClient from "effect/http/HttpClient";
5
- import * as HttpClientResponse from "effect/http/HttpClientResponse";
6
- import * as Layer from "effect/Layer";
7
- import * as Redacted from "effect/Redacted";
8
- import { describe, expect, test } from "vitest";
9
- import { Credentials, credentials } from "./credentials.ts";
10
- import { StackitParseError, UnknownStackitError } from "./errors.ts";
11
- import { applyRegion } from "./protocol.ts";
12
- import * as Retry from "./retry.ts";
13
- import { listServers } from "./services/iaas.ts";
14
- import {
15
- BadRequest,
16
- Conflict,
17
- deleteProject,
18
- getProject,
19
- listProjects,
20
- NotFound,
21
- } from "./services/resource_manager.ts";
22
- import { getInstance } from "./services/secrets_manager.ts";
23
-
24
- interface Captured {
25
- readonly method: string;
26
- readonly url: URL;
27
- readonly headers: Record<string, string>;
28
- readonly body: string | undefined;
29
- }
30
-
31
- const fakeStackit = (
32
- status = 200,
33
- body: string | null = "{}",
34
- headers: Record<string, string> = {},
35
- ) => {
36
- const calls: Captured[] = [];
37
- const layer = Layer.succeed(
38
- HttpClient.HttpClient,
39
- HttpClient.make((request, url) =>
40
- Effect.sync(() => {
41
- calls.push({
42
- method: request.method,
43
- url,
44
- headers: { ...request.headers },
45
- body:
46
- request.body._tag === "Uint8Array"
47
- ? new TextDecoder().decode(request.body.body)
48
- : undefined,
49
- });
50
- return HttpClientResponse.fromWeb(request, new Response(body, { status, headers }));
51
- }),
52
- ),
53
- );
54
- return { calls, layer };
55
- };
56
-
57
- const creds = (config: { region?: string; apiBaseUrl?: string } = {}) =>
58
- credentials({ token: Redacted.make("stackit-token"), ...config });
59
-
60
- const run = <A, E>(
61
- operation: Effect.Effect<A, E, Credentials | HttpClient.HttpClient>,
62
- http: Layer.Layer<HttpClient.HttpClient>,
63
- credentialsLayer: Layer.Layer<Credentials> = creds(),
64
- ) =>
65
- Effect.runPromise(
66
- operation.pipe(Retry.none, Effect.provide(credentialsLayer), Effect.provide(http)),
67
- );
68
-
69
- const runFlip = <A, E>(
70
- operation: Effect.Effect<A, E, Credentials | HttpClient.HttpClient>,
71
- http: Layer.Layer<HttpClient.HttpClient>,
72
- ) =>
73
- Effect.runPromise(
74
- operation.pipe(Retry.none, Effect.provide(creds()), Effect.provide(http), Effect.flip),
75
- );
76
-
77
- const projectId = "11111111-2222-3333-4444-555555555555";
78
-
79
- describe("applyRegion", () => {
80
- test("inserts the region into a version-less product host", () => {
81
- expect(applyRegion("https://ske.api.stackit.cloud", "eu01")).toBe(
82
- "https://ske.api.eu01.stackit.cloud",
83
- );
84
- expect(applyRegion("https://load-balancer.api.stackit.cloud/", "eu02")).toBe(
85
- "https://load-balancer.api.eu02.stackit.cloud/",
86
- );
87
- });
88
-
89
- test("substitutes a glued {region} template, adding the trailing dot", () => {
90
- expect(applyRegion("https://argus.api.{region}stackit.cloud", "eu01")).toBe(
91
- "https://argus.api.eu01.stackit.cloud",
92
- );
93
- expect(applyRegion("https://argus.api.{region}stackit.cloud", "eu01.")).toBe(
94
- "https://argus.api.eu01.stackit.cloud",
95
- );
96
- });
97
-
98
- test("substitutes a non-glued {region} template verbatim", () => {
99
- expect(applyRegion("https://example.{region}.stackit.cloud", "eu01")).toBe(
100
- "https://example.eu01.stackit.cloud",
101
- );
102
- });
103
-
104
- test("'global' leaves hosts alone and drops a leftover {region}", () => {
105
- expect(applyRegion("https://dns.api.stackit.cloud", "global")).toBe(
106
- "https://dns.api.stackit.cloud",
107
- );
108
- expect(applyRegion("https://argus.api.{region}stackit.cloud", "global")).toBe(
109
- "https://argus.api.stackit.cloud",
110
- );
111
- });
112
-
113
- test("leaves non-STACKIT and already-regional hosts alone", () => {
114
- expect(applyRegion("https://proxy.example.com", "eu01")).toBe("https://proxy.example.com");
115
- expect(applyRegion("https://ske.api.eu01.stackit.cloud", "eu02")).toBe(
116
- "https://ske.api.eu01.stackit.cloud",
117
- );
118
- });
119
- });
120
-
121
- describe("request encoding", () => {
122
- test("sends Bearer auth to the product host in the default region (eu01)", async () => {
123
- const { calls, layer } = fakeStackit(200, JSON.stringify({}));
124
- await run(getProject({ id: projectId }), layer);
125
- expect(calls[0].headers.authorization).toBe("Bearer stackit-token");
126
- expect(calls[0].url.href).toBe(
127
- `https://resource-manager.api.eu01.stackit.cloud/v2/projects/${projectId}`,
128
- );
129
- });
130
-
131
- test("each product uses its own host; the configured region is applied", async () => {
132
- const iaas = fakeStackit(200, JSON.stringify({ items: [] }));
133
- await run(
134
- listServers({ projectId, region: "eu02", details: true }),
135
- iaas.layer,
136
- creds({ region: "eu02" }),
137
- );
138
- expect(iaas.calls[0].url.href).toBe(
139
- `https://iaas.api.eu02.stackit.cloud/v2/projects/${projectId}/regions/eu02/servers?details=true`,
140
- );
141
-
142
- const secrets = fakeStackit(200, JSON.stringify({}));
143
- await run(
144
- getInstance({ projectId, instanceId: "i-1" }),
145
- secrets.layer,
146
- creds({ region: "eu02" }),
147
- );
148
- expect(secrets.calls[0].url.href).toBe(
149
- `https://secrets-manager.api.eu02.stackit.cloud/v1/projects/${projectId}/instances/i-1`,
150
- );
151
- });
152
-
153
- test("region 'global' keeps the spec host", async () => {
154
- const { calls, layer } = fakeStackit(200, JSON.stringify({}));
155
- await run(getProject({ id: projectId }), layer, creds({ region: "global" }));
156
- expect(calls[0].url.origin).toBe("https://resource-manager.api.stackit.cloud");
157
- });
158
-
159
- test("an explicit apiBaseUrl overrides every product host", async () => {
160
- const { calls, layer } = fakeStackit(200, JSON.stringify({}));
161
- await run(
162
- getInstance({ projectId, instanceId: "i-1" }),
163
- layer,
164
- creds({ apiBaseUrl: "http://localhost:8080" }),
165
- );
166
- expect(calls[0].url.href).toBe(`http://localhost:8080/v1/projects/${projectId}/instances/i-1`);
167
- });
168
-
169
- test("resolves credentials per request", async () => {
170
- const { calls, layer } = fakeStackit(200, JSON.stringify({}));
171
- let n = 0;
172
- const rotating = Layer.succeed(
173
- Credentials,
174
- Effect.sync(() => ({ token: Redacted.make(`t${++n}`), region: n === 1 ? "eu01" : "eu02" })),
175
- );
176
- await run(getProject({ id: projectId }), layer, rotating);
177
- await run(getProject({ id: projectId }), layer, rotating);
178
- expect(calls.map((c) => [c.headers.authorization, c.url.host])).toEqual([
179
- ["Bearer t1", "resource-manager.api.eu01.stackit.cloud"],
180
- ["Bearer t2", "resource-manager.api.eu02.stackit.cloud"],
181
- ]);
182
- });
183
-
184
- test("labels are encoded; array queries repeat; wire query names are used", async () => {
185
- const get = fakeStackit(200, JSON.stringify({}));
186
- await run(getProject({ id: "a b/c" }), get.layer);
187
- expect(get.calls[0].url.pathname).toBe("/v2/projects/a%20b%2Fc");
188
-
189
- const list = fakeStackit(200, JSON.stringify({ items: [] }));
190
- await run(
191
- listProjects({
192
- containerIds: ["p1", "p2"],
193
- limit: 10,
194
- creation_time_start: "2024-01-01T00:00:00Z",
195
- }),
196
- list.layer,
197
- );
198
- const url = list.calls[0].url;
199
- expect(url.searchParams.getAll("containerIds")).toEqual(["p1", "p2"]);
200
- expect(url.searchParams.get("limit")).toBe("10");
201
- expect(url.searchParams.get("creation-time-start")).toBe("2024-01-01T00:00:00Z");
202
- });
203
- });
204
-
205
- describe("{ message, error } failure envelope", () => {
206
- test("a declared status class carries `message`", async () => {
207
- const { layer } = fakeStackit(
208
- 404,
209
- JSON.stringify({ message: "project not found", error: "Not Found" }),
210
- );
211
- const error = await runFlip(getProject({ id: projectId }), layer);
212
- expect(error).toBeInstanceOf(NotFound);
213
- expect(error).toMatchObject({ message: "project not found" });
214
- });
215
-
216
- test("409 matches the declared Conflict", async () => {
217
- const { layer } = fakeStackit(
218
- 409,
219
- JSON.stringify({ message: "has children", error: "Conflict" }),
220
- );
221
- const error = await runFlip(deleteProject({ id: projectId }), layer);
222
- expect(error).toBeInstanceOf(Conflict);
223
- });
224
-
225
- test("400 matches the declared BadRequest", async () => {
226
- const { layer } = fakeStackit(
227
- 400,
228
- JSON.stringify({ message: "bad limit", error: "Bad Request" }),
229
- );
230
- const error = await runFlip(listProjects({ limit: -1 }), layer);
231
- expect(error).toBeInstanceOf(BadRequest);
232
- expect(error).toMatchObject({ message: "bad limit" });
233
- });
234
-
235
- test("undeclared statuses fall back to the core HTTP classes with Retry-After", async () => {
236
- const { layer } = fakeStackit(429, JSON.stringify({ message: "slow down" }), {
237
- "retry-after": "4",
238
- });
239
- const error = await runFlip(getProject({ id: projectId }), layer);
240
- expect(error).toBeInstanceOf(CoreErrors.TooManyRequests);
241
- expect(error).toMatchObject({ message: "slow down" });
242
- expect((error as CoreErrors.TooManyRequests).retryAfter).toBeDefined();
243
- });
244
-
245
- test("unmapped 5xx becomes InternalServerError; plain text is the message", async () => {
246
- const { layer } = fakeStackit(507, " insufficient storage\n");
247
- const error = await runFlip(getProject({ id: projectId }), layer);
248
- expect(error).toBeInstanceOf(CoreErrors.InternalServerError);
249
- expect(error).toMatchObject({ message: "insufficient storage" });
250
- });
251
-
252
- test("an empty body uses `HTTP <status>` as message", async () => {
253
- const { layer } = fakeStackit(404, "");
254
- const error = await runFlip(getProject({ id: projectId }), layer);
255
- expect(error).toBeInstanceOf(NotFound);
256
- expect(error).toMatchObject({ message: "HTTP 404" });
257
- });
258
-
259
- test("unmapped 4xx becomes UnknownStackitError with `error` as code", async () => {
260
- const body = { message: "teapot", error: "I'm a teapot" };
261
- const { layer } = fakeStackit(418, JSON.stringify(body));
262
- const error = await runFlip(getProject({ id: projectId }), layer);
263
- expect(error).toBeInstanceOf(UnknownStackitError);
264
- expect(error).toMatchObject({ code: "I'm a teapot", message: "teapot", body });
265
- });
266
-
267
- test("a numeric `code` is stringified when `error` is absent", async () => {
268
- const body = { message: "teapot", code: 4180 };
269
- const { layer } = fakeStackit(418, JSON.stringify(body));
270
- const error = await runFlip(getProject({ id: projectId }), layer);
271
- expect(error).toBeInstanceOf(UnknownStackitError);
272
- expect(error).toMatchObject({ code: "4180", message: "teapot" });
273
- });
274
- });
275
-
276
- describe("success decoding", () => {
277
- test("the 2xx JSON body is the payload; empty bodies decode to {}", async () => {
278
- const project = { containerId: "c", projectId, name: "p" };
279
- const get = fakeStackit(200, JSON.stringify(project));
280
- expect(await run(getProject({ id: projectId }), get.layer)).toEqual(project);
281
-
282
- for (const [status, body] of [
283
- [202, ""],
284
- [204, null],
285
- ] as const) {
286
- const del = fakeStackit(status, body);
287
- expect(await run(deleteProject({ id: projectId }), del.layer)).toEqual({});
288
- }
289
- });
290
-
291
- test("strict validation fails a mismatched payload with StackitParseError", async () => {
292
- const { layer } = fakeStackit(200, JSON.stringify({ name: 42 }));
293
- const error = await Effect.runPromise(
294
- getProject({ id: projectId }).pipe(
295
- Retry.none,
296
- Effect.provide(creds()),
297
- Effect.provide(layer),
298
- Effect.provide(ResponseValidation.strict),
299
- Effect.flip,
300
- ),
301
- );
302
- expect(error).toBeInstanceOf(StackitParseError);
303
- });
304
- });
File without changes