@voxgig/sdkgen 4.8.2 → 4.9.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 (407) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/action/doctor.d.ts +1 -0
  3. package/dist/action/doctor.js +50 -2
  4. package/dist/action/doctor.js.map +1 -1
  5. package/dist/helpers/naming.js +4 -2
  6. package/dist/helpers/naming.js.map +1 -1
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/model/sdkgen.aon +21 -0
  9. package/package.json +1 -1
  10. package/project/.sdk/model/feature/secrets.aon +120 -18
  11. package/project/.sdk/model/target/c.aon +10 -0
  12. package/project/.sdk/model/target/clojure.aon +13 -0
  13. package/project/.sdk/model/target/cpp.aon +10 -0
  14. package/project/.sdk/model/target/csharp.aon +9 -0
  15. package/project/.sdk/model/target/dart.aon +10 -0
  16. package/project/.sdk/model/target/elixir.aon +9 -0
  17. package/project/.sdk/model/target/go.aon +13 -0
  18. package/project/.sdk/model/target/java.aon +9 -0
  19. package/project/.sdk/model/target/js.aon +7 -0
  20. package/project/.sdk/model/target/kotlin.aon +9 -0
  21. package/project/.sdk/model/target/lean.aon +17 -0
  22. package/project/.sdk/model/target/lua.aon +8 -0
  23. package/project/.sdk/model/target/ocaml.aon +9 -0
  24. package/project/.sdk/model/target/perl.aon +8 -0
  25. package/project/.sdk/model/target/php.aon +8 -0
  26. package/project/.sdk/model/target/py.aon +13 -0
  27. package/project/.sdk/model/target/rb.aon +8 -0
  28. package/project/.sdk/model/target/rust.aon +10 -0
  29. package/project/.sdk/model/target/scala.aon +21 -2
  30. package/project/.sdk/model/target/swift.aon +18 -0
  31. package/project/.sdk/model/target/ts.aon +13 -0
  32. package/project/.sdk/model/target/zig.aon +9 -0
  33. package/project/.sdk/src/cmp/clojure/Package_clojure.ts +9 -2
  34. package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +3 -0
  35. package/project/.sdk/src/cmp/dart/Test_dart.ts +2 -0
  36. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +4 -1
  37. package/project/.sdk/src/cmp/go/Config_go.ts +59 -2
  38. package/project/.sdk/src/cmp/go/Main_go.ts +8 -2
  39. package/project/.sdk/src/cmp/java/Test_java.ts +6 -5
  40. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +6 -5
  41. package/project/.sdk/src/cmp/lean/Package_lean.ts +23 -0
  42. package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +1 -0
  43. package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +1 -0
  44. package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
  45. package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +7 -3
  46. package/project/.sdk/src/cmp/py/Config_py.ts +82 -1
  47. package/project/.sdk/src/cmp/py/Main_py.ts +44 -0
  48. package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +2 -0
  49. package/project/.sdk/src/cmp/swift/Main_swift.ts +10 -0
  50. package/project/.sdk/src/cmp/swift/Package_swift.ts +13 -1
  51. package/project/.sdk/src/cmp/ts/Config_ts.ts +42 -17
  52. package/project/.sdk/src/cmp/ts/fragment/Config.data.fragment.ts +13 -1
  53. package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +13 -1
  54. package/project/.sdk/src/cmp/zig/Package_zig.ts +15 -11
  55. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +3 -3
  56. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +3 -3
  57. package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +3 -3
  58. package/project/.sdk/src/cmp/zig/utility_zig.ts +50 -1
  59. package/project/.sdk/tm/c/Makefile +38 -3
  60. package/project/.sdk/tm/c/tests/omni_resolver.h +361 -0
  61. package/project/.sdk/tm/c/tests/omni_smoke_test.c +237 -0
  62. package/project/.sdk/tm/c/tests/primary_corpus_test.c +205 -284
  63. package/project/.sdk/tm/c/tests/struct_corpus_test.c +292 -212
  64. package/project/.sdk/tm/c/tests/vendor/omni/json.c +811 -0
  65. package/project/.sdk/tm/c/tests/vendor/omni/omni.h +240 -0
  66. package/project/.sdk/tm/c/tests/vendor/omni/runner.c +940 -0
  67. package/project/.sdk/tm/c/tests/vendor/omni/util.c +351 -0
  68. package/project/.sdk/tm/c/utility/struct/utility.c +7 -2
  69. package/project/.sdk/tm/clojure/test/sdk/test/omni.clj +401 -0
  70. package/project/.sdk/tm/clojure/test/sdk/test/omni_smoke.clj +81 -0
  71. package/project/.sdk/tm/clojure/test/sdk/test/primary.clj +92 -58
  72. package/project/.sdk/tm/clojure/test/sdk/test/struct_corpus.clj +122 -149
  73. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +8 -3
  74. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +145 -0
  75. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +445 -0
  76. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +145 -0
  77. package/project/.sdk/tm/cpp/Makefile +5 -1
  78. package/project/.sdk/tm/cpp/test/omni_resolver.hpp +473 -0
  79. package/project/.sdk/tm/cpp/test/omni_smoke_test.cpp +209 -0
  80. package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +243 -184
  81. package/project/.sdk/tm/cpp/test/runner_support.hpp +68 -181
  82. package/project/.sdk/tm/cpp/test/struct_corpus_test.cpp +183 -56
  83. package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +406 -0
  84. package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +751 -0
  85. package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +256 -0
  86. package/project/.sdk/tm/cpp/utility/pipeline.hpp +7 -1
  87. package/project/.sdk/tm/csharp/test/OmniResolver.cs +491 -0
  88. package/project/.sdk/tm/csharp/test/OmniSmokeTest.cs +106 -0
  89. package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +299 -316
  90. package/project/.sdk/tm/csharp/test/Runner.cs +104 -269
  91. package/project/.sdk/tm/csharp/test/StructUtilityTest.cs +535 -724
  92. package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +864 -0
  93. package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +347 -0
  94. package/project/.sdk/tm/csharp/utility/MakeSpec.cs +3 -1
  95. package/project/.sdk/tm/csharp/utility/PrepareMethod.cs +6 -1
  96. package/project/.sdk/tm/csharp/utility/struct/Struct.cs +21 -5
  97. package/project/.sdk/tm/dart/test/omni.dart +520 -0
  98. package/project/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
  99. package/project/.sdk/tm/dart/test/primary_test.dart +86 -28
  100. package/project/.sdk/tm/dart/test/struct_test.dart +438 -11
  101. package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
  102. package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
  103. package/project/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
  104. package/project/.sdk/tm/elixir/Makefile +11 -3
  105. package/project/.sdk/tm/elixir/test/omni_smoke_test.exs +117 -0
  106. package/project/.sdk/tm/elixir/test/primary_utility_test.exs +341 -16
  107. package/project/.sdk/tm/elixir/test/struct_corpus_test.exs +554 -9
  108. package/project/.sdk/tm/elixir/test/support/omni.ex +377 -0
  109. package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +122 -0
  110. package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +623 -0
  111. package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +187 -0
  112. package/project/.sdk/tm/go/core/context.go +32 -16
  113. package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +261 -0
  114. package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +78 -0
  115. package/project/.sdk/tm/go/feature/secrets/plugin/config.go +652 -0
  116. package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +250 -0
  117. package/project/.sdk/tm/go/feature/secrets/plugin/env.go +194 -0
  118. package/project/.sdk/tm/go/feature/secrets/plugin/export.go +80 -0
  119. package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +238 -0
  120. package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1575 -0
  121. package/project/.sdk/tm/go/feature/secrets/plugin/order.go +248 -0
  122. package/project/.sdk/tm/go/feature/secrets/plugin/point.go +184 -0
  123. package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +123 -0
  124. package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +79 -0
  125. package/project/.sdk/tm/go/feature/secrets/plugin/types.go +296 -0
  126. package/project/.sdk/tm/go/feature/secrets/plugin/util.go +87 -0
  127. package/project/.sdk/tm/go/feature/secrets/plugin/version.go +161 -0
  128. package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +292 -0
  129. package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +201 -0
  130. package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +187 -0
  131. package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +184 -0
  132. package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +114 -0
  133. package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +156 -0
  134. package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +208 -0
  135. package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +241 -0
  136. package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +150 -0
  137. package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +152 -0
  138. package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +143 -0
  139. package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +120 -0
  140. package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +442 -0
  141. package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +714 -0
  142. package/project/.sdk/tm/go/feature/secrets_feature.go +675 -0
  143. package/project/.sdk/tm/go/src/feature/secrets/.gitkeep +0 -0
  144. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +799 -0
  145. package/project/.sdk/tm/go/test/omni/omni.go +902 -0
  146. package/project/.sdk/tm/go/test/omni/util.go +381 -0
  147. package/project/.sdk/tm/go/test/omniresolver_test.go +748 -0
  148. package/project/.sdk/tm/go/test/omnismoke_test.go +112 -0
  149. package/project/.sdk/tm/go/test/primary_utility_test.go +123 -191
  150. package/project/.sdk/tm/go/test/struct_utility_test.go +323 -16
  151. package/project/.sdk/tm/go/test/testsupport_test.go +294 -0
  152. package/project/.sdk/tm/go/utility/make_options.go +8 -1
  153. package/project/.sdk/tm/go/utility/prepare_method.go +5 -1
  154. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +2 -2
  155. package/project/.sdk/tm/java/test/OmniResolver.java +355 -0
  156. package/project/.sdk/tm/java/test/OmniSmokeTest.java +99 -0
  157. package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +254 -280
  158. package/project/.sdk/tm/java/test/RunnerSupport.java +9 -194
  159. package/project/.sdk/tm/java/test/StructCorpusTest.java +119 -42
  160. package/project/.sdk/tm/java/test/vendor/omni/Json.java +287 -0
  161. package/project/.sdk/tm/java/test/vendor/omni/Runner.java +851 -0
  162. package/project/.sdk/tm/java/test/vendor/omni/Util.java +322 -0
  163. package/project/.sdk/tm/java/utility/MakeSpec.java +3 -1
  164. package/project/.sdk/tm/java/utility/PrepareMethod.java +5 -5
  165. package/project/.sdk/tm/java/utility/struct/Struct.java +17 -4
  166. package/project/.sdk/tm/js/src/utility/StructUtility.js +3 -3
  167. package/project/.sdk/tm/js/test/omni.js +251 -0
  168. package/project/.sdk/tm/js/test/omni.test.js +105 -0
  169. package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +6 -2
  170. package/project/.sdk/tm/js/test/utility/StructUtility.test.js +27 -2
  171. package/project/.sdk/tm/js/test/vendor/omni/index.js +77 -0
  172. package/project/.sdk/tm/js/test/vendor/omni/runner.js +628 -0
  173. package/project/.sdk/tm/js/test/vendor/omni/util.js +229 -0
  174. package/project/.sdk/tm/kotlin/core/Utility.kt +1 -1
  175. package/project/.sdk/tm/kotlin/test/OmniResolver.kt +343 -0
  176. package/project/.sdk/tm/kotlin/test/OmniSmokeTest.kt +100 -0
  177. package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +244 -262
  178. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +9 -178
  179. package/project/.sdk/tm/kotlin/test/StructCorpusTest.kt +121 -32
  180. package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +264 -0
  181. package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +615 -0
  182. package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +139 -0
  183. package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -3
  184. package/project/.sdk/tm/kotlin/utility/Prepare.kt +6 -6
  185. package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +18 -2
  186. package/project/.sdk/tm/lean/Makefile +12 -5
  187. package/project/.sdk/tm/lean/src/SdkUtility.lean +14 -1
  188. package/project/.sdk/tm/lean/test/OmniResolver.lean +358 -0
  189. package/project/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
  190. package/project/.sdk/tm/lean/test/StructCorpus.lean +245 -574
  191. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +155 -291
  192. package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
  193. package/project/.sdk/tm/lua/test/omni.lua +456 -0
  194. package/project/.sdk/tm/lua/test/omni_smoke_test.lua +103 -0
  195. package/project/.sdk/tm/lua/test/primary_utility_test.lua +250 -509
  196. package/project/.sdk/tm/lua/test/struct_utility_test.lua +161 -70
  197. package/project/.sdk/tm/lua/test/vendor/omni/json.lua +268 -0
  198. package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +385 -0
  199. package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +641 -0
  200. package/project/.sdk/tm/lua/test/vendor/omni/util.lua +282 -0
  201. package/project/.sdk/tm/lua/utility/prepare_method.lua +5 -1
  202. package/project/.sdk/tm/lua/utility/struct/regex.lua +663 -0
  203. package/project/.sdk/tm/lua/utility/struct/struct.lua +660 -420
  204. package/project/.sdk/tm/ocaml/Makefile +37 -12
  205. package/project/.sdk/tm/ocaml/test/omni_resolver.ml +284 -0
  206. package/project/.sdk/tm/ocaml/test/omni_smoke_test.ml +169 -0
  207. package/project/.sdk/tm/ocaml/test/primary_utility_test.ml +84 -100
  208. package/project/.sdk/tm/ocaml/test/struct_corpus.ml +225 -201
  209. package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1157 -0
  210. package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +88 -12
  211. package/project/.sdk/tm/perl/t/omni.pm +647 -0
  212. package/project/.sdk/tm/perl/t/omni_smoke.t +87 -0
  213. package/project/.sdk/tm/perl/t/primary_utility.t +189 -487
  214. package/project/.sdk/tm/perl/t/struct_utility.t +455 -389
  215. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +649 -0
  216. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +253 -0
  217. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +24 -0
  218. package/project/.sdk/tm/perl/utility/prepare_method.pm +7 -2
  219. package/project/.sdk/tm/php/test/Omni.php +691 -0
  220. package/project/.sdk/tm/php/test/OmniSmokeTest.php +93 -0
  221. package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +210 -571
  222. package/project/.sdk/tm/php/test/StructUtilityTest.php +320 -342
  223. package/project/.sdk/tm/php/test/vendor/omni/Runner.php +644 -0
  224. package/project/.sdk/tm/php/test/vendor/omni/Util.php +283 -0
  225. package/project/.sdk/tm/php/utility/MakeSpec.php +10 -3
  226. package/project/.sdk/tm/php/utility/PrepareBody.php +7 -1
  227. package/project/.sdk/tm/php/utility/PrepareMethod.php +6 -2
  228. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +36 -0
  229. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +141 -0
  230. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +50 -0
  231. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +333 -0
  232. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +198 -0
  233. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +147 -0
  234. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +52 -0
  235. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +139 -0
  236. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1053 -0
  237. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +171 -0
  238. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +95 -0
  239. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +116 -0
  240. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +59 -0
  241. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +87 -0
  242. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +112 -0
  243. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +76 -0
  244. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +116 -0
  245. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +192 -0
  246. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +120 -0
  247. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +140 -0
  248. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +62 -0
  249. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +101 -0
  250. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +151 -0
  251. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +115 -0
  252. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +90 -0
  253. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +101 -0
  254. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +119 -0
  255. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +125 -0
  256. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +211 -0
  257. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +475 -0
  258. package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +467 -0
  259. package/project/.sdk/tm/py/pkg/utility/prepare_method.py +5 -1
  260. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/__init__.py +0 -2
  261. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +780 -529
  262. package/project/.sdk/tm/py/src/feature/secrets/.gitkeep +0 -0
  263. package/project/.sdk/tm/py/test/feature/__init__.py +0 -0
  264. package/project/.sdk/tm/py/test/feature/secrets/__init__.py +0 -0
  265. package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +337 -0
  266. package/project/.sdk/tm/py/test/omni.py +415 -0
  267. package/project/.sdk/tm/py/test/test_omni_smoke.py +74 -0
  268. package/project/.sdk/tm/py/test/test_primary_utility.py +144 -668
  269. package/project/.sdk/tm/py/test/test_struct_utility.py +74 -27
  270. package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +62 -0
  271. package/project/.sdk/tm/py/test/voxgig_omni/runner.py +580 -0
  272. package/project/.sdk/tm/py/test/voxgig_omni/util.py +252 -0
  273. package/project/.sdk/tm/rb/test/omni.rb +505 -0
  274. package/project/.sdk/tm/rb/test/omni_smoke_test.rb +72 -0
  275. package/project/.sdk/tm/rb/test/primary_utility_test.rb +174 -560
  276. package/project/.sdk/tm/rb/test/struct_utility_test.rb +13 -7
  277. package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +493 -0
  278. package/project/.sdk/tm/rb/test/vendor/omni/util.rb +199 -0
  279. package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +15 -0
  280. package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -1
  281. package/project/.sdk/tm/rust/tests/common/mod.rs +19 -242
  282. package/project/.sdk/tm/rust/tests/omni_resolver/mod.rs +888 -0
  283. package/project/.sdk/tm/rust/tests/omni_smoke_test.rs +286 -0
  284. package/project/.sdk/tm/rust/tests/primary_utility_test.rs +318 -312
  285. package/project/.sdk/tm/rust/tests/struct_utility_test.rs +66 -28
  286. package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +412 -0
  287. package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +38 -0
  288. package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +392 -0
  289. package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1001 -0
  290. package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +161 -0
  291. package/project/.sdk/tm/rust/utility/prepare_method.rs +5 -1
  292. package/project/.sdk/tm/scala/Makefile +16 -6
  293. package/project/.sdk/tm/scala/sdktest/OmniResolver.scala +497 -0
  294. package/project/.sdk/tm/scala/sdktest/OmniSmoke.scala +192 -0
  295. package/project/.sdk/tm/scala/sdktest/PrimaryCorpus.scala +47 -19
  296. package/project/.sdk/tm/scala/sdktest/StructCorpus.scala +0 -0
  297. package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +229 -0
  298. package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +552 -0
  299. package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +104 -0
  300. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Constants.swift +10 -0
  301. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Inject.swift +28 -5
  302. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Injection.swift +5 -1
  303. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Minor.swift +4 -1
  304. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Validate.swift +15 -5
  305. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +6 -1
  306. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift +474 -0
  307. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniSmokeTest.swift +107 -0
  308. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +141 -178
  309. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/Runner.swift +17 -113
  310. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/StructUtilityTest.swift +295 -446
  311. package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +364 -0
  312. package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +730 -0
  313. package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +162 -0
  314. package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +7 -0
  315. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +148 -0
  316. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +55 -0
  317. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +344 -0
  318. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +205 -0
  319. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +138 -0
  320. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +46 -0
  321. package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +349 -0
  322. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +181 -0
  323. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1132 -0
  324. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +177 -0
  325. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +119 -0
  326. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +102 -0
  327. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +61 -0
  328. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +112 -0
  329. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +100 -0
  330. package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +37 -0
  331. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +163 -30
  332. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +27 -22
  333. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/aws.ts +26 -36
  334. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/azuresecrets.ts +19 -21
  335. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/boru.ts +36 -17
  336. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/doppler.ts +14 -21
  337. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/gcpsecrets.ts +27 -27
  338. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/hashicorp.ts +25 -39
  339. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +99 -0
  340. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/infisical.ts +14 -16
  341. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/onepassword.ts +15 -22
  342. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +98 -0
  343. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{Sigv4.ts → plugins/sigv4.ts} +7 -6
  344. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +97 -23
  345. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +37 -0
  346. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +4 -17
  347. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +4 -16
  348. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +11 -25
  349. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +6 -23
  350. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +106 -39
  351. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +3 -3
  352. package/project/.sdk/tm/ts/test/omni.ts +104 -32
  353. package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +27 -0
  354. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +32 -5
  355. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +2 -2
  356. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +2 -2
  357. package/project/.sdk/tm/zig/Makefile +15 -1
  358. package/project/.sdk/tm/zig/build.zig +23 -5
  359. package/project/.sdk/tm/zig/core/helpers.zig +52 -11
  360. package/project/.sdk/tm/zig/core/mem.zig +17 -1
  361. package/project/.sdk/tm/zig/core/utility.zig +23 -19
  362. package/project/.sdk/tm/zig/feature/audit.zig +2 -2
  363. package/project/.sdk/tm/zig/feature/cache.zig +2 -2
  364. package/project/.sdk/tm/zig/feature/debug.zig +5 -5
  365. package/project/.sdk/tm/zig/feature/netsim.zig +2 -2
  366. package/project/.sdk/tm/zig/feature/paging.zig +2 -2
  367. package/project/.sdk/tm/zig/feature/proxy.zig +15 -8
  368. package/project/.sdk/tm/zig/feature/streaming.zig +5 -5
  369. package/project/.sdk/tm/zig/feature/support.zig +3 -3
  370. package/project/.sdk/tm/zig/feature/telemetry.zig +5 -5
  371. package/project/.sdk/tm/zig/feature/test.zig +10 -5
  372. package/project/.sdk/tm/zig/test/fh.zig +10 -10
  373. package/project/.sdk/tm/zig/test/gotcha_test.zig +5 -5
  374. package/project/.sdk/tm/zig/test/omniresolver.zig +515 -0
  375. package/project/.sdk/tm/zig/test/omnismoke_test.zig +284 -0
  376. package/project/.sdk/tm/zig/test/pipeline_test.zig +8 -8
  377. package/project/.sdk/tm/zig/test/primary_utility_test.zig +145 -155
  378. package/project/.sdk/tm/zig/test/struct_corpus.zig +264 -187
  379. package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +1314 -0
  380. package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +446 -0
  381. package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +7 -4
  382. package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +356 -157
  383. package/project/sdkgen-package.json +1 -1
  384. package/src/action/doctor.ts +66 -2
  385. package/src/helpers/naming.ts +4 -2
  386. package/project/.sdk/tm/c/tests/runner.h +0 -274
  387. package/project/.sdk/tm/cpp/test/struct_runner.hpp +0 -314
  388. package/project/.sdk/tm/csharp/test/StructRunner.cs +0 -276
  389. package/project/.sdk/tm/dart/test/runner.dart +0 -406
  390. package/project/.sdk/tm/dart/test/struct_corpus.dart +0 -531
  391. package/project/.sdk/tm/elixir/test/support/struct_corpus.ex +0 -1088
  392. package/project/.sdk/tm/go/test/runner_test.go +0 -629
  393. package/project/.sdk/tm/go/test/struct_runner_test.go +0 -1094
  394. package/project/.sdk/tm/java/test/StructRunner.java +0 -281
  395. package/project/.sdk/tm/js/test/runner.js +0 -387
  396. package/project/.sdk/tm/kotlin/test/StructRunner.kt +0 -177
  397. package/project/.sdk/tm/lua/test/struct_runner.lua +0 -602
  398. package/project/.sdk/tm/ocaml/test/corpus_runner.ml +0 -185
  399. package/project/.sdk/tm/perl/t/struct_runner.pm +0 -275
  400. package/project/.sdk/tm/php/test/StructRunner.php +0 -275
  401. package/project/.sdk/tm/py/test/struct_runner.py +0 -411
  402. package/project/.sdk/tm/rb/test/struct_runner.rb +0 -309
  403. package/project/.sdk/tm/rust/tests/struct_runner/mod.rs +0 -424
  404. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +0 -90
  405. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +0 -66
  406. package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +0 -188
  407. package/project/.sdk/tm/zig/test/struct_runner.zig +0 -464
@@ -0,0 +1,475 @@
1
+ # VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/sekreto.py)
2
+ # Source: https://github.com/voxgig/sekreto @ 86ba35a646e68a311bdece43cd5689369ca62e9d [tag: sdk-20260907-0029-0]
3
+ # License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ # sekreto: one interface for secrets, wherever they live.
5
+ #
6
+ # A Sekreto is an ordered chain of providers. `get` asks each in turn and
7
+ # returns the first hit, so an app can be configured from environment
8
+ # variables in development and a vault in production without changing a
9
+ # line of its own code.
10
+ #
11
+ # A port of typescript/src/Sekreto.ts, which is canonical.
12
+ #
13
+ # THE CORE IMPORTS NO PROVIDER THAT OPENS A SOCKET, SPAWNS A PROCESS OR
14
+ # SIGNS A REQUEST. The four built-in kinds - env, memory, dotenv, file -
15
+ # read at most a local file; every other kind is a voxgig/plugin
16
+ # definition under plugins/, and a chain may name one only if the calling
17
+ # project handed it in through `plugins`. See
18
+ # docs/design/plugin-providers.md.
19
+
20
+ import json
21
+ import re
22
+ import types
23
+
24
+ from ..voxgig_plugin import check_tag, format_ref, make_catalog, make_host
25
+
26
+
27
+ class SekretoError(Exception):
28
+ """Anything sekreto refuses to do: a bad name, a missing secret, a
29
+ provider that could not be reached."""
30
+
31
+
32
+ # `\z`-style anchors, not `$`. In Python, PCRE, Perl and .NET `$` also
33
+ # matches BEFORE a final newline, so `api.token\n` was accepted here while the
34
+ # canonical port rejected it - and `envkey` then produced the key
35
+ # `API_TOKEN\n`, sending this port looking for a differently named file and
36
+ # variable than the others.
37
+ NAMEPART = re.compile(r'\A[a-z0-9_]+\Z')
38
+
39
+
40
+ def writejson(value):
41
+ """JSON text for a value that LEAVES the process.
42
+
43
+ Two defaults have to be turned off. `ensure_ascii` escapes every
44
+ non-ASCII character as \\uXXXX, and `separators` otherwise puts a space
45
+ after each comma and colon. Neither is wrong, and both made python one
46
+ of only three ports whose bytes differed: the rest emit a secret's
47
+ accented or non-Latin characters as the UTF-8 they already are. The
48
+ writer's output is part of what the ports agree on - the CLI line is
49
+ compared byte for byte across all of them - so python matches the
50
+ rest.
51
+
52
+ Use this for a request body, a returned secret, the CLI's line. A
53
+ `json.dumps` whose text is parsed again without ever being emitted
54
+ needs no such care.
55
+ """
56
+ return json.dumps(value, ensure_ascii=False, separators=(',', ':'))
57
+
58
+
59
+ def validname(name):
60
+ """Is this a well-formed secret name?"""
61
+ if not isinstance(name, str) or 0 == len(name):
62
+ return False
63
+
64
+ for part in name.split('.'):
65
+ if not NAMEPART.match(part):
66
+ return False
67
+
68
+ return True
69
+
70
+
71
+ def checkname(name):
72
+ if not validname(name):
73
+ raise SekretoError('sekreto: invalid name: ' + ('' if name is None else str(name)))
74
+ return name
75
+
76
+
77
+ def envkey(name, prefix=None):
78
+ """The environment-variable key for a name: `api.token` -> `API_TOKEN`."""
79
+ checkname(name)
80
+ return (prefix or '') + '_'.join(name.split('.')).upper()
81
+
82
+
83
+ def vaultref(name):
84
+ """Where a name lives in a KV vault: `api.token` -> `api` / `token`.
85
+
86
+ A single-segment name has no path of its own, so it becomes a secret of
87
+ that name with the conventional field `value`.
88
+ """
89
+ checkname(name)
90
+
91
+ parts = name.split('.')
92
+
93
+ if 1 == len(parts):
94
+ return {'path': parts[0], 'field': 'value'}
95
+
96
+ return {'path': '/'.join(parts[:-1]), 'field': parts[-1]}
97
+
98
+
99
+ def flatname(name, sep):
100
+ """A name flattened to one segment: `api.token` -> `api_token` (GCP
101
+ Secret Manager, `_`) or `api-token` (Azure Key Vault, `-`).
102
+
103
+ Those stores have no path hierarchy and reject dots in ids, so the
104
+ dots become the store's conventional separator. With `-` as the
105
+ separator, underscores flatten too: Azure Key Vault's alphabet is
106
+ letters, digits and hyphens only, and a valid sekreto name like
107
+ `with_underscore` must still be representable there. (The resulting
108
+ `.`/`_` collision mirrors the documented envkey behaviour, where
109
+ both already map to `_`.)
110
+ """
111
+ checkname(name)
112
+ flat = sep.join(name.split('.'))
113
+ return '-'.join(flat.split('_')) if '-' == sep else flat
114
+
115
+
116
+ def awsparam(name, prefix=None):
117
+ """The AWS SSM Parameter Store name for a name: dots become the path
118
+ hierarchy, rooted at `/` (or at a prefix): `db.pass.main` ->
119
+ `/db/pass/main`, or `/app/db/pass/main` under prefix `/app`.
120
+ """
121
+ checkname(name)
122
+
123
+ base = prefix or ''
124
+ if '' != base and not base.startswith('/'):
125
+ base = '/' + base
126
+ if base.endswith('/'):
127
+ base = base[:-1]
128
+
129
+ return base + '/' + '/'.join(name.split('.'))
130
+
131
+
132
+ def parsedotenv(text):
133
+ """Parse `.env` text into a map of raw keys to values.
134
+
135
+ Deliberately small: `KEY=value`, optional `export`, `#` comments on
136
+ their own line, and single- or double-quoted values (double quotes also
137
+ unescape `\\n`, `\\r`, `\\t` and `\\\\`). A line with no `=` is skipped.
138
+ """
139
+ out = {}
140
+
141
+ if not isinstance(text, str):
142
+ return out
143
+
144
+ for rawline in text.split('\n'):
145
+ line = rawline[:-1].strip() if rawline.endswith('\r') else rawline.strip()
146
+
147
+ if 0 == len(line) or line.startswith('#'):
148
+ continue
149
+
150
+ body = line[7:].strip() if line.startswith('export ') else line
151
+
152
+ eq = body.find('=')
153
+ if 0 >= eq:
154
+ continue
155
+
156
+ key = body[:eq].strip()
157
+ value = body[eq + 1:].strip()
158
+
159
+ if 2 <= len(value) and value.startswith('"') and value.endswith('"'):
160
+ value = _unescape(value[1:-1])
161
+ elif 2 <= len(value) and value.startswith("'") and value.endswith("'"):
162
+ value = value[1:-1]
163
+
164
+ out[key] = value
165
+
166
+ return out
167
+
168
+
169
+ def _unescape(text):
170
+ out = ''
171
+ index = 0
172
+
173
+ while index < len(text):
174
+ if '\\' == text[index] and index + 1 < len(text):
175
+ nxt = text[index + 1]
176
+ index += 2
177
+ if 'n' == nxt:
178
+ out += '\n'
179
+ elif 'r' == nxt:
180
+ out += '\r'
181
+ elif 't' == nxt:
182
+ out += '\t'
183
+ elif '\\' == nxt:
184
+ out += '\\'
185
+ elif '"' == nxt:
186
+ out += '"'
187
+ else:
188
+ out += '\\' + nxt
189
+ else:
190
+ out += text[index]
191
+ index += 1
192
+
193
+ return out
194
+
195
+
196
+ def redact(text, values):
197
+ """Replace known secret values in text with `[redacted]`.
198
+
199
+ Only values of four characters or more are replaced: shorter ones are
200
+ too likely to appear in ordinary text, and redacting them would make
201
+ logs unreadable without making them safer.
202
+ """
203
+ out = text if isinstance(text, str) else ''
204
+
205
+ usable = [
206
+ value for value in (values or [])
207
+ if isinstance(value, str) and 4 <= len(value)
208
+ ]
209
+
210
+ # sorted() returns a new list: `values` belongs to the caller (it is
211
+ # `seen` when called through Sekreto.redact), and sorting in place
212
+ # would reorder it.
213
+ for value in sorted(usable, key=len, reverse=True):
214
+ out = '[redacted]'.join(out.split(value))
215
+
216
+ return out
217
+
218
+
219
+ def storename(provider):
220
+ """The store name a live provider answers to.
221
+
222
+ `describe()` opens with the provider's kind - `hashicorp:...`,
223
+ `dotenv:...`, plain `env` - so the kind is the natural default, and a
224
+ custom provider gets a sensible name without implementing anything
225
+ extra. A spec'd provider's store is its `name` or its `kind`, decided
226
+ before the provider exists.
227
+ """
228
+ return provider.describe().split(':')[0]
229
+
230
+
231
+ def _definition(plugin):
232
+ """A plugin entry, checked to be a definition before the catalog sees it.
233
+
234
+ Every plugin module is named after the definition it holds, so `from
235
+ voxgig_sekreto.plugins import hashicorp` hands back the MODULE, and a
236
+ module in the catalog would fail deep inside voxgig/plugin with a
237
+ message about a definition name. Refused here instead, naming the
238
+ import that was meant.
239
+ """
240
+ if isinstance(plugin, types.ModuleType):
241
+ name = plugin.__name__.rsplit('.', 1)[-1]
242
+ raise SekretoError(
243
+ 'sekreto: not a plugin definition: the module ' + plugin.__name__
244
+ + ' - import the definition it holds: from ' + plugin.__name__
245
+ + ' import ' + name)
246
+ if not isinstance(plugin, dict):
247
+ raise SekretoError('sekreto: not a plugin definition: ' + repr(plugin))
248
+ return plugin
249
+
250
+
251
+ def _unknownkind(kind, catalog):
252
+ """The message for a kind the catalog does not hold.
253
+
254
+ A kind sekreto has never heard of is a typo; a kind that exists as a
255
+ plugin but was not passed in is the split working as designed and
256
+ telling you what to pass. Collapsing the two was the first thing that
257
+ made the split confusing to use.
258
+ """
259
+ from .providers import KINDS
260
+
261
+ message = ('sekreto: unknown provider kind: ' + str(kind)
262
+ + ' (available: ' + ', '.join(catalog.names()) + ')')
263
+ if kind in KINDS['plugin']:
264
+ message += (' - ' + str(kind)
265
+ + ' is a sekreto plugin, not built in: pass it in the plugins option')
266
+ return message
267
+
268
+
269
+ def _unwrap(err):
270
+ """A SekretoError that crossed the plugin boundary comes back out as
271
+ itself, byte for byte. Anything else is not sekreto's to rewrite."""
272
+ from .providers import ERROR_CODE
273
+
274
+ details = getattr(err, 'details', None)
275
+ if ERROR_CODE == getattr(err, 'code', None) and isinstance(details, dict) \
276
+ and isinstance(details.get('cause'), str):
277
+ return SekretoError(details['cause'])
278
+ return err
279
+
280
+
281
+ class Sekreto:
282
+ """The secrets facade: a chain of providers plus a cache.
283
+
284
+ Two ways to read. `get` is transparent - it walks the chain and takes
285
+ the first hit, and the caller never learns which store answered.
286
+ `getfrom` is directed - it names the store, and only that store is
287
+ asked.
288
+ """
289
+
290
+ def __init__(self, options=None):
291
+ from .providers import BUILTINS
292
+
293
+ opts = options or {}
294
+
295
+ # Built-ins first, then the plugins, into one catalog: a plugin
296
+ # that names a built-in kind replaces it, which is how a host
297
+ # substitutes an implementation and never an accident, because the
298
+ # four names are documented.
299
+ #
300
+ # `catalog` is the definitions this Sekreto can build; `host` is
301
+ # the voxgig/plugin host every spec'd provider is an instance of.
302
+ # Read it for introspection - `host.list()` names each store's ref
303
+ # and status - and nothing on it advances the chain.
304
+ self.catalog = make_catalog(BUILTINS + [_definition(p) for p in opts.get('plugins') or []])
305
+ self.host = make_host({'catalog': self.catalog})
306
+
307
+ # (store, provider) pairs, in chain order. A provider handed in
308
+ # live is backed by no instance; a spec'd one is an instance of
309
+ # its kind on the host.
310
+ self.entries = []
311
+ for entry in opts.get('providers') or []:
312
+ if callable(getattr(entry, 'lookup', None)):
313
+ self.entries.append((storename(entry), entry))
314
+ else:
315
+ self.entries.append(self._declare(entry))
316
+
317
+ self.docache = False is not opts.get('cache', True)
318
+
319
+ # A list, not a dict: the store a value came from stays attached,
320
+ # and redaction order does not vary between runs.
321
+ self.cache = []
322
+
323
+ # Every value ever resolved, for redact(). Kept independently of
324
+ # the read cache so that redaction still works when cache is off -
325
+ # otherwise `cache: False` would silently disable redact() and leak
326
+ # secrets to logs.
327
+ self.seen = []
328
+
329
+ def _declare(self, spec):
330
+ """One chain entry, as a plugin instance.
331
+
332
+ The instance is `kind` for a store named after its kind and
333
+ `kind$store` otherwise - `hashicorp$prod` - so `host.list()` reads
334
+ like the chain. A store name that is already taken gets a numbered
335
+ tag from the host instead, because two providers MAY share a store
336
+ name (a directed read walks both) and an instance ref may not.
337
+ """
338
+ from .providers import PROVIDER_EXPORT
339
+
340
+ kind = spec.get('kind') if isinstance(spec, dict) else None
341
+
342
+ if kind is None or not self.catalog.has(kind):
343
+ raise SekretoError(_unknownkind(kind, self.catalog))
344
+
345
+ store = spec.get('name') or kind
346
+
347
+ if not check_tag(store):
348
+ raise SekretoError('sekreto: invalid store name: ' + str(store))
349
+
350
+ ref = kind if store == kind else format_ref(kind, store)
351
+ if self.host.instance(ref) is not None:
352
+ ref = self.host.autotag(kind)
353
+
354
+ try:
355
+ # `load` runs the definition's `define`, which builds the
356
+ # provider from the spec; `activate` takes the instance live.
357
+ # Nothing is contacted by either: a provider opens nothing
358
+ # until its first lookup.
359
+ self.host.load(ref, {'options': spec})
360
+ self.host.activate(ref)
361
+ except Exception as err:
362
+ raise _unwrap(err) from None
363
+
364
+ return (store, self.host.exports(ref + '/' + PROVIDER_EXPORT))
365
+
366
+ def get(self, name):
367
+ """The secret, or a SekretoError if no provider has it."""
368
+ found = self.try_(name)
369
+
370
+ if found is None:
371
+ raise SekretoError('sekreto: unknown secret: ' + name)
372
+
373
+ return found
374
+
375
+ def try_(self, name):
376
+ """The secret, or None if no provider has it."""
377
+ return self._resolve('', name, self.entries)
378
+
379
+ def getfrom(self, store, name):
380
+ """The secret from one named store, or a SekretoError if that store
381
+ does not have it."""
382
+ found = self.tryfrom(store, name)
383
+
384
+ if found is None:
385
+ raise SekretoError('sekreto: unknown secret: ' + store + ':' + name)
386
+
387
+ return found
388
+
389
+ def tryfrom(self, store, name):
390
+ """The secret from one named store, or None if that store does not
391
+ have it.
392
+
393
+ Naming a store that is not in the chain is an error, not a miss:
394
+ `try` already means "this store may not have it", so it cannot also
395
+ mean "this store may not exist" without hiding a typo.
396
+ """
397
+ matching = [entry for entry in self.entries if entry[0] == store]
398
+
399
+ if 0 == len(matching):
400
+ raise SekretoError('sekreto: unknown store: ' + store)
401
+
402
+ return self._resolve(store, name, matching)
403
+
404
+ def _resolve(self, store, name, entries):
405
+ checkname(name)
406
+
407
+ if self.docache:
408
+ for cached in self.cache:
409
+ if cached[0] == store and cached[1] == name:
410
+ return cached[2]
411
+
412
+ for _storename, provider in entries:
413
+ found = provider.lookup(name)
414
+
415
+ if found is not None:
416
+ if self.docache:
417
+ self.cache.append((store, name, found))
418
+ self.seen.append(found)
419
+ return found
420
+
421
+ return None
422
+
423
+ def has(self, name):
424
+ """Does any provider have this secret?"""
425
+ return self.try_(name) is not None
426
+
427
+ def hasin(self, store, name):
428
+ """Does this named store have this secret?"""
429
+ return self.tryfrom(store, name) is not None
430
+
431
+ def all(self, names):
432
+ """Every named secret at once. Missing ones are an error."""
433
+ return {name: self.get(name) for name in names}
434
+
435
+ def sources(self):
436
+ """A description of each provider, in resolution order."""
437
+ return [provider.describe() for _store, provider in self.entries]
438
+
439
+ def stores(self):
440
+ """The name of each store that can be named by `getfrom`, in
441
+ resolution order and without repeats."""
442
+ out = []
443
+
444
+ for store, _provider in self.entries:
445
+ if store not in out:
446
+ out.append(store)
447
+
448
+ return out
449
+
450
+ def redact(self, text):
451
+ """Replace every value this Sekreto has resolved with `[redacted]`.
452
+
453
+ Works whether or not caching is enabled: the redaction list is kept
454
+ independently of the read cache.
455
+ """
456
+ return redact(text, self.seen)
457
+
458
+ def refresh(self):
459
+ """Drop cached values, so the next `get` asks the providers again."""
460
+ self.cache.clear()
461
+
462
+ def close(self):
463
+ """Tear the chain down: every plugin instance is deactivated and
464
+ unloaded, in reverse, releasing whatever a provider acquired at
465
+ activation. Afterwards there is nothing to read from - `get`
466
+ reports every secret unknown - and the cache is dropped, though
467
+ `redact` still knows every value that was ever resolved."""
468
+ self.host.close()
469
+ self.entries = []
470
+ self.cache.clear()
471
+
472
+
473
+ def sekreto(options=None):
474
+ """Make a Sekreto from options."""
475
+ return Sekreto(options)