@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,957 @@
1
+ #!perl
2
+ # ProjectName SDK secrets feature test
3
+ #
4
+ # Behavioural tests for the secrets feature (vendored @voxgig/sekreto).
5
+ #
6
+ # The contract under test: the `apikey` OPTION keeps its exact old meaning
7
+ # and always wins, because the feature 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 (env, dotenv, a custom provider, a vault)
12
+ # supplies the credential instead.
13
+ #
14
+ # EVERY ASSERTION IS MADE ON THE WIRE, not on the harness.
15
+ #
16
+ # This port resolves at the TRANSPORT SEAM (feature/secrets_feature.pm),
17
+ # so the credential is not visible in prepare()'s fetchdef and there is no
18
+ # useful in-process proxy for "a request went out". Each client below is
19
+ # therefore a LIVE one whose `system.fetch` is the counter - the real
20
+ # transport the SDK reaches through utility/fetcher.pm - and never
21
+ # ProjectNameSDK->test, whose test feature REPLACES that transport with an
22
+ # in-memory mock. Under the mock, "no request was sent" holds for a
23
+ # healthy SDK carrying no secrets feature at all, so the assertion would
24
+ # pin nothing.
25
+ #
26
+ # For the same reason every fail-closed case carries a CONTROL leg: the
27
+ # same construction with a WORKING provider must reach the same transport
28
+ # exactly once, carrying the credential. Only then does a zero from the
29
+ # broken provider mean REFUSED rather than UNWIRED.
30
+ #
31
+ # This file lives in a `feature/` container on purpose: `target add` trims
32
+ # it, along with the feature source and the vendored library, for a
33
+ # project whose model does not select `secrets`.
34
+
35
+ use strict;
36
+ use warnings;
37
+ use Test::More;
38
+ use FindBin;
39
+ use lib "$FindBin::Bin/../../../lib";
40
+ use Scalar::Util ();
41
+
42
+ use ProjectNameSDK;
43
+
44
+ my $ENVPREFIX = 'PROJECTENV_TEST_SECRETS_';
45
+
46
+ my $RAWBASE = 'http://raw.test/api';
47
+ my $XBASE = 'http://exchange.test/api';
48
+
49
+
50
+ # --- Harness ---------------------------------------------------------------
51
+
52
+ # A transport that records every call it is handed, so "sent" is a fact
53
+ # about the wire rather than about a mock. Same ($res, $err) tuple shape
54
+ # utility/fetcher.pm's own transports return.
55
+ #
56
+ # `apistatus` is a SCRIPT - one status per API call, the last repeating -
57
+ # so a case can say "401 then 200" without counting calls itself.
58
+ sub counting_fetch {
59
+ my (%opt) = @_;
60
+ my $tokenpath = defined $opt{path} ? $opt{path} : 'auth/token';
61
+ my $respfield = defined $opt{response} ? $opt{response} : 'access_token';
62
+ my @tokens = @{ $opt{tokens} || ['ACCESS01', 'ACCESS02', 'ACCESS03'] };
63
+ my @apistatus = @{ $opt{apistatus} || [200] };
64
+
65
+ my $stub = { sent => 0, calls => [], issued => 0, apicall => -1 };
66
+
67
+ $stub->{istoken} = sub {
68
+ my ($url) = @_;
69
+ return ($url =~ m{/\Q$tokenpath\E\z}) ? 1 : 0;
70
+ };
71
+
72
+ $stub->{fetch} = sub {
73
+ my ($url, $fetchdef) = @_;
74
+ $fetchdef = {} unless defined $fetchdef;
75
+ my $headers = $fetchdef->{headers} || {};
76
+
77
+ $stub->{sent}++;
78
+ push @{ $stub->{calls} }, {
79
+ 'url' => $url,
80
+ 'method' => $fetchdef->{method},
81
+ 'body' => $fetchdef->{body},
82
+ 'auth' => $headers->{'authorization'},
83
+ };
84
+
85
+ if ($stub->{istoken}->($url)) {
86
+ return ({
87
+ 'status' => 401, 'statusText' => 'ERR', 'headers' => {},
88
+ 'json' => sub { { 'error' => 'nope' } }, 'body' => '{}',
89
+ }, undef) if $opt{tokenfails};
90
+
91
+ my $i = $stub->{issued};
92
+ $i = $#tokens if $i > $#tokens;
93
+ $stub->{issued}++;
94
+ my $body = { $respfield => $tokens[$i] };
95
+ return ({
96
+ 'status' => 200, 'statusText' => 'OK', 'headers' => {},
97
+ 'json' => sub { $body }, 'body' => '{}',
98
+ }, undef);
99
+ }
100
+
101
+ $stub->{apicall}++;
102
+ my $ai = $stub->{apicall};
103
+ $ai = $#apistatus if $ai > $#apistatus;
104
+ my $status = $apistatus[$ai];
105
+ return ({
106
+ 'status' => $status, 'statusText' => ($status < 400 ? 'OK' : 'ERR'),
107
+ 'headers' => {},
108
+ 'json' => sub { { 'ok' => ($status < 400 ? 1 : 0) } },
109
+ 'body' => '{}',
110
+ }, undef);
111
+ };
112
+
113
+ return $stub;
114
+ }
115
+
116
+
117
+ # Only the calls that went to the API, and only those that went to the
118
+ # token endpoint.
119
+ sub api_calls {
120
+ my ($stub) = @_;
121
+ return [grep { !$stub->{istoken}->($_->{url}) } @{ $stub->{calls} }];
122
+ }
123
+
124
+ sub token_calls {
125
+ my ($stub) = @_;
126
+ return [grep { $stub->{istoken}->($_->{url}) } @{ $stub->{calls} }];
127
+ }
128
+
129
+
130
+ # What went out, for a failure message that names the leak rather than
131
+ # just its count.
132
+ sub wire {
133
+ my ($stub) = @_;
134
+ return join(', ', map {
135
+ $_->{url} . ' auth=' . (defined $_->{auth} ? $_->{auth} : '(none)')
136
+ } @{ $stub->{calls} });
137
+ }
138
+
139
+
140
+ # The Authorization header carries the SPEC's credential prefix, which a
141
+ # TEMPLATE cannot know: an OpenAPI `http`/`bearer` scheme gives
142
+ # `Bearer <token>`, an apiKey scheme the raw token. So assert on the
143
+ # CREDENTIAL and let the prefix be whatever this SDK's API declares -
144
+ # pinning the whole header value passes only for a prefix-less API, and
145
+ # this file ships to every project that selects the feature.
146
+ sub credential_is {
147
+ my ($header, $token, $label) = @_;
148
+ my $got = defined $header ? "$header" : '';
149
+ ok(($got eq $token || $got =~ /\s\Q$token\E\z/),
150
+ ($label || 'credential') . ": expected the Authorization header to carry"
151
+ . " $token, got: '$got'");
152
+ }
153
+
154
+
155
+ sub no_credential {
156
+ my ($header, $label) = @_;
157
+ ok(!defined $header,
158
+ ($label || 'credential') . ': expected NO Authorization header, got: '
159
+ . (defined $header ? "'$header'" : '(none)'));
160
+ }
161
+
162
+
163
+ # A LIVE client. `allow.op` is named explicitly: a project that narrows
164
+ # the default set would otherwise turn these into a false RED (the control
165
+ # leg refused before it reached the transport), and the rule under test
166
+ # lives at the transport, downstream of the allow gate either way.
167
+ sub live_sdk {
168
+ my ($stub, $opts) = @_;
169
+ my %o = %{ $opts || {} };
170
+ $o{base} = $RAWBASE unless exists $o{base};
171
+ $o{allow} = { 'op' => 'direct,graphql,list,load,create,update,remove' }
172
+ unless exists $o{allow};
173
+ $o{system} = { 'fetch' => $stub->{fetch} };
174
+ return ProjectNameSDK->new(\%o);
175
+ }
176
+
177
+
178
+ sub secrets_sdk {
179
+ my ($stub, $sopts, $extra) = @_;
180
+ my %o = %{ $extra || {} };
181
+ $o{feature} = { 'secrets' => { 'active' => 1, %$sopts } };
182
+ return live_sdk($stub, \%o);
183
+ }
184
+
185
+
186
+ # An env chain, the shape most of these tests use.
187
+ sub envchain {
188
+ my (%extra) = @_;
189
+ return { 'providers' => [{ 'kind' => 'env', 'prefix' => $ENVPREFIX }], %extra };
190
+ }
191
+
192
+
193
+ my $BROKEN = {
194
+ 'lookup' => sub { die "vault unreachable\n" },
195
+ 'describe' => sub { 'broken:test' },
196
+ };
197
+
198
+ my $WORKING = {
199
+ 'lookup' => sub { my ($n) = @_; return 'apikey' eq $n ? 'RAWKEY01' : undef },
200
+ 'describe' => sub { 'working:test' },
201
+ };
202
+
203
+
204
+ # The first entity with a `list` op, discovered from the SDK's own config
205
+ # rather than named: this file is a TEMPLATE and no project's entity names
206
+ # are known here. SEARCH rather than taking the first entity and hoping -
207
+ # an API's first entity by name need not have a list.
208
+ sub listable_op {
209
+ my ($sdk) = @_;
210
+ my $entities = ProjectNameHelpers::to_map(
211
+ ProjectNameHelpers::gp($sdk->options_map, 'entity')) || {};
212
+ for my $name (sort keys %$entities) {
213
+ my $accessor = ucfirst($name);
214
+ next unless $sdk->can($accessor);
215
+ my $ent = eval { $sdk->$accessor() };
216
+ next unless defined $ent && Scalar::Util::blessed($ent) && $ent->can('list');
217
+ return sub { return $ent->list() };
218
+ }
219
+ return undef;
220
+ }
221
+
222
+
223
+ sub clear_env {
224
+ delete $ENV{$ENVPREFIX . 'APIKEY'};
225
+ delete $ENV{$ENVPREFIX . 'API_TOKEN'};
226
+ delete $ENV{$ENVPREFIX . 'REFRESH_TOKEN'};
227
+ }
228
+
229
+
230
+ # --- Inactive: the feature costs nothing -----------------------------------
231
+
232
+ {
233
+ clear_env();
234
+
235
+ my $stub = counting_fetch();
236
+ my $sdk = live_sdk($stub, { 'apikey' => 'OPTKEY01' });
237
+ $sdk->direct({ 'path' => '/thing' });
238
+
239
+ is($stub->{sent}, 1, 'inactive: the request went out');
240
+ credential_is($stub->{calls}[0]{auth}, 'OPTKEY01',
241
+ 'inactive: apikey option behaves exactly as before');
242
+
243
+ # No feature, no instance: the accessor is the only way in.
244
+ is($sdk->secrets, undef, 'inactive: no live sekreto');
245
+ }
246
+
247
+ {
248
+ my $stub = counting_fetch();
249
+ my $sdk = live_sdk($stub, {});
250
+ $sdk->direct({ 'path' => '/thing' });
251
+
252
+ is($stub->{sent}, 1, 'inactive: the request went out');
253
+ no_credential($stub->{calls}[0]{auth}, 'inactive: no apikey, no header');
254
+ }
255
+
256
+
257
+ # --- Active: where the credential comes from -------------------------------
258
+
259
+ {
260
+ clear_env();
261
+ $ENV{$ENVPREFIX . 'APIKEY'} = 'ENVKEY01';
262
+
263
+ my $stub = counting_fetch();
264
+ my $sdk = secrets_sdk($stub, envchain(), { 'apikey' => 'OPTKEY01' });
265
+ $sdk->direct({ 'path' => '/thing' });
266
+
267
+ credential_is($stub->{calls}[0]{auth}, 'OPTKEY01',
268
+ 'active: an explicit apikey still wins over the chain');
269
+
270
+ # The explicit option is a real store, not a special case: a directed
271
+ # read names it like any other.
272
+ is($sdk->secrets->getfrom('options', 'apikey'), 'OPTKEY01',
273
+ 'active: the explicit apikey is the `options` memory store');
274
+ }
275
+
276
+ # The three ways an apikey can be "not given", pinned together because
277
+ # they are easy to conflate and only one of them is a suppression.
278
+ # make_options normalises an omitted apikey to '' before features
279
+ # initialise, so by init time omitted and explicit-empty are
280
+ # indistinguishable - both defer to the chain, deliberately.
281
+ {
282
+ clear_env();
283
+ $ENV{$ENVPREFIX . 'APIKEY'} = 'ENVKEY01';
284
+
285
+ my $stub = counting_fetch();
286
+ secrets_sdk($stub, envchain())->direct({ 'path' => '/thing' });
287
+ credential_is($stub->{calls}[0]{auth}, 'ENVKEY01',
288
+ 'active: an OMITTED apikey defers to the chain');
289
+
290
+ my $stub2 = counting_fetch();
291
+ secrets_sdk($stub2, envchain(), { 'apikey' => '' })->direct({ 'path' => '/thing' });
292
+ credential_is($stub2->{calls}[0]{auth}, 'ENVKEY01',
293
+ 'active: an explicitly EMPTY apikey also defers to the chain');
294
+ }
295
+
296
+ # THE PERL SPELLING OF A CUSTOM PROVIDER IS A MAP OF CALLABLES.
297
+ #
298
+ # make_options deep-clones the option tree, and Voxgig::Struct::clone
299
+ # UNBLESSES objects while preserving coderefs - so the ts contract
300
+ # ("custom provider objects are accepted verbatim") cannot hold here: a
301
+ # blessed provider arrives at the feature as a plain hash with no methods.
302
+ # A map of callables is what survives, and it is what the docs use.
303
+ {
304
+ clear_env();
305
+
306
+ my @asked;
307
+ my $stub = counting_fetch();
308
+ my $sdk = secrets_sdk($stub, {
309
+ 'providers' => [{
310
+ 'lookup' => sub { push @asked, $_[0]; return 'CUSTOM01' },
311
+ 'describe' => sub { 'custom:test' },
312
+ }],
313
+ });
314
+ $sdk->direct({ 'path' => '/thing' });
315
+
316
+ credential_is($stub->{calls}[0]{auth}, 'CUSTOM01',
317
+ 'active: a map of callables is a provider');
318
+ is_deeply(\@asked, ['apikey'], 'active: the custom provider was asked once');
319
+ }
320
+
321
+ # ...and a map that is NEITHER a spec NOR a provider is refused by name,
322
+ # rather than failing deep inside the plugin host with an unrelated
323
+ # message. This is the shape a caller gets by passing a blessed provider
324
+ # object, which the option clone flattens.
325
+ {
326
+ clear_env();
327
+
328
+ my $stub = counting_fetch();
329
+ my $res = secrets_sdk($stub, { 'providers' => [{ 'notaprovider' => 1 }] })
330
+ ->direct({ 'path' => '/thing' });
331
+
332
+ is($stub->{sent}, 0,
333
+ 'active: a malformed provider must not send an unauthenticated request,'
334
+ . ' but one reached the transport: ' . wire($stub));
335
+ is($res->{ok}, 0, 'active: a malformed provider fails the request');
336
+ like("$res->{err}", qr/blessed provider object cannot survive/,
337
+ 'active: the refusal names the shape problem');
338
+ }
339
+
340
+ {
341
+ clear_env();
342
+
343
+ my $stub = counting_fetch();
344
+ my $sdk = secrets_sdk($stub, envchain());
345
+ my $res = $sdk->direct({ 'path' => '/thing' });
346
+
347
+ is($stub->{sent}, 1, 'active: a miss everywhere still sends the request');
348
+ no_credential($stub->{calls}[0]{auth},
349
+ 'active: a miss everywhere leaves the header off');
350
+ is($res->{ok}, 1, 'active: the request succeeded unauthenticated');
351
+ }
352
+
353
+
354
+ # --- FAIL CLOSED -----------------------------------------------------------
355
+ #
356
+ # sekreto's miss-vs-error invariant: a MISS falls through to the next
357
+ # provider, an ERROR does not. A broken vault must never degrade into an
358
+ # unauthenticated request.
359
+
360
+ {
361
+ clear_env();
362
+
363
+ # THE RULE, asserted first so a regression reports the leak itself.
364
+ my $stub = counting_fetch();
365
+ my $res = secrets_sdk($stub, { 'providers' => [$BROKEN] })
366
+ ->direct({ 'path' => '/thing' });
367
+
368
+ is($stub->{sent}, 0,
369
+ 'direct: a request must not go out unauthenticated because a provider'
370
+ . ' broke, but one reached the transport: ' . wire($stub));
371
+ is($res->{ok}, 0, 'direct: the operation failed');
372
+ like("$res->{err}", qr/vault unreachable/,
373
+ "direct: the failure carries the PROVIDER'S own message");
374
+
375
+ # CONTROL, which makes that zero mean REFUSED rather than UNWIRED.
376
+ my $control = counting_fetch();
377
+ my $ok = secrets_sdk($control, { 'providers' => [$WORKING] })
378
+ ->direct({ 'path' => '/thing' });
379
+
380
+ is($ok->{ok}, 1, 'direct control: the request succeeded');
381
+ is($control->{sent}, 1,
382
+ 'direct control: the request never reached system.fetch, so this test'
383
+ . ' cannot observe a request going out at all');
384
+ credential_is($control->{calls}[0]{auth}, 'RAWKEY01', 'direct control');
385
+ }
386
+
387
+ {
388
+ clear_env();
389
+
390
+ my $stub = counting_fetch();
391
+ my $res = secrets_sdk($stub, { 'providers' => [$BROKEN] })
392
+ ->graphql('{ thing }', {});
393
+
394
+ is($stub->{sent}, 0,
395
+ 'graphql: a request must not go out unauthenticated, but one reached'
396
+ . ' the transport: ' . wire($stub));
397
+ is($res->{ok}, 0, 'graphql: the operation failed');
398
+ like("$res->{err}", qr/vault unreachable/,
399
+ "graphql: the failure carries the PROVIDER'S own message");
400
+
401
+ my $control = counting_fetch();
402
+ my $ok = secrets_sdk($control, { 'providers' => [$WORKING] })
403
+ ->graphql('{ thing }', {});
404
+
405
+ is($ok->{ok}, 1, 'graphql control: the request succeeded');
406
+ is($control->{sent}, 1,
407
+ 'graphql control: the request never reached system.fetch, so this test'
408
+ . ' cannot observe a request going out at all');
409
+ credential_is($control->{calls}[0]{auth}, 'RAWKEY01', 'graphql control');
410
+ }
411
+
412
+ # The ENTITY path, which DOES run feature hooks - so it must fail closed
413
+ # for the same reason and by the same rule.
414
+ SKIP: {
415
+ clear_env();
416
+
417
+ my $stub = counting_fetch();
418
+ my $sdk = secrets_sdk($stub, { 'providers' => [$BROKEN] });
419
+ my $op = listable_op($sdk);
420
+
421
+ skip('this SDK has no listable entity', 5) unless defined $op;
422
+
423
+ my $out = eval { $op->(); 1 };
424
+ my $err = $@;
425
+
426
+ ok(!$out, 'entity: a broken provider fails the operation');
427
+ like("$err", qr/vault unreachable/,
428
+ "entity: the failure carries the PROVIDER'S own message");
429
+ is($stub->{sent}, 0,
430
+ 'entity: a request must not go out unauthenticated because a provider'
431
+ . ' broke, but one reached the transport: ' . wire($stub));
432
+
433
+ my $control = counting_fetch();
434
+ my $csdk = secrets_sdk($control, { 'providers' => [$WORKING] });
435
+ my $cop = listable_op($csdk);
436
+ eval { $cop->() };
437
+
438
+ is($control->{sent}, 1,
439
+ 'entity control: the request never reached system.fetch, so this test'
440
+ . ' cannot observe a request going out at all');
441
+ credential_is($control->{calls}[0]{auth}, 'RAWKEY01', 'entity control');
442
+ }
443
+
444
+ # A failure must not be REMEMBERED. Holding one meant a transient vault
445
+ # outage poisoned the client permanently: every later operation kept
446
+ # failing with the original error long after the vault recovered.
447
+ {
448
+ clear_env();
449
+
450
+ my $calls = 0;
451
+ my $flaky = {
452
+ 'lookup' => sub {
453
+ $calls++;
454
+ die "vault unreachable\n" if 1 == $calls;
455
+ return 'RECOVERED01';
456
+ },
457
+ 'describe' => sub { 'flaky:test' },
458
+ };
459
+
460
+ my $stub = counting_fetch();
461
+ my $sdk = secrets_sdk($stub, { 'providers' => [$flaky] });
462
+
463
+ my $first = $sdk->direct({ 'path' => '/thing' });
464
+ is($first->{ok}, 0, 'recovery: the first attempt surfaces the outage');
465
+ is($stub->{sent}, 0, 'recovery: nothing went out during the outage');
466
+
467
+ my $second = $sdk->direct({ 'path' => '/thing' });
468
+ is($second->{ok}, 1, 'recovery: the second attempt recovers');
469
+ is($stub->{sent}, 1, 'recovery: exactly one request went out');
470
+ credential_is($stub->{calls}[0]{auth}, 'RECOVERED01',
471
+ 'recovery: the FRESH credential, never the stale one and never nothing');
472
+ }
473
+
474
+
475
+ # --- auth: null suppresses -------------------------------------------------
476
+ #
477
+ # `auth => undef` is the documented way to disable auth outright, and
478
+ # prepare_auth honours it before it ever reads the apikey. The transport
479
+ # seam has to honour it too, or the feature would put back exactly the
480
+ # credential the caller withheld.
481
+
482
+ {
483
+ clear_env();
484
+ $ENV{$ENVPREFIX . 'APIKEY'} = 'ENVKEY01';
485
+
486
+ my $stub = counting_fetch();
487
+ my $sdk = secrets_sdk($stub, envchain(), { 'auth' => undef });
488
+ $sdk->direct({ 'path' => '/thing' });
489
+
490
+ is($stub->{sent}, 1, 'auth null: the request still goes out');
491
+ no_credential($stub->{calls}[0]{auth},
492
+ 'auth null suppresses the credential, chain or no chain');
493
+
494
+ # The suppression survives option validation rather than being replaced
495
+ # by the optspec default auth map.
496
+ ok(!defined $sdk->options_map->{auth}, 'auth null survives validate');
497
+ }
498
+
499
+ {
500
+ clear_env();
501
+
502
+ my $stub = counting_fetch();
503
+ secrets_sdk($stub, envchain(), { 'apikey' => 'OPTKEY01', 'auth' => undef })
504
+ ->direct({ 'path' => '/thing' });
505
+
506
+ no_credential($stub->{calls}[0]{auth},
507
+ 'auth null suppresses an EXPLICIT apikey too');
508
+ }
509
+
510
+
511
+ # --- cache -----------------------------------------------------------------
512
+
513
+ {
514
+ clear_env();
515
+
516
+ my $calls = 0;
517
+ my $counting = {
518
+ 'lookup' => sub { $calls++; return 'KEY' . $calls },
519
+ 'describe' => sub { 'counting:test' },
520
+ };
521
+
522
+ my $stub = counting_fetch();
523
+ my $sdk = secrets_sdk($stub, { 'cache' => 0, 'providers' => [$counting] });
524
+ $sdk->direct({ 'path' => '/one' });
525
+ $sdk->direct({ 'path' => '/two' });
526
+
527
+ is(scalar @{ $stub->{calls} }, 2, 'cache off: two requests');
528
+ credential_is($stub->{calls}[0]{auth}, 'KEY1', 'cache off: first');
529
+ credential_is($stub->{calls}[1]{auth}, 'KEY2',
530
+ 'cache false asks the chain on every request');
531
+ }
532
+
533
+ {
534
+ clear_env();
535
+
536
+ my $calls = 0;
537
+ my $counting = {
538
+ 'lookup' => sub { $calls++; return 'KEY' . $calls },
539
+ 'describe' => sub { 'counting:test' },
540
+ };
541
+
542
+ my $stub = counting_fetch();
543
+ my $sdk = secrets_sdk($stub, { 'providers' => [$counting] });
544
+ $sdk->direct({ 'path' => '/one' });
545
+ $sdk->direct({ 'path' => '/two' });
546
+
547
+ is($calls, 1, 'cache on: a cached success asks the chain once');
548
+ credential_is($stub->{calls}[1]{auth}, 'KEY1', 'cache on: same credential');
549
+ }
550
+
551
+ # An UNCACHED miss after an earlier hit is a REVOCATION: the chain now
552
+ # says no provider has the secret, so the resolved value must not keep
553
+ # going out on the wire.
554
+ {
555
+ clear_env();
556
+
557
+ my $calls = 0;
558
+ my $revoking = {
559
+ 'lookup' => sub { $calls++; return 1 == $calls ? 'BEFORE01' : undef },
560
+ 'describe' => sub { 'revoking:test' },
561
+ };
562
+
563
+ my $stub = counting_fetch();
564
+ my $sdk = secrets_sdk($stub, { 'cache' => 0, 'providers' => [$revoking] });
565
+ $sdk->direct({ 'path' => '/one' });
566
+ $sdk->direct({ 'path' => '/two' });
567
+
568
+ credential_is($stub->{calls}[0]{auth}, 'BEFORE01', 'revocation: before');
569
+ no_credential($stub->{calls}[1]{auth},
570
+ 'an uncached miss after a hit RETRACTS the credential');
571
+ }
572
+
573
+ # ...and an explicit apikey OPTION is never lost that way: it seats FIRST
574
+ # in the chain as a memory provider, so the chain HITS while one is set.
575
+ {
576
+ clear_env();
577
+
578
+ my $stub = counting_fetch();
579
+ my $sdk = secrets_sdk($stub,
580
+ { 'cache' => 0, 'providers' => [{
581
+ 'lookup' => sub { undef }, 'describe' => sub { 'empty:test' } }] },
582
+ { 'apikey' => 'OPTKEY01' });
583
+ $sdk->direct({ 'path' => '/one' });
584
+ $sdk->direct({ 'path' => '/two' });
585
+
586
+ credential_is($stub->{calls}[1]{auth}, 'OPTKEY01',
587
+ 'an explicit apikey is never retracted by an uncached miss');
588
+ }
589
+
590
+
591
+ # --- the secret name, and the live Sekreto ---------------------------------
592
+
593
+ {
594
+ clear_env();
595
+ $ENV{$ENVPREFIX . 'API_TOKEN'} = 'TOKKEY01';
596
+
597
+ my $stub = counting_fetch();
598
+ secrets_sdk($stub, envchain('name' => 'api.token'))->direct({ 'path' => '/t' });
599
+ credential_is($stub->{calls}[0]{auth}, 'TOKKEY01',
600
+ 'the secret name is configurable');
601
+ clear_env();
602
+ }
603
+
604
+ {
605
+ clear_env();
606
+
607
+ my $stub = counting_fetch();
608
+ my $sdk = secrets_sdk($stub, {
609
+ 'providers' => [{ 'kind' => 'memory', 'values' => { 'DB_PASSWORD' => 'dbpass01' } }],
610
+ });
611
+
612
+ my $secrets = $sdk->secrets;
613
+ ok(defined $secrets, 'the live sekreto is reachable through the accessor');
614
+ is($secrets->get('db.password'), 'dbpass01',
615
+ 'sekreto is live for arbitrary secrets');
616
+ is($secrets->redactall('the password is dbpass01, keep it safe'),
617
+ 'the password is [redacted], keep it safe',
618
+ 'sekreto is live for redaction');
619
+ }
620
+
621
+ # THE PROVIDER VOCABULARY IS NON-EMPTY.
622
+ #
623
+ # Construction is where an unknown kind is refused, so the Sekreto being
624
+ # built at all IS the regression check: if Config emitted no
625
+ # FEATURE_PLUGINS table (or the feature failed to read it), the chain
626
+ # below is refused and the request never goes out. The memory store comes
627
+ # FIRST so sekreto's first-hit rule answers from it and the vault is never
628
+ # contacted - the kind has to be DECLARABLE, not reachable.
629
+ #
630
+ # Conditional on the module being present, because this file ships to
631
+ # projects that select the feature without the `vault` plugin group.
632
+ SKIP: {
633
+ clear_env();
634
+
635
+ my $vaultmod = "$FindBin::Bin/../../../feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm";
636
+ skip('no vault plugin group in this project', 2) unless -f $vaultmod;
637
+
638
+ my $stub = counting_fetch();
639
+ my $sdk = secrets_sdk($stub, {
640
+ 'providers' => [
641
+ { 'kind' => 'memory', 'values' => { 'APIKEY' => 'VOCAB01' } },
642
+ { 'kind' => 'hashicorp', 'addr' => 'https://vault.test', 'token' => 'x' },
643
+ ],
644
+ });
645
+ my $res = $sdk->direct({ 'path' => '/thing' });
646
+
647
+ is($res->{ok}, 1, 'vocabulary: a selected plugin kind is declarable');
648
+ credential_is($stub->{calls}[0]{auth}, 'VOCAB01', 'vocabulary');
649
+ }
650
+
651
+ # FEATURE ORDER decides wrapper nesting. Main adds features in
652
+ # __derived__.featureorder - test first, then sorted - so `secrets` lands
653
+ # after retry/cache/ratelimit and sits OUTERMOST: one credential
654
+ # injection, retried underneath. That is correct, but it is an emergent
655
+ # property of alphabetical ordering rather than a declaration, so pin it.
656
+ {
657
+ clear_env();
658
+
659
+ my $stub = counting_fetch();
660
+ my $sdk = secrets_sdk($stub, { 'providers' => [$WORKING] });
661
+ my $order = ProjectNameHelpers::gpath($sdk->options_map,
662
+ '__derived__.featureorder');
663
+ $order = [] unless Voxgig::Struct::islist($order);
664
+
665
+ my ($si) = grep { 'secrets' eq $order->[$_] } 0 .. $#$order;
666
+ ok(defined $si, 'secrets is in the resolved feature order');
667
+
668
+ my @transport = grep { defined }
669
+ map { my $n = $_; (grep { $n eq $order->[$_] } 0 .. $#$order)[0] }
670
+ qw(retry cache ratelimit netsim proxy timeout);
671
+ my $late = 1;
672
+ for my $i (@transport) {
673
+ $late = 0 if $i > $si;
674
+ }
675
+ ok($late, 'secrets is added after every transport-wrapping feature,'
676
+ . ' so its credential injection sits OUTERMOST');
677
+ }
678
+
679
+
680
+ # --- ACCESS-TOKEN EXCHANGE -------------------------------------------------
681
+ #
682
+ # What the chain resolves is a REFRESH token, which is POSTed to a token
683
+ # endpoint for a short-lived ACCESS token; the access token is what the
684
+ # Authorization header carries; and when the API answers 401 the client
685
+ # buys another and tries the same request again, once.
686
+
687
+ sub exchange_sdk {
688
+ my ($stub, $x, $extra) = @_;
689
+ my %o = %{ $extra || {} };
690
+ $o{base} = $XBASE;
691
+ return secrets_sdk($stub, {
692
+ 'name' => 'refresh_token',
693
+ 'providers' => [{ 'kind' => 'env', 'prefix' => $ENVPREFIX }],
694
+ 'exchange' => { 'active' => 1, %{ $x || {} } },
695
+ }, \%o);
696
+ }
697
+
698
+ {
699
+ clear_env();
700
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
701
+
702
+ my $stub = counting_fetch();
703
+ exchange_sdk($stub)->direct({ 'path' => '/thing' });
704
+
705
+ is(scalar @{ token_calls($stub) }, 1, 'exchange: exactly one purchase');
706
+ is_deeply(Voxgig::Struct::parse_json(token_calls($stub)->[0]{body}),
707
+ { 'refresh_token' => 'REFRESH01' },
708
+ 'exchange: the refresh token is sent in the request field');
709
+ is(scalar @{ api_calls($stub) }, 1, 'exchange: one API call');
710
+ credential_is(api_calls($stub)->[0]{auth}, 'ACCESS01',
711
+ 'exchange: the request carries the access token');
712
+ }
713
+
714
+ # The body is MARSHALLED, not concatenated: a refresh token carrying a
715
+ # quote, backslash or newline must arrive as that literal value.
716
+ {
717
+ clear_env();
718
+ my $nasty = qq{a"b\\c\nd};
719
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = $nasty;
720
+
721
+ my $stub = counting_fetch();
722
+ exchange_sdk($stub)->direct({ 'path' => '/thing' });
723
+
724
+ is_deeply(Voxgig::Struct::parse_json(token_calls($stub)->[0]{body}),
725
+ { 'refresh_token' => $nasty },
726
+ 'exchange: the request body is marshalled, not concatenated');
727
+ clear_env();
728
+ }
729
+
730
+ {
731
+ clear_env();
732
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'FROMCHAIN';
733
+
734
+ my $stub = counting_fetch();
735
+ exchange_sdk($stub, { 'refresh' => 'EXPLICIT01' })->direct({ 'path' => '/thing' });
736
+
737
+ is_deeply(Voxgig::Struct::parse_json(token_calls($stub)->[0]{body}),
738
+ { 'refresh_token' => 'EXPLICIT01' },
739
+ 'exchange: an explicit exchange.refresh wins over the chain');
740
+ }
741
+
742
+ {
743
+ clear_env();
744
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
745
+
746
+ my $stub = counting_fetch();
747
+ my $sdk = exchange_sdk($stub);
748
+ $sdk->direct({ 'path' => '/one' });
749
+ $sdk->direct({ 'path' => '/two' });
750
+ $sdk->direct({ 'path' => '/three' });
751
+
752
+ is(scalar @{ token_calls($stub) }, 1,
753
+ 'exchange: a token still working must not be re-bought');
754
+ is(scalar @{ api_calls($stub) }, 3, 'exchange: one purchase serves many');
755
+ }
756
+
757
+ {
758
+ clear_env();
759
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
760
+
761
+ # First API call is refused, the retry succeeds.
762
+ my $stub = counting_fetch('apistatus' => [401, 200]);
763
+ my $res = exchange_sdk($stub)->direct({ 'path' => '/thing' });
764
+
765
+ is(scalar @{ token_calls($stub) }, 2, 'exchange: a second purchase');
766
+ is(scalar @{ api_calls($stub) }, 2, 'exchange: the request was retried');
767
+ credential_is(api_calls($stub)->[0]{auth}, 'ACCESS01', 'exchange: first try');
768
+ credential_is(api_calls($stub)->[1]{auth}, 'ACCESS02',
769
+ 'exchange: the retry carries the NEW token, not the spent one');
770
+ is($res->{ok}, 1, 'exchange: the caller sees the successful retry');
771
+ }
772
+
773
+ {
774
+ clear_env();
775
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
776
+
777
+ # Every API call is refused: a second 401 on a token bought moments ago
778
+ # is a real failure, and spinning on it would hang instead of failing.
779
+ my $stub = counting_fetch('apistatus' => [401]);
780
+ exchange_sdk($stub)->direct({ 'path' => '/thing' });
781
+
782
+ is(scalar @{ api_calls($stub) }, 2, 'exchange: exactly one retry');
783
+ is(scalar @{ token_calls($stub) }, 2, 'exchange: exactly two purchases');
784
+ }
785
+
786
+ {
787
+ clear_env();
788
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
789
+
790
+ my $stub = counting_fetch('apistatus' => [403]);
791
+ exchange_sdk($stub)->direct({ 'path' => '/thing' });
792
+
793
+ is(scalar @{ api_calls($stub) }, 1,
794
+ 'exchange: 403 is not in the default statuses');
795
+ is(scalar @{ token_calls($stub) }, 1, 'exchange: no extra purchase');
796
+ }
797
+
798
+ {
799
+ clear_env();
800
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
801
+
802
+ my $stub = counting_fetch('apistatus' => [403, 200]);
803
+ exchange_sdk($stub, { 'statuses' => [403] })->direct({ 'path' => '/thing' });
804
+
805
+ is(scalar @{ api_calls($stub) }, 2, 'exchange: statuses is configurable');
806
+ }
807
+
808
+ {
809
+ clear_env();
810
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
811
+
812
+ my $stub = counting_fetch('path' => 'oauth/grant', 'response' => 'token');
813
+ exchange_sdk($stub, {
814
+ 'path' => 'oauth/grant', 'request' => 'grant', 'response' => 'token',
815
+ })->direct({ 'path' => '/thing' });
816
+
817
+ is(scalar @{ token_calls($stub) }, 1, 'exchange: one purchase');
818
+ like(token_calls($stub)->[0]{url}, qr{\Q$XBASE\E/oauth/grant\z},
819
+ 'exchange: the token endpoint is relative to base');
820
+ is_deeply(Voxgig::Struct::parse_json(token_calls($stub)->[0]{body}),
821
+ { 'grant' => 'REFRESH01' }, 'exchange: the request field is configurable');
822
+ credential_is(api_calls($stub)->[0]{auth}, 'ACCESS01',
823
+ 'exchange: the response field is configurable');
824
+ }
825
+
826
+ {
827
+ clear_env();
828
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
829
+
830
+ # A caller who already holds an access token should use it; expiry is
831
+ # what moves them onto the exchange, and the API is what says so.
832
+ my $stub = counting_fetch();
833
+ exchange_sdk($stub, {}, { 'apikey' => 'HELDTOKEN01' })
834
+ ->direct({ 'path' => '/thing' });
835
+
836
+ is(scalar @{ token_calls($stub) }, 0, 'exchange: nothing needed buying');
837
+ credential_is(api_calls($stub)->[0]{auth}, 'HELDTOKEN01',
838
+ 'exchange: an explicit apikey is spent before anything is bought');
839
+ }
840
+
841
+ {
842
+ clear_env();
843
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
844
+
845
+ my $stub = counting_fetch('apistatus' => [401, 200]);
846
+ exchange_sdk($stub, {}, { 'apikey' => 'STALETOKEN01' })
847
+ ->direct({ 'path' => '/thing' });
848
+
849
+ credential_is(api_calls($stub)->[0]{auth}, 'STALETOKEN01', 'exchange: stale');
850
+ credential_is(api_calls($stub)->[1]{auth}, 'ACCESS01',
851
+ 'exchange: a spent apikey falls through to the exchange');
852
+ }
853
+
854
+ {
855
+ clear_env();
856
+
857
+ my $stub = counting_fetch();
858
+ my $res = exchange_sdk($stub)->direct({ 'path' => '/thing' });
859
+
860
+ is($res->{ok}, 0,
861
+ 'exchange: no refresh token anywhere is an ERROR, not an unauthenticated call');
862
+ like("$res->{err}", qr/no refresh token/, 'exchange: the refusal says why');
863
+ is(scalar @{ api_calls($stub) }, 0,
864
+ 'exchange: a request must not go out because the chain was empty,'
865
+ . ' but one reached the transport: ' . wire($stub));
866
+ }
867
+
868
+ {
869
+ clear_env();
870
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
871
+
872
+ # The first purchase succeeds; the second (after the 401) does not.
873
+ my $stub = counting_fetch('apistatus' => [401]);
874
+ my $inner = $stub->{fetch};
875
+ my $wrapped = {
876
+ 'sent' => 0, 'calls' => $stub->{calls}, 'istoken' => $stub->{istoken},
877
+ };
878
+ $wrapped->{fetch} = sub {
879
+ my ($url, $fetchdef) = @_;
880
+ my ($res, $err) = $inner->($url, $fetchdef);
881
+ if ($stub->{istoken}->($url) && 1 < scalar @{ token_calls($stub) }) {
882
+ return ({ 'status' => 500, 'statusText' => 'ERR', 'headers' => {},
883
+ 'json' => sub { {} }, 'body' => '{}' }, undef);
884
+ }
885
+ return ($res, $err);
886
+ };
887
+
888
+ my $res = exchange_sdk($wrapped)->direct({ 'path' => '/thing' });
889
+
890
+ ok(defined $res, 'exchange: the caller got an answer rather than a hang');
891
+ is(scalar @{ api_calls($stub) }, 1,
892
+ 'exchange: no retry after a failed purchase - the API refusal stands');
893
+ }
894
+
895
+ {
896
+ clear_env();
897
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
898
+
899
+ # `auth => undef` is the documented way to send no credential at all. A
900
+ # refusal of a deliberately unauthenticated request is not an expired
901
+ # token: buying one and retrying would transmit exactly the credential
902
+ # the caller suppressed.
903
+ my $stub = counting_fetch('apistatus' => [401]);
904
+ exchange_sdk($stub, {}, { 'auth' => undef })->direct({ 'path' => '/thing' });
905
+
906
+ is(scalar @{ api_calls($stub) }, 1,
907
+ 'exchange: a suppressed request must not be retried');
908
+ no_credential(api_calls($stub)->[0]{auth},
909
+ 'exchange: no credential may be sent when auth is suppressed');
910
+ }
911
+
912
+ {
913
+ clear_env();
914
+ $ENV{$ENVPREFIX . 'APIKEY'} = 'PLAINKEY01';
915
+
916
+ my $stub = counting_fetch();
917
+ secrets_sdk($stub, envchain())->direct({ 'path' => '/thing' });
918
+
919
+ credential_is($stub->{calls}[0]{auth}, 'PLAINKEY01',
920
+ 'exchange off leaves the feature exactly as it was');
921
+ clear_env();
922
+ }
923
+
924
+ # TEST MODE BUYS NOTHING: the test feature replaces the transport so no
925
+ # request leaves the process, and an exchange would be the one HTTP call
926
+ # it could not stop.
927
+ {
928
+ clear_env();
929
+ $ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
930
+
931
+ my $stub = counting_fetch();
932
+ my $sdk = ProjectNameSDK->test({}, {
933
+ 'base' => $XBASE,
934
+ 'system' => { 'fetch' => $stub->{fetch} },
935
+ 'feature' => {
936
+ 'secrets' => {
937
+ 'active' => 1,
938
+ 'name' => 'refresh_token',
939
+ 'providers' => [{ 'kind' => 'env', 'prefix' => $ENVPREFIX }],
940
+ 'exchange' => { 'active' => 1 },
941
+ },
942
+ },
943
+ });
944
+
945
+ my $f = $sdk->{_secrets};
946
+ ok(defined $f, 'test mode: the feature initialised');
947
+ my $err = $f->resolve;
948
+ is($err, undef, 'test mode: resolution needs no token endpoint');
949
+ is(scalar @{ $stub->{calls} }, 0, 'test mode must not do IO');
950
+ # A deterministic placeholder, so offline suites need no configuration.
951
+ is($f->credential, 'test-access_token', 'test mode: a fake access token');
952
+ clear_env();
953
+ }
954
+
955
+ clear_env();
956
+
957
+ done_testing;