@voxgig/sdkgen 4.8.1 → 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 +2 -2
  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,62 @@
1
+ # VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/doppler.py)
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 doppler plugin: Doppler, one bulk download per config. Needs
5
+ # HTTPS. A port of typescript/plugins/doppler.ts.
6
+ from ..addr import checkaddr
7
+ from ..sekreto import SekretoError, envkey
8
+ from ..providers import Provider, providerplugin
9
+ from .httpjson import fetchjson, urlpart
10
+
11
+
12
+ class DopplerProvider(Provider):
13
+ """Doppler.
14
+
15
+ The whole config is downloaded once - Doppler's own bulk endpoint -
16
+ and answered from memory, like a remote .env: `api.token` is the
17
+ `API_TOKEN` entry. A service token is config-scoped, so project and
18
+ config are only needed with broader tokens.
19
+ """
20
+
21
+ def __init__(self, options=None):
22
+ self.opts = options or {}
23
+ self.values = None
24
+
25
+ def load(self):
26
+ if self.values is not None:
27
+ return self.values
28
+
29
+ addr = (self.opts.get('addr') or 'https://api.doppler.com').rstrip('/')
30
+ checkaddr(addr)
31
+
32
+ url = addr + '/v3/configs/config/secrets/download?format=json'
33
+ if self.opts.get('project'):
34
+ url += '&project=' + urlpart(self.opts['project'])
35
+ if self.opts.get('config'):
36
+ url += '&config=' + urlpart(self.opts['config'])
37
+
38
+ status, body = fetchjson(
39
+ 'GET', url, {'authorization': 'Bearer ' + (self.opts.get('token') or '')}
40
+ )
41
+
42
+ if 200 != status or not isinstance(body, dict):
43
+ raise SekretoError('sekreto: doppler error: ' + str(status))
44
+
45
+ self.values = {}
46
+ for key, value in body.items():
47
+ if value is not None:
48
+ self.values[key] = str(value)
49
+
50
+ return self.values
51
+
52
+ def lookup(self, name):
53
+ return self.load().get(envkey(name))
54
+
55
+ def describe(self):
56
+ if self.opts.get('project'):
57
+ return 'doppler:' + self.opts['project'] + '/' + (self.opts.get('config') or '')
58
+ return 'doppler'
59
+
60
+
61
+ # The plugin: the `doppler` provider kind, as a voxgig/plugin definition.
62
+ doppler = providerplugin('doppler', DopplerProvider)
@@ -0,0 +1,101 @@
1
+ # VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/gcpsecrets.py)
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 gcpsecrets plugin: GCP Secret Manager. Needs HTTPS. A port of
5
+ # typescript/plugins/gcpsecrets.ts.
6
+ import base64
7
+ import os
8
+ import time
9
+
10
+ from ..addr import checkaddr
11
+ from ..sekreto import SekretoError, flatname
12
+ from ..providers import Provider, providerplugin
13
+ from .httpjson import fetchjson, tonumber
14
+
15
+
16
+ class GcpsecretsProvider(Provider):
17
+ """GCP Secret Manager.
18
+
19
+ `api.token` reads secret `api_token` (dots flattened to `_`; Secret
20
+ Manager ids have no hierarchy and reject dots), latest version. The
21
+ token comes from config, then `GOOGLE_OAUTH_ACCESS_TOKEN`, then the
22
+ GCE/GKE metadata server - so on Google's own platform no credential
23
+ configuration is needed at all.
24
+
25
+ The metadata call itself is plain http to a link-local host by
26
+ platform design; no credential rides on it, so `checkaddr` guards the
27
+ Secret Manager address instead.
28
+ """
29
+
30
+ def __init__(self, options=None):
31
+ self.opts = options or {}
32
+
33
+ # A configured token is kept forever; a metadata-server token carries
34
+ # expires_in and is renewed shortly before it runs out.
35
+ self.livetoken = None
36
+ self.renewat = float('inf')
37
+
38
+ def metadataaddr(self):
39
+ if self.opts.get('metadataaddr'):
40
+ return self.opts['metadataaddr']
41
+ host = os.environ.get('GCE_METADATA_HOST')
42
+ return 'http://' + host if host else 'http://metadata.google.internal'
43
+
44
+ def login(self):
45
+ configured = self.opts.get('token') or os.environ.get('GOOGLE_OAUTH_ACCESS_TOKEN')
46
+ if configured:
47
+ return configured
48
+
49
+ url = (self.metadataaddr().rstrip('/')
50
+ + '/computeMetadata/v1/instance/service-accounts/default/token')
51
+
52
+ status, body = fetchjson('GET', url, {'Metadata-Flavor': 'Google'})
53
+
54
+ got = (body or {}).get('access_token')
55
+ if 200 != status or not got:
56
+ raise SekretoError('sekreto: gcp: no token and metadata server did not answer')
57
+
58
+ expires = tonumber((body or {}).get('expires_in'))
59
+ self.renewat = time.time() + max(expires - 60, 1) if 0 < expires else float('inf')
60
+
61
+ return str(got)
62
+
63
+ def lookup(self, name):
64
+ project = self.opts.get('project') or ''
65
+ if '' == project:
66
+ raise SekretoError('sekreto: gcp: no project')
67
+
68
+ addr = self.opts.get('addr') or 'https://secretmanager.googleapis.com'
69
+ checkaddr(addr)
70
+
71
+ if self.livetoken is None or time.time() >= self.renewat:
72
+ self.livetoken = self.login()
73
+
74
+ url = (addr.rstrip('/') + '/v1/projects/' + project + '/secrets/'
75
+ + flatname(name, '_') + '/versions/latest:access')
76
+
77
+ status, body = fetchjson('GET', url, {'authorization': 'Bearer ' + self.livetoken})
78
+
79
+ if 404 == status:
80
+ return None
81
+
82
+ if 200 != status:
83
+ raise SekretoError('sekreto: gcp error: ' + str(status) + ': ' + url)
84
+
85
+ data = ((body or {}).get('payload') or {}).get('data')
86
+ if not isinstance(data, str):
87
+ return None
88
+
89
+ # See the aws provider: validate=True, and an undecodable payload
90
+ # is an error rather than a miss.
91
+ try:
92
+ return base64.b64decode(data, validate=True).decode('utf8')
93
+ except Exception:
94
+ raise SekretoError('sekreto: gcp: undecodable secret')
95
+
96
+ def describe(self):
97
+ return 'gcpsecrets:' + (self.opts.get('project') or '')
98
+
99
+
100
+ # The plugin: the `gcpsecrets` provider kind, as a voxgig/plugin definition.
101
+ gcpsecrets = providerplugin('gcpsecrets', GcpsecretsProvider)
@@ -0,0 +1,152 @@
1
+ # VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/hashicorp.py)
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 hashicorp plugin: HashiCorp Vault, and OpenBao. Needs HTTPS, and
5
+ # the filesystem for a kubernetes service-account JWT. A port of
6
+ # typescript/plugins/hashicorp.ts.
7
+ import json
8
+ import time
9
+
10
+ from ..addr import checkaddr
11
+ from ..sekreto import SekretoError, vaultref
12
+ from ..providers import Provider, providerplugin
13
+ from .httpjson import fetchjson, tonumber
14
+
15
+
16
+ class HashicorpProvider(Provider):
17
+ """HashiCorp Vault.
18
+
19
+ KV v2 (the default): `api.token` reads `{addr}/v1/{mount}/data/api`
20
+ and takes the `token` field of `data.data`. KV v1 (`kv: 1`) reads
21
+ `{addr}/v1/{mount}/api` and takes the field of `data`. A 404 means
22
+ "not here" - a miss - so a vault can sit in a chain with fallbacks.
23
+
24
+ A Vault Enterprise namespace rides the X-Vault-Namespace header, on
25
+ logins as well as reads.
26
+
27
+ Instead of being handed a token, the provider can log in: Kubernetes
28
+ auth (the pod's service-account JWT, from its conventional path) or
29
+ AppRole. A failed login is an error, never a miss - it means this
30
+ store could not answer at all.
31
+ """
32
+
33
+ def __init__(self, addr, token, mount=None, kv=None, vaultnamespace=None, auth=None):
34
+ self.addr = addr
35
+ self.mount = mount or 'secret'
36
+ self.kv = kv or 2
37
+ self.vaultnamespace = vaultnamespace
38
+ self.auth = auth
39
+
40
+ # A version typo like kv: 3 must not quietly behave as v2 and turn
41
+ # its 404s into misses; there is nothing safe to assume it meant.
42
+ if 1 != self.kv and 2 != self.kv:
43
+ raise SekretoError(
44
+ 'sekreto: hashicorp: unsupported kv version: ' + str(self.kv)
45
+ )
46
+
47
+ # The working token: a configured token is kept forever, a logged-in
48
+ # token is renewed shortly before its lease runs out - a long-running
49
+ # process must not keep presenting a token the vault already expired.
50
+ self.livetoken = None if '' == token else token
51
+ self.renewat = float('inf')
52
+
53
+ def baseheaders(self):
54
+ headers = {}
55
+ if self.vaultnamespace:
56
+ headers['X-Vault-Namespace'] = self.vaultnamespace
57
+ return headers
58
+
59
+ def login(self):
60
+ auth = self.auth
61
+ if not auth:
62
+ raise SekretoError('sekreto: hashicorp: no token and no auth method')
63
+
64
+ method = auth.get('method')
65
+ mount = auth.get('mount') or method
66
+ url = self.addr.rstrip('/') + '/v1/auth/' + str(mount) + '/login'
67
+
68
+ if 'kubernetes' == method:
69
+ jwt = auth.get('jwt')
70
+ if jwt is None:
71
+ file = (
72
+ auth.get('jwtfile')
73
+ or '/var/run/secrets/kubernetes.io/serviceaccount/token'
74
+ )
75
+ try:
76
+ with open(file, 'r', encoding='utf8') as handle:
77
+ jwt = handle.read().strip()
78
+ except OSError:
79
+ raise SekretoError('sekreto: hashicorp: cannot read jwt file ' + file)
80
+ body = {'role': auth.get('role') or '', 'jwt': jwt}
81
+ elif 'approle' == method:
82
+ body = {
83
+ 'role_id': auth.get('roleid') or '',
84
+ 'secret_id': auth.get('secretid') or '',
85
+ }
86
+ else:
87
+ raise SekretoError(
88
+ 'sekreto: hashicorp: unknown auth method: ' + str(method)
89
+ )
90
+
91
+ status, resbody = fetchjson(
92
+ 'POST', url, self.baseheaders(), json.dumps(body, separators=(',', ':'))
93
+ )
94
+
95
+ got = ((resbody or {}).get('auth') or {}).get('client_token')
96
+ if 200 != status or not got:
97
+ raise SekretoError(
98
+ 'sekreto: hashicorp login failed: ' + str(status) + ': ' + url
99
+ )
100
+
101
+ lease = tonumber(((resbody or {}).get('auth') or {}).get('lease_duration'))
102
+ self.renewat = time.time() + max(lease - 60, 1) if 0 < lease else float('inf')
103
+
104
+ return str(got)
105
+
106
+ def lookup(self, name):
107
+ checkaddr(self.addr)
108
+
109
+ if self.livetoken is None or time.time() >= self.renewat:
110
+ self.livetoken = self.login()
111
+
112
+ ref = vaultref(name)
113
+ base = self.addr.rstrip('/') + '/v1/' + self.mount
114
+ url = base + '/' + ref['path'] if 1 == self.kv else base + '/data/' + ref['path']
115
+
116
+ headers = self.baseheaders()
117
+ headers['X-Vault-Token'] = self.livetoken
118
+
119
+ status, body = fetchjson('GET', url, headers)
120
+
121
+ if 404 == status:
122
+ return None
123
+
124
+ if 200 != status:
125
+ raise SekretoError('sekreto: hashicorp error: ' + str(status) + ': ' + url)
126
+
127
+ if 1 == self.kv:
128
+ data = (body or {}).get('data')
129
+ else:
130
+ data = ((body or {}).get('data') or {}).get('data')
131
+
132
+ value = data.get(ref['field']) if isinstance(data, dict) else None
133
+
134
+ return None if value is None else str(value)
135
+
136
+ def describe(self):
137
+ return 'hashicorp:' + self.addr + '/' + self.mount
138
+
139
+
140
+ def _make(spec):
141
+ return HashicorpProvider(
142
+ spec.get('addr') or '',
143
+ spec.get('token') or '',
144
+ spec.get('mount'),
145
+ spec.get('kv'),
146
+ spec.get('vaultnamespace'),
147
+ spec.get('auth'),
148
+ )
149
+
150
+
151
+ # The plugin: the `hashicorp` provider kind, as a voxgig/plugin definition.
152
+ hashicorp = providerplugin('hashicorp', _make)
@@ -0,0 +1,115 @@
1
+ # VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/httpjson.py)
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 HTTP half of every plugin that speaks to a store over the wire, in
5
+ # one place and OUTSIDE the core: a chain of built-ins never imports this
6
+ # module. One JSON round-trip, bounded in time and in size, refusing
7
+ # redirects and ignoring proxies; and the small helpers every store client
8
+ # needs. A port of typescript/plugins/httpjson.ts.
9
+
10
+ import json
11
+ import urllib.error
12
+ import urllib.parse
13
+ import urllib.request
14
+
15
+ from ..sekreto import SekretoError
16
+
17
+
18
+ # How long any single vault round-trip may take before it is treated as
19
+ # unreachable, in seconds. Ports carry the same bound.
20
+ _HTTP_TIMEOUT = 10
21
+
22
+ # How much of a response body will be read before the store is treated as
23
+ # having answered incoherently. Ports carry the same bound.
24
+ #
25
+ # Far above anything real - the largest legitimate payload this library
26
+ # fetches is Doppler's whole-config download, measured in kilobytes. A bound
27
+ # is needed because the TIMEOUT is not one: ten seconds on a loopback or
28
+ # datacentre link is gigabytes, and the body is accumulated in memory before
29
+ # it is parsed. This runs on an application's startup path, so the failure is
30
+ # the application never starting.
31
+ _HTTP_MAXBODY = 8 * 1024 * 1024
32
+
33
+
34
+ class _NoRedirect(urllib.request.HTTPRedirectHandler):
35
+ """A redirect handler that refuses to follow: a vault API never
36
+ legitimately redirects, and following one would resend the vault token
37
+ to the redirect's host."""
38
+
39
+ def redirect_request(self, *args, **kwargs):
40
+ return None
41
+
42
+
43
+ # A secrets client dials the address it was configured with and nowhere
44
+ # else. urllib installs a ProxyHandler from the environment by default, and
45
+ # its proxy resolution does NOT exempt loopback - so with http_proxy set,
46
+ # `X-Vault-Token` for a local dev vault went, in the clear, to whatever that
47
+ # variable named. checkaddr permits plaintext to loopback precisely because
48
+ # nothing leaves the machine; an environment variable it cannot see must not
49
+ # be able to make that false. An empty ProxyHandler turns the whole
50
+ # mechanism off.
51
+ _opener = urllib.request.build_opener(_NoRedirect, urllib.request.ProxyHandler({}))
52
+
53
+
54
+ def fetchjson(method, url, headers, body=None):
55
+ """One JSON round-trip, returning (status, parsed-json-or-None).
56
+
57
+ A 404 is a normal answer here, not an exception: callers decide on
58
+ status. Network failure is always an error - an unreachable store is a
59
+ store that could not answer.
60
+ """
61
+ data = None if body is None else body.encode('utf8')
62
+ request = urllib.request.Request(url, data=data, headers=headers, method=method)
63
+
64
+ try:
65
+ # No redirects (a followed one carries X-Vault-Token to the target,
66
+ # which checkaddr cannot see) and a bounded wait (an accepted-but-
67
+ # silent endpoint must not hang the caller forever). A 3xx surfaces
68
+ # as an HTTPError below and is treated as a store error.
69
+ with _opener.open(request, timeout=_HTTP_TIMEOUT) as response:
70
+ status = response.status
71
+ raw = response.read(_HTTP_MAXBODY + 1)
72
+ except urllib.error.HTTPError as err:
73
+ status = err.code
74
+ raw = err.read(_HTTP_MAXBODY + 1)
75
+ except urllib.error.URLError as err:
76
+ raise SekretoError(
77
+ 'sekreto: cannot reach ' + url.split('?')[0] + ': ' + str(err.reason)
78
+ )
79
+
80
+ # One byte over the bound is enough to know it was exceeded. An endless
81
+ # body is a store that could not answer, so this raises rather than
82
+ # returning a miss - the latter would fall through to a weaker store on
83
+ # an attacker's cue.
84
+ if _HTTP_MAXBODY < len(raw):
85
+ raise SekretoError('sekreto: oversized response from ' + url.split('?')[0])
86
+
87
+ text = raw.decode('utf8', 'replace')
88
+
89
+ try:
90
+ return status, json.loads(text)
91
+ except ValueError:
92
+ # A success status promised JSON; a body that does not parse means
93
+ # the store could not answer coherently, and treating it as a miss
94
+ # would fall through to a weaker store. Error statuses may carry
95
+ # any body - they are decided on status alone.
96
+ if 200 == status:
97
+ raise SekretoError('sekreto: malformed response from ' + url.split('?')[0])
98
+ return status, None
99
+
100
+
101
+ def urlpart(text):
102
+ """One URL component, escaped the way encodeURIComponent does it -
103
+ the addresses built here must match the canonical port's byte for
104
+ byte."""
105
+ return urllib.parse.quote(str(text), safe="-_.!~*'()")
106
+
107
+
108
+ def tonumber(value):
109
+ """The canonical port's Number() as expiry fields need it: a number
110
+ or numeric string converts (expires_in may arrive as a string);
111
+ anything else becomes 0, which means "never renew"."""
112
+ try:
113
+ return float(value)
114
+ except (TypeError, ValueError):
115
+ return 0
@@ -0,0 +1,92 @@
1
+ # VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/infisical.py)
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 infisical plugin: Infisical. Needs HTTPS. A port of
5
+ # typescript/plugins/infisical.ts.
6
+ import json
7
+ import time
8
+
9
+ from ..addr import checkaddr
10
+ from ..sekreto import SekretoError, envkey
11
+ from ..providers import Provider, providerplugin
12
+ from .httpjson import fetchjson, tonumber, urlpart
13
+
14
+
15
+ class InfisicalProvider(Provider):
16
+ """Infisical.
17
+
18
+ `api.token` reads the secret keyed `API_TOKEN` (Infisical's own
19
+ convention is environment-style keys) at a secret path in one
20
+ environment of a project. Auth is a token, or a universal-auth
21
+ (machine identity) login with clientid/clientsecret.
22
+ """
23
+
24
+ def __init__(self, options=None):
25
+ self.opts = options or {}
26
+
27
+ # A configured token is kept forever; a universal-auth token carries
28
+ # expiresIn and is renewed shortly before it runs out.
29
+ self.livetoken = None
30
+ self.renewat = float('inf')
31
+
32
+ def login(self, addr):
33
+ if self.opts.get('token'):
34
+ return self.opts['token']
35
+
36
+ if not self.opts.get('clientid') or not self.opts.get('clientsecret'):
37
+ raise SekretoError('sekreto: infisical: no token and no client credentials')
38
+
39
+ status, body = fetchjson(
40
+ 'POST',
41
+ addr + '/api/v1/auth/universal-auth/login',
42
+ {'content-type': 'application/json'},
43
+ json.dumps(
44
+ {'clientId': self.opts['clientid'], 'clientSecret': self.opts['clientsecret']},
45
+ separators=(',', ':'),
46
+ ),
47
+ )
48
+
49
+ got = (body or {}).get('accessToken')
50
+ if 200 != status or not got:
51
+ raise SekretoError('sekreto: infisical login failed: ' + str(status))
52
+
53
+ expires = tonumber((body or {}).get('expiresIn'))
54
+ self.renewat = time.time() + max(expires - 60, 1) if 0 < expires else float('inf')
55
+
56
+ return str(got)
57
+
58
+ def lookup(self, name):
59
+ addr = (self.opts.get('addr') or 'https://app.infisical.com').rstrip('/')
60
+ checkaddr(addr)
61
+
62
+ project = self.opts.get('project') or ''
63
+ environment = self.opts.get('environment') or ''
64
+ if '' == project or '' == environment:
65
+ raise SekretoError('sekreto: infisical: no project/environment')
66
+
67
+ if self.livetoken is None or time.time() >= self.renewat:
68
+ self.livetoken = self.login(addr)
69
+
70
+ url = (addr + '/api/v3/secrets/raw/' + envkey(name)
71
+ + '?workspaceId=' + urlpart(project)
72
+ + '&environment=' + urlpart(environment)
73
+ + '&secretPath=' + urlpart(self.opts.get('path') or '/'))
74
+
75
+ status, body = fetchjson('GET', url, {'authorization': 'Bearer ' + self.livetoken})
76
+
77
+ if 404 == status:
78
+ return None
79
+
80
+ if 200 != status:
81
+ raise SekretoError('sekreto: infisical error: ' + str(status))
82
+
83
+ value = ((body or {}).get('secret') or {}).get('secretValue')
84
+ return None if value is None else str(value)
85
+
86
+ def describe(self):
87
+ return ('infisical:' + (self.opts.get('project') or '')
88
+ + '/' + (self.opts.get('environment') or ''))
89
+
90
+
91
+ # The plugin: the `infisical` provider kind, as a voxgig/plugin definition.
92
+ infisical = providerplugin('infisical', InfisicalProvider)
@@ -0,0 +1,101 @@
1
+ # VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/onepassword.py)
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 onepassword plugin: 1Password, through a Connect server. Needs
5
+ # HTTPS. A port of typescript/plugins/onepassword.ts.
6
+ from ..addr import checkaddr
7
+ from ..sekreto import SekretoError, checkname
8
+ from ..providers import Provider, providerplugin
9
+ from .httpjson import fetchjson, urlpart
10
+
11
+
12
+ class OnepasswordProvider(Provider):
13
+ """1Password, through a Connect server.
14
+
15
+ The item titled `api.token` (titles keep their dots), in the named
16
+ vault. The value is the field with purpose PASSWORD, or the field
17
+ labelled `value`. A vault that cannot be found is an error - config
18
+ names it, so its absence is a broken store, not a missing secret.
19
+ """
20
+
21
+ def __init__(self, options=None):
22
+ self.opts = options or {}
23
+ self.vaultid = None
24
+
25
+ def authheaders(self):
26
+ return {'authorization': 'Bearer ' + (self.opts.get('token') or '')}
27
+
28
+ def resolvevault(self, addr):
29
+ want = self.opts.get('vault') or ''
30
+ if '' == want:
31
+ raise SekretoError('sekreto: onepassword: no vault')
32
+
33
+ status, body = fetchjson('GET', addr + '/v1/vaults', self.authheaders())
34
+
35
+ if 200 != status or not isinstance(body, list):
36
+ raise SekretoError(
37
+ 'sekreto: onepassword error: ' + str(status) + ': listing vaults'
38
+ )
39
+
40
+ for entry in body:
41
+ if isinstance(entry, dict) and (want == entry.get('id') or want == entry.get('name')):
42
+ return str(entry.get('id'))
43
+
44
+ raise SekretoError('sekreto: onepassword: no vault named ' + want)
45
+
46
+ def lookup(self, name):
47
+ checkname(name)
48
+
49
+ addr = (self.opts.get('addr') or '').rstrip('/')
50
+ if '' == addr:
51
+ raise SekretoError('sekreto: onepassword: no addr')
52
+ checkaddr(addr)
53
+
54
+ if self.vaultid is None:
55
+ self.vaultid = self.resolvevault(addr)
56
+
57
+ filterpart = urlpart('title eq "' + name + '"')
58
+ status, found = fetchjson(
59
+ 'GET',
60
+ addr + '/v1/vaults/' + self.vaultid + '/items?filter=' + filterpart,
61
+ self.authheaders(),
62
+ )
63
+
64
+ if 200 != status or not isinstance(found, list):
65
+ raise SekretoError(
66
+ 'sekreto: onepassword error: ' + str(status) + ': finding ' + name
67
+ )
68
+
69
+ if 0 == len(found):
70
+ return None
71
+
72
+ status, item = fetchjson(
73
+ 'GET',
74
+ addr + '/v1/vaults/' + self.vaultid + '/items/' + str(found[0].get('id')),
75
+ self.authheaders(),
76
+ )
77
+
78
+ if 200 != status:
79
+ raise SekretoError(
80
+ 'sekreto: onepassword error: ' + str(status) + ': reading ' + name
81
+ )
82
+
83
+ fields = (item or {}).get('fields') or []
84
+
85
+ for field in fields:
86
+ if isinstance(field, dict) and 'PASSWORD' == field.get('purpose'):
87
+ value = field.get('value')
88
+ return None if value is None else str(value)
89
+ for field in fields:
90
+ if isinstance(field, dict) and 'value' == field.get('label'):
91
+ value = field.get('value')
92
+ return None if value is None else str(value)
93
+
94
+ return None
95
+
96
+ def describe(self):
97
+ return 'onepassword:' + (self.opts.get('vault') or '')
98
+
99
+
100
+ # The plugin: the `onepassword` provider kind, as a voxgig/plugin definition.
101
+ onepassword = providerplugin('onepassword', OnepasswordProvider)