@voxgig/sdkgen 4.8.2 → 4.8.3

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