@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,120 @@
1
+ // VENDORED: @voxgig/sekreto sdk-20260904-1610-0 (go/sekreto/addr.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
+ // The plaintext-address guard, in the core because it is pure - a
5
+ // handful of string steps, no socket - and because it is on the spec:
6
+ // every port answers the same for every address in spec/def/store.aon.
7
+ // The plugins that dial an address call CheckAddr before they do.
8
+ //
9
+ // A port of typescript/src/provider/addr.ts.
10
+
11
+ package sekreto
12
+
13
+ import "strings"
14
+
15
+ // SafeAddr returns the address with any userinfo replaced by [redacted],
16
+ // for messages.
17
+ //
18
+ // Every refusal in CheckAddr names the address it refused, and one of them fires
19
+ // precisely because the address carries a credential - so printing it
20
+ // verbatim wrote the password to stderr and into the logs. It cannot be
21
+ // cleaned up afterwards either: that password was never resolved as a
22
+ // secret, so Redact has never seen it and never will. The host is what a
23
+ // reader needs to identify which chain entry is at fault; the userinfo is
24
+ // not.
25
+ func SafeAddr(addr string) string {
26
+ mark := strings.Index(addr, "://")
27
+ if -1 == mark {
28
+ return addr
29
+ }
30
+
31
+ rest := addr[mark+3:]
32
+ authority := rest
33
+ if end := strings.IndexAny(rest, "/?#"); -1 != end {
34
+ authority = rest[:end]
35
+ }
36
+
37
+ at := strings.LastIndex(authority, "@")
38
+ if -1 == at {
39
+ return addr
40
+ }
41
+
42
+ return addr[:mark+3] + "[redacted]" + addr[mark+3+at:]
43
+ }
44
+
45
+ // CheckAddr refuses to send a Vault token in the clear.
46
+ //
47
+ // Vault's API is HTTPS in any real deployment; plaintext is a dev-mode
48
+ // convenience. Sending X-Vault-Token over http to anything but the local
49
+ // machine puts both the token and the secret it fetches on the wire for
50
+ // anyone on the path, so sekreto will not do it. Loopback stays allowed:
51
+ // that is `vault server -dev` and this repo's own test harness.
52
+ //
53
+ // The address is read by hand, in the same handful of steps in every port,
54
+ // rather than by each platform's URL parser. That is deliberate. Twelve
55
+ // parsers disagree about malformed input - where userinfo ends, whether
56
+ // 0177.0.0.1 is loopback, what an unclosed bracket means - and a check that
57
+ // answers differently in different ports is not a check.
58
+ //
59
+ // The rule this parse obeys, and the reason it can be trusted: it is never
60
+ // more permissive than the HTTP client that will dial the address. It ends
61
+ // the authority at '/', '?' or '#' only, so a client that also breaks on
62
+ // '\' (WHATWG does) can only ever see a SHORTER host than this does. It
63
+ // refuses userinfo outright rather than locating its end. It compares the
64
+ // host literally, so a numeric form no parser here agrees on is refused
65
+ // rather than guessed at.
66
+ func CheckAddr(addr string) error {
67
+ scheme := ""
68
+ if strings.HasPrefix(addr, "https://") {
69
+ scheme = "https://"
70
+ } else if strings.HasPrefix(addr, "http://") {
71
+ scheme = "http://"
72
+ } else {
73
+ return Fail("sekreto: not an http(s) address: " + SafeAddr(addr))
74
+ }
75
+
76
+ rest := addr[len(scheme):]
77
+ end := strings.IndexAny(rest, "/?#")
78
+ authority := rest
79
+ if -1 != end {
80
+ authority = rest[:end]
81
+ }
82
+
83
+ // Userinfo is refused outright rather than parsed around, and on https as
84
+ // well as http. No store this library speaks authenticates by userinfo -
85
+ // they take a token or a signature - so an address carrying one is a
86
+ // mistake at best. At worst it is the attack this whole function exists
87
+ // to stop: http://localhost:8200@evil.example.com/ is a request to
88
+ // evil.example.com that reads, to anything that splits the authority on
89
+ // ':', as loopback.
90
+ if strings.Contains(authority, "@") {
91
+ return Fail("sekreto: refusing an address with embedded credentials: " + SafeAddr(addr))
92
+ }
93
+
94
+ // An opening bracket with no closing one is not an address at all.
95
+ if strings.HasPrefix(authority, "[") && !strings.Contains(authority, "]") {
96
+ return Fail("sekreto: not a valid http(s) address: " + SafeAddr(addr))
97
+ }
98
+
99
+ if "https://" == scheme {
100
+ return nil
101
+ }
102
+
103
+ // A bracketed IPv6 literal keeps its brackets. Splitting the authority on
104
+ // the first colon yields "[", so http://[::1]:8200 could never match -
105
+ // which made the "[::1]" entry below unreachable, and refused a
106
+ // legitimate local vault.
107
+ host := authority
108
+ if strings.HasPrefix(authority, "[") {
109
+ host = authority[:strings.Index(authority, "]")+1]
110
+ } else {
111
+ host = strings.Split(authority, ":")[0]
112
+ }
113
+
114
+ switch strings.ToLower(host) {
115
+ case "localhost", "127.0.0.1", "::1", "[::1]":
116
+ return nil
117
+ }
118
+
119
+ return Fail("sekreto: refusing to send a token in plaintext to " + SafeAddr(addr) + " (use https)")
120
+ }
@@ -0,0 +1,439 @@
1
+ // VENDORED: @voxgig/sekreto sdk-20260904-1610-0 (go/sekreto/providers.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
+ // What a provider is, what its declarative form looks like, how a provider
5
+ // kind becomes a voxgig/plugin definition - and the four BUILT-IN kinds.
6
+ //
7
+ // A provider answers one question: "do you have this secret?" It returns
8
+ // the value and whether it had it - a false means "ask the next one".
9
+ // Nothing else about a provider is visible to the caller, which is the
10
+ // point: an app reads `api.token` and never learns whether it came from the
11
+ // environment, a .env file, HashiCorp Vault, AWS, GCP, Azure or a boru
12
+ // vault.
13
+ //
14
+ // Two failure shapes, and they are never interchangeable. A store that does
15
+ // not hold the secret is a MISS (false) - the chain carries on. A store
16
+ // that could not answer - bad credentials, unreachable host, missing
17
+ // configuration - is an ERROR: falling through there would quietly reach
18
+ // for a weaker store.
19
+ //
20
+ // THIS PACKAGE IMPORTS NO net/http, NO crypto AND NO os/exec. What makes a
21
+ // kind built in is that it needs nothing of the platform beyond reading a
22
+ // local file; every kind that opens a socket, signs a request or spawns a
23
+ // process is a plugin under plugins/, its own package, linked only by a
24
+ // binary that imports it (docs/design/plugin-providers.md).
25
+ //
26
+ // A port of typescript/src/provider/support.ts and
27
+ // typescript/src/provider/builtin.ts, which are canonical.
28
+
29
+ package sekreto
30
+
31
+ import (
32
+ "encoding/json"
33
+ "errors"
34
+ "io/fs"
35
+ "os"
36
+ "path/filepath"
37
+ "strings"
38
+ "sync"
39
+ "syscall"
40
+
41
+ plugin "GOMODULE/feature/secrets/plugin"
42
+ )
43
+
44
+ // Provider is a source of secrets.
45
+ type Provider interface {
46
+ // Lookup returns the value and whether this provider has it.
47
+ Lookup(name string) (string, bool, error)
48
+ // Describe is a short description, shown by Sekreto.Sources.
49
+ Describe() string
50
+ }
51
+
52
+ // ProviderSpec is the declarative form of a provider, as used in config and
53
+ // in the shared spec: a Kind naming a built-in or a plugin, plus that
54
+ // kind's own configuration.
55
+ //
56
+ // The JSON tags are the spec's own key names, and they are also how the
57
+ // spec reaches a plugin: New hands each spec to the voxgig/plugin host as
58
+ // the instance's options map, and the plugin's definition reads it back
59
+ // with SpecOf. `omitempty` keeps that map to the keys actually set.
60
+ //
61
+ // A spec may instead CARRY a provider already built - Provider set, Kind
62
+ // empty - which is how a custom provider that is not a plugin joins the
63
+ // chain. Its store name is Name, or the kind its Describe opens with.
64
+ type ProviderSpec struct {
65
+ Kind string `json:"kind,omitempty"`
66
+ // Name is the store name GetFrom addresses. Defaults to Kind.
67
+ Name string `json:"name,omitempty"`
68
+ Prefix string `json:"prefix,omitempty"`
69
+ File string `json:"file,omitempty"`
70
+ Values map[string]string `json:"values,omitempty"`
71
+ // Dir is the file provider's directory of one-secret-per-file entries.
72
+ Dir string `json:"dir,omitempty"`
73
+ // hashicorp / boru (wire) / gcp / 1password / doppler / infisical:
74
+ // the base URL and the access token.
75
+ Addr string `json:"addr,omitempty"`
76
+ Token string `json:"token,omitempty"`
77
+ // Mount is the hashicorp / boru (wire) KV mount (default `secret`).
78
+ Mount string `json:"mount,omitempty"`
79
+ // KV is the hashicorp KV engine version, 1 or 2 (default 2).
80
+ KV int `json:"kv,omitempty"`
81
+ // VaultNamespace is the Vault Enterprise namespace (X-Vault-Namespace).
82
+ VaultNamespace string `json:"vaultnamespace,omitempty"`
83
+ // Auth logs hashicorp in for a token instead of being handed one.
84
+ Auth *AuthSpec `json:"auth,omitempty"`
85
+ // Command is the boru / secretspec executable to run (default: the
86
+ // kind's own name).
87
+ Command string `json:"command,omitempty"`
88
+ // boru
89
+ Namespace string `json:"namespace,omitempty"`
90
+ Home string `json:"home,omitempty"`
91
+ // Profile is the secretspec profile to read (--profile).
92
+ Profile string `json:"profile,omitempty"`
93
+ // Backend is which of secretspec's OWN backends to read from
94
+ // (--provider), e.g. `keyring` or `dotenv://.env`. Named Backend here
95
+ // because Provider already means a sekreto provider.
96
+ Backend string `json:"backend,omitempty"`
97
+ // Reason is the audit reason recorded for a secretspec read
98
+ // (--reason). SecretSpec refuses to read without one.
99
+ Reason string `json:"reason,omitempty"`
100
+ // aws: region and credentials; the standard AWS_* environment
101
+ // variables fill whichever are not given.
102
+ Region string `json:"region,omitempty"`
103
+ KeyID string `json:"keyid,omitempty"`
104
+ Secret string `json:"secret,omitempty"`
105
+ Session string `json:"session,omitempty"`
106
+ // Project is the gcp / doppler / infisical project (GCP project id,
107
+ // Doppler project slug, Infisical workspace id).
108
+ Project string `json:"project,omitempty"`
109
+ // Vault is the azure Key Vault name or full URL, or the 1password
110
+ // vault name or id.
111
+ Vault string `json:"vault,omitempty"`
112
+ // azure: client-credential login. infisical: universal-auth login
113
+ // (tenant is Azure-only).
114
+ Tenant string `json:"tenant,omitempty"`
115
+ ClientID string `json:"clientid,omitempty"`
116
+ ClientSecret string `json:"clientsecret,omitempty"`
117
+ // azure: where to log in / where IMDS answers. gcp: where the
118
+ // metadata server answers. Overridable for tests and for clouds with
119
+ // nonstandard endpoints.
120
+ LoginAddr string `json:"loginaddr,omitempty"`
121
+ ImdsAddr string `json:"imdsaddr,omitempty"`
122
+ MetadataAddr string `json:"metadataaddr,omitempty"`
123
+ // ApiVersion is the azure Key Vault API version (default 7.4).
124
+ ApiVersion string `json:"apiversion,omitempty"`
125
+ // Config is the doppler config slug (with Project).
126
+ Config string `json:"config,omitempty"`
127
+ // infisical: the environment slug and secret path.
128
+ Environment string `json:"environment,omitempty"`
129
+ Path string `json:"path,omitempty"`
130
+
131
+ // Provider is a provider already built, joining the chain as it is.
132
+ // Never serialized: a live provider is not data.
133
+ Provider Provider `json:"-"`
134
+ }
135
+
136
+ // AuthSpec is how the hashicorp provider logs in for a token instead of
137
+ // being handed one.
138
+ type AuthSpec struct {
139
+ Method string `json:"method,omitempty"`
140
+ // Mount is the auth mount, defaulting to the method name.
141
+ Mount string `json:"mount,omitempty"`
142
+ // kubernetes: the Vault role to log in as.
143
+ Role string `json:"role,omitempty"`
144
+ // Jwt is the service-account JWT itself (tests).
145
+ Jwt string `json:"jwt,omitempty"`
146
+ // JwtFile is where the JWT lives; the conventional pod path by
147
+ // default.
148
+ JwtFile string `json:"jwtfile,omitempty"`
149
+ // approle: the role and secret ids.
150
+ RoleID string `json:"roleid,omitempty"`
151
+ SecretID string `json:"secretid,omitempty"`
152
+ }
153
+
154
+ // EnvProvider reads environment variables: api.token from API_TOKEN.
155
+ type EnvProvider struct {
156
+ Prefix string
157
+ // Source overrides the process environment, for tests.
158
+ Source map[string]string
159
+ }
160
+
161
+ func (provider *EnvProvider) Lookup(name string) (string, bool, error) {
162
+ key, err := EnvKey(name, provider.Prefix)
163
+ if nil != err {
164
+ return "", false, err
165
+ }
166
+
167
+ if nil != provider.Source {
168
+ value, has := provider.Source[key]
169
+ return value, has, nil
170
+ }
171
+
172
+ value, has := os.LookupEnv(key)
173
+ return value, has, nil
174
+ }
175
+
176
+ func (provider *EnvProvider) Describe() string {
177
+ if "" != provider.Prefix {
178
+ return "env:" + provider.Prefix
179
+ }
180
+ return "env"
181
+ }
182
+
183
+ // DotenvProvider reads a `.env` file once, keyed exactly like the
184
+ // environment.
185
+ type DotenvProvider struct {
186
+ File string
187
+ Prefix string
188
+ // Guards the memoised state below: a Sekreto may resolve from several
189
+ // goroutines, and a racy map read is either a crash or a zero value - a
190
+ // MISS where the store does hold the secret, which falls through to a
191
+ // weaker store.
192
+ mu sync.Mutex
193
+ values map[string]string
194
+ }
195
+
196
+ func (provider *DotenvProvider) load() (map[string]string, error) {
197
+ provider.mu.Lock()
198
+ defer provider.mu.Unlock()
199
+
200
+ if nil == provider.values {
201
+ text, err := os.ReadFile(provider.File)
202
+ if nil != err {
203
+ // An absent file - or an absent directory - means "no secrets
204
+ // here", exactly like FileProvider. Anything else (permission
205
+ // denied, an unreadable mount) is a store that could not
206
+ // answer, and swallowing it would fall through to a weaker
207
+ // store.
208
+ if !errors.Is(err, fs.ErrNotExist) && !errors.Is(err, syscall.ENOTDIR) {
209
+ return nil, Fail("sekreto: dotenv provider cannot read " +
210
+ provider.File + ": " + err.Error())
211
+ }
212
+ provider.values = map[string]string{}
213
+ } else {
214
+ provider.values = ParseDotenv(string(text))
215
+ }
216
+ }
217
+
218
+ return provider.values, nil
219
+ }
220
+
221
+ func (provider *DotenvProvider) Lookup(name string) (string, bool, error) {
222
+ key, err := EnvKey(name, provider.Prefix)
223
+ if nil != err {
224
+ return "", false, err
225
+ }
226
+
227
+ values, err := provider.load()
228
+ if nil != err {
229
+ return "", false, err
230
+ }
231
+
232
+ value, has := values[key]
233
+ return value, has, nil
234
+ }
235
+
236
+ func (provider *DotenvProvider) Describe() string {
237
+ return "dotenv:" + provider.File
238
+ }
239
+
240
+ // MemoryProvider holds literal values, keyed like environment variables.
241
+ // The spec uses this to test chain behaviour without touching the outside
242
+ // world.
243
+ type MemoryProvider struct {
244
+ Values map[string]string
245
+ Prefix string
246
+ }
247
+
248
+ func (provider *MemoryProvider) Lookup(name string) (string, bool, error) {
249
+ key, err := EnvKey(name, provider.Prefix)
250
+ if nil != err {
251
+ return "", false, err
252
+ }
253
+
254
+ value, has := provider.Values[key]
255
+ return value, has, nil
256
+ }
257
+
258
+ func (provider *MemoryProvider) Describe() string {
259
+ if "" != provider.Prefix {
260
+ return "memory:" + provider.Prefix
261
+ }
262
+ return "memory"
263
+ }
264
+
265
+ // FileProvider reads a directory of one-secret-per-file entries, keyed
266
+ // like the environment: api.token reads <dir>/API_TOKEN.
267
+ //
268
+ // This is the shape of a mounted Kubernetes Secret, a Docker or Swarm
269
+ // secret, and a systemd credentials directory, so those all work with no
270
+ // further configuration. One trailing newline is stripped - tools that
271
+ // write these files disagree about it, and a newline is never part of a
272
+ // secret on purpose.
273
+ type FileProvider struct {
274
+ Dir string
275
+ Prefix string
276
+ }
277
+
278
+ func (provider *FileProvider) Lookup(name string) (string, bool, error) {
279
+ key, err := EnvKey(name, provider.Prefix)
280
+ if nil != err {
281
+ return "", false, err
282
+ }
283
+
284
+ file := filepath.Join(provider.Dir, key)
285
+
286
+ raw, err := os.ReadFile(file)
287
+ if nil != err {
288
+ // An absent file - or an absent directory - means "no secrets
289
+ // here", exactly like a missing .env. Anything else (permission
290
+ // denied, an unreadable mount) is a store that could not answer.
291
+ if errors.Is(err, fs.ErrNotExist) || errors.Is(err, syscall.ENOTDIR) {
292
+ return "", false, nil
293
+ }
294
+ return "", false, Fail("sekreto: file provider cannot read " + file + ": " + err.Error())
295
+ }
296
+
297
+ text := string(raw)
298
+ if strings.HasSuffix(text, "\n") {
299
+ text = strings.TrimSuffix(strings.TrimSuffix(text, "\n"), "\r")
300
+ }
301
+
302
+ return text, true, nil
303
+ }
304
+
305
+ func (provider *FileProvider) Describe() string {
306
+ return "file:" + provider.Dir
307
+ }
308
+
309
+ // --- providers as voxgig/plugin definitions ----------------------------
310
+
311
+ // ProviderExport is the export key under which a provider definition
312
+ // publishes the provider it built. New reads `<ref>/provider` off the host.
313
+ const ProviderExport = "provider"
314
+
315
+ // ErrorCode is the voxgig/plugin error code a SekretoError travels under
316
+ // when a definition's Define returns it.
317
+ //
318
+ // plugin wraps a code-less error returned by a callback as
319
+ // `plugin_define_failed`, and keeps an error that already carries a code.
320
+ // A provider that refuses its own configuration - `kv: 3`, a missing
321
+ // project - returns a SekretoError, and that message is pinned by the
322
+ // spec byte for byte, so it must come back out of the host exactly as it
323
+ // went in. ProviderPlugin gives it this code on the way in; New turns it
324
+ // back into a SekretoError on the way out.
325
+ const ErrorCode = "sekreto_error"
326
+
327
+ // ProviderPlugin is a provider kind, as a voxgig/plugin definition.
328
+ //
329
+ // This is the whole bridge between the two libraries. The definition's
330
+ // Name is the Kind a ProviderSpec names; its Define reads the spec back
331
+ // off the instance's options, builds the provider with make, and exports
332
+ // it. Nothing runs at activate: a provider opens nothing until its first
333
+ // Lookup, so there is nothing to capture - a provider that does hold a
334
+ // resource acquires it there and lets the instance scope unwind it.
335
+ //
336
+ // Every built-in and every plugin is made this way, so a custom provider
337
+ // kind is one call:
338
+ //
339
+ // sekreto.ProviderPlugin("mystore", func(spec *sekreto.ProviderSpec) (sekreto.Provider, error) {
340
+ // return &MyStore{Addr: spec.Addr}, nil
341
+ // })
342
+ func ProviderPlugin(kind string, make func(spec *ProviderSpec) (Provider, error)) plugin.Definition {
343
+ return plugin.Definition{
344
+ Name: kind,
345
+ Define: func(inst *plugin.Inst) error {
346
+ spec, err := SpecOf(inst.Options())
347
+ if nil != err {
348
+ return err
349
+ }
350
+
351
+ provider, err := make(spec)
352
+ if nil != err {
353
+ var serr *SekretoError
354
+ if errors.As(err, &serr) {
355
+ return plugin.Fail(ErrorCode, serr.Message,
356
+ map[string]any{"ref": inst.Ref(), "cause": serr.Message})
357
+ }
358
+ return err
359
+ }
360
+
361
+ inst.Export(ProviderExport, provider)
362
+ return nil
363
+ },
364
+ }
365
+ }
366
+
367
+ // SpecOf reads a ProviderSpec back off a plugin instance's options map -
368
+ // the JSON shape OptionsOf produced, and the shape a config document
369
+ // would.
370
+ func SpecOf(options map[string]any) (*ProviderSpec, error) {
371
+ text, err := json.Marshal(options)
372
+ if nil != err {
373
+ return nil, Fail("sekreto: unreadable provider options: " + err.Error())
374
+ }
375
+
376
+ spec := &ProviderSpec{}
377
+ if err := json.Unmarshal(text, spec); nil != err {
378
+ return nil, Fail("sekreto: unreadable provider options: " + err.Error())
379
+ }
380
+
381
+ return spec, nil
382
+ }
383
+
384
+ // OptionsOf is a ProviderSpec as a plugin instance's options map: its
385
+ // JSON form, which is the spec's own key names.
386
+ func OptionsOf(spec *ProviderSpec) (map[string]any, error) {
387
+ text, err := json.Marshal(spec)
388
+ if nil != err {
389
+ return nil, Fail("sekreto: unwritable provider spec: " + err.Error())
390
+ }
391
+
392
+ options := map[string]any{}
393
+ if err := json.Unmarshal(text, &options); nil != err {
394
+ return nil, Fail("sekreto: unwritable provider spec: " + err.Error())
395
+ }
396
+
397
+ return options, nil
398
+ }
399
+
400
+ // Builtins is the four built-in provider kinds, as definitions, in a fresh
401
+ // slice: env, memory, dotenv and file - the same four in every port. New
402
+ // puts them in every catalog ahead of the plugins it is handed.
403
+ func Builtins() []plugin.Definition {
404
+ return []plugin.Definition{
405
+ ProviderPlugin("env", func(spec *ProviderSpec) (Provider, error) {
406
+ return &EnvProvider{Prefix: spec.Prefix}, nil
407
+ }),
408
+ ProviderPlugin("memory", func(spec *ProviderSpec) (Provider, error) {
409
+ values := spec.Values
410
+ if nil == values {
411
+ values = map[string]string{}
412
+ }
413
+ return &MemoryProvider{Values: values, Prefix: spec.Prefix}, nil
414
+ }),
415
+ ProviderPlugin("dotenv", func(spec *ProviderSpec) (Provider, error) {
416
+ file := spec.File
417
+ if "" == file {
418
+ file = ".env"
419
+ }
420
+ return &DotenvProvider{File: file, Prefix: spec.Prefix}, nil
421
+ }),
422
+ ProviderPlugin("file", func(spec *ProviderSpec) (Provider, error) {
423
+ return &FileProvider{Dir: spec.Dir, Prefix: spec.Prefix}, nil
424
+ }),
425
+ }
426
+ }
427
+
428
+ // Kinds is every kind this library ships, built in or as a plugin, so that
429
+ // an unknown kind can be told from a plugin that was not loaded.
430
+ var Kinds = struct {
431
+ Builtin []string
432
+ Plugin []string
433
+ }{
434
+ Builtin: []string{"env", "memory", "dotenv", "file"},
435
+ Plugin: []string{
436
+ "hashicorp", "boru", "awssecrets", "awsparams", "gcpsecrets",
437
+ "azuresecrets", "onepassword", "doppler", "infisical", "secretspec",
438
+ },
439
+ }