@voxgig/sdkgen 4.9.0 → 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 (887) hide show
  1. package/dist/helpers/manifest.d.ts +2 -1
  2. package/dist/helpers/manifest.js +75 -1
  3. package/dist/helpers/manifest.js.map +1 -1
  4. package/dist/helpers/modelNames.d.ts +7 -0
  5. package/dist/helpers/modelNames.js +232 -0
  6. package/dist/helpers/modelNames.js.map +1 -0
  7. package/dist/helpers/naming.d.ts +2 -1
  8. package/dist/helpers/naming.js +45 -1
  9. package/dist/helpers/naming.js.map +1 -1
  10. package/dist/sdkgen.d.ts +3 -2
  11. package/dist/sdkgen.js +12 -3
  12. package/dist/sdkgen.js.map +1 -1
  13. package/dist/testkit.d.ts +2 -0
  14. package/dist/testkit.js +80 -24
  15. package/dist/testkit.js.map +1 -1
  16. package/dist/tsconfig.tsbuildinfo +1 -1
  17. package/dist/utility.js +17 -7
  18. package/dist/utility.js.map +1 -1
  19. package/package.json +1 -1
  20. package/project/.sdk/model/feature/secrets.aon +671 -0
  21. package/project/.sdk/model/target/clojure.aon +10 -0
  22. package/project/.sdk/model/target/csharp.aon +5 -0
  23. package/project/.sdk/model/target/elixir.aon +6 -0
  24. package/project/.sdk/model/target/java.aon +5 -0
  25. package/project/.sdk/model/target/js.aon +5 -0
  26. package/project/.sdk/model/target/kotlin.aon +7 -0
  27. package/project/.sdk/model/target/perl.aon +5 -0
  28. package/project/.sdk/model/target/php.aon +5 -0
  29. package/project/.sdk/model/target/rb.aon +5 -0
  30. package/project/.sdk/model/target/rust.aon +5 -0
  31. package/project/.sdk/model/target/scala.aon +38 -2
  32. package/project/.sdk/model/target/swift.aon +10 -0
  33. package/project/.sdk/src/cmp/clojure/Config_clojure.ts +51 -4
  34. package/project/.sdk/src/cmp/clojure/Main_clojure.ts +43 -1
  35. package/project/.sdk/src/cmp/clojure/Package_clojure.ts +17 -1
  36. package/project/.sdk/src/cmp/clojure/featureextra_clojure.ts +130 -0
  37. package/project/.sdk/src/cmp/csharp/Config_csharp.ts +70 -0
  38. package/project/.sdk/src/cmp/csharp/Main_csharp.ts +9 -1
  39. package/project/.sdk/src/cmp/csharp/Package_csharp.ts +25 -1
  40. package/project/.sdk/src/cmp/elixir/Config_elixir.ts +68 -2
  41. package/project/.sdk/src/cmp/elixir/Main_elixir.ts +16 -0
  42. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +14 -1
  43. package/project/.sdk/src/cmp/java/Config_java.ts +84 -2
  44. package/project/.sdk/src/cmp/java/Main_java.ts +10 -1
  45. package/project/.sdk/src/cmp/js/Config_js.ts +75 -8
  46. package/project/.sdk/src/cmp/js/Main_js.ts +66 -2
  47. package/project/.sdk/src/cmp/js/fragment/Config.data.fragment.js +18 -1
  48. package/project/.sdk/src/cmp/js/fragment/Config.fragment.js +18 -1
  49. package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +7 -0
  50. package/project/.sdk/src/cmp/kotlin/Config_kotlin.ts +63 -1
  51. package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +32 -2
  52. package/project/.sdk/src/cmp/perl/Config_perl.ts +129 -3
  53. package/project/.sdk/src/cmp/perl/Main_perl.ts +41 -1
  54. package/project/.sdk/src/cmp/perl/Package_perl.ts +13 -1
  55. package/project/.sdk/src/cmp/perl/fragment/Main.fragment.pm +1 -0
  56. package/project/.sdk/src/cmp/php/Config_php.ts +105 -1
  57. package/project/.sdk/src/cmp/php/Gitignore_php.ts +4 -2
  58. package/project/.sdk/src/cmp/php/Main_php.ts +16 -1
  59. package/project/.sdk/src/cmp/rb/Config_rb.ts +92 -2
  60. package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +11 -1
  61. package/project/.sdk/src/cmp/rb/Main_rb.ts +7 -1
  62. package/project/.sdk/src/cmp/rust/Main_rust.ts +99 -1
  63. package/project/.sdk/src/cmp/rust/Package_rust.ts +72 -6
  64. package/project/.sdk/src/cmp/scala/Config_scala.ts +44 -0
  65. package/project/.sdk/src/cmp/scala/Main_scala.ts +68 -1
  66. package/project/.sdk/src/cmp/swift/Config_swift.ts +62 -1
  67. package/project/.sdk/src/cmp/swift/Main_swift.ts +35 -1
  68. package/project/.sdk/src/cmp/swift/Package_swift.ts +81 -11
  69. package/project/.sdk/src/cmp/swift/fragment/Main.fragment.swift +58 -44
  70. package/project/.sdk/src/cmp/swift/utility_swift.ts +22 -0
  71. package/project/.sdk/tm/c/tests/vendor/omni/json.c +2 -2
  72. package/project/.sdk/tm/c/tests/vendor/omni/omni.h +2 -2
  73. package/project/.sdk/tm/c/tests/vendor/omni/runner.c +2 -2
  74. package/project/.sdk/tm/c/tests/vendor/omni/util.c +2 -2
  75. package/project/.sdk/tm/clojure/Makefile +3 -0
  76. package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +503 -0
  77. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/capability.clj +84 -0
  78. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/catalog.clj +44 -0
  79. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/config.clj +240 -0
  80. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/depend.clj +199 -0
  81. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/env.clj +111 -0
  82. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/export.clj +46 -0
  83. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/graph.clj +122 -0
  84. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/host.clj +1018 -0
  85. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/json.clj +106 -0
  86. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/order.clj +157 -0
  87. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/point.clj +77 -0
  88. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/ref.clj +92 -0
  89. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/resolve.clj +46 -0
  90. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/types.clj +177 -0
  91. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/version.clj +90 -0
  92. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin.clj +40 -0
  93. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/addr.clj +111 -0
  94. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/chain.clj +297 -0
  95. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/core.clj +192 -0
  96. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/json.clj +261 -0
  97. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/aws.clj +165 -0
  98. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/azuresecrets.clj +111 -0
  99. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/boru.clj +107 -0
  100. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/doppler.clj +61 -0
  101. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/gcpsecrets.clj +88 -0
  102. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/hashicorp.clj +115 -0
  103. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/httpjson.clj +214 -0
  104. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/infisical.clj +80 -0
  105. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/onepassword.clj +93 -0
  106. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/proc.clj +63 -0
  107. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/secretspec.clj +99 -0
  108. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/sigv4.clj +142 -0
  109. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/provider.clj +25 -0
  110. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/providers.clj +196 -0
  111. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto.clj +113 -0
  112. package/project/.sdk/tm/clojure/src/sdk/core.clj +9 -0
  113. package/project/.sdk/tm/clojure/src/sdk/features.clj +13 -1
  114. package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +547 -0
  115. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +103 -14
  116. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +2 -2
  117. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +2 -2
  118. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +2 -2
  119. package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +2 -2
  120. package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +2 -2
  121. package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +2 -2
  122. package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +889 -0
  123. package/project/.sdk/tm/csharp/feature/secrets/plugin/Capability.cs +196 -0
  124. package/project/.sdk/tm/csharp/feature/secrets/plugin/Catalog.cs +70 -0
  125. package/project/.sdk/tm/csharp/feature/secrets/plugin/Config.cs +505 -0
  126. package/project/.sdk/tm/csharp/feature/secrets/plugin/Definition.cs +52 -0
  127. package/project/.sdk/tm/csharp/feature/secrets/plugin/Depend.cs +285 -0
  128. package/project/.sdk/tm/csharp/feature/secrets/plugin/Entry.cs +55 -0
  129. package/project/.sdk/tm/csharp/feature/secrets/plugin/Env.cs +228 -0
  130. package/project/.sdk/tm/csharp/feature/secrets/plugin/Export.cs +102 -0
  131. package/project/.sdk/tm/csharp/feature/secrets/plugin/Graph.cs +256 -0
  132. package/project/.sdk/tm/csharp/feature/secrets/plugin/Host.cs +1379 -0
  133. package/project/.sdk/tm/csharp/feature/secrets/plugin/Inst.cs +177 -0
  134. package/project/.sdk/tm/csharp/feature/secrets/plugin/Json.cs +326 -0
  135. package/project/.sdk/tm/csharp/feature/secrets/plugin/Order.cs +295 -0
  136. package/project/.sdk/tm/csharp/feature/secrets/plugin/Plugin.cs +113 -0
  137. package/project/.sdk/tm/csharp/feature/secrets/plugin/Point.cs +177 -0
  138. package/project/.sdk/tm/csharp/feature/secrets/plugin/Refs.cs +198 -0
  139. package/project/.sdk/tm/csharp/feature/secrets/plugin/Resolve.cs +95 -0
  140. package/project/.sdk/tm/csharp/feature/secrets/plugin/Types.cs +351 -0
  141. package/project/.sdk/tm/csharp/feature/secrets/plugin/Version.cs +196 -0
  142. package/project/.sdk/tm/csharp/feature/secrets/plugins/Aws.cs +325 -0
  143. package/project/.sdk/tm/csharp/feature/secrets/plugins/AzureSecrets.cs +195 -0
  144. package/project/.sdk/tm/csharp/feature/secrets/plugins/Boru.cs +192 -0
  145. package/project/.sdk/tm/csharp/feature/secrets/plugins/Child.cs +75 -0
  146. package/project/.sdk/tm/csharp/feature/secrets/plugins/Doppler.cs +112 -0
  147. package/project/.sdk/tm/csharp/feature/secrets/plugins/GcpSecrets.cs +167 -0
  148. package/project/.sdk/tm/csharp/feature/secrets/plugins/Hashicorp.cs +221 -0
  149. package/project/.sdk/tm/csharp/feature/secrets/plugins/HttpJson.cs +213 -0
  150. package/project/.sdk/tm/csharp/feature/secrets/plugins/Infisical.cs +155 -0
  151. package/project/.sdk/tm/csharp/feature/secrets/plugins/OnePassword.cs +169 -0
  152. package/project/.sdk/tm/csharp/feature/secrets/plugins/SecretSpec.cs +172 -0
  153. package/project/.sdk/tm/csharp/feature/secrets/plugins/Sigv4.cs +240 -0
  154. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Json.cs +192 -0
  155. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Providers.cs +503 -0
  156. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Sekreto.cs +775 -0
  157. package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +1702 -0
  158. package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +2 -2
  159. package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +2 -2
  160. package/project/.sdk/tm/csharp/utility/MakeOptions.cs +10 -0
  161. package/project/.sdk/tm/csharp/utility/struct/Struct.cs +1 -1
  162. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/capability.ex +118 -0
  163. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/catalog.ex +56 -0
  164. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/config.ex +320 -0
  165. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/depend.ex +205 -0
  166. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/env.ex +166 -0
  167. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/error.ex +13 -0
  168. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/export.ex +73 -0
  169. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/graph.ex +185 -0
  170. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/host.ex +1182 -0
  171. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/inst.ex +139 -0
  172. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/json.ex +132 -0
  173. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/order.ex +179 -0
  174. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/point.ex +99 -0
  175. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/ref.ex +129 -0
  176. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/resolve.ex +59 -0
  177. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/types.ex +190 -0
  178. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/version.ex +136 -0
  179. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/voxgig_plugin.ex +42 -0
  180. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/json.ex +368 -0
  181. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/aws.ex +257 -0
  182. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/azuresecrets.ex +160 -0
  183. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/boru.ex +127 -0
  184. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/doppler.ex +96 -0
  185. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/gcpsecrets.ex +124 -0
  186. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/hashicorp.ex +162 -0
  187. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/http.ex +627 -0
  188. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/httpjson.ex +134 -0
  189. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/infisical.ex +125 -0
  190. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/onepassword.ex +152 -0
  191. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/proc.ex +80 -0
  192. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/secretspec.ex +101 -0
  193. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/sigv4.ex +176 -0
  194. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/provider.ex +67 -0
  195. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/providers.ex +536 -0
  196. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/sekreto.ex +662 -0
  197. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +824 -0
  198. package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +1072 -0
  199. package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +2 -2
  200. package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +2 -2
  201. package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +2 -2
  202. package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +1 -1
  203. package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +1 -1
  204. package/project/.sdk/tm/go/feature/secrets/plugin/config.go +1 -1
  205. package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +1 -1
  206. package/project/.sdk/tm/go/feature/secrets/plugin/env.go +1 -1
  207. package/project/.sdk/tm/go/feature/secrets/plugin/export.go +1 -1
  208. package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +1 -1
  209. package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1 -1
  210. package/project/.sdk/tm/go/feature/secrets/plugin/order.go +1 -1
  211. package/project/.sdk/tm/go/feature/secrets/plugin/point.go +1 -1
  212. package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +1 -1
  213. package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +1 -1
  214. package/project/.sdk/tm/go/feature/secrets/plugin/types.go +1 -1
  215. package/project/.sdk/tm/go/feature/secrets/plugin/util.go +1 -1
  216. package/project/.sdk/tm/go/feature/secrets/plugin/version.go +1 -1
  217. package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +2 -2
  218. package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +2 -2
  219. package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +2 -2
  220. package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +2 -2
  221. package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +2 -2
  222. package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +2 -2
  223. package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +2 -2
  224. package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +2 -2
  225. package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +2 -2
  226. package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +2 -2
  227. package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +2 -2
  228. package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +2 -2
  229. package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +2 -2
  230. package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +2 -2
  231. package/project/.sdk/tm/go/feature/secrets_feature.go +16 -0
  232. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +123 -0
  233. package/project/.sdk/tm/go/test/omni/omni.go +2 -2
  234. package/project/.sdk/tm/go/test/omni/util.go +2 -2
  235. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +1 -1
  236. package/project/.sdk/tm/java/feature/SecretsFeature.java +766 -0
  237. package/project/.sdk/tm/java/feature/secrets/plugin/Capability.java +181 -0
  238. package/project/.sdk/tm/java/feature/secrets/plugin/Catalog.java +64 -0
  239. package/project/.sdk/tm/java/feature/secrets/plugin/Config.java +433 -0
  240. package/project/.sdk/tm/java/feature/secrets/plugin/Definition.java +54 -0
  241. package/project/.sdk/tm/java/feature/secrets/plugin/Depend.java +292 -0
  242. package/project/.sdk/tm/java/feature/secrets/plugin/Entry.java +49 -0
  243. package/project/.sdk/tm/java/feature/secrets/plugin/Env.java +204 -0
  244. package/project/.sdk/tm/java/feature/secrets/plugin/Export.java +93 -0
  245. package/project/.sdk/tm/java/feature/secrets/plugin/Graph.java +244 -0
  246. package/project/.sdk/tm/java/feature/secrets/plugin/Host.java +1196 -0
  247. package/project/.sdk/tm/java/feature/secrets/plugin/Inst.java +173 -0
  248. package/project/.sdk/tm/java/feature/secrets/plugin/Json.java +339 -0
  249. package/project/.sdk/tm/java/feature/secrets/plugin/Order.java +274 -0
  250. package/project/.sdk/tm/java/feature/secrets/plugin/Plugin.java +94 -0
  251. package/project/.sdk/tm/java/feature/secrets/plugin/PluginException.java +37 -0
  252. package/project/.sdk/tm/java/feature/secrets/plugin/Point.java +172 -0
  253. package/project/.sdk/tm/java/feature/secrets/plugin/Refs.java +171 -0
  254. package/project/.sdk/tm/java/feature/secrets/plugin/Resolve.java +89 -0
  255. package/project/.sdk/tm/java/feature/secrets/plugin/Types.java +232 -0
  256. package/project/.sdk/tm/java/feature/secrets/plugin/Version.java +198 -0
  257. package/project/.sdk/tm/java/feature/secrets/sekreto/Addr.java +142 -0
  258. package/project/.sdk/tm/java/feature/secrets/sekreto/Builtins.java +229 -0
  259. package/project/.sdk/tm/java/feature/secrets/sekreto/Json.java +302 -0
  260. package/project/.sdk/tm/java/feature/secrets/sekreto/Provider.java +21 -0
  261. package/project/.sdk/tm/java/feature/secrets/sekreto/Sekreto.java +698 -0
  262. package/project/.sdk/tm/java/feature/secrets/sekreto/Support.java +100 -0
  263. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Aws.java +294 -0
  264. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Azuresecrets.java +164 -0
  265. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Boru.java +161 -0
  266. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Doppler.java +103 -0
  267. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Gcpsecrets.java +143 -0
  268. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Hashicorp.java +186 -0
  269. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Httpjson.java +192 -0
  270. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Infisical.java +139 -0
  271. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Onepassword.java +143 -0
  272. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Proc.java +80 -0
  273. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Secretspec.java +138 -0
  274. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Sigv4.java +243 -0
  275. package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +986 -0
  276. package/project/.sdk/tm/java/test/vendor/omni/Json.java +2 -2
  277. package/project/.sdk/tm/java/test/vendor/omni/Runner.java +2 -2
  278. package/project/.sdk/tm/java/test/vendor/omni/Util.java +2 -2
  279. package/project/.sdk/tm/java/utility/MakeOptions.java +7 -0
  280. package/project/.sdk/tm/java/utility/struct/Struct.java +1 -1
  281. package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +431 -0
  282. package/project/.sdk/tm/js/src/feature/secrets/plugin/capability.js +119 -0
  283. package/project/.sdk/tm/js/src/feature/secrets/plugin/catalog.js +42 -0
  284. package/project/.sdk/tm/js/src/feature/secrets/plugin/config.js +323 -0
  285. package/project/.sdk/tm/js/src/feature/secrets/plugin/depend.js +196 -0
  286. package/project/.sdk/tm/js/src/feature/secrets/plugin/env.js +120 -0
  287. package/project/.sdk/tm/js/src/feature/secrets/plugin/export.js +48 -0
  288. package/project/.sdk/tm/js/src/feature/secrets/plugin/graph.js +150 -0
  289. package/project/.sdk/tm/js/src/feature/secrets/plugin/host.js +949 -0
  290. package/project/.sdk/tm/js/src/feature/secrets/plugin/index.js +35 -0
  291. package/project/.sdk/tm/js/src/feature/secrets/plugin/order.js +165 -0
  292. package/project/.sdk/tm/js/src/feature/secrets/plugin/point.js +94 -0
  293. package/project/.sdk/tm/js/src/feature/secrets/plugin/ref.js +106 -0
  294. package/project/.sdk/tm/js/src/feature/secrets/plugin/resolve.js +59 -0
  295. package/project/.sdk/tm/js/src/feature/secrets/plugin/types.js +79 -0
  296. package/project/.sdk/tm/js/src/feature/secrets/plugin/version.js +100 -0
  297. package/project/.sdk/tm/js/src/feature/secrets/sekreto/Sekreto.js +574 -0
  298. package/project/.sdk/tm/js/src/feature/secrets/sekreto/index.js +56 -0
  299. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/aws.js +188 -0
  300. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/azuresecrets.js +135 -0
  301. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/boru.js +128 -0
  302. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/doppler.js +67 -0
  303. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/gcpsecrets.js +115 -0
  304. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/hashicorp.js +139 -0
  305. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/httpjson.js +93 -0
  306. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/infisical.js +99 -0
  307. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/onepassword.js +111 -0
  308. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/secretspec.js +105 -0
  309. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/sigv4.js +157 -0
  310. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/addr.js +119 -0
  311. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/builtin.js +39 -0
  312. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/dotenv.js +40 -0
  313. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/env.js +21 -0
  314. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/file.js +42 -0
  315. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/memory.js +18 -0
  316. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/support.js +151 -0
  317. package/project/.sdk/tm/js/src/utility/StructUtility.js +1 -1
  318. package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +946 -0
  319. package/project/.sdk/tm/js/test/vendor/omni/index.js +1 -1
  320. package/project/.sdk/tm/js/test/vendor/omni/runner.js +1 -1
  321. package/project/.sdk/tm/js/test/vendor/omni/util.js +1 -1
  322. package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +659 -0
  323. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Capability.kt +117 -0
  324. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Catalog.kt +40 -0
  325. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Config.kt +322 -0
  326. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Depend.kt +227 -0
  327. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Env.kt +163 -0
  328. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Export.kt +57 -0
  329. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Graph.kt +179 -0
  330. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Host.kt +1131 -0
  331. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Json.kt +241 -0
  332. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Order.kt +180 -0
  333. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Plugin.kt +64 -0
  334. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Point.kt +124 -0
  335. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Refs.kt +125 -0
  336. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Resolve.kt +66 -0
  337. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Types.kt +171 -0
  338. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Version.kt +132 -0
  339. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Json.kt +359 -0
  340. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Provider.kt +21 -0
  341. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Providers.kt +308 -0
  342. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Sekreto.kt +525 -0
  343. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Spec.kt +126 -0
  344. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Support.kt +205 -0
  345. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Aws.kt +251 -0
  346. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Azuresecrets.kt +145 -0
  347. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Boru.kt +130 -0
  348. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Doppler.kt +77 -0
  349. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Gcpsecrets.kt +119 -0
  350. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Hashicorp.kt +156 -0
  351. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Httpjson.kt +219 -0
  352. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Infisical.kt +114 -0
  353. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Onepassword.kt +114 -0
  354. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Secretspec.kt +118 -0
  355. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Sigv4.kt +220 -0
  356. package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +1148 -0
  357. package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +2 -2
  358. package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +2 -2
  359. package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +2 -2
  360. package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +1 -1
  361. package/project/.sdk/tm/lua/test/vendor/omni/json.lua +2 -2
  362. package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +2 -2
  363. package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +2 -2
  364. package/project/.sdk/tm/lua/test/vendor/omni/util.lua +2 -2
  365. package/project/.sdk/tm/lua/utility/struct/regex.lua +1 -1
  366. package/project/.sdk/tm/lua/utility/struct/struct.lua +1 -1
  367. package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +2 -2
  368. package/project/.sdk/tm/perl/Makefile +6 -1
  369. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Capability.pm +141 -0
  370. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Catalog.pm +65 -0
  371. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Config.pm +346 -0
  372. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Depend.pm +216 -0
  373. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Env.pm +176 -0
  374. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Export.pm +59 -0
  375. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Graph.pm +157 -0
  376. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Host.pm +1139 -0
  377. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Order.pm +187 -0
  378. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Point.pm +100 -0
  379. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Ref.pm +119 -0
  380. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Resolve.pm +71 -0
  381. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Types.pm +251 -0
  382. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Version.pm +122 -0
  383. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin.pm +70 -0
  384. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Aws.pm +263 -0
  385. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Azuresecrets.pm +159 -0
  386. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Boru.pm +180 -0
  387. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Doppler.pm +92 -0
  388. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Gcpsecrets.pm +138 -0
  389. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm +213 -0
  390. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Httpjson.pm +173 -0
  391. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Infisical.pm +132 -0
  392. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Onepassword.pm +132 -0
  393. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Proc.pm +102 -0
  394. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Secretspec.pm +132 -0
  395. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Sigv4.pm +190 -0
  396. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Addr.pm +124 -0
  397. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Providers.pm +301 -0
  398. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto.pm +605 -0
  399. package/project/.sdk/tm/perl/feature/secrets_feature.pm +675 -0
  400. package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +1 -1
  401. package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +957 -0
  402. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +1 -1
  403. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +1 -1
  404. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +1 -1
  405. package/project/.sdk/tm/php/feature/SecretsFeature.php +670 -0
  406. package/project/.sdk/tm/php/feature/secrets/plugin/Capability.php +226 -0
  407. package/project/.sdk/tm/php/feature/secrets/plugin/Catalog.php +75 -0
  408. package/project/.sdk/tm/php/feature/secrets/plugin/Config.php +444 -0
  409. package/project/.sdk/tm/php/feature/secrets/plugin/Depend.php +262 -0
  410. package/project/.sdk/tm/php/feature/secrets/plugin/Env.php +202 -0
  411. package/project/.sdk/tm/php/feature/secrets/plugin/Export.php +74 -0
  412. package/project/.sdk/tm/php/feature/secrets/plugin/Graph.php +195 -0
  413. package/project/.sdk/tm/php/feature/secrets/plugin/Host.php +1514 -0
  414. package/project/.sdk/tm/php/feature/secrets/plugin/Order.php +260 -0
  415. package/project/.sdk/tm/php/feature/secrets/plugin/Point.php +129 -0
  416. package/project/.sdk/tm/php/feature/secrets/plugin/Ref.php +169 -0
  417. package/project/.sdk/tm/php/feature/secrets/plugin/Resolve.php +79 -0
  418. package/project/.sdk/tm/php/feature/secrets/plugin/Types.php +348 -0
  419. package/project/.sdk/tm/php/feature/secrets/plugin/Version.php +163 -0
  420. package/project/.sdk/tm/php/feature/secrets/plugin/plugin.php +40 -0
  421. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/aws.php +274 -0
  422. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/azuresecrets.php +170 -0
  423. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/boru.php +163 -0
  424. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/doppler.php +106 -0
  425. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/gcpsecrets.php +144 -0
  426. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/hashicorp.php +194 -0
  427. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/httpjson.php +113 -0
  428. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/infisical.php +131 -0
  429. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/onepassword.php +150 -0
  430. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/runcmd.php +101 -0
  431. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/secretspec.php +146 -0
  432. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/sigv4.php +161 -0
  433. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Addr.php +129 -0
  434. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Providers.php +322 -0
  435. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Sekreto.php +724 -0
  436. package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +1067 -0
  437. package/project/.sdk/tm/php/test/vendor/omni/Runner.php +2 -2
  438. package/project/.sdk/tm/php/test/vendor/omni/Util.php +2 -2
  439. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +1 -1
  440. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +1 -1
  441. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +1 -1
  442. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +1 -1
  443. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +1 -1
  444. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +1 -1
  445. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +1 -1
  446. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +1 -1
  447. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1 -1
  448. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +1 -1
  449. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +1 -1
  450. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +1 -1
  451. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +1 -1
  452. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +1 -1
  453. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +1 -1
  454. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +2 -2
  455. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +1 -1
  456. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +1 -1
  457. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +1 -1
  458. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +1 -1
  459. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +1 -1
  460. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +1 -1
  461. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +1 -1
  462. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +1 -1
  463. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +1 -1
  464. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +1 -1
  465. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +1 -1
  466. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +1 -1
  467. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +1 -1
  468. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +1 -1
  469. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +1 -1
  470. package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +1 -1
  471. package/project/.sdk/tm/py/test/voxgig_omni/runner.py +1 -1
  472. package/project/.sdk/tm/py/test/voxgig_omni/util.py +1 -1
  473. package/project/.sdk/tm/rb/Makefile +7 -1
  474. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/capability.rb +118 -0
  475. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/catalog.rb +55 -0
  476. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/config.rb +315 -0
  477. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/depend.rb +197 -0
  478. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/env.rb +143 -0
  479. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/export.rb +52 -0
  480. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/graph.rb +147 -0
  481. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/host.rb +1079 -0
  482. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/order.rb +169 -0
  483. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/point.rb +93 -0
  484. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/ref.rb +112 -0
  485. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/resolve.rb +56 -0
  486. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/types.rb +99 -0
  487. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/version.rb +106 -0
  488. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin.rb +24 -0
  489. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/addr.rb +111 -0
  490. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/aws.rb +200 -0
  491. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/azuresecrets.rb +130 -0
  492. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/boru.rb +121 -0
  493. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/doppler.rb +66 -0
  494. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.rb +107 -0
  495. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/hashicorp.rb +137 -0
  496. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/httpjson.rb +136 -0
  497. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/infisical.rb +97 -0
  498. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/onepassword.rb +104 -0
  499. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/secretspec.rb +113 -0
  500. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/sigv4.rb +127 -0
  501. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/providers.rb +210 -0
  502. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/sekreto.rb +465 -0
  503. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto.rb +30 -0
  504. package/project/.sdk/tm/rb/feature/secrets_feature.rb +561 -0
  505. package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +842 -0
  506. package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +2 -2
  507. package/project/.sdk/tm/rb/test/vendor/omni/util.rb +2 -2
  508. package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +2 -2
  509. package/project/.sdk/tm/rust/feature/secrets/plugin/capability.rs +130 -0
  510. package/project/.sdk/tm/rust/feature/secrets/plugin/catalog.rs +114 -0
  511. package/project/.sdk/tm/rust/feature/secrets/plugin/config.rs +416 -0
  512. package/project/.sdk/tm/rust/feature/secrets/plugin/depend.rs +245 -0
  513. package/project/.sdk/tm/rust/feature/secrets/plugin/env.rs +200 -0
  514. package/project/.sdk/tm/rust/feature/secrets/plugin/export.rs +90 -0
  515. package/project/.sdk/tm/rust/feature/secrets/plugin/graph.rs +231 -0
  516. package/project/.sdk/tm/rust/feature/secrets/plugin/host.rs +1565 -0
  517. package/project/.sdk/tm/rust/feature/secrets/plugin/mod.rs +18 -0
  518. package/project/.sdk/tm/rust/feature/secrets/plugin/order.rs +226 -0
  519. package/project/.sdk/tm/rust/feature/secrets/plugin/point.rs +137 -0
  520. package/project/.sdk/tm/rust/feature/secrets/plugin/refs.rs +148 -0
  521. package/project/.sdk/tm/rust/feature/secrets/plugin/resolve.rs +83 -0
  522. package/project/.sdk/tm/rust/feature/secrets/plugin/types.rs +132 -0
  523. package/project/.sdk/tm/rust/feature/secrets/plugin/value.rs +433 -0
  524. package/project/.sdk/tm/rust/feature/secrets/plugin/version.rs +174 -0
  525. package/project/.sdk/tm/rust/feature/secrets/plugins/aws/crypto.rs +146 -0
  526. package/project/.sdk/tm/rust/feature/secrets/plugins/aws/sigv4.rs +230 -0
  527. package/project/.sdk/tm/rust/feature/secrets/plugins/aws.rs +328 -0
  528. package/project/.sdk/tm/rust/feature/secrets/plugins/azuresecrets.rs +184 -0
  529. package/project/.sdk/tm/rust/feature/secrets/plugins/boru.rs +172 -0
  530. package/project/.sdk/tm/rust/feature/secrets/plugins/doppler.rs +102 -0
  531. package/project/.sdk/tm/rust/feature/secrets/plugins/gcpsecrets.rs +153 -0
  532. package/project/.sdk/tm/rust/feature/secrets/plugins/hashicorp.rs +228 -0
  533. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/http.rs +537 -0
  534. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/json.rs +300 -0
  535. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson.rs +137 -0
  536. package/project/.sdk/tm/rust/feature/secrets/plugins/infisical.rs +148 -0
  537. package/project/.sdk/tm/rust/feature/secrets/plugins/onepassword.rs +165 -0
  538. package/project/.sdk/tm/rust/feature/secrets/plugins/secretspec.rs +150 -0
  539. package/project/.sdk/tm/rust/feature/secrets/sekreto/addr.rs +144 -0
  540. package/project/.sdk/tm/rust/feature/secrets/sekreto/mod.rs +51 -0
  541. package/project/.sdk/tm/rust/feature/secrets/sekreto/providers.rs +637 -0
  542. package/project/.sdk/tm/rust/feature/secrets/sekreto/sekreto.rs +677 -0
  543. package/project/.sdk/tm/rust/feature/secrets.rs +961 -0
  544. package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +1509 -0
  545. package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +2 -2
  546. package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +2 -2
  547. package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +2 -2
  548. package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +2 -2
  549. package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +2 -2
  550. package/project/.sdk/tm/scala/Makefile +8 -3
  551. package/project/.sdk/tm/scala/feature/SecretsFeature.scala +556 -0
  552. package/project/.sdk/tm/scala/feature/secrets/plugin/Capability.scala +96 -0
  553. package/project/.sdk/tm/scala/feature/secrets/plugin/Config.scala +270 -0
  554. package/project/.sdk/tm/scala/feature/secrets/plugin/Depend.scala +216 -0
  555. package/project/.sdk/tm/scala/feature/secrets/plugin/Env.scala +144 -0
  556. package/project/.sdk/tm/scala/feature/secrets/plugin/Export.scala +59 -0
  557. package/project/.sdk/tm/scala/feature/secrets/plugin/Graph.scala +149 -0
  558. package/project/.sdk/tm/scala/feature/secrets/plugin/Host.scala +1089 -0
  559. package/project/.sdk/tm/scala/feature/secrets/plugin/Json.scala +156 -0
  560. package/project/.sdk/tm/scala/feature/secrets/plugin/Order.scala +169 -0
  561. package/project/.sdk/tm/scala/feature/secrets/plugin/Plugin.scala +47 -0
  562. package/project/.sdk/tm/scala/feature/secrets/plugin/Point.scala +107 -0
  563. package/project/.sdk/tm/scala/feature/secrets/plugin/Refs.scala +131 -0
  564. package/project/.sdk/tm/scala/feature/secrets/plugin/Resolve.scala +53 -0
  565. package/project/.sdk/tm/scala/feature/secrets/plugin/Types.scala +110 -0
  566. package/project/.sdk/tm/scala/feature/secrets/plugin/Value.scala +157 -0
  567. package/project/.sdk/tm/scala/feature/secrets/plugin/Version.scala +136 -0
  568. package/project/.sdk/tm/scala/feature/secrets/sekreto/Json.scala +302 -0
  569. package/project/.sdk/tm/scala/feature/secrets/sekreto/Provider.scala +20 -0
  570. package/project/.sdk/tm/scala/feature/secrets/sekreto/Providers.scala +281 -0
  571. package/project/.sdk/tm/scala/feature/secrets/sekreto/Sekreto.scala +473 -0
  572. package/project/.sdk/tm/scala/feature/secrets/sekreto/Spec.scala +123 -0
  573. package/project/.sdk/tm/scala/feature/secrets/sekreto/Support.scala +216 -0
  574. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Aws.scala +225 -0
  575. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Azuresecrets.scala +124 -0
  576. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Boru.scala +104 -0
  577. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Doppler.scala +68 -0
  578. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Gcpsecrets.scala +97 -0
  579. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Hashicorp.scala +131 -0
  580. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Httpjson.scala +209 -0
  581. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Infisical.scala +98 -0
  582. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Onepassword.scala +90 -0
  583. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Secretspec.scala +95 -0
  584. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Sigv4.scala +214 -0
  585. package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +971 -0
  586. package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +2 -2
  587. package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +2 -2
  588. package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +2 -2
  589. package/project/.sdk/tm/scala/utility/Make.scala +7 -0
  590. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/SecretsFeature.swift +669 -0
  591. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Capability.swift +98 -0
  592. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Catalog.swift +87 -0
  593. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Config.swift +298 -0
  594. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Depend.swift +209 -0
  595. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Env.swift +191 -0
  596. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Export.swift +63 -0
  597. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Graph.swift +158 -0
  598. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Host.swift +1141 -0
  599. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Json.swift +192 -0
  600. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Order.swift +183 -0
  601. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Point.swift +130 -0
  602. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Refs.swift +141 -0
  603. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Resolve.swift +59 -0
  604. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Types.swift +125 -0
  605. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Value.swift +198 -0
  606. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Version.swift +139 -0
  607. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Aws.swift +271 -0
  608. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Azuresecrets.swift +173 -0
  609. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Boru.swift +139 -0
  610. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Crypto.swift +198 -0
  611. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Doppler.swift +86 -0
  612. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Gcpsecrets.swift +129 -0
  613. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Hashicorp.swift +175 -0
  614. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Httpjson.swift +310 -0
  615. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Infisical.swift +140 -0
  616. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Onepassword.swift +118 -0
  617. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Proc.swift +105 -0
  618. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Secretspec.swift +111 -0
  619. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Sigv4.swift +297 -0
  620. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Addr.swift +120 -0
  621. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Json.swift +452 -0
  622. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Provider.swift +25 -0
  623. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Providers.swift +689 -0
  624. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Sekreto.swift +755 -0
  625. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeOptions.swift +9 -0
  626. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +30 -0
  627. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/feature/secrets/SecretsFeatureTest.swift +1030 -0
  628. package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +2 -2
  629. package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +2 -2
  630. package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +2 -2
  631. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +1 -1
  632. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +1 -1
  633. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +1 -1
  634. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +1 -1
  635. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +1 -1
  636. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +1 -1
  637. package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +1 -1
  638. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +1 -1
  639. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1 -1
  640. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +1 -1
  641. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +1 -1
  642. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +1 -1
  643. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +1 -1
  644. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +1 -1
  645. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +1 -1
  646. package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +1 -1
  647. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +1 -1
  648. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +1 -1
  649. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/aws.ts +1 -1
  650. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/azuresecrets.ts +1 -1
  651. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/boru.ts +1 -1
  652. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/doppler.ts +1 -1
  653. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/gcpsecrets.ts +1 -1
  654. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/hashicorp.ts +1 -1
  655. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +1 -1
  656. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/infisical.ts +1 -1
  657. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/onepassword.ts +1 -1
  658. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +1 -1
  659. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/sigv4.ts +1 -1
  660. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +1 -1
  661. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +1 -1
  662. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +1 -1
  663. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +1 -1
  664. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +1 -1
  665. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +1 -1
  666. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +1 -1
  667. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +1 -1
  668. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +1 -1
  669. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +1 -1
  670. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +1 -1
  671. package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +2 -2
  672. package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +2 -2
  673. package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +2 -2
  674. package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +2 -2
  675. package/project/sdkgen-package.json +1 -4
  676. package/src/helpers/manifest.ts +81 -1
  677. package/src/helpers/modelNames.ts +284 -0
  678. package/src/helpers/naming.ts +45 -1
  679. package/src/sdkgen.ts +11 -1
  680. package/src/testkit.ts +115 -26
  681. package/src/utility.ts +17 -7
  682. package/project/.sdk/model/target/dart.aon +0 -58
  683. package/project/.sdk/model/target/lean.aon +0 -91
  684. package/project/.sdk/model/target/seneca-provider.aon +0 -120
  685. package/project/.sdk/src/cmp/dart/Config_dart.ts +0 -176
  686. package/project/.sdk/src/cmp/dart/EntityBase_dart.ts +0 -34
  687. package/project/.sdk/src/cmp/dart/EntityOperation_dart.ts +0 -43
  688. package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +0 -207
  689. package/project/.sdk/src/cmp/dart/Entity_dart.ts +0 -87
  690. package/project/.sdk/src/cmp/dart/Gitignore_dart.ts +0 -34
  691. package/project/.sdk/src/cmp/dart/MainEntity_dart.ts +0 -33
  692. package/project/.sdk/src/cmp/dart/Main_dart.ts +0 -106
  693. package/project/.sdk/src/cmp/dart/Package_dart.ts +0 -82
  694. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +0 -177
  695. package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +0 -238
  696. package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +0 -53
  697. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +0 -152
  698. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +0 -59
  699. package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +0 -65
  700. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +0 -151
  701. package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +0 -63
  702. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +0 -225
  703. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +0 -397
  704. package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +0 -24
  705. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +0 -106
  706. package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +0 -78
  707. package/project/.sdk/src/cmp/dart/SdkError_dart.ts +0 -42
  708. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +0 -516
  709. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +0 -628
  710. package/project/.sdk/src/cmp/dart/Test_dart.ts +0 -116
  711. package/project/.sdk/src/cmp/dart/fragment/Config.data.fragment.dart +0 -79
  712. package/project/.sdk/src/cmp/dart/fragment/Config.fragment.dart +0 -51
  713. package/project/.sdk/src/cmp/dart/fragment/Direct.test.fragment.dart +0 -25
  714. package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +0 -29
  715. package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +0 -28
  716. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +0 -302
  717. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +0 -98
  718. package/project/.sdk/src/cmp/dart/fragment/EntityListOp.fragment.dart +0 -90
  719. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +0 -102
  720. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +0 -108
  721. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +0 -102
  722. package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +0 -338
  723. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +0 -26
  724. package/project/.sdk/src/cmp/dart/tsconfig.json +0 -15
  725. package/project/.sdk/src/cmp/dart/utility_dart.ts +0 -155
  726. package/project/.sdk/src/cmp/lean/Config_lean.ts +0 -93
  727. package/project/.sdk/src/cmp/lean/Entity_lean.ts +0 -9
  728. package/project/.sdk/src/cmp/lean/Gitignore_lean.ts +0 -18
  729. package/project/.sdk/src/cmp/lean/Main_lean.ts +0 -120
  730. package/project/.sdk/src/cmp/lean/Package_lean.ts +0 -93
  731. package/project/.sdk/src/cmp/lean/ReadmeEntity_lean.ts +0 -29
  732. package/project/.sdk/src/cmp/lean/ReadmeExplanation_lean.ts +0 -19
  733. package/project/.sdk/src/cmp/lean/ReadmeHowto_lean.ts +0 -25
  734. package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +0 -39
  735. package/project/.sdk/src/cmp/lean/ReadmeIntro_lean.ts +0 -25
  736. package/project/.sdk/src/cmp/lean/ReadmeModel_lean.ts +0 -24
  737. package/project/.sdk/src/cmp/lean/ReadmeOptions_lean.ts +0 -22
  738. package/project/.sdk/src/cmp/lean/ReadmeQuick_lean.ts +0 -50
  739. package/project/.sdk/src/cmp/lean/ReadmeRef_lean.ts +0 -40
  740. package/project/.sdk/src/cmp/lean/ReadmeTopHowto_lean.ts +0 -16
  741. package/project/.sdk/src/cmp/lean/ReadmeTopQuick_lean.ts +0 -23
  742. package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +0 -19
  743. package/project/.sdk/src/cmp/lean/Test_lean.ts +0 -261
  744. package/project/.sdk/src/cmp/lean/utility_lean.ts +0 -129
  745. package/project/.sdk/src/cmp/seneca-provider/Extras_seneca-provider.ts +0 -4080
  746. package/project/.sdk/src/cmp/seneca-provider/Gitignore_seneca-provider.ts +0 -161
  747. package/project/.sdk/src/cmp/seneca-provider/Main_seneca-provider.ts +0 -1011
  748. package/project/.sdk/tm/dart/LICENSE +0 -22
  749. package/project/.sdk/tm/dart/Makefile +0 -50
  750. package/project/.sdk/tm/dart/lib/Context.dart +0 -150
  751. package/project/.sdk/tm/dart/lib/Control.dart +0 -15
  752. package/project/.sdk/tm/dart/lib/Operation.dart +0 -31
  753. package/project/.sdk/tm/dart/lib/Point.dart +0 -51
  754. package/project/.sdk/tm/dart/lib/Response.dart +0 -32
  755. package/project/.sdk/tm/dart/lib/Result.dart +0 -39
  756. package/project/.sdk/tm/dart/lib/Spec.dart +0 -49
  757. package/project/.sdk/tm/dart/lib/feature/audit/AuditFeature.dart +0 -103
  758. package/project/.sdk/tm/dart/lib/feature/base/BaseFeature.dart +0 -76
  759. package/project/.sdk/tm/dart/lib/feature/cache/CacheFeature.dart +0 -152
  760. package/project/.sdk/tm/dart/lib/feature/clienttrack/ClienttrackFeature.dart +0 -104
  761. package/project/.sdk/tm/dart/lib/feature/cost/CostFeature.dart +0 -446
  762. package/project/.sdk/tm/dart/lib/feature/debug/DebugFeature.dart +0 -153
  763. package/project/.sdk/tm/dart/lib/feature/idempotency/IdempotencyFeature.dart +0 -92
  764. package/project/.sdk/tm/dart/lib/feature/log/LogFeature.dart +0 -85
  765. package/project/.sdk/tm/dart/lib/feature/metrics/MetricsFeature.dart +0 -103
  766. package/project/.sdk/tm/dart/lib/feature/netsim/NetsimFeature.dart +0 -186
  767. package/project/.sdk/tm/dart/lib/feature/paging/PagingFeature.dart +0 -240
  768. package/project/.sdk/tm/dart/lib/feature/proxy/ProxyFeature.dart +0 -118
  769. package/project/.sdk/tm/dart/lib/feature/ratelimit/RatelimitFeature.dart +0 -103
  770. package/project/.sdk/tm/dart/lib/feature/rbac/RbacFeature.dart +0 -121
  771. package/project/.sdk/tm/dart/lib/feature/retry/RetryFeature.dart +0 -155
  772. package/project/.sdk/tm/dart/lib/feature/streaming/StreamingFeature.dart +0 -97
  773. package/project/.sdk/tm/dart/lib/feature/telemetry/TelemetryFeature.dart +0 -136
  774. package/project/.sdk/tm/dart/lib/feature/test/TestFeature.dart +0 -328
  775. package/project/.sdk/tm/dart/lib/feature/timeout/TimeoutFeature.dart +0 -104
  776. package/project/.sdk/tm/dart/lib/utility/CleanUtility.dart +0 -12
  777. package/project/.sdk/tm/dart/lib/utility/DoneUtility.dart +0 -18
  778. package/project/.sdk/tm/dart/lib/utility/ErrUtility.dart +0 -46
  779. package/project/.sdk/tm/dart/lib/utility/FeatureAddUtility.dart +0 -35
  780. package/project/.sdk/tm/dart/lib/utility/FeatureHookUtility.dart +0 -20
  781. package/project/.sdk/tm/dart/lib/utility/FeatureInitUtility.dart +0 -9
  782. package/project/.sdk/tm/dart/lib/utility/FetcherUtility.dart +0 -104
  783. package/project/.sdk/tm/dart/lib/utility/GraphqlUtility.dart +0 -162
  784. package/project/.sdk/tm/dart/lib/utility/MakeContextUtility.dart +0 -6
  785. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +0 -71
  786. package/project/.sdk/tm/dart/lib/utility/MakeFetchDefUtility.dart +0 -42
  787. package/project/.sdk/tm/dart/lib/utility/MakeOptionsUtility.dart +0 -233
  788. package/project/.sdk/tm/dart/lib/utility/MakePointUtility.dart +0 -130
  789. package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +0 -66
  790. package/project/.sdk/tm/dart/lib/utility/MakeResponseUtility.dart +0 -59
  791. package/project/.sdk/tm/dart/lib/utility/MakeResultUtility.dart +0 -49
  792. package/project/.sdk/tm/dart/lib/utility/MakeSpecUtility.dart +0 -77
  793. package/project/.sdk/tm/dart/lib/utility/MakeUrlUtility.dart +0 -51
  794. package/project/.sdk/tm/dart/lib/utility/ParamUtility.dart +0 -56
  795. package/project/.sdk/tm/dart/lib/utility/PrepareAuthUtility.dart +0 -46
  796. package/project/.sdk/tm/dart/lib/utility/PrepareBodyUtility.dart +0 -19
  797. package/project/.sdk/tm/dart/lib/utility/PrepareHeadersUtility.dart +0 -11
  798. package/project/.sdk/tm/dart/lib/utility/PrepareMethodUtility.dart +0 -30
  799. package/project/.sdk/tm/dart/lib/utility/PrepareParamsUtility.dart +0 -23
  800. package/project/.sdk/tm/dart/lib/utility/PreparePathUtility.dart +0 -9
  801. package/project/.sdk/tm/dart/lib/utility/PrepareQueryUtility.dart +0 -18
  802. package/project/.sdk/tm/dart/lib/utility/ResultBasicUtility.dart +0 -29
  803. package/project/.sdk/tm/dart/lib/utility/ResultBodyUtility.dart +0 -15
  804. package/project/.sdk/tm/dart/lib/utility/ResultHeadersUtility.dart +0 -18
  805. package/project/.sdk/tm/dart/lib/utility/StructUtility.dart +0 -127
  806. package/project/.sdk/tm/dart/lib/utility/TransformRequestUtility.dart +0 -28
  807. package/project/.sdk/tm/dart/lib/utility/TransformResponseUtility.dart +0 -44
  808. package/project/.sdk/tm/dart/lib/utility/Utility.dart +0 -239
  809. package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +0 -2462
  810. package/project/.sdk/tm/dart/src/feature/README.md +0 -3
  811. package/project/.sdk/tm/dart/src/feature/proxy/.gitkeep +0 -0
  812. package/project/.sdk/tm/dart/src/feature/ratelimit/.gitkeep +0 -0
  813. package/project/.sdk/tm/dart/src/feature/rbac/.gitkeep +0 -0
  814. package/project/.sdk/tm/dart/src/feature/retry/.gitkeep +0 -0
  815. package/project/.sdk/tm/dart/src/feature/streaming/.gitkeep +0 -0
  816. package/project/.sdk/tm/dart/src/feature/telemetry/.gitkeep +0 -0
  817. package/project/.sdk/tm/dart/src/feature/test/.gitkeep +0 -0
  818. package/project/.sdk/tm/dart/src/feature/timeout/.gitkeep +0 -0
  819. package/project/.sdk/tm/dart/test/custom_test.dart +0 -65
  820. package/project/.sdk/tm/dart/test/exists_test.dart +0 -12
  821. package/project/.sdk/tm/dart/test/feature/harness.dart +0 -329
  822. package/project/.sdk/tm/dart/test/feature_test.dart +0 -1193
  823. package/project/.sdk/tm/dart/test/harness.dart +0 -153
  824. package/project/.sdk/tm/dart/test/netsim_test.dart +0 -48
  825. package/project/.sdk/tm/dart/test/omni.dart +0 -520
  826. package/project/.sdk/tm/dart/test/omni_smoke_test.dart +0 -143
  827. package/project/.sdk/tm/dart/test/pipeline_test.dart +0 -608
  828. package/project/.sdk/tm/dart/test/primary_test.dart +0 -476
  829. package/project/.sdk/tm/dart/test/sdk-test-control.json +0 -19
  830. package/project/.sdk/tm/dart/test/struct_test.dart +0 -468
  831. package/project/.sdk/tm/dart/test/utility.dart +0 -198
  832. package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +0 -7
  833. package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +0 -653
  834. package/project/.sdk/tm/dart/test/vendor/omni/util.dart +0 -232
  835. package/project/.sdk/tm/lean/LICENSE +0 -21
  836. package/project/.sdk/tm/lean/Makefile +0 -32
  837. package/project/.sdk/tm/lean/VERSION +0 -1
  838. package/project/.sdk/tm/lean/src/SdkFeature.lean +0 -171
  839. package/project/.sdk/tm/lean/src/SdkFeatures.lean +0 -787
  840. package/project/.sdk/tm/lean/src/SdkJson.lean +0 -134
  841. package/project/.sdk/tm/lean/src/SdkRuntime.lean +0 -374
  842. package/project/.sdk/tm/lean/src/SdkUtility.lean +0 -809
  843. package/project/.sdk/tm/lean/src/VoxgigStruct.lean +0 -2880
  844. package/project/.sdk/tm/lean/src/Vregex.lean +0 -412
  845. package/project/.sdk/tm/lean/src/feature/README.md +0 -5
  846. package/project/.sdk/tm/lean/src/feature/audit/.gitkeep +0 -0
  847. package/project/.sdk/tm/lean/src/feature/base/.gitkeep +0 -0
  848. package/project/.sdk/tm/lean/src/feature/cache/.gitkeep +0 -0
  849. package/project/.sdk/tm/lean/src/feature/clienttrack/.gitkeep +0 -0
  850. package/project/.sdk/tm/lean/src/feature/cost/.gitkeep +0 -0
  851. package/project/.sdk/tm/lean/src/feature/debug/.gitkeep +0 -0
  852. package/project/.sdk/tm/lean/src/feature/idempotency/.gitkeep +0 -0
  853. package/project/.sdk/tm/lean/src/feature/log/.gitkeep +0 -0
  854. package/project/.sdk/tm/lean/src/feature/metrics/.gitkeep +0 -0
  855. package/project/.sdk/tm/lean/src/feature/netsim/.gitkeep +0 -0
  856. package/project/.sdk/tm/lean/src/feature/paging/.gitkeep +0 -0
  857. package/project/.sdk/tm/lean/src/feature/proxy/.gitkeep +0 -0
  858. package/project/.sdk/tm/lean/src/feature/ratelimit/.gitkeep +0 -0
  859. package/project/.sdk/tm/lean/src/feature/rbac/.gitkeep +0 -0
  860. package/project/.sdk/tm/lean/src/feature/retry/.gitkeep +0 -0
  861. package/project/.sdk/tm/lean/src/feature/streaming/.gitkeep +0 -0
  862. package/project/.sdk/tm/lean/src/feature/telemetry/.gitkeep +0 -0
  863. package/project/.sdk/tm/lean/src/feature/test/.gitkeep +0 -0
  864. package/project/.sdk/tm/lean/src/feature/timeout/.gitkeep +0 -0
  865. package/project/.sdk/tm/lean/test/OmniResolver.lean +0 -358
  866. package/project/.sdk/tm/lean/test/OmniSmoke.lean +0 -174
  867. package/project/.sdk/tm/lean/test/StructCorpus.lean +0 -368
  868. package/project/.sdk/tm/lean/test/TFeature.lean +0 -281
  869. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +0 -227
  870. package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +0 -997
  871. package/project/.sdk/tm/seneca-provider/CODE_OF_CONDUCT.md +0 -132
  872. package/project/.sdk/tm/seneca-provider/LICENSE +0 -21
  873. package/project/.sdk/tm/seneca-provider/Makefile +0 -15
  874. package/project/.sdk/tm/seneca-provider/src/tsconfig.json +0 -18
  875. package/project/.sdk/tm/seneca-provider/test/tsconfig.json +0 -16
  876. package/project/.sdk/tm/seneca-provider/tsfmt.json +0 -3
  877. /package/project/.sdk/tm/{dart/src/feature/audit → clojure/src/feature/secrets}/.gitkeep +0 -0
  878. /package/project/.sdk/tm/{dart/src/feature/base → csharp/src/feature/secrets}/.gitkeep +0 -0
  879. /package/project/.sdk/tm/{dart/src/feature/cache → elixir/src/feature/secrets}/.gitkeep +0 -0
  880. /package/project/.sdk/tm/{dart/src/feature/clienttrack → java/src/feature/secrets}/.gitkeep +0 -0
  881. /package/project/.sdk/tm/{dart/src/feature/cost → kotlin/src/feature/secrets}/.gitkeep +0 -0
  882. /package/project/.sdk/tm/{dart/src/feature/debug → perl/src/feature/secrets}/.gitkeep +0 -0
  883. /package/project/.sdk/tm/{dart/src/feature/idempotency → php/src/feature/secrets}/.gitkeep +0 -0
  884. /package/project/.sdk/tm/{dart/src/feature/log → rb/src/feature/secrets}/.gitkeep +0 -0
  885. /package/project/.sdk/tm/{dart/src/feature/metrics → rust/src/feature/secrets}/.gitkeep +0 -0
  886. /package/project/.sdk/tm/{dart/src/feature/netsim → scala/src/feature/secrets}/.gitkeep +0 -0
  887. /package/project/.sdk/tm/{dart/src/feature/paging → swift/src/feature/secrets}/.gitkeep +0 -0
@@ -0,0 +1,1148 @@
1
+ package KOTLINPACKAGE.sdktest
2
+
3
+ // Behavioural tests for the secrets feature (vendored @voxgig/sekreto) -
4
+ // the kotlin port of tm/ts/test/feature/secrets/Secrets.test.ts.
5
+ //
6
+ // The contract under test: the `apikey` OPTION keeps its exact old meaning
7
+ // and always wins, because SecretsFeature places it FIRST in the provider
8
+ // chain (a `memory` store named `options`) - explicit-beats-lookup falls
9
+ // out of sekreto's first-hit rule rather than from special-case logic.
10
+ // With the feature inactive nothing changes at all. With it active and the
11
+ // option unset, the chain (a memory store, a custom provider, a vault)
12
+ // supplies the credential instead.
13
+ //
14
+ // This file lives in the test `feature/` container on purpose: `target add`
15
+ // trims it, along with the feature source and the vendored library, for a
16
+ // project whose model does not select `secrets`.
17
+ //
18
+ // THE CLIENT IS LIVE AND THE TRANSPORT IS THE THING COUNTED. Every wire
19
+ // assertion here runs against a real client whose `system.fetch` is the
20
+ // recorder - never `testSDK`, whose test feature REPLACES the fetcher with
21
+ // its own in-memory mock and would leave a `system.fetch` counter at zero
22
+ // for a healthy SDK carrying no secrets feature at all. An assertion that
23
+ // cannot fail pins no rule, so each fail-closed case additionally carries a
24
+ // CONTROL leg: the same construction with a WORKING provider must reach the
25
+ // same recorder exactly once, carrying the credential. Only then does a
26
+ // zero from the broken provider mean REFUSED rather than UNWIRED. And the
27
+ // refusal is matched on the PROVIDER'S OWN message, so an unrelated failure
28
+ // (a missing route, a blocked op) cannot stand in for fail-closed.
29
+ //
30
+ // The feature is CONSTRUCTED DIRECTLY and adopted through the `extend`
31
+ // option ONLY when the generated Config did not already install it, so
32
+ // these tests hold in any generated tree - and never double the feature
33
+ // (two transport wraps, two purchases) in one that did.
34
+ //
35
+ // NO ENVIRONMENT VARIABLES. The JVM has no supported way to set one for the
36
+ // current process, so the ts/go/js suites' `env` chains become `memory`
37
+ // chains and custom Provider objects here. The rule under test - the chain
38
+ // answers when the option does not - is identical either way.
39
+
40
+ import java.lang.reflect.Method
41
+ import java.util.concurrent.CountDownLatch
42
+ import java.util.concurrent.TimeUnit
43
+ import java.util.function.BiFunction
44
+ import java.util.function.Supplier
45
+
46
+ import org.junit.jupiter.api.Assertions.assertEquals
47
+ import org.junit.jupiter.api.Assertions.assertFalse
48
+ import org.junit.jupiter.api.Assertions.assertNotNull
49
+ import org.junit.jupiter.api.Assertions.assertNull
50
+ import org.junit.jupiter.api.Assertions.assertTrue
51
+ import org.junit.jupiter.api.Assertions.fail
52
+ import org.junit.jupiter.api.Test
53
+
54
+ import KOTLINPACKAGE.core.Config
55
+ import KOTLINPACKAGE.core.ProjectNameSDK
56
+ import KOTLINPACKAGE.core.SdkEntity
57
+ import KOTLINPACKAGE.feature.SecretsFeature
58
+ import KOTLINPACKAGE.feature.secrets.sekreto.Provider
59
+ import KOTLINPACKAGE.feature.secrets.sekreto.ProviderSpec
60
+
61
+ @Suppress("UNCHECKED_CAST")
62
+ class SecretsTest {
63
+
64
+ // -------------------------------------------------------------------
65
+ // The recording transport: system.fetch for a LIVE client, scripting one
66
+ // status per API call (the last repeating) and a token endpoint for the
67
+ // exchange tests.
68
+
69
+ class Call(
70
+ val url: String,
71
+ val auth: String,
72
+ val hasAuth: Boolean,
73
+ val body: String,
74
+ )
75
+
76
+ class Wire {
77
+ private val lock = Object()
78
+ private val recorded = mutableListOf<Call>()
79
+
80
+ var apistatus: List<Int> = listOf(200)
81
+ var tokens: List<String> = listOf("ACCESS01", "ACCESS02", "ACCESS03")
82
+ var tokenpath: String = "auth/token"
83
+ var respfield: String = "access_token"
84
+
85
+ // A token endpoint that starts refusing after `tokenok` successful
86
+ // purchases (0 refuses the first).
87
+ var tokenok: Int = Int.MAX_VALUE
88
+
89
+ private var issued = 0
90
+ private var apicalls = 0
91
+
92
+ // A java.util.function.BiFunction, not a bare kotlin lambda: that is the
93
+ // shape utility/Fetcher.kt dispatches on, and a Function2 would be
94
+ // silently ignored.
95
+ val fetch: BiFunction<String, MutableMap<String, Any?>, Any?> =
96
+ BiFunction { url, fetchdef -> serve(url, fetchdef) }
97
+
98
+ private fun serve(url: String, fetchdef: MutableMap<String, Any?>): Any? {
99
+ synchronized(lock) {
100
+ // The header value is SNAPSHOT here, not referenced: the retry path
101
+ // rewrites the same headers map in place, so a stored reference
102
+ // would make every earlier record show the newest token.
103
+ var auth = ""
104
+ var hasAuth = false
105
+ val headers = fetchdef["headers"]
106
+ if (headers is Map<*, *>) {
107
+ for (e in headers.entries) {
108
+ if ("authorization".equals(e.key.toString(), ignoreCase = true)) {
109
+ hasAuth = true
110
+ auth = e.value?.toString() ?: ""
111
+ }
112
+ }
113
+ }
114
+ val body = fetchdef["body"]
115
+ recorded.add(Call(url, auth, hasAuth, if (body is String) body else ""))
116
+
117
+ if (url.endsWith("/$tokenpath")) {
118
+ if (issued >= tokenok) {
119
+ issued++
120
+ return response(500, linkedMapOf<String, Any?>("error" to "nope"))
121
+ }
122
+ val token = tokens[minOf(issued, tokens.size - 1)]
123
+ issued++
124
+ return response(200, linkedMapOf<String, Any?>(respfield to token))
125
+ }
126
+
127
+ val status = apistatus[minOf(apicalls, apistatus.size - 1)]
128
+ apicalls++
129
+ return response(status, linkedMapOf<String, Any?>("ok" to (status < 400)))
130
+ }
131
+ }
132
+
133
+ private fun response(status: Int, payload: Any?): MutableMap<String, Any?> =
134
+ linkedMapOf(
135
+ "status" to status,
136
+ "statusText" to if (status < 400) "OK" else "ERR",
137
+ "headers" to linkedMapOf<String, Any?>(),
138
+ "json" to Supplier<Any?> { payload },
139
+ )
140
+
141
+ fun calls(): List<Call> = synchronized(lock) { recorded.toList() }
142
+
143
+ /** The recorded calls that did NOT go to the token endpoint. */
144
+ fun api(): List<Call> = calls().filter { !it.url.endsWith("/$tokenpath") }
145
+
146
+ fun token(): List<Call> = calls().filter { it.url.endsWith("/$tokenpath") }
147
+
148
+ /** What went out, for a message that names the leak rather than counting it. */
149
+ fun wire(): String = calls().joinToString(", ") { it.url + " auth=" + it.auth }
150
+ }
151
+
152
+ // -------------------------------------------------------------------
153
+ // Support.
154
+
155
+ companion object {
156
+ const val BASE = "http://secrets.test/api"
157
+ }
158
+
159
+ // A sekreto Provider built in code.
160
+ class TestProvider(
161
+ private val onlookup: (String) -> String?,
162
+ private val label: String = "custom:test",
163
+ ) : Provider {
164
+ override fun lookup(name: String): String? = onlookup(name)
165
+ override fun describe(): String = label
166
+ }
167
+
168
+ // The Authorization header carries the SPEC's credential prefix, which a
169
+ // TEMPLATE cannot know: an OpenAPI `http`/`bearer` scheme gives
170
+ // `Bearer <token>`, an apiKey scheme the raw token. So assert on the
171
+ // CREDENTIAL and let the prefix be whatever this SDK's API declares.
172
+ private fun credentialIs(header: String?, token: String) {
173
+ val got = header ?: ""
174
+ assertTrue(got == token || got.endsWith(" $token"),
175
+ "expected the authorization header to carry $token, got: \"$got\"")
176
+ }
177
+
178
+ private fun map(vararg pairs: Pair<String, Any?>): MutableMap<String, Any?> =
179
+ linkedMapOf(*pairs)
180
+
181
+ private fun secretsFeatureOf(client: ProjectNameSDK): SecretsFeature? =
182
+ client.features.firstOrNull { it is SecretsFeature } as? SecretsFeature
183
+
184
+ // Build the client, and ADOPT the feature via `extend` ONLY when the
185
+ // generated Config did not already install it: when this SDK was generated
186
+ // with `secrets` model-active, the ordinary factory path builds the
187
+ // instance, and adding a second via extend would DOUBLE the feature - two
188
+ // transport wraps, two resolutions, and a token purchase the assertions
189
+ // cannot account for.
190
+ private fun withSecrets(build: (Boolean) -> ProjectNameSDK): ProjectNameSDK {
191
+ val client = build(false)
192
+ if (null != secretsFeatureOf(client)) {
193
+ return client
194
+ }
195
+ return build(true)
196
+ }
197
+
198
+ // A LIVE client carrying the secrets feature, wired to the recorder.
199
+ private fun secretsClient(w: Wire, sdkopts: MutableMap<String, Any?>): ProjectNameSDK {
200
+ val opts = map(
201
+ "base" to BASE,
202
+ "system" to map("fetch" to w.fetch),
203
+ )
204
+ opts.putAll(sdkopts)
205
+
206
+ return withSecrets { extend ->
207
+ val use = LinkedHashMap(opts)
208
+ if (extend) {
209
+ use["extend"] = mutableListOf<Any?>(SecretsFeature())
210
+ }
211
+ ProjectNameSDK(use)
212
+ }
213
+ }
214
+
215
+ // The feature options block: one provider (a live Provider object, or a
216
+ // declarative spec / plain map), plus any extra feature options.
217
+ private fun chainOpts(
218
+ provider: Any?,
219
+ extra: MutableMap<String, Any?>? = null,
220
+ ): MutableMap<String, Any?> {
221
+ val fopts = map(
222
+ "active" to true,
223
+ "providers" to mutableListOf<Any?>(provider),
224
+ )
225
+ if (extra != null) {
226
+ fopts.putAll(extra)
227
+ }
228
+ return map("secrets" to fopts)
229
+ }
230
+
231
+ private val BROKEN = TestProvider(
232
+ { throw RuntimeException("vault unreachable") }, "broken:test")
233
+
234
+ private fun working(value: String) =
235
+ TestProvider({ name -> if ("apikey" == name) value else null }, "working:test")
236
+
237
+ // -------------------------------------------------------------------
238
+ // Driving real entity operations - which is what runs the whole pipeline
239
+ // and reaches the transport. Entity accessors are discovered by SHAPE (one
240
+ // Map argument, an SdkEntity return) rather than by name, because this
241
+ // file is a TEMPLATE and no project's entity names are known here. An op
242
+ // the API does not define fails BEFORE the transport, which is why several
243
+ // may need driving.
244
+
245
+ private fun accessors(client: ProjectNameSDK): List<Method> =
246
+ client.javaClass.methods
247
+ .filter {
248
+ 1 == it.parameterCount &&
249
+ SdkEntity::class.java.isAssignableFrom(it.returnType) &&
250
+ java.util.Map::class.java.isAssignableFrom(it.parameterTypes[0])
251
+ }
252
+ .sortedBy { it.name }
253
+
254
+ // Drives ops until `stop` reports the observable state a test waits for,
255
+ // and returns the last error an op raised (the operation's own outcome is
256
+ // otherwise irrelevant: no seeded data, a scripted response). `stop` is
257
+ // handed that last error too, so a fail-closed case can stop on EITHER
258
+ // outcome - the refusal it wants, or a request going out, which is the
259
+ // failure it exists to catch; stopping only on the refusal would report
260
+ // "nothing to assert on" for the leak.
261
+ private fun driveEntityOpUntil(
262
+ client: ProjectNameSDK,
263
+ what: String,
264
+ stop: (Throwable?) -> Boolean,
265
+ ): Throwable? {
266
+ var last: Throwable? = null
267
+
268
+ for (m in accessors(client)) {
269
+ val ent = m.invoke(client, null) as? SdkEntity ?: continue
270
+
271
+ for (op in listOf<(SdkEntity) -> Any?>(
272
+ { it.list(null, null) },
273
+ { it.load(null, null) },
274
+ )) {
275
+ try {
276
+ op(ent)
277
+ } catch (err: Throwable) {
278
+ last = err
279
+ }
280
+ if (stop(last)) {
281
+ return last
282
+ }
283
+ }
284
+ }
285
+
286
+ fail<Unit>("no entity operation $what - nothing to assert on")
287
+ return last
288
+ }
289
+
290
+ private fun driveEntityOp(client: ProjectNameSDK, w: Wire): Throwable? {
291
+ val before = w.api().size
292
+ return driveEntityOpUntil(client, "reached the transport") { before < w.api().size }
293
+ }
294
+
295
+ private fun messageOf(err: Throwable?): String {
296
+ var e = err
297
+ val parts = mutableListOf<String>()
298
+ while (null != e) {
299
+ parts.add(e.message ?: e.toString())
300
+ e = e.cause
301
+ }
302
+ return parts.joinToString(" <- ")
303
+ }
304
+
305
+ // ===================================================================
306
+ // The feature-inactive baseline: bit-identical behaviour.
307
+
308
+ @Test
309
+ fun inactiveApikeyOptionBehavesExactlyAsBefore() {
310
+ val client = ProjectNameSDK.testSDK(null, map("apikey" to "OPTKEY01"))
311
+ val fetchdef = client.prepare(map("path" to "/"))
312
+ val headers = fetchdef["headers"] as MutableMap<String, Any?>
313
+ credentialIs(headers["authorization"] as? String, "OPTKEY01")
314
+
315
+ // No runtime activation, no extend: the feature must not be installed,
316
+ // whatever this project's model says.
317
+ assertNull(secretsFeatureOf(client),
318
+ "the feature must not install itself without feature.secrets.active")
319
+ }
320
+
321
+ @Test
322
+ fun inactiveNoApikeyMeansNoAuthorizationHeader() {
323
+ val client = ProjectNameSDK.testSDK(null, null)
324
+ val fetchdef = client.prepare(map("path" to "/"))
325
+ val headers = fetchdef["headers"] as MutableMap<String, Any?>
326
+ assertFalse(headers.containsKey("authorization"),
327
+ "unexpected authorization header: " + headers["authorization"])
328
+ }
329
+
330
+ // ===================================================================
331
+ // Active: the provider chain, driven through real entity operations.
332
+
333
+ @Test
334
+ fun apikeyOptionStillWinsOverTheChain() {
335
+ val w = Wire()
336
+ val client = secretsClient(w, map(
337
+ "apikey" to "OPTKEY01",
338
+ "feature" to chainOpts(working("CHAINKEY01")),
339
+ ))
340
+
341
+ driveEntityOp(client, w)
342
+ credentialIs(w.api()[0].auth, "OPTKEY01")
343
+
344
+ // The explicit option is a real store, not a special case: a directed
345
+ // read names it like any other.
346
+ val sf = secretsFeatureOf(client)
347
+ assertNotNull(sf, "the extend seam did not install the feature")
348
+ assertEquals("OPTKEY01", sf!!.sekreto()!!.getfrom("options", "apikey"))
349
+ }
350
+
351
+ @Test
352
+ fun anOmittedApikeyDefersToTheChainAtTheTransportSeam() {
353
+ val w = Wire()
354
+ val client = secretsClient(w, map(
355
+ "feature" to chainOpts(working("CHAINKEY02")),
356
+ ))
357
+
358
+ // Before any op, nothing has been resolved.
359
+ assertEquals("", secretsFeatureOf(client)!!.credential(),
360
+ "the chain was consulted before any operation")
361
+
362
+ driveEntityOp(client, w)
363
+
364
+ // Resolution happens AT THE TRANSPORT - the one seam every wire path
365
+ // crosses - so the credential is ON THE WIRE, not merely resolved.
366
+ credentialIs(w.api()[0].auth, "CHAINKEY02")
367
+ assertEquals("CHAINKEY02", secretsFeatureOf(client)!!.credential())
368
+
369
+ // And the shared options map stays FROZEN: prepareAuth clones it on
370
+ // every request, so a feature writing to it would race every concurrent
371
+ // operation.
372
+ assertEquals("", client.optionsMap()["apikey"],
373
+ "the options map must stay unwritten after construction")
374
+ }
375
+
376
+ @Test
377
+ fun anExplicitlyEmptyApikeyAlsoDefersToTheChain() {
378
+ val w = Wire()
379
+ val client = secretsClient(w, map(
380
+ "apikey" to "",
381
+ "feature" to chainOpts(working("CHAINKEY03")),
382
+ ))
383
+
384
+ driveEntityOp(client, w)
385
+ credentialIs(w.api()[0].auth, "CHAINKEY03")
386
+ }
387
+
388
+ @Test
389
+ fun customProviderObjectsAreAcceptedVerbatim() {
390
+ val asked = mutableListOf<String>()
391
+ val w = Wire()
392
+ val client = secretsClient(w, map(
393
+ "feature" to chainOpts(TestProvider({ name ->
394
+ synchronized(asked) { asked.add(name) }
395
+ "CUSTOM01"
396
+ })),
397
+ ))
398
+
399
+ driveEntityOp(client, w)
400
+ credentialIs(w.api()[0].auth, "CUSTOM01")
401
+ assertTrue(asked.contains("apikey"),
402
+ "the custom provider was asked $asked, want it to include apikey")
403
+ }
404
+
405
+ @Test
406
+ fun typedProviderSpecsAreAcceptedVerbatim() {
407
+ // The typed arm of the providers list: a ProviderSpec built in code
408
+ // joins the chain without going through `specof`.
409
+ val w = Wire()
410
+ val client = secretsClient(w, map(
411
+ "feature" to chainOpts(ProviderSpec(
412
+ kind = "memory",
413
+ values = mapOf("APIKEY" to "SPECKEY01"),
414
+ )),
415
+ ))
416
+
417
+ driveEntityOp(client, w)
418
+ credentialIs(w.api()[0].auth, "SPECKEY01")
419
+ }
420
+
421
+ @Test
422
+ fun declarativeMemorySpecsAreAcceptedAsMaps() {
423
+ // A chain given as plain maps (the shape a config file produces) is
424
+ // turned into ProviderSpecs by sekreto's own `specof`.
425
+ val w = Wire()
426
+ val client = secretsClient(w, map(
427
+ "feature" to chainOpts(map(
428
+ "kind" to "memory",
429
+ "values" to map("APIKEY" to "MAPKEY01"),
430
+ )),
431
+ ))
432
+
433
+ driveEntityOp(client, w)
434
+ credentialIs(w.api()[0].auth, "MAPKEY01")
435
+ }
436
+
437
+ @Test
438
+ fun aMissEverywhereLeavesTheHeaderOff() {
439
+ val w = Wire()
440
+ val client = secretsClient(w, map(
441
+ "feature" to chainOpts(TestProvider({ null }, "empty:test")),
442
+ ))
443
+
444
+ driveEntityOp(client, w)
445
+
446
+ // A MISS falls through to an unauthenticated request - and leaves the
447
+ // header ABSENT rather than empty, which is what prepareAuth does.
448
+ assertFalse(w.api()[0].hasAuth,
449
+ "a chain MISS must leave the header off, got \"" + w.api()[0].auth + "\"")
450
+ }
451
+
452
+ @Test
453
+ fun authNullSuppressesTheCredentialChainOrNoChain() {
454
+ val w = Wire()
455
+ val client = secretsClient(w, map(
456
+ "auth" to null,
457
+ "apikey" to "OPTKEY01",
458
+ "feature" to chainOpts(working("CHAINKEY04")),
459
+ ))
460
+
461
+ driveEntityOp(client, w)
462
+
463
+ // Nothing on the wire, even though the chain would have resolved AND an
464
+ // explicit apikey was given.
465
+ assertFalse(w.api()[0].hasAuth,
466
+ "auth null must suppress the credential, got \"" + w.api()[0].auth + "\"")
467
+
468
+ // The suppression survives option validation rather than being replaced
469
+ // by the optspec's default auth map.
470
+ val opts = client.optionsMap()
471
+ assertTrue(opts.containsKey("auth"), "options.auth must stay present")
472
+ assertNull(opts["auth"], "options.auth must stay a null")
473
+ }
474
+
475
+ @Test
476
+ fun secretNameIsConfigurable() {
477
+ val w = Wire()
478
+ val client = secretsClient(w, map(
479
+ "feature" to chainOpts(
480
+ map("kind" to "memory", "values" to map("API_TOKEN" to "TOKKEY01")),
481
+ map("name" to "api.token")),
482
+ ))
483
+
484
+ driveEntityOp(client, w)
485
+ credentialIs(w.api()[0].auth, "TOKKEY01")
486
+ }
487
+
488
+ @Test
489
+ fun sekretoIsLiveForArbitrarySecretsAndRedaction() {
490
+ val w = Wire()
491
+ val client = secretsClient(w, map(
492
+ "feature" to chainOpts(map(
493
+ "kind" to "memory",
494
+ "values" to map("DB_PASSWORD" to "dbpass01"),
495
+ )),
496
+ ))
497
+
498
+ val secrets = secretsFeatureOf(client)!!.sekreto()!!
499
+ assertEquals("dbpass01", secrets.get("db.password"))
500
+ assertEquals("the password is [redacted], keep it safe",
501
+ secrets.redact("the password is dbpass01, keep it safe"))
502
+ }
503
+
504
+ // THE PROVIDER VOCABULARY IS NON-EMPTY.
505
+ //
506
+ // The model's choice of plugin groups IS the SDK's provider vocabulary:
507
+ // Config emits the selected definitions and the feature hands them to
508
+ // Sekreto, which refuses at CONSTRUCTION any kind it was not given. A
509
+ // feature that dropped them on the floor would carry every selected plugin
510
+ // FILE and refuse every one of their kinds at runtime, while every test
511
+ // using only built-in kinds stayed green.
512
+ //
513
+ // Conditional on this project selecting a group at all.
514
+ @Test
515
+ fun aSelectedPluginKindIsInTheSdkVocabulary() {
516
+ val plugins = Config.featurePlugins("secrets")
517
+ if (plugins.isEmpty()) {
518
+ return
519
+ }
520
+
521
+ val w = Wire()
522
+ val client = secretsClient(w, map(
523
+ "feature" to chainOpts(map(
524
+ "kind" to "memory", "values" to map("APIKEY" to "VOCAB01"))),
525
+ ))
526
+
527
+ val catalog = secretsFeatureOf(client)!!.sekreto()!!.catalog
528
+ for (d in plugins) {
529
+ val kind = (d as? Map<String, Any?>)?.get("name") as? String
530
+ assertNotNull(kind, "a selected plugin definition has no kind: $d")
531
+ assertTrue(catalog.has(kind!!),
532
+ "the model selected plugin kind '$kind' but the feature's Sekreto " +
533
+ "does not know it - the definitions never reached the chain")
534
+ }
535
+
536
+ driveEntityOp(client, w)
537
+ credentialIs(w.api()[0].auth, "VOCAB01")
538
+ }
539
+
540
+ // ===================================================================
541
+ // FAIL CLOSED. sekreto's miss-vs-error invariant: a MISS falls through, an
542
+ // ERROR does not. A broken vault must never degrade into an
543
+ // unauthenticated request.
544
+
545
+ @Test
546
+ fun aProviderErrorFailsTheEntityOpAndNothingReachesTheWire() {
547
+ // THE RULE, asserted first so a regression reports the leak itself.
548
+ val w = Wire()
549
+ val client = secretsClient(w, map("feature" to chainOpts(BROKEN)))
550
+
551
+ // Stop on EITHER outcome - the refusal, or a request going out. Stopping
552
+ // on the first op driven would report an op the API does not define
553
+ // (which fails BEFORE the transport) as the provider's refusal.
554
+ val err = driveEntityOpUntil(client, "refused the operation or sent one") {
555
+ last -> 0 < w.api().size || messageOf(last).contains("vault unreachable")
556
+ }
557
+
558
+ assertEquals(0, w.api().size,
559
+ "a request must not go out unauthenticated because a provider broke," +
560
+ " but one reached the transport: " + w.wire())
561
+ assertNotNull(err, "the operation must fail rather than proceed")
562
+ assertTrue(messageOf(err).contains("vault unreachable"),
563
+ "the failure must carry the PROVIDER'S own message, got: " + messageOf(err))
564
+
565
+ // CONTROL, which makes that zero mean REFUSED rather than UNWIRED: the
566
+ // same construction with a WORKING provider must reach the same
567
+ // transport, once, carrying the credential.
568
+ val control = Wire()
569
+ val ok = secretsClient(control, map("feature" to chainOpts(working("RAWKEY01"))))
570
+ driveEntityOp(ok, control)
571
+
572
+ assertEquals(1, control.api().size,
573
+ "the control operation did not reach system.fetch exactly once, so " +
574
+ "this test cannot observe a request going out at all: " + control.wire())
575
+ credentialIs(control.api()[0].auth, "RAWKEY01")
576
+ }
577
+
578
+ // THE RAW PATHS, which run NO feature hooks at all. If resolution lived in
579
+ // the PreSpec hook these would send an unauthenticated request and never
580
+ // notice; they are covered because the TRANSPORT is where resolution
581
+ // happens.
582
+ //
583
+ // `allow.op` is named explicitly: a project that narrows the default set
584
+ // would otherwise turn these into a false RED (the control leg refused
585
+ // before it reached the transport).
586
+
587
+ @Test
588
+ fun directCarriesTheChainCredentialAndFailsClosed() {
589
+ val w = Wire()
590
+ val client = secretsClient(w, map(
591
+ "allow" to map("op" to "direct,graphql"),
592
+ "feature" to chainOpts(working("DIRECTKEY01")),
593
+ ))
594
+
595
+ val res = client.direct(map("path" to "/direct-probe"))
596
+ assertEquals(true, res["ok"], "direct refused: " + res["err"])
597
+ assertEquals(1, w.api().size, "expected one direct call on the wire: " + w.wire())
598
+ credentialIs(w.api()[0].auth, "DIRECTKEY01")
599
+
600
+ // And fail-closed holds for raw access too: a broken chain refuses the
601
+ // direct call before anything reaches the wire, IN BAND.
602
+ val broken = Wire()
603
+ val bclient = secretsClient(broken, map(
604
+ "allow" to map("op" to "direct,graphql"),
605
+ "feature" to chainOpts(BROKEN),
606
+ ))
607
+
608
+ val bres = bclient.direct(map("path" to "/direct-probe"))
609
+ assertEquals(0, broken.api().size,
610
+ "a broken chain must not yield a raw request: " + broken.wire())
611
+ assertEquals(false, bres["ok"], "a broken chain must refuse the raw path")
612
+ assertTrue(messageOf(bres["err"] as? Throwable).contains("vault unreachable"),
613
+ "direct must report the PROVIDER'S own refusal, got: " +
614
+ messageOf(bres["err"] as? Throwable))
615
+ }
616
+
617
+ @Test
618
+ fun graphqlCarriesTheChainCredentialAndFailsClosed() {
619
+ val w = Wire()
620
+ val client = secretsClient(w, map(
621
+ "allow" to map("op" to "direct,graphql"),
622
+ "feature" to chainOpts(working("GQLKEY01")),
623
+ ))
624
+
625
+ val res = client.graphql("{ thing }", null, null)
626
+ assertEquals(true, res["ok"], "graphql refused: " + res["err"])
627
+ assertEquals(1, w.api().size, "expected one graphql call on the wire: " + w.wire())
628
+ credentialIs(w.api()[0].auth, "GQLKEY01")
629
+
630
+ val broken = Wire()
631
+ val bclient = secretsClient(broken, map(
632
+ "allow" to map("op" to "direct,graphql"),
633
+ "feature" to chainOpts(BROKEN),
634
+ ))
635
+
636
+ val bres = bclient.graphql("{ thing }", null, null)
637
+ assertEquals(0, broken.api().size,
638
+ "a broken chain must not yield a graphql request: " + broken.wire())
639
+ assertEquals(false, bres["ok"], "a broken chain must refuse graphql")
640
+ assertTrue(messageOf(bres["err"] as? Throwable).contains("vault unreachable"),
641
+ "graphql must report the PROVIDER'S own refusal, got: " +
642
+ messageOf(bres["err"] as? Throwable))
643
+ }
644
+
645
+ // ===================================================================
646
+ // FAIL CLOSED ON A CONSTRUCTION FAILURE. The chain a project configures
647
+ // can be wrong before a single lookup happens, and init() cannot fail the
648
+ // client construction the way ts's throwing init does - so it HOLDS the
649
+ // error (`initerr`) and the transport gate refuses to send.
650
+ //
651
+ // The entry pinned here is one the constructor refuses but init used to
652
+ // never SHOW it: a bare kind name where a spec belongs. init's `when`
653
+ // over the providers list had arms for a Provider, a ProviderSpec and a
654
+ // Map, and no `else` - so the entry was silently DROPPED, the chain got
655
+ // SHORTER rather than broken, and every request went out unauthenticated
656
+ // while the gate had nothing to refuse. That is fail-open by omission,
657
+ // and it survived every other case in this file because each of them
658
+ // configures the chain correctly.
659
+ //
660
+ // Three cases for the three wire paths - the entity pipeline, direct()
661
+ // and graphql() - each with its own CONTROL leg through the SAME live
662
+ // transport, so a zero means REFUSED and not UNWIRED. The refusal is
663
+ // matched on sekreto's OWN message, so an unrelated failure cannot
664
+ // stand in for it.
665
+
666
+ // A kind NAME where a provider or spec belongs - the natural slip for a
667
+ // reader of the ts docs. sekreto's constructor refuses exactly this.
668
+ private val MALFORMED: Any? = "hashicorp"
669
+ private val NOTAPROVIDER = "not a provider or a provider spec"
670
+
671
+ private fun saysNotAProvider(err: Any?): Boolean =
672
+ (if (err is Throwable) messageOf(err) else err?.toString() ?: "")
673
+ .contains(NOTAPROVIDER)
674
+
675
+ @Test
676
+ fun aMalformedProviderEntryFailsTheEntityOpAndNothingReachesTheWire() {
677
+ // CONTROL FIRST, so the zero below is known to be observable at all.
678
+ val control = Wire()
679
+ val ok = secretsClient(control, map("feature" to chainOpts(working("INITKEY01"))))
680
+ driveEntityOp(ok, control)
681
+ assertEquals(1, control.api().size,
682
+ "the control operation did not reach system.fetch exactly once, so " +
683
+ "this test cannot observe a request going out at all: " + control.wire())
684
+ credentialIs(control.api()[0].auth, "INITKEY01")
685
+
686
+ // THE RULE.
687
+ val w = Wire()
688
+ val client = secretsClient(w, map("feature" to chainOpts(MALFORMED)))
689
+
690
+ // The feature must still be INSTALLED: a construction failure that
691
+ // silently uninstalled it would be the same fail-open by another route,
692
+ // with nothing downstream gating anything.
693
+ assertNotNull(secretsFeatureOf(client),
694
+ "the secrets feature must stay installed on a construction failure")
695
+
696
+ val err = driveEntityOpUntil(client, "refused the operation or sent one") {
697
+ last -> 0 < w.api().size || saysNotAProvider(last)
698
+ }
699
+
700
+ assertEquals(0, w.api().size,
701
+ "a malformed providers entry was DROPPED and the shortened chain sent " +
702
+ "an UNAUTHENTICATED request: " + w.wire())
703
+ assertNotNull(err, "the entity op must fail when the chain cannot be built")
704
+ assertTrue(saysNotAProvider(err),
705
+ "the refusal must carry sekreto's own message ($NOTAPROVIDER), got: " +
706
+ messageOf(err))
707
+ }
708
+
709
+ @Test
710
+ fun aMalformedProviderEntryFailsDirectRatherThanSending() {
711
+ // CONTROL FIRST.
712
+ val control = Wire()
713
+ val res = secretsClient(control, map(
714
+ "allow" to map("op" to "direct,graphql"),
715
+ "feature" to chainOpts(working("INITKEY01")),
716
+ )).direct(map("path" to "/thing"))
717
+ assertEquals(true, res["ok"], "the control request failed: " + res["err"])
718
+ assertEquals(1, control.api().size,
719
+ "the control request did not reach system.fetch exactly once, so " +
720
+ "this test cannot observe a request going out at all: " + control.wire())
721
+ credentialIs(control.api()[0].auth, "INITKEY01")
722
+
723
+ // THE RULE. direct() runs no feature hook at all, so the ONLY thing
724
+ // that can refuse it is the transport gate.
725
+ val w = Wire()
726
+ val out = secretsClient(w, map(
727
+ "allow" to map("op" to "direct,graphql"),
728
+ "feature" to chainOpts(MALFORMED),
729
+ )).direct(map("path" to "/thing"))
730
+
731
+ assertEquals(0, w.api().size,
732
+ "a malformed providers entry was DROPPED and the shortened chain sent " +
733
+ "an UNAUTHENTICATED direct request: " + w.wire())
734
+ assertEquals(false, out["ok"],
735
+ "a chain that could not be built must refuse the raw path fail-closed")
736
+ assertTrue(saysNotAProvider(out["err"]),
737
+ "the refusal must carry sekreto's own message ($NOTAPROVIDER), got: " +
738
+ messageOf(out["err"] as? Throwable))
739
+ }
740
+
741
+ @Test
742
+ fun aMalformedProviderEntryFailsGraphqlRatherThanSending() {
743
+ // CONTROL FIRST.
744
+ val control = Wire()
745
+ val res = secretsClient(control, map(
746
+ "allow" to map("op" to "direct,graphql"),
747
+ "feature" to chainOpts(working("INITKEY01")),
748
+ )).graphql("{ thing }", null, null)
749
+ assertEquals(true, res["ok"], "the control request failed: " + res["err"])
750
+ assertEquals(1, control.api().size,
751
+ "the control request did not reach system.fetch exactly once, so " +
752
+ "this test cannot observe a request going out at all: " + control.wire())
753
+ credentialIs(control.api()[0].auth, "INITKEY01")
754
+
755
+ // THE RULE.
756
+ val w = Wire()
757
+ val out = secretsClient(w, map(
758
+ "allow" to map("op" to "direct,graphql"),
759
+ "feature" to chainOpts(MALFORMED),
760
+ )).graphql("{ thing }", null, null)
761
+
762
+ assertEquals(0, w.api().size,
763
+ "a malformed providers entry was DROPPED and the shortened chain sent " +
764
+ "an UNAUTHENTICATED graphql request: " + w.wire())
765
+ assertEquals(false, out["ok"],
766
+ "a chain that could not be built must refuse graphql fail-closed")
767
+ assertTrue(saysNotAProvider(out["err"]),
768
+ "the refusal must carry sekreto's own message ($NOTAPROVIDER), got: " +
769
+ messageOf(out["err"] as? Throwable))
770
+ }
771
+
772
+ @Test
773
+ fun aProviderRecoversAfterATransientFailure() {
774
+ var calls = 0
775
+ val w = Wire()
776
+ val client = secretsClient(w, map(
777
+ "feature" to chainOpts(TestProvider({ _ ->
778
+ val n = synchronized(this) { ++calls }
779
+ if (1 == n) {
780
+ throw RuntimeException("vault unreachable")
781
+ }
782
+ "RECOVERED01"
783
+ }, "flaky:test")),
784
+ ))
785
+
786
+ // A failed resolution is never cached, so the second op asks the chain
787
+ // again and succeeds. Holding the failure would mean a transient vault
788
+ // outage poisoned the client permanently.
789
+ driveEntityOpUntil(client, "consulted the chain") { 0 < calls }
790
+ assertEquals(0, w.api().size, "the first op must not reach the wire")
791
+
792
+ driveEntityOp(client, w)
793
+ credentialIs(w.api()[0].auth, "RECOVERED01")
794
+ }
795
+
796
+ @Test
797
+ fun uncachedMissRetractsTheCredential() {
798
+ var have = true
799
+ val w = Wire()
800
+ val client = secretsClient(w, map(
801
+ "feature" to chainOpts(
802
+ TestProvider({ _ -> if (synchronized(this) { have }) "REVOCABLE01" else null },
803
+ "revocable:test"),
804
+ map("cache" to false)),
805
+ ))
806
+
807
+ driveEntityOp(client, w)
808
+ credentialIs(w.api()[0].auth, "REVOCABLE01")
809
+
810
+ synchronized(this) { have = false }
811
+
812
+ driveEntityOp(client, w)
813
+ val last = w.api().last()
814
+ assertFalse(last.hasAuth && "" != last.auth,
815
+ "after the chain reports a miss the retracted credential must not go " +
816
+ "out; the wire saw \"" + last.auth + "\"")
817
+ }
818
+
819
+ // A provider failure closes the transport gate; a later retry that
820
+ // SUCCEEDS reopens it and every waiting operation goes out with the FRESH
821
+ // credential - never the stale pre-failure header, and never nothing.
822
+ @Test
823
+ fun gateRecoveryLetsWaitingOperationsOutWithTheFreshCredential() {
824
+ var mode = "fail"
825
+ val release = CountDownLatch(1)
826
+ val w = Wire()
827
+
828
+ val client = secretsClient(w, map(
829
+ "feature" to chainOpts(
830
+ TestProvider({ _ ->
831
+ val m = synchronized(this) { mode }
832
+ if ("fail" == m) {
833
+ throw RuntimeException("vault unreachable")
834
+ }
835
+ if ("slow" == m) {
836
+ release.await(5, TimeUnit.SECONDS)
837
+ }
838
+ "FRESH01"
839
+ }, "gate:test"),
840
+ map("cache" to false)),
841
+ ))
842
+
843
+ // 1. The failure closes the gate: nothing reaches the wire. Stop on
844
+ // EITHER outcome, so an op the API does not define (which fails before
845
+ // the transport) is not mistaken for the gate's refusal.
846
+ driveEntityOpUntil(client, "was refused by the gate or sent one") {
847
+ last -> 0 < w.api().size || messageOf(last).contains("vault unreachable")
848
+ }
849
+ assertEquals(0, w.api().size,
850
+ "a failed resolution must keep the wire silent, saw: " + w.wire())
851
+
852
+ // 2. Recovery under concurrency: two operations race the slow retry;
853
+ // both must come out carrying the fresh credential.
854
+ synchronized(this) { mode = "slow" }
855
+
856
+ // Each thread drives until SOMETHING reached the wire - its own op or
857
+ // the other thread's - which is the state the assertion reads.
858
+ val threads = (1..2).map {
859
+ Thread { driveEntityOpUntil(client, "recovered") { 0 < w.api().size } }
860
+ }
861
+ threads.forEach { it.start() }
862
+ Thread.sleep(50)
863
+ release.countDown()
864
+ threads.forEach { it.join(10000) }
865
+
866
+ assertTrue(0 < w.api().size, "recovery must let the operations out")
867
+ for (call in w.api()) {
868
+ credentialIs(call.auth, "FRESH01")
869
+ }
870
+ }
871
+
872
+ // ===================================================================
873
+ // ACCESS-TOKEN EXCHANGE.
874
+ //
875
+ // What the chain resolves is a REFRESH token, which is POSTed to a token
876
+ // endpoint for a short-lived ACCESS token; the access token is what the
877
+ // Authorization header carries; and when the API answers 401 the client
878
+ // buys another and tries the same request again, once.
879
+
880
+ private fun exchangeClient(
881
+ w: Wire,
882
+ refresh: String,
883
+ exchange: MutableMap<String, Any?>?,
884
+ extra: MutableMap<String, Any?>?,
885
+ ): ProjectNameSDK {
886
+ val x = map("active" to true)
887
+ if (exchange != null) {
888
+ x.putAll(exchange)
889
+ }
890
+
891
+ val fopts = map(
892
+ "active" to true,
893
+ "name" to "refresh_token",
894
+ "providers" to mutableListOf<Any?>(
895
+ if ("" == refresh) TestProvider({ null }, "norefresh:test")
896
+ else TestProvider(
897
+ { name -> if ("refresh_token" == name) refresh else null }, "refresh:test")),
898
+ "exchange" to x,
899
+ )
900
+
901
+ val opts = map("allow" to map("op" to "direct,graphql"), "feature" to map("secrets" to fopts))
902
+ if (extra != null) {
903
+ opts.putAll(extra)
904
+ }
905
+ return secretsClient(w, opts)
906
+ }
907
+
908
+ private fun bodyField(body: String, field: String): String? {
909
+ val parsed = KOTLINPACKAGE.utility.Json.parse(body)
910
+ return (parsed as? Map<String, Any?>)?.get(field) as? String
911
+ }
912
+
913
+ @Test
914
+ fun theRefreshTokenBuysAnAccessTokenAndTheRequestCarriesIt() {
915
+ val w = Wire()
916
+ val client = exchangeClient(w, "REFRESH01", null, null)
917
+
918
+ client.direct(map("path" to "/thing"))
919
+
920
+ assertEquals(1, w.token().size, "expected exactly one token purchase")
921
+ assertEquals("REFRESH01", bodyField(w.token()[0].body, "refresh_token"),
922
+ "the refresh token is sent in the request field")
923
+ assertEquals(1, w.api().size)
924
+ credentialIs(w.api()[0].auth, "ACCESS01")
925
+ }
926
+
927
+ @Test
928
+ fun theRefreshTokenIsMarshalledNotConcatenated() {
929
+ // A refresh token carrying a quote, backslash or newline must arrive as
930
+ // that literal value, not as malformed JSON.
931
+ val tricky = "re\"fresh\\to\nken"
932
+ val w = Wire()
933
+ val client = exchangeClient(w, "", map("refresh" to tricky), null)
934
+
935
+ client.direct(map("path" to "/thing"))
936
+
937
+ assertEquals(1, w.token().size)
938
+ assertEquals(tricky, bodyField(w.token()[0].body, "refresh_token"),
939
+ "the refresh token must arrive as its literal value: " + w.token()[0].body)
940
+ }
941
+
942
+ @Test
943
+ fun anExplicitExchangeRefreshWinsOverTheChain() {
944
+ val w = Wire()
945
+ val client = exchangeClient(w, "FROMCHAIN", map("refresh" to "EXPLICIT01"), null)
946
+
947
+ client.direct(map("path" to "/thing"))
948
+ assertEquals("EXPLICIT01", bodyField(w.token()[0].body, "refresh_token"))
949
+ }
950
+
951
+ @Test
952
+ fun onePurchaseServesManyRequests() {
953
+ val w = Wire()
954
+ val client = exchangeClient(w, "REFRESH01", null, null)
955
+
956
+ client.direct(map("path" to "/one"))
957
+ client.direct(map("path" to "/two"))
958
+ client.direct(map("path" to "/three"))
959
+
960
+ assertEquals(1, w.token().size, "a token still working must not be re-bought")
961
+ assertEquals(3, w.api().size)
962
+ }
963
+
964
+ @Test
965
+ fun concurrentFirstRequestsShareOnePurchase() {
966
+ val w = Wire()
967
+ val client = exchangeClient(w, "REFRESH01", null, null)
968
+
969
+ val threads = listOf("/a", "/b", "/c", "/d").map { p ->
970
+ Thread { client.direct(map("path" to p)) }
971
+ }
972
+ threads.forEach { it.start() }
973
+ threads.forEach { it.join(10000) }
974
+
975
+ assertEquals(1, w.token().size,
976
+ "four operations at once must not open four token requests")
977
+ assertEquals(4, w.api().size)
978
+ }
979
+
980
+ @Test
981
+ fun anExpiryBuysAnotherTokenAndRetriesTheSameRequest() {
982
+ val w = Wire()
983
+ w.apistatus = listOf(401, 200)
984
+ val client = exchangeClient(w, "REFRESH01", null, null)
985
+
986
+ val res = client.direct(map("path" to "/thing"))
987
+
988
+ assertEquals(2, w.token().size, "expected a second token purchase")
989
+ assertEquals(2, w.api().size, "expected the request to be retried")
990
+ credentialIs(w.api()[0].auth, "ACCESS01")
991
+ // The retry must carry the NEW token, not the spent one.
992
+ credentialIs(w.api()[1].auth, "ACCESS02")
993
+ assertEquals(true, res["ok"], "the caller sees the successful retry")
994
+ }
995
+
996
+ @Test
997
+ fun theRetryHappensOnceNotInALoop() {
998
+ val w = Wire()
999
+ w.apistatus = listOf(401)
1000
+ val client = exchangeClient(w, "REFRESH01", null, null)
1001
+
1002
+ client.direct(map("path" to "/thing"))
1003
+
1004
+ assertEquals(2, w.api().size, "exactly one retry")
1005
+ assertEquals(2, w.token().size)
1006
+ }
1007
+
1008
+ @Test
1009
+ fun aStatusOutsideExchangeStatusesIsNotAnExpiry() {
1010
+ val w = Wire()
1011
+ w.apistatus = listOf(403)
1012
+ val client = exchangeClient(w, "REFRESH01", null, null)
1013
+
1014
+ client.direct(map("path" to "/thing"))
1015
+
1016
+ assertEquals(1, w.api().size, "403 is not in the default statuses")
1017
+ assertEquals(1, w.token().size)
1018
+ }
1019
+
1020
+ @Test
1021
+ fun exchangeStatusesIsConfigurable() {
1022
+ val w = Wire()
1023
+ w.apistatus = listOf(403, 200)
1024
+ val client = exchangeClient(w, "REFRESH01",
1025
+ map("statuses" to mutableListOf<Any?>(403)), null)
1026
+
1027
+ client.direct(map("path" to "/thing"))
1028
+ assertEquals(2, w.api().size, "403 was declared an expiry")
1029
+ }
1030
+
1031
+ @Test
1032
+ fun theRequestAndResponseFieldNamesAndPathAreConfigurable() {
1033
+ val w = Wire()
1034
+ w.tokenpath = "oauth/grant"
1035
+ w.respfield = "token"
1036
+ val client = exchangeClient(w, "REFRESH01", map(
1037
+ "path" to "oauth/grant",
1038
+ "request" to "grant",
1039
+ "response" to "token",
1040
+ ), null)
1041
+
1042
+ client.direct(map("path" to "/thing"))
1043
+
1044
+ assertEquals(1, w.token().size)
1045
+ assertTrue(w.token()[0].url.endsWith("/oauth/grant"),
1046
+ "the token endpoint is relative to base: " + w.token()[0].url)
1047
+ assertEquals("REFRESH01", bodyField(w.token()[0].body, "grant"))
1048
+ credentialIs(w.api()[0].auth, "ACCESS01")
1049
+ }
1050
+
1051
+ @Test
1052
+ fun anExplicitApikeyIsSpentBeforeAnythingIsBought() {
1053
+ val w = Wire()
1054
+ val client = exchangeClient(w, "REFRESH01", null, map("apikey" to "HELDTOKEN01"))
1055
+
1056
+ client.direct(map("path" to "/thing"))
1057
+
1058
+ assertEquals(0, w.token().size, "nothing needed buying")
1059
+ credentialIs(w.api()[0].auth, "HELDTOKEN01")
1060
+ }
1061
+
1062
+ @Test
1063
+ fun aHeldApikeyThatHasExpiredFallsThroughToTheExchange() {
1064
+ val w = Wire()
1065
+ w.apistatus = listOf(401, 200)
1066
+ val client = exchangeClient(w, "REFRESH01", null, map("apikey" to "STALETOKEN01"))
1067
+
1068
+ client.direct(map("path" to "/thing"))
1069
+
1070
+ credentialIs(w.api()[0].auth, "STALETOKEN01")
1071
+ credentialIs(w.api()[1].auth, "ACCESS01")
1072
+ }
1073
+
1074
+ @Test
1075
+ fun noRefreshTokenAnywhereIsAnErrorNotAnUnauthenticatedCall() {
1076
+ val w = Wire()
1077
+ val client = exchangeClient(w, "", null, null)
1078
+
1079
+ val res = client.direct(map("path" to "/thing"))
1080
+
1081
+ assertEquals(false, res["ok"], "expected a failure, got: $res")
1082
+ assertEquals(0, w.api().size,
1083
+ "a request must not go out unauthenticated because the chain was " +
1084
+ "empty: " + w.wire())
1085
+ assertTrue(messageOf(res["err"] as? Throwable).contains("no refresh token"),
1086
+ "expected the no-refresh-token refusal, got: " +
1087
+ messageOf(res["err"] as? Throwable))
1088
+ }
1089
+
1090
+ @Test
1091
+ fun aFailingTokenEndpointSurfacesTheApiRefusalNotASpin() {
1092
+ val w = Wire()
1093
+ w.apistatus = listOf(401)
1094
+ // The first purchase succeeds; the second (after the 401) does not.
1095
+ w.tokenok = 1
1096
+ val client = exchangeClient(w, "REFRESH01", null, null)
1097
+
1098
+ val res = client.direct(map("path" to "/thing"))
1099
+
1100
+ assertNotNull(res, "the caller got an answer rather than a hang")
1101
+ assertEquals(1, w.api().size, "no retry after a failed purchase")
1102
+ assertEquals(false, res["ok"], "the API's own 401 is what the caller sees")
1103
+ }
1104
+
1105
+ @Test
1106
+ fun authNullSuppressesTheCredentialRefusalOrNot() {
1107
+ val w = Wire()
1108
+ w.apistatus = listOf(401)
1109
+ val client = exchangeClient(w, "REFRESH01", null, map("auth" to null))
1110
+
1111
+ client.direct(map("path" to "/thing"))
1112
+
1113
+ assertEquals(1, w.api().size, "a suppressed request must not be retried")
1114
+ assertFalse(w.api()[0].hasAuth,
1115
+ "no credential may be sent when auth is suppressed, got \"" +
1116
+ w.api()[0].auth + "\"")
1117
+ }
1118
+
1119
+ @Test
1120
+ fun testModeBuysNothingAndNeedsNoTokenEndpoint() {
1121
+ val w = Wire()
1122
+
1123
+ val client = withSecrets { extend ->
1124
+ val opts = map(
1125
+ "base" to BASE,
1126
+ "allow" to map("op" to "direct,graphql"),
1127
+ "system" to map("fetch" to w.fetch),
1128
+ "feature" to map("secrets" to map(
1129
+ "active" to true,
1130
+ "name" to "refresh_token",
1131
+ "providers" to mutableListOf<Any?>(TestProvider(
1132
+ { name -> if ("refresh_token" == name) "REFRESH01" else null })),
1133
+ "exchange" to map("active" to true),
1134
+ )),
1135
+ )
1136
+ if (extend) {
1137
+ opts["extend"] = mutableListOf<Any?>(SecretsFeature())
1138
+ }
1139
+ ProjectNameSDK.testSDK(null, opts)
1140
+ }
1141
+
1142
+ client.direct(map("path" to "/thing"))
1143
+
1144
+ assertEquals(0, w.calls().size, "test mode must not do IO: " + w.wire())
1145
+ // A deterministic placeholder, so offline suites need no configuration.
1146
+ assertEquals("test-access_token", secretsFeatureOf(client)!!.credential())
1147
+ }
1148
+ }