@voxgig/sdkgen 4.10.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/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +330 -0
- package/project/.sdk/model/target/c.aon +15 -2
- package/project/.sdk/model/target/cpp.aon +18 -0
- package/project/.sdk/model/target/lua.aon +17 -0
- package/project/.sdk/model/target/ocaml.aon +48 -5
- 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/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/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/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/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/c/tests/feature/secrets/secrets_test.c +802 -0
- package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +38 -11
- package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +40 -6
- 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/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/cpp/test/feature/secrets/secrets_test.cpp +808 -0
- package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +34 -8
- package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +85 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +17 -2
- package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +41 -0
- package/project/.sdk/tm/go/feature/secrets_feature.go +32 -10
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +116 -0
- package/project/.sdk/tm/java/feature/SecretsFeature.java +33 -8
- package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +64 -0
- package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +34 -11
- package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +73 -0
- package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +32 -7
- package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +69 -0
- 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/src/feature/secrets/.gitkeep +0 -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/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/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +670 -0
- package/project/.sdk/tm/perl/feature/secrets_feature.pm +33 -12
- package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +47 -0
- package/project/.sdk/tm/php/feature/SecretsFeature.php +30 -6
- package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +98 -0
- package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +28 -6
- package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +114 -0
- package/project/.sdk/tm/rb/feature/secrets_feature.rb +28 -6
- package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +93 -0
- package/project/.sdk/tm/rust/feature/secrets.rs +33 -10
- package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +96 -0
- package/project/.sdk/tm/scala/feature/SecretsFeature.scala +29 -7
- package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +71 -0
- package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +35 -12
- package/project/.sdk/tm/ts/test/feature/secrets/Secrets.test.ts +73 -0
- 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/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/zig/test/feature/secrets/secrets_test.zig +891 -0
- package/project/sdkgen-package.json +1 -1
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin sdk-20260908-1556-0 (c/src/depend.c)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 48392f5e2b6d1434ee9b1a4a9a11f4480aaeb46a [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* Dependency cardinality, policy, and the restart graph (§11.3).
|
|
5
|
+
*
|
|
6
|
+
* TWO AXES, BOTH DECLARED BY THE DEFINITION THAT HAS THE REQUIREMENT,
|
|
7
|
+
* because only it knows what it can cope with:
|
|
8
|
+
*
|
|
9
|
+
* | static (default) | dynamic
|
|
10
|
+
* -------------|---------------------------|--------------------------
|
|
11
|
+
* mandatory | unmet -> pending; | unmet -> pending;
|
|
12
|
+
* (default) | lost -> pending, | lost -> STAYS LIVE,
|
|
13
|
+
* | recursively | notified
|
|
14
|
+
* -------------|---------------------------|--------------------------
|
|
15
|
+
* optional:true| never gates activation; | never gates activation;
|
|
16
|
+
* | a change deactivates and | a change is a
|
|
17
|
+
* | reactivates | notification, nothing else
|
|
18
|
+
*
|
|
19
|
+
* `dynamic` means the plugin has said, IN WRITING, that it can survive
|
|
20
|
+
* its provider being swapped underneath it. It is not the default
|
|
21
|
+
* because most plugins cannot, and the cost of wrongly assuming they
|
|
22
|
+
* can is a live instance holding a dead reference. */
|
|
23
|
+
|
|
24
|
+
#include <stdio.h>
|
|
25
|
+
#include <stdlib.h>
|
|
26
|
+
#include <string.h>
|
|
27
|
+
|
|
28
|
+
#include "depend.h"
|
|
29
|
+
#include "ref.h"
|
|
30
|
+
|
|
31
|
+
/* A bare string is shorthand for `{name}`. */
|
|
32
|
+
Value *normrequire(Value *r) {
|
|
33
|
+
if (visstr(r)) {
|
|
34
|
+
Value *out = vmap();
|
|
35
|
+
vset(out, "name", r);
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
return vismap(r) ? r : vmap();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* BOTH AXES ARE READ AT TWO LEVELS, AND THE PER-REQUIREMENT ONE WINS.
|
|
42
|
+
*
|
|
43
|
+
* The instance-level `policy` and `optional` list are how a DOCUMENT
|
|
44
|
+
* states the axis without editing the definition, and they apply to
|
|
45
|
+
* every requirement. The per-requirement form is strictly more
|
|
46
|
+
* expressive: an instance that is `static` on its store and `dynamic`
|
|
47
|
+
* on its metrics cannot be written at all at the instance level, and
|
|
48
|
+
* that is the ordinary case rather than an exotic one.
|
|
49
|
+
*
|
|
50
|
+
* `optional` UNIONS rather than overriding — both spellings say this
|
|
51
|
+
* requirement need not gate activation, and there is no reading under
|
|
52
|
+
* which one of them means "actually, mandatory". */
|
|
53
|
+
Value *requirements(Value *options) {
|
|
54
|
+
Value *raw = vget(options, "requires");
|
|
55
|
+
Value *marked = vget(options, "optional");
|
|
56
|
+
Value *fallback = vget(options, "policy");
|
|
57
|
+
|
|
58
|
+
Value *out = vlist();
|
|
59
|
+
for (size_t i = 0; i < vlen(raw); i++) {
|
|
60
|
+
Value *r = normrequire(vat(raw, i));
|
|
61
|
+
Value *o = vmap();
|
|
62
|
+
const char **keys;
|
|
63
|
+
size_t n = vkeys(r, &keys);
|
|
64
|
+
for (size_t j = 0; j < n; j++) vset(o, keys[j], vget(r, keys[j]));
|
|
65
|
+
|
|
66
|
+
bool opt = vtruthy(vget(r, "optional"));
|
|
67
|
+
if (!opt && vislist(marked)) {
|
|
68
|
+
for (size_t j = 0; j < vlen(marked); j++) {
|
|
69
|
+
if (vsame(vat(marked, j), vget(r, "name"))) { opt = true; break; }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (opt) vset(o, "optional", vbool(true));
|
|
73
|
+
|
|
74
|
+
if (visnull(vget(o, "policy")) && !visnull(fallback)) {
|
|
75
|
+
vset(o, "policy", fallback);
|
|
76
|
+
}
|
|
77
|
+
vpush(out, o);
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Does losing this requirement's SELECTED provider restart the
|
|
83
|
+
* consumer? The mandatory ones under `static`, and the `static`
|
|
84
|
+
* optional ones — both make a capability change deactivate and
|
|
85
|
+
* reactivate. `dynamic` never restarts. */
|
|
86
|
+
bool restartsonloss(Value *r) {
|
|
87
|
+
Value *p = vget(r, "policy");
|
|
88
|
+
const char *policy = visstr(p) ? vasstr(p) : "static";
|
|
89
|
+
return 0 != strcmp(policy, "dynamic");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* Does an unmet requirement keep the consumer out of `live`?
|
|
93
|
+
*
|
|
94
|
+
* CARDINALITY ALONE DECIDES THIS, NOT POLICY. `dynamic` is a statement
|
|
95
|
+
* about surviving a SWAP, not about starting without the thing at all —
|
|
96
|
+
* a mandatory-dynamic consumer still waits in `pending` for its first
|
|
97
|
+
* provider. Conflating the two would let a plugin that declared it can
|
|
98
|
+
* cope with replacement activate with nothing to call. */
|
|
99
|
+
bool gatesactivation(Value *r) {
|
|
100
|
+
return true != vasbool(vget(r, "optional"));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Edges that can cause a restart, which is exactly the set a cycle must
|
|
104
|
+
* be detected over (§11.3): the mandatory requirements AND THE `static`
|
|
105
|
+
* OPTIONAL ONES, because both make a capability change deactivate and
|
|
106
|
+
* reactivate the consumer — and a cycle of restarts does not settle.
|
|
107
|
+
*
|
|
108
|
+
* ONLY `dynamic` OPTIONAL EDGES ARE EXCLUDED, and they are the ones the
|
|
109
|
+
* exclusion was for. An earlier draft of §11.3 excluded EVERY optional
|
|
110
|
+
* edge and thereby admitted the non-terminating case it was trying to
|
|
111
|
+
* permit. */
|
|
112
|
+
bool restartcausing(Value *r) {
|
|
113
|
+
return gatesactivation(r) || restartsonloss(r);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static int bytewise(const void *a, const void *b) {
|
|
117
|
+
return strcmp(*(const char *const *)a, *(const char *const *)b);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
static bool listhas(Value *l, const char *s) {
|
|
121
|
+
for (size_t i = 0; i < vlen(l); i++) {
|
|
122
|
+
if (0 == strcmp(vasstr(vat(l, i)), s)) return true;
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
Value *dependencycycle(Value *nodes) {
|
|
128
|
+
/* TWO INDEXES, NOT ONE MERGED MAP. Capability names and refs are
|
|
129
|
+
* matched differently — a capability by its exact name, a ref through
|
|
130
|
+
* the canonical spelling (§4 rule 5) — and one map keyed by both can
|
|
131
|
+
* only do one of them. Keyed by both and looked up raw, a cycle
|
|
132
|
+
* spelled `a$`/`b$` finds no providers and EVADES the load-time check
|
|
133
|
+
* that exists to catch a non-terminating reconcile. */
|
|
134
|
+
Value *bycap = vmap();
|
|
135
|
+
Value *isref = vmap();
|
|
136
|
+
for (size_t i = 0; i < vlen(nodes); i++) {
|
|
137
|
+
Value *n = vat(nodes, i);
|
|
138
|
+
const char *nref = vasstr(vget(n, "ref"));
|
|
139
|
+
vset(isref, nref, vbool(true));
|
|
140
|
+
Value *provides = vget(n, "provides");
|
|
141
|
+
for (size_t j = 0; j < vlen(provides); j++) {
|
|
142
|
+
const char *cap = vasstr(vat(provides, j));
|
|
143
|
+
Value *l = vget(bycap, cap);
|
|
144
|
+
if (visnull(l)) { l = vlist(); vset(bycap, cap, l); }
|
|
145
|
+
vpush(l, vstr(nref));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
Value *edges = vmap();
|
|
150
|
+
for (size_t i = 0; i < vlen(nodes); i++) {
|
|
151
|
+
Value *n = vat(nodes, i);
|
|
152
|
+
const char *nref = vasstr(vget(n, "ref"));
|
|
153
|
+
Value *out = vlist();
|
|
154
|
+
Value *reqs = vget(n, "requires");
|
|
155
|
+
for (size_t j = 0; j < vlen(reqs); j++) {
|
|
156
|
+
Value *r = vat(reqs, j);
|
|
157
|
+
if (!restartcausing(r)) continue;
|
|
158
|
+
const char *rname = visstr(vget(r, "name")) ? vasstr(vget(r, "name")) : "";
|
|
159
|
+
Value *from = vlist();
|
|
160
|
+
Value *caps = vget(bycap, rname);
|
|
161
|
+
for (size_t k = 0; k < vlen(caps); k++) vpush(from, vat(caps, k));
|
|
162
|
+
/* A node satisfies its own name AS A REF (§11.1), canonically —
|
|
163
|
+
* exactly what `providersof` does at runtime, so the load-time
|
|
164
|
+
* graph and the running one agree about what an edge is. */
|
|
165
|
+
const char *asref = tryref(rname);
|
|
166
|
+
if (NULL != asref && vhas(isref, asref) && !listhas(from, asref)) {
|
|
167
|
+
vpush(from, vstr(asref));
|
|
168
|
+
}
|
|
169
|
+
for (size_t k = 0; k < vlen(from); k++) {
|
|
170
|
+
const char *p = vasstr(vat(from, k));
|
|
171
|
+
if (0 != strcmp(p, nref) && !listhas(out, p)) vpush(out, vstr(p));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
size_t on = vlen(out);
|
|
175
|
+
const char **sorted = (const char **)arena_alloc(sizeof(char *) * (on + 1));
|
|
176
|
+
for (size_t k = 0; k < on; k++) sorted[k] = vasstr(vat(out, k));
|
|
177
|
+
if (1 < on) qsort((void *)sorted, on, sizeof(char *), bytewise);
|
|
178
|
+
Value *sortedlist = vlist();
|
|
179
|
+
for (size_t k = 0; k < on; k++) vpush(sortedlist, vstr(sorted[k]));
|
|
180
|
+
vset(edges, nref, sortedlist);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* Iterative DFS with an explicit stack: twenty ports, and several of
|
|
184
|
+
* them have no recursion budget worth relying on. */
|
|
185
|
+
enum { WHITE = 0, GREY = 1, BLACK = 2 };
|
|
186
|
+
Value *colour = vmap();
|
|
187
|
+
for (size_t i = 0; i < vlen(nodes); i++) {
|
|
188
|
+
vset(colour, vasstr(vget(vat(nodes, i), "ref")), vnum(WHITE));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const char **starts;
|
|
192
|
+
size_t sn = vsortedkeys(edges, &starts);
|
|
193
|
+
for (size_t si = 0; si < sn; si++) {
|
|
194
|
+
if (WHITE != (int)vasnum(vget(colour, starts[si]))) continue;
|
|
195
|
+
|
|
196
|
+
Value *path = vlist();
|
|
197
|
+
/* stack of {ref, i} */
|
|
198
|
+
Value *stack = vlist();
|
|
199
|
+
Value *frame = vmap();
|
|
200
|
+
vset(frame, "ref", vstr(starts[si]));
|
|
201
|
+
vset(frame, "i", vnum(0));
|
|
202
|
+
vpush(stack, frame);
|
|
203
|
+
vset(colour, starts[si], vnum(GREY));
|
|
204
|
+
vpush(path, vstr(starts[si]));
|
|
205
|
+
|
|
206
|
+
while (0 < vlen(stack)) {
|
|
207
|
+
Value *top = vat(stack, vlen(stack) - 1);
|
|
208
|
+
const char *tref = vasstr(vget(top, "ref"));
|
|
209
|
+
size_t idx = (size_t)vasnum(vget(top, "i"));
|
|
210
|
+
Value *tos = vget(edges, tref);
|
|
211
|
+
|
|
212
|
+
if (idx >= vlen(tos)) {
|
|
213
|
+
vset(colour, tref, vnum(BLACK));
|
|
214
|
+
Value *popped = vlist();
|
|
215
|
+
for (size_t k = 0; k + 1 < vlen(stack); k++) vpush(popped, vat(stack, k));
|
|
216
|
+
stack = popped;
|
|
217
|
+
Value *shorter = vlist();
|
|
218
|
+
for (size_t k = 0; k + 1 < vlen(path); k++) vpush(shorter, vat(path, k));
|
|
219
|
+
path = shorter;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
vset(top, "i", vnum((double)(idx + 1)));
|
|
224
|
+
const char *next = vasstr(vat(tos, idx));
|
|
225
|
+
int c = (int)vasnum(vget(colour, next));
|
|
226
|
+
|
|
227
|
+
if (GREY == c) {
|
|
228
|
+
/* Report the cycle itself, not the walk that found it. */
|
|
229
|
+
Value *cycle = vlist();
|
|
230
|
+
bool started = false;
|
|
231
|
+
for (size_t k = 0; k < vlen(path); k++) {
|
|
232
|
+
if (!started && 0 == strcmp(vasstr(vat(path, k)), next)) started = true;
|
|
233
|
+
if (started) vpush(cycle, vat(path, k));
|
|
234
|
+
}
|
|
235
|
+
vpush(cycle, vstr(next));
|
|
236
|
+
return cycle;
|
|
237
|
+
}
|
|
238
|
+
if (BLACK == c) continue;
|
|
239
|
+
|
|
240
|
+
vset(colour, next, vnum(GREY));
|
|
241
|
+
vpush(path, vstr(next));
|
|
242
|
+
Value *nf = vmap();
|
|
243
|
+
vset(nf, "ref", vstr(next));
|
|
244
|
+
vset(nf, "i", vnum(0));
|
|
245
|
+
vpush(stack, nf);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return NULL;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
void checkcycle(Value *nodes) {
|
|
253
|
+
Value *cycle = dependencycycle(nodes);
|
|
254
|
+
if (NULL == cycle) return;
|
|
255
|
+
size_t sz = 64;
|
|
256
|
+
for (size_t i = 0; i < vlen(cycle); i++) sz += strlen(vasstr(vat(cycle, i))) + 6;
|
|
257
|
+
char *text = (char *)arena_alloc(sz);
|
|
258
|
+
size_t used = (size_t)snprintf(text, sz, "requirements cycle: ");
|
|
259
|
+
for (size_t i = 0; i < vlen(cycle); i++) {
|
|
260
|
+
used += (size_t)snprintf(text + used, sz - used, "%s%s",
|
|
261
|
+
0 < i ? " -> " : "", vasstr(vat(cycle, i)));
|
|
262
|
+
}
|
|
263
|
+
fail("plugin_dependency_cycle", text, details1("cycle", cycle));
|
|
264
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin sdk-20260908-1556-0 (c/src/depend.h)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 48392f5e2b6d1434ee9b1a4a9a11f4480aaeb46a [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* Dependency cardinality, policy, and the restart graph (§11.3). Two
|
|
5
|
+
* axes, both declared by the definition that has the requirement,
|
|
6
|
+
* because only it knows what it can cope with. See depend.c. */
|
|
7
|
+
|
|
8
|
+
#ifndef VOXGIG_PLUGIN_DEPEND_H
|
|
9
|
+
#define VOXGIG_PLUGIN_DEPEND_H
|
|
10
|
+
|
|
11
|
+
#include <stdbool.h>
|
|
12
|
+
|
|
13
|
+
#include "types.h"
|
|
14
|
+
#include "value.h"
|
|
15
|
+
|
|
16
|
+
Value *normrequire(Value *r);
|
|
17
|
+
Value *requirements(Value *options);
|
|
18
|
+
|
|
19
|
+
bool restartsonloss(Value *r);
|
|
20
|
+
bool gatesactivation(Value *r);
|
|
21
|
+
bool restartcausing(Value *r);
|
|
22
|
+
|
|
23
|
+
/* [{ref, provides:[name], requires:[req]}] -> the cycle, or NULL. */
|
|
24
|
+
Value *dependencycycle(Value *nodes);
|
|
25
|
+
/* Raise on a cycle, naming it. Separate from the detector so the
|
|
26
|
+
* detector stays pure and corpus-testable. */
|
|
27
|
+
void checkcycle(Value *nodes);
|
|
28
|
+
|
|
29
|
+
#endif
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin sdk-20260908-1556-0 (c/src/env.c)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 48392f5e2b6d1434ee9b1a4a9a11f4480aaeb46a [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* Environment overrides (§9.5) — level 7 of the ladder.
|
|
5
|
+
*
|
|
6
|
+
* One prefix, so nothing drifts: `VOXGIG_PLUGIN_*`.
|
|
7
|
+
*
|
|
8
|
+
* VOXGIG_PLUGIN_PROFILE the profile name
|
|
9
|
+
* VOXGIG_PLUGIN_<REF>_<PATH> one option
|
|
10
|
+
* VOXGIG_PLUGIN_ACTIVE/INACTIVE comma-separated refs, INACTIVE wins
|
|
11
|
+
*
|
|
12
|
+
* THE ENCODING IS LOSSY, AND THIS SAYS SO RATHER THAN PRETENDING
|
|
13
|
+
* OTHERWISE. Ref and path are upper-snake with `$` -> `__` and `.` ->
|
|
14
|
+
* `_`. But `_` is legal in a name and in a tag, and the mapping folds
|
|
15
|
+
* case, so `retry$fast` and `retry__fast` both encode to `RETRY__FAST`.
|
|
16
|
+
*
|
|
17
|
+
* Rather than restrict a grammar the rest of the stack already uses,
|
|
18
|
+
* the host DETECTS THE COLLISION: it encodes every ref it holds, and a
|
|
19
|
+
* key two refs claim is `plugin_env_ambiguous`, naming both.
|
|
20
|
+
*
|
|
21
|
+
* Pure: a function over a string map and a ref set, so the corpus tests
|
|
22
|
+
* it without touching a real environment. */
|
|
23
|
+
|
|
24
|
+
#include <stdio.h>
|
|
25
|
+
#include <stdlib.h>
|
|
26
|
+
#include <string.h>
|
|
27
|
+
|
|
28
|
+
#include "env.h"
|
|
29
|
+
#include "ref.h"
|
|
30
|
+
|
|
31
|
+
#define PREFIX "VOXGIG_PLUGIN_"
|
|
32
|
+
|
|
33
|
+
const char *encoderef(const char *ref) {
|
|
34
|
+
size_t n = strlen(ref);
|
|
35
|
+
char *out = (char *)arena_alloc(n * 2 + 1);
|
|
36
|
+
size_t j = 0;
|
|
37
|
+
for (size_t i = 0; i < n; i++) {
|
|
38
|
+
char c = ref[i];
|
|
39
|
+
if ('$' == c) { out[j++] = '_'; out[j++] = '_'; }
|
|
40
|
+
else if ('.' == c) { out[j++] = '_'; }
|
|
41
|
+
else if ('a' <= c && 'z' >= c) { out[j++] = (char)(c - 'a' + 'A'); }
|
|
42
|
+
else { out[j++] = c; }
|
|
43
|
+
}
|
|
44
|
+
out[j] = '\0';
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static void checkreserved(const char *ref, Value *reserved) {
|
|
49
|
+
if (!vislist(reserved) || 0 == vlen(reserved)) return;
|
|
50
|
+
const char *name = refname(ref);
|
|
51
|
+
for (size_t i = 0; i < vlen(reserved); i++) {
|
|
52
|
+
Value *r = vat(reserved, i);
|
|
53
|
+
if (visstr(r) && 0 == strcmp(vasstr(r), name)) {
|
|
54
|
+
size_t sz = strlen(ref) + 48;
|
|
55
|
+
char *text = (char *)arena_alloc(sz);
|
|
56
|
+
snprintf(text, sz, "ref is reserved by the host: %s", ref);
|
|
57
|
+
fail("plugin_ref_reserved", text, details1("ref", vstr(ref)));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Values parse as JSON, FALLING BACK TO STRING — so `8080` is a number,
|
|
63
|
+
* `true` is a boolean, `{"a":1}` is a map, and `hello` is the string it
|
|
64
|
+
* looks like rather than a parse error. */
|
|
65
|
+
static Value *parsevalue(const char *v) {
|
|
66
|
+
const char *err = NULL;
|
|
67
|
+
Value *parsed = vparse(v, &err);
|
|
68
|
+
return NULL == parsed ? vstr(v) : parsed;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
static int bylen_desc(const void *a, const void *b) {
|
|
72
|
+
const char *x = *(const char *const *)a;
|
|
73
|
+
const char *y = *(const char *const *)b;
|
|
74
|
+
size_t lx = strlen(x), ly = strlen(y);
|
|
75
|
+
if (lx != ly) return lx > ly ? -1 : 1;
|
|
76
|
+
return strcmp(x, y);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
Value *applyenv(Value *input) {
|
|
80
|
+
Value *env = vget(input, "env");
|
|
81
|
+
if (!vismap(env)) env = vmap();
|
|
82
|
+
Value *refsin = vget(input, "refs");
|
|
83
|
+
Value *reserved = vget(input, "reserved");
|
|
84
|
+
|
|
85
|
+
Value *out = vmap();
|
|
86
|
+
Value *options = vmap();
|
|
87
|
+
Value *active = vlist();
|
|
88
|
+
Value *inactive = vlist();
|
|
89
|
+
vset(out, "options", options);
|
|
90
|
+
vset(out, "active", active);
|
|
91
|
+
vset(out, "inactive", inactive);
|
|
92
|
+
|
|
93
|
+
/* Encode every ref the host holds, and refuse a key that two of them
|
|
94
|
+
* claim. Done UP FRONT so the collision is reported even when no
|
|
95
|
+
* environment variable exercises it — a latent ambiguity is still an
|
|
96
|
+
* ambiguity, and finding it at deploy time is the failure this exists
|
|
97
|
+
* to prevent. */
|
|
98
|
+
Value *byencoded = vmap();
|
|
99
|
+
if (vislist(refsin)) {
|
|
100
|
+
for (size_t i = 0; i < vlen(refsin); i++) {
|
|
101
|
+
const char *r = canonref(vat(refsin, i));
|
|
102
|
+
const char *e = encoderef(r);
|
|
103
|
+
Value *list = vget(byencoded, e);
|
|
104
|
+
if (visnull(list)) { list = vlist(); vset(byencoded, e, list); }
|
|
105
|
+
vpush(list, vstr(r));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const char **encs;
|
|
110
|
+
size_t nenc = vsortedkeys(byencoded, &encs);
|
|
111
|
+
for (size_t i = 0; i < nenc; i++) {
|
|
112
|
+
Value *claims = vget(byencoded, encs[i]);
|
|
113
|
+
if (1 < vlen(claims)) {
|
|
114
|
+
const char *a = vasstr(vat(claims, 0));
|
|
115
|
+
const char *b = vasstr(vat(claims, 1));
|
|
116
|
+
const char *lo = 0 <= strcmp(a, b) ? b : a;
|
|
117
|
+
const char *hi = 0 <= strcmp(a, b) ? a : b;
|
|
118
|
+
Value *pair = vlist();
|
|
119
|
+
vpush(pair, vstr(lo));
|
|
120
|
+
vpush(pair, vstr(hi));
|
|
121
|
+
size_t sz = strlen(encs[i]) + strlen(lo) + strlen(hi) + 64;
|
|
122
|
+
char *text = (char *)arena_alloc(sz);
|
|
123
|
+
snprintf(text, sz, "refs collide in the environment encoding as %s: %s, %s",
|
|
124
|
+
encs[i], lo, hi);
|
|
125
|
+
Value *details = vmap();
|
|
126
|
+
vset(details, "encoded", vstr(encs[i]));
|
|
127
|
+
vset(details, "refs", pair);
|
|
128
|
+
fail("plugin_env_ambiguous", text, details);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* LONGEST encoded ref first, so `retry$fast` wins over `retry` on
|
|
133
|
+
* `RETRY__FAST_MIN`. Shortest-first would read the tag as a path. */
|
|
134
|
+
const char **order = (const char **)arena_alloc(sizeof(char *) * (nenc + 1));
|
|
135
|
+
for (size_t i = 0; i < nenc; i++) order[i] = encs[i];
|
|
136
|
+
if (1 < nenc) qsort((void *)order, nenc, sizeof(char *), bylen_desc);
|
|
137
|
+
|
|
138
|
+
const char **keys;
|
|
139
|
+
size_t nk = vsortedkeys(env, &keys);
|
|
140
|
+
size_t plen = strlen(PREFIX);
|
|
141
|
+
|
|
142
|
+
for (size_t ki = 0; ki < nk; ki++) {
|
|
143
|
+
const char *key = keys[ki];
|
|
144
|
+
if (0 != strncmp(key, PREFIX, plen)) continue;
|
|
145
|
+
const char *rest = key + plen;
|
|
146
|
+
Value *raw = vget(env, key);
|
|
147
|
+
const char *val = visstr(raw) ? vasstr(raw) : "";
|
|
148
|
+
|
|
149
|
+
if (0 == strcmp(rest, "PROFILE")) {
|
|
150
|
+
vset(out, "profile", vstr(val));
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (0 == strcmp(rest, "ACTIVE") || 0 == strcmp(rest, "INACTIVE")) {
|
|
155
|
+
bool isactive = 0 == strcmp(rest, "ACTIVE");
|
|
156
|
+
const char *p = val;
|
|
157
|
+
while ('\0' != *p) {
|
|
158
|
+
while (' ' == *p || '\t' == *p) p++;
|
|
159
|
+
const char *start = p;
|
|
160
|
+
while ('\0' != *p && ',' != *p) p++;
|
|
161
|
+
const char *end = p;
|
|
162
|
+
while (end > start && (' ' == end[-1] || '\t' == end[-1])) end--;
|
|
163
|
+
if (end > start) {
|
|
164
|
+
const char *piece = arena_strndup(start, (size_t)(end - start));
|
|
165
|
+
const char *c = canonref(vstr(piece));
|
|
166
|
+
/* The reservation covers EVERY input layer (§9.1).
|
|
167
|
+
* VOXGIG_PLUGIN_INACTIVE=station is easier to set than
|
|
168
|
+
* editing a config file, and INACTIVE has the final word — so
|
|
169
|
+
* guarding documents alone would leave the one lever this
|
|
170
|
+
* mechanism exists to deny wide open. */
|
|
171
|
+
checkreserved(c, reserved);
|
|
172
|
+
vpush(isactive ? active : inactive, vstr(c));
|
|
173
|
+
}
|
|
174
|
+
if (',' == *p) p++;
|
|
175
|
+
}
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const char *enc = NULL;
|
|
180
|
+
for (size_t i = 0; i < nenc; i++) {
|
|
181
|
+
size_t el = strlen(order[i]);
|
|
182
|
+
if (0 == strcmp(rest, order[i]) ||
|
|
183
|
+
(0 == strncmp(rest, order[i], el) && '_' == rest[el])) {
|
|
184
|
+
enc = order[i];
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (NULL == enc) continue; /* not for any ref this host holds */
|
|
189
|
+
|
|
190
|
+
const char *ref = vasstr(vat(vget(byencoded, enc), 0));
|
|
191
|
+
checkreserved(ref, reserved);
|
|
192
|
+
|
|
193
|
+
if (0 == strcmp(rest, enc)) continue; /* a ref with no path sets nothing */
|
|
194
|
+
|
|
195
|
+
const char *pathtext = rest + strlen(enc) + 1;
|
|
196
|
+
Value *node = vget(options, ref);
|
|
197
|
+
if (visnull(node)) { node = vmap(); vset(options, ref, node); }
|
|
198
|
+
|
|
199
|
+
const char *seg = pathtext;
|
|
200
|
+
for (;;) {
|
|
201
|
+
const char *dot = strchr(seg, '_');
|
|
202
|
+
if (NULL == dot) break;
|
|
203
|
+
char *piece = arena_strndup(seg, (size_t)(dot - seg));
|
|
204
|
+
for (char *q = piece; '\0' != *q; q++) {
|
|
205
|
+
if ('A' <= *q && 'Z' >= *q) *q = (char)(*q - 'A' + 'a');
|
|
206
|
+
}
|
|
207
|
+
Value *next = vget(node, piece);
|
|
208
|
+
if (!vismap(next)) { next = vmap(); vset(node, piece, next); }
|
|
209
|
+
node = next;
|
|
210
|
+
seg = dot + 1;
|
|
211
|
+
}
|
|
212
|
+
char *leaf = arena_strdup(seg);
|
|
213
|
+
for (char *q = leaf; '\0' != *q; q++) {
|
|
214
|
+
if ('A' <= *q && 'Z' >= *q) *q = (char)(*q - 'A' + 'a');
|
|
215
|
+
}
|
|
216
|
+
vset(node, leaf, parsevalue(val));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return out;
|
|
220
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin sdk-20260908-1556-0 (c/src/env.h)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 48392f5e2b6d1434ee9b1a4a9a11f4480aaeb46a [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* Environment overrides (§9.5) — level 7 of the ladder. Pure: a
|
|
5
|
+
* function over a string map and a ref set, so the corpus tests it
|
|
6
|
+
* without touching a real environment. */
|
|
7
|
+
|
|
8
|
+
#ifndef VOXGIG_PLUGIN_ENV_H
|
|
9
|
+
#define VOXGIG_PLUGIN_ENV_H
|
|
10
|
+
|
|
11
|
+
#include "types.h"
|
|
12
|
+
#include "value.h"
|
|
13
|
+
|
|
14
|
+
/* `retry$fast` -> `RETRY__FAST`. Lossy on purpose; see env.c. */
|
|
15
|
+
const char *encoderef(const char *ref);
|
|
16
|
+
|
|
17
|
+
Value *applyenv(Value *input);
|
|
18
|
+
|
|
19
|
+
#endif
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin sdk-20260908-1556-0 (c/src/export.c)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 48392f5e2b6d1434ee9b1a4a9a11f4480aaeb46a [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* Exports (§11).
|
|
5
|
+
*
|
|
6
|
+
* THE UNQUALIFIED ALIAS IS THE INTERESTING PART. `retry/client`
|
|
7
|
+
* resolves to the UNTAGGED instance if one exists; if not, and exactly
|
|
8
|
+
* one tagged instance exports that key, it resolves to that one; if two
|
|
9
|
+
* do, it is `plugin_export_ambiguous` — deliberately diverging from
|
|
10
|
+
* seneca's silent last-wins, because with multi-instance as a headline
|
|
11
|
+
* feature an ambiguous alias is a defect waiting for production. */
|
|
12
|
+
|
|
13
|
+
#include <stdio.h>
|
|
14
|
+
#include <stdlib.h>
|
|
15
|
+
#include <string.h>
|
|
16
|
+
|
|
17
|
+
#include "export.h"
|
|
18
|
+
#include "ref.h"
|
|
19
|
+
|
|
20
|
+
static int bytewise(const void *a, const void *b) {
|
|
21
|
+
return strcmp(*(const char *const *)a, *(const char *const *)b);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
Value *resolveexport(Value *spec, Value *exported) {
|
|
25
|
+
const char *s = visstr(spec) ? vasstr(spec) : "";
|
|
26
|
+
const char *cut = strchr(s, '/');
|
|
27
|
+
if (NULL == cut) {
|
|
28
|
+
size_t sz = strlen(s) + 40;
|
|
29
|
+
char *text = (char *)arena_alloc(sz);
|
|
30
|
+
snprintf(text, sz, "export spec needs a key: %s", s);
|
|
31
|
+
fail("plugin_export_ambiguous", text, details1("spec", vstr(s)));
|
|
32
|
+
}
|
|
33
|
+
const char *head = arena_strndup(s, (size_t)(cut - s));
|
|
34
|
+
const char *key = cut + 1;
|
|
35
|
+
|
|
36
|
+
/* A fully qualified ref: exactly one answer or none.
|
|
37
|
+
*
|
|
38
|
+
* VALIDATING, not tolerant. The canonical calls `canonref(head)`,
|
|
39
|
+
* which RAISES — so `retry$bad!/client` is `plugin_bad_tag` and
|
|
40
|
+
* `2fa/client` is `plugin_bad_name`. Reading it with `tryref` turned
|
|
41
|
+
* a configuration typo into an ordinary missing export, which is the
|
|
42
|
+
* error the caller most needs to see, silently swallowed. */
|
|
43
|
+
const char *want = canonref(vstr(head));
|
|
44
|
+
{
|
|
45
|
+
for (size_t i = 0; i < vlen(exported); i++) {
|
|
46
|
+
Value *e = vat(exported, i);
|
|
47
|
+
if (0 == strcmp(vasstr(vget(e, "ref")), want) &&
|
|
48
|
+
0 == strcmp(vasstr(vget(e, "key")), key)) {
|
|
49
|
+
return vget(e, "value");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* An alias: the NAME, not a ref. Look at every instance of it. */
|
|
55
|
+
Value *byname = vlist();
|
|
56
|
+
for (size_t i = 0; i < vlen(exported); i++) {
|
|
57
|
+
Value *e = vat(exported, i);
|
|
58
|
+
const char *eref = vasstr(vget(e, "ref"));
|
|
59
|
+
if (0 == strcmp(refname(eref), head) &&
|
|
60
|
+
0 == strcmp(vasstr(vget(e, "key")), key)) {
|
|
61
|
+
vpush(byname, e);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (0 == vlen(byname)) return NULL;
|
|
65
|
+
|
|
66
|
+
/* The untagged instance wins outright when there is one. */
|
|
67
|
+
for (size_t i = 0; i < vlen(byname); i++) {
|
|
68
|
+
Value *e = vat(byname, i);
|
|
69
|
+
const char *eref = vasstr(vget(e, "ref"));
|
|
70
|
+
if (NULL == strchr(eref, '$')) return vget(e, "value");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (1 == vlen(byname)) return vget(vat(byname, 0), "value");
|
|
74
|
+
|
|
75
|
+
size_t n = vlen(byname);
|
|
76
|
+
const char **refs = (const char **)arena_alloc(sizeof(char *) * (n + 1));
|
|
77
|
+
size_t sz = strlen(s) + 64;
|
|
78
|
+
for (size_t i = 0; i < n; i++) {
|
|
79
|
+
refs[i] = vasstr(vget(vat(byname, i), "ref"));
|
|
80
|
+
sz += strlen(refs[i]) + 4;
|
|
81
|
+
}
|
|
82
|
+
if (1 < n) qsort((void *)refs, n, sizeof(char *), bytewise);
|
|
83
|
+
Value *list = vlist();
|
|
84
|
+
for (size_t i = 0; i < n; i++) vpush(list, vstr(refs[i]));
|
|
85
|
+
|
|
86
|
+
char *text = (char *)arena_alloc(sz);
|
|
87
|
+
size_t used = (size_t)snprintf(text, sz, "alias %s matches %zu instances: ", s, n);
|
|
88
|
+
for (size_t i = 0; i < n; i++) {
|
|
89
|
+
used += (size_t)snprintf(text + used, sz - used, "%s%s",
|
|
90
|
+
0 < i ? ", " : "", refs[i]);
|
|
91
|
+
}
|
|
92
|
+
Value *d = vmap();
|
|
93
|
+
vset(d, "spec", vstr(s));
|
|
94
|
+
vset(d, "refs", list);
|
|
95
|
+
fail("plugin_export_ambiguous", text, d);
|
|
96
|
+
return NULL;
|
|
97
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin sdk-20260908-1556-0 (c/src/export.h)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 48392f5e2b6d1434ee9b1a4a9a11f4480aaeb46a [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* Exports (§11). An instance publishes values for other plugins and for
|
|
5
|
+
* the application. THE UNQUALIFIED ALIAS IS THE INTERESTING PART; see
|
|
6
|
+
* export.c. */
|
|
7
|
+
|
|
8
|
+
#ifndef VOXGIG_PLUGIN_EXPORT_H
|
|
9
|
+
#define VOXGIG_PLUGIN_EXPORT_H
|
|
10
|
+
|
|
11
|
+
#include "types.h"
|
|
12
|
+
#include "value.h"
|
|
13
|
+
|
|
14
|
+
/* `retry$fast/client` or the alias `retry/client`, against a list of
|
|
15
|
+
* {ref, key, value}. Answers NULL for "no such export", which is not an
|
|
16
|
+
* error — `export/missing` pins that. */
|
|
17
|
+
Value *resolveexport(Value *spec, Value *exported);
|
|
18
|
+
|
|
19
|
+
#endif
|