@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
|
@@ -4,7 +4,7 @@ import * as Path from 'node:path'
|
|
|
4
4
|
import {
|
|
5
5
|
cmp, each, names, cmap,
|
|
6
6
|
List, File, Content, Copy, Folder, Fragment, Line, FeatureHook,
|
|
7
|
-
targetFeatures,
|
|
7
|
+
targetFeatures, pluginExcludes,
|
|
8
8
|
TEST_CONTROL_EXCLUDE
|
|
9
9
|
} from '@voxgig/sdkgen'
|
|
10
10
|
|
|
@@ -27,6 +27,18 @@ import { MainEntity } from './MainEntity_lua'
|
|
|
27
27
|
import { EntityTypes } from './EntityTypes_lua'
|
|
28
28
|
|
|
29
29
|
|
|
30
|
+
// Features whose source is a CONTAINER under the top-level feature/ dir,
|
|
31
|
+
// beside the flat `<name>_feature.lua` every other lua feature is. Today
|
|
32
|
+
// that is `secrets`: its folder holds a vendored @voxgig/sekreto port, the
|
|
33
|
+
// voxgig/plugin runtime and the C transport helper - some forty files of
|
|
34
|
+
// key-store, request-signing and child-process code that an SDK which never
|
|
35
|
+
// asked for secrets must not ship. Anything named here is EXCLUDED from the
|
|
36
|
+
// verbatim copy unless the model SELECTS the feature (see the Copy below);
|
|
37
|
+
// its shipped test suite under test/feature/<name>/ goes with it. The
|
|
38
|
+
// clojure target gates its container the same way (Main_clojure.ts).
|
|
39
|
+
const CONTAINED = ['secrets']
|
|
40
|
+
|
|
41
|
+
|
|
30
42
|
const Main = cmp(async function Main(props: any) {
|
|
31
43
|
|
|
32
44
|
const { target } = props
|
|
@@ -42,15 +54,93 @@ const Main = cmp(async function Main(props: any) {
|
|
|
42
54
|
|
|
43
55
|
Gitignore({})
|
|
44
56
|
|
|
45
|
-
//
|
|
57
|
+
// THE feature/<name>/ CONTAINER IS GATED HERE, at generate time - the
|
|
58
|
+
// top-level-container peer of the `srcFeatureExcludes` gate ts and js
|
|
59
|
+
// apply to src/feature/<name>/. `target add` keeps an unselected
|
|
60
|
+
// feature out of a project's tm/ in the first place; this covers a
|
|
61
|
+
// feature switched off after it was added, and the generator suite,
|
|
62
|
+
// which copies the whole scaffold tree.
|
|
63
|
+
const containerExcludes = CONTAINED
|
|
64
|
+
.filter((name: string) => null == feature[name])
|
|
65
|
+
.flatMap((name: string) => [
|
|
66
|
+
new RegExp('(^|/)feature/' + name + '_feature\\.lua$'),
|
|
67
|
+
new RegExp('(^|/)feature/' + name + '/'),
|
|
68
|
+
new RegExp('(^|/)test/feature/' + name + '/'),
|
|
69
|
+
])
|
|
70
|
+
|
|
71
|
+
// Copy tm/lua files with replacements.
|
|
72
|
+
//
|
|
73
|
+
// pluginExcludes: the generate-time plugin trim (an ACTIVE feature's
|
|
74
|
+
// INACTIVE plugin group's declared files stay out of the tree). The
|
|
75
|
+
// model's lua `path` entries are target-root-relative, which is this
|
|
76
|
+
// Copy's root - helpers/featureSource documents that getting the root
|
|
77
|
+
// wrong makes the trim a silent no-op.
|
|
46
78
|
Copy({
|
|
47
79
|
from: 'tm/' + target.name,
|
|
48
|
-
exclude: [/src\//, TEST_CONTROL_EXCLUDE
|
|
80
|
+
exclude: [/src\//, TEST_CONTROL_EXCLUDE,
|
|
81
|
+
...containerExcludes, ...pluginExcludes(model)],
|
|
49
82
|
replace: {
|
|
50
83
|
...props.ctx$.stdrep,
|
|
51
84
|
}
|
|
52
85
|
})
|
|
53
86
|
|
|
87
|
+
// THE NATIVE BUILD SEAM. sekreto's lua PLUGIN kinds (hashicorp, aws, ...)
|
|
88
|
+
// run a small compiled transport helper, because Lua 5.4 has no sockets
|
|
89
|
+
// and no TLS; the four built-in kinds never reach it. The helper's
|
|
90
|
+
// source is vendored with the feature (feature/secrets/native/
|
|
91
|
+
// sekretonet.c) and the template Makefile `-include`s this fragment, so
|
|
92
|
+
// it is compiled - and OpenSSL linked - ONLY when the model activates a
|
|
93
|
+
// plugin group that lua has definitions for. An SDK without secrets, or
|
|
94
|
+
// with the built-in chain alone, gets no fragment, no compiler run and
|
|
95
|
+
// no OpenSSL dependency.
|
|
96
|
+
//
|
|
97
|
+
// The vendored file opens with the vendoring tool's three-line `--`
|
|
98
|
+
// provenance header (every file under tm/lua is stamped in lua's comment
|
|
99
|
+
// syntax; the guard holds that), which the C compiler cannot read - so
|
|
100
|
+
// the rule feeds the compiler from line four. Line numbers in a compiler
|
|
101
|
+
// diagnostic are therefore three lower than in the file.
|
|
102
|
+
const nativeGroups: string[] = []
|
|
103
|
+
each(feature, (f: any) => {
|
|
104
|
+
each(f.plugin, (plugin: any) => {
|
|
105
|
+
if (false === plugin.active || null == plugin.active) return
|
|
106
|
+
if (0 < Object.keys(plugin.def?.lua || {}).length) {
|
|
107
|
+
nativeGroups.push(f.name + '.' + plugin.name)
|
|
108
|
+
}
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
if (0 < nativeGroups.length) {
|
|
113
|
+
Folder({ name: 'feature' }, () => {
|
|
114
|
+
Folder({ name: 'secrets' }, () => {
|
|
115
|
+
File({ name: 'native.mk' }, () => {
|
|
116
|
+
Content(`# ${model.const.Name} SDK: the sekreto transport helper build.
|
|
117
|
+
#
|
|
118
|
+
# GENERATED because a secrets plugin group is active
|
|
119
|
+
# (${nativeGroups.sort().join(', ')}): the plugin provider kinds run this
|
|
120
|
+
# helper for every socket and child process, since Lua 5.4 has none. An
|
|
121
|
+
# SDK without an active plugin group has no such file, and its Makefile's
|
|
122
|
+
# optional include of it is a no-op - nothing is compiled and OpenSSL is
|
|
123
|
+
# not linked.
|
|
124
|
+
#
|
|
125
|
+
# The source carries the vendoring tool's three-line provenance header in
|
|
126
|
+
# lua comment syntax, which the compiler cannot read: it is fed the file
|
|
127
|
+
# from line four. Compiler line numbers are therefore three lower than the
|
|
128
|
+
# file's.
|
|
129
|
+
NATIVE := feature/secrets/native/sekreto-net
|
|
130
|
+
|
|
131
|
+
CC ?= cc
|
|
132
|
+
CFLAGS ?= -std=c11 -O2 -Wall -Wextra
|
|
133
|
+
LDLIBS ?= -lssl -lcrypto
|
|
134
|
+
|
|
135
|
+
feature/secrets/native/sekreto-net: feature/secrets/native/sekretonet.c
|
|
136
|
+
@command -v $(CC) >/dev/null 2>&1 || { echo "secrets: a C compiler ($(CC)) is needed to build the sekreto transport helper that this SDK's plugin provider kinds run - install one, or use only the built-in provider kinds" >&2; exit 1; }
|
|
137
|
+
tail -n +4 $< | $(CC) $(CFLAGS) -x c - -o $@ $(LDLIBS)
|
|
138
|
+
`)
|
|
139
|
+
})
|
|
140
|
+
})
|
|
141
|
+
})
|
|
142
|
+
}
|
|
143
|
+
|
|
54
144
|
// Generate main SDK file
|
|
55
145
|
File({ name: model.name + '_sdk.' + target.ext }, () => {
|
|
56
146
|
|
|
@@ -23,6 +23,43 @@ import type {
|
|
|
23
23
|
} from '@voxgig/apidef'
|
|
24
24
|
|
|
25
25
|
|
|
26
|
+
// The vendored modules the secrets feature needs whatever its chain names
|
|
27
|
+
// (ts/vendor/routes.json `sekreto/lua` and `plugin/lua`, minus the plugin
|
|
28
|
+
// KINDS, which are listed per active group from the model). Held to the
|
|
29
|
+
// vendored tree by ts/test/generate.test.ts's lua secrets case.
|
|
30
|
+
const SECRETS_CORE_MODULES = [
|
|
31
|
+
'feature/secrets/sekreto',
|
|
32
|
+
'feature/secrets/sekreto/addr',
|
|
33
|
+
'feature/secrets/sekreto/err',
|
|
34
|
+
'feature/secrets/sekreto/name',
|
|
35
|
+
'feature/secrets/sekreto/providers',
|
|
36
|
+
// The shared plugin helpers, in no group: httpjson (eight kinds), net
|
|
37
|
+
// (httpjson, boru, secretspec), json and support (every kind), crypto
|
|
38
|
+
// (aws AND gcpsecrets - two groups, so neither may own it).
|
|
39
|
+
'feature/secrets/sekreto/plugins/crypto',
|
|
40
|
+
'feature/secrets/sekreto/plugins/httpjson',
|
|
41
|
+
'feature/secrets/sekreto/plugins/json',
|
|
42
|
+
'feature/secrets/sekreto/plugins/net',
|
|
43
|
+
'feature/secrets/sekreto/plugins/support',
|
|
44
|
+
'feature/secrets/plugin',
|
|
45
|
+
'feature/secrets/plugin/capability',
|
|
46
|
+
'feature/secrets/plugin/catalog',
|
|
47
|
+
'feature/secrets/plugin/config',
|
|
48
|
+
'feature/secrets/plugin/depend',
|
|
49
|
+
'feature/secrets/plugin/env',
|
|
50
|
+
'feature/secrets/plugin/export',
|
|
51
|
+
'feature/secrets/plugin/graph',
|
|
52
|
+
'feature/secrets/plugin/host',
|
|
53
|
+
'feature/secrets/plugin/json',
|
|
54
|
+
'feature/secrets/plugin/order',
|
|
55
|
+
'feature/secrets/plugin/point',
|
|
56
|
+
'feature/secrets/plugin/ref',
|
|
57
|
+
'feature/secrets/plugin/resolve',
|
|
58
|
+
'feature/secrets/plugin/types',
|
|
59
|
+
'feature/secrets/plugin/version',
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
|
|
26
63
|
const Package = cmp(async function Package(props: any) {
|
|
27
64
|
const ctx$ = props.ctx$
|
|
28
65
|
const target = props.target
|
|
@@ -81,6 +118,15 @@ dependencies = {
|
|
|
81
118
|
// rock exists to depend on - station design 9.2's registry-less tier).
|
|
82
119
|
// Gated: a feature that does not apply to lua must not be listed
|
|
83
120
|
// as a rockspec module — the require would not resolve.
|
|
121
|
+
//
|
|
122
|
+
// The secrets feature carries the VENDORED sekreto core, the
|
|
123
|
+
// voxgig/plugin runtime and the shared plugin helpers (no sekreto or
|
|
124
|
+
// plugin rock exists to depend on); the plugin KINDS themselves are
|
|
125
|
+
// listed from the model's active `def.lua` entries, so a trimmed
|
|
126
|
+
// group's modules are not claimed. The compiled transport helper the
|
|
127
|
+
// plugin kinds run is NOT a rock module: `build.type = "builtin"`
|
|
128
|
+
// cannot produce an executable, so an install-from-rock carries the
|
|
129
|
+
// helper's source and `make build` compiles it where the SDK runs.
|
|
84
130
|
const feature = targetFeatures(model, target)
|
|
85
131
|
let featureModules = ` ["feature.base_feature"] = "feature/base_feature.lua",\n`
|
|
86
132
|
each(feature, (f: any) => {
|
|
@@ -90,6 +136,19 @@ dependencies = {
|
|
|
90
136
|
featureModules +=
|
|
91
137
|
` ["feature.station.voxgig_station"] = "feature/station/voxgig_station.lua",\n`
|
|
92
138
|
}
|
|
139
|
+
if ('secrets' === f.name) {
|
|
140
|
+
const mods = [...SECRETS_CORE_MODULES]
|
|
141
|
+
each(f.plugin, (plugin: any) => {
|
|
142
|
+
if (false === plugin.active || null == plugin.active) return
|
|
143
|
+
for (const one of Object.values(plugin.def?.lua || {})) {
|
|
144
|
+
mods.push(String(one).replace(/\.lua$/, ''))
|
|
145
|
+
}
|
|
146
|
+
})
|
|
147
|
+
for (const mod of Array.from(new Set(mods)).sort()) {
|
|
148
|
+
featureModules +=
|
|
149
|
+
` ["${mod.replace(/\//g, '.')}"] = "${mod}.lua",\n`
|
|
150
|
+
}
|
|
151
|
+
}
|
|
93
152
|
})
|
|
94
153
|
|
|
95
154
|
Content(`}
|
|
@@ -99,6 +158,7 @@ build = {
|
|
|
99
158
|
["${model.name}_sdk"] = "${model.name}_sdk.lua",
|
|
100
159
|
["config"] = "config.lua",
|
|
101
160
|
["config_shared"] = "config_shared.lua",
|
|
161
|
+
["config_plugins"] = "config_plugins.lua",
|
|
102
162
|
["features"] = "features.lua",
|
|
103
163
|
${featureModules} }
|
|
104
164
|
}
|
|
@@ -85,6 +85,16 @@ function ProjectNameSDK.new(options)
|
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
+
-- CONSUMED, not kept. `extend` holds feature INSTANCES, and every shipped
|
|
89
|
+
-- feature's init stores `self.client = ctx.client` - so leaving the list
|
|
90
|
+
-- in self.options makes the options map CYCLIC (client.options.extend[1]
|
|
91
|
+
-- .client == client), and options_map()'s vs.clone, which has no cycle
|
|
92
|
+
-- guard, blew the stack on the first prepare_auth of any client built with
|
|
93
|
+
-- an extend feature. The instances live on self.features from here on,
|
|
94
|
+
-- which is the only place anything reads them; the SAME table is
|
|
95
|
+
-- self._rootctx.options, so the root context loses the key too.
|
|
96
|
+
self.options["extend"] = nil
|
|
97
|
+
|
|
88
98
|
-- Initialize features.
|
|
89
99
|
for _, f in ipairs(self.features) do
|
|
90
100
|
utility.feature_init(self._rootctx, f)
|
|
@@ -26,6 +26,106 @@ import {
|
|
|
26
26
|
} from './utility_ocaml'
|
|
27
27
|
|
|
28
28
|
|
|
29
|
+
// THE SECRETS BUILD MODEL, derived from the model ONCE and read by both the
|
|
30
|
+
// Makefile fragment (Main_ocaml emits feature/secrets/feature.mk from it)
|
|
31
|
+
// and the generated config (the definitions list and the bundled transport
|
|
32
|
+
// below), so the two cannot disagree about which kinds are compiled.
|
|
33
|
+
//
|
|
34
|
+
// Upstream sekreto retired its self-registration registry for voxgig/plugin
|
|
35
|
+
// definitions: a provider kind the caller did not pass in `~plugins` is
|
|
36
|
+
// unknown to that Sekreto. So the model's choice of plugin groups IS the
|
|
37
|
+
// SDK's provider vocabulary, and the generated code names each active
|
|
38
|
+
// group's constructor (`def: ocaml:` in model/feature/secrets.aon -
|
|
39
|
+
// `Hashicorp.plugin`, the `unit -> Defs.definition` each vendored kind
|
|
40
|
+
// module defines) and nothing else. A symbol named here whose module the
|
|
41
|
+
// plugin trim removed is an "Unbound module" at compile time - a loud
|
|
42
|
+
// failure, which is the right kind.
|
|
43
|
+
//
|
|
44
|
+
// MODULE ORDER IS THE DEPENDENCY ORDER, written down (upstream's own
|
|
45
|
+
// Makefile is the source): the voxgig/plugin host, the sekreto core, the
|
|
46
|
+
// shared helpers, the kinds. The helpers are ungrouped in the model (see the
|
|
47
|
+
// ocaml note at the head of its `plugin` block) and are listed here only
|
|
48
|
+
// when a selected kind needs them - the transport chain (crypto, sigv4, tls,
|
|
49
|
+
// http, httpjson) when an active group declares `needs.fetch`, the
|
|
50
|
+
// child-process helper (runcmd) when any kind is on - because OCaml
|
|
51
|
+
// compiles exactly what it is handed: an [env, memory] chain compiles the
|
|
52
|
+
// two cores alone, and `secretspec` alone compiles runcmd.ml and no TLS.
|
|
53
|
+
//
|
|
54
|
+
// Null when the model does not activate `secrets` for this target. Read
|
|
55
|
+
// with `only_active: false` on the plugin map (pluginExcludesFor's
|
|
56
|
+
// subtlety: the feature object a component is handed has already been
|
|
57
|
+
// filtered, so a feature whose groups are all off would look like one
|
|
58
|
+
// with no plugin machinery).
|
|
59
|
+
type SecretsBuild = {
|
|
60
|
+
groups: string[],
|
|
61
|
+
tlsGroups: string[],
|
|
62
|
+
tls: boolean,
|
|
63
|
+
plugin: string[],
|
|
64
|
+
core: string[],
|
|
65
|
+
helpers: string[],
|
|
66
|
+
kinds: string[],
|
|
67
|
+
syms: string[],
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const SECRETS_PLUGIN_MODULES = [
|
|
71
|
+
'value', 'types', 'ref', 'version', 'capability', 'resolve', 'env',
|
|
72
|
+
'config', 'graph', 'order', 'export', 'depend', 'point', 'defs',
|
|
73
|
+
'catalog', 'host',
|
|
74
|
+
].map((m) => 'feature/secrets/plugin/' + m + '.ml')
|
|
75
|
+
|
|
76
|
+
const SECRETS_CORE_MODULES = ['json', 'secret', 'provider', 'sekreto']
|
|
77
|
+
.map((m) => 'feature/secrets/sekreto/' + m + '.ml')
|
|
78
|
+
|
|
79
|
+
const SECRETS_TLS_HELPERS = ['crypto', 'sigv4', 'tls', 'http', 'httpjson']
|
|
80
|
+
.map((m) => 'feature/secrets/plugins/' + m + '.ml')
|
|
81
|
+
|
|
82
|
+
const SECRETS_PROC_HELPERS = ['feature/secrets/plugins/runcmd.ml']
|
|
83
|
+
|
|
84
|
+
function secretsBuild(model: Model, target: any): SecretsBuild | null {
|
|
85
|
+
const feature = targetFeatures(model, target)
|
|
86
|
+
if (null == (feature as any).secrets) return null
|
|
87
|
+
|
|
88
|
+
const declared = getModelPath(model,
|
|
89
|
+
`main.${KIT}.feature.secrets.plugin`,
|
|
90
|
+
{ required: false, only_active: false }) || {}
|
|
91
|
+
|
|
92
|
+
const groups: string[] = []
|
|
93
|
+
const tlsGroups: string[] = []
|
|
94
|
+
const syms = new Set<string>()
|
|
95
|
+
const kinds = new Set<string>()
|
|
96
|
+
|
|
97
|
+
each(declared, (plugin: any) => {
|
|
98
|
+
// Filter on `active` HERE rather than trusting the feature object to
|
|
99
|
+
// arrive filtered (Config_go's note): getting this wrong names a
|
|
100
|
+
// constructor for a module the trim just deleted.
|
|
101
|
+
if (true !== plugin.active) return
|
|
102
|
+
const defs: Record<string, string> = plugin.def?.[target.name] || {}
|
|
103
|
+
if (0 === Object.keys(defs).length) return
|
|
104
|
+
groups.push(plugin.name)
|
|
105
|
+
if (true === plugin.needs?.fetch) tlsGroups.push(plugin.name)
|
|
106
|
+
for (const [sym, path] of Object.entries(defs)) {
|
|
107
|
+
syms.add(sym)
|
|
108
|
+
kinds.add(String(path))
|
|
109
|
+
}
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
const tls = 0 < tlsGroups.length
|
|
113
|
+
return {
|
|
114
|
+
groups: groups.sort(),
|
|
115
|
+
tlsGroups: tlsGroups.sort(),
|
|
116
|
+
tls,
|
|
117
|
+
plugin: SECRETS_PLUGIN_MODULES,
|
|
118
|
+
core: SECRETS_CORE_MODULES,
|
|
119
|
+
helpers: [
|
|
120
|
+
...(tls ? SECRETS_TLS_HELPERS : []),
|
|
121
|
+
...(0 < kinds.size ? SECRETS_PROC_HELPERS : []),
|
|
122
|
+
],
|
|
123
|
+
kinds: Array.from(kinds).sort(),
|
|
124
|
+
syms: Array.from(syms).sort(),
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
29
129
|
// sdk_config.ml: make_config () builds the embedded API model as a value;
|
|
30
130
|
// make_feature name is the N-feature-safe factory the client uses to
|
|
31
131
|
// instantiate features named in the options (mirrors go/rust Config).
|
|
@@ -40,6 +140,8 @@ const Config = cmp(async function Config(props: any) {
|
|
|
40
140
|
// helpers/applicability.
|
|
41
141
|
const feature = targetFeatures(model, target)
|
|
42
142
|
|
|
143
|
+
const secrets = secretsBuild(model, target)
|
|
144
|
+
|
|
43
145
|
// The canonical config OBJECT and its JSON, from the shared helper. Both
|
|
44
146
|
// representations render from the same `def`, so they cannot describe
|
|
45
147
|
// different configs - and this target picks up `options.server` (the OpenAPI
|
|
@@ -80,9 +182,6 @@ let config_data = "${ocamlString(configJson)}"
|
|
|
80
182
|
|
|
81
183
|
let make_config () : value =
|
|
82
184
|
Sdk_json.json_read config_data
|
|
83
|
-
|
|
84
|
-
let make_feature (name : string) : feature =
|
|
85
|
-
match name with
|
|
86
185
|
`)
|
|
87
186
|
}
|
|
88
187
|
else {
|
|
@@ -99,11 +198,76 @@ open Sdk_features
|
|
|
99
198
|
|
|
100
199
|
let make_config () : value =
|
|
101
200
|
${formatOcamlValue(config, 1)}
|
|
201
|
+
`)
|
|
202
|
+
}
|
|
102
203
|
|
|
103
|
-
|
|
204
|
+
// THE PLUGIN DEFINITIONS the model selected, per feature (the ocaml
|
|
205
|
+
// peer of Config_go's featurePlugins map). EMITTED UNCONDITIONALLY, so
|
|
206
|
+
// every generated config answers the same question - but typed as
|
|
207
|
+
// `Defs.definition list` only when the secrets feature is active: the
|
|
208
|
+
// `Defs` module is part of the vendored voxgig/plugin tree, which is
|
|
209
|
+
// compiled only then, so an inactive model gets the polymorphic empty
|
|
210
|
+
// list instead (`'a list`, which unifies with anything a caller
|
|
211
|
+
// expects). DELIBERATE DIVERGENCE from the c/lua accessors, whose
|
|
212
|
+
// untyped return (void**, a table) needs no such split.
|
|
213
|
+
if (null == secrets) {
|
|
214
|
+
Content(`
|
|
215
|
+
(* The plugin definitions the model selected, per feature: none - no
|
|
216
|
+
* plugin-bearing feature is active in this SDK. *)
|
|
217
|
+
let feature_plugins (_name : string) = []
|
|
218
|
+
`)
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
Content(`
|
|
222
|
+
(* The plugin definitions the model selected for the secrets feature's
|
|
223
|
+
* provider chain${0 === secrets.groups.length ? ': none - the chain can name the four built-in kinds (env, memory, dotenv, file) and a custom provider, and nothing else' : ' (plugin groups: ' + secrets.groups.join(', ') + ')'}.
|
|
224
|
+
* Built, not held: every call is a fresh list, so two chains never share
|
|
225
|
+
* a definition. *)
|
|
226
|
+
let feature_plugins (name : string) : Defs.definition list =
|
|
104
227
|
match name with
|
|
228
|
+
| "secrets" -> [${0 === secrets.syms.length ? '' : '\n' + secrets.syms.map((sym: string) => ' ' + sym + ' ();\n').join('') + ' '}]
|
|
229
|
+
| _ -> []
|
|
230
|
+
`)
|
|
231
|
+
|
|
232
|
+
// THE EXCHANGE TRANSPORT OF LAST RESORT (go's rawExchangeFetch): the
|
|
233
|
+
// vendored sekreto HTTP client, which the active plugin groups
|
|
234
|
+
// compile and link anyway (feature/secrets/feature.mk adds the OpenSSL binding on
|
|
235
|
+
// exactly this condition). It exists so an exchange works with
|
|
236
|
+
// ordinary SDK options - requiring a custom transport for the COMMON
|
|
237
|
+
// case would refuse every live token purchase before a request was
|
|
238
|
+
// made. Same result shape the system.fetch seam promises ({status,
|
|
239
|
+
// statusText, headers, body, json()}). With no such group the feature
|
|
240
|
+
// is built without it and a purchase with no options.system.fetch
|
|
241
|
+
// fails with a named error (see secrets_feature.ml).
|
|
242
|
+
if (secrets.tls) {
|
|
243
|
+
Content(`
|
|
244
|
+
(* The token-exchange transport of last resort: the vendored sekreto HTTP
|
|
245
|
+
* client (plugins/http.ml over plugins/tls.ml), compiled because a plugin
|
|
246
|
+
* group needing a transport is active (${secrets.tlsGroups.join(', ')}).
|
|
247
|
+
* A network failure raises sekreto's own Sekreto_error, which the feature
|
|
248
|
+
* reports as the refusal. *)
|
|
249
|
+
let secrets_transport (url : string) (fetchdef : value) : value =
|
|
250
|
+
let meth = match getp fetchdef "method" with Str s -> s | _ -> "POST" in
|
|
251
|
+
let headers = match getp fetchdef "headers" with
|
|
252
|
+
| Map _ as h ->
|
|
253
|
+
List.filter_map (fun k -> match getp h k with Str v -> Some (k, v) | _ -> None) (keysof h)
|
|
254
|
+
| _ -> [] in
|
|
255
|
+
let body = match getp fetchdef "body" with Str s -> Some s | _ -> None in
|
|
256
|
+
let res = Http.request meth url headers body in
|
|
257
|
+
let text = res.Http.body in
|
|
258
|
+
jo [("status", Num (float_of_int res.Http.status));
|
|
259
|
+
("statusText", Str (if res.Http.status >= 400 then "ERR" else "OK"));
|
|
260
|
+
("headers", empty_map ());
|
|
261
|
+
("body", Str text);
|
|
262
|
+
("json", json_thunk (try Sdk_json.json_read text with _ -> Noval))]
|
|
105
263
|
`)
|
|
264
|
+
}
|
|
106
265
|
}
|
|
266
|
+
// The factory, AFTER the definitions it names: OCaml binds top to bottom.
|
|
267
|
+
Content(`
|
|
268
|
+
let make_feature (name : string) : feature =
|
|
269
|
+
match name with
|
|
270
|
+
`)
|
|
107
271
|
|
|
108
272
|
// ONLY THE FEATURES THIS PORT ACTUALLY IMPLEMENTS. Emitting an arm for a
|
|
109
273
|
// name with no `<name>_feature` in tm/ocaml/sdk_features.ml is an
|
|
@@ -124,12 +288,26 @@ let make_feature (name : string) : feature =
|
|
|
124
288
|
}
|
|
125
289
|
})
|
|
126
290
|
|
|
291
|
+
// The secrets feature is the one ocaml feature that lives OUTSIDE
|
|
292
|
+
// sdk_features.ml (a container: feature/secrets_feature.ml plus the
|
|
293
|
+
// vendored trees), so its arm names its own module and hands it the
|
|
294
|
+
// definitions the model selected and, when a plugin group needing a
|
|
295
|
+
// transport is active, the bundled exchange transport. Emitted only
|
|
296
|
+
// when the feature is active: the module is not compiled otherwise
|
|
297
|
+
// (Main_ocaml's container gate, and the Makefile's feature/secrets/feature.mk).
|
|
298
|
+
if (null != secrets) {
|
|
299
|
+
Content(` | "secrets" -> Secrets_feature.make ~plugins:(feature_plugins "secrets")${secrets.tls ? ' ~transport:secrets_transport' : ''} ()
|
|
300
|
+
`)
|
|
301
|
+
}
|
|
302
|
+
|
|
127
303
|
Content(` | _ -> base_feature ()
|
|
128
304
|
`)
|
|
305
|
+
|
|
129
306
|
})
|
|
130
307
|
})
|
|
131
308
|
|
|
132
309
|
|
|
133
310
|
export {
|
|
134
|
-
Config
|
|
311
|
+
Config,
|
|
312
|
+
secretsBuild,
|
|
135
313
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
|
|
2
2
|
import {
|
|
3
3
|
cmp, each,
|
|
4
|
-
File, Content, Copy,
|
|
4
|
+
File, Content, Copy, Folder,
|
|
5
5
|
entityClassName,
|
|
6
|
+
pluginExcludes,
|
|
7
|
+
targetFeatures,
|
|
6
8
|
} from '@voxgig/sdkgen'
|
|
7
9
|
|
|
8
10
|
|
|
@@ -18,10 +20,24 @@ import {
|
|
|
18
20
|
|
|
19
21
|
|
|
20
22
|
import { Package } from './Package_ocaml'
|
|
21
|
-
import { Config } from './Config_ocaml'
|
|
23
|
+
import { Config, secretsBuild } from './Config_ocaml'
|
|
22
24
|
import { Gitignore } from './Gitignore_ocaml'
|
|
23
25
|
import { MainEntity } from './MainEntity_ocaml'
|
|
24
26
|
import { SdkError } from './SdkError_ocaml'
|
|
27
|
+
import { entityModule, ocamlString } from './utility_ocaml'
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
// Features whose source is a CONTAINER under the top-level feature/ dir,
|
|
31
|
+
// beside the single template module (sdk_features.ml) every other ocaml
|
|
32
|
+
// feature lives in. Today that is `secrets`: feature/secrets_feature.ml,
|
|
33
|
+
// feature/secrets/ (the vendored @voxgig/sekreto port, the voxgig/plugin
|
|
34
|
+
// host and the provider kinds - some forty modules of key-store,
|
|
35
|
+
// request-signing and child-process code that an SDK which never asked for
|
|
36
|
+
// secrets must not ship) and its shipped suite under test/feature/secrets/.
|
|
37
|
+
// Anything named here is EXCLUDED from the verbatim copy unless the model
|
|
38
|
+
// SELECTS the feature (see the Copy below). The lua and clojure targets gate
|
|
39
|
+
// their containers the same way (Main_lua.ts, Main_clojure.ts).
|
|
40
|
+
const CONTAINED = ['secrets']
|
|
25
41
|
|
|
26
42
|
|
|
27
43
|
const Main = cmp(async function Main(props: any) {
|
|
@@ -30,6 +46,27 @@ const Main = cmp(async function Main(props: any) {
|
|
|
30
46
|
const { model } = props.ctx$
|
|
31
47
|
|
|
32
48
|
const entity: Record<string, ModelEntity> = getModelPath(model, `main.${KIT}.entity`)
|
|
49
|
+
// Gated by the applicability tags, so this target never names a feature
|
|
50
|
+
// it has no source for. One rule, one place: helpers/applicability.
|
|
51
|
+
const feature = targetFeatures(model, target)
|
|
52
|
+
|
|
53
|
+
// THE feature/<name>/ CONTAINER IS GATED HERE, at generate time - the
|
|
54
|
+
// top-level-container peer of the `srcFeatureExcludes` gate ts and js
|
|
55
|
+
// apply to src/feature/<name>/. `target add` keeps an unselected
|
|
56
|
+
// feature out of a project's tm/ in the first place (ocaml.aon has
|
|
57
|
+
// `feature: { trim: true }`); this covers a feature switched off after
|
|
58
|
+
// it was added, and the generator suite, which copies the whole scaffold
|
|
59
|
+
// tree. An inactive feature's vendored kind files go with it - every
|
|
60
|
+
// declared group's, not only the groups marked inactive, because
|
|
61
|
+
// pluginExcludes below walks only ACTIVE features (Main_c's
|
|
62
|
+
// inactivePluginExcludes, for the same reason one target over).
|
|
63
|
+
const containerExcludes = CONTAINED
|
|
64
|
+
.filter((name: string) => null == (feature as any)[name])
|
|
65
|
+
.flatMap((name: string) => [
|
|
66
|
+
new RegExp('(^|/)feature/' + name + '_feature\\.ml$'),
|
|
67
|
+
new RegExp('(^|/)feature/' + name + '/'),
|
|
68
|
+
new RegExp('(^|/)test/feature/' + name + '/'),
|
|
69
|
+
])
|
|
33
70
|
|
|
34
71
|
Package({ target })
|
|
35
72
|
|
|
@@ -42,15 +79,108 @@ const Main = cmp(async function Main(props: any) {
|
|
|
42
79
|
// @voxgig/omni corpus engine) rides along verbatim - the replacements are
|
|
43
80
|
// ProjectName-shaped and the port names nothing project-specific, so it
|
|
44
81
|
// lands byte-identical to its recorded vendored.json digest.
|
|
82
|
+
//
|
|
83
|
+
// pluginExcludes: the generate-time plugin trim (an ACTIVE feature's
|
|
84
|
+
// INACTIVE plugin group's declared files stay out of the tree). The
|
|
85
|
+
// model's ocaml `path` entries are target-root-relative, which is this
|
|
86
|
+
// Copy's root - helpers/featureSource documents that getting the root
|
|
87
|
+
// wrong makes the trim a silent no-op. ocaml has `srcfeature: false`, so
|
|
88
|
+
// the per-feature Copy in cmp/Feature.ts - where pluginExcludesFor
|
|
89
|
+
// normally applies this trim - never runs for it, and this whole-tree
|
|
90
|
+
// Copy is the ONLY copy the target has (Main_go.ts precedent).
|
|
45
91
|
Copy({
|
|
46
92
|
from: 'tm/' + target.name,
|
|
47
93
|
exclude: [/src\//, /\.(cmi|cmo|cmx|cma|cmxa|o|a)$/, /a\.out$/,
|
|
48
|
-
/run_sdk_test$/, /run_omni_smoke$/, /run_struct_corpus$/, /run_primary_corpus
|
|
94
|
+
/run_sdk_test$/, /run_omni_smoke$/, /run_struct_corpus$/, /run_primary_corpus$/,
|
|
95
|
+
...containerExcludes, ...pluginExcludes(model)],
|
|
49
96
|
replace: {
|
|
50
97
|
...props.ctx$.stdrep,
|
|
51
98
|
}
|
|
52
99
|
})
|
|
53
100
|
|
|
101
|
+
// THE BUILD SEAM: feature/secrets/feature.mk, GENERATED only when the
|
|
102
|
+
// model activates `secrets` for this target. It is what only the model
|
|
103
|
+
// knows and only a Makefile can say in OCaml - the module list in
|
|
104
|
+
// DEPENDENCY ORDER (ocamlc compiles a module before anything that uses
|
|
105
|
+
// it and has no link-time reordering, so a wildcard over the vendored
|
|
106
|
+
// directories would not build), the -I paths, unix.cma for the dotenv
|
|
107
|
+
// and file built-ins, the gated suite, and, ONLY when an active plugin
|
|
108
|
+
// group declares `needs.fetch`, the OpenSSL binding: plugins/tls_stubs.c
|
|
109
|
+
// compiled and linked with `-custom -cclib -lssl -cclib -lcrypto`. The
|
|
110
|
+
// template Makefile includes `$(wildcard feature/*/feature.mk)` - it names
|
|
111
|
+
// no feature itself - and every variable a fragment sets is empty without
|
|
112
|
+
// one, so an SDK without secrets - or with the built-in
|
|
113
|
+
// chain alone, or with `secretspec` alone - runs no C compiler and links
|
|
114
|
+
// no OpenSSL. The shape lua's native.mk and c's kinds.c take.
|
|
115
|
+
//
|
|
116
|
+
// The vendored stub opens with the vendoring tool's three-line `(* *)`
|
|
117
|
+
// provenance header (every file under tm/ocaml is stamped in ocaml's
|
|
118
|
+
// comment syntax; the guard holds that), which a C compiler cannot
|
|
119
|
+
// read - so the rule feeds the compiler from line four, as lua's does.
|
|
120
|
+
// Compiler line numbers are therefore three lower than in the file.
|
|
121
|
+
const build = secretsBuild(model, target)
|
|
122
|
+
if (null != build) {
|
|
123
|
+
Folder({ name: 'feature' }, () => {
|
|
124
|
+
Folder({ name: 'secrets' }, () => {
|
|
125
|
+
File({ name: 'feature.mk' }, () => {
|
|
126
|
+
Content(`# ${model.const.Name} SDK: the secrets feature build.
|
|
127
|
+
#
|
|
128
|
+
# GENERATED because the model activates \`secrets\` for this target
|
|
129
|
+
# (plugin groups: ${0 === build.groups.length ? 'none - the built-in kinds alone' : build.groups.join(', ')}).
|
|
130
|
+
# An SDK whose model does not has no such file, and its Makefile's optional
|
|
131
|
+
# include of it is a no-op: nothing of the feature is compiled. Do not
|
|
132
|
+
# hand-edit - change the model's plugin groups and regenerate.
|
|
133
|
+
#
|
|
134
|
+
# MODULE ORDER IS THE DEPENDENCY ORDER: the voxgig/plugin host, the sekreto
|
|
135
|
+
# core, the shared helpers the selected kinds open, the kinds, the feature.
|
|
136
|
+
|
|
137
|
+
FEATURE_INC = -I +unix -I feature -I feature/secrets/plugin \\
|
|
138
|
+
-I feature/secrets/sekreto -I feature/secrets/plugins
|
|
139
|
+
FEATURE_LIB = unix.cma
|
|
140
|
+
|
|
141
|
+
SECRETS_PLUGIN = ${build.plugin.join(' \\\n ')}
|
|
142
|
+
|
|
143
|
+
SECRETS_CORE = ${build.core.join(' \\\n ')}
|
|
144
|
+
|
|
145
|
+
SECRETS_HELPERS =${0 === build.helpers.length ? '' : ' ' + build.helpers.join(' \\\n ')}
|
|
146
|
+
|
|
147
|
+
SECRETS_KINDS =${0 === build.kinds.length ? '' : ' ' + build.kinds.join(' \\\n ')}
|
|
148
|
+
|
|
149
|
+
FEATURE_SRC = $(SECRETS_PLUGIN) $(SECRETS_CORE) $(SECRETS_HELPERS) $(SECRETS_KINDS) \\
|
|
150
|
+
feature/secrets_feature.ml
|
|
151
|
+
|
|
152
|
+
FEATURE_TESTS = test/feature/secrets/t_secrets.ml
|
|
153
|
+
`)
|
|
154
|
+
|
|
155
|
+
if (build.tls) {
|
|
156
|
+
Content(`
|
|
157
|
+
# THE ONE EXTERNAL DEPENDENCY, behind the plugin groups that need a
|
|
158
|
+
# transport (${build.tlsGroups.join(', ')}): plugins/tls.ml's externals live in
|
|
159
|
+
# plugins/tls_stubs.c against OpenSSL, so the stub is compiled here and the
|
|
160
|
+
# bytecode executables are linked \`-custom\` with libssl and libcrypto.
|
|
161
|
+
# The stub is fed from line four (past the provenance header, see above).
|
|
162
|
+
OCAMLLIB = $(shell $(OCAMLC) -where)
|
|
163
|
+
FEATURE_OBJ = feature/secrets/plugins/tls_stubs.o
|
|
164
|
+
FEATURE_LINK = -custom -cclib -lssl -cclib -lcrypto
|
|
165
|
+
|
|
166
|
+
feature/secrets/plugins/tls_stubs.o: feature/secrets/plugins/tls_stubs.c
|
|
167
|
+
@command -v $(CC) >/dev/null 2>&1 || { echo "secrets: a C compiler ($(CC)) is needed to build the OpenSSL binding that this SDK's secrets plugin kinds (${build.tlsGroups.join(', ')}) run - install one, or use only the built-in provider kinds" >&2; exit 1; }
|
|
168
|
+
tail -n +4 $< | $(CC) -std=c11 -O2 -Wall -Wextra -I$(OCAMLLIB) -x c - -c -o $@
|
|
169
|
+
`)
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
Content(`
|
|
173
|
+
# No active plugin group needs a transport, so the OpenSSL binding is not
|
|
174
|
+
# compiled and nothing is linked beyond the OCaml distribution.
|
|
175
|
+
FEATURE_OBJ =
|
|
176
|
+
FEATURE_LINK =
|
|
177
|
+
`)
|
|
178
|
+
}
|
|
179
|
+
})
|
|
180
|
+
})
|
|
181
|
+
})
|
|
182
|
+
}
|
|
183
|
+
|
|
54
184
|
// Generated API config + branded-error re-export.
|
|
55
185
|
Config({ target })
|
|
56
186
|
SdkError({ target })
|
|
@@ -109,6 +239,33 @@ let prepare (client : sdk_client) (fetchargs : value) : value =
|
|
|
109
239
|
each(entity, (entity: ModelEntity) => {
|
|
110
240
|
MainEntity({ target, entity })
|
|
111
241
|
})
|
|
242
|
+
|
|
243
|
+
// Entity by NAME. DELIBERATE DIVERGENCE: OCaml has no dynamic dispatch
|
|
244
|
+
// over module names, so a caller that discovers entities from the config
|
|
245
|
+
// rather than naming a generated accessor - the shipped feature suites
|
|
246
|
+
// are templates and know no project's entity names - has no way to reach
|
|
247
|
+
// one without this. The go peer is the untyped interface go-cli/go-mcp
|
|
248
|
+
// dispatch through. None for a name this SDK did not generate.
|
|
249
|
+
const names = each(entity).map((e: ModelEntity) => e.name).sort()
|
|
250
|
+
if (0 === names.length) {
|
|
251
|
+
Content(`
|
|
252
|
+
(* Entity by name: this SDK generated no entities. *)
|
|
253
|
+
let entity (_client : sdk_client) (_name : string) (_entopts : value) : entity_obj option =
|
|
254
|
+
None
|
|
255
|
+
`)
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
Content(`
|
|
259
|
+
(* Entity by name (None for a name this SDK did not generate). *)
|
|
260
|
+
let entity (client : sdk_client) (name : string) (entopts : value) : entity_obj option =
|
|
261
|
+
match name with
|
|
262
|
+
${names.map((name: string) => {
|
|
263
|
+
const mod = entityModule(name)
|
|
264
|
+
const Mod = mod.charAt(0).toUpperCase() + mod.slice(1)
|
|
265
|
+
return ` | "${ocamlString(name)}" -> Some (${Mod}.make client entopts)\n`
|
|
266
|
+
}).join('')} | _ -> None
|
|
267
|
+
`)
|
|
268
|
+
}
|
|
112
269
|
})
|
|
113
270
|
|
|
114
271
|
})
|