@voxgig/sdkgen 4.10.0 → 4.11.0

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 (304) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/package.json +1 -1
  3. package/project/.sdk/model/feature/secrets.aon +330 -0
  4. package/project/.sdk/model/target/c.aon +15 -2
  5. package/project/.sdk/model/target/cpp.aon +18 -0
  6. package/project/.sdk/model/target/lua.aon +17 -0
  7. package/project/.sdk/model/target/ocaml.aon +48 -5
  8. package/project/.sdk/model/target/zig.aon +30 -4
  9. package/project/.sdk/src/cmp/c/Config_c.ts +338 -1
  10. package/project/.sdk/src/cmp/c/Main_c.ts +57 -2
  11. package/project/.sdk/src/cmp/c/Package_c.ts +12 -2
  12. package/project/.sdk/src/cmp/cpp/Config_cpp.ts +324 -2
  13. package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +2 -0
  14. package/project/.sdk/src/cmp/cpp/Main_cpp.ts +62 -4
  15. package/project/.sdk/src/cmp/cpp/Package_cpp.ts +10 -0
  16. package/project/.sdk/src/cmp/lua/Config_lua.ts +88 -0
  17. package/project/.sdk/src/cmp/lua/Gitignore_lua.ts +4 -0
  18. package/project/.sdk/src/cmp/lua/Main_lua.ts +93 -3
  19. package/project/.sdk/src/cmp/lua/Package_lua.ts +60 -0
  20. package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +10 -0
  21. package/project/.sdk/src/cmp/ocaml/Config_ocaml.ts +183 -5
  22. package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +160 -3
  23. package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +25 -1
  24. package/project/.sdk/src/cmp/zig/Config_zig.ts +130 -9
  25. package/project/.sdk/src/cmp/zig/Main_zig.ts +208 -4
  26. package/project/.sdk/{tm/zig/build.zig → src/cmp/zig/fragment/Build.fragment.zig} +7 -0
  27. package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +25 -0
  28. package/project/.sdk/{tm/zig/root.zig → src/cmp/zig/fragment/Root.fragment.zig} +9 -0
  29. package/project/.sdk/tm/c/Makefile +58 -9
  30. package/project/.sdk/tm/c/core/sdk.h +10 -0
  31. package/project/.sdk/tm/c/feature/secrets/plugin/capability.c +133 -0
  32. package/project/.sdk/tm/c/feature/secrets/plugin/capability.h +39 -0
  33. package/project/.sdk/tm/c/feature/secrets/plugin/catalog.c +83 -0
  34. package/project/.sdk/tm/c/feature/secrets/plugin/catalog.h +48 -0
  35. package/project/.sdk/tm/c/feature/secrets/plugin/config.c +413 -0
  36. package/project/.sdk/tm/c/feature/secrets/plugin/config.h +24 -0
  37. package/project/.sdk/tm/c/feature/secrets/plugin/depend.c +264 -0
  38. package/project/.sdk/tm/c/feature/secrets/plugin/depend.h +29 -0
  39. package/project/.sdk/tm/c/feature/secrets/plugin/env.c +220 -0
  40. package/project/.sdk/tm/c/feature/secrets/plugin/env.h +19 -0
  41. package/project/.sdk/tm/c/feature/secrets/plugin/export.c +97 -0
  42. package/project/.sdk/tm/c/feature/secrets/plugin/export.h +19 -0
  43. package/project/.sdk/tm/c/feature/secrets/plugin/graph.c +237 -0
  44. package/project/.sdk/tm/c/feature/secrets/plugin/graph.h +17 -0
  45. package/project/.sdk/tm/c/feature/secrets/plugin/host.c +1494 -0
  46. package/project/.sdk/tm/c/feature/secrets/plugin/host.h +135 -0
  47. package/project/.sdk/tm/c/feature/secrets/plugin/order.c +288 -0
  48. package/project/.sdk/tm/c/feature/secrets/plugin/order.h +18 -0
  49. package/project/.sdk/tm/c/feature/secrets/plugin/point.c +141 -0
  50. package/project/.sdk/tm/c/feature/secrets/plugin/point.h +80 -0
  51. package/project/.sdk/tm/c/feature/secrets/plugin/ref.c +170 -0
  52. package/project/.sdk/tm/c/feature/secrets/plugin/ref.h +52 -0
  53. package/project/.sdk/tm/c/feature/secrets/plugin/resolve.c +98 -0
  54. package/project/.sdk/tm/c/feature/secrets/plugin/resolve.h +18 -0
  55. package/project/.sdk/tm/c/feature/secrets/plugin/types.c +150 -0
  56. package/project/.sdk/tm/c/feature/secrets/plugin/types.h +104 -0
  57. package/project/.sdk/tm/c/feature/secrets/plugin/value.c +649 -0
  58. package/project/.sdk/tm/c/feature/secrets/plugin/value.h +135 -0
  59. package/project/.sdk/tm/c/feature/secrets/plugin/version.c +151 -0
  60. package/project/.sdk/tm/c/feature/secrets/plugin/version.h +34 -0
  61. package/project/.sdk/tm/c/feature/secrets/plugins/aws.c +281 -0
  62. package/project/.sdk/tm/c/feature/secrets/plugins/azuresecrets.c +207 -0
  63. package/project/.sdk/tm/c/feature/secrets/plugins/boru.c +164 -0
  64. package/project/.sdk/tm/c/feature/secrets/plugins/clock.c +75 -0
  65. package/project/.sdk/tm/c/feature/secrets/plugins/doppler.c +141 -0
  66. package/project/.sdk/tm/c/feature/secrets/plugins/encode.c +144 -0
  67. package/project/.sdk/tm/c/feature/secrets/plugins/gcpsecrets.c +177 -0
  68. package/project/.sdk/tm/c/feature/secrets/plugins/hashicorp.c +239 -0
  69. package/project/.sdk/tm/c/feature/secrets/plugins/httpjson.c +599 -0
  70. package/project/.sdk/tm/c/feature/secrets/plugins/infisical.c +165 -0
  71. package/project/.sdk/tm/c/feature/secrets/plugins/onepassword.c +194 -0
  72. package/project/.sdk/tm/c/feature/secrets/plugins/proc.c +233 -0
  73. package/project/.sdk/tm/c/feature/secrets/plugins/secretspec.c +125 -0
  74. package/project/.sdk/tm/c/feature/secrets/plugins/sekretoplugins.h +125 -0
  75. package/project/.sdk/tm/c/feature/secrets/plugins/sha256.c +270 -0
  76. package/project/.sdk/tm/c/feature/secrets/plugins/sigv4.c +382 -0
  77. package/project/.sdk/tm/c/feature/secrets/plugins/support.h +153 -0
  78. package/project/.sdk/tm/c/feature/secrets/plugins/tls.c +420 -0
  79. package/project/.sdk/tm/c/feature/secrets/sekreto/internal.h +86 -0
  80. package/project/.sdk/tm/c/feature/secrets/sekreto/json.c +721 -0
  81. package/project/.sdk/tm/c/feature/secrets/sekreto/providers.c +813 -0
  82. package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.c +944 -0
  83. package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.h +490 -0
  84. package/project/.sdk/tm/c/feature/secrets/sekreto/util.c +442 -0
  85. package/project/.sdk/tm/c/feature/secrets.c +797 -0
  86. package/project/.sdk/tm/c/feature/secrets.h +46 -0
  87. package/project/.sdk/tm/c/src/feature/secrets/.gitkeep +0 -0
  88. package/project/.sdk/tm/c/tests/feature/secrets/secrets_test.c +802 -0
  89. package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +38 -11
  90. package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +40 -6
  91. package/project/.sdk/tm/cpp/Makefile +48 -4
  92. package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.cpp +121 -0
  93. package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.hpp +41 -0
  94. package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.cpp +60 -0
  95. package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.hpp +66 -0
  96. package/project/.sdk/tm/cpp/feature/secrets/plugin/config.cpp +376 -0
  97. package/project/.sdk/tm/cpp/feature/secrets/plugin/config.hpp +29 -0
  98. package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.cpp +230 -0
  99. package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.hpp +31 -0
  100. package/project/.sdk/tm/cpp/feature/secrets/plugin/env.cpp +205 -0
  101. package/project/.sdk/tm/cpp/feature/secrets/plugin/env.hpp +25 -0
  102. package/project/.sdk/tm/cpp/feature/secrets/plugin/export.cpp +84 -0
  103. package/project/.sdk/tm/cpp/feature/secrets/plugin/export.hpp +24 -0
  104. package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.cpp +222 -0
  105. package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.hpp +21 -0
  106. package/project/.sdk/tm/cpp/feature/secrets/plugin/host.cpp +1200 -0
  107. package/project/.sdk/tm/cpp/feature/secrets/plugin/host.hpp +250 -0
  108. package/project/.sdk/tm/cpp/feature/secrets/plugin/order.cpp +250 -0
  109. package/project/.sdk/tm/cpp/feature/secrets/plugin/order.hpp +22 -0
  110. package/project/.sdk/tm/cpp/feature/secrets/plugin/point.cpp +110 -0
  111. package/project/.sdk/tm/cpp/feature/secrets/plugin/point.hpp +79 -0
  112. package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.cpp +136 -0
  113. package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.hpp +60 -0
  114. package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.cpp +82 -0
  115. package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.hpp +25 -0
  116. package/project/.sdk/tm/cpp/feature/secrets/plugin/types.cpp +90 -0
  117. package/project/.sdk/tm/cpp/feature/secrets/plugin/types.hpp +65 -0
  118. package/project/.sdk/tm/cpp/feature/secrets/plugin/value.cpp +491 -0
  119. package/project/.sdk/tm/cpp/feature/secrets/plugin/value.hpp +120 -0
  120. package/project/.sdk/tm/cpp/feature/secrets/plugin/version.cpp +143 -0
  121. package/project/.sdk/tm/cpp/feature/secrets/plugin/version.hpp +36 -0
  122. package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.cpp +248 -0
  123. package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.hpp +30 -0
  124. package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.cpp +149 -0
  125. package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.hpp +23 -0
  126. package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.cpp +117 -0
  127. package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.hpp +27 -0
  128. package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.cpp +180 -0
  129. package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.hpp +52 -0
  130. package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.cpp +87 -0
  131. package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.hpp +23 -0
  132. package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.cpp +121 -0
  133. package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.hpp +23 -0
  134. package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.cpp +153 -0
  135. package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.hpp +23 -0
  136. package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.cpp +666 -0
  137. package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.hpp +160 -0
  138. package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.cpp +123 -0
  139. package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.hpp +23 -0
  140. package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.cpp +125 -0
  141. package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.hpp +23 -0
  142. package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.cpp +223 -0
  143. package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.hpp +47 -0
  144. package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.cpp +104 -0
  145. package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.hpp +27 -0
  146. package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.cpp +242 -0
  147. package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.hpp +58 -0
  148. package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.cpp +260 -0
  149. package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.hpp +47 -0
  150. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.cpp +476 -0
  151. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.hpp +89 -0
  152. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.cpp +312 -0
  153. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.hpp +263 -0
  154. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.cpp +354 -0
  155. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.hpp +111 -0
  156. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.cpp +613 -0
  157. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.hpp +227 -0
  158. package/project/.sdk/tm/cpp/feature/secrets.hpp +745 -0
  159. package/project/.sdk/tm/cpp/src/feature/secrets/.gitkeep +0 -0
  160. package/project/.sdk/tm/cpp/test/feature/secrets/secrets_test.cpp +808 -0
  161. package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +34 -8
  162. package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +85 -0
  163. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +17 -2
  164. package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +41 -0
  165. package/project/.sdk/tm/go/feature/secrets_feature.go +32 -10
  166. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +116 -0
  167. package/project/.sdk/tm/java/feature/SecretsFeature.java +33 -8
  168. package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +64 -0
  169. package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +34 -11
  170. package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +73 -0
  171. package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +32 -7
  172. package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +69 -0
  173. package/project/.sdk/tm/lua/Makefile +15 -4
  174. package/project/.sdk/tm/lua/feature/secrets/native/sekretonet.c +806 -0
  175. package/project/.sdk/tm/lua/feature/secrets/plugin/capability.lua +135 -0
  176. package/project/.sdk/tm/lua/feature/secrets/plugin/catalog.lua +63 -0
  177. package/project/.sdk/tm/lua/feature/secrets/plugin/config.lua +361 -0
  178. package/project/.sdk/tm/lua/feature/secrets/plugin/depend.lua +232 -0
  179. package/project/.sdk/tm/lua/feature/secrets/plugin/env.lua +168 -0
  180. package/project/.sdk/tm/lua/feature/secrets/plugin/export.lua +66 -0
  181. package/project/.sdk/tm/lua/feature/secrets/plugin/graph.lua +194 -0
  182. package/project/.sdk/tm/lua/feature/secrets/plugin/host.lua +1190 -0
  183. package/project/.sdk/tm/lua/feature/secrets/plugin/json.lua +169 -0
  184. package/project/.sdk/tm/lua/feature/secrets/plugin/order.lua +207 -0
  185. package/project/.sdk/tm/lua/feature/secrets/plugin/point.lua +106 -0
  186. package/project/.sdk/tm/lua/feature/secrets/plugin/ref.lua +115 -0
  187. package/project/.sdk/tm/lua/feature/secrets/plugin/resolve.lua +78 -0
  188. package/project/.sdk/tm/lua/feature/secrets/plugin/types.lua +275 -0
  189. package/project/.sdk/tm/lua/feature/secrets/plugin/version.lua +131 -0
  190. package/project/.sdk/tm/lua/feature/secrets/plugin.lua +76 -0
  191. package/project/.sdk/tm/lua/feature/secrets/sekreto/addr.lua +124 -0
  192. package/project/.sdk/tm/lua/feature/secrets/sekreto/err.lua +47 -0
  193. package/project/.sdk/tm/lua/feature/secrets/sekreto/name.lua +315 -0
  194. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/aws.lua +228 -0
  195. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/azuresecrets.lua +137 -0
  196. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/boru.lua +124 -0
  197. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/crypto.lua +212 -0
  198. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/doppler.lua +89 -0
  199. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/gcpsecrets.lua +129 -0
  200. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/hashicorp.lua +154 -0
  201. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/httpjson.lua +248 -0
  202. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/infisical.lua +113 -0
  203. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/json.lua +449 -0
  204. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/net.lua +198 -0
  205. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/onepassword.lua +126 -0
  206. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/secretspec.lua +93 -0
  207. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/sigv4.lua +269 -0
  208. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/support.lua +146 -0
  209. package/project/.sdk/tm/lua/feature/secrets/sekreto/providers.lua +346 -0
  210. package/project/.sdk/tm/lua/feature/secrets/sekreto.lua +479 -0
  211. package/project/.sdk/tm/lua/feature/secrets_feature.lua +690 -0
  212. package/project/.sdk/tm/lua/src/feature/secrets/.gitkeep +0 -0
  213. package/project/.sdk/tm/lua/test/extend_test.lua +105 -0
  214. package/project/.sdk/tm/lua/test/feature/secrets/secrets_feature_test.lua +862 -0
  215. package/project/.sdk/tm/ocaml/Makefile +52 -8
  216. package/project/.sdk/tm/ocaml/feature/secrets/plugin/capability.ml +106 -0
  217. package/project/.sdk/tm/ocaml/feature/secrets/plugin/catalog.ml +43 -0
  218. package/project/.sdk/tm/ocaml/feature/secrets/plugin/config.ml +349 -0
  219. package/project/.sdk/tm/ocaml/feature/secrets/plugin/defs.ml +143 -0
  220. package/project/.sdk/tm/ocaml/feature/secrets/plugin/depend.ml +217 -0
  221. package/project/.sdk/tm/ocaml/feature/secrets/plugin/env.ml +197 -0
  222. package/project/.sdk/tm/ocaml/feature/secrets/plugin/export.ml +89 -0
  223. package/project/.sdk/tm/ocaml/feature/secrets/plugin/graph.ml +227 -0
  224. package/project/.sdk/tm/ocaml/feature/secrets/plugin/host.ml +1112 -0
  225. package/project/.sdk/tm/ocaml/feature/secrets/plugin/order.ml +202 -0
  226. package/project/.sdk/tm/ocaml/feature/secrets/plugin/point.ml +138 -0
  227. package/project/.sdk/tm/ocaml/feature/secrets/plugin/ref.ml +126 -0
  228. package/project/.sdk/tm/ocaml/feature/secrets/plugin/resolve.ml +62 -0
  229. package/project/.sdk/tm/ocaml/feature/secrets/plugin/types.ml +97 -0
  230. package/project/.sdk/tm/ocaml/feature/secrets/plugin/value.ml +387 -0
  231. package/project/.sdk/tm/ocaml/feature/secrets/plugin/version.ml +139 -0
  232. package/project/.sdk/tm/ocaml/feature/secrets/plugins/aws.ml +171 -0
  233. package/project/.sdk/tm/ocaml/feature/secrets/plugins/azuresecrets.ml +116 -0
  234. package/project/.sdk/tm/ocaml/feature/secrets/plugins/boru.ml +95 -0
  235. package/project/.sdk/tm/ocaml/feature/secrets/plugins/crypto.ml +149 -0
  236. package/project/.sdk/tm/ocaml/feature/secrets/plugins/doppler.ml +61 -0
  237. package/project/.sdk/tm/ocaml/feature/secrets/plugins/gcpsecrets.ml +93 -0
  238. package/project/.sdk/tm/ocaml/feature/secrets/plugins/hashicorp.ml +120 -0
  239. package/project/.sdk/tm/ocaml/feature/secrets/plugins/http.ml +421 -0
  240. package/project/.sdk/tm/ocaml/feature/secrets/plugins/httpjson.ml +66 -0
  241. package/project/.sdk/tm/ocaml/feature/secrets/plugins/infisical.ml +85 -0
  242. package/project/.sdk/tm/ocaml/feature/secrets/plugins/onepassword.ml +112 -0
  243. package/project/.sdk/tm/ocaml/feature/secrets/plugins/runcmd.ml +97 -0
  244. package/project/.sdk/tm/ocaml/feature/secrets/plugins/secretspec.ml +68 -0
  245. package/project/.sdk/tm/ocaml/feature/secrets/plugins/sigv4.ml +259 -0
  246. package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls.ml +44 -0
  247. package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls_stubs.c +358 -0
  248. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/json.ml +376 -0
  249. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/provider.ml +647 -0
  250. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/secret.ml +299 -0
  251. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/sekreto.ml +347 -0
  252. package/project/.sdk/tm/ocaml/feature/secrets_feature.ml +453 -0
  253. package/project/.sdk/tm/ocaml/src/feature/secrets/.gitkeep +0 -0
  254. package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +670 -0
  255. package/project/.sdk/tm/perl/feature/secrets_feature.pm +33 -12
  256. package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +47 -0
  257. package/project/.sdk/tm/php/feature/SecretsFeature.php +30 -6
  258. package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +98 -0
  259. package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +28 -6
  260. package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +114 -0
  261. package/project/.sdk/tm/rb/feature/secrets_feature.rb +28 -6
  262. package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +93 -0
  263. package/project/.sdk/tm/rust/feature/secrets.rs +33 -10
  264. package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +96 -0
  265. package/project/.sdk/tm/scala/feature/SecretsFeature.scala +29 -7
  266. package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +71 -0
  267. package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +35 -12
  268. package/project/.sdk/tm/ts/test/feature/secrets/Secrets.test.ts +73 -0
  269. package/project/.sdk/tm/zig/feature/secrets/plugin/capability.zig +137 -0
  270. package/project/.sdk/tm/zig/feature/secrets/plugin/catalog.zig +90 -0
  271. package/project/.sdk/tm/zig/feature/secrets/plugin/config.zig +346 -0
  272. package/project/.sdk/tm/zig/feature/secrets/plugin/depend.zig +244 -0
  273. package/project/.sdk/tm/zig/feature/secrets/plugin/env.zig +201 -0
  274. package/project/.sdk/tm/zig/feature/secrets/plugin/export.zig +83 -0
  275. package/project/.sdk/tm/zig/feature/secrets/plugin/graph.zig +212 -0
  276. package/project/.sdk/tm/zig/feature/secrets/plugin/host.zig +1224 -0
  277. package/project/.sdk/tm/zig/feature/secrets/plugin/inst.zig +126 -0
  278. package/project/.sdk/tm/zig/feature/secrets/plugin/order.zig +228 -0
  279. package/project/.sdk/tm/zig/feature/secrets/plugin/plugin.zig +34 -0
  280. package/project/.sdk/tm/zig/feature/secrets/plugin/point.zig +166 -0
  281. package/project/.sdk/tm/zig/feature/secrets/plugin/ref.zig +147 -0
  282. package/project/.sdk/tm/zig/feature/secrets/plugin/resolve.zig +74 -0
  283. package/project/.sdk/tm/zig/feature/secrets/plugin/types.zig +140 -0
  284. package/project/.sdk/tm/zig/feature/secrets/plugin/value.zig +662 -0
  285. package/project/.sdk/tm/zig/feature/secrets/plugin/version.zig +139 -0
  286. package/project/.sdk/tm/zig/feature/secrets/plugins/aws.zig +294 -0
  287. package/project/.sdk/tm/zig/feature/secrets/plugins/azuresecrets.zig +222 -0
  288. package/project/.sdk/tm/zig/feature/secrets/plugins/boru.zig +188 -0
  289. package/project/.sdk/tm/zig/feature/secrets/plugins/doppler.zig +135 -0
  290. package/project/.sdk/tm/zig/feature/secrets/plugins/gcpsecrets.zig +170 -0
  291. package/project/.sdk/tm/zig/feature/secrets/plugins/hashicorp.zig +242 -0
  292. package/project/.sdk/tm/zig/feature/secrets/plugins/httpjson.zig +535 -0
  293. package/project/.sdk/tm/zig/feature/secrets/plugins/infisical.zig +167 -0
  294. package/project/.sdk/tm/zig/feature/secrets/plugins/onepassword.zig +202 -0
  295. package/project/.sdk/tm/zig/feature/secrets/plugins/secretspec.zig +160 -0
  296. package/project/.sdk/tm/zig/feature/secrets/plugins/sigv4.zig +336 -0
  297. package/project/.sdk/tm/zig/feature/secrets/sekreto/addr.zig +148 -0
  298. package/project/.sdk/tm/zig/feature/secrets/sekreto/builtins.zig +259 -0
  299. package/project/.sdk/tm/zig/feature/secrets/sekreto/provider.zig +440 -0
  300. package/project/.sdk/tm/zig/feature/secrets/sekreto/sekreto.zig +944 -0
  301. package/project/.sdk/tm/zig/feature/secrets.zig +854 -0
  302. package/project/.sdk/tm/zig/src/feature/secrets/.gitkeep +0 -0
  303. package/project/.sdk/tm/zig/test/feature/secrets/secrets_test.zig +891 -0
  304. package/project/sdkgen-package.json +1 -1
@@ -0,0 +1,207 @@
1
+ // VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (c/plugins/azuresecrets.c)
2
+ // Source: https://github.com/voxgig/sekreto @ 1267ee2e5f49566bc92695bc9eb3a60ef4924998 [tag: sdk-20260908-1556-0]
3
+ // License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ /* Azure Key Vault, with client-credential or IMDS login.
5
+ *
6
+ * A plugin because it opens a socket. The percent-encoder its login form
7
+ * needs is in `encode.c` with the transport, so this kind links no
8
+ * SHA-256 either.
9
+ *
10
+ * A port of typescript/plugins/azuresecrets.ts, which is canonical.
11
+ */
12
+
13
+ #define _POSIX_C_SOURCE 200809L
14
+
15
+ #include <stdlib.h>
16
+ #include <string.h>
17
+
18
+ #include "support.h"
19
+
20
+ #define AZURE_RESOURCE "https://vault.azure.net"
21
+
22
+ typedef struct {
23
+ sek_pool *pool;
24
+ const char *vault;
25
+ const char *token;
26
+ const char *tenant;
27
+ const char *clientid;
28
+ const char *clientsecret;
29
+ const char *loginaddr;
30
+ const char *imdsaddr;
31
+ const char *apiversion;
32
+ char *livetoken;
33
+ long long renewat;
34
+ char *described;
35
+ } azuredata;
36
+
37
+ static sek_err azure_login(azuredata *data, char **out) {
38
+ sek_pool *pool = data->pool;
39
+ sek_map *headers;
40
+ sek_answer res;
41
+ sek_err err;
42
+ const char *got;
43
+ char *url;
44
+
45
+ if (!sek_empty(data->token)) {
46
+ *out = sek_strdup(pool, data->token);
47
+ return NULL;
48
+ }
49
+
50
+ if (!sek_empty(data->tenant) && !sek_empty(data->clientid) && !sek_empty(data->clientsecret)) {
51
+ const char *base = sek_first(data->loginaddr, "https://login.microsoftonline.com");
52
+ char *form;
53
+
54
+ err = sek_checkaddr(pool, base);
55
+ if (NULL != err) {
56
+ return err;
57
+ }
58
+
59
+ url = sek_fmt(pool, "%s/%s/oauth2/v2.0/token", sek_trimslash(pool, base), data->tenant);
60
+ form = sek_fmt(pool, "grant_type=client_credentials&client_id=%s&client_secret=%s&scope=%s",
61
+ sek_uriescape(pool, data->clientid), sek_uriescape(pool, data->clientsecret),
62
+ sek_uriescape(pool, AZURE_RESOURCE "/.default"));
63
+
64
+ headers = sek_map_new(pool);
65
+ sek_map_set(headers, "content-type", "application/x-www-form-urlencoded");
66
+
67
+ err = sek_fetchjson(pool, "POST", url, headers, form, &res);
68
+ if (NULL != err) {
69
+ return err;
70
+ }
71
+
72
+ got = sek_json_text(pool, sek_json_dig(res.body, "access_token", NULL));
73
+ if (200 != res.status || sek_empty(got)) {
74
+ return sek_fmt(pool, "sekreto: azure login failed: %d", res.status);
75
+ }
76
+
77
+ data->renewat = sek_renewtime(sek_json_dig(res.body, "expires_in", NULL));
78
+ *out = sek_strdup(pool, got);
79
+ return NULL;
80
+ }
81
+
82
+ /* IMDS: link-local by platform design, and it returns expires_in as a
83
+ * STRING, which renewtime accepts. */
84
+ url = sek_fmt(pool, "%s/metadata/identity/oauth2/token?api-version=2018-02-01&resource=%s",
85
+ sek_trimslash(pool, sek_first(data->imdsaddr, "http://169.254.169.254")),
86
+ sek_uriescape(pool, AZURE_RESOURCE));
87
+
88
+ headers = sek_map_new(pool);
89
+ sek_map_set(headers, "Metadata", "true");
90
+
91
+ err = sek_fetchjson(pool, "GET", url, headers, NULL, &res);
92
+ if (NULL != err) {
93
+ return err;
94
+ }
95
+
96
+ got = sek_json_text(pool, sek_json_dig(res.body, "access_token", NULL));
97
+ if (200 != res.status || sek_empty(got)) {
98
+ return sek_strdup(pool,
99
+ "sekreto: azure: no token, no client credentials, and IMDS did not answer");
100
+ }
101
+
102
+ data->renewat = sek_renewtime(sek_json_dig(res.body, "expires_in", NULL));
103
+ *out = sek_strdup(pool, got);
104
+
105
+ return NULL;
106
+ }
107
+
108
+ static sek_err azure_lookup(sek_provider *self, const char *name, char **out) {
109
+ azuredata *data = (azuredata *)self->data;
110
+ sek_pool *pool = data->pool;
111
+ char *vaulturl;
112
+ char *flat = NULL;
113
+ char *url;
114
+ sek_map *headers;
115
+ sek_answer res;
116
+ sek_err err;
117
+ const char *text;
118
+
119
+ *out = NULL;
120
+
121
+ if (sek_empty(data->vault)) {
122
+ return sek_strdup(pool, "sekreto: azure: no vault");
123
+ }
124
+
125
+ /* ONLY an explicit scheme is a URL: a vault NAMED `httpvault` must
126
+ * still become https://httpvault.vault.azure.net. */
127
+ if (sek_has_prefix(data->vault, "http://") || sek_has_prefix(data->vault, "https://")) {
128
+ vaulturl = sek_strdup(pool, data->vault);
129
+ } else {
130
+ vaulturl = sek_fmt(pool, "https://%s.vault.azure.net", data->vault);
131
+ }
132
+
133
+ err = sek_checkaddr(pool, vaulturl);
134
+ if (NULL != err) {
135
+ return err;
136
+ }
137
+
138
+ if (NULL == data->livetoken || sek_nowms() >= data->renewat) {
139
+ err = azure_login(data, &data->livetoken);
140
+ if (NULL != err) {
141
+ return err;
142
+ }
143
+ }
144
+
145
+ /* Dots flatten to `-`: Key Vault names allow letters, digits and
146
+ * hyphens and nothing else. */
147
+ err = sek_flatname(pool, name, "-", &flat);
148
+ if (NULL != err) {
149
+ return err;
150
+ }
151
+
152
+ url = sek_fmt(pool, "%s/secrets/%s?api-version=%s", sek_trimslash(pool, vaulturl), flat,
153
+ sek_first(data->apiversion, "7.4"));
154
+
155
+ headers = sek_map_new(pool);
156
+ sek_map_set(headers, "authorization", sek_fmt(pool, "Bearer %s", sek_orempty(data->livetoken)));
157
+
158
+ err = sek_fetchjson(pool, "GET", url, headers, NULL, &res);
159
+ if (NULL != err) {
160
+ return err;
161
+ }
162
+
163
+ if (404 == res.status) {
164
+ return NULL;
165
+ }
166
+
167
+ if (200 != res.status) {
168
+ return sek_fmt(pool, "sekreto: azure error: %d: %s", res.status, sek_bareurl(pool, url));
169
+ }
170
+
171
+ text = sek_json_text(pool, sek_json_dig(res.body, "value", NULL));
172
+ if (NULL != text) {
173
+ *out = sek_strdup(pool, text);
174
+ }
175
+
176
+ return NULL;
177
+ }
178
+
179
+ static const char *azure_describe(sek_provider *self) {
180
+ return ((azuredata *)self->data)->described;
181
+ }
182
+
183
+ /* ---- the definition ------------------------------------------------ */
184
+
185
+ static sek_err azuresecrets_make(sek_pool *pool, const sek_spec *spec, sek_provider **out) {
186
+ azuredata *data = (azuredata *)sek_alloc(pool, sizeof(azuredata));
187
+ data->pool = pool;
188
+ data->vault = sek_own(pool, spec->vault);
189
+ data->token = sek_own(pool, spec->token);
190
+ data->tenant = sek_own(pool, spec->tenant);
191
+ data->clientid = sek_own(pool, spec->clientid);
192
+ data->clientsecret = sek_own(pool, spec->clientsecret);
193
+ data->loginaddr = sek_own(pool, spec->loginaddr);
194
+ data->imdsaddr = sek_own(pool, spec->imdsaddr);
195
+ data->apiversion = sek_own(pool, spec->apiversion);
196
+ data->livetoken = NULL;
197
+ data->renewat = SEK_NEVER;
198
+ data->described = sek_fmt(pool, "azuresecrets:%s", sek_orempty(spec->vault));
199
+ *out = sek_provider_new(pool, azure_lookup, azure_describe, data);
200
+ return NULL;
201
+ }
202
+
203
+ static sek_providerkind AZURESECRETS_KIND;
204
+
205
+ Definition *sek_plugin_azuresecrets(void) {
206
+ return sek_providerplugin(&AZURESECRETS_KIND, "azuresecrets", azuresecrets_make);
207
+ }
@@ -0,0 +1,164 @@
1
+ // VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (c/plugins/boru.c)
2
+ // Source: https://github.com/voxgig/sekreto @ 1267ee2e5f49566bc92695bc9eb3a60ef4924998 [tag: sdk-20260908-1556-0]
3
+ // License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ /* A boru vault, through its CLI or over its wire protocol.
5
+ *
6
+ * A plugin twice over: it spawns a child when it runs `boru`, and opens a
7
+ * socket when an address and a capability token configure the wire form.
8
+ *
9
+ * A port of typescript/plugins/boru.ts, which is canonical.
10
+ */
11
+
12
+ #define _POSIX_C_SOURCE 200809L
13
+
14
+ #include <stdlib.h>
15
+ #include <string.h>
16
+
17
+ #include "support.h"
18
+
19
+ typedef struct {
20
+ sek_pool *pool;
21
+ const char *command;
22
+ const char *namespace_;
23
+ const char *home;
24
+ char *addr;
25
+ const char *token;
26
+ const char *mount;
27
+ char *described;
28
+ } borudata;
29
+
30
+ /* Does this boru failure mean "no such secret" rather than "I could not
31
+ * answer"? Matched on boru's own wording for a missing alias. A locked
32
+ * vault or a wrong passphrase is NOT a miss. */
33
+ static int borumiss(const char *why) { return sek_contains(why, "no alias named"); }
34
+
35
+ static sek_err boru_wire(borudata *data, const char *name, char **out) {
36
+ sek_pool *pool = data->pool;
37
+ sek_map *headers;
38
+ sek_answer res;
39
+ sek_err err = sek_checkaddr(pool, data->addr);
40
+ char *url;
41
+ const char *text;
42
+
43
+ if (NULL != err) {
44
+ return err;
45
+ }
46
+
47
+ /* The dotted name stays ONE path segment: a boru alias keeps its dots,
48
+ * unlike the api/token split a HashiCorp KV gets. */
49
+ if (sek_empty(data->namespace_)) {
50
+ url = sek_fmt(pool, "%s/v1/%s/data/%s", data->addr, data->mount, name);
51
+ } else {
52
+ url = sek_fmt(pool, "%s/v1/%s/data/%s/%s", data->addr, data->mount, data->namespace_, name);
53
+ }
54
+
55
+ headers = sek_map_new(pool);
56
+ sek_map_set(headers, "X-Vault-Token", sek_orempty(data->token));
57
+
58
+ err = sek_fetchjson(pool, "GET", url, headers, NULL, &res);
59
+ if (NULL != err) {
60
+ return err;
61
+ }
62
+
63
+ if (404 == res.status) {
64
+ return NULL;
65
+ }
66
+
67
+ if (200 != res.status) {
68
+ return sek_fmt(pool, "sekreto: boru serve error: %d: %s", res.status, url);
69
+ }
70
+
71
+ text = sek_json_text(pool, sek_json_dig(res.body, "data", "data", "value", NULL));
72
+ if (NULL != text) {
73
+ *out = sek_strdup(pool, text);
74
+ }
75
+
76
+ return NULL;
77
+ }
78
+
79
+ static sek_err boru_lookup(sek_provider *self, const char *name, char **out) {
80
+ borudata *data = (borudata *)self->data;
81
+ sek_pool *pool = data->pool;
82
+ sek_err err = sek_checkname(pool, name);
83
+ char *alias;
84
+ char *argv[6];
85
+ sek_ran ran;
86
+ size_t len;
87
+
88
+ *out = NULL;
89
+
90
+ if (NULL != err) {
91
+ return err;
92
+ }
93
+
94
+ if (!sek_empty(data->addr)) {
95
+ return boru_wire(data, name, out);
96
+ }
97
+
98
+ /* CLI mode: a COLON joins the namespace, not a slash. */
99
+ alias = sek_empty(data->namespace_) ? sek_strdup(pool, name)
100
+ : sek_fmt(pool, "%s:%s", data->namespace_, name);
101
+
102
+ argv[0] = (char *)data->command;
103
+ argv[1] = (char *)"vault";
104
+ argv[2] = (char *)"get";
105
+ argv[3] = (char *)"--reveal";
106
+ argv[4] = alias;
107
+ argv[5] = NULL;
108
+
109
+ /* The passphrase is never config and never on a command line, where the
110
+ * process table publishes it: boru reads BORU_VAULT_PASSPHRASE itself. */
111
+ err = sek_runcmd(pool, argv, data->command, sek_empty(data->home) ? NULL : "BORU_HOME",
112
+ data->home, &ran);
113
+ if (NULL != err) {
114
+ return err;
115
+ }
116
+
117
+ if (0 == ran.status) {
118
+ /* boru prints the value and one newline, and nothing else. */
119
+ len = strlen(ran.out);
120
+ *out = 1 <= len && '\n' == ran.out[len - 1] ? sek_strndup(pool, ran.out, len - 1) : ran.out;
121
+ return NULL;
122
+ }
123
+
124
+ if (borumiss(ran.why)) {
125
+ return NULL;
126
+ }
127
+
128
+ return sek_fmt(pool, "sekreto: boru vault error: %s",
129
+ sek_empty(ran.why) ? sek_fmt(pool, "exit %d", ran.status) : ran.why);
130
+ }
131
+
132
+ static const char *boru_describe(sek_provider *self) {
133
+ return ((borudata *)self->data)->described;
134
+ }
135
+
136
+ /* ---- the definition ------------------------------------------------ */
137
+
138
+ static sek_err boru_make(sek_pool *pool, const sek_spec *spec, sek_provider **out) {
139
+ borudata *data = (borudata *)sek_alloc(pool, sizeof(borudata));
140
+ data->pool = pool;
141
+ data->command = sek_own(pool, sek_empty(spec->command) ? "boru" : spec->command);
142
+ data->namespace_ = sek_own(pool, spec->namespace_);
143
+ data->home = sek_own(pool, spec->home);
144
+ data->addr = NULL == spec->addr ? sek_strdup(pool, "") : sek_trimslash(pool, spec->addr);
145
+ data->token = sek_own(pool, sek_orempty(spec->token));
146
+ data->mount = sek_own(pool, sek_empty(spec->mount) ? "secret" : spec->mount);
147
+
148
+ if (!sek_empty(data->addr)) {
149
+ data->described = sek_fmt(pool, "boru:%s", data->addr);
150
+ } else {
151
+ data->described = sek_empty(data->namespace_)
152
+ ? sek_strdup(pool, "boru")
153
+ : sek_fmt(pool, "boru:%s", data->namespace_);
154
+ }
155
+
156
+ *out = sek_provider_new(pool, boru_lookup, boru_describe, data);
157
+ return NULL;
158
+ }
159
+
160
+ static sek_providerkind BORU_KIND;
161
+
162
+ Definition *sek_plugin_boru(void) {
163
+ return sek_providerplugin(&BORU_KIND, "boru", boru_make);
164
+ }
@@ -0,0 +1,75 @@
1
+ // VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (c/plugins/clock.c)
2
+ // Source: https://github.com/voxgig/sekreto @ 1267ee2e5f49566bc92695bc9eb3a60ef4924998 [tag: sdk-20260908-1556-0]
3
+ // License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ /* The clock the vault clients share: when a leased token must be renewed,
5
+ * and the timestamp SigV4 signs.
6
+ *
7
+ * Its own translation unit because `sek_nowms` is the transport's
8
+ * deadline clock as well, and the transport must not drag a child-process
9
+ * launcher into a link that has no CLI store in it.
10
+ */
11
+
12
+ #define _POSIX_C_SOURCE 200809L
13
+
14
+ #include <stdlib.h>
15
+ #include <string.h>
16
+ #include <time.h>
17
+
18
+ #include "support.h"
19
+
20
+ /* MONOTONIC, not wall time: every deadline in this library is a duration
21
+ * from now, and a clock the operator can step backwards would turn a
22
+ * ten-second timeout into a hang. */
23
+ long long sek_nowms(void) {
24
+ struct timespec now;
25
+
26
+ clock_gettime(CLOCK_MONOTONIC, &now);
27
+
28
+ return (long long)now.tv_sec * 1000ll + now.tv_nsec / 1000000ll;
29
+ }
30
+
31
+ /* now + max(seconds - 60, 1), so a token is renewed shortly before its
32
+ * lease runs out rather than after a vault has already expired it. A
33
+ * missing or zero expiry means never renew, which is what a configured
34
+ * token gets. */
35
+ long long sek_renewtime(const sek_json *expires) {
36
+ double seconds = 0;
37
+
38
+ if (NULL == expires) {
39
+ return SEK_NEVER;
40
+ }
41
+
42
+ if (SEK_JSON_NUM == expires->type) {
43
+ seconds = expires->numval;
44
+ } else if (SEK_JSON_STR == expires->type) {
45
+ /* Azure IMDS sends expires_in as a STRING. */
46
+ char *stop = NULL;
47
+ seconds = strtod(expires->strval, &stop);
48
+ if (NULL == stop || stop == expires->strval) {
49
+ seconds = 0;
50
+ }
51
+ }
52
+
53
+ if (!(0 < seconds)) {
54
+ return SEK_NEVER;
55
+ }
56
+
57
+ if (60 < seconds) {
58
+ seconds -= 60;
59
+ } else {
60
+ seconds = 1;
61
+ }
62
+
63
+ return sek_nowms() + (long long)(seconds * 1000);
64
+ }
65
+
66
+ char *sek_awsnow(sek_pool *pool) {
67
+ time_t now = time(NULL);
68
+ struct tm parts;
69
+ char buf[32];
70
+
71
+ gmtime_r(&now, &parts);
72
+ strftime(buf, sizeof(buf), "%Y%m%dT%H%M%SZ", &parts);
73
+
74
+ return sek_strdup(pool, buf);
75
+ }
@@ -0,0 +1,141 @@
1
+ // VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (c/plugins/doppler.c)
2
+ // Source: https://github.com/voxgig/sekreto @ 1267ee2e5f49566bc92695bc9eb3a60ef4924998 [tag: sdk-20260908-1556-0]
3
+ // License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ /* Doppler.
5
+ *
6
+ * A plugin because it opens a socket.
7
+ *
8
+ * A port of typescript/plugins/doppler.ts, which is canonical.
9
+ */
10
+
11
+ #define _POSIX_C_SOURCE 200809L
12
+
13
+ #include <stdlib.h>
14
+ #include <string.h>
15
+
16
+ #include "support.h"
17
+
18
+ typedef struct {
19
+ sek_pool *pool;
20
+ const char *token;
21
+ const char *project;
22
+ const char *config;
23
+ const char *addr;
24
+ sek_map *values;
25
+ char *described;
26
+ } dopplerdata;
27
+
28
+ /* The whole config is downloaded ONCE - Doppler's own bulk endpoint - and
29
+ * answered from memory, like a remote .env. A failure caches nothing, so
30
+ * a failed load retries on the next lookup. */
31
+ static sek_err doppler_load(dopplerdata *data) {
32
+ sek_pool *pool = data->pool;
33
+ char *addr;
34
+ sek_buf url;
35
+ sek_map *headers;
36
+ sek_answer res;
37
+ sek_err err;
38
+ const sek_json *body;
39
+ sek_map *loaded;
40
+ size_t index;
41
+
42
+ if (NULL != data->values) {
43
+ return NULL;
44
+ }
45
+
46
+ addr = sek_trimslash(pool, sek_first(data->addr, "https://api.doppler.com"));
47
+ err = sek_checkaddr(pool, addr);
48
+ if (NULL != err) {
49
+ return err;
50
+ }
51
+
52
+ sek_buf_init(&url, pool);
53
+ sek_buf_addfmt(&url, "%s/v3/configs/config/secrets/download?format=json", addr);
54
+ if (!sek_empty(data->project)) {
55
+ sek_buf_addfmt(&url, "&project=%s", sek_uriescape(pool, data->project));
56
+ }
57
+ if (!sek_empty(data->config)) {
58
+ sek_buf_addfmt(&url, "&config=%s", sek_uriescape(pool, data->config));
59
+ }
60
+
61
+ headers = sek_map_new(pool);
62
+ sek_map_set(headers, "authorization", sek_fmt(pool, "Bearer %s", sek_orempty(data->token)));
63
+
64
+ err = sek_fetchjson(pool, "GET", url.data, headers, NULL, &res);
65
+ if (NULL != err) {
66
+ return err;
67
+ }
68
+
69
+ body = sek_json_asobj(res.body);
70
+ if (200 != res.status || NULL == body) {
71
+ return sek_fmt(pool, "sekreto: doppler error: %d", res.status);
72
+ }
73
+
74
+ loaded = sek_map_new(pool);
75
+ for (index = 0; index < body->maplen; index++) {
76
+ /* Entries with null values are skipped; the rest are stringified. */
77
+ const char *text = sek_json_text(pool, body->vals[index]);
78
+ if (NULL != text) {
79
+ sek_map_set(loaded, body->keys[index], text);
80
+ }
81
+ }
82
+
83
+ data->values = loaded;
84
+
85
+ return NULL;
86
+ }
87
+
88
+ static sek_err doppler_lookup(sek_provider *self, const char *name, char **out) {
89
+ dopplerdata *data = (dopplerdata *)self->data;
90
+ sek_pool *pool = data->pool;
91
+ char *key = NULL;
92
+ sek_err err;
93
+ const char *found;
94
+
95
+ *out = NULL;
96
+
97
+ /* The `prefix` option is deliberately not consulted by this kind. */
98
+ err = sek_envkey(pool, name, NULL, &key);
99
+ if (NULL != err) {
100
+ return err;
101
+ }
102
+
103
+ err = doppler_load(data);
104
+ if (NULL != err) {
105
+ return err;
106
+ }
107
+
108
+ found = sek_map_get(data->values, key);
109
+ if (NULL != found) {
110
+ *out = sek_strdup(pool, found);
111
+ }
112
+
113
+ return NULL;
114
+ }
115
+
116
+ static const char *doppler_describe(sek_provider *self) {
117
+ return ((dopplerdata *)self->data)->described;
118
+ }
119
+
120
+ /* ---- the definition ------------------------------------------------ */
121
+
122
+ static sek_err doppler_make(sek_pool *pool, const sek_spec *spec, sek_provider **out) {
123
+ dopplerdata *data = (dopplerdata *)sek_alloc(pool, sizeof(dopplerdata));
124
+ data->pool = pool;
125
+ data->token = sek_own(pool, spec->token);
126
+ data->project = sek_own(pool, spec->project);
127
+ data->config = sek_own(pool, spec->config);
128
+ data->addr = sek_own(pool, spec->addr);
129
+ data->values = NULL;
130
+ data->described = sek_empty(spec->project)
131
+ ? sek_strdup(pool, "doppler")
132
+ : sek_fmt(pool, "doppler:%s/%s", spec->project, sek_orempty(spec->config));
133
+ *out = sek_provider_new(pool, doppler_lookup, doppler_describe, data);
134
+ return NULL;
135
+ }
136
+
137
+ static sek_providerkind DOPPLER_KIND;
138
+
139
+ Definition *sek_plugin_doppler(void) {
140
+ return sek_providerplugin(&DOPPLER_KIND, "doppler", doppler_make);
141
+ }