@voxgig/sdkgen 4.9.0 → 4.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/voxgig-sdkgen +1 -1
- package/dist/helpers/manifest.d.ts +2 -1
- package/dist/helpers/manifest.js +75 -1
- package/dist/helpers/manifest.js.map +1 -1
- package/dist/helpers/modelNames.d.ts +7 -0
- package/dist/helpers/modelNames.js +232 -0
- package/dist/helpers/modelNames.js.map +1 -0
- package/dist/helpers/naming.d.ts +2 -1
- package/dist/helpers/naming.js +45 -1
- package/dist/helpers/naming.js.map +1 -1
- package/dist/sdkgen.d.ts +3 -2
- package/dist/sdkgen.js +12 -3
- package/dist/sdkgen.js.map +1 -1
- package/dist/testkit.d.ts +2 -0
- package/dist/testkit.js +80 -24
- package/dist/testkit.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utility.js +17 -7
- package/dist/utility.js.map +1 -1
- package/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +1001 -0
- package/project/.sdk/model/target/c.aon +15 -2
- package/project/.sdk/model/target/clojure.aon +10 -0
- package/project/.sdk/model/target/cpp.aon +18 -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/lua.aon +17 -0
- package/project/.sdk/model/target/ocaml.aon +48 -5
- package/project/.sdk/model/target/perl.aon +5 -0
- package/project/.sdk/model/target/php.aon +5 -0
- package/project/.sdk/model/target/rb.aon +5 -0
- package/project/.sdk/model/target/rust.aon +5 -0
- package/project/.sdk/model/target/scala.aon +38 -2
- package/project/.sdk/model/target/swift.aon +10 -0
- package/project/.sdk/model/target/zig.aon +30 -4
- package/project/.sdk/src/cmp/c/Config_c.ts +338 -1
- package/project/.sdk/src/cmp/c/Main_c.ts +57 -2
- package/project/.sdk/src/cmp/c/Package_c.ts +12 -2
- 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/cpp/Config_cpp.ts +324 -2
- package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +2 -0
- package/project/.sdk/src/cmp/cpp/Main_cpp.ts +62 -4
- package/project/.sdk/src/cmp/cpp/Package_cpp.ts +10 -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/lua/Config_lua.ts +88 -0
- package/project/.sdk/src/cmp/lua/Gitignore_lua.ts +4 -0
- package/project/.sdk/src/cmp/lua/Main_lua.ts +93 -3
- package/project/.sdk/src/cmp/lua/Package_lua.ts +60 -0
- package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +10 -0
- package/project/.sdk/src/cmp/ocaml/Config_ocaml.ts +183 -5
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +160 -3
- package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +25 -1
- package/project/.sdk/src/cmp/perl/Config_perl.ts +129 -3
- package/project/.sdk/src/cmp/perl/Main_perl.ts +41 -1
- package/project/.sdk/src/cmp/perl/Package_perl.ts +13 -1
- package/project/.sdk/src/cmp/perl/fragment/Main.fragment.pm +1 -0
- package/project/.sdk/src/cmp/php/Config_php.ts +105 -1
- package/project/.sdk/src/cmp/php/Gitignore_php.ts +4 -2
- package/project/.sdk/src/cmp/php/Main_php.ts +16 -1
- package/project/.sdk/src/cmp/rb/Config_rb.ts +92 -2
- package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +11 -1
- package/project/.sdk/src/cmp/rb/Main_rb.ts +7 -1
- package/project/.sdk/src/cmp/rust/Main_rust.ts +99 -1
- package/project/.sdk/src/cmp/rust/Package_rust.ts +72 -6
- package/project/.sdk/src/cmp/scala/Config_scala.ts +44 -0
- package/project/.sdk/src/cmp/scala/Main_scala.ts +68 -1
- package/project/.sdk/src/cmp/swift/Config_swift.ts +62 -1
- package/project/.sdk/src/cmp/swift/Main_swift.ts +35 -1
- package/project/.sdk/src/cmp/swift/Package_swift.ts +81 -11
- package/project/.sdk/src/cmp/swift/fragment/Main.fragment.swift +58 -44
- package/project/.sdk/src/cmp/swift/utility_swift.ts +22 -0
- package/project/.sdk/src/cmp/zig/Config_zig.ts +130 -9
- package/project/.sdk/src/cmp/zig/Main_zig.ts +208 -4
- package/project/.sdk/{tm/zig/build.zig → src/cmp/zig/fragment/Build.fragment.zig} +7 -0
- package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +25 -0
- package/project/.sdk/{tm/zig/root.zig → src/cmp/zig/fragment/Root.fragment.zig} +9 -0
- package/project/.sdk/tm/c/Makefile +58 -9
- package/project/.sdk/tm/c/core/sdk.h +10 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.c +133 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.h +39 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.c +83 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.h +48 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/config.c +413 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/config.h +24 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.c +264 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.h +29 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/env.c +220 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/env.h +19 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/export.c +97 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/export.h +19 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.c +237 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.h +17 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/host.c +1494 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/host.h +135 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/order.c +288 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/order.h +18 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/point.c +141 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/point.h +80 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.c +170 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.h +52 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.c +98 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.h +18 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/types.c +150 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/types.h +104 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/value.c +649 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/value.h +135 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/version.c +151 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/version.h +34 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/aws.c +281 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/azuresecrets.c +207 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/boru.c +164 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/clock.c +75 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/doppler.c +141 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/encode.c +144 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/gcpsecrets.c +177 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/hashicorp.c +239 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/httpjson.c +599 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/infisical.c +165 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/onepassword.c +194 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/proc.c +233 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/secretspec.c +125 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sekretoplugins.h +125 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sha256.c +270 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sigv4.c +382 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/support.h +153 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/tls.c +420 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/internal.h +86 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/json.c +721 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/providers.c +813 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.c +944 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.h +490 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/util.c +442 -0
- package/project/.sdk/tm/c/feature/secrets.c +797 -0
- package/project/.sdk/tm/c/feature/secrets.h +46 -0
- package/project/.sdk/tm/c/tests/feature/secrets/secrets_test.c +802 -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 +530 -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 +581 -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/Makefile +48 -4
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.cpp +121 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.hpp +41 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.cpp +60 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.hpp +66 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.cpp +376 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.hpp +29 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.cpp +230 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.hpp +31 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.cpp +205 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.hpp +25 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.cpp +84 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.hpp +24 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.cpp +222 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.hpp +21 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.cpp +1200 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.hpp +250 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.cpp +250 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.hpp +22 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.cpp +110 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.hpp +79 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.cpp +136 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.hpp +60 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.cpp +82 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.hpp +25 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.cpp +90 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.hpp +65 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.cpp +491 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.hpp +120 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.cpp +143 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.hpp +36 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.cpp +248 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.hpp +30 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.cpp +149 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.cpp +117 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.hpp +27 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.cpp +180 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.hpp +52 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.cpp +87 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.cpp +121 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.cpp +153 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.cpp +666 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.hpp +160 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.cpp +123 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.cpp +125 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.cpp +223 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.hpp +47 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.cpp +104 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.hpp +27 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.cpp +242 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.hpp +58 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.cpp +260 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.hpp +47 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.cpp +476 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.hpp +89 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.cpp +312 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.hpp +263 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.cpp +354 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.hpp +111 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.cpp +613 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.hpp +227 -0
- package/project/.sdk/tm/cpp/feature/secrets.hpp +745 -0
- package/project/.sdk/tm/cpp/test/feature/secrets/secrets_test.cpp +808 -0
- 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 +915 -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 +1787 -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 +839 -0
- package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +1113 -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 +48 -10
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +239 -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 +791 -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 +1050 -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 +454 -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 +1019 -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 +684 -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 +1217 -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/Makefile +15 -4
- package/project/.sdk/tm/lua/feature/secrets/native/sekretonet.c +806 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/capability.lua +135 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/catalog.lua +63 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/config.lua +361 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/depend.lua +232 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/env.lua +168 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/export.lua +66 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/graph.lua +194 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/host.lua +1190 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/json.lua +169 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/order.lua +207 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/point.lua +106 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/ref.lua +115 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/resolve.lua +78 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/types.lua +275 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/version.lua +131 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin.lua +76 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/addr.lua +124 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/err.lua +47 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/name.lua +315 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/aws.lua +228 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/azuresecrets.lua +137 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/boru.lua +124 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/crypto.lua +212 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/doppler.lua +89 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/gcpsecrets.lua +129 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/hashicorp.lua +154 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/httpjson.lua +248 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/infisical.lua +113 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/json.lua +449 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/net.lua +198 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/onepassword.lua +126 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/secretspec.lua +93 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/sigv4.lua +269 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/support.lua +146 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/providers.lua +346 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto.lua +479 -0
- package/project/.sdk/tm/lua/feature/secrets_feature.lua +690 -0
- package/project/.sdk/tm/lua/test/extend_test.lua +105 -0
- package/project/.sdk/tm/lua/test/feature/secrets/secrets_feature_test.lua +862 -0
- 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/Makefile +52 -8
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/capability.ml +106 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/catalog.ml +43 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/config.ml +349 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/defs.ml +143 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/depend.ml +217 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/env.ml +197 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/export.ml +89 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/graph.ml +227 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/host.ml +1112 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/order.ml +202 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/point.ml +138 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/ref.ml +126 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/resolve.ml +62 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/types.ml +97 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/value.ml +387 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/version.ml +139 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/aws.ml +171 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/azuresecrets.ml +116 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/boru.ml +95 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/crypto.ml +149 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/doppler.ml +61 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/gcpsecrets.ml +93 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/hashicorp.ml +120 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/http.ml +421 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/httpjson.ml +66 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/infisical.ml +85 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/onepassword.ml +112 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/runcmd.ml +97 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/secretspec.ml +68 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/sigv4.ml +259 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls.ml +44 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls_stubs.c +358 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/json.ml +376 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/provider.ml +647 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/secret.ml +299 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/sekreto.ml +347 -0
- package/project/.sdk/tm/ocaml/feature/secrets_feature.ml +453 -0
- package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +670 -0
- 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 +696 -0
- package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +1 -1
- package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +1004 -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 +694 -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 +1165 -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/feature/secrets_feature.py +28 -6
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +1 -1
- package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +114 -0
- 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 +583 -0
- package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +935 -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 +984 -0
- package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +1605 -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 +578 -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 +1042 -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/SecretsFeature.ts +35 -12
- 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/feature/secrets/Secrets.test.ts +73 -0
- 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/feature/secrets/plugin/capability.zig +137 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/catalog.zig +90 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/config.zig +346 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/depend.zig +244 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/env.zig +201 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/export.zig +83 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/graph.zig +212 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/host.zig +1224 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/inst.zig +126 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/order.zig +228 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/plugin.zig +34 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/point.zig +166 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/ref.zig +147 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/resolve.zig +74 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/types.zig +140 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/value.zig +662 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/version.zig +139 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/aws.zig +294 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/azuresecrets.zig +222 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/boru.zig +188 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/doppler.zig +135 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/gcpsecrets.zig +170 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/hashicorp.zig +242 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/httpjson.zig +535 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/infisical.zig +167 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/onepassword.zig +202 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/secretspec.zig +160 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/sigv4.zig +336 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/addr.zig +148 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/builtins.zig +259 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/provider.zig +440 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/sekreto.zig +944 -0
- package/project/.sdk/tm/zig/feature/secrets.zig +854 -0
- package/project/.sdk/tm/zig/test/feature/secrets/secrets_test.zig +891 -0
- 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/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 → c/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/base → clojure/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/cache → cpp/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/clienttrack → csharp/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/cost → elixir/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/debug → java/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/idempotency → kotlin/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/log → lua/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/metrics → ocaml/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/netsim → perl/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/paging → php/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/proxy → rb/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/ratelimit → rust/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/rbac → scala/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/retry → swift/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/streaming → zig/src/feature/secrets}/.gitkeep +0 -0
|
@@ -0,0 +1,1113 @@
|
|
|
1
|
+
# Behavioural tests for the secrets feature (vendored @voxgig/sekreto).
|
|
2
|
+
#
|
|
3
|
+
# The contract under test: the `apikey` OPTION keeps its exact old meaning
|
|
4
|
+
# and always wins, because ProjectName.Feature.Secrets places it FIRST in the
|
|
5
|
+
# provider chain (a `memory` store named `options`) - explicit-beats-lookup
|
|
6
|
+
# falls out of sekreto's first-hit rule rather than from special-case logic.
|
|
7
|
+
# With the feature inactive nothing changes at all. With it active and the
|
|
8
|
+
# option unset, the chain (env, dotenv, a custom provider, a vault) supplies
|
|
9
|
+
# the credential instead.
|
|
10
|
+
#
|
|
11
|
+
# EVERY CASE BUILDS A LIVE CLIENT WITH A RECORDING `system.fetch`, and asserts
|
|
12
|
+
# on what that recorder saw. That is not incidental - it is the whole point.
|
|
13
|
+
# This feature resolves at the TRANSPORT SEAM (see the header of
|
|
14
|
+
# feature/secrets.ex), so `prepare/2` returns before any lookup has happened
|
|
15
|
+
# and a header assertion taken there would pass for an SDK with no secrets
|
|
16
|
+
# feature at all. And ProjectName.test/2 REPLACES the fetcher with the test
|
|
17
|
+
# feature's in-memory mock, so a counter hung off `system.fetch` is never
|
|
18
|
+
# reached under it: "no request was sent" and "the request failed" would both
|
|
19
|
+
# hold for a healthy SDK, and the pair would assert nothing. An assertion that
|
|
20
|
+
# cannot fail pins no rule.
|
|
21
|
+
#
|
|
22
|
+
# So each fail-closed case proves its own counter FIRST, with the same
|
|
23
|
+
# construction and a WORKING provider: one request must reach `system.fetch`
|
|
24
|
+
# carrying the resolved credential. Only then does a zero from the broken
|
|
25
|
+
# provider mean REFUSED rather than UNWIRED. And the failure is matched on the
|
|
26
|
+
# PROVIDER'S OWN message, so an unrelated failure (a missing route, a blocked
|
|
27
|
+
# op) cannot stand in for fail-closed.
|
|
28
|
+
#
|
|
29
|
+
# This file lives in the `feature/` container on purpose: `target add` trims
|
|
30
|
+
# it, along with the feature source and the vendored library, for a project
|
|
31
|
+
# whose model does not select `secrets`.
|
|
32
|
+
|
|
33
|
+
defmodule ProjectName.SecretsTest do
|
|
34
|
+
use ExUnit.Case
|
|
35
|
+
|
|
36
|
+
alias Voxgig.Struct, as: S
|
|
37
|
+
alias ProjectName.Feature.Secrets
|
|
38
|
+
|
|
39
|
+
@envprefix "PROJECTENV_TEST_SECRETS_"
|
|
40
|
+
@base "http://raw.test/api"
|
|
41
|
+
|
|
42
|
+
# ---- the recorder --------------------------------------------------------
|
|
43
|
+
|
|
44
|
+
# A transport that records every call it is handed, so "sent" is a fact
|
|
45
|
+
# about the wire rather than about a mock. ETS rather than an Agent: this
|
|
46
|
+
# is the thing the fail-closed assertions count, and it must outlive
|
|
47
|
+
# anything the SDK does to its own processes.
|
|
48
|
+
defp recorder(opts \\ %{}) do
|
|
49
|
+
t = :ets.new(:secrets_recorder, [:public, :set])
|
|
50
|
+
:ets.insert(t, {:calls, []})
|
|
51
|
+
:ets.insert(t, {:issued, 0})
|
|
52
|
+
:ets.insert(t, {:apicall, -1})
|
|
53
|
+
|
|
54
|
+
path = Map.get(opts, :path, "auth/token")
|
|
55
|
+
tokens = Map.get(opts, :tokens, ["ACCESS01", "ACCESS02", "ACCESS03"])
|
|
56
|
+
apistatus = Map.get(opts, :api, [200])
|
|
57
|
+
resfield = Map.get(opts, :response, "access_token")
|
|
58
|
+
tokenfail = Map.get(opts, :tokenfail, nil)
|
|
59
|
+
|
|
60
|
+
fetch = fn url, fetchdef ->
|
|
61
|
+
headers = S.getprop(fetchdef, "headers")
|
|
62
|
+
|
|
63
|
+
auth =
|
|
64
|
+
if S.ismap(headers),
|
|
65
|
+
do: ProjectName.Feature.header_get(headers, "authorization"),
|
|
66
|
+
else: nil
|
|
67
|
+
|
|
68
|
+
[{:calls, cs}] = :ets.lookup(t, :calls)
|
|
69
|
+
|
|
70
|
+
:ets.insert(t,
|
|
71
|
+
{:calls, cs ++ [%{url: url, auth: auth, body: S.getprop(fetchdef, "body")}]})
|
|
72
|
+
|
|
73
|
+
if String.ends_with?(url, "/" <> path) do
|
|
74
|
+
[{:issued, i}] = :ets.lookup(t, :issued)
|
|
75
|
+
:ets.insert(t, {:issued, i + 1})
|
|
76
|
+
|
|
77
|
+
if tokenfail != nil and i + 1 >= tokenfail do
|
|
78
|
+
{S.jm(["status", 500, "json", fn -> S.jm([]) end, "headers", S.jm([])]), nil}
|
|
79
|
+
else
|
|
80
|
+
token = Enum.at(tokens, min(i, length(tokens) - 1))
|
|
81
|
+
{S.jm(["status", 200, "json", fn -> S.jm([resfield, token]) end, "headers", S.jm([])]), nil}
|
|
82
|
+
end
|
|
83
|
+
else
|
|
84
|
+
[{:apicall, a}] = :ets.lookup(t, :apicall)
|
|
85
|
+
a = a + 1
|
|
86
|
+
:ets.insert(t, {:apicall, a})
|
|
87
|
+
status = Enum.at(apistatus, min(a, length(apistatus) - 1))
|
|
88
|
+
|
|
89
|
+
{S.jm([
|
|
90
|
+
"status", status,
|
|
91
|
+
"statusText", if(status < 400, do: "OK", else: "ERR"),
|
|
92
|
+
"json", fn -> S.jm(["ok", status < 400]) end,
|
|
93
|
+
"headers", S.jm([])
|
|
94
|
+
]), nil}
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
%{table: t, fetch: fetch, path: path}
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
defp calls(r), do: :ets.lookup(r.table, :calls) |> hd() |> elem(1)
|
|
102
|
+
|
|
103
|
+
# Only the calls that went to the API, in order - a token purchase is not
|
|
104
|
+
# an API call and must never be counted as one.
|
|
105
|
+
defp api(r), do: calls(r) |> Enum.reject(&String.ends_with?(&1.url, "/" <> r.path))
|
|
106
|
+
defp token(r), do: calls(r) |> Enum.filter(&String.ends_with?(&1.url, "/" <> r.path))
|
|
107
|
+
|
|
108
|
+
# What went out, for a failure message that names the leak rather than just
|
|
109
|
+
# its count.
|
|
110
|
+
defp wire(r) do
|
|
111
|
+
calls(r) |> Enum.map_join(", ", fn c -> c.url <> " auth=" <> inspect(c.auth) end)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# ---- construction --------------------------------------------------------
|
|
115
|
+
|
|
116
|
+
# `allow.op` is named explicitly: a project that narrows the default set
|
|
117
|
+
# would otherwise turn the raw-path cases into a false RED (the control leg
|
|
118
|
+
# refused before it reached the transport), and the rule under test lives
|
|
119
|
+
# at the transport, downstream of the allow gate either way.
|
|
120
|
+
defp sdk(r, extra) do
|
|
121
|
+
opts =
|
|
122
|
+
S.jm([
|
|
123
|
+
"base", @base,
|
|
124
|
+
"allow", S.jm(["op", "direct,graphql,list,load"]),
|
|
125
|
+
"system", S.jm(["fetch", r.fetch])
|
|
126
|
+
])
|
|
127
|
+
|
|
128
|
+
Enum.each(extra, fn {k, v} -> S.setprop(opts, k, v) end)
|
|
129
|
+
ProjectName.new(opts)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
defp secrets(fopts) do
|
|
133
|
+
node = S.jm(["active", true])
|
|
134
|
+
Enum.each(fopts, fn {k, v} -> S.setprop(node, k, v) end)
|
|
135
|
+
S.jm(["secrets", node])
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
defp providers(list), do: S.jt(list)
|
|
139
|
+
|
|
140
|
+
defp envchain(extra \\ []) do
|
|
141
|
+
secrets([{"providers", providers([S.jm(["kind", "env", "prefix", @envprefix])])} | extra])
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
defp spec(pairs), do: S.jm(pairs)
|
|
145
|
+
|
|
146
|
+
# ---- providers -----------------------------------------------------------
|
|
147
|
+
|
|
148
|
+
# Live provider maps, duck-typed on `lookup/1` exactly as
|
|
149
|
+
# Sekreto.Provider.provider?/1 is.
|
|
150
|
+
defp working(value \\ "RAWKEY01", name \\ "apikey") do
|
|
151
|
+
%{
|
|
152
|
+
lookup: fn n -> if n == name, do: value, else: nil end,
|
|
153
|
+
describe: fn -> "working:test" end
|
|
154
|
+
}
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
defp broken do
|
|
158
|
+
%{
|
|
159
|
+
lookup: fn _n -> raise Sekreto.Error, message: "vault unreachable" end,
|
|
160
|
+
describe: fn -> "broken:test" end
|
|
161
|
+
}
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# ---- assertions ----------------------------------------------------------
|
|
165
|
+
|
|
166
|
+
# The authorization header carries the SPEC's credential prefix, which a
|
|
167
|
+
# TEMPLATE cannot know: an OpenAPI `http`/`bearer` scheme gives
|
|
168
|
+
# `Bearer <token>`, an apiKey scheme the raw token. So assert on the
|
|
169
|
+
# CREDENTIAL and let the prefix be whatever this SDK's API declares -
|
|
170
|
+
# pinning the whole header value passes only for a prefix-less API, and
|
|
171
|
+
# this file ships to every project that selects the feature.
|
|
172
|
+
defp credential_is(header, token) do
|
|
173
|
+
got = if is_binary(header), do: header, else: ""
|
|
174
|
+
|
|
175
|
+
assert got == token or String.ends_with?(got, " " <> token),
|
|
176
|
+
"expected the Authorization header to carry " <> token <> ", got: " <> inspect(header)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
defp auth_is(call, token), do: credential_is(if(call == nil, do: nil, else: call.auth), token)
|
|
180
|
+
|
|
181
|
+
# Does this options value CARRY the token - bare, or under the spec's
|
|
182
|
+
# prefix? The negative half of credential_is, for the assertions that pin
|
|
183
|
+
# where a credential must NOT be.
|
|
184
|
+
defp credential?(value, token) do
|
|
185
|
+
is_binary(value) and (value == token or String.ends_with?(value, " " <> token))
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
defp err_message(res) do
|
|
189
|
+
e = S.getprop(res, "err")
|
|
190
|
+
|
|
191
|
+
cond do
|
|
192
|
+
is_exception(e) -> Exception.message(e)
|
|
193
|
+
is_binary(e) -> e
|
|
194
|
+
true -> inspect(e)
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
setup do
|
|
199
|
+
System.delete_env(@envprefix <> "APIKEY")
|
|
200
|
+
System.delete_env(@envprefix <> "REFRESH_TOKEN")
|
|
201
|
+
System.delete_env(@envprefix <> "API_TOKEN")
|
|
202
|
+
|
|
203
|
+
on_exit(fn ->
|
|
204
|
+
System.delete_env(@envprefix <> "APIKEY")
|
|
205
|
+
System.delete_env(@envprefix <> "REFRESH_TOKEN")
|
|
206
|
+
System.delete_env(@envprefix <> "API_TOKEN")
|
|
207
|
+
end)
|
|
208
|
+
|
|
209
|
+
:ok
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
describe "secrets" do
|
|
213
|
+
test "inactive: the apikey option behaves exactly as before" do
|
|
214
|
+
r = recorder()
|
|
215
|
+
client = sdk(r, [{"apikey", "OPTKEY01"}])
|
|
216
|
+
|
|
217
|
+
assert S.getprop(ProjectName.direct(client, S.jm(["path", "/thing"])), "ok") == true
|
|
218
|
+
assert length(api(r)) == 1
|
|
219
|
+
auth_is(hd(api(r)), "OPTKEY01")
|
|
220
|
+
|
|
221
|
+
# No feature, no instance: the accessor is the only way in.
|
|
222
|
+
assert Secrets.feature(client) == nil
|
|
223
|
+
assert Secrets.sekreto(client) == nil
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
test "inactive: no apikey means no authorization header" do
|
|
227
|
+
r = recorder()
|
|
228
|
+
client = sdk(r, [])
|
|
229
|
+
ProjectName.direct(client, S.jm(["path", "/thing"]))
|
|
230
|
+
|
|
231
|
+
assert hd(api(r)).auth == nil
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
test "active: the apikey option still wins over the chain" do
|
|
235
|
+
System.put_env(@envprefix <> "APIKEY", "ENVKEY01")
|
|
236
|
+
|
|
237
|
+
r = recorder()
|
|
238
|
+
client = sdk(r, [{"apikey", "OPTKEY01"}, {"feature", envchain()}])
|
|
239
|
+
ProjectName.direct(client, S.jm(["path", "/thing"]))
|
|
240
|
+
|
|
241
|
+
auth_is(hd(api(r)), "OPTKEY01")
|
|
242
|
+
|
|
243
|
+
# The explicit option is a real store, not a special case: a directed
|
|
244
|
+
# read names it like any other.
|
|
245
|
+
assert Sekreto.getfrom(Secrets.sekreto(client), "options", "apikey") == "OPTKEY01"
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
# The three ways an apikey can be "not given", pinned together because
|
|
249
|
+
# they are easy to conflate and only one of them is a suppression.
|
|
250
|
+
#
|
|
251
|
+
# make_options normalises an omitted apikey to "" before features
|
|
252
|
+
# initialise, so by init time omitted and explicit-empty are
|
|
253
|
+
# indistinguishable - both defer to the chain, deliberately.
|
|
254
|
+
|
|
255
|
+
test "active: an OMITTED apikey defers to the chain" do
|
|
256
|
+
System.put_env(@envprefix <> "APIKEY", "ENVKEY01")
|
|
257
|
+
|
|
258
|
+
r = recorder()
|
|
259
|
+
ProjectName.direct(sdk(r, [{"feature", envchain()}]), S.jm(["path", "/thing"]))
|
|
260
|
+
|
|
261
|
+
auth_is(hd(api(r)), "ENVKEY01")
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
test "active: an explicitly EMPTY apikey also defers to the chain" do
|
|
265
|
+
System.put_env(@envprefix <> "APIKEY", "ENVKEY01")
|
|
266
|
+
|
|
267
|
+
r = recorder()
|
|
268
|
+
ProjectName.direct(sdk(r, [{"apikey", ""}, {"feature", envchain()}]), S.jm(["path", "/thing"]))
|
|
269
|
+
|
|
270
|
+
auth_is(hd(api(r)), "ENVKEY01")
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
# `auth: nil` - the documented way to disable auth outright, which
|
|
274
|
+
# prepare_auth honours before it ever reads the apikey.
|
|
275
|
+
#
|
|
276
|
+
# This needs an explicit guard because struct 0.3.2 nearly removed it in
|
|
277
|
+
# silence: a stored null began reading as "no value", so the optspec's
|
|
278
|
+
# default auth map fired instead and the suppression became "use default
|
|
279
|
+
# auth" - transmitting a credential the caller explicitly asked not to
|
|
280
|
+
# send. make_options now captures suppliedness BEFORE validate and
|
|
281
|
+
# restores the nil after it.
|
|
282
|
+
test "active: auth nil suppresses the credential, chain or no chain" do
|
|
283
|
+
System.put_env(@envprefix <> "APIKEY", "ENVKEY01")
|
|
284
|
+
|
|
285
|
+
r = recorder()
|
|
286
|
+
client = sdk(r, [{"auth", nil}, {"feature", envchain()}])
|
|
287
|
+
ProjectName.direct(client, S.jm(["path", "/thing"]))
|
|
288
|
+
|
|
289
|
+
# Nothing on the wire, even though the chain would have resolved.
|
|
290
|
+
assert length(api(r)) == 1
|
|
291
|
+
assert hd(api(r)).auth == nil
|
|
292
|
+
|
|
293
|
+
# The suppression survives option validation rather than being replaced
|
|
294
|
+
# by the optspec's default auth map.
|
|
295
|
+
assert S.getprop(ProjectName.options_map(client), "auth") == nil
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
test "active: auth nil suppresses an EXPLICIT apikey too" do
|
|
299
|
+
r = recorder()
|
|
300
|
+
|
|
301
|
+
client =
|
|
302
|
+
sdk(r, [{"apikey", "OPTKEY01"}, {"auth", nil}, {"feature", envchain()}])
|
|
303
|
+
|
|
304
|
+
ProjectName.direct(client, S.jm(["path", "/thing"]))
|
|
305
|
+
|
|
306
|
+
assert hd(api(r)).auth == nil
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
test "active: custom provider maps are accepted verbatim" do
|
|
310
|
+
asked = :ets.new(:asked, [:public, :set])
|
|
311
|
+
:ets.insert(asked, {:names, []})
|
|
312
|
+
|
|
313
|
+
custom = %{
|
|
314
|
+
lookup: fn n ->
|
|
315
|
+
[{:names, ns}] = :ets.lookup(asked, :names)
|
|
316
|
+
:ets.insert(asked, {:names, ns ++ [n]})
|
|
317
|
+
"CUSTOM01"
|
|
318
|
+
end,
|
|
319
|
+
describe: fn -> "custom:test" end
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
r = recorder()
|
|
323
|
+
|
|
324
|
+
ProjectName.direct(
|
|
325
|
+
sdk(r, [{"feature", secrets([{"providers", providers([custom])}])}]),
|
|
326
|
+
S.jm(["path", "/thing"])
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
auth_is(hd(api(r)), "CUSTOM01")
|
|
330
|
+
assert (:ets.lookup(asked, :names) |> hd() |> elem(1)) == ["apikey"]
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
test "active: a miss everywhere leaves the header off and the request still goes" do
|
|
334
|
+
r = recorder()
|
|
335
|
+
client = sdk(r, [{"feature", envchain()}])
|
|
336
|
+
|
|
337
|
+
assert S.getprop(ProjectName.direct(client, S.jm(["path", "/thing"])), "ok") == true
|
|
338
|
+
assert length(api(r)) == 1
|
|
339
|
+
assert hd(api(r)).auth == nil
|
|
340
|
+
assert Secrets.credential(client) == ""
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
# WHERE THE CREDENTIAL LIVES: in feature state, NEVER in the shared
|
|
344
|
+
# options map. That is the structural choice the header of
|
|
345
|
+
# feature/secrets.ex spends two paragraphs on - the options node is the
|
|
346
|
+
# client's single live struct node, read raw by every concurrent
|
|
347
|
+
# operation, so a feature that wrote into it would race them - and
|
|
348
|
+
# nothing else here would notice it being undone: publish the resolved
|
|
349
|
+
# token into `_liveopts` before `reauth` and every case above stays
|
|
350
|
+
# green, because the wire sees the same header either way.
|
|
351
|
+
#
|
|
352
|
+
# So this pins the map itself, on BOTH sides of a resolution, and the
|
|
353
|
+
# control leg comes first: the request must reach the transport exactly
|
|
354
|
+
# once carrying the credential, or an unchanged map proves nothing (an
|
|
355
|
+
# unwired feature leaves it unchanged too).
|
|
356
|
+
test "active: a resolved credential lives in feature state, never in the options map" do
|
|
357
|
+
r = recorder()
|
|
358
|
+
client = sdk(r, [{"feature", secrets([{"providers", providers([working()])}])}])
|
|
359
|
+
|
|
360
|
+
# What the map holds BEFORE anything is resolved. make_options
|
|
361
|
+
# normalises an omitted apikey to "", and that is what must survive.
|
|
362
|
+
before = S.getprop(ProjectName.options_map(client), "apikey")
|
|
363
|
+
refute credential?(before, "RAWKEY01")
|
|
364
|
+
|
|
365
|
+
assert S.getprop(ProjectName.direct(client, S.jm(["path", "/thing"])), "ok") == true
|
|
366
|
+
|
|
367
|
+
# CONTROL: resolved, injected, sent - exactly once.
|
|
368
|
+
assert length(api(r)) == 1,
|
|
369
|
+
"the control request never reached system.fetch, so this test cannot" <>
|
|
370
|
+
" observe whether the credential was resolved at all"
|
|
371
|
+
|
|
372
|
+
auth_is(hd(api(r)), "RAWKEY01")
|
|
373
|
+
assert Secrets.credential(client) == "RAWKEY01", "the feature state holds the credential"
|
|
374
|
+
|
|
375
|
+
# THE RULE. The public clone, and the live node behind it - the one
|
|
376
|
+
# prepare_auth clones on every request and the feature keeps as
|
|
377
|
+
# `_liveopts` - both unchanged, and neither carrying the token.
|
|
378
|
+
after_ = S.getprop(ProjectName.options_map(client), "apikey")
|
|
379
|
+
|
|
380
|
+
assert after_ == before,
|
|
381
|
+
"resolving the credential changed options.apikey from " <>
|
|
382
|
+
inspect(before) <> " to " <> inspect(after_) <>
|
|
383
|
+
" - the credential must live in feature state, not in the shared options map"
|
|
384
|
+
|
|
385
|
+
refute credential?(after_, "RAWKEY01"),
|
|
386
|
+
"the resolved credential was published into the options map"
|
|
387
|
+
|
|
388
|
+
live = S.getprop(S.getprop(client, "options"), "apikey")
|
|
389
|
+
|
|
390
|
+
assert live == before,
|
|
391
|
+
"the LIVE options node was written: " <> inspect(live)
|
|
392
|
+
|
|
393
|
+
# And a second request, which must be answered from feature state
|
|
394
|
+
# rather than from a map the first one populated.
|
|
395
|
+
ProjectName.direct(client, S.jm(["path", "/again"]))
|
|
396
|
+
assert length(api(r)) == 2
|
|
397
|
+
auth_is(Enum.at(api(r), 1), "RAWKEY01")
|
|
398
|
+
assert S.getprop(ProjectName.options_map(client), "apikey") == before
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
# sekreto's miss-vs-error invariant: a MISS falls through to the next
|
|
402
|
+
# provider, an ERROR does not. A broken vault must never degrade into an
|
|
403
|
+
# unauthenticated request.
|
|
404
|
+
#
|
|
405
|
+
# THE RAW PATHS RUN NO FEATURE HOOKS AT ALL. If resolution lived only in
|
|
406
|
+
# a hook these would send unauthenticated and never notice; they are
|
|
407
|
+
# covered because the wrapper sits on the fetcher slot, which
|
|
408
|
+
# raw_request/2 reaches through the same late-bound Utility.fetcher/3.
|
|
409
|
+
|
|
410
|
+
test "active: a provider ERROR fails direct() rather than sending" do
|
|
411
|
+
# THE RULE, asserted first so a regression reports the leak itself.
|
|
412
|
+
r = recorder()
|
|
413
|
+
res = ProjectName.direct(
|
|
414
|
+
sdk(r, [{"feature", secrets([{"providers", providers([broken()])}])}]),
|
|
415
|
+
S.jm(["path", "/thing"]))
|
|
416
|
+
|
|
417
|
+
assert api(r) == [],
|
|
418
|
+
"a request must not go out unauthenticated because a provider broke," <>
|
|
419
|
+
" but one reached the transport: " <> wire(r)
|
|
420
|
+
|
|
421
|
+
assert S.getprop(res, "ok") == false
|
|
422
|
+
assert err_message(res) =~ "vault unreachable"
|
|
423
|
+
|
|
424
|
+
# CONTROL, which makes that empty list mean REFUSED rather than
|
|
425
|
+
# UNWIRED: the same construction with a WORKING provider must reach the
|
|
426
|
+
# same transport, once, carrying the credential.
|
|
427
|
+
c = recorder()
|
|
428
|
+
ok = ProjectName.direct(
|
|
429
|
+
sdk(c, [{"feature", secrets([{"providers", providers([working()])}])}]),
|
|
430
|
+
S.jm(["path", "/thing"]))
|
|
431
|
+
|
|
432
|
+
assert S.getprop(ok, "ok") == true, "the control request failed: " <> inspect(ok)
|
|
433
|
+
|
|
434
|
+
assert length(api(c)) == 1,
|
|
435
|
+
"the control request never reached system.fetch, so this test cannot" <>
|
|
436
|
+
" observe a request going out at all"
|
|
437
|
+
|
|
438
|
+
auth_is(hd(api(c)), "RAWKEY01")
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
test "active: a provider ERROR fails graphql() rather than sending" do
|
|
442
|
+
r = recorder()
|
|
443
|
+
res = ProjectName.graphql(
|
|
444
|
+
sdk(r, [{"feature", secrets([{"providers", providers([broken()])}])}]),
|
|
445
|
+
"{ thing }", S.jm([]))
|
|
446
|
+
|
|
447
|
+
assert api(r) == [],
|
|
448
|
+
"a graphql request must not go out unauthenticated," <>
|
|
449
|
+
" but one reached the transport: " <> wire(r)
|
|
450
|
+
|
|
451
|
+
assert S.getprop(res, "ok") == false
|
|
452
|
+
assert err_message(res) =~ "vault unreachable"
|
|
453
|
+
|
|
454
|
+
c = recorder()
|
|
455
|
+
ok = ProjectName.graphql(
|
|
456
|
+
sdk(c, [{"feature", secrets([{"providers", providers([working()])}])}]),
|
|
457
|
+
"{ thing }", S.jm([]))
|
|
458
|
+
|
|
459
|
+
assert S.getprop(ok, "ok") == true, "the control request failed: " <> inspect(ok)
|
|
460
|
+
|
|
461
|
+
assert length(api(c)) == 1,
|
|
462
|
+
"the control request never reached system.fetch, so this test cannot" <>
|
|
463
|
+
" observe a request going out at all"
|
|
464
|
+
|
|
465
|
+
auth_is(hd(api(c)), "RAWKEY01")
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
# THE ENTITY PATH, which DOES run the hook pipeline - the other half of
|
|
469
|
+
# the seam. Resolution is at the transport for both, so one rule covers
|
|
470
|
+
# them; this proves it rather than assuming it.
|
|
471
|
+
#
|
|
472
|
+
# The entity is discovered from the SDK's own config rather than named,
|
|
473
|
+
# because this file is a TEMPLATE: it ships to every project, and no
|
|
474
|
+
# project's entity names are known here.
|
|
475
|
+
test "active: a provider ERROR fails an ENTITY op rather than sending" do
|
|
476
|
+
r = recorder()
|
|
477
|
+
client = sdk(r, [{"feature", secrets([{"providers", providers([broken()])}])}])
|
|
478
|
+
|
|
479
|
+
case list_op(client) do
|
|
480
|
+
nil ->
|
|
481
|
+
# An SDK with no listable entity has no entity path to exercise.
|
|
482
|
+
:ok
|
|
483
|
+
|
|
484
|
+
op ->
|
|
485
|
+
# The op FAILS - that is the point - and by default an entity op
|
|
486
|
+
# raises rather than returning its error, so the refusal is caught
|
|
487
|
+
# here and matched on the PROVIDER'S OWN message. An unrelated
|
|
488
|
+
# failure (a blocked op, a missing route) must not stand in for
|
|
489
|
+
# fail-closed.
|
|
490
|
+
assert opfail(op) =~ "vault unreachable",
|
|
491
|
+
"the entity op did not fail with the provider's own error: " <> opfail(op)
|
|
492
|
+
|
|
493
|
+
assert api(r) == [],
|
|
494
|
+
"an entity op must not go out unauthenticated because a provider" <>
|
|
495
|
+
" broke, but one reached the transport: " <> wire(r)
|
|
496
|
+
|
|
497
|
+
c = recorder()
|
|
498
|
+
control = sdk(c, [{"feature", secrets([{"providers", providers([working()])}])}])
|
|
499
|
+
|
|
500
|
+
# The control op itself may fail on the stub's response shape -
|
|
501
|
+
# irrelevant here. What matters is that the request reached the
|
|
502
|
+
# transport carrying the resolved credential.
|
|
503
|
+
opfail(list_op(control))
|
|
504
|
+
|
|
505
|
+
assert length(api(c)) == 1,
|
|
506
|
+
"the control entity op never reached system.fetch, so this test" <>
|
|
507
|
+
" cannot observe a request going out at all"
|
|
508
|
+
|
|
509
|
+
auth_is(hd(api(c)), "RAWKEY01")
|
|
510
|
+
end
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
# A MALFORMED chain entry is a refusal, not a shorter chain. `providers:
|
|
514
|
+
# ["hashicorp"]` - the bare kind where a spec map was meant - is neither
|
|
515
|
+
# a provider nor a spec, and the feature used to DROP it silently: the
|
|
516
|
+
# chain was then empty, every provider "missed", and the request went
|
|
517
|
+
# out unauthenticated. Fail-open from a typo. Now the entry raises with
|
|
518
|
+
# sekreto's own wording at init, that error is held as the init failure,
|
|
519
|
+
# and the transport gate refuses every path on it - entity, direct AND
|
|
520
|
+
# graphql - because the gate sits on the fetcher slot the raw paths
|
|
521
|
+
# (which run no feature hooks at all) reach through Utility.fetcher/3.
|
|
522
|
+
#
|
|
523
|
+
# The control leg comes FIRST, with the same construction and a WORKING
|
|
524
|
+
# provider, so that an empty recorder means REFUSED rather than UNWIRED.
|
|
525
|
+
test "active: a malformed providers entry refuses every path rather than being dropped" do
|
|
526
|
+
# CONTROL: a well-formed chain reaches the transport once, credentialed.
|
|
527
|
+
c = recorder()
|
|
528
|
+
control = sdk(c, [{"feature", secrets([{"providers", providers([working()])}])}])
|
|
529
|
+
assert S.getprop(ProjectName.direct(control, S.jm(["path", "/thing"])), "ok") == true
|
|
530
|
+
|
|
531
|
+
assert length(api(c)) == 1,
|
|
532
|
+
"the control request never reached system.fetch, so this test cannot" <>
|
|
533
|
+
" observe a request going out at all"
|
|
534
|
+
|
|
535
|
+
auth_is(hd(api(c)), "RAWKEY01")
|
|
536
|
+
|
|
537
|
+
# THE RULE, on all three wire paths, with NO apikey so a dropped entry
|
|
538
|
+
# would leave nothing to send and the leak would be an unauthenticated
|
|
539
|
+
# request rather than a wrong credential.
|
|
540
|
+
r = recorder()
|
|
541
|
+
client = sdk(r, [{"feature", secrets([{"providers", providers(["hashicorp"])}])}])
|
|
542
|
+
|
|
543
|
+
direct = ProjectName.direct(client, S.jm(["path", "/thing"]))
|
|
544
|
+
assert S.getprop(direct, "ok") == false, "direct() went out on a malformed chain"
|
|
545
|
+
|
|
546
|
+
assert err_message(direct) =~ "not a provider or a provider spec",
|
|
547
|
+
"direct() did not fail with sekreto's own refusal: " <> err_message(direct)
|
|
548
|
+
|
|
549
|
+
assert err_message(direct) =~ "hashicorp",
|
|
550
|
+
"the refusal does not name the offending entry: " <> err_message(direct)
|
|
551
|
+
|
|
552
|
+
gql = ProjectName.graphql(client, "{ thing }", S.jm([]))
|
|
553
|
+
assert S.getprop(gql, "ok") == false, "graphql() went out on a malformed chain"
|
|
554
|
+
assert err_message(gql) =~ "not a provider or a provider spec"
|
|
555
|
+
|
|
556
|
+
case list_op(client) do
|
|
557
|
+
nil ->
|
|
558
|
+
# An SDK with no listable entity has no entity path to exercise;
|
|
559
|
+
# the two raw paths above still hold the rule.
|
|
560
|
+
:ok
|
|
561
|
+
|
|
562
|
+
op ->
|
|
563
|
+
assert opfail(op) =~ "not a provider or a provider spec",
|
|
564
|
+
"the entity op did not fail with sekreto's own refusal: " <> opfail(op)
|
|
565
|
+
end
|
|
566
|
+
|
|
567
|
+
assert api(r) == [],
|
|
568
|
+
"a request must not go out because a malformed entry was dropped from" <>
|
|
569
|
+
" the chain, but one reached the transport: " <> wire(r)
|
|
570
|
+
|
|
571
|
+
assert token(r) == []
|
|
572
|
+
end
|
|
573
|
+
|
|
574
|
+
# A settled failure must not be held. Holding one meant a transient vault
|
|
575
|
+
# outage poisoned the client permanently: every later operation kept
|
|
576
|
+
# failing with the original error long after the vault recovered.
|
|
577
|
+
test "active: a provider recovers after a transient failure" do
|
|
578
|
+
n = :counters.new(1, [])
|
|
579
|
+
|
|
580
|
+
flaky = %{
|
|
581
|
+
lookup: fn _ ->
|
|
582
|
+
:counters.add(n, 1, 1)
|
|
583
|
+
|
|
584
|
+
if :counters.get(n, 1) == 1 do
|
|
585
|
+
raise Sekreto.Error, message: "vault unreachable"
|
|
586
|
+
else
|
|
587
|
+
"RECOVERED01"
|
|
588
|
+
end
|
|
589
|
+
end,
|
|
590
|
+
describe: fn -> "flaky:test" end
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
r = recorder()
|
|
594
|
+
client = sdk(r, [{"feature", secrets([{"providers", providers([flaky])}])}])
|
|
595
|
+
|
|
596
|
+
first = ProjectName.direct(client, S.jm(["path", "/one"]))
|
|
597
|
+
assert S.getprop(first, "ok") == false, "the first attempt should surface the outage"
|
|
598
|
+
assert api(r) == []
|
|
599
|
+
|
|
600
|
+
second = ProjectName.direct(client, S.jm(["path", "/two"]))
|
|
601
|
+
assert S.getprop(second, "ok") == true, "the second attempt should recover"
|
|
602
|
+
assert length(api(r)) == 1
|
|
603
|
+
auth_is(hd(api(r)), "RECOVERED01")
|
|
604
|
+
end
|
|
605
|
+
|
|
606
|
+
# `cache: false` is documented as "every resolve asks the chain again".
|
|
607
|
+
# Keeping the settled result made that a lie.
|
|
608
|
+
test "active: cache false asks the chain on every request" do
|
|
609
|
+
n = :counters.new(1, [])
|
|
610
|
+
|
|
611
|
+
counting = %{
|
|
612
|
+
lookup: fn _ ->
|
|
613
|
+
:counters.add(n, 1, 1)
|
|
614
|
+
"KEY" <> Integer.to_string(:counters.get(n, 1))
|
|
615
|
+
end,
|
|
616
|
+
describe: fn -> "counting:test" end
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
r = recorder()
|
|
620
|
+
|
|
621
|
+
client =
|
|
622
|
+
sdk(r, [{"feature", secrets([{"cache", false}, {"providers", providers([counting])}])}])
|
|
623
|
+
|
|
624
|
+
ProjectName.direct(client, S.jm(["path", "/one"]))
|
|
625
|
+
ProjectName.direct(client, S.jm(["path", "/two"]))
|
|
626
|
+
|
|
627
|
+
assert :counters.get(n, 1) > 1,
|
|
628
|
+
"the chain was asked once and cached, despite cache: false"
|
|
629
|
+
|
|
630
|
+
auth_is(Enum.at(api(r), 0), "KEY1")
|
|
631
|
+
auth_is(Enum.at(api(r), 1), "KEY2")
|
|
632
|
+
end
|
|
633
|
+
|
|
634
|
+
# A MISS IS NOT A CACHEABLE ANSWER - sekreto's own rule, which this
|
|
635
|
+
# feature used to override from the layer above.
|
|
636
|
+
#
|
|
637
|
+
# DEFAULT caching here, which is the whole point: `cache: true` is about
|
|
638
|
+
# holding a HIT (the test below pins that half), and keeping the settled
|
|
639
|
+
# resolution after a miss meant the chain was never asked again for the
|
|
640
|
+
# life of the client. A secret provisioned after startup (a mounted
|
|
641
|
+
# file, a vault policy granted a minute late) was invisible forever.
|
|
642
|
+
test "active: a cached MISS is re-asked, so a late secret is picked up" do
|
|
643
|
+
n = :counters.new(1, [])
|
|
644
|
+
present = :counters.new(1, [])
|
|
645
|
+
|
|
646
|
+
late = %{
|
|
647
|
+
lookup: fn _ ->
|
|
648
|
+
:counters.add(n, 1, 1)
|
|
649
|
+
if :counters.get(present, 1) > 0, do: "LATEKEY01", else: nil
|
|
650
|
+
end,
|
|
651
|
+
describe: fn -> "late:test" end
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
r = recorder()
|
|
655
|
+
client = sdk(r, [{"feature", secrets([{"providers", providers([late])}])}])
|
|
656
|
+
|
|
657
|
+
ProjectName.direct(client, S.jm(["path", "/one"]))
|
|
658
|
+
assert Enum.at(api(r), 0).auth == nil,
|
|
659
|
+
"the chain has nothing yet, so no credential should go out"
|
|
660
|
+
|
|
661
|
+
asked = :counters.get(n, 1)
|
|
662
|
+
assert asked > 0
|
|
663
|
+
|
|
664
|
+
# The secret is provisioned while the client is live.
|
|
665
|
+
:counters.add(present, 1, 1)
|
|
666
|
+
|
|
667
|
+
ProjectName.direct(client, S.jm(["path", "/two"]))
|
|
668
|
+
|
|
669
|
+
assert :counters.get(n, 1) > asked,
|
|
670
|
+
"the MISS was cached: a secret that appears later can never be picked up"
|
|
671
|
+
|
|
672
|
+
auth_is(Enum.at(api(r), 1), "LATEKEY01")
|
|
673
|
+
end
|
|
674
|
+
|
|
675
|
+
test "active: caching on asks the chain once" do
|
|
676
|
+
n = :counters.new(1, [])
|
|
677
|
+
counting = %{
|
|
678
|
+
lookup: fn _ -> :counters.add(n, 1, 1); "CACHED01" end,
|
|
679
|
+
describe: fn -> "counting:test" end
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
r = recorder()
|
|
683
|
+
client = sdk(r, [{"feature", secrets([{"providers", providers([counting])}])}])
|
|
684
|
+
|
|
685
|
+
ProjectName.direct(client, S.jm(["path", "/one"]))
|
|
686
|
+
ProjectName.direct(client, S.jm(["path", "/two"]))
|
|
687
|
+
|
|
688
|
+
assert :counters.get(n, 1) == 1
|
|
689
|
+
assert length(api(r)) == 2
|
|
690
|
+
auth_is(Enum.at(api(r), 1), "CACHED01")
|
|
691
|
+
end
|
|
692
|
+
|
|
693
|
+
test "active: the secret name is configurable" do
|
|
694
|
+
System.put_env(@envprefix <> "API_TOKEN", "TOKKEY01")
|
|
695
|
+
|
|
696
|
+
r = recorder()
|
|
697
|
+
ProjectName.direct(sdk(r, [{"feature", envchain([{"name", "api.token"}])}]),
|
|
698
|
+
S.jm(["path", "/thing"]))
|
|
699
|
+
|
|
700
|
+
auth_is(hd(api(r)), "TOKKEY01")
|
|
701
|
+
end
|
|
702
|
+
|
|
703
|
+
test "active: sekreto is live for arbitrary secrets and redaction" do
|
|
704
|
+
r = recorder()
|
|
705
|
+
|
|
706
|
+
client =
|
|
707
|
+
sdk(r, [{"feature",
|
|
708
|
+
secrets([{"providers",
|
|
709
|
+
providers([spec(["kind", "memory", "values", S.jm(["DB_PASSWORD", "dbpass01"])])])}])}])
|
|
710
|
+
|
|
711
|
+
sek = Secrets.sekreto(client)
|
|
712
|
+
assert Sekreto.get(sek, "db.password") == "dbpass01"
|
|
713
|
+
|
|
714
|
+
assert Sekreto.redactall(sek, "the password is dbpass01, keep it safe") ==
|
|
715
|
+
"the password is [redacted], keep it safe"
|
|
716
|
+
end
|
|
717
|
+
|
|
718
|
+
# THE PROVIDER VOCABULARY IS NON-EMPTY.
|
|
719
|
+
#
|
|
720
|
+
# Upstream sekreto retired its self-registration registry: a kind that
|
|
721
|
+
# was not passed in `plugins:` is unknown to that Sekreto. The generated
|
|
722
|
+
# Config.feature_plugins/1 is what passes them, so an SDK whose model
|
|
723
|
+
# selects a plugin group but whose config emitted no definitions would
|
|
724
|
+
# carry the plugin MODULES and refuse every one of their kinds at
|
|
725
|
+
# runtime - while every test that used only built-in kinds stayed green.
|
|
726
|
+
#
|
|
727
|
+
# Conditional on the module being present, because this file ships to
|
|
728
|
+
# projects that select the feature without the `vault` plugin group.
|
|
729
|
+
test "active: a selected plugin kind is in the SDK vocabulary" do
|
|
730
|
+
if Code.ensure_loaded?(Sekreto.Plugins.Hashicorp) do
|
|
731
|
+
# Construction is where an unknown kind is refused, so the chain
|
|
732
|
+
# building at all IS the regression check. The memory store comes
|
|
733
|
+
# FIRST so sekreto's first-hit rule answers from it and the vault is
|
|
734
|
+
# never contacted - the kind has to be declarable, not reachable.
|
|
735
|
+
r = recorder()
|
|
736
|
+
|
|
737
|
+
client =
|
|
738
|
+
sdk(r, [{"feature",
|
|
739
|
+
secrets([{"providers", providers([
|
|
740
|
+
spec(["kind", "memory", "values", S.jm(["APIKEY", "VOCAB01"])]),
|
|
741
|
+
spec(["kind", "hashicorp", "addr", "https://vault.test", "token", "x"])
|
|
742
|
+
])}])}])
|
|
743
|
+
|
|
744
|
+
assert S.getprop(ProjectName.direct(client, S.jm(["path", "/thing"])), "ok") == true
|
|
745
|
+
auth_is(hd(api(r)), "VOCAB01")
|
|
746
|
+
end
|
|
747
|
+
end
|
|
748
|
+
|
|
749
|
+
# ELIXIR-ONLY. sekreto keeps per-chain state in an Agent started with
|
|
750
|
+
# `Agent.start_link`, so it is LINKED to whichever process built the
|
|
751
|
+
# client. A client constructed in a process that later exits ABNORMALLY
|
|
752
|
+
# leaves a dead Agent, and the next lookup EXITS with `:noproc` rather
|
|
753
|
+
# than raising - which is neither a miss nor a provider error, and would
|
|
754
|
+
# crash the calling process instead of failing the operation. The feature
|
|
755
|
+
# catches that exit and rebuilds the chain once.
|
|
756
|
+
test "active: a dead provider cell is rebuilt rather than crashing the op" do
|
|
757
|
+
r = recorder()
|
|
758
|
+
parent = self()
|
|
759
|
+
|
|
760
|
+
spawn(fn ->
|
|
761
|
+
client =
|
|
762
|
+
sdk(r, [{"feature",
|
|
763
|
+
secrets([{"providers",
|
|
764
|
+
providers([spec(["kind", "memory", "values", S.jm(["APIKEY", "CELLKEY01"])])])}])}])
|
|
765
|
+
|
|
766
|
+
send(parent, {:client, client})
|
|
767
|
+
Process.sleep(20)
|
|
768
|
+
exit(:boom)
|
|
769
|
+
end)
|
|
770
|
+
|
|
771
|
+
client = receive do
|
|
772
|
+
{:client, c} -> c
|
|
773
|
+
after
|
|
774
|
+
2000 -> flunk("the builder process never handed the client back")
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
# Wait for the owner's exit to take the Agent with it, and prove it
|
|
778
|
+
# did: without a dead cell this test asserts nothing.
|
|
779
|
+
cell = S.getprop(Secrets.feature(client), "_sekreto").state
|
|
780
|
+
wait_dead(cell, 100)
|
|
781
|
+
refute Process.alive?(cell), "the provider cell did not die, so this test is inert"
|
|
782
|
+
|
|
783
|
+
res = ProjectName.direct(client, S.jm(["path", "/thing"]))
|
|
784
|
+
|
|
785
|
+
assert S.getprop(res, "ok") == true,
|
|
786
|
+
"a dead provider cell must not fail the operation: " <> inspect(res)
|
|
787
|
+
|
|
788
|
+
assert length(api(r)) == 1
|
|
789
|
+
auth_is(hd(api(r)), "CELLKEY01")
|
|
790
|
+
end
|
|
791
|
+
end
|
|
792
|
+
|
|
793
|
+
# ACCESS-TOKEN EXCHANGE.
|
|
794
|
+
#
|
|
795
|
+
# The shape these tests pin: what the chain resolves is a REFRESH token,
|
|
796
|
+
# which is POSTed to a token endpoint for a short-lived ACCESS token; the
|
|
797
|
+
# access token is what the Authorization header carries; and when the API
|
|
798
|
+
# answers 401 the client buys another and tries the same request again,
|
|
799
|
+
# once.
|
|
800
|
+
#
|
|
801
|
+
# A LIVE client throughout. Test mode is deliberately excluded here - it
|
|
802
|
+
# buys nothing, which is the subject of its own test at the end.
|
|
803
|
+
describe "secrets exchange" do
|
|
804
|
+
@refresh "REFRESH01"
|
|
805
|
+
|
|
806
|
+
defp exchange_sdk(r, xextra \\ [], extra \\ []) do
|
|
807
|
+
x = S.jm(["active", true])
|
|
808
|
+
Enum.each(xextra, fn {k, v} -> S.setprop(x, k, v) end)
|
|
809
|
+
|
|
810
|
+
fopts =
|
|
811
|
+
secrets([
|
|
812
|
+
{"name", "refresh_token"},
|
|
813
|
+
{"providers", providers([S.jm(["kind", "env", "prefix", @envprefix])])},
|
|
814
|
+
{"exchange", x}
|
|
815
|
+
])
|
|
816
|
+
|
|
817
|
+
sdk(r, [{"feature", fopts} | extra])
|
|
818
|
+
end
|
|
819
|
+
|
|
820
|
+
test "the refresh token buys an access token, and the request carries it" do
|
|
821
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
822
|
+
|
|
823
|
+
r = recorder()
|
|
824
|
+
ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
|
|
825
|
+
|
|
826
|
+
assert length(token(r)) == 1, "expected exactly one token purchase"
|
|
827
|
+
|
|
828
|
+
assert S.getprop(ProjectName.Json.parse(hd(token(r)).body), "refresh_token") == @refresh,
|
|
829
|
+
"the refresh token is sent in the request field"
|
|
830
|
+
|
|
831
|
+
assert length(api(r)) == 1
|
|
832
|
+
auth_is(hd(api(r)), "ACCESS01")
|
|
833
|
+
end
|
|
834
|
+
|
|
835
|
+
test "an explicit exchange.refresh wins over the chain" do
|
|
836
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", "FROMCHAIN")
|
|
837
|
+
|
|
838
|
+
r = recorder()
|
|
839
|
+
ProjectName.direct(exchange_sdk(r, [{"refresh", "EXPLICIT01"}]), S.jm(["path", "/thing"]))
|
|
840
|
+
|
|
841
|
+
assert S.getprop(ProjectName.Json.parse(hd(token(r)).body), "refresh_token") == "EXPLICIT01"
|
|
842
|
+
end
|
|
843
|
+
|
|
844
|
+
# The exchange side of the same invariant: the ACCESS token the purchase
|
|
845
|
+
# buys is held in feature state too. `buy/2` is a second writer of the
|
|
846
|
+
# credential, so the rule is pinned at this seam as well as at the plain
|
|
847
|
+
# resolution above.
|
|
848
|
+
test "a bought access token lives in feature state, never in the options map" do
|
|
849
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
850
|
+
|
|
851
|
+
r = recorder()
|
|
852
|
+
client = exchange_sdk(r)
|
|
853
|
+
before = S.getprop(ProjectName.options_map(client), "apikey")
|
|
854
|
+
|
|
855
|
+
ProjectName.direct(client, S.jm(["path", "/thing"]))
|
|
856
|
+
|
|
857
|
+
# CONTROL: bought once, sent once, carrying what was bought.
|
|
858
|
+
assert length(token(r)) == 1, "expected exactly one token purchase"
|
|
859
|
+
assert length(api(r)) == 1
|
|
860
|
+
auth_is(hd(api(r)), "ACCESS01")
|
|
861
|
+
assert Secrets.credential(client) == "ACCESS01"
|
|
862
|
+
|
|
863
|
+
after_ = S.getprop(ProjectName.options_map(client), "apikey")
|
|
864
|
+
|
|
865
|
+
assert after_ == before,
|
|
866
|
+
"the token purchase changed options.apikey from " <> inspect(before) <>
|
|
867
|
+
" to " <> inspect(after_)
|
|
868
|
+
|
|
869
|
+
refute credential?(after_, "ACCESS01"),
|
|
870
|
+
"the bought access token was published into the options map"
|
|
871
|
+
|
|
872
|
+
refute credential?(after_, @refresh),
|
|
873
|
+
"the refresh token was published into the options map"
|
|
874
|
+
end
|
|
875
|
+
|
|
876
|
+
test "one purchase serves many requests" do
|
|
877
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
878
|
+
|
|
879
|
+
r = recorder()
|
|
880
|
+
client = exchange_sdk(r)
|
|
881
|
+
ProjectName.direct(client, S.jm(["path", "/one"]))
|
|
882
|
+
ProjectName.direct(client, S.jm(["path", "/two"]))
|
|
883
|
+
ProjectName.direct(client, S.jm(["path", "/three"]))
|
|
884
|
+
|
|
885
|
+
assert length(token(r)) == 1, "a token still working must not be re-bought"
|
|
886
|
+
assert length(api(r)) == 3
|
|
887
|
+
end
|
|
888
|
+
|
|
889
|
+
test "a 401 buys another token and retries the SAME request" do
|
|
890
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
891
|
+
|
|
892
|
+
r = recorder(%{api: [401, 200]})
|
|
893
|
+
res = ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
|
|
894
|
+
|
|
895
|
+
assert length(token(r)) == 2, "expected a second token purchase"
|
|
896
|
+
assert length(api(r)) == 2, "expected the request to be retried"
|
|
897
|
+
|
|
898
|
+
auth_is(Enum.at(api(r), 0), "ACCESS01")
|
|
899
|
+
# The retry must carry the NEW token, not the spent one.
|
|
900
|
+
auth_is(Enum.at(api(r), 1), "ACCESS02")
|
|
901
|
+
|
|
902
|
+
assert S.getprop(res, "ok") == true, "the caller sees the successful retry"
|
|
903
|
+
end
|
|
904
|
+
|
|
905
|
+
test "the retry happens once, not in a loop" do
|
|
906
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
907
|
+
|
|
908
|
+
# Every API call is refused: a second 401 on a token bought moments ago
|
|
909
|
+
# is a real failure, and spinning on it would hang instead of failing.
|
|
910
|
+
r = recorder(%{api: [401]})
|
|
911
|
+
ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
|
|
912
|
+
|
|
913
|
+
assert length(api(r)) == 2, "exactly one retry"
|
|
914
|
+
assert length(token(r)) == 2
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
test "a status outside exchange.statuses is not an expiry" do
|
|
918
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
919
|
+
|
|
920
|
+
r = recorder(%{api: [403]})
|
|
921
|
+
ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
|
|
922
|
+
|
|
923
|
+
assert length(api(r)) == 1, "403 is not in the default statuses"
|
|
924
|
+
assert length(token(r)) == 1
|
|
925
|
+
end
|
|
926
|
+
|
|
927
|
+
test "exchange.statuses is configurable" do
|
|
928
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
929
|
+
|
|
930
|
+
r = recorder(%{api: [403, 200]})
|
|
931
|
+
ProjectName.direct(exchange_sdk(r, [{"statuses", S.jt([403])}]), S.jm(["path", "/thing"]))
|
|
932
|
+
|
|
933
|
+
assert length(api(r)) == 2, "403 was declared an expiry"
|
|
934
|
+
end
|
|
935
|
+
|
|
936
|
+
test "the endpoint and the request and response field names are configurable" do
|
|
937
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
938
|
+
|
|
939
|
+
r = recorder(%{response: "token", path: "oauth/grant"})
|
|
940
|
+
|
|
941
|
+
client =
|
|
942
|
+
exchange_sdk(r, [
|
|
943
|
+
{"path", "oauth/grant"},
|
|
944
|
+
{"request", "grant"},
|
|
945
|
+
{"response", "token"}
|
|
946
|
+
])
|
|
947
|
+
|
|
948
|
+
ProjectName.direct(client, S.jm(["path", "/thing"]))
|
|
949
|
+
|
|
950
|
+
assert length(token(r)) == 1
|
|
951
|
+
|
|
952
|
+
assert String.ends_with?(hd(token(r)).url, "/oauth/grant"),
|
|
953
|
+
"the token endpoint is relative to base: " <> hd(token(r)).url
|
|
954
|
+
|
|
955
|
+
assert S.getprop(ProjectName.Json.parse(hd(token(r)).body), "grant") == @refresh
|
|
956
|
+
auth_is(hd(api(r)), "ACCESS01")
|
|
957
|
+
end
|
|
958
|
+
|
|
959
|
+
test "an explicit apikey is spent before anything is bought" do
|
|
960
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
961
|
+
|
|
962
|
+
# A caller who already holds an access token should use it; expiry is
|
|
963
|
+
# what moves them onto the exchange, and the API is what says so.
|
|
964
|
+
r = recorder()
|
|
965
|
+
ProjectName.direct(exchange_sdk(r, [], [{"apikey", "HELDTOKEN01"}]), S.jm(["path", "/thing"]))
|
|
966
|
+
|
|
967
|
+
assert token(r) == [], "nothing needed buying"
|
|
968
|
+
auth_is(hd(api(r)), "HELDTOKEN01")
|
|
969
|
+
end
|
|
970
|
+
|
|
971
|
+
test "a held apikey that has expired falls through to the exchange" do
|
|
972
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
973
|
+
|
|
974
|
+
r = recorder(%{api: [401, 200]})
|
|
975
|
+
ProjectName.direct(exchange_sdk(r, [], [{"apikey", "STALETOKEN01"}]), S.jm(["path", "/thing"]))
|
|
976
|
+
|
|
977
|
+
auth_is(Enum.at(api(r), 0), "STALETOKEN01")
|
|
978
|
+
auth_is(Enum.at(api(r), 1), "ACCESS01")
|
|
979
|
+
end
|
|
980
|
+
|
|
981
|
+
test "no refresh token anywhere is an error, not an unauthenticated call" do
|
|
982
|
+
r = recorder()
|
|
983
|
+
res = ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
|
|
984
|
+
|
|
985
|
+
assert S.getprop(res, "ok") == false, "expected a failure, got: " <> inspect(res)
|
|
986
|
+
assert err_message(res) =~ "no refresh token"
|
|
987
|
+
|
|
988
|
+
assert api(r) == [],
|
|
989
|
+
"a request must not go out unauthenticated because the chain was empty: " <> wire(r)
|
|
990
|
+
end
|
|
991
|
+
|
|
992
|
+
test "a failing token endpoint surfaces the API refusal, not a spin" do
|
|
993
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
994
|
+
|
|
995
|
+
# The first purchase succeeds; the second (after the 401) does not.
|
|
996
|
+
r = recorder(%{api: [401], tokenfail: 2})
|
|
997
|
+
res = ProjectName.direct(exchange_sdk(r), S.jm(["path", "/thing"]))
|
|
998
|
+
|
|
999
|
+
assert res != nil, "the caller got an answer rather than a hang"
|
|
1000
|
+
assert length(api(r)) == 1, "no retry after a failed purchase"
|
|
1001
|
+
end
|
|
1002
|
+
|
|
1003
|
+
test "auth nil suppresses the credential and buys nothing" do
|
|
1004
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
1005
|
+
|
|
1006
|
+
# `auth: nil` is the documented way to send no credential at all. A
|
|
1007
|
+
# refusal of a deliberately unauthenticated request is not an expired
|
|
1008
|
+
# token: buying one and retrying would transmit exactly the credential
|
|
1009
|
+
# the caller suppressed.
|
|
1010
|
+
r = recorder(%{api: [401]})
|
|
1011
|
+
ProjectName.direct(exchange_sdk(r, [], [{"auth", nil}]), S.jm(["path", "/thing"]))
|
|
1012
|
+
|
|
1013
|
+
assert length(api(r)) == 1, "a suppressed request must not be retried"
|
|
1014
|
+
assert hd(api(r)).auth == nil, "no credential may be sent when auth is suppressed"
|
|
1015
|
+
assert token(r) == [], "a suppressed request must not buy a token either"
|
|
1016
|
+
end
|
|
1017
|
+
|
|
1018
|
+
test "exchange off leaves the feature exactly as it was" do
|
|
1019
|
+
System.put_env(@envprefix <> "APIKEY", "PLAINKEY01")
|
|
1020
|
+
|
|
1021
|
+
r = recorder()
|
|
1022
|
+
ProjectName.direct(sdk(r, [{"feature", envchain()}]), S.jm(["path", "/thing"]))
|
|
1023
|
+
|
|
1024
|
+
assert token(r) == []
|
|
1025
|
+
auth_is(hd(api(r)), "PLAINKEY01")
|
|
1026
|
+
end
|
|
1027
|
+
|
|
1028
|
+
test "test mode buys nothing and needs no token endpoint" do
|
|
1029
|
+
System.put_env(@envprefix <> "REFRESH_TOKEN", @refresh)
|
|
1030
|
+
|
|
1031
|
+
r = recorder()
|
|
1032
|
+
|
|
1033
|
+
client =
|
|
1034
|
+
ProjectName.test(S.jm([]), S.jm([
|
|
1035
|
+
"base", @base,
|
|
1036
|
+
"allow", S.jm(["op", "direct,graphql,list,load"]),
|
|
1037
|
+
"system", S.jm(["fetch", r.fetch]),
|
|
1038
|
+
"feature",
|
|
1039
|
+
secrets([
|
|
1040
|
+
{"name", "refresh_token"},
|
|
1041
|
+
{"providers", providers([S.jm(["kind", "env", "prefix", @envprefix])])},
|
|
1042
|
+
{"exchange", S.jm(["active", true])}
|
|
1043
|
+
])
|
|
1044
|
+
]))
|
|
1045
|
+
|
|
1046
|
+
ProjectName.direct(client, S.jm(["path", "/thing"]))
|
|
1047
|
+
|
|
1048
|
+
assert calls(r) == [], "test mode must not do IO"
|
|
1049
|
+
|
|
1050
|
+
# A deterministic placeholder, so offline suites need no configuration.
|
|
1051
|
+
assert Secrets.credential(client) == "test-access_token"
|
|
1052
|
+
end
|
|
1053
|
+
end
|
|
1054
|
+
|
|
1055
|
+
# ---- template helpers ----------------------------------------------------
|
|
1056
|
+
|
|
1057
|
+
# A callable `list` op for SOME entity this SDK generates, or nil.
|
|
1058
|
+
#
|
|
1059
|
+
# SEARCH for a usable op rather than taking the first entity and hoping: an
|
|
1060
|
+
# API's first entity by name need not have a `list`, and a template cannot
|
|
1061
|
+
# know which does.
|
|
1062
|
+
defp list_op(client) do
|
|
1063
|
+
ents = S.getprop(ProjectName.Config.make_config(), "entity")
|
|
1064
|
+
|
|
1065
|
+
if not S.ismap(ents) do
|
|
1066
|
+
nil
|
|
1067
|
+
else
|
|
1068
|
+
Enum.find_value(S.keysof(ents), fn name ->
|
|
1069
|
+
if S.ismap(S.getpath(ents, name <> ".op.list")) do
|
|
1070
|
+
factory = existing_atom(name)
|
|
1071
|
+
|
|
1072
|
+
if factory != nil and
|
|
1073
|
+
Enum.member?(ProjectName.__info__(:functions), {factory, 2}) do
|
|
1074
|
+
ent = apply(ProjectName, factory, [client, nil])
|
|
1075
|
+
mod = S.getprop(ent, "_module")
|
|
1076
|
+
|
|
1077
|
+
if mod != nil and Code.ensure_loaded?(mod) and function_exported?(mod, :list, 3) do
|
|
1078
|
+
fn -> apply(mod, :list, [ent, nil, nil]) end
|
|
1079
|
+
end
|
|
1080
|
+
end
|
|
1081
|
+
end
|
|
1082
|
+
end)
|
|
1083
|
+
end
|
|
1084
|
+
end
|
|
1085
|
+
|
|
1086
|
+
# Run an entity op and answer with its failure MESSAGE ("" when it
|
|
1087
|
+
# succeeded). An entity op raises by default rather than returning its
|
|
1088
|
+
# error, so a fail-closed assertion has to reach the message through the
|
|
1089
|
+
# raise.
|
|
1090
|
+
defp opfail(op) do
|
|
1091
|
+
out = op.()
|
|
1092
|
+
if is_exception(out), do: Exception.message(out), else: ""
|
|
1093
|
+
rescue
|
|
1094
|
+
e -> Exception.message(e)
|
|
1095
|
+
end
|
|
1096
|
+
|
|
1097
|
+
defp existing_atom(name) do
|
|
1098
|
+
String.to_existing_atom(name)
|
|
1099
|
+
rescue
|
|
1100
|
+
ArgumentError -> nil
|
|
1101
|
+
end
|
|
1102
|
+
|
|
1103
|
+
defp wait_dead(_pid, 0), do: :ok
|
|
1104
|
+
|
|
1105
|
+
defp wait_dead(pid, n) do
|
|
1106
|
+
if Process.alive?(pid) do
|
|
1107
|
+
Process.sleep(10)
|
|
1108
|
+
wait_dead(pid, n - 1)
|
|
1109
|
+
else
|
|
1110
|
+
:ok
|
|
1111
|
+
end
|
|
1112
|
+
end
|
|
1113
|
+
end
|