@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,714 @@
1
+ // VENDORED: @voxgig/sekreto sdk-20260907-0029-0 (go/sekreto/sekreto.go)
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
+ // Go has no exceptions, so where the canonical implementation throws a
14
+ // SekretoError this port returns one as an error value.
15
+ package sekreto
16
+
17
+ import (
18
+ "bytes"
19
+ "encoding/json"
20
+ "regexp"
21
+ "sort"
22
+ "strings"
23
+ "sync"
24
+
25
+ plugin "GOMODULE/feature/secrets/plugin"
26
+ )
27
+
28
+ // SekretoError is anything sekreto refuses to do: a bad name, a missing
29
+ // secret, a provider that could not be reached.
30
+ type SekretoError struct {
31
+ Message string
32
+ }
33
+
34
+ func (err *SekretoError) Error() string {
35
+ return err.Message
36
+ }
37
+
38
+ // Fail is a SekretoError as an error value, for this package and for the
39
+ // plugins, which return their own refusals through it.
40
+ func Fail(message string) error {
41
+ return &SekretoError{Message: message}
42
+ }
43
+
44
+ // WriteJSON is json.Marshal with Go's HTML escaping turned OFF.
45
+ //
46
+ // encoding/json escapes <, > and & as \u003c, \u003e and \u0026 unless
47
+ // told otherwise. That is a defence for JSON pasted into an HTML page,
48
+ // which this library never does, and it made go the only port whose bytes
49
+ // differed: every other port emits those three characters raw. The
50
+ // writer's output is part of what the ports agree on - the CLI line is
51
+ // compared byte for byte across all of them - so go matches the rest
52
+ // rather than the rest matching go.
53
+ //
54
+ // Encode appends a newline, which a JSON document does not carry, so it
55
+ // is trimmed. Use this for every value that LEAVES the process: a request
56
+ // body, a returned secret, the CLI's line. A marshal whose bytes are
57
+ // unmarshalled again without ever being emitted needs no such care.
58
+ func WriteJSON(value any) ([]byte, error) {
59
+ var buf bytes.Buffer
60
+
61
+ enc := json.NewEncoder(&buf)
62
+ enc.SetEscapeHTML(false)
63
+
64
+ if err := enc.Encode(value); nil != err {
65
+ return nil, err
66
+ }
67
+
68
+ return bytes.TrimRight(buf.Bytes(), "\n"), nil
69
+ }
70
+
71
+ var namepart = regexp.MustCompile(`^[a-z0-9_]+$`)
72
+
73
+ // ValidName reports whether this is a well-formed secret name.
74
+ func ValidName(name any) bool {
75
+ text, is := name.(string)
76
+ if !is || 0 == len(text) {
77
+ return false
78
+ }
79
+
80
+ for _, part := range strings.Split(text, ".") {
81
+ if !namepart.MatchString(part) {
82
+ return false
83
+ }
84
+ }
85
+
86
+ return true
87
+ }
88
+
89
+ // CheckName is ValidName as an error: the check every name-taking function
90
+ // makes before doing anything else, and the one a plugin makes before
91
+ // putting a name on a command line or in a URL.
92
+ func CheckName(name string) error {
93
+ if !ValidName(name) {
94
+ return Fail("sekreto: invalid name: " + name)
95
+ }
96
+ return nil
97
+ }
98
+
99
+ // EnvKey is the environment-variable key for a name: api.token -> API_TOKEN.
100
+ func EnvKey(name string, prefix string) (string, error) {
101
+ if err := CheckName(name); nil != err {
102
+ return "", err
103
+ }
104
+
105
+ return prefix + strings.ToUpper(strings.Join(strings.Split(name, "."), "_")), nil
106
+ }
107
+
108
+ // VaultRef is where a name lives in a KV vault: api.token -> api / token.
109
+ //
110
+ // A single-segment name has no path of its own, so it becomes a secret of
111
+ // that name with the conventional field `value`.
112
+ type VaultRef struct {
113
+ Path string `json:"path"`
114
+ Field string `json:"field"`
115
+ }
116
+
117
+ // NameVaultRef splits a name into its vault path and field.
118
+ func NameVaultRef(name string) (*VaultRef, error) {
119
+ if err := CheckName(name); nil != err {
120
+ return nil, err
121
+ }
122
+
123
+ parts := strings.Split(name, ".")
124
+
125
+ if 1 == len(parts) {
126
+ return &VaultRef{Path: parts[0], Field: "value"}, nil
127
+ }
128
+
129
+ return &VaultRef{
130
+ Path: strings.Join(parts[:len(parts)-1], "/"),
131
+ Field: parts[len(parts)-1],
132
+ }, nil
133
+ }
134
+
135
+ // FlatName is a name flattened to one segment: api.token -> api_token (GCP
136
+ // Secret Manager, `_`) or api-token (Azure Key Vault, `-`).
137
+ //
138
+ // Those stores have no path hierarchy and reject dots in ids, so the dots
139
+ // become the store's conventional separator. With `-` as the separator,
140
+ // underscores flatten too: Azure Key Vault's alphabet is letters, digits
141
+ // and hyphens only, and a valid sekreto name like with_underscore must
142
+ // still be representable there. (The resulting `.`/`_` collision mirrors
143
+ // the documented EnvKey behaviour, where both already map to `_`.)
144
+ func FlatName(name string, sep string) (string, error) {
145
+ if err := CheckName(name); nil != err {
146
+ return "", err
147
+ }
148
+
149
+ flat := strings.Join(strings.Split(name, "."), sep)
150
+ if "-" == sep {
151
+ flat = strings.Join(strings.Split(flat, "_"), "-")
152
+ }
153
+
154
+ return flat, nil
155
+ }
156
+
157
+ // AwsParam is the AWS SSM Parameter Store name for a name: dots become the
158
+ // path hierarchy, rooted at `/` (or at a prefix): db.pass.main ->
159
+ // /db/pass/main, or /app/db/pass/main under prefix `/app`.
160
+ func AwsParam(name string, prefix string) (string, error) {
161
+ if err := CheckName(name); nil != err {
162
+ return "", err
163
+ }
164
+
165
+ base := prefix
166
+ if "" != base && !strings.HasPrefix(base, "/") {
167
+ base = "/" + base
168
+ }
169
+ base = strings.TrimSuffix(base, "/")
170
+
171
+ return base + "/" + strings.Join(strings.Split(name, "."), "/"), nil
172
+ }
173
+
174
+ // ParseDotenv parses `.env` text into a map of raw keys to values.
175
+ //
176
+ // Deliberately small: KEY=value, optional `export`, `#` comments on their
177
+ // own line, and single- or double-quoted values (double quotes also
178
+ // unescape \n, \r, \t and \\). A line with no `=` is skipped.
179
+ func ParseDotenv(text string) map[string]string {
180
+ out := map[string]string{}
181
+
182
+ for _, rawline := range strings.Split(text, "\n") {
183
+ line := strings.TrimSpace(strings.TrimSuffix(rawline, "\r"))
184
+
185
+ if 0 == len(line) || strings.HasPrefix(line, "#") {
186
+ continue
187
+ }
188
+
189
+ body := line
190
+ if strings.HasPrefix(line, "export ") {
191
+ body = strings.TrimSpace(line[7:])
192
+ }
193
+
194
+ eq := strings.Index(body, "=")
195
+ if 0 >= eq {
196
+ continue
197
+ }
198
+
199
+ key := strings.TrimSpace(body[:eq])
200
+ value := strings.TrimSpace(body[eq+1:])
201
+
202
+ if 2 <= len(value) && strings.HasPrefix(value, `"`) && strings.HasSuffix(value, `"`) {
203
+ value = unescape(value[1 : len(value)-1])
204
+ } else if 2 <= len(value) && strings.HasPrefix(value, "'") && strings.HasSuffix(value, "'") {
205
+ value = value[1 : len(value)-1]
206
+ }
207
+
208
+ out[key] = value
209
+ }
210
+
211
+ return out
212
+ }
213
+
214
+ func unescape(text string) string {
215
+ var out strings.Builder
216
+
217
+ for index := 0; index < len(text); index++ {
218
+ if '\\' == text[index] && index+1 < len(text) {
219
+ next := text[index+1]
220
+ index++
221
+ switch next {
222
+ case 'n':
223
+ out.WriteByte('\n')
224
+ case 'r':
225
+ out.WriteByte('\r')
226
+ case 't':
227
+ out.WriteByte('\t')
228
+ case '\\':
229
+ out.WriteByte('\\')
230
+ case '"':
231
+ out.WriteByte('"')
232
+ default:
233
+ out.WriteByte('\\')
234
+ out.WriteByte(next)
235
+ }
236
+ } else {
237
+ out.WriteByte(text[index])
238
+ }
239
+ }
240
+
241
+ return out.String()
242
+ }
243
+
244
+ // Redact replaces known secret values in text with `[redacted]`.
245
+ //
246
+ // Only values of four characters or more are replaced: shorter ones are too
247
+ // likely to appear in ordinary text, and redacting them would make logs
248
+ // unreadable without making them safer.
249
+ func Redact(text string, values []string) string {
250
+ out := text
251
+
252
+ // A copy: `values` belongs to the caller (it is `seen` when called
253
+ // through Sekreto.Redact), and sorting in place would reorder it.
254
+ usable := []string{}
255
+ for _, value := range values {
256
+ if 4 <= len(value) {
257
+ usable = append(usable, value)
258
+ }
259
+ }
260
+ sort.SliceStable(usable, func(left, right int) bool {
261
+ return len(usable[left]) > len(usable[right])
262
+ })
263
+
264
+ for _, value := range usable {
265
+ out = strings.Join(strings.Split(out, value), "[redacted]")
266
+ }
267
+
268
+ return out
269
+ }
270
+
271
+ // Options configure a Sekreto.
272
+ type Options struct {
273
+ // Providers is the chain, in resolution order. Each entry names a kind
274
+ // to build - a built-in, or a plugin passed in Plugins - or carries a
275
+ // Provider already built.
276
+ Providers []*ProviderSpec
277
+ // Plugins is the provider kinds beyond the built-ins that Providers may
278
+ // name, as voxgig/plugin definitions. Static and explicit: the calling
279
+ // project imports the plugin packages it needs and passes them here,
280
+ // and a kind it did not pass is unknown to this Sekreto.
281
+ Plugins []plugin.Definition
282
+ // NoCache disables the resolved-value cache.
283
+ NoCache bool
284
+ }
285
+
286
+ // entry is one provider in the chain, under the store name it answers to,
287
+ // and the ref of the plugin instance that built it - "" for a provider
288
+ // handed in already built, which no instance backs.
289
+ type entry struct {
290
+ store string
291
+ ref string
292
+ provider Provider
293
+ }
294
+
295
+ // cached is one resolved value. A slice, not a map: the store a value came
296
+ // from stays attached, and redaction order does not vary between runs.
297
+ type cached struct {
298
+ store string
299
+ name string
300
+ value string
301
+ }
302
+
303
+ // StoreName is the store name a provider answers to when nothing says
304
+ // otherwise.
305
+ //
306
+ // Describe opens with the provider's kind - hashicorp:..., dotenv:..., plain
307
+ // env - so the kind is the natural default, and a custom provider gets a
308
+ // sensible name without implementing anything extra.
309
+ func StoreName(provider Provider) string {
310
+ return strings.SplitN(provider.Describe(), ":", 2)[0]
311
+ }
312
+
313
+ // unknownkind is the message for a kind the catalog does not hold.
314
+ //
315
+ // A kind sekreto has never heard of is a typo; a kind that exists as a
316
+ // plugin but was not passed in is the split working as designed and
317
+ // telling you what to pass. Collapsing the two was the first thing that
318
+ // made the split confusing to use.
319
+ func unknownkind(kind string, catalog *plugin.Catalog) string {
320
+ message := "sekreto: unknown provider kind: " + kind +
321
+ " (available: " + strings.Join(catalog.Names(), ", ") + ")"
322
+
323
+ for _, known := range Kinds.Plugin {
324
+ if known == kind {
325
+ return message + " - " + kind +
326
+ " is a sekreto plugin, not built in: pass it in the Plugins option"
327
+ }
328
+ }
329
+
330
+ return message
331
+ }
332
+
333
+ // unwrap turns a SekretoError that crossed the plugin boundary back into
334
+ // itself, byte for byte. Anything else is not sekreto's to rewrite.
335
+ func unwrap(err error) error {
336
+ perr, is := err.(*plugin.PluginError)
337
+ if !is || ErrorCode != perr.Code {
338
+ return err
339
+ }
340
+
341
+ cause, is := perr.Details["cause"].(string)
342
+ if !is {
343
+ return err
344
+ }
345
+
346
+ return Fail(cause)
347
+ }
348
+
349
+ // Sekreto is the secrets facade: a chain of providers plus a cache.
350
+ //
351
+ // Two ways to read. Get is transparent - it walks the chain and takes the
352
+ // first hit, and the caller never learns which store answered. GetFrom is
353
+ // directed - it names the store, and only that store is asked.
354
+ type Sekreto struct {
355
+ // host is the voxgig/plugin host every spec'd provider is an instance
356
+ // of, and catalog the definitions it can build: the built-ins plus
357
+ // what Options.Plugins handed in.
358
+ host *plugin.Host
359
+ catalog *plugin.Catalog
360
+
361
+ entries []entry
362
+ docache bool
363
+ // Guards cache and seen. Four PROVIDERS were given a mutex for
364
+ // concurrent resolution; the facade holding the results was not, so two
365
+ // goroutines appending to seen from the same length silently dropped one
366
+ // - and a value missing from seen is a value Redact hands straight back
367
+ // into the log. Held only around the slices, never across a provider
368
+ // Lookup, so lookups stay concurrent.
369
+ mu sync.Mutex
370
+ cache []cached
371
+ // Every value ever resolved, for Redact. Kept independently of the
372
+ // read cache so that redaction still works when caching is off -
373
+ // otherwise NoCache would silently disable Redact and leak secrets
374
+ // to logs.
375
+ seen []string
376
+ }
377
+
378
+ // New makes a Sekreto from options: a catalog of the built-in kinds plus
379
+ // the plugins, a voxgig/plugin host, and one instance of the right kind
380
+ // per chain entry. It fails on a kind the catalog does not hold, a store
381
+ // name that is not a valid tag, or a provider that refuses its own
382
+ // configuration.
383
+ func New(options *Options) (*Sekreto, error) {
384
+ opts := options
385
+ if nil == opts {
386
+ opts = &Options{}
387
+ }
388
+
389
+ // Built-ins first, then the plugins, into one catalog: a plugin that
390
+ // names a built-in kind replaces it, which is how a host substitutes
391
+ // an implementation and never an accident, because the four names
392
+ // are documented.
393
+ catalog, err := plugin.MakeCatalog(append(Builtins(), opts.Plugins...)...)
394
+ if nil != err {
395
+ return nil, err
396
+ }
397
+
398
+ sek := &Sekreto{
399
+ host: plugin.MakeHost(plugin.HostOptions{Catalog: catalog}),
400
+ catalog: catalog,
401
+ entries: []entry{},
402
+ docache: !opts.NoCache,
403
+ }
404
+
405
+ for _, spec := range opts.Providers {
406
+ if nil == spec {
407
+ continue
408
+ }
409
+
410
+ if nil != spec.Provider {
411
+ store := spec.Name
412
+ if "" == store {
413
+ store = StoreName(spec.Provider)
414
+ }
415
+ sek.entries = append(sek.entries, entry{store: store, provider: spec.Provider})
416
+ continue
417
+ }
418
+
419
+ one, err := sek.declare(spec)
420
+ if nil != err {
421
+ return nil, err
422
+ }
423
+ sek.entries = append(sek.entries, one)
424
+ }
425
+
426
+ return sek, nil
427
+ }
428
+
429
+ // declare is one chain entry, as a plugin instance.
430
+ //
431
+ // The instance is `kind` for a store named after its kind and `kind$store`
432
+ // otherwise - `hashicorp$prod` - so Host().List() reads like the chain. A
433
+ // store name that is already taken gets a numbered tag from the host
434
+ // instead, because two providers MAY share a store name (a directed read
435
+ // walks both) and an instance ref may not.
436
+ func (sek *Sekreto) declare(spec *ProviderSpec) (entry, error) {
437
+ kind := spec.Kind
438
+
439
+ if !sek.catalog.Has(kind) {
440
+ return entry{}, Fail(unknownkind(kind, sek.catalog))
441
+ }
442
+
443
+ store := spec.Name
444
+ if "" == store {
445
+ store = kind
446
+ }
447
+
448
+ if !plugin.CheckTag(store) {
449
+ return entry{}, Fail("sekreto: invalid store name: " + store)
450
+ }
451
+
452
+ ref := kind
453
+ if store != kind {
454
+ formatted, err := plugin.FormatRef(kind, store)
455
+ if nil != err {
456
+ return entry{}, err
457
+ }
458
+ ref = formatted
459
+ }
460
+ if taken, _ := sek.host.Instance(ref); nil != taken {
461
+ tagged, err := sek.host.AutoTag(kind)
462
+ if nil != err {
463
+ return entry{}, err
464
+ }
465
+ ref = tagged
466
+ }
467
+
468
+ options, err := OptionsOf(spec)
469
+ if nil != err {
470
+ return entry{}, err
471
+ }
472
+
473
+ // Load runs the definition's Define, which builds the provider from
474
+ // the spec; Activate takes the instance live. Nothing is contacted by
475
+ // either: a provider opens nothing until its first Lookup.
476
+ if _, err := sek.host.Load(ref, plugin.DeclareSpec{Options: options}); nil != err {
477
+ return entry{}, unwrap(err)
478
+ }
479
+ if _, err := sek.host.Activate(ref); nil != err {
480
+ return entry{}, unwrap(err)
481
+ }
482
+
483
+ exported, err := sek.host.Exports(ref + "/" + ProviderExport)
484
+ if nil != err {
485
+ return entry{}, err
486
+ }
487
+
488
+ provider, is := exported.(Provider)
489
+ if !is {
490
+ return entry{}, Fail("sekreto: plugin " + kind + " exported no provider")
491
+ }
492
+
493
+ return entry{store: store, ref: ref, provider: provider}, nil
494
+ }
495
+
496
+ // Host is the voxgig/plugin host every spec'd provider is an instance of.
497
+ // Read it for introspection - List names each store's ref and status - and
498
+ // nothing on it advances the chain.
499
+ func (sek *Sekreto) Host() *plugin.Host {
500
+ return sek.host
501
+ }
502
+
503
+ // Catalog is the definitions this Sekreto can build: the built-ins plus
504
+ // what Options.Plugins handed in.
505
+ func (sek *Sekreto) Catalog() *plugin.Catalog {
506
+ return sek.catalog
507
+ }
508
+
509
+ // Close tears the chain down: every plugin instance is deactivated and
510
+ // unloaded, in reverse, releasing whatever a provider acquired at
511
+ // activation. Afterwards there is nothing to read from - Get reports every
512
+ // secret unknown - and the cache is dropped, though Redact still knows
513
+ // every value that was ever resolved.
514
+ func (sek *Sekreto) Close() error {
515
+ err := sek.host.Close()
516
+
517
+ sek.mu.Lock()
518
+ sek.entries = []entry{}
519
+ sek.cache = nil
520
+ sek.mu.Unlock()
521
+
522
+ return err
523
+ }
524
+
525
+ // Get returns the secret, or an error if no provider has it.
526
+ func (sek *Sekreto) Get(name string) (string, error) {
527
+ found, has, err := sek.Try(name)
528
+ if nil != err {
529
+ return "", err
530
+ }
531
+
532
+ if !has {
533
+ return "", Fail("sekreto: unknown secret: " + name)
534
+ }
535
+
536
+ return found, nil
537
+ }
538
+
539
+ // Try returns the secret and whether any provider had it.
540
+ func (sek *Sekreto) Try(name string) (string, bool, error) {
541
+ return sek.resolve("", name, sek.entries)
542
+ }
543
+
544
+ // GetFrom returns the secret from one named store, or an error if that store
545
+ // does not have it.
546
+ func (sek *Sekreto) GetFrom(store string, name string) (string, error) {
547
+ found, has, err := sek.TryFrom(store, name)
548
+ if nil != err {
549
+ return "", err
550
+ }
551
+
552
+ if !has {
553
+ return "", Fail("sekreto: unknown secret: " + store + ":" + name)
554
+ }
555
+
556
+ return found, nil
557
+ }
558
+
559
+ // TryFrom returns the secret from one named store, and whether that store
560
+ // had it.
561
+ //
562
+ // Naming a store that is not in the chain is an error, not a miss: Try
563
+ // already means "this store may not have it", so it cannot also mean "this
564
+ // store may not exist" without hiding a typo.
565
+ func (sek *Sekreto) TryFrom(store string, name string) (string, bool, error) {
566
+ matching := []entry{}
567
+
568
+ for _, one := range sek.entries {
569
+ if one.store == store {
570
+ matching = append(matching, one)
571
+ }
572
+ }
573
+
574
+ if 0 == len(matching) {
575
+ return "", false, Fail("sekreto: unknown store: " + store)
576
+ }
577
+
578
+ return sek.resolve(store, name, matching)
579
+ }
580
+
581
+ func (sek *Sekreto) resolve(store string, name string, entries []entry) (string, bool, error) {
582
+ if err := CheckName(name); nil != err {
583
+ return "", false, err
584
+ }
585
+
586
+ if sek.docache {
587
+ sek.mu.Lock()
588
+ for _, hit := range sek.cache {
589
+ if hit.store == store && hit.name == name {
590
+ value := hit.value
591
+ sek.mu.Unlock()
592
+ return value, true, nil
593
+ }
594
+ }
595
+ sek.mu.Unlock()
596
+ }
597
+
598
+ for _, one := range entries {
599
+ // Deliberately not under the lock: a provider Lookup is a network
600
+ // round-trip, and serialising those would turn a chain resolved from
601
+ // several goroutines into a queue. Two goroutines can therefore both
602
+ // miss the cache and both fetch, which costs a duplicate read and is
603
+ // otherwise harmless - the store is being asked the same question.
604
+ found, has, err := one.provider.Lookup(name)
605
+ if nil != err {
606
+ return "", false, err
607
+ }
608
+
609
+ if has {
610
+ sek.mu.Lock()
611
+ if sek.docache {
612
+ sek.cache = append(sek.cache, cached{store: store, name: name, value: found})
613
+ }
614
+ sek.seen = append(sek.seen, found)
615
+ sek.mu.Unlock()
616
+ return found, true, nil
617
+ }
618
+ }
619
+
620
+ return "", false, nil
621
+ }
622
+
623
+ // Has reports whether any provider has this secret.
624
+ func (sek *Sekreto) Has(name string) (bool, error) {
625
+ _, has, err := sek.Try(name)
626
+ return has, err
627
+ }
628
+
629
+ // HasIn reports whether this named store has this secret.
630
+ func (sek *Sekreto) HasIn(store string, name string) (bool, error) {
631
+ _, has, err := sek.TryFrom(store, name)
632
+ return has, err
633
+ }
634
+
635
+ // All returns every named secret at once. Missing ones are an error.
636
+ func (sek *Sekreto) All(names []string) (map[string]string, error) {
637
+ out := map[string]string{}
638
+
639
+ for _, name := range names {
640
+ found, err := sek.Get(name)
641
+ if nil != err {
642
+ return nil, err
643
+ }
644
+ out[name] = found
645
+ }
646
+
647
+ return out, nil
648
+ }
649
+
650
+ // Sources describes each provider, in resolution order.
651
+ func (sek *Sekreto) Sources() []string {
652
+ out := []string{}
653
+
654
+ for _, one := range sek.entries {
655
+ out = append(out, one.provider.Describe())
656
+ }
657
+
658
+ return out
659
+ }
660
+
661
+ // Stores names each store that can be named by GetFrom, in resolution order
662
+ // and without repeats.
663
+ // String is what a Sekreto shows of itself when something prints it.
664
+ //
665
+ // fmt reflects into unexported fields, so %v and %+v reach cache and seen,
666
+ // which between them hold every value this chain has ever resolved - one
667
+ // ordinary log line writes every secret out. GoString covers %#v the same
668
+ // way. Neither reaches a value.
669
+ func (sek *Sekreto) String() string {
670
+ return "Sekreto{stores: [" + strings.Join(sek.Stores(), " ") + "]}"
671
+ }
672
+
673
+ func (sek *Sekreto) GoString() string {
674
+ return sek.String()
675
+ }
676
+
677
+ func (sek *Sekreto) Stores() []string {
678
+ out := []string{}
679
+
680
+ for _, one := range sek.entries {
681
+ seen := false
682
+ for _, already := range out {
683
+ if already == one.store {
684
+ seen = true
685
+ break
686
+ }
687
+ }
688
+ if !seen {
689
+ out = append(out, one.store)
690
+ }
691
+ }
692
+
693
+ return out
694
+ }
695
+
696
+ // Redact replaces every value this Sekreto has resolved with `[redacted]`.
697
+ //
698
+ // Works whether or not caching is enabled: the redaction list is kept
699
+ // independently of the read cache.
700
+ func (sek *Sekreto) Redact(text string) string {
701
+ sek.mu.Lock()
702
+ seen := make([]string, len(sek.seen))
703
+ copy(seen, sek.seen)
704
+ sek.mu.Unlock()
705
+
706
+ return Redact(text, seen)
707
+ }
708
+
709
+ // Refresh drops cached values, so the next Get asks the providers again.
710
+ func (sek *Sekreto) Refresh() {
711
+ sek.mu.Lock()
712
+ sek.cache = nil
713
+ sek.mu.Unlock()
714
+ }