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