@voxgig/sdkgen 4.9.0 → 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/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/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/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 +2 -2
- 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 +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +2 -2
- 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 +2 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +2 -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 +2 -2
- package/project/.sdk/tm/go/test/omni/util.go +2 -2
- 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 +1 -1
- 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 +1 -1
- package/project/.sdk/tm/js/test/vendor/omni/util.js +1 -1
- 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 +2 -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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -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 +1 -1
- package/project/.sdk/tm/py/test/voxgig_omni/util.py +1 -1
- 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 +1 -1
- 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/test/vendor/omni/omni.zig +2 -2
- package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +2 -2
- package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +2 -2
- package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +2 -2
- 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/{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,1067 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
declare(strict_types=1);
|
|
3
|
+
|
|
4
|
+
// Behavioural tests for the secrets feature (vendored @voxgig/sekreto) -
|
|
5
|
+
// the php port of tm/ts/test/feature/secrets/Secrets.test.ts.
|
|
6
|
+
//
|
|
7
|
+
// The contract under test: the `apikey` OPTION keeps its exact old meaning
|
|
8
|
+
// and always wins, because the feature places it FIRST in the provider
|
|
9
|
+
// chain (a `memory` store named 'options') - explicit-beats-lookup falls
|
|
10
|
+
// out of sekreto's first-hit rule rather than from special-case logic. With
|
|
11
|
+
// the feature inactive nothing changes at all. With it active and the
|
|
12
|
+
// option unset, the chain (env, a custom provider, a vault) supplies the
|
|
13
|
+
// credential instead.
|
|
14
|
+
//
|
|
15
|
+
// This file lives in the test `feature/` container on purpose: `target add`
|
|
16
|
+
// trims it, along with the feature source and the vendored library, for a
|
|
17
|
+
// project whose model does not select `secrets`.
|
|
18
|
+
//
|
|
19
|
+
// The credential is asserted ON THE WIRE: a live-mode client with a
|
|
20
|
+
// recording system.fetch, driven through real entity operations AND through
|
|
21
|
+
// `direct()` and `graphql()`. An options-level assertion would pass for a
|
|
22
|
+
// port that never consults the value, and the raw paths run NO feature
|
|
23
|
+
// hooks - which is exactly why resolution lives at the transport seam.
|
|
24
|
+
|
|
25
|
+
require_once __DIR__ . '/../../../projectname_sdk.php';
|
|
26
|
+
|
|
27
|
+
use PHPUnit\Framework\TestCase;
|
|
28
|
+
|
|
29
|
+
// PLACEHOLDER-PREFIXED, all three classes in this file. A generated PHP SDK
|
|
30
|
+
// uses no namespaces and composer classmaps both `types/` and `test/`, so a
|
|
31
|
+
// bare `SecretsWire` here is a name an API entity could also claim - and PHP
|
|
32
|
+
// answers a redeclaration with a fatal, not a warning (helpers/naming.ts
|
|
33
|
+
// PHP_SDK_CLASSES, and test/php-sdk-classes.test.ts). `ProjectName`
|
|
34
|
+
// substitutes to this SDK's own name, which no bare entity type can equal.
|
|
35
|
+
//
|
|
36
|
+
// The recording transport: system.fetch for a LIVE client, scripting one
|
|
37
|
+
// status per API call (the last repeating) and a token endpoint for the
|
|
38
|
+
// exchange tests.
|
|
39
|
+
class ProjectNameSecretsWire
|
|
40
|
+
{
|
|
41
|
+
/** @var array<int,array<string,mixed>> */
|
|
42
|
+
public array $calls = [];
|
|
43
|
+
/** @var array<int,int> */
|
|
44
|
+
public array $apistatus = [200];
|
|
45
|
+
/** @var array<int,string> */
|
|
46
|
+
public array $tokens = ['ACCESS01', 'ACCESS02', 'ACCESS03'];
|
|
47
|
+
public string $tokenpath = 'auth/token';
|
|
48
|
+
public string $respfield = 'access_token';
|
|
49
|
+
|
|
50
|
+
private int $issued = 0;
|
|
51
|
+
private int $apicalls = 0;
|
|
52
|
+
|
|
53
|
+
// The callable the SDK options take as system.fetch.
|
|
54
|
+
public function fetch(): callable
|
|
55
|
+
{
|
|
56
|
+
return function (string $fullurl, array $fetchdef): array {
|
|
57
|
+
return $this->record($fullurl, $fetchdef);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public function record(string $fullurl, array $fetchdef): array
|
|
62
|
+
{
|
|
63
|
+
$headers = is_array($fetchdef['headers'] ?? null) ? $fetchdef['headers'] : [];
|
|
64
|
+
$this->calls[] = [
|
|
65
|
+
'url' => $fullurl,
|
|
66
|
+
'auth' => $headers['authorization'] ?? null,
|
|
67
|
+
'has' => array_key_exists('authorization', $headers),
|
|
68
|
+
'body' => $fetchdef['body'] ?? null,
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
if ($this->istoken($fullurl)) {
|
|
72
|
+
$token = $this->tokens[min($this->issued, count($this->tokens) - 1)];
|
|
73
|
+
$this->issued++;
|
|
74
|
+
$payload = [$this->respfield => $token];
|
|
75
|
+
return [[
|
|
76
|
+
'status' => 200, 'statusText' => 'OK', 'headers' => [],
|
|
77
|
+
'json' => function () use ($payload) { return $payload; },
|
|
78
|
+
], null];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
$status = $this->apistatus[min($this->apicalls, count($this->apistatus) - 1)];
|
|
82
|
+
$this->apicalls++;
|
|
83
|
+
$payload = ['ok' => $status < 400];
|
|
84
|
+
return [[
|
|
85
|
+
'status' => $status, 'statusText' => 'X', 'headers' => [],
|
|
86
|
+
'json' => function () use ($payload) { return $payload; },
|
|
87
|
+
], null];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** The recorded calls that did NOT go to the token endpoint. */
|
|
91
|
+
public function api(): array
|
|
92
|
+
{
|
|
93
|
+
return array_values(array_filter($this->calls,
|
|
94
|
+
fn(array $c) => !$this->istoken((string)$c['url'])));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public function token(): array
|
|
98
|
+
{
|
|
99
|
+
return array_values(array_filter($this->calls,
|
|
100
|
+
fn(array $c) => $this->istoken((string)$c['url'])));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private function istoken(string $url): bool
|
|
104
|
+
{
|
|
105
|
+
return str_ends_with($url, '/' . $this->tokenpath);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
class ProjectNameSecretsTest extends TestCase
|
|
110
|
+
{
|
|
111
|
+
// The env-var base for this SDK, as every other generated env var
|
|
112
|
+
// spells it.
|
|
113
|
+
private const ENVPREFIX = 'PROJECTENV_TEST_SECRETS_';
|
|
114
|
+
|
|
115
|
+
/** @var array<int,string> */
|
|
116
|
+
private array $touched = [];
|
|
117
|
+
|
|
118
|
+
protected function tearDown(): void
|
|
119
|
+
{
|
|
120
|
+
foreach ($this->touched as $name) {
|
|
121
|
+
putenv(self::ENVPREFIX . $name);
|
|
122
|
+
}
|
|
123
|
+
$this->touched = [];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private function setenv(string $name, string $value): void
|
|
127
|
+
{
|
|
128
|
+
$this->touched[] = $name;
|
|
129
|
+
putenv(self::ENVPREFIX . $name . '=' . $value);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private function clearenv(string $name): void
|
|
133
|
+
{
|
|
134
|
+
$this->touched[] = $name;
|
|
135
|
+
putenv(self::ENVPREFIX . $name);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// -----------------------------------------------------------------
|
|
139
|
+
// Support.
|
|
140
|
+
|
|
141
|
+
// The Authorization header carries the SPEC's credential prefix, which
|
|
142
|
+
// a TEMPLATE cannot know - so assert on the CREDENTIAL and let the
|
|
143
|
+
// prefix be whatever this SDK's API declares.
|
|
144
|
+
private function assertCredential(mixed $header, string $token): void
|
|
145
|
+
{
|
|
146
|
+
$ok = $header === $token
|
|
147
|
+
|| (is_string($header) && str_ends_with($header, ' ' . $token));
|
|
148
|
+
$this->assertTrue($ok,
|
|
149
|
+
'expected the authorization header to carry ' . $token .
|
|
150
|
+
', got: ' . var_export($header, true));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private function secretsFeatureOf($client): ?ProjectNameSecretsFeature
|
|
154
|
+
{
|
|
155
|
+
foreach ($client->features as $f) {
|
|
156
|
+
if ($f instanceof ProjectNameSecretsFeature) {
|
|
157
|
+
return $f;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Construct the client and ADOPT the feature via `extend` ONLY when the
|
|
164
|
+
// generated config did not already install it - when this SDK was
|
|
165
|
+
// generated with `secrets` model-active, the ordinary factory path
|
|
166
|
+
// builds the instance, and adding a second via extend would DOUBLE the
|
|
167
|
+
// feature: two transport wraps, two resolutions, and a token purchase
|
|
168
|
+
// the assertions cannot account for. (go's withSecrets, py's
|
|
169
|
+
// _has_feature and rb's with_secrets guard the same way.)
|
|
170
|
+
private function withSecrets(callable $build)
|
|
171
|
+
{
|
|
172
|
+
$client = $build(false);
|
|
173
|
+
if ($this->secretsFeatureOf($client) === null) {
|
|
174
|
+
$client = $build(true);
|
|
175
|
+
}
|
|
176
|
+
return $client;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** @return array<string,mixed> */
|
|
180
|
+
private function secretsOpts(array $extra = []): array
|
|
181
|
+
{
|
|
182
|
+
$fopts = array_merge([
|
|
183
|
+
'active' => true,
|
|
184
|
+
'providers' => [['kind' => 'env', 'prefix' => self::ENVPREFIX]],
|
|
185
|
+
], $extra);
|
|
186
|
+
return ['secrets' => $fopts];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// A LIVE client carrying the secrets feature, wired to the recorder.
|
|
190
|
+
private function secretsClient(ProjectNameSecretsWire $wire, array $sdkopts = [])
|
|
191
|
+
{
|
|
192
|
+
$opts = array_merge([
|
|
193
|
+
'base' => 'http://secrets.test/api',
|
|
194
|
+
'system' => ['fetch' => $wire->fetch()],
|
|
195
|
+
], $sdkopts);
|
|
196
|
+
|
|
197
|
+
return $this->withSecrets(function (bool $adopt) use ($opts) {
|
|
198
|
+
if ($adopt) {
|
|
199
|
+
$opts['extend'] = [new ProjectNameSecretsFeature()];
|
|
200
|
+
}
|
|
201
|
+
return new ProjectNameSDK($opts);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// A custom provider, as php's option pipeline can carry one: an ARRAY
|
|
206
|
+
// OF CALLABLES. `Struct::clone` flattens a class instance to a stdClass
|
|
207
|
+
// (its methods lost) but leaves closures alone, so this is the shape a
|
|
208
|
+
// provider written in code must take - the exact parallel of the ts
|
|
209
|
+
// object literal, and py's `_LiveProvider` contract.
|
|
210
|
+
private function customProvider(callable $lookup, ?callable $describe = null): array
|
|
211
|
+
{
|
|
212
|
+
$spec = ['lookup' => $lookup];
|
|
213
|
+
if ($describe !== null) {
|
|
214
|
+
$spec['describe'] = $describe;
|
|
215
|
+
}
|
|
216
|
+
return $spec;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// The entity accessors this SDK generated ($client->Moon(),
|
|
220
|
+
// $client->Planet(), ...). Read off the class rather than from a name
|
|
221
|
+
// convention: this file is a TEMPLATE and no project's entity names are
|
|
222
|
+
// known here.
|
|
223
|
+
private function entityAccessors($client): array
|
|
224
|
+
{
|
|
225
|
+
$out = [];
|
|
226
|
+
$rc = new \ReflectionClass($client);
|
|
227
|
+
foreach ($rc->getMethods(\ReflectionMethod::IS_PUBLIC) as $m) {
|
|
228
|
+
if ($m->isStatic() || $m->isConstructor()) {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
if (1 === preg_match('/^[A-Z]/', $m->getName())) {
|
|
232
|
+
$out[] = $m->getName();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return $out;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Perform real entity operations until `stop` reports the observable
|
|
239
|
+
// state the test is waiting for. Each op's own outcome is irrelevant (no
|
|
240
|
+
// seeded data, a scripted response); an op the API does not define fails
|
|
241
|
+
// before it reaches the transport, which is why several may need
|
|
242
|
+
// driving.
|
|
243
|
+
private function driveUntil($client, string $what, callable $stop): void
|
|
244
|
+
{
|
|
245
|
+
foreach ($this->entityAccessors($client) as $accessor) {
|
|
246
|
+
try {
|
|
247
|
+
$ent = $client->$accessor();
|
|
248
|
+
} catch (\Throwable $e) {
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
foreach (['list', 'load'] as $opname) {
|
|
252
|
+
if (!method_exists($ent, $opname)) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
$ent->$opname();
|
|
257
|
+
} catch (\Throwable $e) {
|
|
258
|
+
// The op's own failure is not the assertion.
|
|
259
|
+
}
|
|
260
|
+
if ($stop()) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
$this->fail('no entity operation ' . $what . ' - nothing to assert on');
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Drive ops until one request reached the recorder.
|
|
269
|
+
private function driveOp($client, ProjectNameSecretsWire $wire): void
|
|
270
|
+
{
|
|
271
|
+
$before = count($wire->api());
|
|
272
|
+
$this->driveUntil($client, 'reached the transport',
|
|
273
|
+
fn() => $before < count($wire->api()));
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// -----------------------------------------------------------------
|
|
277
|
+
// The feature-inactive baseline: bit-identical behaviour.
|
|
278
|
+
|
|
279
|
+
public function testInactiveApikeyOptionBehavesExactlyAsBefore(): void
|
|
280
|
+
{
|
|
281
|
+
$client = ProjectNameSDK::test(null, ['apikey' => 'OPTKEY01']);
|
|
282
|
+
$fetchdef = $client->prepare(['path' => '/']);
|
|
283
|
+
$this->assertCredential($fetchdef['headers']['authorization'] ?? null, 'OPTKEY01');
|
|
284
|
+
|
|
285
|
+
$this->assertNull($this->secretsFeatureOf($client),
|
|
286
|
+
'no activation and no extend: the feature must not be installed');
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
public function testInactiveNoApikeyMeansNoAuthorizationHeader(): void
|
|
290
|
+
{
|
|
291
|
+
$client = ProjectNameSDK::test(null, null);
|
|
292
|
+
$fetchdef = $client->prepare(['path' => '/']);
|
|
293
|
+
$this->assertArrayNotHasKey('authorization', $fetchdef['headers']);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// -----------------------------------------------------------------
|
|
297
|
+
// Active: the provider chain, driven through real entity operations.
|
|
298
|
+
|
|
299
|
+
public function testApikeyOptionStillWinsOverTheChain(): void
|
|
300
|
+
{
|
|
301
|
+
$this->setenv('APIKEY', 'ENVKEY01');
|
|
302
|
+
$wire = new ProjectNameSecretsWire();
|
|
303
|
+
$client = $this->secretsClient($wire, [
|
|
304
|
+
'apikey' => 'OPTKEY01',
|
|
305
|
+
'feature' => $this->secretsOpts(),
|
|
306
|
+
]);
|
|
307
|
+
|
|
308
|
+
$this->driveOp($client, $wire);
|
|
309
|
+
$this->assertCredential($wire->api()[0]['auth'], 'OPTKEY01');
|
|
310
|
+
|
|
311
|
+
// The explicit option is a real store, not a special case: a
|
|
312
|
+
// directed read names it like any other.
|
|
313
|
+
$feature = $this->secretsFeatureOf($client);
|
|
314
|
+
$this->assertNotNull($feature, 'the extend seam did not install the feature');
|
|
315
|
+
$this->assertSame('OPTKEY01', $feature->sekreto()->getfrom('options', 'apikey'));
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
public function testAnOmittedApikeyDefersToTheChainAtTheTransportSeam(): void
|
|
319
|
+
{
|
|
320
|
+
$this->setenv('APIKEY', 'ENVKEY02');
|
|
321
|
+
$wire = new ProjectNameSecretsWire();
|
|
322
|
+
$client = $this->secretsClient($wire, ['feature' => $this->secretsOpts()]);
|
|
323
|
+
|
|
324
|
+
// Before any op, nothing has been resolved.
|
|
325
|
+
$this->assertSame('', $client->options_map()['apikey']);
|
|
326
|
+
|
|
327
|
+
$this->driveOp($client, $wire);
|
|
328
|
+
|
|
329
|
+
// Resolution happens AT THE TRANSPORT - the one seam every wire path
|
|
330
|
+
// crosses - so the credential is ON THE WIRE, not merely resolved.
|
|
331
|
+
$this->assertCredential($wire->api()[0]['auth'], 'ENVKEY02');
|
|
332
|
+
$this->assertSame('ENVKEY02', $this->secretsFeatureOf($client)->credential());
|
|
333
|
+
|
|
334
|
+
// FEATURE STATE is the credential's only home. The options map -
|
|
335
|
+
// which `options_map()` hands to any caller, which every concurrent
|
|
336
|
+
// operation reads, and which a debug or audit feature may print -
|
|
337
|
+
// must be exactly as the caller left it: a vault secret has no
|
|
338
|
+
// business there. (go's `cred` field, secrets_feature.go, for the
|
|
339
|
+
// same reason.) The consequence is deliberate and documented: a
|
|
340
|
+
// chain-resolved credential is not visible to `prepare(...)`, which
|
|
341
|
+
// reports the OPTIONS. Publication cannot fix that anyway - nothing
|
|
342
|
+
// is resolved until a request crosses the transport, so the FIRST
|
|
343
|
+
// prepare() is unauthenticated either way, and with a broken chain
|
|
344
|
+
// publication yields a request carrying neither a credential nor an
|
|
345
|
+
// error.
|
|
346
|
+
$this->assertSame('', $client->options_map()['apikey'],
|
|
347
|
+
'the chain credential must never be written into the client options');
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// The same pin where it matters most: `auth: null` is the caller saying
|
|
351
|
+
// NO credential may be sent. Nothing goes on the wire - and nothing is
|
|
352
|
+
// parked in the options map either, where it would outlive the request
|
|
353
|
+
// and reach every reader of options_map().
|
|
354
|
+
public function testTheChainCredentialIsNeverParkedInTheOptionsMap(): void
|
|
355
|
+
{
|
|
356
|
+
$this->setenv('APIKEY', 'SHOULD_NOT_SEND');
|
|
357
|
+
$wire = new ProjectNameSecretsWire();
|
|
358
|
+
$client = $this->secretsClient($wire, [
|
|
359
|
+
'auth' => null,
|
|
360
|
+
'feature' => $this->secretsOpts(),
|
|
361
|
+
]);
|
|
362
|
+
|
|
363
|
+
$this->driveOp($client, $wire);
|
|
364
|
+
|
|
365
|
+
$this->assertFalse($wire->api()[0]['has'],
|
|
366
|
+
'auth null must suppress the credential, got ' .
|
|
367
|
+
var_export($wire->api()[0]['auth'], true));
|
|
368
|
+
$this->assertSame('', $client->options_map()['apikey'],
|
|
369
|
+
'the suppressed secret was parked in the client options');
|
|
370
|
+
|
|
371
|
+
// Nor may it surface through the fetchdef prepare() builds.
|
|
372
|
+
$fetchdef = $client->prepare(['path' => '/']);
|
|
373
|
+
$this->assertArrayNotHasKey('authorization', $fetchdef['headers']);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
public function testCustomProvidersAreAcceptedVerbatim(): void
|
|
377
|
+
{
|
|
378
|
+
$asked = [];
|
|
379
|
+
$wire = new ProjectNameSecretsWire();
|
|
380
|
+
$client = $this->secretsClient($wire, [
|
|
381
|
+
'feature' => ['secrets' => [
|
|
382
|
+
'active' => true,
|
|
383
|
+
'providers' => [$this->customProvider(
|
|
384
|
+
function (string $name) use (&$asked) {
|
|
385
|
+
$asked[] = $name;
|
|
386
|
+
return 'CUSTOM01';
|
|
387
|
+
})],
|
|
388
|
+
]],
|
|
389
|
+
]);
|
|
390
|
+
|
|
391
|
+
$this->driveOp($client, $wire);
|
|
392
|
+
$this->assertCredential($wire->api()[0]['auth'], 'CUSTOM01');
|
|
393
|
+
$this->assertSame('apikey', $asked[0]);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// php cannot carry a provider CLASS INSTANCE through the option
|
|
397
|
+
// pipeline: `Struct::clone` flattens any object to a stdClass and its
|
|
398
|
+
// methods are lost. That must be a loud, directive failure rather than
|
|
399
|
+
// a chain that silently resolves nothing - and, being a failure, it
|
|
400
|
+
// must fail CLOSED.
|
|
401
|
+
public function testAProviderObjectIsRefusedWithAnActionableError(): void
|
|
402
|
+
{
|
|
403
|
+
$wire = new ProjectNameSecretsWire();
|
|
404
|
+
$client = $this->secretsClient($wire, [
|
|
405
|
+
'feature' => ['secrets' => [
|
|
406
|
+
'active' => true,
|
|
407
|
+
'providers' => [new \stdClass()],
|
|
408
|
+
]],
|
|
409
|
+
]);
|
|
410
|
+
|
|
411
|
+
$res = $client->direct(['path' => '/probe']);
|
|
412
|
+
$this->assertFalse($res['ok'], 'a broken chain must refuse the request');
|
|
413
|
+
$this->assertStringContainsString(
|
|
414
|
+
'A provider OBJECT cannot reach this feature', (string)$res['err']);
|
|
415
|
+
$this->assertCount(0, $wire->calls);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
public function testAMissEverywhereLeavesTheHeaderOff(): void
|
|
419
|
+
{
|
|
420
|
+
$this->clearenv('APIKEY');
|
|
421
|
+
$wire = new ProjectNameSecretsWire();
|
|
422
|
+
$client = $this->secretsClient($wire, ['feature' => $this->secretsOpts()]);
|
|
423
|
+
|
|
424
|
+
$this->driveOp($client, $wire);
|
|
425
|
+
$this->assertFalse($wire->api()[0]['has'],
|
|
426
|
+
'a chain MISS must fall through to an unauthenticated request, got ' .
|
|
427
|
+
var_export($wire->api()[0]['auth'], true));
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
public function testAProviderErrorFailsTheOpAndNothingReachesTheWire(): void
|
|
431
|
+
{
|
|
432
|
+
$asked = false;
|
|
433
|
+
$wire = new ProjectNameSecretsWire();
|
|
434
|
+
$client = $this->secretsClient($wire, [
|
|
435
|
+
'feature' => ['secrets' => [
|
|
436
|
+
'active' => true,
|
|
437
|
+
'providers' => [$this->customProvider(
|
|
438
|
+
function (string $_name) use (&$asked) {
|
|
439
|
+
$asked = true;
|
|
440
|
+
throw new \Voxgig\Sekreto\SekretoError('vault unreachable');
|
|
441
|
+
})],
|
|
442
|
+
]],
|
|
443
|
+
]);
|
|
444
|
+
|
|
445
|
+
// A full closure, not an arrow function: `fn()` captures by VALUE at
|
|
446
|
+
// creation, so an arrow function here would keep reading the `false`
|
|
447
|
+
// the flag held before any provider ran, and the drive would give up
|
|
448
|
+
// without ever noticing the chain had been consulted.
|
|
449
|
+
$this->driveUntil($client, 'consulted the chain',
|
|
450
|
+
function () use (&$asked) { return $asked; });
|
|
451
|
+
|
|
452
|
+
$this->assertCount(0, $wire->api(),
|
|
453
|
+
'a broken vault must never yield a request');
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// The entity pipeline turns the refusal into a thrown SDK error
|
|
457
|
+
// carrying the feature's own code - never a silent unauthenticated
|
|
458
|
+
// send.
|
|
459
|
+
public function testAProviderErrorThrowsAnSdkErrorOnTheEntityPath(): void
|
|
460
|
+
{
|
|
461
|
+
$wire = new ProjectNameSecretsWire();
|
|
462
|
+
$client = $this->secretsClient($wire, [
|
|
463
|
+
'feature' => ['secrets' => [
|
|
464
|
+
'active' => true,
|
|
465
|
+
'providers' => [$this->customProvider(
|
|
466
|
+
function (string $_name) {
|
|
467
|
+
throw new \Voxgig\Sekreto\SekretoError('vault unreachable');
|
|
468
|
+
})],
|
|
469
|
+
]],
|
|
470
|
+
]);
|
|
471
|
+
|
|
472
|
+
$accessor = $this->entityAccessors($client)[0] ?? null;
|
|
473
|
+
$this->assertNotNull($accessor, 'no entity accessor - nothing to assert on');
|
|
474
|
+
|
|
475
|
+
$caught = null;
|
|
476
|
+
try {
|
|
477
|
+
$client->$accessor()->list();
|
|
478
|
+
} catch (ProjectNameError $e) {
|
|
479
|
+
$caught = $e;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
$this->assertNotNull($caught, 'the entity path must fail closed');
|
|
483
|
+
$this->assertStringContainsString('vault unreachable', $caught->msg);
|
|
484
|
+
$this->assertCount(0, $wire->api());
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// MISS vs ERROR, the invariant the whole feature is worth having for,
|
|
488
|
+
// asserted as a PAIR on the same two-provider chain: a store that does
|
|
489
|
+
// not hold the secret falls through to the next one...
|
|
490
|
+
public function testAMissFallsThroughToTheNextProvider(): void
|
|
491
|
+
{
|
|
492
|
+
$this->setenv('APIKEY', 'ENVKEY04');
|
|
493
|
+
$asked = false;
|
|
494
|
+
$wire = new ProjectNameSecretsWire();
|
|
495
|
+
$client = $this->secretsClient($wire, [
|
|
496
|
+
'feature' => ['secrets' => [
|
|
497
|
+
'active' => true,
|
|
498
|
+
'providers' => [
|
|
499
|
+
$this->customProvider(function (string $_name) use (&$asked) {
|
|
500
|
+
$asked = true;
|
|
501
|
+
return null;
|
|
502
|
+
}),
|
|
503
|
+
['kind' => 'env', 'prefix' => self::ENVPREFIX],
|
|
504
|
+
],
|
|
505
|
+
]],
|
|
506
|
+
]);
|
|
507
|
+
|
|
508
|
+
$this->driveOp($client, $wire);
|
|
509
|
+
$this->assertTrue($asked, 'the first provider was never consulted');
|
|
510
|
+
$this->assertCredential($wire->api()[0]['auth'], 'ENVKEY04');
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// ...while a store that COULD NOT ANSWER fails the operation, even
|
|
514
|
+
// though the very next provider in the chain holds the secret. A broken
|
|
515
|
+
// vault never degrades into an unauthenticated - or a
|
|
516
|
+
// differently-authenticated - request.
|
|
517
|
+
public function testAnErrorFailsTheOpEvenThoughALaterProviderHasTheSecret(): void
|
|
518
|
+
{
|
|
519
|
+
$this->setenv('APIKEY', 'ENVKEY05');
|
|
520
|
+
$wire = new ProjectNameSecretsWire();
|
|
521
|
+
$client = $this->secretsClient($wire, [
|
|
522
|
+
'feature' => ['secrets' => [
|
|
523
|
+
'active' => true,
|
|
524
|
+
'providers' => [
|
|
525
|
+
$this->customProvider(function (string $_name) {
|
|
526
|
+
throw new \Voxgig\Sekreto\SekretoError('vault unreachable');
|
|
527
|
+
}),
|
|
528
|
+
['kind' => 'env', 'prefix' => self::ENVPREFIX],
|
|
529
|
+
],
|
|
530
|
+
]],
|
|
531
|
+
]);
|
|
532
|
+
|
|
533
|
+
$res = $client->direct(['path' => '/probe']);
|
|
534
|
+
$this->assertFalse($res['ok'], 'an ERROR must not fall through to the next provider');
|
|
535
|
+
$this->assertSame('secrets_provider', $res['err']->sdk_code);
|
|
536
|
+
$this->assertCount(0, $wire->calls);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
public function testAProviderRecoversAfterATransientFailure(): void
|
|
540
|
+
{
|
|
541
|
+
$calls = 0;
|
|
542
|
+
$wire = new ProjectNameSecretsWire();
|
|
543
|
+
$client = $this->secretsClient($wire, [
|
|
544
|
+
'feature' => ['secrets' => [
|
|
545
|
+
'active' => true,
|
|
546
|
+
'providers' => [$this->customProvider(
|
|
547
|
+
function (string $_name) use (&$calls) {
|
|
548
|
+
$calls++;
|
|
549
|
+
if (1 === $calls) {
|
|
550
|
+
throw new \Voxgig\Sekreto\SekretoError('vault unreachable');
|
|
551
|
+
}
|
|
552
|
+
return 'RECOVERED01';
|
|
553
|
+
})],
|
|
554
|
+
]],
|
|
555
|
+
]);
|
|
556
|
+
|
|
557
|
+
// The first op fails closed; a failed resolution is never cached, so
|
|
558
|
+
// the next op asks the chain again and succeeds.
|
|
559
|
+
$this->driveUntil($client, 'consulted the chain',
|
|
560
|
+
function () use (&$calls) { return 0 < $calls; });
|
|
561
|
+
$this->assertCount(0, $wire->api(), 'the first op must not reach the wire');
|
|
562
|
+
|
|
563
|
+
$this->driveOp($client, $wire);
|
|
564
|
+
$this->assertCredential($wire->api()[0]['auth'], 'RECOVERED01');
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// With `cache: false`, a provider that answered once and then reports a
|
|
568
|
+
// MISS (a revoked secret) must RETRACT the credential: nothing the
|
|
569
|
+
// feature resolved may keep going out on the wire.
|
|
570
|
+
public function testAnUncachedMissRetractsTheCredential(): void
|
|
571
|
+
{
|
|
572
|
+
$have = true;
|
|
573
|
+
$wire = new ProjectNameSecretsWire();
|
|
574
|
+
$client = $this->secretsClient($wire, [
|
|
575
|
+
'feature' => ['secrets' => [
|
|
576
|
+
'active' => true,
|
|
577
|
+
'cache' => false,
|
|
578
|
+
'providers' => [$this->customProvider(
|
|
579
|
+
function (string $_name) use (&$have) {
|
|
580
|
+
return $have ? 'REVOCABLE01' : null;
|
|
581
|
+
})],
|
|
582
|
+
]],
|
|
583
|
+
]);
|
|
584
|
+
|
|
585
|
+
$this->driveOp($client, $wire);
|
|
586
|
+
$this->assertCredential($wire->api()[0]['auth'], 'REVOCABLE01');
|
|
587
|
+
|
|
588
|
+
$have = false;
|
|
589
|
+
|
|
590
|
+
$this->driveOp($client, $wire);
|
|
591
|
+
$api = $wire->api();
|
|
592
|
+
$last = $api[count($api) - 1];
|
|
593
|
+
$this->assertFalse($last['has'] && '' !== (string)$last['auth'],
|
|
594
|
+
'after the chain reports a miss the retracted credential must not go out; ' .
|
|
595
|
+
'the wire saw ' . var_export($last['auth'], true));
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
public function testAuthNullSuppressesTheCredentialChainOrNoChain(): void
|
|
599
|
+
{
|
|
600
|
+
$this->setenv('APIKEY', 'ENVKEY03');
|
|
601
|
+
$wire = new ProjectNameSecretsWire();
|
|
602
|
+
$client = $this->secretsClient($wire, [
|
|
603
|
+
'auth' => null,
|
|
604
|
+
'apikey' => 'OPTKEY01',
|
|
605
|
+
'feature' => $this->secretsOpts(),
|
|
606
|
+
]);
|
|
607
|
+
|
|
608
|
+
$this->driveOp($client, $wire);
|
|
609
|
+
|
|
610
|
+
$this->assertFalse($wire->api()[0]['has'],
|
|
611
|
+
'auth null must suppress the credential, got ' .
|
|
612
|
+
var_export($wire->api()[0]['auth'], true));
|
|
613
|
+
|
|
614
|
+
// The suppression survives option validation rather than being
|
|
615
|
+
// replaced by the optspec's default auth map.
|
|
616
|
+
$opts = $client->options_map();
|
|
617
|
+
$this->assertTrue(array_key_exists('auth', $opts),
|
|
618
|
+
'options.auth must stay a present null');
|
|
619
|
+
$this->assertNull($opts['auth']);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// -----------------------------------------------------------------
|
|
623
|
+
// The RAW paths - direct and graphql - run no feature hooks at all, so
|
|
624
|
+
// for them the transport seam is the ONLY place resolution can happen.
|
|
625
|
+
|
|
626
|
+
public function testDirectCarriesTheChainCredentialAndFailsClosed(): void
|
|
627
|
+
{
|
|
628
|
+
$this->setenv('APIKEY', 'DIRECTKEY01');
|
|
629
|
+
$wire = new ProjectNameSecretsWire();
|
|
630
|
+
$client = $this->secretsClient($wire, ['feature' => $this->secretsOpts()]);
|
|
631
|
+
|
|
632
|
+
$res = $client->direct(['path' => '/direct-probe']);
|
|
633
|
+
$this->assertTrue($res['ok'], 'direct refused');
|
|
634
|
+
$this->assertCount(1, $wire->api());
|
|
635
|
+
$this->assertCredential($wire->api()[0]['auth'], 'DIRECTKEY01');
|
|
636
|
+
|
|
637
|
+
// And fail-closed holds for raw access too: a broken chain refuses
|
|
638
|
+
// the direct call before anything reaches the wire.
|
|
639
|
+
$brokenwire = new ProjectNameSecretsWire();
|
|
640
|
+
$broken = $this->secretsClient($brokenwire, [
|
|
641
|
+
'feature' => ['secrets' => [
|
|
642
|
+
'active' => true,
|
|
643
|
+
'providers' => [$this->customProvider(function (string $_name) {
|
|
644
|
+
throw new \Voxgig\Sekreto\SekretoError('vault unreachable');
|
|
645
|
+
})],
|
|
646
|
+
]],
|
|
647
|
+
]);
|
|
648
|
+
|
|
649
|
+
$res = $broken->direct(['path' => '/direct-probe']);
|
|
650
|
+
$this->assertFalse($res['ok'], 'a broken chain must refuse the raw path fail-closed');
|
|
651
|
+
$this->assertSame('secrets_provider', $res['err']->sdk_code);
|
|
652
|
+
$this->assertCount(0, $brokenwire->calls,
|
|
653
|
+
'a broken vault must never yield a request on the raw path');
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
public function testGraphqlCarriesTheChainCredentialAndFailsClosed(): void
|
|
657
|
+
{
|
|
658
|
+
$this->setenv('APIKEY', 'GQLKEY01');
|
|
659
|
+
$wire = new ProjectNameSecretsWire();
|
|
660
|
+
$client = $this->secretsClient($wire, ['feature' => $this->secretsOpts()]);
|
|
661
|
+
|
|
662
|
+
$client->graphql('{ probe }');
|
|
663
|
+
$this->assertCount(1, $wire->api());
|
|
664
|
+
$this->assertCredential($wire->api()[0]['auth'], 'GQLKEY01');
|
|
665
|
+
|
|
666
|
+
$brokenwire = new ProjectNameSecretsWire();
|
|
667
|
+
$broken = $this->secretsClient($brokenwire, [
|
|
668
|
+
'feature' => ['secrets' => [
|
|
669
|
+
'active' => true,
|
|
670
|
+
'providers' => [$this->customProvider(function (string $_name) {
|
|
671
|
+
throw new \Voxgig\Sekreto\SekretoError('vault unreachable');
|
|
672
|
+
})],
|
|
673
|
+
]],
|
|
674
|
+
]);
|
|
675
|
+
|
|
676
|
+
$res = $broken->graphql('{ probe }');
|
|
677
|
+
$this->assertFalse($res['ok'], 'a broken chain must refuse graphql fail-closed');
|
|
678
|
+
$this->assertCount(0, $brokenwire->calls);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
// -----------------------------------------------------------------
|
|
682
|
+
// The access-token exchange.
|
|
683
|
+
|
|
684
|
+
public function testTheRefreshTokenBuysAnAccessTokenAndASpentOneIsReboughtOnce(): void
|
|
685
|
+
{
|
|
686
|
+
$this->setenv('REFRESH_TOKEN', 'REFRESH01');
|
|
687
|
+
$wire = new ProjectNameSecretsWire();
|
|
688
|
+
// First API call is refused, the retry succeeds.
|
|
689
|
+
$wire->apistatus = [401, 200];
|
|
690
|
+
|
|
691
|
+
$client = $this->secretsClient($wire, [
|
|
692
|
+
'feature' => $this->secretsOpts([
|
|
693
|
+
'name' => 'refresh_token',
|
|
694
|
+
'exchange' => ['active' => true],
|
|
695
|
+
]),
|
|
696
|
+
]);
|
|
697
|
+
|
|
698
|
+
$this->driveOp($client, $wire);
|
|
699
|
+
|
|
700
|
+
$this->assertCount(2, $wire->token(),
|
|
701
|
+
'expected the initial purchase plus one rebuy');
|
|
702
|
+
$this->assertStringContainsString('REFRESH01', (string)$wire->token()[0]['body']);
|
|
703
|
+
|
|
704
|
+
$api = $wire->api();
|
|
705
|
+
$this->assertCount(2, $api, 'expected the request to be retried exactly once');
|
|
706
|
+
$this->assertCredential($api[0]['auth'], 'ACCESS01');
|
|
707
|
+
// The retry must carry the NEW token, not the spent one.
|
|
708
|
+
$this->assertCredential($api[1]['auth'], 'ACCESS02');
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
// A second refusal on a token bought moments ago is a real failure, not
|
|
712
|
+
// a spin: exactly one rebuy, and the refusal is returned as it stands.
|
|
713
|
+
public function testASecondRefusalIsReturnedAsIs(): void
|
|
714
|
+
{
|
|
715
|
+
$this->setenv('REFRESH_TOKEN', 'REFRESH01');
|
|
716
|
+
$wire = new ProjectNameSecretsWire();
|
|
717
|
+
$wire->apistatus = [401];
|
|
718
|
+
|
|
719
|
+
$client = $this->secretsClient($wire, [
|
|
720
|
+
'feature' => $this->secretsOpts([
|
|
721
|
+
'name' => 'refresh_token',
|
|
722
|
+
'exchange' => ['active' => true],
|
|
723
|
+
]),
|
|
724
|
+
]);
|
|
725
|
+
|
|
726
|
+
$this->driveOp($client, $wire);
|
|
727
|
+
|
|
728
|
+
$this->assertCount(2, $wire->api(), 'one attempt plus one retry, no more');
|
|
729
|
+
$this->assertCount(2, $wire->token());
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
// Test mode buys nothing and needs no token endpoint, so an offline
|
|
733
|
+
// suite never makes the one HTTP call the test mock cannot stop.
|
|
734
|
+
public function testTestModeBuysNothingAndNeedsNoTokenEndpoint(): void
|
|
735
|
+
{
|
|
736
|
+
$this->setenv('REFRESH_TOKEN', 'REFRESH01');
|
|
737
|
+
$wire = new ProjectNameSecretsWire();
|
|
738
|
+
|
|
739
|
+
$client = $this->withSecrets(function (bool $adopt) use ($wire) {
|
|
740
|
+
$opts = [
|
|
741
|
+
'system' => ['fetch' => $wire->fetch()],
|
|
742
|
+
'feature' => $this->secretsOpts([
|
|
743
|
+
'name' => 'refresh_token',
|
|
744
|
+
'exchange' => ['active' => true],
|
|
745
|
+
]),
|
|
746
|
+
];
|
|
747
|
+
if ($adopt) {
|
|
748
|
+
$opts['extend'] = [new ProjectNameSecretsFeature()];
|
|
749
|
+
}
|
|
750
|
+
return ProjectNameSDK::test(null, $opts);
|
|
751
|
+
});
|
|
752
|
+
|
|
753
|
+
$this->driveUntil($client, 'resolved the fake token',
|
|
754
|
+
fn() => '' !== $this->secretsFeatureOf($client)->credential());
|
|
755
|
+
|
|
756
|
+
$this->assertCount(0, $wire->calls, 'test mode must not do IO');
|
|
757
|
+
// A deterministic placeholder, so offline suites need no
|
|
758
|
+
// configuration.
|
|
759
|
+
$this->assertSame('test-access_token',
|
|
760
|
+
$this->secretsFeatureOf($client)->credential());
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// A failed PURCHASE answers with the API's own refusal, not the
|
|
764
|
+
// exchange error: the caller asked for data, and the 401 is the more
|
|
765
|
+
// useful of the two.
|
|
766
|
+
public function testAFailedPurchaseAnswersWithTheApisOwnRefusal(): void
|
|
767
|
+
{
|
|
768
|
+
$this->clearenv('REFRESH_TOKEN');
|
|
769
|
+
$wire = new ProjectNameSecretsWire();
|
|
770
|
+
$wire->apistatus = [401];
|
|
771
|
+
|
|
772
|
+
$client = $this->secretsClient($wire, [
|
|
773
|
+
'apikey' => 'STALE01',
|
|
774
|
+
'feature' => $this->secretsOpts([
|
|
775
|
+
'name' => 'refresh_token',
|
|
776
|
+
'exchange' => ['active' => true],
|
|
777
|
+
]),
|
|
778
|
+
]);
|
|
779
|
+
|
|
780
|
+
$res = $client->direct(['path' => '/probe']);
|
|
781
|
+
|
|
782
|
+
// 401 from the API, surfaced as the raw path's ok:false - not a
|
|
783
|
+
// token exchange error.
|
|
784
|
+
$this->assertFalse($res['ok']);
|
|
785
|
+
$this->assertSame(401, $res['status']);
|
|
786
|
+
$this->assertCount(1, $wire->api());
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// The exchange with NO system.fetch: the raw fallback transport carries
|
|
790
|
+
// the purchase end to end over REAL HTTP, and the body is ENCODED - a
|
|
791
|
+
// refresh token full of JSON-hostile characters must arrive as that
|
|
792
|
+
// literal value.
|
|
793
|
+
// IN ITS OWN PROCESS, and this is the one lane that needs it. It is the
|
|
794
|
+
// only test in the suite that reaches the SDK's DEFAULT transport (no
|
|
795
|
+
// system.fetch anywhere - that is the point), and Fetcher::call decides
|
|
796
|
+
// "no fetcher was supplied" by asking whether `system.fetch` is an empty
|
|
797
|
+
// stdClass. The struct corpus suite that runs earlier in the same
|
|
798
|
+
// process writes a property onto Struct's shared UNDEF sentinel - the
|
|
799
|
+
// very object a missing path resolves to - so that check then answers
|
|
800
|
+
// "not a valid function" for every default-transport request in the
|
|
801
|
+
// process. A fresh process has a clean sentinel. See the followups: the
|
|
802
|
+
// fix belongs in Struct::setprop, which must refuse to write to its own
|
|
803
|
+
// sentinel, not here.
|
|
804
|
+
#[\PHPUnit\Framework\Attributes\RunInSeparateProcess]
|
|
805
|
+
#[\PHPUnit\Framework\Attributes\PreserveGlobalState(false)]
|
|
806
|
+
public function testTheExchangeWorksWithOrdinaryOptionsAndEncodesItsBody(): void
|
|
807
|
+
{
|
|
808
|
+
$tricky = "re\"fresh\\to\nken";
|
|
809
|
+
|
|
810
|
+
$stub = new ProjectNameSecretsHttpStub();
|
|
811
|
+
$port = $stub->start();
|
|
812
|
+
if (0 === $port) {
|
|
813
|
+
$this->markTestSkipped('could not start the local HTTP stub');
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
try {
|
|
817
|
+
$client = $this->withSecrets(function (bool $adopt) use ($port, $tricky) {
|
|
818
|
+
$opts = [
|
|
819
|
+
'base' => 'http://127.0.0.1:' . $port . '/api',
|
|
820
|
+
'feature' => ['secrets' => [
|
|
821
|
+
'active' => true,
|
|
822
|
+
'name' => 'refresh_token',
|
|
823
|
+
'exchange' => ['active' => true, 'refresh' => $tricky],
|
|
824
|
+
]],
|
|
825
|
+
];
|
|
826
|
+
if ($adopt) {
|
|
827
|
+
$opts['extend'] = [new ProjectNameSecretsFeature()];
|
|
828
|
+
}
|
|
829
|
+
return new ProjectNameSDK($opts);
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
// No system.fetch anywhere: the API call takes the SDK's default
|
|
833
|
+
// transport and the token purchase takes the feature's raw
|
|
834
|
+
// fallback.
|
|
835
|
+
$res = $client->direct(['path' => '/probe']);
|
|
836
|
+
$this->assertTrue($res['ok'], 'the raw fallback exchange failed');
|
|
837
|
+
} finally {
|
|
838
|
+
$stub->stop();
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
$this->assertSame($tricky, $stub->refresh(),
|
|
842
|
+
'the refresh token must arrive as its literal value (encoded, not concatenated)');
|
|
843
|
+
$this->assertCredential($stub->auth(), 'RAWTOK01');
|
|
844
|
+
|
|
845
|
+
// stop() must leave NOTHING behind. This is asserted, not assumed:
|
|
846
|
+
// a child spawned through a shell survives proc_terminate as an
|
|
847
|
+
// orphan that holds the port for the rest of the machine's life -
|
|
848
|
+
// and, because it inherits the run's own descriptors, holds a
|
|
849
|
+
// captured pipe open so that `make test | tee` (or any CI log
|
|
850
|
+
// capture) never returns. The temp directory is the second trace,
|
|
851
|
+
// one per run.
|
|
852
|
+
$leak = $stub->leak();
|
|
853
|
+
$this->assertNull($leak, 'the stub outlived stop(): ' . (string)$leak);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
// -----------------------------------------------------------------
|
|
857
|
+
// The refusal is NOT retried. The gate lives at the transport, so a
|
|
858
|
+
// provider ERROR must fail the operation once - never spin the chain,
|
|
859
|
+
// and never let a later attempt through unauthenticated.
|
|
860
|
+
public function testAProviderErrorIsRefusedOnceAndNotRetried(): void
|
|
861
|
+
{
|
|
862
|
+
$calls = 0;
|
|
863
|
+
$wire = new ProjectNameSecretsWire();
|
|
864
|
+
$client = $this->secretsClient($wire, [
|
|
865
|
+
'feature' => ['secrets' => [
|
|
866
|
+
'active' => true,
|
|
867
|
+
'providers' => [$this->customProvider(
|
|
868
|
+
function (string $_name) use (&$calls) {
|
|
869
|
+
$calls++;
|
|
870
|
+
throw new \Voxgig\Sekreto\SekretoError('vault unreachable');
|
|
871
|
+
})],
|
|
872
|
+
]],
|
|
873
|
+
]);
|
|
874
|
+
|
|
875
|
+
$accessor = $this->entityAccessors($client)[0] ?? null;
|
|
876
|
+
$this->assertNotNull($accessor);
|
|
877
|
+
|
|
878
|
+
try {
|
|
879
|
+
$client->$accessor()->list();
|
|
880
|
+
$this->fail('the op must fail closed');
|
|
881
|
+
} catch (ProjectNameError $e) {
|
|
882
|
+
// expected
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
$this->assertSame(1, $calls, 'the refusal must not be retried');
|
|
886
|
+
$this->assertCount(0, $wire->calls);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
// A one-request-at-a-time HTTP stand-in, run as a child `php -S` process:
|
|
891
|
+
// the raw-fallback exchange has to be exercised over REAL HTTP (that is the
|
|
892
|
+
// whole point of the lane), and PHP has no threads to serve it in-process.
|
|
893
|
+
// Answers the token endpoint with an access token and every other path with
|
|
894
|
+
// an empty JSON body, recording what each request carried.
|
|
895
|
+
class ProjectNameSecretsHttpStub
|
|
896
|
+
{
|
|
897
|
+
private mixed $proc = null;
|
|
898
|
+
private string $dir = '';
|
|
899
|
+
private int $port = 0;
|
|
900
|
+
|
|
901
|
+
// What the server recorded, READ OFF DISK BY stop() before the temp
|
|
902
|
+
// directory goes: the assertions run after the `finally`, and a stub
|
|
903
|
+
// that cleans up after itself has no files left to answer from.
|
|
904
|
+
private ?string $refresh = null;
|
|
905
|
+
private ?string $auth = null;
|
|
906
|
+
|
|
907
|
+
public function start(): int
|
|
908
|
+
{
|
|
909
|
+
$this->dir = sys_get_temp_dir() . '/secrets-stub-' . bin2hex(random_bytes(6));
|
|
910
|
+
if (!@mkdir($this->dir, 0700, true)) {
|
|
911
|
+
$this->dir = '';
|
|
912
|
+
return 0;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
$router = <<<'ROUTER'
|
|
916
|
+
<?php
|
|
917
|
+
$dir = __DIR__;
|
|
918
|
+
$path = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH) ?? '/';
|
|
919
|
+
if (str_ends_with($path, '/auth/token')) {
|
|
920
|
+
$raw = file_get_contents('php://input');
|
|
921
|
+
$parsed = json_decode((string)$raw, true);
|
|
922
|
+
file_put_contents($dir . '/refresh.txt',
|
|
923
|
+
is_array($parsed) ? (string)($parsed['refresh_token'] ?? '') : '');
|
|
924
|
+
header('content-type: application/json');
|
|
925
|
+
echo '{"access_token": "RAWTOK01"}';
|
|
926
|
+
return;
|
|
927
|
+
}
|
|
928
|
+
$auth = '';
|
|
929
|
+
foreach ($_SERVER as $k => $v) {
|
|
930
|
+
if ('HTTP_AUTHORIZATION' === $k) { $auth = (string)$v; }
|
|
931
|
+
}
|
|
932
|
+
file_put_contents($dir . '/auth.txt', $auth);
|
|
933
|
+
header('content-type: application/json');
|
|
934
|
+
echo '{}';
|
|
935
|
+
ROUTER;
|
|
936
|
+
file_put_contents($this->dir . '/router.php', $router);
|
|
937
|
+
|
|
938
|
+
// A free port: bind, read it, release it. The window between release
|
|
939
|
+
// and the server's own bind is the usual small race, and a failure
|
|
940
|
+
// to come up skips the test rather than failing it.
|
|
941
|
+
$probe = @stream_socket_server('tcp://127.0.0.1:0', $errno, $errstr);
|
|
942
|
+
if (false === $probe) {
|
|
943
|
+
$this->stop();
|
|
944
|
+
return 0;
|
|
945
|
+
}
|
|
946
|
+
$name = stream_socket_get_name($probe, false);
|
|
947
|
+
fclose($probe);
|
|
948
|
+
$port = (int)substr((string)$name, (int)strrpos((string)$name, ':') + 1);
|
|
949
|
+
if (0 === $port) {
|
|
950
|
+
$this->stop();
|
|
951
|
+
return 0;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
// An ARRAY command, never a string. proc_open runs a STRING through
|
|
955
|
+
// `/bin/sh -c`, and the process it then hands back is the SHELL:
|
|
956
|
+
// proc_terminate would signal that, leaving `php -S` alive as an
|
|
957
|
+
// orphan holding the port - and, under `make test | tee` or any CI
|
|
958
|
+
// log capture, holding the pipe open so the run never ends. The
|
|
959
|
+
// array form execs the binary directly, so the child this object
|
|
960
|
+
// holds IS the server.
|
|
961
|
+
$cmd = [PHP_BINARY, '-S', '127.0.0.1:' . $port, $this->dir . '/router.php'];
|
|
962
|
+
// Every child descriptor is a FILE, never a pipe: a pipe end the
|
|
963
|
+
// parent never drains is a stall waiting to happen, and a test
|
|
964
|
+
// harness that captures output must not end up waiting on the
|
|
965
|
+
// server's.
|
|
966
|
+
$pipes = [];
|
|
967
|
+
$this->proc = @proc_open($cmd, [
|
|
968
|
+
0 => ['file', '/dev/null', 'r'],
|
|
969
|
+
1 => ['file', $this->dir . '/out.log', 'a'],
|
|
970
|
+
2 => ['file', $this->dir . '/err.log', 'a'],
|
|
971
|
+
], $pipes, $this->dir);
|
|
972
|
+
|
|
973
|
+
if (!is_resource($this->proc)) {
|
|
974
|
+
$this->stop();
|
|
975
|
+
return 0;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
for ($i = 0; $i < 100; $i++) {
|
|
979
|
+
$sock = @stream_socket_client('tcp://127.0.0.1:' . $port, $e1, $e2, 0.2);
|
|
980
|
+
if (false !== $sock) {
|
|
981
|
+
fclose($sock);
|
|
982
|
+
$this->port = $port;
|
|
983
|
+
return $port;
|
|
984
|
+
}
|
|
985
|
+
usleep(50000);
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
$this->stop();
|
|
989
|
+
return 0;
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
// Stop the server and leave NOTHING behind - no process, no directory.
|
|
993
|
+
// Called from the test's `finally` and from every failure path in
|
|
994
|
+
// start(), which markTestSkipped() unwinds past before any `finally`
|
|
995
|
+
// exists.
|
|
996
|
+
public function stop(): void
|
|
997
|
+
{
|
|
998
|
+
// Read the recording out first: the files are about to go.
|
|
999
|
+
$this->refresh = $this->slurp('refresh.txt') ?? $this->refresh;
|
|
1000
|
+
$this->auth = $this->slurp('auth.txt') ?? $this->auth;
|
|
1001
|
+
|
|
1002
|
+
if (is_resource($this->proc)) {
|
|
1003
|
+
proc_terminate($this->proc);
|
|
1004
|
+
// proc_close REAPS the child, so the process is gone (not a
|
|
1005
|
+
// zombie) by the time this returns.
|
|
1006
|
+
proc_close($this->proc);
|
|
1007
|
+
$this->proc = null;
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
if ('' !== $this->dir) {
|
|
1011
|
+
foreach ((array)@scandir($this->dir) as $f) {
|
|
1012
|
+
if ('.' !== $f && '..' !== $f) {
|
|
1013
|
+
@unlink($this->dir . '/' . $f);
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
@rmdir($this->dir);
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
// Did stop() actually stop it? The two observable traces a leak leaves:
|
|
1021
|
+
// the port still answering (an orphaned server), and the temp directory
|
|
1022
|
+
// still on disk. Asserted by the test, so a stub that goes back to
|
|
1023
|
+
// leaking fails the suite instead of quietly filling /tmp and hanging
|
|
1024
|
+
// every piped run.
|
|
1025
|
+
public function leak(): ?string
|
|
1026
|
+
{
|
|
1027
|
+
if ('' !== $this->dir && is_dir($this->dir)) {
|
|
1028
|
+
return 'temp directory still on disk: ' . $this->dir;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
if (0 === $this->port) {
|
|
1032
|
+
return null;
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
// The listener can take a moment to go after SIGTERM; a still-open
|
|
1036
|
+
// port after that is an orphan, not a race.
|
|
1037
|
+
for ($i = 0; $i < 40; $i++) {
|
|
1038
|
+
$sock = @stream_socket_client('tcp://127.0.0.1:' . $this->port, $e1, $e2, 0.2);
|
|
1039
|
+
if (false === $sock) {
|
|
1040
|
+
return null;
|
|
1041
|
+
}
|
|
1042
|
+
fclose($sock);
|
|
1043
|
+
usleep(50000);
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
return 'a server is still listening on 127.0.0.1:' . $this->port;
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
public function refresh(): ?string
|
|
1050
|
+
{
|
|
1051
|
+
return $this->slurp('refresh.txt') ?? $this->refresh;
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
public function auth(): ?string
|
|
1055
|
+
{
|
|
1056
|
+
return $this->slurp('auth.txt') ?? $this->auth;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
private function slurp(string $file): ?string
|
|
1060
|
+
{
|
|
1061
|
+
if ('' === $this->dir) {
|
|
1062
|
+
return null;
|
|
1063
|
+
}
|
|
1064
|
+
$out = @file_get_contents($this->dir . '/' . $file);
|
|
1065
|
+
return false === $out ? null : $out;
|
|
1066
|
+
}
|
|
1067
|
+
}
|