@voxgig/sdkgen 4.8.3 → 4.10.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/helpers/manifest.d.ts +2 -1
- package/dist/helpers/manifest.js +75 -1
- package/dist/helpers/manifest.js.map +1 -1
- package/dist/helpers/modelNames.d.ts +7 -0
- package/dist/helpers/modelNames.js +232 -0
- package/dist/helpers/modelNames.js.map +1 -0
- package/dist/helpers/naming.d.ts +2 -1
- package/dist/helpers/naming.js +45 -1
- package/dist/helpers/naming.js.map +1 -1
- package/dist/sdkgen.d.ts +3 -2
- package/dist/sdkgen.js +12 -3
- package/dist/sdkgen.js.map +1 -1
- package/dist/testkit.d.ts +2 -0
- package/dist/testkit.js +80 -24
- package/dist/testkit.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utility.js +17 -7
- package/dist/utility.js.map +1 -1
- package/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +671 -0
- package/project/.sdk/model/target/clojure.aon +10 -0
- package/project/.sdk/model/target/csharp.aon +5 -0
- package/project/.sdk/model/target/elixir.aon +6 -0
- package/project/.sdk/model/target/java.aon +5 -0
- package/project/.sdk/model/target/js.aon +5 -0
- package/project/.sdk/model/target/kotlin.aon +7 -0
- package/project/.sdk/model/target/perl.aon +5 -0
- package/project/.sdk/model/target/php.aon +5 -0
- package/project/.sdk/model/target/rb.aon +5 -0
- package/project/.sdk/model/target/rust.aon +5 -0
- package/project/.sdk/model/target/scala.aon +38 -2
- package/project/.sdk/model/target/swift.aon +10 -0
- package/project/.sdk/model/target/zig.aon +9 -0
- package/project/.sdk/src/cmp/clojure/Config_clojure.ts +51 -4
- package/project/.sdk/src/cmp/clojure/Main_clojure.ts +43 -1
- package/project/.sdk/src/cmp/clojure/Package_clojure.ts +17 -1
- package/project/.sdk/src/cmp/clojure/featureextra_clojure.ts +130 -0
- package/project/.sdk/src/cmp/csharp/Config_csharp.ts +70 -0
- package/project/.sdk/src/cmp/csharp/Main_csharp.ts +9 -1
- package/project/.sdk/src/cmp/csharp/Package_csharp.ts +25 -1
- package/project/.sdk/src/cmp/elixir/Config_elixir.ts +68 -2
- package/project/.sdk/src/cmp/elixir/Main_elixir.ts +16 -0
- package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +14 -1
- package/project/.sdk/src/cmp/java/Config_java.ts +84 -2
- package/project/.sdk/src/cmp/java/Main_java.ts +10 -1
- package/project/.sdk/src/cmp/js/Config_js.ts +75 -8
- package/project/.sdk/src/cmp/js/Main_js.ts +66 -2
- package/project/.sdk/src/cmp/js/fragment/Config.data.fragment.js +18 -1
- package/project/.sdk/src/cmp/js/fragment/Config.fragment.js +18 -1
- package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +7 -0
- package/project/.sdk/src/cmp/kotlin/Config_kotlin.ts +63 -1
- package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +32 -2
- package/project/.sdk/src/cmp/perl/Config_perl.ts +129 -3
- package/project/.sdk/src/cmp/perl/Main_perl.ts +41 -1
- package/project/.sdk/src/cmp/perl/Package_perl.ts +13 -1
- package/project/.sdk/src/cmp/perl/fragment/Main.fragment.pm +1 -0
- package/project/.sdk/src/cmp/php/Config_php.ts +105 -1
- package/project/.sdk/src/cmp/php/Gitignore_php.ts +4 -2
- package/project/.sdk/src/cmp/php/Main_php.ts +16 -1
- package/project/.sdk/src/cmp/rb/Config_rb.ts +92 -2
- package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +11 -1
- package/project/.sdk/src/cmp/rb/Main_rb.ts +7 -1
- package/project/.sdk/src/cmp/rust/Main_rust.ts +99 -1
- package/project/.sdk/src/cmp/rust/Package_rust.ts +72 -6
- package/project/.sdk/src/cmp/scala/Config_scala.ts +44 -0
- package/project/.sdk/src/cmp/scala/Main_scala.ts +68 -1
- package/project/.sdk/src/cmp/swift/Config_swift.ts +62 -1
- package/project/.sdk/src/cmp/swift/Main_swift.ts +35 -1
- package/project/.sdk/src/cmp/swift/Package_swift.ts +81 -11
- package/project/.sdk/src/cmp/swift/fragment/Main.fragment.swift +58 -44
- package/project/.sdk/src/cmp/swift/utility_swift.ts +22 -0
- 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/tests/vendor/omni/json.c +2 -2
- package/project/.sdk/tm/c/tests/vendor/omni/omni.h +2 -2
- package/project/.sdk/tm/c/tests/vendor/omni/runner.c +2 -2
- package/project/.sdk/tm/c/tests/vendor/omni/util.c +2 -2
- package/project/.sdk/tm/clojure/Makefile +3 -0
- package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +503 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/capability.clj +84 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/catalog.clj +44 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/config.clj +240 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/depend.clj +199 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/env.clj +111 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/export.clj +46 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/graph.clj +122 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/host.clj +1018 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/json.clj +106 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/order.clj +157 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/point.clj +77 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/ref.clj +92 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/resolve.clj +46 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/types.clj +177 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/version.clj +90 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin.clj +40 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/addr.clj +111 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/chain.clj +297 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/core.clj +192 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/json.clj +261 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/aws.clj +165 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/azuresecrets.clj +111 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/boru.clj +107 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/doppler.clj +61 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/gcpsecrets.clj +88 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/hashicorp.clj +115 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/httpjson.clj +214 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/infisical.clj +80 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/onepassword.clj +93 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/proc.clj +63 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/secretspec.clj +99 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/sigv4.clj +142 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/provider.clj +25 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/providers.clj +196 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto.clj +113 -0
- package/project/.sdk/tm/clojure/src/sdk/core.clj +9 -0
- package/project/.sdk/tm/clojure/src/sdk/features.clj +13 -1
- package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +547 -0
- package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +103 -14
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +2 -2
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +2 -2
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +2 -2
- package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +2 -2
- package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +2 -2
- package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +2 -2
- package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +889 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Capability.cs +196 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Catalog.cs +70 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Config.cs +505 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Definition.cs +52 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Depend.cs +285 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Entry.cs +55 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Env.cs +228 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Export.cs +102 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Graph.cs +256 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Host.cs +1379 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Inst.cs +177 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Json.cs +326 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Order.cs +295 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Plugin.cs +113 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Point.cs +177 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Refs.cs +198 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Resolve.cs +95 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Types.cs +351 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Version.cs +196 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Aws.cs +325 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/AzureSecrets.cs +195 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Boru.cs +192 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Child.cs +75 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Doppler.cs +112 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/GcpSecrets.cs +167 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Hashicorp.cs +221 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/HttpJson.cs +213 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Infisical.cs +155 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/OnePassword.cs +169 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/SecretSpec.cs +172 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Sigv4.cs +240 -0
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Json.cs +192 -0
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Providers.cs +503 -0
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Sekreto.cs +775 -0
- package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +1702 -0
- package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +2 -2
- package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +2 -2
- package/project/.sdk/tm/csharp/utility/MakeOptions.cs +10 -0
- package/project/.sdk/tm/csharp/utility/struct/Struct.cs +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/capability.ex +118 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/catalog.ex +56 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/config.ex +320 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/depend.ex +205 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/env.ex +166 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/error.ex +13 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/export.ex +73 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/graph.ex +185 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/host.ex +1182 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/inst.ex +139 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/json.ex +132 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/order.ex +179 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/point.ex +99 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/ref.ex +129 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/resolve.ex +59 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/types.ex +190 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/version.ex +136 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/voxgig_plugin.ex +42 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/json.ex +368 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/aws.ex +257 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/azuresecrets.ex +160 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/boru.ex +127 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/doppler.ex +96 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/gcpsecrets.ex +124 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/hashicorp.ex +162 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/http.ex +627 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/httpjson.ex +134 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/infisical.ex +125 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/onepassword.ex +152 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/proc.ex +80 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/secretspec.ex +101 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/sigv4.ex +176 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/provider.ex +67 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/providers.ex +536 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/sekreto.ex +662 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +824 -0
- package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +1072 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +2 -2
- package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +2 -2
- package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/config.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/env.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/export.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/order.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/point.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/types.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/util.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/version.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +4 -4
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +4 -5
- package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +3 -3
- package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +3 -4
- package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +5 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +31 -2
- package/project/.sdk/tm/go/feature/secrets_feature.go +16 -0
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +123 -0
- package/project/.sdk/tm/go/test/omni/omni.go +8 -3
- package/project/.sdk/tm/go/test/omni/util.go +25 -4
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +1 -1
- package/project/.sdk/tm/java/feature/SecretsFeature.java +766 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Capability.java +181 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Catalog.java +64 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Config.java +433 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Definition.java +54 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Depend.java +292 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Entry.java +49 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Env.java +204 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Export.java +93 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Graph.java +244 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Host.java +1196 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Inst.java +173 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Json.java +339 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Order.java +274 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Plugin.java +94 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/PluginException.java +37 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Point.java +172 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Refs.java +171 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Resolve.java +89 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Types.java +232 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Version.java +198 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Addr.java +142 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Builtins.java +229 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Json.java +302 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Provider.java +21 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Sekreto.java +698 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Support.java +100 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Aws.java +294 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Azuresecrets.java +164 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Boru.java +161 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Doppler.java +103 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Gcpsecrets.java +143 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Hashicorp.java +186 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Httpjson.java +192 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Infisical.java +139 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Onepassword.java +143 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Proc.java +80 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Secretspec.java +138 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Sigv4.java +243 -0
- package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +986 -0
- package/project/.sdk/tm/java/test/vendor/omni/Json.java +2 -2
- package/project/.sdk/tm/java/test/vendor/omni/Runner.java +2 -2
- package/project/.sdk/tm/java/test/vendor/omni/Util.java +2 -2
- package/project/.sdk/tm/java/utility/MakeOptions.java +7 -0
- package/project/.sdk/tm/java/utility/struct/Struct.java +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +431 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/capability.js +119 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/catalog.js +42 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/config.js +323 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/depend.js +196 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/env.js +120 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/export.js +48 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/graph.js +150 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/host.js +949 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/index.js +35 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/order.js +165 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/point.js +94 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/ref.js +106 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/resolve.js +59 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/types.js +79 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/version.js +100 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/Sekreto.js +574 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/index.js +56 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/aws.js +188 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/azuresecrets.js +135 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/boru.js +128 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/doppler.js +67 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/gcpsecrets.js +115 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/hashicorp.js +139 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/httpjson.js +93 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/infisical.js +99 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/onepassword.js +111 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/secretspec.js +105 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/sigv4.js +157 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/addr.js +119 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/builtin.js +39 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/dotenv.js +40 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/env.js +21 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/file.js +42 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/memory.js +18 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/support.js +151 -0
- package/project/.sdk/tm/js/src/utility/StructUtility.js +2 -2
- package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +946 -0
- package/project/.sdk/tm/js/test/vendor/omni/index.js +1 -1
- package/project/.sdk/tm/js/test/vendor/omni/runner.js +18 -3
- package/project/.sdk/tm/js/test/vendor/omni/util.js +25 -8
- package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +659 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Capability.kt +117 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Catalog.kt +40 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Config.kt +322 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Depend.kt +227 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Env.kt +163 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Export.kt +57 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Graph.kt +179 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Host.kt +1131 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Json.kt +241 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Order.kt +180 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Plugin.kt +64 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Point.kt +124 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Refs.kt +125 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Resolve.kt +66 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Types.kt +171 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Version.kt +132 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Json.kt +359 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Provider.kt +21 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Providers.kt +308 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Sekreto.kt +525 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Spec.kt +126 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Support.kt +205 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Aws.kt +251 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Azuresecrets.kt +145 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Boru.kt +130 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Doppler.kt +77 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Gcpsecrets.kt +119 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Hashicorp.kt +156 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Httpjson.kt +219 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Infisical.kt +114 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Onepassword.kt +114 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Secretspec.kt +118 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Sigv4.kt +220 -0
- package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +1148 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +2 -2
- package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +2 -2
- package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +2 -2
- package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +1 -1
- package/project/.sdk/tm/lua/test/vendor/omni/json.lua +2 -2
- package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +2 -2
- package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +2 -2
- package/project/.sdk/tm/lua/test/vendor/omni/util.lua +2 -2
- package/project/.sdk/tm/lua/utility/struct/regex.lua +1 -1
- package/project/.sdk/tm/lua/utility/struct/struct.lua +1 -1
- package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +2 -2
- package/project/.sdk/tm/perl/Makefile +6 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Capability.pm +141 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Catalog.pm +65 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Config.pm +346 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Depend.pm +216 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Env.pm +176 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Export.pm +59 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Graph.pm +157 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Host.pm +1139 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Order.pm +187 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Point.pm +100 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Ref.pm +119 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Resolve.pm +71 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Types.pm +251 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Version.pm +122 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin.pm +70 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Aws.pm +263 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Azuresecrets.pm +159 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Boru.pm +180 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Doppler.pm +92 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Gcpsecrets.pm +138 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm +213 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Httpjson.pm +173 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Infisical.pm +132 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Onepassword.pm +132 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Proc.pm +102 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Secretspec.pm +132 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Sigv4.pm +190 -0
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Addr.pm +124 -0
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Providers.pm +301 -0
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto.pm +605 -0
- package/project/.sdk/tm/perl/feature/secrets_feature.pm +675 -0
- package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +1 -1
- package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +957 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +1 -1
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +1 -1
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +1 -1
- package/project/.sdk/tm/php/feature/SecretsFeature.php +670 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Capability.php +226 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Catalog.php +75 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Config.php +444 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Depend.php +262 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Env.php +202 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Export.php +74 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Graph.php +195 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Host.php +1514 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Order.php +260 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Point.php +129 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Ref.php +169 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Resolve.php +79 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Types.php +348 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Version.php +163 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/plugin.php +40 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/aws.php +274 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/azuresecrets.php +170 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/boru.php +163 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/doppler.php +106 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/gcpsecrets.php +144 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/hashicorp.php +194 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/httpjson.php +113 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/infisical.php +131 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/onepassword.php +150 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/runcmd.php +101 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/secretspec.php +146 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/sigv4.php +161 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Addr.php +129 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Providers.php +322 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Sekreto.php +724 -0
- package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +1067 -0
- package/project/.sdk/tm/php/test/vendor/omni/Runner.php +2 -2
- package/project/.sdk/tm/php/test/vendor/omni/Util.php +2 -2
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +4 -2
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +3 -3
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +3 -4
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +4 -6
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +21 -1
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +1 -1
- package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +1 -1
- package/project/.sdk/tm/py/test/voxgig_omni/runner.py +16 -2
- package/project/.sdk/tm/py/test/voxgig_omni/util.py +27 -12
- package/project/.sdk/tm/rb/Makefile +7 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/capability.rb +118 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/catalog.rb +55 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/config.rb +315 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/depend.rb +197 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/env.rb +143 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/export.rb +52 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/graph.rb +147 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/host.rb +1079 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/order.rb +169 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/point.rb +93 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/ref.rb +112 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/resolve.rb +56 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/types.rb +99 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/version.rb +106 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin.rb +24 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/addr.rb +111 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/aws.rb +200 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/azuresecrets.rb +130 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/boru.rb +121 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/doppler.rb +66 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.rb +107 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/hashicorp.rb +137 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/httpjson.rb +136 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/infisical.rb +97 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/onepassword.rb +104 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/secretspec.rb +113 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/sigv4.rb +127 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/providers.rb +210 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/sekreto.rb +465 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto.rb +30 -0
- package/project/.sdk/tm/rb/feature/secrets_feature.rb +561 -0
- package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +842 -0
- package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +2 -2
- package/project/.sdk/tm/rb/test/vendor/omni/util.rb +2 -2
- package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/capability.rs +130 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/catalog.rs +114 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/config.rs +416 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/depend.rs +245 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/env.rs +200 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/export.rs +90 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/graph.rs +231 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/host.rs +1565 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/mod.rs +18 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/order.rs +226 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/point.rs +137 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/refs.rs +148 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/resolve.rs +83 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/types.rs +132 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/value.rs +433 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/version.rs +174 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws/crypto.rs +146 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws/sigv4.rs +230 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws.rs +328 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/azuresecrets.rs +184 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/boru.rs +172 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/doppler.rs +102 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/gcpsecrets.rs +153 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/hashicorp.rs +228 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/http.rs +537 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/json.rs +300 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson.rs +137 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/infisical.rs +148 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/onepassword.rs +165 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/secretspec.rs +150 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/addr.rs +144 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/mod.rs +51 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/providers.rs +637 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/sekreto.rs +677 -0
- package/project/.sdk/tm/rust/feature/secrets.rs +961 -0
- package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +1509 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +2 -2
- package/project/.sdk/tm/scala/Makefile +8 -3
- package/project/.sdk/tm/scala/feature/SecretsFeature.scala +556 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Capability.scala +96 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Config.scala +270 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Depend.scala +216 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Env.scala +144 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Export.scala +59 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Graph.scala +149 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Host.scala +1089 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Json.scala +156 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Order.scala +169 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Plugin.scala +47 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Point.scala +107 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Refs.scala +131 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Resolve.scala +53 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Types.scala +110 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Value.scala +157 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Version.scala +136 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Json.scala +302 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Provider.scala +20 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Providers.scala +281 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Sekreto.scala +473 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Spec.scala +123 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Support.scala +216 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Aws.scala +225 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Azuresecrets.scala +124 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Boru.scala +104 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Doppler.scala +68 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Gcpsecrets.scala +97 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Hashicorp.scala +131 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Httpjson.scala +209 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Infisical.scala +98 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Onepassword.scala +90 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Secretspec.scala +95 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Sigv4.scala +214 -0
- package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +971 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +2 -2
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +2 -2
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +2 -2
- package/project/.sdk/tm/scala/utility/Make.scala +7 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/SecretsFeature.swift +669 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Capability.swift +98 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Catalog.swift +87 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Config.swift +298 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Depend.swift +209 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Env.swift +191 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Export.swift +63 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Graph.swift +158 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Host.swift +1141 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Json.swift +192 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Order.swift +183 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Point.swift +130 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Refs.swift +141 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Resolve.swift +59 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Types.swift +125 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Value.swift +198 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Version.swift +139 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Aws.swift +271 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Azuresecrets.swift +173 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Boru.swift +139 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Crypto.swift +198 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Doppler.swift +86 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Gcpsecrets.swift +129 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Hashicorp.swift +175 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Httpjson.swift +310 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Infisical.swift +140 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Onepassword.swift +118 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Proc.swift +105 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Secretspec.swift +111 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Sigv4.swift +297 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Addr.swift +120 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Json.swift +452 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Provider.swift +25 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Providers.swift +689 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Sekreto.swift +755 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeOptions.swift +9 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +30 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/feature/secrets/SecretsFeatureTest.swift +1030 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +2 -2
- package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +2 -2
- package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +2 -2
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/aws.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/azuresecrets.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/boru.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/doppler.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/gcpsecrets.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/hashicorp.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/infisical.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/onepassword.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/sigv4.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +1 -1
- package/project/.sdk/tm/ts/src/utility/StructUtility.ts +2 -2
- package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +1 -1
- package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +1 -1
- package/project/.sdk/tm/ts/test/vendor/omni/index.ts +1 -1
- 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 +144 -154
- 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 -4
- package/src/helpers/manifest.ts +81 -1
- package/src/helpers/modelNames.ts +284 -0
- package/src/helpers/naming.ts +45 -1
- package/src/sdkgen.ts +11 -1
- package/src/testkit.ts +115 -26
- package/src/utility.ts +17 -7
- package/project/.sdk/model/target/dart.aon +0 -58
- package/project/.sdk/model/target/lean.aon +0 -91
- package/project/.sdk/model/target/seneca-provider.aon +0 -120
- package/project/.sdk/src/cmp/dart/Config_dart.ts +0 -176
- package/project/.sdk/src/cmp/dart/EntityBase_dart.ts +0 -34
- package/project/.sdk/src/cmp/dart/EntityOperation_dart.ts +0 -43
- package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +0 -207
- package/project/.sdk/src/cmp/dart/Entity_dart.ts +0 -87
- package/project/.sdk/src/cmp/dart/Gitignore_dart.ts +0 -34
- package/project/.sdk/src/cmp/dart/MainEntity_dart.ts +0 -33
- package/project/.sdk/src/cmp/dart/Main_dart.ts +0 -106
- package/project/.sdk/src/cmp/dart/Package_dart.ts +0 -82
- package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +0 -177
- package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +0 -238
- package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +0 -53
- package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +0 -152
- package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +0 -59
- package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +0 -65
- package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +0 -151
- package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +0 -63
- package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +0 -225
- package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +0 -397
- package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +0 -24
- package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +0 -106
- package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +0 -78
- package/project/.sdk/src/cmp/dart/SdkError_dart.ts +0 -42
- package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +0 -516
- package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +0 -628
- package/project/.sdk/src/cmp/dart/Test_dart.ts +0 -116
- package/project/.sdk/src/cmp/dart/fragment/Config.data.fragment.dart +0 -79
- package/project/.sdk/src/cmp/dart/fragment/Config.fragment.dart +0 -51
- package/project/.sdk/src/cmp/dart/fragment/Direct.test.fragment.dart +0 -25
- package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +0 -29
- package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +0 -28
- package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +0 -302
- package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +0 -98
- package/project/.sdk/src/cmp/dart/fragment/EntityListOp.fragment.dart +0 -90
- package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +0 -102
- package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +0 -108
- package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +0 -102
- package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +0 -338
- package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +0 -26
- package/project/.sdk/src/cmp/dart/tsconfig.json +0 -15
- package/project/.sdk/src/cmp/dart/utility_dart.ts +0 -155
- package/project/.sdk/src/cmp/lean/Config_lean.ts +0 -93
- package/project/.sdk/src/cmp/lean/Entity_lean.ts +0 -9
- package/project/.sdk/src/cmp/lean/Gitignore_lean.ts +0 -18
- package/project/.sdk/src/cmp/lean/Main_lean.ts +0 -120
- package/project/.sdk/src/cmp/lean/Package_lean.ts +0 -93
- package/project/.sdk/src/cmp/lean/ReadmeEntity_lean.ts +0 -29
- package/project/.sdk/src/cmp/lean/ReadmeExplanation_lean.ts +0 -19
- package/project/.sdk/src/cmp/lean/ReadmeHowto_lean.ts +0 -25
- package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +0 -39
- package/project/.sdk/src/cmp/lean/ReadmeIntro_lean.ts +0 -25
- package/project/.sdk/src/cmp/lean/ReadmeModel_lean.ts +0 -24
- package/project/.sdk/src/cmp/lean/ReadmeOptions_lean.ts +0 -22
- package/project/.sdk/src/cmp/lean/ReadmeQuick_lean.ts +0 -50
- package/project/.sdk/src/cmp/lean/ReadmeRef_lean.ts +0 -40
- package/project/.sdk/src/cmp/lean/ReadmeTopHowto_lean.ts +0 -16
- package/project/.sdk/src/cmp/lean/ReadmeTopQuick_lean.ts +0 -23
- package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +0 -19
- package/project/.sdk/src/cmp/lean/Test_lean.ts +0 -261
- package/project/.sdk/src/cmp/lean/utility_lean.ts +0 -129
- package/project/.sdk/src/cmp/seneca-provider/Extras_seneca-provider.ts +0 -4080
- package/project/.sdk/src/cmp/seneca-provider/Gitignore_seneca-provider.ts +0 -161
- package/project/.sdk/src/cmp/seneca-provider/Main_seneca-provider.ts +0 -1011
- package/project/.sdk/tm/dart/LICENSE +0 -22
- package/project/.sdk/tm/dart/Makefile +0 -50
- package/project/.sdk/tm/dart/lib/Context.dart +0 -150
- package/project/.sdk/tm/dart/lib/Control.dart +0 -15
- package/project/.sdk/tm/dart/lib/Operation.dart +0 -31
- package/project/.sdk/tm/dart/lib/Point.dart +0 -51
- package/project/.sdk/tm/dart/lib/Response.dart +0 -32
- package/project/.sdk/tm/dart/lib/Result.dart +0 -39
- package/project/.sdk/tm/dart/lib/Spec.dart +0 -49
- package/project/.sdk/tm/dart/lib/feature/audit/AuditFeature.dart +0 -103
- package/project/.sdk/tm/dart/lib/feature/base/BaseFeature.dart +0 -76
- package/project/.sdk/tm/dart/lib/feature/cache/CacheFeature.dart +0 -152
- package/project/.sdk/tm/dart/lib/feature/clienttrack/ClienttrackFeature.dart +0 -104
- package/project/.sdk/tm/dart/lib/feature/cost/CostFeature.dart +0 -446
- package/project/.sdk/tm/dart/lib/feature/debug/DebugFeature.dart +0 -153
- package/project/.sdk/tm/dart/lib/feature/idempotency/IdempotencyFeature.dart +0 -92
- package/project/.sdk/tm/dart/lib/feature/log/LogFeature.dart +0 -85
- package/project/.sdk/tm/dart/lib/feature/metrics/MetricsFeature.dart +0 -103
- package/project/.sdk/tm/dart/lib/feature/netsim/NetsimFeature.dart +0 -186
- package/project/.sdk/tm/dart/lib/feature/paging/PagingFeature.dart +0 -240
- package/project/.sdk/tm/dart/lib/feature/proxy/ProxyFeature.dart +0 -118
- package/project/.sdk/tm/dart/lib/feature/ratelimit/RatelimitFeature.dart +0 -103
- package/project/.sdk/tm/dart/lib/feature/rbac/RbacFeature.dart +0 -121
- package/project/.sdk/tm/dart/lib/feature/retry/RetryFeature.dart +0 -155
- package/project/.sdk/tm/dart/lib/feature/streaming/StreamingFeature.dart +0 -97
- package/project/.sdk/tm/dart/lib/feature/telemetry/TelemetryFeature.dart +0 -136
- package/project/.sdk/tm/dart/lib/feature/test/TestFeature.dart +0 -328
- package/project/.sdk/tm/dart/lib/feature/timeout/TimeoutFeature.dart +0 -104
- package/project/.sdk/tm/dart/lib/utility/CleanUtility.dart +0 -12
- package/project/.sdk/tm/dart/lib/utility/DoneUtility.dart +0 -18
- package/project/.sdk/tm/dart/lib/utility/ErrUtility.dart +0 -46
- package/project/.sdk/tm/dart/lib/utility/FeatureAddUtility.dart +0 -35
- package/project/.sdk/tm/dart/lib/utility/FeatureHookUtility.dart +0 -20
- package/project/.sdk/tm/dart/lib/utility/FeatureInitUtility.dart +0 -9
- package/project/.sdk/tm/dart/lib/utility/FetcherUtility.dart +0 -104
- package/project/.sdk/tm/dart/lib/utility/GraphqlUtility.dart +0 -162
- package/project/.sdk/tm/dart/lib/utility/MakeContextUtility.dart +0 -6
- package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +0 -71
- package/project/.sdk/tm/dart/lib/utility/MakeFetchDefUtility.dart +0 -42
- package/project/.sdk/tm/dart/lib/utility/MakeOptionsUtility.dart +0 -233
- package/project/.sdk/tm/dart/lib/utility/MakePointUtility.dart +0 -130
- package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +0 -66
- package/project/.sdk/tm/dart/lib/utility/MakeResponseUtility.dart +0 -59
- package/project/.sdk/tm/dart/lib/utility/MakeResultUtility.dart +0 -49
- package/project/.sdk/tm/dart/lib/utility/MakeSpecUtility.dart +0 -77
- package/project/.sdk/tm/dart/lib/utility/MakeUrlUtility.dart +0 -51
- package/project/.sdk/tm/dart/lib/utility/ParamUtility.dart +0 -56
- package/project/.sdk/tm/dart/lib/utility/PrepareAuthUtility.dart +0 -46
- package/project/.sdk/tm/dart/lib/utility/PrepareBodyUtility.dart +0 -19
- package/project/.sdk/tm/dart/lib/utility/PrepareHeadersUtility.dart +0 -11
- package/project/.sdk/tm/dart/lib/utility/PrepareMethodUtility.dart +0 -30
- package/project/.sdk/tm/dart/lib/utility/PrepareParamsUtility.dart +0 -23
- package/project/.sdk/tm/dart/lib/utility/PreparePathUtility.dart +0 -9
- package/project/.sdk/tm/dart/lib/utility/PrepareQueryUtility.dart +0 -18
- package/project/.sdk/tm/dart/lib/utility/ResultBasicUtility.dart +0 -29
- package/project/.sdk/tm/dart/lib/utility/ResultBodyUtility.dart +0 -15
- package/project/.sdk/tm/dart/lib/utility/ResultHeadersUtility.dart +0 -18
- package/project/.sdk/tm/dart/lib/utility/StructUtility.dart +0 -127
- package/project/.sdk/tm/dart/lib/utility/TransformRequestUtility.dart +0 -28
- package/project/.sdk/tm/dart/lib/utility/TransformResponseUtility.dart +0 -44
- package/project/.sdk/tm/dart/lib/utility/Utility.dart +0 -239
- package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +0 -2462
- package/project/.sdk/tm/dart/src/feature/README.md +0 -3
- package/project/.sdk/tm/dart/src/feature/proxy/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/ratelimit/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/rbac/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/retry/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/streaming/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/telemetry/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/test/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/timeout/.gitkeep +0 -0
- package/project/.sdk/tm/dart/test/custom_test.dart +0 -65
- package/project/.sdk/tm/dart/test/exists_test.dart +0 -12
- package/project/.sdk/tm/dart/test/feature/harness.dart +0 -329
- package/project/.sdk/tm/dart/test/feature_test.dart +0 -1193
- package/project/.sdk/tm/dart/test/harness.dart +0 -153
- package/project/.sdk/tm/dart/test/netsim_test.dart +0 -48
- package/project/.sdk/tm/dart/test/omni.dart +0 -520
- package/project/.sdk/tm/dart/test/omni_smoke_test.dart +0 -143
- package/project/.sdk/tm/dart/test/pipeline_test.dart +0 -608
- package/project/.sdk/tm/dart/test/primary_test.dart +0 -476
- package/project/.sdk/tm/dart/test/sdk-test-control.json +0 -19
- package/project/.sdk/tm/dart/test/struct_test.dart +0 -468
- package/project/.sdk/tm/dart/test/utility.dart +0 -198
- package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +0 -7
- package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +0 -653
- package/project/.sdk/tm/dart/test/vendor/omni/util.dart +0 -232
- package/project/.sdk/tm/lean/LICENSE +0 -21
- package/project/.sdk/tm/lean/Makefile +0 -32
- package/project/.sdk/tm/lean/VERSION +0 -1
- package/project/.sdk/tm/lean/src/SdkFeature.lean +0 -171
- package/project/.sdk/tm/lean/src/SdkFeatures.lean +0 -787
- package/project/.sdk/tm/lean/src/SdkJson.lean +0 -134
- package/project/.sdk/tm/lean/src/SdkRuntime.lean +0 -374
- package/project/.sdk/tm/lean/src/SdkUtility.lean +0 -809
- package/project/.sdk/tm/lean/src/VoxgigStruct.lean +0 -2880
- package/project/.sdk/tm/lean/src/Vregex.lean +0 -412
- package/project/.sdk/tm/lean/src/feature/README.md +0 -5
- package/project/.sdk/tm/lean/src/feature/audit/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/base/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/cache/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/clienttrack/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/cost/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/debug/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/idempotency/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/log/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/metrics/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/netsim/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/paging/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/proxy/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/ratelimit/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/rbac/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/retry/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/streaming/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/telemetry/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/test/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/timeout/.gitkeep +0 -0
- package/project/.sdk/tm/lean/test/OmniResolver.lean +0 -358
- package/project/.sdk/tm/lean/test/OmniSmoke.lean +0 -174
- package/project/.sdk/tm/lean/test/StructCorpus.lean +0 -368
- package/project/.sdk/tm/lean/test/TFeature.lean +0 -281
- package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +0 -227
- package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +0 -997
- package/project/.sdk/tm/seneca-provider/CODE_OF_CONDUCT.md +0 -132
- package/project/.sdk/tm/seneca-provider/LICENSE +0 -21
- package/project/.sdk/tm/seneca-provider/Makefile +0 -15
- package/project/.sdk/tm/seneca-provider/src/tsconfig.json +0 -18
- package/project/.sdk/tm/seneca-provider/test/tsconfig.json +0 -16
- package/project/.sdk/tm/seneca-provider/tsfmt.json +0 -3
- package/project/.sdk/tm/zig/test/struct_runner.zig +0 -465
- /package/project/.sdk/tm/{dart/src/feature/audit → clojure/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/base → csharp/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/cache → elixir/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/clienttrack → java/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/cost → kotlin/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/debug → perl/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/idempotency → php/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/log → rb/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/metrics → rust/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/netsim → scala/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/paging → swift/src/feature/secrets}/.gitkeep +0 -0
|
@@ -0,0 +1,957 @@
|
|
|
1
|
+
#!perl
|
|
2
|
+
# ProjectName SDK secrets feature test
|
|
3
|
+
#
|
|
4
|
+
# Behavioural tests for the secrets feature (vendored @voxgig/sekreto).
|
|
5
|
+
#
|
|
6
|
+
# The contract under test: the `apikey` OPTION keeps its exact old meaning
|
|
7
|
+
# and always wins, because the feature places it FIRST in the provider
|
|
8
|
+
# chain (a `memory` store named `options`) - explicit-beats-lookup falls
|
|
9
|
+
# out of sekreto's first-hit rule rather than from special-case logic.
|
|
10
|
+
# With the feature inactive nothing changes at all. With it active and the
|
|
11
|
+
# option unset, the chain (env, dotenv, a custom provider, a vault)
|
|
12
|
+
# supplies the credential instead.
|
|
13
|
+
#
|
|
14
|
+
# EVERY ASSERTION IS MADE ON THE WIRE, not on the harness.
|
|
15
|
+
#
|
|
16
|
+
# This port resolves at the TRANSPORT SEAM (feature/secrets_feature.pm),
|
|
17
|
+
# so the credential is not visible in prepare()'s fetchdef and there is no
|
|
18
|
+
# useful in-process proxy for "a request went out". Each client below is
|
|
19
|
+
# therefore a LIVE one whose `system.fetch` is the counter - the real
|
|
20
|
+
# transport the SDK reaches through utility/fetcher.pm - and never
|
|
21
|
+
# ProjectNameSDK->test, whose test feature REPLACES that transport with an
|
|
22
|
+
# in-memory mock. Under the mock, "no request was sent" holds for a
|
|
23
|
+
# healthy SDK carrying no secrets feature at all, so the assertion would
|
|
24
|
+
# pin nothing.
|
|
25
|
+
#
|
|
26
|
+
# For the same reason every fail-closed case carries a CONTROL leg: the
|
|
27
|
+
# same construction with a WORKING provider must reach the same transport
|
|
28
|
+
# exactly once, carrying the credential. Only then does a zero from the
|
|
29
|
+
# broken provider mean REFUSED rather than UNWIRED.
|
|
30
|
+
#
|
|
31
|
+
# This file lives in a `feature/` container on purpose: `target add` trims
|
|
32
|
+
# it, along with the feature source and the vendored library, for a
|
|
33
|
+
# project whose model does not select `secrets`.
|
|
34
|
+
|
|
35
|
+
use strict;
|
|
36
|
+
use warnings;
|
|
37
|
+
use Test::More;
|
|
38
|
+
use FindBin;
|
|
39
|
+
use lib "$FindBin::Bin/../../../lib";
|
|
40
|
+
use Scalar::Util ();
|
|
41
|
+
|
|
42
|
+
use ProjectNameSDK;
|
|
43
|
+
|
|
44
|
+
my $ENVPREFIX = 'PROJECTENV_TEST_SECRETS_';
|
|
45
|
+
|
|
46
|
+
my $RAWBASE = 'http://raw.test/api';
|
|
47
|
+
my $XBASE = 'http://exchange.test/api';
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
# --- Harness ---------------------------------------------------------------
|
|
51
|
+
|
|
52
|
+
# A transport that records every call it is handed, so "sent" is a fact
|
|
53
|
+
# about the wire rather than about a mock. Same ($res, $err) tuple shape
|
|
54
|
+
# utility/fetcher.pm's own transports return.
|
|
55
|
+
#
|
|
56
|
+
# `apistatus` is a SCRIPT - one status per API call, the last repeating -
|
|
57
|
+
# so a case can say "401 then 200" without counting calls itself.
|
|
58
|
+
sub counting_fetch {
|
|
59
|
+
my (%opt) = @_;
|
|
60
|
+
my $tokenpath = defined $opt{path} ? $opt{path} : 'auth/token';
|
|
61
|
+
my $respfield = defined $opt{response} ? $opt{response} : 'access_token';
|
|
62
|
+
my @tokens = @{ $opt{tokens} || ['ACCESS01', 'ACCESS02', 'ACCESS03'] };
|
|
63
|
+
my @apistatus = @{ $opt{apistatus} || [200] };
|
|
64
|
+
|
|
65
|
+
my $stub = { sent => 0, calls => [], issued => 0, apicall => -1 };
|
|
66
|
+
|
|
67
|
+
$stub->{istoken} = sub {
|
|
68
|
+
my ($url) = @_;
|
|
69
|
+
return ($url =~ m{/\Q$tokenpath\E\z}) ? 1 : 0;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
$stub->{fetch} = sub {
|
|
73
|
+
my ($url, $fetchdef) = @_;
|
|
74
|
+
$fetchdef = {} unless defined $fetchdef;
|
|
75
|
+
my $headers = $fetchdef->{headers} || {};
|
|
76
|
+
|
|
77
|
+
$stub->{sent}++;
|
|
78
|
+
push @{ $stub->{calls} }, {
|
|
79
|
+
'url' => $url,
|
|
80
|
+
'method' => $fetchdef->{method},
|
|
81
|
+
'body' => $fetchdef->{body},
|
|
82
|
+
'auth' => $headers->{'authorization'},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
if ($stub->{istoken}->($url)) {
|
|
86
|
+
return ({
|
|
87
|
+
'status' => 401, 'statusText' => 'ERR', 'headers' => {},
|
|
88
|
+
'json' => sub { { 'error' => 'nope' } }, 'body' => '{}',
|
|
89
|
+
}, undef) if $opt{tokenfails};
|
|
90
|
+
|
|
91
|
+
my $i = $stub->{issued};
|
|
92
|
+
$i = $#tokens if $i > $#tokens;
|
|
93
|
+
$stub->{issued}++;
|
|
94
|
+
my $body = { $respfield => $tokens[$i] };
|
|
95
|
+
return ({
|
|
96
|
+
'status' => 200, 'statusText' => 'OK', 'headers' => {},
|
|
97
|
+
'json' => sub { $body }, 'body' => '{}',
|
|
98
|
+
}, undef);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
$stub->{apicall}++;
|
|
102
|
+
my $ai = $stub->{apicall};
|
|
103
|
+
$ai = $#apistatus if $ai > $#apistatus;
|
|
104
|
+
my $status = $apistatus[$ai];
|
|
105
|
+
return ({
|
|
106
|
+
'status' => $status, 'statusText' => ($status < 400 ? 'OK' : 'ERR'),
|
|
107
|
+
'headers' => {},
|
|
108
|
+
'json' => sub { { 'ok' => ($status < 400 ? 1 : 0) } },
|
|
109
|
+
'body' => '{}',
|
|
110
|
+
}, undef);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
return $stub;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# Only the calls that went to the API, and only those that went to the
|
|
118
|
+
# token endpoint.
|
|
119
|
+
sub api_calls {
|
|
120
|
+
my ($stub) = @_;
|
|
121
|
+
return [grep { !$stub->{istoken}->($_->{url}) } @{ $stub->{calls} }];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
sub token_calls {
|
|
125
|
+
my ($stub) = @_;
|
|
126
|
+
return [grep { $stub->{istoken}->($_->{url}) } @{ $stub->{calls} }];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# What went out, for a failure message that names the leak rather than
|
|
131
|
+
# just its count.
|
|
132
|
+
sub wire {
|
|
133
|
+
my ($stub) = @_;
|
|
134
|
+
return join(', ', map {
|
|
135
|
+
$_->{url} . ' auth=' . (defined $_->{auth} ? $_->{auth} : '(none)')
|
|
136
|
+
} @{ $stub->{calls} });
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
# The Authorization header carries the SPEC's credential prefix, which a
|
|
141
|
+
# TEMPLATE cannot know: an OpenAPI `http`/`bearer` scheme gives
|
|
142
|
+
# `Bearer <token>`, an apiKey scheme the raw token. So assert on the
|
|
143
|
+
# CREDENTIAL and let the prefix be whatever this SDK's API declares -
|
|
144
|
+
# pinning the whole header value passes only for a prefix-less API, and
|
|
145
|
+
# this file ships to every project that selects the feature.
|
|
146
|
+
sub credential_is {
|
|
147
|
+
my ($header, $token, $label) = @_;
|
|
148
|
+
my $got = defined $header ? "$header" : '';
|
|
149
|
+
ok(($got eq $token || $got =~ /\s\Q$token\E\z/),
|
|
150
|
+
($label || 'credential') . ": expected the Authorization header to carry"
|
|
151
|
+
. " $token, got: '$got'");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
sub no_credential {
|
|
156
|
+
my ($header, $label) = @_;
|
|
157
|
+
ok(!defined $header,
|
|
158
|
+
($label || 'credential') . ': expected NO Authorization header, got: '
|
|
159
|
+
. (defined $header ? "'$header'" : '(none)'));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
# A LIVE client. `allow.op` is named explicitly: a project that narrows
|
|
164
|
+
# the default set would otherwise turn these into a false RED (the control
|
|
165
|
+
# leg refused before it reached the transport), and the rule under test
|
|
166
|
+
# lives at the transport, downstream of the allow gate either way.
|
|
167
|
+
sub live_sdk {
|
|
168
|
+
my ($stub, $opts) = @_;
|
|
169
|
+
my %o = %{ $opts || {} };
|
|
170
|
+
$o{base} = $RAWBASE unless exists $o{base};
|
|
171
|
+
$o{allow} = { 'op' => 'direct,graphql,list,load,create,update,remove' }
|
|
172
|
+
unless exists $o{allow};
|
|
173
|
+
$o{system} = { 'fetch' => $stub->{fetch} };
|
|
174
|
+
return ProjectNameSDK->new(\%o);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
sub secrets_sdk {
|
|
179
|
+
my ($stub, $sopts, $extra) = @_;
|
|
180
|
+
my %o = %{ $extra || {} };
|
|
181
|
+
$o{feature} = { 'secrets' => { 'active' => 1, %$sopts } };
|
|
182
|
+
return live_sdk($stub, \%o);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
# An env chain, the shape most of these tests use.
|
|
187
|
+
sub envchain {
|
|
188
|
+
my (%extra) = @_;
|
|
189
|
+
return { 'providers' => [{ 'kind' => 'env', 'prefix' => $ENVPREFIX }], %extra };
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
my $BROKEN = {
|
|
194
|
+
'lookup' => sub { die "vault unreachable\n" },
|
|
195
|
+
'describe' => sub { 'broken:test' },
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
my $WORKING = {
|
|
199
|
+
'lookup' => sub { my ($n) = @_; return 'apikey' eq $n ? 'RAWKEY01' : undef },
|
|
200
|
+
'describe' => sub { 'working:test' },
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
# The first entity with a `list` op, discovered from the SDK's own config
|
|
205
|
+
# rather than named: this file is a TEMPLATE and no project's entity names
|
|
206
|
+
# are known here. SEARCH rather than taking the first entity and hoping -
|
|
207
|
+
# an API's first entity by name need not have a list.
|
|
208
|
+
sub listable_op {
|
|
209
|
+
my ($sdk) = @_;
|
|
210
|
+
my $entities = ProjectNameHelpers::to_map(
|
|
211
|
+
ProjectNameHelpers::gp($sdk->options_map, 'entity')) || {};
|
|
212
|
+
for my $name (sort keys %$entities) {
|
|
213
|
+
my $accessor = ucfirst($name);
|
|
214
|
+
next unless $sdk->can($accessor);
|
|
215
|
+
my $ent = eval { $sdk->$accessor() };
|
|
216
|
+
next unless defined $ent && Scalar::Util::blessed($ent) && $ent->can('list');
|
|
217
|
+
return sub { return $ent->list() };
|
|
218
|
+
}
|
|
219
|
+
return undef;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
sub clear_env {
|
|
224
|
+
delete $ENV{$ENVPREFIX . 'APIKEY'};
|
|
225
|
+
delete $ENV{$ENVPREFIX . 'API_TOKEN'};
|
|
226
|
+
delete $ENV{$ENVPREFIX . 'REFRESH_TOKEN'};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
# --- Inactive: the feature costs nothing -----------------------------------
|
|
231
|
+
|
|
232
|
+
{
|
|
233
|
+
clear_env();
|
|
234
|
+
|
|
235
|
+
my $stub = counting_fetch();
|
|
236
|
+
my $sdk = live_sdk($stub, { 'apikey' => 'OPTKEY01' });
|
|
237
|
+
$sdk->direct({ 'path' => '/thing' });
|
|
238
|
+
|
|
239
|
+
is($stub->{sent}, 1, 'inactive: the request went out');
|
|
240
|
+
credential_is($stub->{calls}[0]{auth}, 'OPTKEY01',
|
|
241
|
+
'inactive: apikey option behaves exactly as before');
|
|
242
|
+
|
|
243
|
+
# No feature, no instance: the accessor is the only way in.
|
|
244
|
+
is($sdk->secrets, undef, 'inactive: no live sekreto');
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
{
|
|
248
|
+
my $stub = counting_fetch();
|
|
249
|
+
my $sdk = live_sdk($stub, {});
|
|
250
|
+
$sdk->direct({ 'path' => '/thing' });
|
|
251
|
+
|
|
252
|
+
is($stub->{sent}, 1, 'inactive: the request went out');
|
|
253
|
+
no_credential($stub->{calls}[0]{auth}, 'inactive: no apikey, no header');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
# --- Active: where the credential comes from -------------------------------
|
|
258
|
+
|
|
259
|
+
{
|
|
260
|
+
clear_env();
|
|
261
|
+
$ENV{$ENVPREFIX . 'APIKEY'} = 'ENVKEY01';
|
|
262
|
+
|
|
263
|
+
my $stub = counting_fetch();
|
|
264
|
+
my $sdk = secrets_sdk($stub, envchain(), { 'apikey' => 'OPTKEY01' });
|
|
265
|
+
$sdk->direct({ 'path' => '/thing' });
|
|
266
|
+
|
|
267
|
+
credential_is($stub->{calls}[0]{auth}, 'OPTKEY01',
|
|
268
|
+
'active: an explicit apikey still wins over the chain');
|
|
269
|
+
|
|
270
|
+
# The explicit option is a real store, not a special case: a directed
|
|
271
|
+
# read names it like any other.
|
|
272
|
+
is($sdk->secrets->getfrom('options', 'apikey'), 'OPTKEY01',
|
|
273
|
+
'active: the explicit apikey is the `options` memory store');
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
# The three ways an apikey can be "not given", pinned together because
|
|
277
|
+
# they are easy to conflate and only one of them is a suppression.
|
|
278
|
+
# make_options normalises an omitted apikey to '' before features
|
|
279
|
+
# initialise, so by init time omitted and explicit-empty are
|
|
280
|
+
# indistinguishable - both defer to the chain, deliberately.
|
|
281
|
+
{
|
|
282
|
+
clear_env();
|
|
283
|
+
$ENV{$ENVPREFIX . 'APIKEY'} = 'ENVKEY01';
|
|
284
|
+
|
|
285
|
+
my $stub = counting_fetch();
|
|
286
|
+
secrets_sdk($stub, envchain())->direct({ 'path' => '/thing' });
|
|
287
|
+
credential_is($stub->{calls}[0]{auth}, 'ENVKEY01',
|
|
288
|
+
'active: an OMITTED apikey defers to the chain');
|
|
289
|
+
|
|
290
|
+
my $stub2 = counting_fetch();
|
|
291
|
+
secrets_sdk($stub2, envchain(), { 'apikey' => '' })->direct({ 'path' => '/thing' });
|
|
292
|
+
credential_is($stub2->{calls}[0]{auth}, 'ENVKEY01',
|
|
293
|
+
'active: an explicitly EMPTY apikey also defers to the chain');
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
# THE PERL SPELLING OF A CUSTOM PROVIDER IS A MAP OF CALLABLES.
|
|
297
|
+
#
|
|
298
|
+
# make_options deep-clones the option tree, and Voxgig::Struct::clone
|
|
299
|
+
# UNBLESSES objects while preserving coderefs - so the ts contract
|
|
300
|
+
# ("custom provider objects are accepted verbatim") cannot hold here: a
|
|
301
|
+
# blessed provider arrives at the feature as a plain hash with no methods.
|
|
302
|
+
# A map of callables is what survives, and it is what the docs use.
|
|
303
|
+
{
|
|
304
|
+
clear_env();
|
|
305
|
+
|
|
306
|
+
my @asked;
|
|
307
|
+
my $stub = counting_fetch();
|
|
308
|
+
my $sdk = secrets_sdk($stub, {
|
|
309
|
+
'providers' => [{
|
|
310
|
+
'lookup' => sub { push @asked, $_[0]; return 'CUSTOM01' },
|
|
311
|
+
'describe' => sub { 'custom:test' },
|
|
312
|
+
}],
|
|
313
|
+
});
|
|
314
|
+
$sdk->direct({ 'path' => '/thing' });
|
|
315
|
+
|
|
316
|
+
credential_is($stub->{calls}[0]{auth}, 'CUSTOM01',
|
|
317
|
+
'active: a map of callables is a provider');
|
|
318
|
+
is_deeply(\@asked, ['apikey'], 'active: the custom provider was asked once');
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
# ...and a map that is NEITHER a spec NOR a provider is refused by name,
|
|
322
|
+
# rather than failing deep inside the plugin host with an unrelated
|
|
323
|
+
# message. This is the shape a caller gets by passing a blessed provider
|
|
324
|
+
# object, which the option clone flattens.
|
|
325
|
+
{
|
|
326
|
+
clear_env();
|
|
327
|
+
|
|
328
|
+
my $stub = counting_fetch();
|
|
329
|
+
my $res = secrets_sdk($stub, { 'providers' => [{ 'notaprovider' => 1 }] })
|
|
330
|
+
->direct({ 'path' => '/thing' });
|
|
331
|
+
|
|
332
|
+
is($stub->{sent}, 0,
|
|
333
|
+
'active: a malformed provider must not send an unauthenticated request,'
|
|
334
|
+
. ' but one reached the transport: ' . wire($stub));
|
|
335
|
+
is($res->{ok}, 0, 'active: a malformed provider fails the request');
|
|
336
|
+
like("$res->{err}", qr/blessed provider object cannot survive/,
|
|
337
|
+
'active: the refusal names the shape problem');
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
{
|
|
341
|
+
clear_env();
|
|
342
|
+
|
|
343
|
+
my $stub = counting_fetch();
|
|
344
|
+
my $sdk = secrets_sdk($stub, envchain());
|
|
345
|
+
my $res = $sdk->direct({ 'path' => '/thing' });
|
|
346
|
+
|
|
347
|
+
is($stub->{sent}, 1, 'active: a miss everywhere still sends the request');
|
|
348
|
+
no_credential($stub->{calls}[0]{auth},
|
|
349
|
+
'active: a miss everywhere leaves the header off');
|
|
350
|
+
is($res->{ok}, 1, 'active: the request succeeded unauthenticated');
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
# --- FAIL CLOSED -----------------------------------------------------------
|
|
355
|
+
#
|
|
356
|
+
# sekreto's miss-vs-error invariant: a MISS falls through to the next
|
|
357
|
+
# provider, an ERROR does not. A broken vault must never degrade into an
|
|
358
|
+
# unauthenticated request.
|
|
359
|
+
|
|
360
|
+
{
|
|
361
|
+
clear_env();
|
|
362
|
+
|
|
363
|
+
# THE RULE, asserted first so a regression reports the leak itself.
|
|
364
|
+
my $stub = counting_fetch();
|
|
365
|
+
my $res = secrets_sdk($stub, { 'providers' => [$BROKEN] })
|
|
366
|
+
->direct({ 'path' => '/thing' });
|
|
367
|
+
|
|
368
|
+
is($stub->{sent}, 0,
|
|
369
|
+
'direct: a request must not go out unauthenticated because a provider'
|
|
370
|
+
. ' broke, but one reached the transport: ' . wire($stub));
|
|
371
|
+
is($res->{ok}, 0, 'direct: the operation failed');
|
|
372
|
+
like("$res->{err}", qr/vault unreachable/,
|
|
373
|
+
"direct: the failure carries the PROVIDER'S own message");
|
|
374
|
+
|
|
375
|
+
# CONTROL, which makes that zero mean REFUSED rather than UNWIRED.
|
|
376
|
+
my $control = counting_fetch();
|
|
377
|
+
my $ok = secrets_sdk($control, { 'providers' => [$WORKING] })
|
|
378
|
+
->direct({ 'path' => '/thing' });
|
|
379
|
+
|
|
380
|
+
is($ok->{ok}, 1, 'direct control: the request succeeded');
|
|
381
|
+
is($control->{sent}, 1,
|
|
382
|
+
'direct control: the request never reached system.fetch, so this test'
|
|
383
|
+
. ' cannot observe a request going out at all');
|
|
384
|
+
credential_is($control->{calls}[0]{auth}, 'RAWKEY01', 'direct control');
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
{
|
|
388
|
+
clear_env();
|
|
389
|
+
|
|
390
|
+
my $stub = counting_fetch();
|
|
391
|
+
my $res = secrets_sdk($stub, { 'providers' => [$BROKEN] })
|
|
392
|
+
->graphql('{ thing }', {});
|
|
393
|
+
|
|
394
|
+
is($stub->{sent}, 0,
|
|
395
|
+
'graphql: a request must not go out unauthenticated, but one reached'
|
|
396
|
+
. ' the transport: ' . wire($stub));
|
|
397
|
+
is($res->{ok}, 0, 'graphql: the operation failed');
|
|
398
|
+
like("$res->{err}", qr/vault unreachable/,
|
|
399
|
+
"graphql: the failure carries the PROVIDER'S own message");
|
|
400
|
+
|
|
401
|
+
my $control = counting_fetch();
|
|
402
|
+
my $ok = secrets_sdk($control, { 'providers' => [$WORKING] })
|
|
403
|
+
->graphql('{ thing }', {});
|
|
404
|
+
|
|
405
|
+
is($ok->{ok}, 1, 'graphql control: the request succeeded');
|
|
406
|
+
is($control->{sent}, 1,
|
|
407
|
+
'graphql control: the request never reached system.fetch, so this test'
|
|
408
|
+
. ' cannot observe a request going out at all');
|
|
409
|
+
credential_is($control->{calls}[0]{auth}, 'RAWKEY01', 'graphql control');
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
# The ENTITY path, which DOES run feature hooks - so it must fail closed
|
|
413
|
+
# for the same reason and by the same rule.
|
|
414
|
+
SKIP: {
|
|
415
|
+
clear_env();
|
|
416
|
+
|
|
417
|
+
my $stub = counting_fetch();
|
|
418
|
+
my $sdk = secrets_sdk($stub, { 'providers' => [$BROKEN] });
|
|
419
|
+
my $op = listable_op($sdk);
|
|
420
|
+
|
|
421
|
+
skip('this SDK has no listable entity', 5) unless defined $op;
|
|
422
|
+
|
|
423
|
+
my $out = eval { $op->(); 1 };
|
|
424
|
+
my $err = $@;
|
|
425
|
+
|
|
426
|
+
ok(!$out, 'entity: a broken provider fails the operation');
|
|
427
|
+
like("$err", qr/vault unreachable/,
|
|
428
|
+
"entity: the failure carries the PROVIDER'S own message");
|
|
429
|
+
is($stub->{sent}, 0,
|
|
430
|
+
'entity: a request must not go out unauthenticated because a provider'
|
|
431
|
+
. ' broke, but one reached the transport: ' . wire($stub));
|
|
432
|
+
|
|
433
|
+
my $control = counting_fetch();
|
|
434
|
+
my $csdk = secrets_sdk($control, { 'providers' => [$WORKING] });
|
|
435
|
+
my $cop = listable_op($csdk);
|
|
436
|
+
eval { $cop->() };
|
|
437
|
+
|
|
438
|
+
is($control->{sent}, 1,
|
|
439
|
+
'entity control: the request never reached system.fetch, so this test'
|
|
440
|
+
. ' cannot observe a request going out at all');
|
|
441
|
+
credential_is($control->{calls}[0]{auth}, 'RAWKEY01', 'entity control');
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
# A failure must not be REMEMBERED. Holding one meant a transient vault
|
|
445
|
+
# outage poisoned the client permanently: every later operation kept
|
|
446
|
+
# failing with the original error long after the vault recovered.
|
|
447
|
+
{
|
|
448
|
+
clear_env();
|
|
449
|
+
|
|
450
|
+
my $calls = 0;
|
|
451
|
+
my $flaky = {
|
|
452
|
+
'lookup' => sub {
|
|
453
|
+
$calls++;
|
|
454
|
+
die "vault unreachable\n" if 1 == $calls;
|
|
455
|
+
return 'RECOVERED01';
|
|
456
|
+
},
|
|
457
|
+
'describe' => sub { 'flaky:test' },
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
my $stub = counting_fetch();
|
|
461
|
+
my $sdk = secrets_sdk($stub, { 'providers' => [$flaky] });
|
|
462
|
+
|
|
463
|
+
my $first = $sdk->direct({ 'path' => '/thing' });
|
|
464
|
+
is($first->{ok}, 0, 'recovery: the first attempt surfaces the outage');
|
|
465
|
+
is($stub->{sent}, 0, 'recovery: nothing went out during the outage');
|
|
466
|
+
|
|
467
|
+
my $second = $sdk->direct({ 'path' => '/thing' });
|
|
468
|
+
is($second->{ok}, 1, 'recovery: the second attempt recovers');
|
|
469
|
+
is($stub->{sent}, 1, 'recovery: exactly one request went out');
|
|
470
|
+
credential_is($stub->{calls}[0]{auth}, 'RECOVERED01',
|
|
471
|
+
'recovery: the FRESH credential, never the stale one and never nothing');
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
# --- auth: null suppresses -------------------------------------------------
|
|
476
|
+
#
|
|
477
|
+
# `auth => undef` is the documented way to disable auth outright, and
|
|
478
|
+
# prepare_auth honours it before it ever reads the apikey. The transport
|
|
479
|
+
# seam has to honour it too, or the feature would put back exactly the
|
|
480
|
+
# credential the caller withheld.
|
|
481
|
+
|
|
482
|
+
{
|
|
483
|
+
clear_env();
|
|
484
|
+
$ENV{$ENVPREFIX . 'APIKEY'} = 'ENVKEY01';
|
|
485
|
+
|
|
486
|
+
my $stub = counting_fetch();
|
|
487
|
+
my $sdk = secrets_sdk($stub, envchain(), { 'auth' => undef });
|
|
488
|
+
$sdk->direct({ 'path' => '/thing' });
|
|
489
|
+
|
|
490
|
+
is($stub->{sent}, 1, 'auth null: the request still goes out');
|
|
491
|
+
no_credential($stub->{calls}[0]{auth},
|
|
492
|
+
'auth null suppresses the credential, chain or no chain');
|
|
493
|
+
|
|
494
|
+
# The suppression survives option validation rather than being replaced
|
|
495
|
+
# by the optspec default auth map.
|
|
496
|
+
ok(!defined $sdk->options_map->{auth}, 'auth null survives validate');
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
{
|
|
500
|
+
clear_env();
|
|
501
|
+
|
|
502
|
+
my $stub = counting_fetch();
|
|
503
|
+
secrets_sdk($stub, envchain(), { 'apikey' => 'OPTKEY01', 'auth' => undef })
|
|
504
|
+
->direct({ 'path' => '/thing' });
|
|
505
|
+
|
|
506
|
+
no_credential($stub->{calls}[0]{auth},
|
|
507
|
+
'auth null suppresses an EXPLICIT apikey too');
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
# --- cache -----------------------------------------------------------------
|
|
512
|
+
|
|
513
|
+
{
|
|
514
|
+
clear_env();
|
|
515
|
+
|
|
516
|
+
my $calls = 0;
|
|
517
|
+
my $counting = {
|
|
518
|
+
'lookup' => sub { $calls++; return 'KEY' . $calls },
|
|
519
|
+
'describe' => sub { 'counting:test' },
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
my $stub = counting_fetch();
|
|
523
|
+
my $sdk = secrets_sdk($stub, { 'cache' => 0, 'providers' => [$counting] });
|
|
524
|
+
$sdk->direct({ 'path' => '/one' });
|
|
525
|
+
$sdk->direct({ 'path' => '/two' });
|
|
526
|
+
|
|
527
|
+
is(scalar @{ $stub->{calls} }, 2, 'cache off: two requests');
|
|
528
|
+
credential_is($stub->{calls}[0]{auth}, 'KEY1', 'cache off: first');
|
|
529
|
+
credential_is($stub->{calls}[1]{auth}, 'KEY2',
|
|
530
|
+
'cache false asks the chain on every request');
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
{
|
|
534
|
+
clear_env();
|
|
535
|
+
|
|
536
|
+
my $calls = 0;
|
|
537
|
+
my $counting = {
|
|
538
|
+
'lookup' => sub { $calls++; return 'KEY' . $calls },
|
|
539
|
+
'describe' => sub { 'counting:test' },
|
|
540
|
+
};
|
|
541
|
+
|
|
542
|
+
my $stub = counting_fetch();
|
|
543
|
+
my $sdk = secrets_sdk($stub, { 'providers' => [$counting] });
|
|
544
|
+
$sdk->direct({ 'path' => '/one' });
|
|
545
|
+
$sdk->direct({ 'path' => '/two' });
|
|
546
|
+
|
|
547
|
+
is($calls, 1, 'cache on: a cached success asks the chain once');
|
|
548
|
+
credential_is($stub->{calls}[1]{auth}, 'KEY1', 'cache on: same credential');
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
# An UNCACHED miss after an earlier hit is a REVOCATION: the chain now
|
|
552
|
+
# says no provider has the secret, so the resolved value must not keep
|
|
553
|
+
# going out on the wire.
|
|
554
|
+
{
|
|
555
|
+
clear_env();
|
|
556
|
+
|
|
557
|
+
my $calls = 0;
|
|
558
|
+
my $revoking = {
|
|
559
|
+
'lookup' => sub { $calls++; return 1 == $calls ? 'BEFORE01' : undef },
|
|
560
|
+
'describe' => sub { 'revoking:test' },
|
|
561
|
+
};
|
|
562
|
+
|
|
563
|
+
my $stub = counting_fetch();
|
|
564
|
+
my $sdk = secrets_sdk($stub, { 'cache' => 0, 'providers' => [$revoking] });
|
|
565
|
+
$sdk->direct({ 'path' => '/one' });
|
|
566
|
+
$sdk->direct({ 'path' => '/two' });
|
|
567
|
+
|
|
568
|
+
credential_is($stub->{calls}[0]{auth}, 'BEFORE01', 'revocation: before');
|
|
569
|
+
no_credential($stub->{calls}[1]{auth},
|
|
570
|
+
'an uncached miss after a hit RETRACTS the credential');
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
# ...and an explicit apikey OPTION is never lost that way: it seats FIRST
|
|
574
|
+
# in the chain as a memory provider, so the chain HITS while one is set.
|
|
575
|
+
{
|
|
576
|
+
clear_env();
|
|
577
|
+
|
|
578
|
+
my $stub = counting_fetch();
|
|
579
|
+
my $sdk = secrets_sdk($stub,
|
|
580
|
+
{ 'cache' => 0, 'providers' => [{
|
|
581
|
+
'lookup' => sub { undef }, 'describe' => sub { 'empty:test' } }] },
|
|
582
|
+
{ 'apikey' => 'OPTKEY01' });
|
|
583
|
+
$sdk->direct({ 'path' => '/one' });
|
|
584
|
+
$sdk->direct({ 'path' => '/two' });
|
|
585
|
+
|
|
586
|
+
credential_is($stub->{calls}[1]{auth}, 'OPTKEY01',
|
|
587
|
+
'an explicit apikey is never retracted by an uncached miss');
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
# --- the secret name, and the live Sekreto ---------------------------------
|
|
592
|
+
|
|
593
|
+
{
|
|
594
|
+
clear_env();
|
|
595
|
+
$ENV{$ENVPREFIX . 'API_TOKEN'} = 'TOKKEY01';
|
|
596
|
+
|
|
597
|
+
my $stub = counting_fetch();
|
|
598
|
+
secrets_sdk($stub, envchain('name' => 'api.token'))->direct({ 'path' => '/t' });
|
|
599
|
+
credential_is($stub->{calls}[0]{auth}, 'TOKKEY01',
|
|
600
|
+
'the secret name is configurable');
|
|
601
|
+
clear_env();
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
{
|
|
605
|
+
clear_env();
|
|
606
|
+
|
|
607
|
+
my $stub = counting_fetch();
|
|
608
|
+
my $sdk = secrets_sdk($stub, {
|
|
609
|
+
'providers' => [{ 'kind' => 'memory', 'values' => { 'DB_PASSWORD' => 'dbpass01' } }],
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
my $secrets = $sdk->secrets;
|
|
613
|
+
ok(defined $secrets, 'the live sekreto is reachable through the accessor');
|
|
614
|
+
is($secrets->get('db.password'), 'dbpass01',
|
|
615
|
+
'sekreto is live for arbitrary secrets');
|
|
616
|
+
is($secrets->redactall('the password is dbpass01, keep it safe'),
|
|
617
|
+
'the password is [redacted], keep it safe',
|
|
618
|
+
'sekreto is live for redaction');
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
# THE PROVIDER VOCABULARY IS NON-EMPTY.
|
|
622
|
+
#
|
|
623
|
+
# Construction is where an unknown kind is refused, so the Sekreto being
|
|
624
|
+
# built at all IS the regression check: if Config emitted no
|
|
625
|
+
# FEATURE_PLUGINS table (or the feature failed to read it), the chain
|
|
626
|
+
# below is refused and the request never goes out. The memory store comes
|
|
627
|
+
# FIRST so sekreto's first-hit rule answers from it and the vault is never
|
|
628
|
+
# contacted - the kind has to be DECLARABLE, not reachable.
|
|
629
|
+
#
|
|
630
|
+
# Conditional on the module being present, because this file ships to
|
|
631
|
+
# projects that select the feature without the `vault` plugin group.
|
|
632
|
+
SKIP: {
|
|
633
|
+
clear_env();
|
|
634
|
+
|
|
635
|
+
my $vaultmod = "$FindBin::Bin/../../../feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm";
|
|
636
|
+
skip('no vault plugin group in this project', 2) unless -f $vaultmod;
|
|
637
|
+
|
|
638
|
+
my $stub = counting_fetch();
|
|
639
|
+
my $sdk = secrets_sdk($stub, {
|
|
640
|
+
'providers' => [
|
|
641
|
+
{ 'kind' => 'memory', 'values' => { 'APIKEY' => 'VOCAB01' } },
|
|
642
|
+
{ 'kind' => 'hashicorp', 'addr' => 'https://vault.test', 'token' => 'x' },
|
|
643
|
+
],
|
|
644
|
+
});
|
|
645
|
+
my $res = $sdk->direct({ 'path' => '/thing' });
|
|
646
|
+
|
|
647
|
+
is($res->{ok}, 1, 'vocabulary: a selected plugin kind is declarable');
|
|
648
|
+
credential_is($stub->{calls}[0]{auth}, 'VOCAB01', 'vocabulary');
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
# FEATURE ORDER decides wrapper nesting. Main adds features in
|
|
652
|
+
# __derived__.featureorder - test first, then sorted - so `secrets` lands
|
|
653
|
+
# after retry/cache/ratelimit and sits OUTERMOST: one credential
|
|
654
|
+
# injection, retried underneath. That is correct, but it is an emergent
|
|
655
|
+
# property of alphabetical ordering rather than a declaration, so pin it.
|
|
656
|
+
{
|
|
657
|
+
clear_env();
|
|
658
|
+
|
|
659
|
+
my $stub = counting_fetch();
|
|
660
|
+
my $sdk = secrets_sdk($stub, { 'providers' => [$WORKING] });
|
|
661
|
+
my $order = ProjectNameHelpers::gpath($sdk->options_map,
|
|
662
|
+
'__derived__.featureorder');
|
|
663
|
+
$order = [] unless Voxgig::Struct::islist($order);
|
|
664
|
+
|
|
665
|
+
my ($si) = grep { 'secrets' eq $order->[$_] } 0 .. $#$order;
|
|
666
|
+
ok(defined $si, 'secrets is in the resolved feature order');
|
|
667
|
+
|
|
668
|
+
my @transport = grep { defined }
|
|
669
|
+
map { my $n = $_; (grep { $n eq $order->[$_] } 0 .. $#$order)[0] }
|
|
670
|
+
qw(retry cache ratelimit netsim proxy timeout);
|
|
671
|
+
my $late = 1;
|
|
672
|
+
for my $i (@transport) {
|
|
673
|
+
$late = 0 if $i > $si;
|
|
674
|
+
}
|
|
675
|
+
ok($late, 'secrets is added after every transport-wrapping feature,'
|
|
676
|
+
. ' so its credential injection sits OUTERMOST');
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
# --- ACCESS-TOKEN EXCHANGE -------------------------------------------------
|
|
681
|
+
#
|
|
682
|
+
# What the chain resolves is a REFRESH token, which is POSTed to a token
|
|
683
|
+
# endpoint for a short-lived ACCESS token; the access token is what the
|
|
684
|
+
# Authorization header carries; and when the API answers 401 the client
|
|
685
|
+
# buys another and tries the same request again, once.
|
|
686
|
+
|
|
687
|
+
sub exchange_sdk {
|
|
688
|
+
my ($stub, $x, $extra) = @_;
|
|
689
|
+
my %o = %{ $extra || {} };
|
|
690
|
+
$o{base} = $XBASE;
|
|
691
|
+
return secrets_sdk($stub, {
|
|
692
|
+
'name' => 'refresh_token',
|
|
693
|
+
'providers' => [{ 'kind' => 'env', 'prefix' => $ENVPREFIX }],
|
|
694
|
+
'exchange' => { 'active' => 1, %{ $x || {} } },
|
|
695
|
+
}, \%o);
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
{
|
|
699
|
+
clear_env();
|
|
700
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
701
|
+
|
|
702
|
+
my $stub = counting_fetch();
|
|
703
|
+
exchange_sdk($stub)->direct({ 'path' => '/thing' });
|
|
704
|
+
|
|
705
|
+
is(scalar @{ token_calls($stub) }, 1, 'exchange: exactly one purchase');
|
|
706
|
+
is_deeply(Voxgig::Struct::parse_json(token_calls($stub)->[0]{body}),
|
|
707
|
+
{ 'refresh_token' => 'REFRESH01' },
|
|
708
|
+
'exchange: the refresh token is sent in the request field');
|
|
709
|
+
is(scalar @{ api_calls($stub) }, 1, 'exchange: one API call');
|
|
710
|
+
credential_is(api_calls($stub)->[0]{auth}, 'ACCESS01',
|
|
711
|
+
'exchange: the request carries the access token');
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
# The body is MARSHALLED, not concatenated: a refresh token carrying a
|
|
715
|
+
# quote, backslash or newline must arrive as that literal value.
|
|
716
|
+
{
|
|
717
|
+
clear_env();
|
|
718
|
+
my $nasty = qq{a"b\\c\nd};
|
|
719
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = $nasty;
|
|
720
|
+
|
|
721
|
+
my $stub = counting_fetch();
|
|
722
|
+
exchange_sdk($stub)->direct({ 'path' => '/thing' });
|
|
723
|
+
|
|
724
|
+
is_deeply(Voxgig::Struct::parse_json(token_calls($stub)->[0]{body}),
|
|
725
|
+
{ 'refresh_token' => $nasty },
|
|
726
|
+
'exchange: the request body is marshalled, not concatenated');
|
|
727
|
+
clear_env();
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
{
|
|
731
|
+
clear_env();
|
|
732
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'FROMCHAIN';
|
|
733
|
+
|
|
734
|
+
my $stub = counting_fetch();
|
|
735
|
+
exchange_sdk($stub, { 'refresh' => 'EXPLICIT01' })->direct({ 'path' => '/thing' });
|
|
736
|
+
|
|
737
|
+
is_deeply(Voxgig::Struct::parse_json(token_calls($stub)->[0]{body}),
|
|
738
|
+
{ 'refresh_token' => 'EXPLICIT01' },
|
|
739
|
+
'exchange: an explicit exchange.refresh wins over the chain');
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
{
|
|
743
|
+
clear_env();
|
|
744
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
745
|
+
|
|
746
|
+
my $stub = counting_fetch();
|
|
747
|
+
my $sdk = exchange_sdk($stub);
|
|
748
|
+
$sdk->direct({ 'path' => '/one' });
|
|
749
|
+
$sdk->direct({ 'path' => '/two' });
|
|
750
|
+
$sdk->direct({ 'path' => '/three' });
|
|
751
|
+
|
|
752
|
+
is(scalar @{ token_calls($stub) }, 1,
|
|
753
|
+
'exchange: a token still working must not be re-bought');
|
|
754
|
+
is(scalar @{ api_calls($stub) }, 3, 'exchange: one purchase serves many');
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
{
|
|
758
|
+
clear_env();
|
|
759
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
760
|
+
|
|
761
|
+
# First API call is refused, the retry succeeds.
|
|
762
|
+
my $stub = counting_fetch('apistatus' => [401, 200]);
|
|
763
|
+
my $res = exchange_sdk($stub)->direct({ 'path' => '/thing' });
|
|
764
|
+
|
|
765
|
+
is(scalar @{ token_calls($stub) }, 2, 'exchange: a second purchase');
|
|
766
|
+
is(scalar @{ api_calls($stub) }, 2, 'exchange: the request was retried');
|
|
767
|
+
credential_is(api_calls($stub)->[0]{auth}, 'ACCESS01', 'exchange: first try');
|
|
768
|
+
credential_is(api_calls($stub)->[1]{auth}, 'ACCESS02',
|
|
769
|
+
'exchange: the retry carries the NEW token, not the spent one');
|
|
770
|
+
is($res->{ok}, 1, 'exchange: the caller sees the successful retry');
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
{
|
|
774
|
+
clear_env();
|
|
775
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
776
|
+
|
|
777
|
+
# Every API call is refused: a second 401 on a token bought moments ago
|
|
778
|
+
# is a real failure, and spinning on it would hang instead of failing.
|
|
779
|
+
my $stub = counting_fetch('apistatus' => [401]);
|
|
780
|
+
exchange_sdk($stub)->direct({ 'path' => '/thing' });
|
|
781
|
+
|
|
782
|
+
is(scalar @{ api_calls($stub) }, 2, 'exchange: exactly one retry');
|
|
783
|
+
is(scalar @{ token_calls($stub) }, 2, 'exchange: exactly two purchases');
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
{
|
|
787
|
+
clear_env();
|
|
788
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
789
|
+
|
|
790
|
+
my $stub = counting_fetch('apistatus' => [403]);
|
|
791
|
+
exchange_sdk($stub)->direct({ 'path' => '/thing' });
|
|
792
|
+
|
|
793
|
+
is(scalar @{ api_calls($stub) }, 1,
|
|
794
|
+
'exchange: 403 is not in the default statuses');
|
|
795
|
+
is(scalar @{ token_calls($stub) }, 1, 'exchange: no extra purchase');
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
{
|
|
799
|
+
clear_env();
|
|
800
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
801
|
+
|
|
802
|
+
my $stub = counting_fetch('apistatus' => [403, 200]);
|
|
803
|
+
exchange_sdk($stub, { 'statuses' => [403] })->direct({ 'path' => '/thing' });
|
|
804
|
+
|
|
805
|
+
is(scalar @{ api_calls($stub) }, 2, 'exchange: statuses is configurable');
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
{
|
|
809
|
+
clear_env();
|
|
810
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
811
|
+
|
|
812
|
+
my $stub = counting_fetch('path' => 'oauth/grant', 'response' => 'token');
|
|
813
|
+
exchange_sdk($stub, {
|
|
814
|
+
'path' => 'oauth/grant', 'request' => 'grant', 'response' => 'token',
|
|
815
|
+
})->direct({ 'path' => '/thing' });
|
|
816
|
+
|
|
817
|
+
is(scalar @{ token_calls($stub) }, 1, 'exchange: one purchase');
|
|
818
|
+
like(token_calls($stub)->[0]{url}, qr{\Q$XBASE\E/oauth/grant\z},
|
|
819
|
+
'exchange: the token endpoint is relative to base');
|
|
820
|
+
is_deeply(Voxgig::Struct::parse_json(token_calls($stub)->[0]{body}),
|
|
821
|
+
{ 'grant' => 'REFRESH01' }, 'exchange: the request field is configurable');
|
|
822
|
+
credential_is(api_calls($stub)->[0]{auth}, 'ACCESS01',
|
|
823
|
+
'exchange: the response field is configurable');
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
{
|
|
827
|
+
clear_env();
|
|
828
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
829
|
+
|
|
830
|
+
# A caller who already holds an access token should use it; expiry is
|
|
831
|
+
# what moves them onto the exchange, and the API is what says so.
|
|
832
|
+
my $stub = counting_fetch();
|
|
833
|
+
exchange_sdk($stub, {}, { 'apikey' => 'HELDTOKEN01' })
|
|
834
|
+
->direct({ 'path' => '/thing' });
|
|
835
|
+
|
|
836
|
+
is(scalar @{ token_calls($stub) }, 0, 'exchange: nothing needed buying');
|
|
837
|
+
credential_is(api_calls($stub)->[0]{auth}, 'HELDTOKEN01',
|
|
838
|
+
'exchange: an explicit apikey is spent before anything is bought');
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
{
|
|
842
|
+
clear_env();
|
|
843
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
844
|
+
|
|
845
|
+
my $stub = counting_fetch('apistatus' => [401, 200]);
|
|
846
|
+
exchange_sdk($stub, {}, { 'apikey' => 'STALETOKEN01' })
|
|
847
|
+
->direct({ 'path' => '/thing' });
|
|
848
|
+
|
|
849
|
+
credential_is(api_calls($stub)->[0]{auth}, 'STALETOKEN01', 'exchange: stale');
|
|
850
|
+
credential_is(api_calls($stub)->[1]{auth}, 'ACCESS01',
|
|
851
|
+
'exchange: a spent apikey falls through to the exchange');
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
{
|
|
855
|
+
clear_env();
|
|
856
|
+
|
|
857
|
+
my $stub = counting_fetch();
|
|
858
|
+
my $res = exchange_sdk($stub)->direct({ 'path' => '/thing' });
|
|
859
|
+
|
|
860
|
+
is($res->{ok}, 0,
|
|
861
|
+
'exchange: no refresh token anywhere is an ERROR, not an unauthenticated call');
|
|
862
|
+
like("$res->{err}", qr/no refresh token/, 'exchange: the refusal says why');
|
|
863
|
+
is(scalar @{ api_calls($stub) }, 0,
|
|
864
|
+
'exchange: a request must not go out because the chain was empty,'
|
|
865
|
+
. ' but one reached the transport: ' . wire($stub));
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
{
|
|
869
|
+
clear_env();
|
|
870
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
871
|
+
|
|
872
|
+
# The first purchase succeeds; the second (after the 401) does not.
|
|
873
|
+
my $stub = counting_fetch('apistatus' => [401]);
|
|
874
|
+
my $inner = $stub->{fetch};
|
|
875
|
+
my $wrapped = {
|
|
876
|
+
'sent' => 0, 'calls' => $stub->{calls}, 'istoken' => $stub->{istoken},
|
|
877
|
+
};
|
|
878
|
+
$wrapped->{fetch} = sub {
|
|
879
|
+
my ($url, $fetchdef) = @_;
|
|
880
|
+
my ($res, $err) = $inner->($url, $fetchdef);
|
|
881
|
+
if ($stub->{istoken}->($url) && 1 < scalar @{ token_calls($stub) }) {
|
|
882
|
+
return ({ 'status' => 500, 'statusText' => 'ERR', 'headers' => {},
|
|
883
|
+
'json' => sub { {} }, 'body' => '{}' }, undef);
|
|
884
|
+
}
|
|
885
|
+
return ($res, $err);
|
|
886
|
+
};
|
|
887
|
+
|
|
888
|
+
my $res = exchange_sdk($wrapped)->direct({ 'path' => '/thing' });
|
|
889
|
+
|
|
890
|
+
ok(defined $res, 'exchange: the caller got an answer rather than a hang');
|
|
891
|
+
is(scalar @{ api_calls($stub) }, 1,
|
|
892
|
+
'exchange: no retry after a failed purchase - the API refusal stands');
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
{
|
|
896
|
+
clear_env();
|
|
897
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
898
|
+
|
|
899
|
+
# `auth => undef` is the documented way to send no credential at all. A
|
|
900
|
+
# refusal of a deliberately unauthenticated request is not an expired
|
|
901
|
+
# token: buying one and retrying would transmit exactly the credential
|
|
902
|
+
# the caller suppressed.
|
|
903
|
+
my $stub = counting_fetch('apistatus' => [401]);
|
|
904
|
+
exchange_sdk($stub, {}, { 'auth' => undef })->direct({ 'path' => '/thing' });
|
|
905
|
+
|
|
906
|
+
is(scalar @{ api_calls($stub) }, 1,
|
|
907
|
+
'exchange: a suppressed request must not be retried');
|
|
908
|
+
no_credential(api_calls($stub)->[0]{auth},
|
|
909
|
+
'exchange: no credential may be sent when auth is suppressed');
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
{
|
|
913
|
+
clear_env();
|
|
914
|
+
$ENV{$ENVPREFIX . 'APIKEY'} = 'PLAINKEY01';
|
|
915
|
+
|
|
916
|
+
my $stub = counting_fetch();
|
|
917
|
+
secrets_sdk($stub, envchain())->direct({ 'path' => '/thing' });
|
|
918
|
+
|
|
919
|
+
credential_is($stub->{calls}[0]{auth}, 'PLAINKEY01',
|
|
920
|
+
'exchange off leaves the feature exactly as it was');
|
|
921
|
+
clear_env();
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
# TEST MODE BUYS NOTHING: the test feature replaces the transport so no
|
|
925
|
+
# request leaves the process, and an exchange would be the one HTTP call
|
|
926
|
+
# it could not stop.
|
|
927
|
+
{
|
|
928
|
+
clear_env();
|
|
929
|
+
$ENV{$ENVPREFIX . 'REFRESH_TOKEN'} = 'REFRESH01';
|
|
930
|
+
|
|
931
|
+
my $stub = counting_fetch();
|
|
932
|
+
my $sdk = ProjectNameSDK->test({}, {
|
|
933
|
+
'base' => $XBASE,
|
|
934
|
+
'system' => { 'fetch' => $stub->{fetch} },
|
|
935
|
+
'feature' => {
|
|
936
|
+
'secrets' => {
|
|
937
|
+
'active' => 1,
|
|
938
|
+
'name' => 'refresh_token',
|
|
939
|
+
'providers' => [{ 'kind' => 'env', 'prefix' => $ENVPREFIX }],
|
|
940
|
+
'exchange' => { 'active' => 1 },
|
|
941
|
+
},
|
|
942
|
+
},
|
|
943
|
+
});
|
|
944
|
+
|
|
945
|
+
my $f = $sdk->{_secrets};
|
|
946
|
+
ok(defined $f, 'test mode: the feature initialised');
|
|
947
|
+
my $err = $f->resolve;
|
|
948
|
+
is($err, undef, 'test mode: resolution needs no token endpoint');
|
|
949
|
+
is(scalar @{ $stub->{calls} }, 0, 'test mode must not do IO');
|
|
950
|
+
# A deterministic placeholder, so offline suites need no configuration.
|
|
951
|
+
is($f->credential, 'test-access_token', 'test mode: a fake access token');
|
|
952
|
+
clear_env();
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
clear_env();
|
|
956
|
+
|
|
957
|
+
done_testing;
|