@voxgig/sdkgen 4.8.3 → 4.10.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 (917) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/helpers/manifest.d.ts +2 -1
  3. package/dist/helpers/manifest.js +75 -1
  4. package/dist/helpers/manifest.js.map +1 -1
  5. package/dist/helpers/modelNames.d.ts +7 -0
  6. package/dist/helpers/modelNames.js +232 -0
  7. package/dist/helpers/modelNames.js.map +1 -0
  8. package/dist/helpers/naming.d.ts +2 -1
  9. package/dist/helpers/naming.js +45 -1
  10. package/dist/helpers/naming.js.map +1 -1
  11. package/dist/sdkgen.d.ts +3 -2
  12. package/dist/sdkgen.js +12 -3
  13. package/dist/sdkgen.js.map +1 -1
  14. package/dist/testkit.d.ts +2 -0
  15. package/dist/testkit.js +80 -24
  16. package/dist/testkit.js.map +1 -1
  17. package/dist/tsconfig.tsbuildinfo +1 -1
  18. package/dist/utility.js +17 -7
  19. package/dist/utility.js.map +1 -1
  20. package/package.json +1 -1
  21. package/project/.sdk/model/feature/secrets.aon +671 -0
  22. package/project/.sdk/model/target/clojure.aon +10 -0
  23. package/project/.sdk/model/target/csharp.aon +5 -0
  24. package/project/.sdk/model/target/elixir.aon +6 -0
  25. package/project/.sdk/model/target/java.aon +5 -0
  26. package/project/.sdk/model/target/js.aon +5 -0
  27. package/project/.sdk/model/target/kotlin.aon +7 -0
  28. package/project/.sdk/model/target/perl.aon +5 -0
  29. package/project/.sdk/model/target/php.aon +5 -0
  30. package/project/.sdk/model/target/rb.aon +5 -0
  31. package/project/.sdk/model/target/rust.aon +5 -0
  32. package/project/.sdk/model/target/scala.aon +38 -2
  33. package/project/.sdk/model/target/swift.aon +10 -0
  34. package/project/.sdk/model/target/zig.aon +9 -0
  35. package/project/.sdk/src/cmp/clojure/Config_clojure.ts +51 -4
  36. package/project/.sdk/src/cmp/clojure/Main_clojure.ts +43 -1
  37. package/project/.sdk/src/cmp/clojure/Package_clojure.ts +17 -1
  38. package/project/.sdk/src/cmp/clojure/featureextra_clojure.ts +130 -0
  39. package/project/.sdk/src/cmp/csharp/Config_csharp.ts +70 -0
  40. package/project/.sdk/src/cmp/csharp/Main_csharp.ts +9 -1
  41. package/project/.sdk/src/cmp/csharp/Package_csharp.ts +25 -1
  42. package/project/.sdk/src/cmp/elixir/Config_elixir.ts +68 -2
  43. package/project/.sdk/src/cmp/elixir/Main_elixir.ts +16 -0
  44. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +14 -1
  45. package/project/.sdk/src/cmp/java/Config_java.ts +84 -2
  46. package/project/.sdk/src/cmp/java/Main_java.ts +10 -1
  47. package/project/.sdk/src/cmp/js/Config_js.ts +75 -8
  48. package/project/.sdk/src/cmp/js/Main_js.ts +66 -2
  49. package/project/.sdk/src/cmp/js/fragment/Config.data.fragment.js +18 -1
  50. package/project/.sdk/src/cmp/js/fragment/Config.fragment.js +18 -1
  51. package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +7 -0
  52. package/project/.sdk/src/cmp/kotlin/Config_kotlin.ts +63 -1
  53. package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +32 -2
  54. package/project/.sdk/src/cmp/perl/Config_perl.ts +129 -3
  55. package/project/.sdk/src/cmp/perl/Main_perl.ts +41 -1
  56. package/project/.sdk/src/cmp/perl/Package_perl.ts +13 -1
  57. package/project/.sdk/src/cmp/perl/fragment/Main.fragment.pm +1 -0
  58. package/project/.sdk/src/cmp/php/Config_php.ts +105 -1
  59. package/project/.sdk/src/cmp/php/Gitignore_php.ts +4 -2
  60. package/project/.sdk/src/cmp/php/Main_php.ts +16 -1
  61. package/project/.sdk/src/cmp/rb/Config_rb.ts +92 -2
  62. package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +11 -1
  63. package/project/.sdk/src/cmp/rb/Main_rb.ts +7 -1
  64. package/project/.sdk/src/cmp/rust/Main_rust.ts +99 -1
  65. package/project/.sdk/src/cmp/rust/Package_rust.ts +72 -6
  66. package/project/.sdk/src/cmp/scala/Config_scala.ts +44 -0
  67. package/project/.sdk/src/cmp/scala/Main_scala.ts +68 -1
  68. package/project/.sdk/src/cmp/swift/Config_swift.ts +62 -1
  69. package/project/.sdk/src/cmp/swift/Main_swift.ts +35 -1
  70. package/project/.sdk/src/cmp/swift/Package_swift.ts +81 -11
  71. package/project/.sdk/src/cmp/swift/fragment/Main.fragment.swift +58 -44
  72. package/project/.sdk/src/cmp/swift/utility_swift.ts +22 -0
  73. package/project/.sdk/src/cmp/zig/Package_zig.ts +15 -11
  74. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +3 -3
  75. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +3 -3
  76. package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +3 -3
  77. package/project/.sdk/src/cmp/zig/utility_zig.ts +50 -1
  78. package/project/.sdk/tm/c/tests/vendor/omni/json.c +2 -2
  79. package/project/.sdk/tm/c/tests/vendor/omni/omni.h +2 -2
  80. package/project/.sdk/tm/c/tests/vendor/omni/runner.c +2 -2
  81. package/project/.sdk/tm/c/tests/vendor/omni/util.c +2 -2
  82. package/project/.sdk/tm/clojure/Makefile +3 -0
  83. package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +503 -0
  84. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/capability.clj +84 -0
  85. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/catalog.clj +44 -0
  86. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/config.clj +240 -0
  87. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/depend.clj +199 -0
  88. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/env.clj +111 -0
  89. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/export.clj +46 -0
  90. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/graph.clj +122 -0
  91. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/host.clj +1018 -0
  92. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/json.clj +106 -0
  93. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/order.clj +157 -0
  94. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/point.clj +77 -0
  95. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/ref.clj +92 -0
  96. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/resolve.clj +46 -0
  97. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/types.clj +177 -0
  98. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/version.clj +90 -0
  99. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin.clj +40 -0
  100. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/addr.clj +111 -0
  101. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/chain.clj +297 -0
  102. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/core.clj +192 -0
  103. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/json.clj +261 -0
  104. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/aws.clj +165 -0
  105. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/azuresecrets.clj +111 -0
  106. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/boru.clj +107 -0
  107. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/doppler.clj +61 -0
  108. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/gcpsecrets.clj +88 -0
  109. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/hashicorp.clj +115 -0
  110. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/httpjson.clj +214 -0
  111. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/infisical.clj +80 -0
  112. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/onepassword.clj +93 -0
  113. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/proc.clj +63 -0
  114. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/secretspec.clj +99 -0
  115. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/sigv4.clj +142 -0
  116. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/provider.clj +25 -0
  117. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/providers.clj +196 -0
  118. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto.clj +113 -0
  119. package/project/.sdk/tm/clojure/src/sdk/core.clj +9 -0
  120. package/project/.sdk/tm/clojure/src/sdk/features.clj +13 -1
  121. package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +547 -0
  122. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +103 -14
  123. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +2 -2
  124. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +2 -2
  125. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +2 -2
  126. package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +2 -2
  127. package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +2 -2
  128. package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +2 -2
  129. package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +889 -0
  130. package/project/.sdk/tm/csharp/feature/secrets/plugin/Capability.cs +196 -0
  131. package/project/.sdk/tm/csharp/feature/secrets/plugin/Catalog.cs +70 -0
  132. package/project/.sdk/tm/csharp/feature/secrets/plugin/Config.cs +505 -0
  133. package/project/.sdk/tm/csharp/feature/secrets/plugin/Definition.cs +52 -0
  134. package/project/.sdk/tm/csharp/feature/secrets/plugin/Depend.cs +285 -0
  135. package/project/.sdk/tm/csharp/feature/secrets/plugin/Entry.cs +55 -0
  136. package/project/.sdk/tm/csharp/feature/secrets/plugin/Env.cs +228 -0
  137. package/project/.sdk/tm/csharp/feature/secrets/plugin/Export.cs +102 -0
  138. package/project/.sdk/tm/csharp/feature/secrets/plugin/Graph.cs +256 -0
  139. package/project/.sdk/tm/csharp/feature/secrets/plugin/Host.cs +1379 -0
  140. package/project/.sdk/tm/csharp/feature/secrets/plugin/Inst.cs +177 -0
  141. package/project/.sdk/tm/csharp/feature/secrets/plugin/Json.cs +326 -0
  142. package/project/.sdk/tm/csharp/feature/secrets/plugin/Order.cs +295 -0
  143. package/project/.sdk/tm/csharp/feature/secrets/plugin/Plugin.cs +113 -0
  144. package/project/.sdk/tm/csharp/feature/secrets/plugin/Point.cs +177 -0
  145. package/project/.sdk/tm/csharp/feature/secrets/plugin/Refs.cs +198 -0
  146. package/project/.sdk/tm/csharp/feature/secrets/plugin/Resolve.cs +95 -0
  147. package/project/.sdk/tm/csharp/feature/secrets/plugin/Types.cs +351 -0
  148. package/project/.sdk/tm/csharp/feature/secrets/plugin/Version.cs +196 -0
  149. package/project/.sdk/tm/csharp/feature/secrets/plugins/Aws.cs +325 -0
  150. package/project/.sdk/tm/csharp/feature/secrets/plugins/AzureSecrets.cs +195 -0
  151. package/project/.sdk/tm/csharp/feature/secrets/plugins/Boru.cs +192 -0
  152. package/project/.sdk/tm/csharp/feature/secrets/plugins/Child.cs +75 -0
  153. package/project/.sdk/tm/csharp/feature/secrets/plugins/Doppler.cs +112 -0
  154. package/project/.sdk/tm/csharp/feature/secrets/plugins/GcpSecrets.cs +167 -0
  155. package/project/.sdk/tm/csharp/feature/secrets/plugins/Hashicorp.cs +221 -0
  156. package/project/.sdk/tm/csharp/feature/secrets/plugins/HttpJson.cs +213 -0
  157. package/project/.sdk/tm/csharp/feature/secrets/plugins/Infisical.cs +155 -0
  158. package/project/.sdk/tm/csharp/feature/secrets/plugins/OnePassword.cs +169 -0
  159. package/project/.sdk/tm/csharp/feature/secrets/plugins/SecretSpec.cs +172 -0
  160. package/project/.sdk/tm/csharp/feature/secrets/plugins/Sigv4.cs +240 -0
  161. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Json.cs +192 -0
  162. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Providers.cs +503 -0
  163. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Sekreto.cs +775 -0
  164. package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +1702 -0
  165. package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +2 -2
  166. package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +2 -2
  167. package/project/.sdk/tm/csharp/utility/MakeOptions.cs +10 -0
  168. package/project/.sdk/tm/csharp/utility/struct/Struct.cs +1 -1
  169. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/capability.ex +118 -0
  170. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/catalog.ex +56 -0
  171. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/config.ex +320 -0
  172. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/depend.ex +205 -0
  173. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/env.ex +166 -0
  174. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/error.ex +13 -0
  175. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/export.ex +73 -0
  176. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/graph.ex +185 -0
  177. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/host.ex +1182 -0
  178. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/inst.ex +139 -0
  179. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/json.ex +132 -0
  180. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/order.ex +179 -0
  181. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/point.ex +99 -0
  182. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/ref.ex +129 -0
  183. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/resolve.ex +59 -0
  184. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/types.ex +190 -0
  185. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/version.ex +136 -0
  186. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/voxgig_plugin.ex +42 -0
  187. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/json.ex +368 -0
  188. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/aws.ex +257 -0
  189. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/azuresecrets.ex +160 -0
  190. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/boru.ex +127 -0
  191. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/doppler.ex +96 -0
  192. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/gcpsecrets.ex +124 -0
  193. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/hashicorp.ex +162 -0
  194. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/http.ex +627 -0
  195. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/httpjson.ex +134 -0
  196. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/infisical.ex +125 -0
  197. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/onepassword.ex +152 -0
  198. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/proc.ex +80 -0
  199. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/secretspec.ex +101 -0
  200. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/sigv4.ex +176 -0
  201. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/provider.ex +67 -0
  202. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/providers.ex +536 -0
  203. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/sekreto.ex +662 -0
  204. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +824 -0
  205. package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +1072 -0
  206. package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +2 -2
  207. package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +2 -2
  208. package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +2 -2
  209. package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +1 -1
  210. package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +1 -1
  211. package/project/.sdk/tm/go/feature/secrets/plugin/config.go +1 -1
  212. package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +1 -1
  213. package/project/.sdk/tm/go/feature/secrets/plugin/env.go +1 -1
  214. package/project/.sdk/tm/go/feature/secrets/plugin/export.go +1 -1
  215. package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +1 -1
  216. package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1 -1
  217. package/project/.sdk/tm/go/feature/secrets/plugin/order.go +1 -1
  218. package/project/.sdk/tm/go/feature/secrets/plugin/point.go +1 -1
  219. package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +1 -1
  220. package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +1 -1
  221. package/project/.sdk/tm/go/feature/secrets/plugin/types.go +1 -1
  222. package/project/.sdk/tm/go/feature/secrets/plugin/util.go +1 -1
  223. package/project/.sdk/tm/go/feature/secrets/plugin/version.go +1 -1
  224. package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +4 -4
  225. package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +2 -2
  226. package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +2 -2
  227. package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +2 -2
  228. package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +2 -2
  229. package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +2 -2
  230. package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +4 -5
  231. package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +3 -3
  232. package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +3 -4
  233. package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +2 -2
  234. package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +2 -2
  235. package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +2 -2
  236. package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +5 -2
  237. package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +31 -2
  238. package/project/.sdk/tm/go/feature/secrets_feature.go +16 -0
  239. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +123 -0
  240. package/project/.sdk/tm/go/test/omni/omni.go +8 -3
  241. package/project/.sdk/tm/go/test/omni/util.go +25 -4
  242. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +1 -1
  243. package/project/.sdk/tm/java/feature/SecretsFeature.java +766 -0
  244. package/project/.sdk/tm/java/feature/secrets/plugin/Capability.java +181 -0
  245. package/project/.sdk/tm/java/feature/secrets/plugin/Catalog.java +64 -0
  246. package/project/.sdk/tm/java/feature/secrets/plugin/Config.java +433 -0
  247. package/project/.sdk/tm/java/feature/secrets/plugin/Definition.java +54 -0
  248. package/project/.sdk/tm/java/feature/secrets/plugin/Depend.java +292 -0
  249. package/project/.sdk/tm/java/feature/secrets/plugin/Entry.java +49 -0
  250. package/project/.sdk/tm/java/feature/secrets/plugin/Env.java +204 -0
  251. package/project/.sdk/tm/java/feature/secrets/plugin/Export.java +93 -0
  252. package/project/.sdk/tm/java/feature/secrets/plugin/Graph.java +244 -0
  253. package/project/.sdk/tm/java/feature/secrets/plugin/Host.java +1196 -0
  254. package/project/.sdk/tm/java/feature/secrets/plugin/Inst.java +173 -0
  255. package/project/.sdk/tm/java/feature/secrets/plugin/Json.java +339 -0
  256. package/project/.sdk/tm/java/feature/secrets/plugin/Order.java +274 -0
  257. package/project/.sdk/tm/java/feature/secrets/plugin/Plugin.java +94 -0
  258. package/project/.sdk/tm/java/feature/secrets/plugin/PluginException.java +37 -0
  259. package/project/.sdk/tm/java/feature/secrets/plugin/Point.java +172 -0
  260. package/project/.sdk/tm/java/feature/secrets/plugin/Refs.java +171 -0
  261. package/project/.sdk/tm/java/feature/secrets/plugin/Resolve.java +89 -0
  262. package/project/.sdk/tm/java/feature/secrets/plugin/Types.java +232 -0
  263. package/project/.sdk/tm/java/feature/secrets/plugin/Version.java +198 -0
  264. package/project/.sdk/tm/java/feature/secrets/sekreto/Addr.java +142 -0
  265. package/project/.sdk/tm/java/feature/secrets/sekreto/Builtins.java +229 -0
  266. package/project/.sdk/tm/java/feature/secrets/sekreto/Json.java +302 -0
  267. package/project/.sdk/tm/java/feature/secrets/sekreto/Provider.java +21 -0
  268. package/project/.sdk/tm/java/feature/secrets/sekreto/Sekreto.java +698 -0
  269. package/project/.sdk/tm/java/feature/secrets/sekreto/Support.java +100 -0
  270. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Aws.java +294 -0
  271. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Azuresecrets.java +164 -0
  272. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Boru.java +161 -0
  273. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Doppler.java +103 -0
  274. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Gcpsecrets.java +143 -0
  275. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Hashicorp.java +186 -0
  276. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Httpjson.java +192 -0
  277. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Infisical.java +139 -0
  278. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Onepassword.java +143 -0
  279. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Proc.java +80 -0
  280. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Secretspec.java +138 -0
  281. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Sigv4.java +243 -0
  282. package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +986 -0
  283. package/project/.sdk/tm/java/test/vendor/omni/Json.java +2 -2
  284. package/project/.sdk/tm/java/test/vendor/omni/Runner.java +2 -2
  285. package/project/.sdk/tm/java/test/vendor/omni/Util.java +2 -2
  286. package/project/.sdk/tm/java/utility/MakeOptions.java +7 -0
  287. package/project/.sdk/tm/java/utility/struct/Struct.java +1 -1
  288. package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +431 -0
  289. package/project/.sdk/tm/js/src/feature/secrets/plugin/capability.js +119 -0
  290. package/project/.sdk/tm/js/src/feature/secrets/plugin/catalog.js +42 -0
  291. package/project/.sdk/tm/js/src/feature/secrets/plugin/config.js +323 -0
  292. package/project/.sdk/tm/js/src/feature/secrets/plugin/depend.js +196 -0
  293. package/project/.sdk/tm/js/src/feature/secrets/plugin/env.js +120 -0
  294. package/project/.sdk/tm/js/src/feature/secrets/plugin/export.js +48 -0
  295. package/project/.sdk/tm/js/src/feature/secrets/plugin/graph.js +150 -0
  296. package/project/.sdk/tm/js/src/feature/secrets/plugin/host.js +949 -0
  297. package/project/.sdk/tm/js/src/feature/secrets/plugin/index.js +35 -0
  298. package/project/.sdk/tm/js/src/feature/secrets/plugin/order.js +165 -0
  299. package/project/.sdk/tm/js/src/feature/secrets/plugin/point.js +94 -0
  300. package/project/.sdk/tm/js/src/feature/secrets/plugin/ref.js +106 -0
  301. package/project/.sdk/tm/js/src/feature/secrets/plugin/resolve.js +59 -0
  302. package/project/.sdk/tm/js/src/feature/secrets/plugin/types.js +79 -0
  303. package/project/.sdk/tm/js/src/feature/secrets/plugin/version.js +100 -0
  304. package/project/.sdk/tm/js/src/feature/secrets/sekreto/Sekreto.js +574 -0
  305. package/project/.sdk/tm/js/src/feature/secrets/sekreto/index.js +56 -0
  306. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/aws.js +188 -0
  307. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/azuresecrets.js +135 -0
  308. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/boru.js +128 -0
  309. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/doppler.js +67 -0
  310. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/gcpsecrets.js +115 -0
  311. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/hashicorp.js +139 -0
  312. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/httpjson.js +93 -0
  313. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/infisical.js +99 -0
  314. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/onepassword.js +111 -0
  315. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/secretspec.js +105 -0
  316. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/sigv4.js +157 -0
  317. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/addr.js +119 -0
  318. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/builtin.js +39 -0
  319. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/dotenv.js +40 -0
  320. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/env.js +21 -0
  321. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/file.js +42 -0
  322. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/memory.js +18 -0
  323. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/support.js +151 -0
  324. package/project/.sdk/tm/js/src/utility/StructUtility.js +2 -2
  325. package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +946 -0
  326. package/project/.sdk/tm/js/test/vendor/omni/index.js +1 -1
  327. package/project/.sdk/tm/js/test/vendor/omni/runner.js +18 -3
  328. package/project/.sdk/tm/js/test/vendor/omni/util.js +25 -8
  329. package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +659 -0
  330. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Capability.kt +117 -0
  331. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Catalog.kt +40 -0
  332. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Config.kt +322 -0
  333. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Depend.kt +227 -0
  334. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Env.kt +163 -0
  335. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Export.kt +57 -0
  336. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Graph.kt +179 -0
  337. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Host.kt +1131 -0
  338. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Json.kt +241 -0
  339. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Order.kt +180 -0
  340. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Plugin.kt +64 -0
  341. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Point.kt +124 -0
  342. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Refs.kt +125 -0
  343. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Resolve.kt +66 -0
  344. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Types.kt +171 -0
  345. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Version.kt +132 -0
  346. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Json.kt +359 -0
  347. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Provider.kt +21 -0
  348. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Providers.kt +308 -0
  349. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Sekreto.kt +525 -0
  350. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Spec.kt +126 -0
  351. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Support.kt +205 -0
  352. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Aws.kt +251 -0
  353. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Azuresecrets.kt +145 -0
  354. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Boru.kt +130 -0
  355. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Doppler.kt +77 -0
  356. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Gcpsecrets.kt +119 -0
  357. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Hashicorp.kt +156 -0
  358. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Httpjson.kt +219 -0
  359. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Infisical.kt +114 -0
  360. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Onepassword.kt +114 -0
  361. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Secretspec.kt +118 -0
  362. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Sigv4.kt +220 -0
  363. package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +1148 -0
  364. package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +2 -2
  365. package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +2 -2
  366. package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +2 -2
  367. package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +1 -1
  368. package/project/.sdk/tm/lua/test/vendor/omni/json.lua +2 -2
  369. package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +2 -2
  370. package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +2 -2
  371. package/project/.sdk/tm/lua/test/vendor/omni/util.lua +2 -2
  372. package/project/.sdk/tm/lua/utility/struct/regex.lua +1 -1
  373. package/project/.sdk/tm/lua/utility/struct/struct.lua +1 -1
  374. package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +2 -2
  375. package/project/.sdk/tm/perl/Makefile +6 -1
  376. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Capability.pm +141 -0
  377. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Catalog.pm +65 -0
  378. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Config.pm +346 -0
  379. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Depend.pm +216 -0
  380. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Env.pm +176 -0
  381. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Export.pm +59 -0
  382. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Graph.pm +157 -0
  383. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Host.pm +1139 -0
  384. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Order.pm +187 -0
  385. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Point.pm +100 -0
  386. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Ref.pm +119 -0
  387. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Resolve.pm +71 -0
  388. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Types.pm +251 -0
  389. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Version.pm +122 -0
  390. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin.pm +70 -0
  391. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Aws.pm +263 -0
  392. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Azuresecrets.pm +159 -0
  393. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Boru.pm +180 -0
  394. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Doppler.pm +92 -0
  395. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Gcpsecrets.pm +138 -0
  396. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm +213 -0
  397. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Httpjson.pm +173 -0
  398. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Infisical.pm +132 -0
  399. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Onepassword.pm +132 -0
  400. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Proc.pm +102 -0
  401. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Secretspec.pm +132 -0
  402. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Sigv4.pm +190 -0
  403. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Addr.pm +124 -0
  404. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Providers.pm +301 -0
  405. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto.pm +605 -0
  406. package/project/.sdk/tm/perl/feature/secrets_feature.pm +675 -0
  407. package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +1 -1
  408. package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +957 -0
  409. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +1 -1
  410. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +1 -1
  411. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +1 -1
  412. package/project/.sdk/tm/php/feature/SecretsFeature.php +670 -0
  413. package/project/.sdk/tm/php/feature/secrets/plugin/Capability.php +226 -0
  414. package/project/.sdk/tm/php/feature/secrets/plugin/Catalog.php +75 -0
  415. package/project/.sdk/tm/php/feature/secrets/plugin/Config.php +444 -0
  416. package/project/.sdk/tm/php/feature/secrets/plugin/Depend.php +262 -0
  417. package/project/.sdk/tm/php/feature/secrets/plugin/Env.php +202 -0
  418. package/project/.sdk/tm/php/feature/secrets/plugin/Export.php +74 -0
  419. package/project/.sdk/tm/php/feature/secrets/plugin/Graph.php +195 -0
  420. package/project/.sdk/tm/php/feature/secrets/plugin/Host.php +1514 -0
  421. package/project/.sdk/tm/php/feature/secrets/plugin/Order.php +260 -0
  422. package/project/.sdk/tm/php/feature/secrets/plugin/Point.php +129 -0
  423. package/project/.sdk/tm/php/feature/secrets/plugin/Ref.php +169 -0
  424. package/project/.sdk/tm/php/feature/secrets/plugin/Resolve.php +79 -0
  425. package/project/.sdk/tm/php/feature/secrets/plugin/Types.php +348 -0
  426. package/project/.sdk/tm/php/feature/secrets/plugin/Version.php +163 -0
  427. package/project/.sdk/tm/php/feature/secrets/plugin/plugin.php +40 -0
  428. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/aws.php +274 -0
  429. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/azuresecrets.php +170 -0
  430. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/boru.php +163 -0
  431. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/doppler.php +106 -0
  432. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/gcpsecrets.php +144 -0
  433. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/hashicorp.php +194 -0
  434. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/httpjson.php +113 -0
  435. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/infisical.php +131 -0
  436. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/onepassword.php +150 -0
  437. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/runcmd.php +101 -0
  438. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/secretspec.php +146 -0
  439. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/sigv4.php +161 -0
  440. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Addr.php +129 -0
  441. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Providers.php +322 -0
  442. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Sekreto.php +724 -0
  443. package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +1067 -0
  444. package/project/.sdk/tm/php/test/vendor/omni/Runner.php +2 -2
  445. package/project/.sdk/tm/php/test/vendor/omni/Util.php +2 -2
  446. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +1 -1
  447. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +1 -1
  448. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +1 -1
  449. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +1 -1
  450. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +1 -1
  451. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +1 -1
  452. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +1 -1
  453. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +1 -1
  454. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1 -1
  455. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +1 -1
  456. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +1 -1
  457. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +1 -1
  458. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +1 -1
  459. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +1 -1
  460. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +1 -1
  461. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +4 -2
  462. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +1 -1
  463. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +3 -3
  464. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +1 -1
  465. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +1 -1
  466. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +1 -1
  467. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +1 -1
  468. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +3 -4
  469. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +1 -1
  470. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +4 -6
  471. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +1 -1
  472. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +1 -1
  473. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +1 -1
  474. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +1 -1
  475. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +21 -1
  476. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +1 -1
  477. package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +1 -1
  478. package/project/.sdk/tm/py/test/voxgig_omni/runner.py +16 -2
  479. package/project/.sdk/tm/py/test/voxgig_omni/util.py +27 -12
  480. package/project/.sdk/tm/rb/Makefile +7 -1
  481. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/capability.rb +118 -0
  482. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/catalog.rb +55 -0
  483. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/config.rb +315 -0
  484. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/depend.rb +197 -0
  485. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/env.rb +143 -0
  486. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/export.rb +52 -0
  487. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/graph.rb +147 -0
  488. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/host.rb +1079 -0
  489. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/order.rb +169 -0
  490. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/point.rb +93 -0
  491. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/ref.rb +112 -0
  492. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/resolve.rb +56 -0
  493. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/types.rb +99 -0
  494. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/version.rb +106 -0
  495. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin.rb +24 -0
  496. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/addr.rb +111 -0
  497. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/aws.rb +200 -0
  498. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/azuresecrets.rb +130 -0
  499. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/boru.rb +121 -0
  500. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/doppler.rb +66 -0
  501. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.rb +107 -0
  502. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/hashicorp.rb +137 -0
  503. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/httpjson.rb +136 -0
  504. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/infisical.rb +97 -0
  505. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/onepassword.rb +104 -0
  506. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/secretspec.rb +113 -0
  507. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/sigv4.rb +127 -0
  508. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/providers.rb +210 -0
  509. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/sekreto.rb +465 -0
  510. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto.rb +30 -0
  511. package/project/.sdk/tm/rb/feature/secrets_feature.rb +561 -0
  512. package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +842 -0
  513. package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +2 -2
  514. package/project/.sdk/tm/rb/test/vendor/omni/util.rb +2 -2
  515. package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +2 -2
  516. package/project/.sdk/tm/rust/feature/secrets/plugin/capability.rs +130 -0
  517. package/project/.sdk/tm/rust/feature/secrets/plugin/catalog.rs +114 -0
  518. package/project/.sdk/tm/rust/feature/secrets/plugin/config.rs +416 -0
  519. package/project/.sdk/tm/rust/feature/secrets/plugin/depend.rs +245 -0
  520. package/project/.sdk/tm/rust/feature/secrets/plugin/env.rs +200 -0
  521. package/project/.sdk/tm/rust/feature/secrets/plugin/export.rs +90 -0
  522. package/project/.sdk/tm/rust/feature/secrets/plugin/graph.rs +231 -0
  523. package/project/.sdk/tm/rust/feature/secrets/plugin/host.rs +1565 -0
  524. package/project/.sdk/tm/rust/feature/secrets/plugin/mod.rs +18 -0
  525. package/project/.sdk/tm/rust/feature/secrets/plugin/order.rs +226 -0
  526. package/project/.sdk/tm/rust/feature/secrets/plugin/point.rs +137 -0
  527. package/project/.sdk/tm/rust/feature/secrets/plugin/refs.rs +148 -0
  528. package/project/.sdk/tm/rust/feature/secrets/plugin/resolve.rs +83 -0
  529. package/project/.sdk/tm/rust/feature/secrets/plugin/types.rs +132 -0
  530. package/project/.sdk/tm/rust/feature/secrets/plugin/value.rs +433 -0
  531. package/project/.sdk/tm/rust/feature/secrets/plugin/version.rs +174 -0
  532. package/project/.sdk/tm/rust/feature/secrets/plugins/aws/crypto.rs +146 -0
  533. package/project/.sdk/tm/rust/feature/secrets/plugins/aws/sigv4.rs +230 -0
  534. package/project/.sdk/tm/rust/feature/secrets/plugins/aws.rs +328 -0
  535. package/project/.sdk/tm/rust/feature/secrets/plugins/azuresecrets.rs +184 -0
  536. package/project/.sdk/tm/rust/feature/secrets/plugins/boru.rs +172 -0
  537. package/project/.sdk/tm/rust/feature/secrets/plugins/doppler.rs +102 -0
  538. package/project/.sdk/tm/rust/feature/secrets/plugins/gcpsecrets.rs +153 -0
  539. package/project/.sdk/tm/rust/feature/secrets/plugins/hashicorp.rs +228 -0
  540. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/http.rs +537 -0
  541. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/json.rs +300 -0
  542. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson.rs +137 -0
  543. package/project/.sdk/tm/rust/feature/secrets/plugins/infisical.rs +148 -0
  544. package/project/.sdk/tm/rust/feature/secrets/plugins/onepassword.rs +165 -0
  545. package/project/.sdk/tm/rust/feature/secrets/plugins/secretspec.rs +150 -0
  546. package/project/.sdk/tm/rust/feature/secrets/sekreto/addr.rs +144 -0
  547. package/project/.sdk/tm/rust/feature/secrets/sekreto/mod.rs +51 -0
  548. package/project/.sdk/tm/rust/feature/secrets/sekreto/providers.rs +637 -0
  549. package/project/.sdk/tm/rust/feature/secrets/sekreto/sekreto.rs +677 -0
  550. package/project/.sdk/tm/rust/feature/secrets.rs +961 -0
  551. package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +1509 -0
  552. package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +2 -2
  553. package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +2 -2
  554. package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +2 -2
  555. package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +2 -2
  556. package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +2 -2
  557. package/project/.sdk/tm/scala/Makefile +8 -3
  558. package/project/.sdk/tm/scala/feature/SecretsFeature.scala +556 -0
  559. package/project/.sdk/tm/scala/feature/secrets/plugin/Capability.scala +96 -0
  560. package/project/.sdk/tm/scala/feature/secrets/plugin/Config.scala +270 -0
  561. package/project/.sdk/tm/scala/feature/secrets/plugin/Depend.scala +216 -0
  562. package/project/.sdk/tm/scala/feature/secrets/plugin/Env.scala +144 -0
  563. package/project/.sdk/tm/scala/feature/secrets/plugin/Export.scala +59 -0
  564. package/project/.sdk/tm/scala/feature/secrets/plugin/Graph.scala +149 -0
  565. package/project/.sdk/tm/scala/feature/secrets/plugin/Host.scala +1089 -0
  566. package/project/.sdk/tm/scala/feature/secrets/plugin/Json.scala +156 -0
  567. package/project/.sdk/tm/scala/feature/secrets/plugin/Order.scala +169 -0
  568. package/project/.sdk/tm/scala/feature/secrets/plugin/Plugin.scala +47 -0
  569. package/project/.sdk/tm/scala/feature/secrets/plugin/Point.scala +107 -0
  570. package/project/.sdk/tm/scala/feature/secrets/plugin/Refs.scala +131 -0
  571. package/project/.sdk/tm/scala/feature/secrets/plugin/Resolve.scala +53 -0
  572. package/project/.sdk/tm/scala/feature/secrets/plugin/Types.scala +110 -0
  573. package/project/.sdk/tm/scala/feature/secrets/plugin/Value.scala +157 -0
  574. package/project/.sdk/tm/scala/feature/secrets/plugin/Version.scala +136 -0
  575. package/project/.sdk/tm/scala/feature/secrets/sekreto/Json.scala +302 -0
  576. package/project/.sdk/tm/scala/feature/secrets/sekreto/Provider.scala +20 -0
  577. package/project/.sdk/tm/scala/feature/secrets/sekreto/Providers.scala +281 -0
  578. package/project/.sdk/tm/scala/feature/secrets/sekreto/Sekreto.scala +473 -0
  579. package/project/.sdk/tm/scala/feature/secrets/sekreto/Spec.scala +123 -0
  580. package/project/.sdk/tm/scala/feature/secrets/sekreto/Support.scala +216 -0
  581. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Aws.scala +225 -0
  582. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Azuresecrets.scala +124 -0
  583. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Boru.scala +104 -0
  584. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Doppler.scala +68 -0
  585. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Gcpsecrets.scala +97 -0
  586. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Hashicorp.scala +131 -0
  587. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Httpjson.scala +209 -0
  588. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Infisical.scala +98 -0
  589. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Onepassword.scala +90 -0
  590. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Secretspec.scala +95 -0
  591. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Sigv4.scala +214 -0
  592. package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +971 -0
  593. package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +2 -2
  594. package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +2 -2
  595. package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +2 -2
  596. package/project/.sdk/tm/scala/utility/Make.scala +7 -0
  597. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/SecretsFeature.swift +669 -0
  598. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Capability.swift +98 -0
  599. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Catalog.swift +87 -0
  600. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Config.swift +298 -0
  601. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Depend.swift +209 -0
  602. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Env.swift +191 -0
  603. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Export.swift +63 -0
  604. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Graph.swift +158 -0
  605. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Host.swift +1141 -0
  606. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Json.swift +192 -0
  607. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Order.swift +183 -0
  608. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Point.swift +130 -0
  609. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Refs.swift +141 -0
  610. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Resolve.swift +59 -0
  611. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Types.swift +125 -0
  612. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Value.swift +198 -0
  613. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Version.swift +139 -0
  614. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Aws.swift +271 -0
  615. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Azuresecrets.swift +173 -0
  616. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Boru.swift +139 -0
  617. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Crypto.swift +198 -0
  618. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Doppler.swift +86 -0
  619. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Gcpsecrets.swift +129 -0
  620. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Hashicorp.swift +175 -0
  621. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Httpjson.swift +310 -0
  622. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Infisical.swift +140 -0
  623. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Onepassword.swift +118 -0
  624. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Proc.swift +105 -0
  625. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Secretspec.swift +111 -0
  626. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Sigv4.swift +297 -0
  627. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Addr.swift +120 -0
  628. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Json.swift +452 -0
  629. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Provider.swift +25 -0
  630. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Providers.swift +689 -0
  631. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Sekreto.swift +755 -0
  632. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeOptions.swift +9 -0
  633. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +30 -0
  634. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/feature/secrets/SecretsFeatureTest.swift +1030 -0
  635. package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +2 -2
  636. package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +2 -2
  637. package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +2 -2
  638. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +1 -1
  639. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +1 -1
  640. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +1 -1
  641. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +1 -1
  642. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +1 -1
  643. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +1 -1
  644. package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +1 -1
  645. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +1 -1
  646. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1 -1
  647. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +1 -1
  648. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +1 -1
  649. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +1 -1
  650. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +1 -1
  651. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +1 -1
  652. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +1 -1
  653. package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +1 -1
  654. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +1 -1
  655. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +1 -1
  656. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/aws.ts +1 -1
  657. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/azuresecrets.ts +1 -1
  658. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/boru.ts +1 -1
  659. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/doppler.ts +1 -1
  660. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/gcpsecrets.ts +1 -1
  661. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/hashicorp.ts +1 -1
  662. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +1 -1
  663. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/infisical.ts +1 -1
  664. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/onepassword.ts +1 -1
  665. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +1 -1
  666. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/sigv4.ts +1 -1
  667. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +1 -1
  668. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +1 -1
  669. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +1 -1
  670. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +1 -1
  671. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +1 -1
  672. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +1 -1
  673. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +1 -1
  674. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +2 -2
  675. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +1 -1
  676. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +1 -1
  677. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +1 -1
  678. package/project/.sdk/tm/zig/Makefile +15 -1
  679. package/project/.sdk/tm/zig/build.zig +23 -5
  680. package/project/.sdk/tm/zig/core/helpers.zig +52 -11
  681. package/project/.sdk/tm/zig/core/mem.zig +17 -1
  682. package/project/.sdk/tm/zig/core/utility.zig +23 -19
  683. package/project/.sdk/tm/zig/feature/audit.zig +2 -2
  684. package/project/.sdk/tm/zig/feature/cache.zig +2 -2
  685. package/project/.sdk/tm/zig/feature/debug.zig +5 -5
  686. package/project/.sdk/tm/zig/feature/netsim.zig +2 -2
  687. package/project/.sdk/tm/zig/feature/paging.zig +2 -2
  688. package/project/.sdk/tm/zig/feature/proxy.zig +15 -8
  689. package/project/.sdk/tm/zig/feature/streaming.zig +5 -5
  690. package/project/.sdk/tm/zig/feature/support.zig +3 -3
  691. package/project/.sdk/tm/zig/feature/telemetry.zig +5 -5
  692. package/project/.sdk/tm/zig/feature/test.zig +10 -5
  693. package/project/.sdk/tm/zig/test/fh.zig +10 -10
  694. package/project/.sdk/tm/zig/test/gotcha_test.zig +5 -5
  695. package/project/.sdk/tm/zig/test/omniresolver.zig +515 -0
  696. package/project/.sdk/tm/zig/test/omnismoke_test.zig +284 -0
  697. package/project/.sdk/tm/zig/test/pipeline_test.zig +8 -8
  698. package/project/.sdk/tm/zig/test/primary_utility_test.zig +144 -154
  699. package/project/.sdk/tm/zig/test/struct_corpus.zig +264 -187
  700. package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +1314 -0
  701. package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +446 -0
  702. package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +7 -4
  703. package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +356 -157
  704. package/project/sdkgen-package.json +1 -4
  705. package/src/helpers/manifest.ts +81 -1
  706. package/src/helpers/modelNames.ts +284 -0
  707. package/src/helpers/naming.ts +45 -1
  708. package/src/sdkgen.ts +11 -1
  709. package/src/testkit.ts +115 -26
  710. package/src/utility.ts +17 -7
  711. package/project/.sdk/model/target/dart.aon +0 -58
  712. package/project/.sdk/model/target/lean.aon +0 -91
  713. package/project/.sdk/model/target/seneca-provider.aon +0 -120
  714. package/project/.sdk/src/cmp/dart/Config_dart.ts +0 -176
  715. package/project/.sdk/src/cmp/dart/EntityBase_dart.ts +0 -34
  716. package/project/.sdk/src/cmp/dart/EntityOperation_dart.ts +0 -43
  717. package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +0 -207
  718. package/project/.sdk/src/cmp/dart/Entity_dart.ts +0 -87
  719. package/project/.sdk/src/cmp/dart/Gitignore_dart.ts +0 -34
  720. package/project/.sdk/src/cmp/dart/MainEntity_dart.ts +0 -33
  721. package/project/.sdk/src/cmp/dart/Main_dart.ts +0 -106
  722. package/project/.sdk/src/cmp/dart/Package_dart.ts +0 -82
  723. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +0 -177
  724. package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +0 -238
  725. package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +0 -53
  726. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +0 -152
  727. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +0 -59
  728. package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +0 -65
  729. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +0 -151
  730. package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +0 -63
  731. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +0 -225
  732. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +0 -397
  733. package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +0 -24
  734. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +0 -106
  735. package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +0 -78
  736. package/project/.sdk/src/cmp/dart/SdkError_dart.ts +0 -42
  737. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +0 -516
  738. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +0 -628
  739. package/project/.sdk/src/cmp/dart/Test_dart.ts +0 -116
  740. package/project/.sdk/src/cmp/dart/fragment/Config.data.fragment.dart +0 -79
  741. package/project/.sdk/src/cmp/dart/fragment/Config.fragment.dart +0 -51
  742. package/project/.sdk/src/cmp/dart/fragment/Direct.test.fragment.dart +0 -25
  743. package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +0 -29
  744. package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +0 -28
  745. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +0 -302
  746. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +0 -98
  747. package/project/.sdk/src/cmp/dart/fragment/EntityListOp.fragment.dart +0 -90
  748. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +0 -102
  749. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +0 -108
  750. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +0 -102
  751. package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +0 -338
  752. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +0 -26
  753. package/project/.sdk/src/cmp/dart/tsconfig.json +0 -15
  754. package/project/.sdk/src/cmp/dart/utility_dart.ts +0 -155
  755. package/project/.sdk/src/cmp/lean/Config_lean.ts +0 -93
  756. package/project/.sdk/src/cmp/lean/Entity_lean.ts +0 -9
  757. package/project/.sdk/src/cmp/lean/Gitignore_lean.ts +0 -18
  758. package/project/.sdk/src/cmp/lean/Main_lean.ts +0 -120
  759. package/project/.sdk/src/cmp/lean/Package_lean.ts +0 -93
  760. package/project/.sdk/src/cmp/lean/ReadmeEntity_lean.ts +0 -29
  761. package/project/.sdk/src/cmp/lean/ReadmeExplanation_lean.ts +0 -19
  762. package/project/.sdk/src/cmp/lean/ReadmeHowto_lean.ts +0 -25
  763. package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +0 -39
  764. package/project/.sdk/src/cmp/lean/ReadmeIntro_lean.ts +0 -25
  765. package/project/.sdk/src/cmp/lean/ReadmeModel_lean.ts +0 -24
  766. package/project/.sdk/src/cmp/lean/ReadmeOptions_lean.ts +0 -22
  767. package/project/.sdk/src/cmp/lean/ReadmeQuick_lean.ts +0 -50
  768. package/project/.sdk/src/cmp/lean/ReadmeRef_lean.ts +0 -40
  769. package/project/.sdk/src/cmp/lean/ReadmeTopHowto_lean.ts +0 -16
  770. package/project/.sdk/src/cmp/lean/ReadmeTopQuick_lean.ts +0 -23
  771. package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +0 -19
  772. package/project/.sdk/src/cmp/lean/Test_lean.ts +0 -261
  773. package/project/.sdk/src/cmp/lean/utility_lean.ts +0 -129
  774. package/project/.sdk/src/cmp/seneca-provider/Extras_seneca-provider.ts +0 -4080
  775. package/project/.sdk/src/cmp/seneca-provider/Gitignore_seneca-provider.ts +0 -161
  776. package/project/.sdk/src/cmp/seneca-provider/Main_seneca-provider.ts +0 -1011
  777. package/project/.sdk/tm/dart/LICENSE +0 -22
  778. package/project/.sdk/tm/dart/Makefile +0 -50
  779. package/project/.sdk/tm/dart/lib/Context.dart +0 -150
  780. package/project/.sdk/tm/dart/lib/Control.dart +0 -15
  781. package/project/.sdk/tm/dart/lib/Operation.dart +0 -31
  782. package/project/.sdk/tm/dart/lib/Point.dart +0 -51
  783. package/project/.sdk/tm/dart/lib/Response.dart +0 -32
  784. package/project/.sdk/tm/dart/lib/Result.dart +0 -39
  785. package/project/.sdk/tm/dart/lib/Spec.dart +0 -49
  786. package/project/.sdk/tm/dart/lib/feature/audit/AuditFeature.dart +0 -103
  787. package/project/.sdk/tm/dart/lib/feature/base/BaseFeature.dart +0 -76
  788. package/project/.sdk/tm/dart/lib/feature/cache/CacheFeature.dart +0 -152
  789. package/project/.sdk/tm/dart/lib/feature/clienttrack/ClienttrackFeature.dart +0 -104
  790. package/project/.sdk/tm/dart/lib/feature/cost/CostFeature.dart +0 -446
  791. package/project/.sdk/tm/dart/lib/feature/debug/DebugFeature.dart +0 -153
  792. package/project/.sdk/tm/dart/lib/feature/idempotency/IdempotencyFeature.dart +0 -92
  793. package/project/.sdk/tm/dart/lib/feature/log/LogFeature.dart +0 -85
  794. package/project/.sdk/tm/dart/lib/feature/metrics/MetricsFeature.dart +0 -103
  795. package/project/.sdk/tm/dart/lib/feature/netsim/NetsimFeature.dart +0 -186
  796. package/project/.sdk/tm/dart/lib/feature/paging/PagingFeature.dart +0 -240
  797. package/project/.sdk/tm/dart/lib/feature/proxy/ProxyFeature.dart +0 -118
  798. package/project/.sdk/tm/dart/lib/feature/ratelimit/RatelimitFeature.dart +0 -103
  799. package/project/.sdk/tm/dart/lib/feature/rbac/RbacFeature.dart +0 -121
  800. package/project/.sdk/tm/dart/lib/feature/retry/RetryFeature.dart +0 -155
  801. package/project/.sdk/tm/dart/lib/feature/streaming/StreamingFeature.dart +0 -97
  802. package/project/.sdk/tm/dart/lib/feature/telemetry/TelemetryFeature.dart +0 -136
  803. package/project/.sdk/tm/dart/lib/feature/test/TestFeature.dart +0 -328
  804. package/project/.sdk/tm/dart/lib/feature/timeout/TimeoutFeature.dart +0 -104
  805. package/project/.sdk/tm/dart/lib/utility/CleanUtility.dart +0 -12
  806. package/project/.sdk/tm/dart/lib/utility/DoneUtility.dart +0 -18
  807. package/project/.sdk/tm/dart/lib/utility/ErrUtility.dart +0 -46
  808. package/project/.sdk/tm/dart/lib/utility/FeatureAddUtility.dart +0 -35
  809. package/project/.sdk/tm/dart/lib/utility/FeatureHookUtility.dart +0 -20
  810. package/project/.sdk/tm/dart/lib/utility/FeatureInitUtility.dart +0 -9
  811. package/project/.sdk/tm/dart/lib/utility/FetcherUtility.dart +0 -104
  812. package/project/.sdk/tm/dart/lib/utility/GraphqlUtility.dart +0 -162
  813. package/project/.sdk/tm/dart/lib/utility/MakeContextUtility.dart +0 -6
  814. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +0 -71
  815. package/project/.sdk/tm/dart/lib/utility/MakeFetchDefUtility.dart +0 -42
  816. package/project/.sdk/tm/dart/lib/utility/MakeOptionsUtility.dart +0 -233
  817. package/project/.sdk/tm/dart/lib/utility/MakePointUtility.dart +0 -130
  818. package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +0 -66
  819. package/project/.sdk/tm/dart/lib/utility/MakeResponseUtility.dart +0 -59
  820. package/project/.sdk/tm/dart/lib/utility/MakeResultUtility.dart +0 -49
  821. package/project/.sdk/tm/dart/lib/utility/MakeSpecUtility.dart +0 -77
  822. package/project/.sdk/tm/dart/lib/utility/MakeUrlUtility.dart +0 -51
  823. package/project/.sdk/tm/dart/lib/utility/ParamUtility.dart +0 -56
  824. package/project/.sdk/tm/dart/lib/utility/PrepareAuthUtility.dart +0 -46
  825. package/project/.sdk/tm/dart/lib/utility/PrepareBodyUtility.dart +0 -19
  826. package/project/.sdk/tm/dart/lib/utility/PrepareHeadersUtility.dart +0 -11
  827. package/project/.sdk/tm/dart/lib/utility/PrepareMethodUtility.dart +0 -30
  828. package/project/.sdk/tm/dart/lib/utility/PrepareParamsUtility.dart +0 -23
  829. package/project/.sdk/tm/dart/lib/utility/PreparePathUtility.dart +0 -9
  830. package/project/.sdk/tm/dart/lib/utility/PrepareQueryUtility.dart +0 -18
  831. package/project/.sdk/tm/dart/lib/utility/ResultBasicUtility.dart +0 -29
  832. package/project/.sdk/tm/dart/lib/utility/ResultBodyUtility.dart +0 -15
  833. package/project/.sdk/tm/dart/lib/utility/ResultHeadersUtility.dart +0 -18
  834. package/project/.sdk/tm/dart/lib/utility/StructUtility.dart +0 -127
  835. package/project/.sdk/tm/dart/lib/utility/TransformRequestUtility.dart +0 -28
  836. package/project/.sdk/tm/dart/lib/utility/TransformResponseUtility.dart +0 -44
  837. package/project/.sdk/tm/dart/lib/utility/Utility.dart +0 -239
  838. package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +0 -2462
  839. package/project/.sdk/tm/dart/src/feature/README.md +0 -3
  840. package/project/.sdk/tm/dart/src/feature/proxy/.gitkeep +0 -0
  841. package/project/.sdk/tm/dart/src/feature/ratelimit/.gitkeep +0 -0
  842. package/project/.sdk/tm/dart/src/feature/rbac/.gitkeep +0 -0
  843. package/project/.sdk/tm/dart/src/feature/retry/.gitkeep +0 -0
  844. package/project/.sdk/tm/dart/src/feature/streaming/.gitkeep +0 -0
  845. package/project/.sdk/tm/dart/src/feature/telemetry/.gitkeep +0 -0
  846. package/project/.sdk/tm/dart/src/feature/test/.gitkeep +0 -0
  847. package/project/.sdk/tm/dart/src/feature/timeout/.gitkeep +0 -0
  848. package/project/.sdk/tm/dart/test/custom_test.dart +0 -65
  849. package/project/.sdk/tm/dart/test/exists_test.dart +0 -12
  850. package/project/.sdk/tm/dart/test/feature/harness.dart +0 -329
  851. package/project/.sdk/tm/dart/test/feature_test.dart +0 -1193
  852. package/project/.sdk/tm/dart/test/harness.dart +0 -153
  853. package/project/.sdk/tm/dart/test/netsim_test.dart +0 -48
  854. package/project/.sdk/tm/dart/test/omni.dart +0 -520
  855. package/project/.sdk/tm/dart/test/omni_smoke_test.dart +0 -143
  856. package/project/.sdk/tm/dart/test/pipeline_test.dart +0 -608
  857. package/project/.sdk/tm/dart/test/primary_test.dart +0 -476
  858. package/project/.sdk/tm/dart/test/sdk-test-control.json +0 -19
  859. package/project/.sdk/tm/dart/test/struct_test.dart +0 -468
  860. package/project/.sdk/tm/dart/test/utility.dart +0 -198
  861. package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +0 -7
  862. package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +0 -653
  863. package/project/.sdk/tm/dart/test/vendor/omni/util.dart +0 -232
  864. package/project/.sdk/tm/lean/LICENSE +0 -21
  865. package/project/.sdk/tm/lean/Makefile +0 -32
  866. package/project/.sdk/tm/lean/VERSION +0 -1
  867. package/project/.sdk/tm/lean/src/SdkFeature.lean +0 -171
  868. package/project/.sdk/tm/lean/src/SdkFeatures.lean +0 -787
  869. package/project/.sdk/tm/lean/src/SdkJson.lean +0 -134
  870. package/project/.sdk/tm/lean/src/SdkRuntime.lean +0 -374
  871. package/project/.sdk/tm/lean/src/SdkUtility.lean +0 -809
  872. package/project/.sdk/tm/lean/src/VoxgigStruct.lean +0 -2880
  873. package/project/.sdk/tm/lean/src/Vregex.lean +0 -412
  874. package/project/.sdk/tm/lean/src/feature/README.md +0 -5
  875. package/project/.sdk/tm/lean/src/feature/audit/.gitkeep +0 -0
  876. package/project/.sdk/tm/lean/src/feature/base/.gitkeep +0 -0
  877. package/project/.sdk/tm/lean/src/feature/cache/.gitkeep +0 -0
  878. package/project/.sdk/tm/lean/src/feature/clienttrack/.gitkeep +0 -0
  879. package/project/.sdk/tm/lean/src/feature/cost/.gitkeep +0 -0
  880. package/project/.sdk/tm/lean/src/feature/debug/.gitkeep +0 -0
  881. package/project/.sdk/tm/lean/src/feature/idempotency/.gitkeep +0 -0
  882. package/project/.sdk/tm/lean/src/feature/log/.gitkeep +0 -0
  883. package/project/.sdk/tm/lean/src/feature/metrics/.gitkeep +0 -0
  884. package/project/.sdk/tm/lean/src/feature/netsim/.gitkeep +0 -0
  885. package/project/.sdk/tm/lean/src/feature/paging/.gitkeep +0 -0
  886. package/project/.sdk/tm/lean/src/feature/proxy/.gitkeep +0 -0
  887. package/project/.sdk/tm/lean/src/feature/ratelimit/.gitkeep +0 -0
  888. package/project/.sdk/tm/lean/src/feature/rbac/.gitkeep +0 -0
  889. package/project/.sdk/tm/lean/src/feature/retry/.gitkeep +0 -0
  890. package/project/.sdk/tm/lean/src/feature/streaming/.gitkeep +0 -0
  891. package/project/.sdk/tm/lean/src/feature/telemetry/.gitkeep +0 -0
  892. package/project/.sdk/tm/lean/src/feature/test/.gitkeep +0 -0
  893. package/project/.sdk/tm/lean/src/feature/timeout/.gitkeep +0 -0
  894. package/project/.sdk/tm/lean/test/OmniResolver.lean +0 -358
  895. package/project/.sdk/tm/lean/test/OmniSmoke.lean +0 -174
  896. package/project/.sdk/tm/lean/test/StructCorpus.lean +0 -368
  897. package/project/.sdk/tm/lean/test/TFeature.lean +0 -281
  898. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +0 -227
  899. package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +0 -997
  900. package/project/.sdk/tm/seneca-provider/CODE_OF_CONDUCT.md +0 -132
  901. package/project/.sdk/tm/seneca-provider/LICENSE +0 -21
  902. package/project/.sdk/tm/seneca-provider/Makefile +0 -15
  903. package/project/.sdk/tm/seneca-provider/src/tsconfig.json +0 -18
  904. package/project/.sdk/tm/seneca-provider/test/tsconfig.json +0 -16
  905. package/project/.sdk/tm/seneca-provider/tsfmt.json +0 -3
  906. package/project/.sdk/tm/zig/test/struct_runner.zig +0 -465
  907. /package/project/.sdk/tm/{dart/src/feature/audit → clojure/src/feature/secrets}/.gitkeep +0 -0
  908. /package/project/.sdk/tm/{dart/src/feature/base → csharp/src/feature/secrets}/.gitkeep +0 -0
  909. /package/project/.sdk/tm/{dart/src/feature/cache → elixir/src/feature/secrets}/.gitkeep +0 -0
  910. /package/project/.sdk/tm/{dart/src/feature/clienttrack → java/src/feature/secrets}/.gitkeep +0 -0
  911. /package/project/.sdk/tm/{dart/src/feature/cost → kotlin/src/feature/secrets}/.gitkeep +0 -0
  912. /package/project/.sdk/tm/{dart/src/feature/debug → perl/src/feature/secrets}/.gitkeep +0 -0
  913. /package/project/.sdk/tm/{dart/src/feature/idempotency → php/src/feature/secrets}/.gitkeep +0 -0
  914. /package/project/.sdk/tm/{dart/src/feature/log → rb/src/feature/secrets}/.gitkeep +0 -0
  915. /package/project/.sdk/tm/{dart/src/feature/metrics → rust/src/feature/secrets}/.gitkeep +0 -0
  916. /package/project/.sdk/tm/{dart/src/feature/netsim → scala/src/feature/secrets}/.gitkeep +0 -0
  917. /package/project/.sdk/tm/{dart/src/feature/paging → swift/src/feature/secrets}/.gitkeep +0 -0
@@ -0,0 +1,1072 @@
1
+ # Behavioural tests for the secrets feature (vendored @voxgig/sekreto).
2
+ #
3
+ # The contract under test: the `apikey` OPTION keeps its exact old meaning
4
+ # and always wins, because ProjectName.Feature.Secrets places it FIRST in the
5
+ # provider chain (a `memory` store named `options`) - explicit-beats-lookup
6
+ # falls out of sekreto's first-hit rule rather than from special-case logic.
7
+ # With the feature inactive nothing changes at all. With it active and the
8
+ # option unset, the chain (env, dotenv, a custom provider, a vault) supplies
9
+ # the credential instead.
10
+ #
11
+ # EVERY CASE BUILDS A LIVE CLIENT WITH A RECORDING `system.fetch`, and asserts
12
+ # on what that recorder saw. That is not incidental - it is the whole point.
13
+ # This feature resolves at the TRANSPORT SEAM (see the header of
14
+ # feature/secrets.ex), so `prepare/2` returns before any lookup has happened
15
+ # and a header assertion taken there would pass for an SDK with no secrets
16
+ # feature at all. And ProjectName.test/2 REPLACES the fetcher with the test
17
+ # feature's in-memory mock, so a counter hung off `system.fetch` is never
18
+ # reached under it: "no request was sent" and "the request failed" would both
19
+ # hold for a healthy SDK, and the pair would assert nothing. An assertion that
20
+ # cannot fail pins no rule.
21
+ #
22
+ # So each fail-closed case proves its own counter FIRST, with the same
23
+ # construction and a WORKING provider: one request must reach `system.fetch`
24
+ # carrying the resolved credential. Only then does a zero from the broken
25
+ # provider mean REFUSED rather than UNWIRED. And the failure is matched on the
26
+ # PROVIDER'S OWN message, so an unrelated failure (a missing route, a blocked
27
+ # op) cannot stand in for fail-closed.
28
+ #
29
+ # This file lives in the `feature/` container on purpose: `target add` trims
30
+ # it, along with the feature source and the vendored library, for a project
31
+ # whose model does not select `secrets`.
32
+
33
+ defmodule ProjectName.SecretsTest do
34
+ use ExUnit.Case
35
+
36
+ alias Voxgig.Struct, as: S
37
+ alias ProjectName.Feature.Secrets
38
+
39
+ @envprefix "PROJECTENV_TEST_SECRETS_"
40
+ @base "http://raw.test/api"
41
+
42
+ # ---- the recorder --------------------------------------------------------
43
+
44
+ # A transport that records every call it is handed, so "sent" is a fact
45
+ # about the wire rather than about a mock. ETS rather than an Agent: this
46
+ # is the thing the fail-closed assertions count, and it must outlive
47
+ # anything the SDK does to its own processes.
48
+ defp recorder(opts \\ %{}) do
49
+ t = :ets.new(:secrets_recorder, [:public, :set])
50
+ :ets.insert(t, {:calls, []})
51
+ :ets.insert(t, {:issued, 0})
52
+ :ets.insert(t, {:apicall, -1})
53
+
54
+ path = Map.get(opts, :path, "auth/token")
55
+ tokens = Map.get(opts, :tokens, ["ACCESS01", "ACCESS02", "ACCESS03"])
56
+ apistatus = Map.get(opts, :api, [200])
57
+ resfield = Map.get(opts, :response, "access_token")
58
+ tokenfail = Map.get(opts, :tokenfail, nil)
59
+
60
+ fetch = fn url, fetchdef ->
61
+ headers = S.getprop(fetchdef, "headers")
62
+
63
+ auth =
64
+ if S.ismap(headers),
65
+ do: ProjectName.Feature.header_get(headers, "authorization"),
66
+ else: nil
67
+
68
+ [{:calls, cs}] = :ets.lookup(t, :calls)
69
+
70
+ :ets.insert(t,
71
+ {:calls, cs ++ [%{url: url, auth: auth, body: S.getprop(fetchdef, "body")}]})
72
+
73
+ if String.ends_with?(url, "/" <> path) do
74
+ [{:issued, i}] = :ets.lookup(t, :issued)
75
+ :ets.insert(t, {:issued, i + 1})
76
+
77
+ if tokenfail != nil and i + 1 >= tokenfail do
78
+ {S.jm(["status", 500, "json", fn -> S.jm([]) end, "headers", S.jm([])]), nil}
79
+ else
80
+ token = Enum.at(tokens, min(i, length(tokens) - 1))
81
+ {S.jm(["status", 200, "json", fn -> S.jm([resfield, token]) end, "headers", S.jm([])]), nil}
82
+ end
83
+ else
84
+ [{:apicall, a}] = :ets.lookup(t, :apicall)
85
+ a = a + 1
86
+ :ets.insert(t, {:apicall, a})
87
+ status = Enum.at(apistatus, min(a, length(apistatus) - 1))
88
+
89
+ {S.jm([
90
+ "status", status,
91
+ "statusText", if(status < 400, do: "OK", else: "ERR"),
92
+ "json", fn -> S.jm(["ok", status < 400]) end,
93
+ "headers", S.jm([])
94
+ ]), nil}
95
+ end
96
+ end
97
+
98
+ %{table: t, fetch: fetch, path: path}
99
+ end
100
+
101
+ defp calls(r), do: :ets.lookup(r.table, :calls) |> hd() |> elem(1)
102
+
103
+ # Only the calls that went to the API, in order - a token purchase is not
104
+ # an API call and must never be counted as one.
105
+ defp api(r), do: calls(r) |> Enum.reject(&String.ends_with?(&1.url, "/" <> r.path))
106
+ defp token(r), do: calls(r) |> Enum.filter(&String.ends_with?(&1.url, "/" <> r.path))
107
+
108
+ # What went out, for a failure message that names the leak rather than just
109
+ # its count.
110
+ defp wire(r) do
111
+ calls(r) |> Enum.map_join(", ", fn c -> c.url <> " auth=" <> inspect(c.auth) end)
112
+ end
113
+
114
+ # ---- construction --------------------------------------------------------
115
+
116
+ # `allow.op` is named explicitly: a project that narrows the default set
117
+ # would otherwise turn the raw-path cases into a false RED (the control leg
118
+ # refused before it reached the transport), and the rule under test lives
119
+ # at the transport, downstream of the allow gate either way.
120
+ defp sdk(r, extra) do
121
+ opts =
122
+ S.jm([
123
+ "base", @base,
124
+ "allow", S.jm(["op", "direct,graphql,list,load"]),
125
+ "system", S.jm(["fetch", r.fetch])
126
+ ])
127
+
128
+ Enum.each(extra, fn {k, v} -> S.setprop(opts, k, v) end)
129
+ ProjectName.new(opts)
130
+ end
131
+
132
+ defp secrets(fopts) do
133
+ node = S.jm(["active", true])
134
+ Enum.each(fopts, fn {k, v} -> S.setprop(node, k, v) end)
135
+ S.jm(["secrets", node])
136
+ end
137
+
138
+ defp providers(list), do: S.jt(list)
139
+
140
+ defp envchain(extra \\ []) do
141
+ secrets([{"providers", providers([S.jm(["kind", "env", "prefix", @envprefix])])} | extra])
142
+ end
143
+
144
+ defp spec(pairs), do: S.jm(pairs)
145
+
146
+ # ---- providers -----------------------------------------------------------
147
+
148
+ # Live provider maps, duck-typed on `lookup/1` exactly as
149
+ # Sekreto.Provider.provider?/1 is.
150
+ defp working(value \\ "RAWKEY01", name \\ "apikey") do
151
+ %{
152
+ lookup: fn n -> if n == name, do: value, else: nil end,
153
+ describe: fn -> "working:test" end
154
+ }
155
+ end
156
+
157
+ defp broken do
158
+ %{
159
+ lookup: fn _n -> raise Sekreto.Error, message: "vault unreachable" end,
160
+ describe: fn -> "broken:test" end
161
+ }
162
+ end
163
+
164
+ # ---- assertions ----------------------------------------------------------
165
+
166
+ # The authorization header carries the SPEC's credential prefix, which a
167
+ # TEMPLATE cannot know: an OpenAPI `http`/`bearer` scheme gives
168
+ # `Bearer <token>`, an apiKey scheme the raw token. So assert on the
169
+ # CREDENTIAL and let the prefix be whatever this SDK's API declares -
170
+ # pinning the whole header value passes only for a prefix-less API, and
171
+ # this file ships to every project that selects the feature.
172
+ defp credential_is(header, token) do
173
+ got = if is_binary(header), do: header, else: ""
174
+
175
+ assert got == token or String.ends_with?(got, " " <> token),
176
+ "expected the Authorization header to carry " <> token <> ", got: " <> inspect(header)
177
+ end
178
+
179
+ defp auth_is(call, token), do: credential_is(if(call == nil, do: nil, else: call.auth), token)
180
+
181
+ # Does this options value CARRY the token - bare, or under the spec's
182
+ # prefix? The negative half of credential_is, for the assertions that pin
183
+ # where a credential must NOT be.
184
+ defp credential?(value, token) do
185
+ is_binary(value) and (value == token or String.ends_with?(value, " " <> token))
186
+ end
187
+
188
+ defp err_message(res) do
189
+ e = S.getprop(res, "err")
190
+
191
+ cond do
192
+ is_exception(e) -> Exception.message(e)
193
+ is_binary(e) -> e
194
+ true -> inspect(e)
195
+ end
196
+ end
197
+
198
+ setup do
199
+ System.delete_env(@envprefix <> "APIKEY")
200
+ System.delete_env(@envprefix <> "REFRESH_TOKEN")
201
+ System.delete_env(@envprefix <> "API_TOKEN")
202
+
203
+ on_exit(fn ->
204
+ System.delete_env(@envprefix <> "APIKEY")
205
+ System.delete_env(@envprefix <> "REFRESH_TOKEN")
206
+ System.delete_env(@envprefix <> "API_TOKEN")
207
+ end)
208
+
209
+ :ok
210
+ end
211
+
212
+ describe "secrets" do
213
+ test "inactive: the apikey option behaves exactly as before" do
214
+ r = recorder()
215
+ client = sdk(r, [{"apikey", "OPTKEY01"}])
216
+
217
+ assert S.getprop(ProjectName.direct(client, S.jm(["path", "/thing"])), "ok") == true
218
+ assert length(api(r)) == 1
219
+ auth_is(hd(api(r)), "OPTKEY01")
220
+
221
+ # No feature, no instance: the accessor is the only way in.
222
+ assert Secrets.feature(client) == nil
223
+ assert Secrets.sekreto(client) == nil
224
+ end
225
+
226
+ test "inactive: no apikey means no authorization header" do
227
+ r = recorder()
228
+ client = sdk(r, [])
229
+ ProjectName.direct(client, S.jm(["path", "/thing"]))
230
+
231
+ assert hd(api(r)).auth == nil
232
+ end
233
+
234
+ test "active: the apikey option still wins over the chain" do
235
+ System.put_env(@envprefix <> "APIKEY", "ENVKEY01")
236
+
237
+ r = recorder()
238
+ client = sdk(r, [{"apikey", "OPTKEY01"}, {"feature", envchain()}])
239
+ ProjectName.direct(client, S.jm(["path", "/thing"]))
240
+
241
+ auth_is(hd(api(r)), "OPTKEY01")
242
+
243
+ # The explicit option is a real store, not a special case: a directed
244
+ # read names it like any other.
245
+ assert Sekreto.getfrom(Secrets.sekreto(client), "options", "apikey") == "OPTKEY01"
246
+ end
247
+
248
+ # The three ways an apikey can be "not given", pinned together because
249
+ # they are easy to conflate and only one of them is a suppression.
250
+ #
251
+ # make_options normalises an omitted apikey to "" before features
252
+ # initialise, so by init time omitted and explicit-empty are
253
+ # indistinguishable - both defer to the chain, deliberately.
254
+
255
+ test "active: an OMITTED apikey defers to the chain" do
256
+ System.put_env(@envprefix <> "APIKEY", "ENVKEY01")
257
+
258
+ r = recorder()
259
+ ProjectName.direct(sdk(r, [{"feature", envchain()}]), S.jm(["path", "/thing"]))
260
+
261
+ auth_is(hd(api(r)), "ENVKEY01")
262
+ end
263
+
264
+ test "active: an explicitly EMPTY apikey also defers to the chain" do
265
+ System.put_env(@envprefix <> "APIKEY", "ENVKEY01")
266
+
267
+ r = recorder()
268
+ ProjectName.direct(sdk(r, [{"apikey", ""}, {"feature", envchain()}]), S.jm(["path", "/thing"]))
269
+
270
+ auth_is(hd(api(r)), "ENVKEY01")
271
+ end
272
+
273
+ # `auth: nil` - the documented way to disable auth outright, which
274
+ # prepare_auth honours before it ever reads the apikey.
275
+ #
276
+ # This needs an explicit guard because struct 0.3.2 nearly removed it in
277
+ # silence: a stored null began reading as "no value", so the optspec's
278
+ # default auth map fired instead and the suppression became "use default
279
+ # auth" - transmitting a credential the caller explicitly asked not to
280
+ # send. make_options now captures suppliedness BEFORE validate and
281
+ # restores the nil after it.
282
+ test "active: auth nil suppresses the credential, chain or no chain" do
283
+ System.put_env(@envprefix <> "APIKEY", "ENVKEY01")
284
+
285
+ r = recorder()
286
+ client = sdk(r, [{"auth", nil}, {"feature", envchain()}])
287
+ ProjectName.direct(client, S.jm(["path", "/thing"]))
288
+
289
+ # Nothing on the wire, even though the chain would have resolved.
290
+ assert length(api(r)) == 1
291
+ assert hd(api(r)).auth == nil
292
+
293
+ # The suppression survives option validation rather than being replaced
294
+ # by the optspec's default auth map.
295
+ assert S.getprop(ProjectName.options_map(client), "auth") == nil
296
+ end
297
+
298
+ test "active: auth nil suppresses an EXPLICIT apikey too" do
299
+ r = recorder()
300
+
301
+ client =
302
+ sdk(r, [{"apikey", "OPTKEY01"}, {"auth", nil}, {"feature", envchain()}])
303
+
304
+ ProjectName.direct(client, S.jm(["path", "/thing"]))
305
+
306
+ assert hd(api(r)).auth == nil
307
+ end
308
+
309
+ test "active: custom provider maps are accepted verbatim" do
310
+ asked = :ets.new(:asked, [:public, :set])
311
+ :ets.insert(asked, {:names, []})
312
+
313
+ custom = %{
314
+ lookup: fn n ->
315
+ [{:names, ns}] = :ets.lookup(asked, :names)
316
+ :ets.insert(asked, {:names, ns ++ [n]})
317
+ "CUSTOM01"
318
+ end,
319
+ describe: fn -> "custom:test" end
320
+ }
321
+
322
+ r = recorder()
323
+
324
+ ProjectName.direct(
325
+ sdk(r, [{"feature", secrets([{"providers", providers([custom])}])}]),
326
+ S.jm(["path", "/thing"])
327
+ )
328
+
329
+ auth_is(hd(api(r)), "CUSTOM01")
330
+ assert (:ets.lookup(asked, :names) |> hd() |> elem(1)) == ["apikey"]
331
+ end
332
+
333
+ test "active: a miss everywhere leaves the header off and the request still goes" do
334
+ r = recorder()
335
+ client = sdk(r, [{"feature", envchain()}])
336
+
337
+ assert S.getprop(ProjectName.direct(client, S.jm(["path", "/thing"])), "ok") == true
338
+ assert length(api(r)) == 1
339
+ assert hd(api(r)).auth == nil
340
+ assert Secrets.credential(client) == ""
341
+ end
342
+
343
+ # WHERE THE CREDENTIAL LIVES: in feature state, NEVER in the shared
344
+ # options map. That is the structural choice the header of
345
+ # feature/secrets.ex spends two paragraphs on - the options node is the
346
+ # client's single live struct node, read raw by every concurrent
347
+ # operation, so a feature that wrote into it would race them - and
348
+ # nothing else here would notice it being undone: publish the resolved
349
+ # token into `_liveopts` before `reauth` and every case above stays
350
+ # green, because the wire sees the same header either way.
351
+ #
352
+ # So this pins the map itself, on BOTH sides of a resolution, and the
353
+ # control leg comes first: the request must reach the transport exactly
354
+ # once carrying the credential, or an unchanged map proves nothing (an
355
+ # unwired feature leaves it unchanged too).
356
+ test "active: a resolved credential lives in feature state, never in the options map" do
357
+ r = recorder()
358
+ client = sdk(r, [{"feature", secrets([{"providers", providers([working()])}])}])
359
+
360
+ # What the map holds BEFORE anything is resolved. make_options
361
+ # normalises an omitted apikey to "", and that is what must survive.
362
+ before = S.getprop(ProjectName.options_map(client), "apikey")
363
+ refute credential?(before, "RAWKEY01")
364
+
365
+ assert S.getprop(ProjectName.direct(client, S.jm(["path", "/thing"])), "ok") == true
366
+
367
+ # CONTROL: resolved, injected, sent - exactly once.
368
+ assert length(api(r)) == 1,
369
+ "the control request never reached system.fetch, so this test cannot" <>
370
+ " observe whether the credential was resolved at all"
371
+
372
+ auth_is(hd(api(r)), "RAWKEY01")
373
+ assert Secrets.credential(client) == "RAWKEY01", "the feature state holds the credential"
374
+
375
+ # THE RULE. The public clone, and the live node behind it - the one
376
+ # prepare_auth clones on every request and the feature keeps as
377
+ # `_liveopts` - both unchanged, and neither carrying the token.
378
+ after_ = S.getprop(ProjectName.options_map(client), "apikey")
379
+
380
+ assert after_ == before,
381
+ "resolving the credential changed options.apikey from " <>
382
+ inspect(before) <> " to " <> inspect(after_) <>
383
+ " - the credential must live in feature state, not in the shared options map"
384
+
385
+ refute credential?(after_, "RAWKEY01"),
386
+ "the resolved credential was published into the options map"
387
+
388
+ live = S.getprop(S.getprop(client, "options"), "apikey")
389
+
390
+ assert live == before,
391
+ "the LIVE options node was written: " <> inspect(live)
392
+
393
+ # And a second request, which must be answered from feature state
394
+ # rather than from a map the first one populated.
395
+ ProjectName.direct(client, S.jm(["path", "/again"]))
396
+ assert length(api(r)) == 2
397
+ auth_is(Enum.at(api(r), 1), "RAWKEY01")
398
+ assert S.getprop(ProjectName.options_map(client), "apikey") == before
399
+ end
400
+
401
+ # sekreto's miss-vs-error invariant: a MISS falls through to the next
402
+ # provider, an ERROR does not. A broken vault must never degrade into an
403
+ # unauthenticated request.
404
+ #
405
+ # THE RAW PATHS RUN NO FEATURE HOOKS AT ALL. If resolution lived only in
406
+ # a hook these would send unauthenticated and never notice; they are
407
+ # covered because the wrapper sits on the fetcher slot, which
408
+ # raw_request/2 reaches through the same late-bound Utility.fetcher/3.
409
+
410
+ test "active: a provider ERROR fails direct() rather than sending" do
411
+ # THE RULE, asserted first so a regression reports the leak itself.
412
+ r = recorder()
413
+ res = ProjectName.direct(
414
+ sdk(r, [{"feature", secrets([{"providers", providers([broken()])}])}]),
415
+ S.jm(["path", "/thing"]))
416
+
417
+ assert api(r) == [],
418
+ "a request must not go out unauthenticated because a provider broke," <>
419
+ " but one reached the transport: " <> wire(r)
420
+
421
+ assert S.getprop(res, "ok") == false
422
+ assert err_message(res) =~ "vault unreachable"
423
+
424
+ # CONTROL, which makes that empty list mean REFUSED rather than
425
+ # UNWIRED: the same construction with a WORKING provider must reach the
426
+ # same transport, once, carrying the credential.
427
+ c = recorder()
428
+ ok = ProjectName.direct(
429
+ sdk(c, [{"feature", secrets([{"providers", providers([working()])}])}]),
430
+ S.jm(["path", "/thing"]))
431
+
432
+ assert S.getprop(ok, "ok") == true, "the control request failed: " <> inspect(ok)
433
+
434
+ assert length(api(c)) == 1,
435
+ "the control request never reached system.fetch, so this test cannot" <>
436
+ " observe a request going out at all"
437
+
438
+ auth_is(hd(api(c)), "RAWKEY01")
439
+ end
440
+
441
+ test "active: a provider ERROR fails graphql() rather than sending" do
442
+ r = recorder()
443
+ res = ProjectName.graphql(
444
+ sdk(r, [{"feature", secrets([{"providers", providers([broken()])}])}]),
445
+ "{ thing }", S.jm([]))
446
+
447
+ assert api(r) == [],
448
+ "a graphql request must not go out unauthenticated," <>
449
+ " but one reached the transport: " <> wire(r)
450
+
451
+ assert S.getprop(res, "ok") == false
452
+ assert err_message(res) =~ "vault unreachable"
453
+
454
+ c = recorder()
455
+ ok = ProjectName.graphql(
456
+ sdk(c, [{"feature", secrets([{"providers", providers([working()])}])}]),
457
+ "{ thing }", S.jm([]))
458
+
459
+ assert S.getprop(ok, "ok") == true, "the control request failed: " <> inspect(ok)
460
+
461
+ assert length(api(c)) == 1,
462
+ "the control request never reached system.fetch, so this test cannot" <>
463
+ " observe a request going out at all"
464
+
465
+ auth_is(hd(api(c)), "RAWKEY01")
466
+ end
467
+
468
+ # THE ENTITY PATH, which DOES run the hook pipeline - the other half of
469
+ # the seam. Resolution is at the transport for both, so one rule covers
470
+ # them; this proves it rather than assuming it.
471
+ #
472
+ # The entity is discovered from the SDK's own config rather than named,
473
+ # because this file is a TEMPLATE: it ships to every project, and no
474
+ # project's entity names are known here.
475
+ test "active: a provider ERROR fails an ENTITY op rather than sending" do
476
+ r = recorder()
477
+ client = sdk(r, [{"feature", secrets([{"providers", providers([broken()])}])}])
478
+
479
+ case list_op(client) do
480
+ nil ->
481
+ # An SDK with no listable entity has no entity path to exercise.
482
+ :ok
483
+
484
+ op ->
485
+ # The op FAILS - that is the point - and by default an entity op
486
+ # raises rather than returning its error, so the refusal is caught
487
+ # here and matched on the PROVIDER'S OWN message. An unrelated
488
+ # failure (a blocked op, a missing route) must not stand in for
489
+ # fail-closed.
490
+ assert opfail(op) =~ "vault unreachable",
491
+ "the entity op did not fail with the provider's own error: " <> opfail(op)
492
+
493
+ assert api(r) == [],
494
+ "an entity op must not go out unauthenticated because a provider" <>
495
+ " broke, but one reached the transport: " <> wire(r)
496
+
497
+ c = recorder()
498
+ control = sdk(c, [{"feature", secrets([{"providers", providers([working()])}])}])
499
+
500
+ # The control op itself may fail on the stub's response shape -
501
+ # irrelevant here. What matters is that the request reached the
502
+ # transport carrying the resolved credential.
503
+ opfail(list_op(control))
504
+
505
+ assert length(api(c)) == 1,
506
+ "the control entity op never reached system.fetch, so this test" <>
507
+ " cannot observe a request going out at all"
508
+
509
+ auth_is(hd(api(c)), "RAWKEY01")
510
+ end
511
+ end
512
+
513
+ # A MALFORMED chain entry is a refusal, not a shorter chain. `providers:
514
+ # ["hashicorp"]` - the bare kind where a spec map was meant - is neither
515
+ # a provider nor a spec, and the feature used to DROP it silently: the
516
+ # chain was then empty, every provider "missed", and the request went
517
+ # out unauthenticated. Fail-open from a typo. Now the entry raises with
518
+ # sekreto's own wording at init, that error is held as the init failure,
519
+ # and the transport gate refuses every path on it - entity, direct AND
520
+ # graphql - because the gate sits on the fetcher slot the raw paths
521
+ # (which run no feature hooks at all) reach through Utility.fetcher/3.
522
+ #
523
+ # The control leg comes FIRST, with the same construction and a WORKING
524
+ # provider, so that an empty recorder means REFUSED rather than UNWIRED.
525
+ test "active: a malformed providers entry refuses every path rather than being dropped" do
526
+ # CONTROL: a well-formed chain reaches the transport once, credentialed.
527
+ c = recorder()
528
+ control = sdk(c, [{"feature", secrets([{"providers", providers([working()])}])}])
529
+ assert S.getprop(ProjectName.direct(control, S.jm(["path", "/thing"])), "ok") == true
530
+
531
+ assert length(api(c)) == 1,
532
+ "the control request never reached system.fetch, so this test cannot" <>
533
+ " observe a request going out at all"
534
+
535
+ auth_is(hd(api(c)), "RAWKEY01")
536
+
537
+ # THE RULE, on all three wire paths, with NO apikey so a dropped entry
538
+ # would leave nothing to send and the leak would be an unauthenticated
539
+ # request rather than a wrong credential.
540
+ r = recorder()
541
+ client = sdk(r, [{"feature", secrets([{"providers", providers(["hashicorp"])}])}])
542
+
543
+ direct = ProjectName.direct(client, S.jm(["path", "/thing"]))
544
+ assert S.getprop(direct, "ok") == false, "direct() went out on a malformed chain"
545
+
546
+ assert err_message(direct) =~ "not a provider or a provider spec",
547
+ "direct() did not fail with sekreto's own refusal: " <> err_message(direct)
548
+
549
+ assert err_message(direct) =~ "hashicorp",
550
+ "the refusal does not name the offending entry: " <> err_message(direct)
551
+
552
+ gql = ProjectName.graphql(client, "{ thing }", S.jm([]))
553
+ assert S.getprop(gql, "ok") == false, "graphql() went out on a malformed chain"
554
+ assert err_message(gql) =~ "not a provider or a provider spec"
555
+
556
+ case list_op(client) do
557
+ nil ->
558
+ # An SDK with no listable entity has no entity path to exercise;
559
+ # the two raw paths above still hold the rule.
560
+ :ok
561
+
562
+ op ->
563
+ assert opfail(op) =~ "not a provider or a provider spec",
564
+ "the entity op did not fail with sekreto's own refusal: " <> opfail(op)
565
+ end
566
+
567
+ assert api(r) == [],
568
+ "a request must not go out because a malformed entry was dropped from" <>
569
+ " the chain, but one reached the transport: " <> wire(r)
570
+
571
+ assert token(r) == []
572
+ end
573
+
574
+ # A settled failure must not be held. Holding one meant a transient vault
575
+ # outage poisoned the client permanently: every later operation kept
576
+ # failing with the original error long after the vault recovered.
577
+ test "active: a provider recovers after a transient failure" do
578
+ n = :counters.new(1, [])
579
+
580
+ flaky = %{
581
+ lookup: fn _ ->
582
+ :counters.add(n, 1, 1)
583
+
584
+ if :counters.get(n, 1) == 1 do
585
+ raise Sekreto.Error, message: "vault unreachable"
586
+ else
587
+ "RECOVERED01"
588
+ end
589
+ end,
590
+ describe: fn -> "flaky:test" end
591
+ }
592
+
593
+ r = recorder()
594
+ client = sdk(r, [{"feature", secrets([{"providers", providers([flaky])}])}])
595
+
596
+ first = ProjectName.direct(client, S.jm(["path", "/one"]))
597
+ assert S.getprop(first, "ok") == false, "the first attempt should surface the outage"
598
+ assert api(r) == []
599
+
600
+ second = ProjectName.direct(client, S.jm(["path", "/two"]))
601
+ assert S.getprop(second, "ok") == true, "the second attempt should recover"
602
+ assert length(api(r)) == 1
603
+ auth_is(hd(api(r)), "RECOVERED01")
604
+ end
605
+
606
+ # `cache: false` is documented as "every resolve asks the chain again".
607
+ # Keeping the settled result made that a lie.
608
+ test "active: cache false asks the chain on every request" do
609
+ n = :counters.new(1, [])
610
+
611
+ counting = %{
612
+ lookup: fn _ ->
613
+ :counters.add(n, 1, 1)
614
+ "KEY" <> Integer.to_string(:counters.get(n, 1))
615
+ end,
616
+ describe: fn -> "counting:test" end
617
+ }
618
+
619
+ r = recorder()
620
+
621
+ client =
622
+ sdk(r, [{"feature", secrets([{"cache", false}, {"providers", providers([counting])}])}])
623
+
624
+ ProjectName.direct(client, S.jm(["path", "/one"]))
625
+ ProjectName.direct(client, S.jm(["path", "/two"]))
626
+
627
+ assert :counters.get(n, 1) > 1,
628
+ "the chain was asked once and cached, despite cache: false"
629
+
630
+ auth_is(Enum.at(api(r), 0), "KEY1")
631
+ auth_is(Enum.at(api(r), 1), "KEY2")
632
+ end
633
+
634
+ test "active: caching on asks the chain once" do
635
+ n = :counters.new(1, [])
636
+ counting = %{
637
+ lookup: fn _ -> :counters.add(n, 1, 1); "CACHED01" end,
638
+ describe: fn -> "counting:test" end
639
+ }
640
+
641
+ r = recorder()
642
+ client = sdk(r, [{"feature", secrets([{"providers", providers([counting])}])}])
643
+
644
+ ProjectName.direct(client, S.jm(["path", "/one"]))
645
+ ProjectName.direct(client, S.jm(["path", "/two"]))
646
+
647
+ assert :counters.get(n, 1) == 1
648
+ assert length(api(r)) == 2
649
+ auth_is(Enum.at(api(r), 1), "CACHED01")
650
+ end
651
+
652
+ test "active: the secret name is configurable" do
653
+ System.put_env(@envprefix <> "API_TOKEN", "TOKKEY01")
654
+
655
+ r = recorder()
656
+ ProjectName.direct(sdk(r, [{"feature", envchain([{"name", "api.token"}])}]),
657
+ S.jm(["path", "/thing"]))
658
+
659
+ auth_is(hd(api(r)), "TOKKEY01")
660
+ end
661
+
662
+ test "active: sekreto is live for arbitrary secrets and redaction" do
663
+ r = recorder()
664
+
665
+ client =
666
+ sdk(r, [{"feature",
667
+ secrets([{"providers",
668
+ providers([spec(["kind", "memory", "values", S.jm(["DB_PASSWORD", "dbpass01"])])])}])}])
669
+
670
+ sek = Secrets.sekreto(client)
671
+ assert Sekreto.get(sek, "db.password") == "dbpass01"
672
+
673
+ assert Sekreto.redactall(sek, "the password is dbpass01, keep it safe") ==
674
+ "the password is [redacted], keep it safe"
675
+ end
676
+
677
+ # THE PROVIDER VOCABULARY IS NON-EMPTY.
678
+ #
679
+ # Upstream sekreto retired its self-registration registry: a kind that
680
+ # was not passed in `plugins:` is unknown to that Sekreto. The generated
681
+ # Config.feature_plugins/1 is what passes them, so an SDK whose model
682
+ # selects a plugin group but whose config emitted no definitions would
683
+ # carry the plugin MODULES and refuse every one of their kinds at
684
+ # runtime - while every test that used only built-in kinds stayed green.
685
+ #
686
+ # Conditional on the module being present, because this file ships to
687
+ # projects that select the feature without the `vault` plugin group.
688
+ test "active: a selected plugin kind is in the SDK vocabulary" do
689
+ if Code.ensure_loaded?(Sekreto.Plugins.Hashicorp) do
690
+ # Construction is where an unknown kind is refused, so the chain
691
+ # building at all IS the regression check. The memory store comes
692
+ # FIRST so sekreto's first-hit rule answers from it and the vault is
693
+ # never contacted - the kind has to be declarable, not reachable.
694
+ r = recorder()
695
+
696
+ client =
697
+ sdk(r, [{"feature",
698
+ secrets([{"providers", providers([
699
+ spec(["kind", "memory", "values", S.jm(["APIKEY", "VOCAB01"])]),
700
+ spec(["kind", "hashicorp", "addr", "https://vault.test", "token", "x"])
701
+ ])}])}])
702
+
703
+ assert S.getprop(ProjectName.direct(client, S.jm(["path", "/thing"])), "ok") == true
704
+ auth_is(hd(api(r)), "VOCAB01")
705
+ end
706
+ end
707
+
708
+ # ELIXIR-ONLY. sekreto keeps per-chain state in an Agent started with
709
+ # `Agent.start_link`, so it is LINKED to whichever process built the
710
+ # client. A client constructed in a process that later exits ABNORMALLY
711
+ # leaves a dead Agent, and the next lookup EXITS with `:noproc` rather
712
+ # than raising - which is neither a miss nor a provider error, and would
713
+ # crash the calling process instead of failing the operation. The feature
714
+ # catches that exit and rebuilds the chain once.
715
+ test "active: a dead provider cell is rebuilt rather than crashing the op" do
716
+ r = recorder()
717
+ parent = self()
718
+
719
+ spawn(fn ->
720
+ client =
721
+ sdk(r, [{"feature",
722
+ secrets([{"providers",
723
+ providers([spec(["kind", "memory", "values", S.jm(["APIKEY", "CELLKEY01"])])])}])}])
724
+
725
+ send(parent, {:client, client})
726
+ Process.sleep(20)
727
+ exit(:boom)
728
+ end)
729
+
730
+ client = receive do
731
+ {:client, c} -> c
732
+ after
733
+ 2000 -> flunk("the builder process never handed the client back")
734
+ end
735
+
736
+ # Wait for the owner's exit to take the Agent with it, and prove it
737
+ # did: without a dead cell this test asserts nothing.
738
+ cell = S.getprop(Secrets.feature(client), "_sekreto").state
739
+ wait_dead(cell, 100)
740
+ refute Process.alive?(cell), "the provider cell did not die, so this test is inert"
741
+
742
+ res = ProjectName.direct(client, S.jm(["path", "/thing"]))
743
+
744
+ assert S.getprop(res, "ok") == true,
745
+ "a dead provider cell must not fail the operation: " <> inspect(res)
746
+
747
+ assert length(api(r)) == 1
748
+ auth_is(hd(api(r)), "CELLKEY01")
749
+ end
750
+ end
751
+
752
+ # ACCESS-TOKEN EXCHANGE.
753
+ #
754
+ # The shape these tests pin: what the chain resolves is a REFRESH token,
755
+ # which is POSTed to a token endpoint for a short-lived ACCESS token; the
756
+ # access token is what the Authorization header carries; and when the API
757
+ # answers 401 the client buys another and tries the same request again,
758
+ # once.
759
+ #
760
+ # A LIVE client throughout. Test mode is deliberately excluded here - it
761
+ # buys nothing, which is the subject of its own test at the end.
762
+ describe "secrets exchange" do
763
+ @refresh "REFRESH01"
764
+
765
+ defp exchange_sdk(r, xextra \\ [], extra \\ []) do
766
+ x = S.jm(["active", true])
767
+ Enum.each(xextra, fn {k, v} -> S.setprop(x, k, v) end)
768
+
769
+ fopts =
770
+ secrets([
771
+ {"name", "refresh_token"},
772
+ {"providers", providers([S.jm(["kind", "env", "prefix", @envprefix])])},
773
+ {"exchange", x}
774
+ ])
775
+
776
+ sdk(r, [{"feature", fopts} | extra])
777
+ end
778
+
779
+ test "the refresh token buys an access token, and the request carries it" do
780
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
781
+
782
+ r = recorder()
783
+ ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
784
+
785
+ assert length(token(r)) == 1, "expected exactly one token purchase"
786
+
787
+ assert S.getprop(ProjectName.Json.parse(hd(token(r)).body), "refresh_token") == @refresh,
788
+ "the refresh token is sent in the request field"
789
+
790
+ assert length(api(r)) == 1
791
+ auth_is(hd(api(r)), "ACCESS01")
792
+ end
793
+
794
+ test "an explicit exchange.refresh wins over the chain" do
795
+ System.put_env(@envprefix <> "REFRESH_TOKEN", "FROMCHAIN")
796
+
797
+ r = recorder()
798
+ ProjectName.direct(exchange_sdk(r, [{"refresh", "EXPLICIT01"}]), S.jm(["path", "/thing"]))
799
+
800
+ assert S.getprop(ProjectName.Json.parse(hd(token(r)).body), "refresh_token") == "EXPLICIT01"
801
+ end
802
+
803
+ # The exchange side of the same invariant: the ACCESS token the purchase
804
+ # buys is held in feature state too. `buy/2` is a second writer of the
805
+ # credential, so the rule is pinned at this seam as well as at the plain
806
+ # resolution above.
807
+ test "a bought access token lives in feature state, never in the options map" do
808
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
809
+
810
+ r = recorder()
811
+ client = exchange_sdk(r)
812
+ before = S.getprop(ProjectName.options_map(client), "apikey")
813
+
814
+ ProjectName.direct(client, S.jm(["path", "/thing"]))
815
+
816
+ # CONTROL: bought once, sent once, carrying what was bought.
817
+ assert length(token(r)) == 1, "expected exactly one token purchase"
818
+ assert length(api(r)) == 1
819
+ auth_is(hd(api(r)), "ACCESS01")
820
+ assert Secrets.credential(client) == "ACCESS01"
821
+
822
+ after_ = S.getprop(ProjectName.options_map(client), "apikey")
823
+
824
+ assert after_ == before,
825
+ "the token purchase changed options.apikey from " <> inspect(before) <>
826
+ " to " <> inspect(after_)
827
+
828
+ refute credential?(after_, "ACCESS01"),
829
+ "the bought access token was published into the options map"
830
+
831
+ refute credential?(after_, @refresh),
832
+ "the refresh token was published into the options map"
833
+ end
834
+
835
+ test "one purchase serves many requests" do
836
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
837
+
838
+ r = recorder()
839
+ client = exchange_sdk(r)
840
+ ProjectName.direct(client, S.jm(["path", "/one"]))
841
+ ProjectName.direct(client, S.jm(["path", "/two"]))
842
+ ProjectName.direct(client, S.jm(["path", "/three"]))
843
+
844
+ assert length(token(r)) == 1, "a token still working must not be re-bought"
845
+ assert length(api(r)) == 3
846
+ end
847
+
848
+ test "a 401 buys another token and retries the SAME request" do
849
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
850
+
851
+ r = recorder(%{api: [401, 200]})
852
+ res = ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
853
+
854
+ assert length(token(r)) == 2, "expected a second token purchase"
855
+ assert length(api(r)) == 2, "expected the request to be retried"
856
+
857
+ auth_is(Enum.at(api(r), 0), "ACCESS01")
858
+ # The retry must carry the NEW token, not the spent one.
859
+ auth_is(Enum.at(api(r), 1), "ACCESS02")
860
+
861
+ assert S.getprop(res, "ok") == true, "the caller sees the successful retry"
862
+ end
863
+
864
+ test "the retry happens once, not in a loop" do
865
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
866
+
867
+ # Every API call is refused: a second 401 on a token bought moments ago
868
+ # is a real failure, and spinning on it would hang instead of failing.
869
+ r = recorder(%{api: [401]})
870
+ ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
871
+
872
+ assert length(api(r)) == 2, "exactly one retry"
873
+ assert length(token(r)) == 2
874
+ end
875
+
876
+ test "a status outside exchange.statuses is not an expiry" do
877
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
878
+
879
+ r = recorder(%{api: [403]})
880
+ ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
881
+
882
+ assert length(api(r)) == 1, "403 is not in the default statuses"
883
+ assert length(token(r)) == 1
884
+ end
885
+
886
+ test "exchange.statuses is configurable" do
887
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
888
+
889
+ r = recorder(%{api: [403, 200]})
890
+ ProjectName.direct(exchange_sdk(r, [{"statuses", S.jt([403])}]), S.jm(["path", "/thing"]))
891
+
892
+ assert length(api(r)) == 2, "403 was declared an expiry"
893
+ end
894
+
895
+ test "the endpoint and the request and response field names are configurable" do
896
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
897
+
898
+ r = recorder(%{response: "token", path: "oauth/grant"})
899
+
900
+ client =
901
+ exchange_sdk(r, [
902
+ {"path", "oauth/grant"},
903
+ {"request", "grant"},
904
+ {"response", "token"}
905
+ ])
906
+
907
+ ProjectName.direct(client, S.jm(["path", "/thing"]))
908
+
909
+ assert length(token(r)) == 1
910
+
911
+ assert String.ends_with?(hd(token(r)).url, "/oauth/grant"),
912
+ "the token endpoint is relative to base: " <> hd(token(r)).url
913
+
914
+ assert S.getprop(ProjectName.Json.parse(hd(token(r)).body), "grant") == @refresh
915
+ auth_is(hd(api(r)), "ACCESS01")
916
+ end
917
+
918
+ test "an explicit apikey is spent before anything is bought" do
919
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
920
+
921
+ # A caller who already holds an access token should use it; expiry is
922
+ # what moves them onto the exchange, and the API is what says so.
923
+ r = recorder()
924
+ ProjectName.direct(exchange_sdk(r, [], [{"apikey", "HELDTOKEN01"}]), S.jm(["path", "/thing"]))
925
+
926
+ assert token(r) == [], "nothing needed buying"
927
+ auth_is(hd(api(r)), "HELDTOKEN01")
928
+ end
929
+
930
+ test "a held apikey that has expired falls through to the exchange" do
931
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
932
+
933
+ r = recorder(%{api: [401, 200]})
934
+ ProjectName.direct(exchange_sdk(r, [], [{"apikey", "STALETOKEN01"}]), S.jm(["path", "/thing"]))
935
+
936
+ auth_is(Enum.at(api(r), 0), "STALETOKEN01")
937
+ auth_is(Enum.at(api(r), 1), "ACCESS01")
938
+ end
939
+
940
+ test "no refresh token anywhere is an error, not an unauthenticated call" do
941
+ r = recorder()
942
+ res = ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
943
+
944
+ assert S.getprop(res, "ok") == false, "expected a failure, got: " <> inspect(res)
945
+ assert err_message(res) =~ "no refresh token"
946
+
947
+ assert api(r) == [],
948
+ "a request must not go out unauthenticated because the chain was empty: " <> wire(r)
949
+ end
950
+
951
+ test "a failing token endpoint surfaces the API refusal, not a spin" do
952
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
953
+
954
+ # The first purchase succeeds; the second (after the 401) does not.
955
+ r = recorder(%{api: [401], tokenfail: 2})
956
+ res = ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
957
+
958
+ assert res != nil, "the caller got an answer rather than a hang"
959
+ assert length(api(r)) == 1, "no retry after a failed purchase"
960
+ end
961
+
962
+ test "auth nil suppresses the credential and buys nothing" do
963
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
964
+
965
+ # `auth: nil` is the documented way to send no credential at all. A
966
+ # refusal of a deliberately unauthenticated request is not an expired
967
+ # token: buying one and retrying would transmit exactly the credential
968
+ # the caller suppressed.
969
+ r = recorder(%{api: [401]})
970
+ ProjectName.direct(exchange_sdk(r, [], [{"auth", nil}]), S.jm(["path", "/thing"]))
971
+
972
+ assert length(api(r)) == 1, "a suppressed request must not be retried"
973
+ assert hd(api(r)).auth == nil, "no credential may be sent when auth is suppressed"
974
+ assert token(r) == [], "a suppressed request must not buy a token either"
975
+ end
976
+
977
+ test "exchange off leaves the feature exactly as it was" do
978
+ System.put_env(@envprefix <> "APIKEY", "PLAINKEY01")
979
+
980
+ r = recorder()
981
+ ProjectName.direct(sdk(r, [{"feature", envchain()}]), S.jm(["path", "/thing"]))
982
+
983
+ assert token(r) == []
984
+ auth_is(hd(api(r)), "PLAINKEY01")
985
+ end
986
+
987
+ test "test mode buys nothing and needs no token endpoint" do
988
+ System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
989
+
990
+ r = recorder()
991
+
992
+ client =
993
+ ProjectName.test(S.jm([]), S.jm([
994
+ "base", @base,
995
+ "allow", S.jm(["op", "direct,graphql,list,load"]),
996
+ "system", S.jm(["fetch", r.fetch]),
997
+ "feature",
998
+ secrets([
999
+ {"name", "refresh_token"},
1000
+ {"providers", providers([S.jm(["kind", "env", "prefix", @envprefix])])},
1001
+ {"exchange", S.jm(["active", true])}
1002
+ ])
1003
+ ]))
1004
+
1005
+ ProjectName.direct(client, S.jm(["path", "/thing"]))
1006
+
1007
+ assert calls(r) == [], "test mode must not do IO"
1008
+
1009
+ # A deterministic placeholder, so offline suites need no configuration.
1010
+ assert Secrets.credential(client) == "test-access_token"
1011
+ end
1012
+ end
1013
+
1014
+ # ---- template helpers ----------------------------------------------------
1015
+
1016
+ # A callable `list` op for SOME entity this SDK generates, or nil.
1017
+ #
1018
+ # SEARCH for a usable op rather than taking the first entity and hoping: an
1019
+ # API's first entity by name need not have a `list`, and a template cannot
1020
+ # know which does.
1021
+ defp list_op(client) do
1022
+ ents = S.getprop(ProjectName.Config.make_config(), "entity")
1023
+
1024
+ if not S.ismap(ents) do
1025
+ nil
1026
+ else
1027
+ Enum.find_value(S.keysof(ents), fn name ->
1028
+ if S.ismap(S.getpath(ents, name <> ".op.list")) do
1029
+ factory = existing_atom(name)
1030
+
1031
+ if factory != nil and
1032
+ Enum.member?(ProjectName.__info__(:functions), {factory, 2}) do
1033
+ ent = apply(ProjectName, factory, [client, nil])
1034
+ mod = S.getprop(ent, "_module")
1035
+
1036
+ if mod != nil and Code.ensure_loaded?(mod) and function_exported?(mod, :list, 3) do
1037
+ fn -> apply(mod, :list, [ent, nil, nil]) end
1038
+ end
1039
+ end
1040
+ end
1041
+ end)
1042
+ end
1043
+ end
1044
+
1045
+ # Run an entity op and answer with its failure MESSAGE ("" when it
1046
+ # succeeded). An entity op raises by default rather than returning its
1047
+ # error, so a fail-closed assertion has to reach the message through the
1048
+ # raise.
1049
+ defp opfail(op) do
1050
+ out = op.()
1051
+ if is_exception(out), do: Exception.message(out), else: ""
1052
+ rescue
1053
+ e -> Exception.message(e)
1054
+ end
1055
+
1056
+ defp existing_atom(name) do
1057
+ String.to_existing_atom(name)
1058
+ rescue
1059
+ ArgumentError -> nil
1060
+ end
1061
+
1062
+ defp wait_dead(_pid, 0), do: :ok
1063
+
1064
+ defp wait_dead(pid, n) do
1065
+ if Process.alive?(pid) do
1066
+ Process.sleep(10)
1067
+ wait_dead(pid, n - 1)
1068
+ else
1069
+ :ok
1070
+ end
1071
+ end
1072
+ end