@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,135 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/plugin sdk-20260908-1556-0 (lua/src/plugin/capability.lua)
|
|
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
|
+
-- Capabilities (section 11.1).
|
|
5
|
+
--
|
|
6
|
+
-- A DEPENDENCY IS ON A CAPABILITY, NOT ON A REF - because it is a
|
|
7
|
+
-- dependency on something that can do the job, and which instance is doing
|
|
8
|
+
-- it is exactly the configuration detail a plugin must not care about.
|
|
9
|
+
--
|
|
10
|
+
-- But A BINDING IS TO AN INSTANCE, not to a capability, which is what
|
|
11
|
+
-- decides behaviour when the bound provider leaves while another match
|
|
12
|
+
-- remains.
|
|
13
|
+
|
|
14
|
+
local T = require 'feature.secrets.plugin.types'
|
|
15
|
+
local V = require 'feature.secrets.plugin.version'
|
|
16
|
+
|
|
17
|
+
local M = {}
|
|
18
|
+
|
|
19
|
+
-- Rank the matching live providers and return them best-first: highest
|
|
20
|
+
-- `version`, then LOWEST `priority` (default 0), then declaration position
|
|
21
|
+
-- `pos` ascending.
|
|
22
|
+
--
|
|
23
|
+
-- `priority` is a field on the capability rather than section 7's `order`
|
|
24
|
+
-- band, because bands live on POINT BINDINGS: a provider may have several
|
|
25
|
+
-- bindings with different bands, or none at all, so a rank reaching for
|
|
26
|
+
-- one would be undefined in the common case.
|
|
27
|
+
--
|
|
28
|
+
-- Without a total rank, "any provider satisfies" is true of the GRAPH and
|
|
29
|
+
-- useless to the PLUGIN - two ports could bind different `store`
|
|
30
|
+
-- instances, both resolve green, and behave differently, which is
|
|
31
|
+
-- precisely the divergence a shared corpus exists to catch.
|
|
32
|
+
function M.resolve_capability(req, candidates)
|
|
33
|
+
local hits = {}
|
|
34
|
+
for i = 1, T.len(candidates) do
|
|
35
|
+
local c = candidates[i]
|
|
36
|
+
if M.matches(req, T.getv(c, 'provides') or T.map {}) then
|
|
37
|
+
hits[#hits + 1] = c
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
-- STABLE: table.sort is not, and the rank falls through to `pos`.
|
|
41
|
+
return T.list(T.stable_sort(hits, M.ranks))
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
-- Best-first: true when `a` outranks `b`.
|
|
45
|
+
function M.ranks(a, b)
|
|
46
|
+
local pa = T.getv(a, 'provides') or T.map {}
|
|
47
|
+
local pb = T.getv(b, 'provides') or T.map {}
|
|
48
|
+
local va = T.getv(pa, 'version')
|
|
49
|
+
local vb = T.getv(pb, 'version')
|
|
50
|
+
|
|
51
|
+
-- An ABSENT version sorts LAST, whatever the other is - "no version"
|
|
52
|
+
-- loses to every version rather than being read as 0.0.0.
|
|
53
|
+
if (nil == va) ~= (nil == vb) then
|
|
54
|
+
return nil ~= va
|
|
55
|
+
end
|
|
56
|
+
if nil ~= va then
|
|
57
|
+
local la, lb = V.version_parts(va), V.version_parts(vb)
|
|
58
|
+
for i = 1, math.max(#la, #lb) do
|
|
59
|
+
local x, y = la[i] or 0, lb[i] or 0
|
|
60
|
+
if x ~= y then return x > y end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
local qa = T.getv(pa, 'priority') or 0
|
|
65
|
+
local qb = T.getv(pb, 'priority') or 0
|
|
66
|
+
if qa ~= qb then return qa < qb end
|
|
67
|
+
|
|
68
|
+
return (T.getv(a, 'pos') or 0) < (T.getv(b, 'pos') or 0)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
function M.matches(req, prov)
|
|
72
|
+
if not T.same(T.getv(req, 'name'), T.getv(prov, 'name')) then
|
|
73
|
+
return false
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
local range = T.getv(req, 'range')
|
|
77
|
+
if nil ~= range then
|
|
78
|
+
local version = T.getv(prov, 'version')
|
|
79
|
+
if nil == version then return false end
|
|
80
|
+
if not V.satisfiesq(version, range) then return false end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
-- `match` is checked against the provider's `attrs`, key by key. A key
|
|
84
|
+
-- the provider does not carry is a miss, not a pass: a requirement
|
|
85
|
+
-- asking for `transactional: true` must not be satisfied by a provider
|
|
86
|
+
-- that never said.
|
|
87
|
+
local want = T.getv(req, 'match')
|
|
88
|
+
if nil ~= want then
|
|
89
|
+
local attrs = T.getv(prov, 'attrs') or T.map {}
|
|
90
|
+
for _, k in ipairs(T.keys(want)) do
|
|
91
|
+
if not T.has(attrs, k) then return false end
|
|
92
|
+
if not M.matchvalue(want[k], attrs[k]) then return false end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
return true
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
-- PARTIAL MATCH, RECURSING INTO MAPS (section 11.1).
|
|
100
|
+
--
|
|
101
|
+
-- Section 11.1 defines `match` as "a partial match against `attrs`, with
|
|
102
|
+
-- exactly the semantics voxgig/struct and the omni corpus already define
|
|
103
|
+
-- for `match` - every leaf in the requirement must be present and equal in
|
|
104
|
+
-- the capability, keys not mentioned are not checked."
|
|
105
|
+
--
|
|
106
|
+
-- Equality is by JSON TYPE as well as value: `transactional: 1` does not
|
|
107
|
+
-- satisfy `transactional: true`. LUA NEEDS NO GUARD FOR THAT - `true == 1`
|
|
108
|
+
-- and `1 == '1'` are both false, with no coercion in `==` - so the
|
|
109
|
+
-- explicit check php and perl each carry would be dead code here. What lua
|
|
110
|
+
-- DOES need is the tagged tables, without which `{}` and `[]` would take
|
|
111
|
+
-- the same branch.
|
|
112
|
+
--
|
|
113
|
+
-- A LIST IS COMPARED LEAF-WISE AT THE SAME LENGTH, not as a subset.
|
|
114
|
+
function M.matchvalue(want, got)
|
|
115
|
+
if T.ismap(want) then
|
|
116
|
+
if not T.ismap(got) then return false end
|
|
117
|
+
for _, k in ipairs(T.keys(want)) do
|
|
118
|
+
if not T.has(got, k) then return false end
|
|
119
|
+
if not M.matchvalue(want[k], got[k]) then return false end
|
|
120
|
+
end
|
|
121
|
+
return true
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
if T.islist(want) then
|
|
125
|
+
if not T.islist(got) or #want ~= #got then return false end
|
|
126
|
+
for i = 1, #want do
|
|
127
|
+
if not M.matchvalue(want[i], got[i]) then return false end
|
|
128
|
+
end
|
|
129
|
+
return true
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
return T.same(want, got)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
return M
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/plugin sdk-20260908-1556-0 (lua/src/plugin/catalog.lua)
|
|
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
|
+
-- The definition catalog (section 10.1).
|
|
5
|
+
--
|
|
6
|
+
-- A definition is registered once and may back many instances. Option
|
|
7
|
+
-- shapes are validated AT REGISTRATION, not when a document happens to
|
|
8
|
+
-- exercise a key - so a malformed shape fails once, and in the same place
|
|
9
|
+
-- everywhere (section 9.4).
|
|
10
|
+
|
|
11
|
+
local T = require 'feature.secrets.plugin.types'
|
|
12
|
+
local R = require 'feature.secrets.plugin.ref'
|
|
13
|
+
local C = require 'feature.secrets.plugin.config'
|
|
14
|
+
|
|
15
|
+
local M = {}
|
|
16
|
+
|
|
17
|
+
local Catalog = {}
|
|
18
|
+
Catalog.__index = Catalog
|
|
19
|
+
M.Catalog = Catalog
|
|
20
|
+
|
|
21
|
+
function Catalog.new()
|
|
22
|
+
return setmetatable({ defs = {} }, Catalog)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
function Catalog:add(definition)
|
|
26
|
+
local name = 'table' == type(definition) and definition.name or definition
|
|
27
|
+
if 'table' ~= type(definition) or not R.check_name(name) then
|
|
28
|
+
T.fail('plugin_definition_name',
|
|
29
|
+
'invalid definition name: ' .. T.encode(name), nil)
|
|
30
|
+
end
|
|
31
|
+
-- Validate the shape HERE. Deferring it to resolution time means a
|
|
32
|
+
-- malformed shape surfaces at a different moment in every host that
|
|
33
|
+
-- loads it, which is the divergence the stated domain exists to prevent.
|
|
34
|
+
if T.truthy(definition.shape) then
|
|
35
|
+
C.check_shape(definition.shape)
|
|
36
|
+
end
|
|
37
|
+
self.defs[name] = definition
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
function Catalog:get(name)
|
|
41
|
+
return self.defs[name]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
function Catalog:has(name)
|
|
45
|
+
return nil ~= self.defs[name]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
function Catalog:names()
|
|
49
|
+
local out = {}
|
|
50
|
+
for k in pairs(self.defs) do out[#out + 1] = k end
|
|
51
|
+
table.sort(out)
|
|
52
|
+
return out
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
function M.make_catalog(definitions)
|
|
56
|
+
local catalog = Catalog.new()
|
|
57
|
+
for _, d in ipairs(definitions or {}) do
|
|
58
|
+
catalog:add(d)
|
|
59
|
+
end
|
|
60
|
+
return catalog
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
return M
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/plugin sdk-20260908-1556-0 (lua/src/plugin/config.lua)
|
|
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
|
+
-- The declarative document (section 9): normalization, and the ten-level
|
|
5
|
+
-- precedence ladder.
|
|
6
|
+
--
|
|
7
|
+
-- TWO FUNCTIONS, AND THE SPLIT BETWEEN THEM IS FORCED.
|
|
8
|
+
--
|
|
9
|
+
-- `normalize_config` normalizes STRUCTURE and ENTRY KEYS. It does not
|
|
10
|
+
-- merge options, and cannot: section 9.4 makes merge behaviour a property
|
|
11
|
+
-- of the definition's option SHAPE, which normalization has never seen. A
|
|
12
|
+
-- normalizer that flattened the option layers would make `$MERGE: append`
|
|
13
|
+
-- unimplementable at load time, because the layers it must concatenate
|
|
14
|
+
-- would already be collapsed.
|
|
15
|
+
--
|
|
16
|
+
-- `resolve_options` applies the ladder, and it is the only place that
|
|
17
|
+
-- knows the shape.
|
|
18
|
+
|
|
19
|
+
local T = require 'feature.secrets.plugin.types'
|
|
20
|
+
local R = require 'feature.secrets.plugin.ref'
|
|
21
|
+
|
|
22
|
+
local M = {}
|
|
23
|
+
|
|
24
|
+
M.MERGE_WORDS = { replace = true, append = true }
|
|
25
|
+
|
|
26
|
+
local function checkreserved(ref, reserved)
|
|
27
|
+
if not T.islist(reserved) or 0 == #reserved then return end
|
|
28
|
+
local name = R.refname(ref)
|
|
29
|
+
for i = 1, #reserved do
|
|
30
|
+
if reserved[i] == name then
|
|
31
|
+
T.fail('plugin_ref_reserved', 'ref is reserved by the host: ' .. ref,
|
|
32
|
+
T.map { ref = ref })
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
-- PRESENCE decides, not truthiness and not nil. A JSON `null` is a present
|
|
38
|
+
-- value in JavaScript (`undefined !== null`), so it must be one here - and
|
|
39
|
+
-- `T.has` is the only test that can tell them apart, because a lua table
|
|
40
|
+
-- cannot store a nil.
|
|
41
|
+
local function pick(src, key, dflt)
|
|
42
|
+
if T.has(src, key) then return src[key] end
|
|
43
|
+
return dflt
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
-- Both document forms reduce to {ref -> entry} plus the order the form
|
|
47
|
+
-- implies: array POSITION for the array form, sorted refs for the map
|
|
48
|
+
-- form.
|
|
49
|
+
local function entries(src)
|
|
50
|
+
local map = {}
|
|
51
|
+
local order = {}
|
|
52
|
+
if nil == src or T.NULL == src then
|
|
53
|
+
return map, order
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
if T.islist(src) then
|
|
57
|
+
for i = 1, #src do
|
|
58
|
+
local item = src[i]
|
|
59
|
+
local ref = R.canon_ref(T.getv(item, 'ref'))
|
|
60
|
+
map[ref] = item
|
|
61
|
+
order[#order + 1] = ref
|
|
62
|
+
end
|
|
63
|
+
return map, order
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
-- Map-form refs arrive as KEYS, through a different path than an array
|
|
67
|
+
-- element's `ref` field - and must canonicalize the same way.
|
|
68
|
+
for _, key in ipairs(T.keys(src)) do
|
|
69
|
+
map[R.canon_ref(key)] = src[key]
|
|
70
|
+
end
|
|
71
|
+
-- Byte-wise, NOT locale-aware and NOT case-folded. All-lowercase refs
|
|
72
|
+
-- sort identically under all three, so only mixed input discriminates:
|
|
73
|
+
-- '@' is 0x40, uppercase 0x41-0x5A, lowercase 0x61-0x7A. Lua's `<` on
|
|
74
|
+
-- strings is byte-wise (it uses strcoll only under a non-C locale, which
|
|
75
|
+
-- this port never sets).
|
|
76
|
+
for k in pairs(map) do order[#order + 1] = k end
|
|
77
|
+
table.sort(order)
|
|
78
|
+
return map, order
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
function M.normalize_config(input)
|
|
82
|
+
input = input or T.map {}
|
|
83
|
+
local doc = T.getv(input, 'doc') or T.map {}
|
|
84
|
+
local keys = T.getv(input, 'keys') or T.map {}
|
|
85
|
+
local ikey = T.getv(keys, 'instance') or 'instance'
|
|
86
|
+
local dkey = T.getv(keys, 'default') or 'default'
|
|
87
|
+
local reserved = T.getv(input, 'reserved') or T.list {}
|
|
88
|
+
local profile = T.getv(input, 'profile')
|
|
89
|
+
|
|
90
|
+
-- The rename is applied at TWO PLACES AND NO OTHERS: the document root,
|
|
91
|
+
-- and every profile.<name> overlay root (section 9.1). A rename applied
|
|
92
|
+
-- only at the root would leave `profile.prod.sdk` untranslated and
|
|
93
|
+
-- silently drop every environment override the host depends on.
|
|
94
|
+
-- Recursing further would be worse: option data is the definition's.
|
|
95
|
+
local baseinst = T.getv(doc, ikey)
|
|
96
|
+
local basedef = T.getv(doc, dkey) or T.map {}
|
|
97
|
+
|
|
98
|
+
local overlay
|
|
99
|
+
if nil ~= profile then
|
|
100
|
+
overlay = T.getv(T.getv(doc, 'profile') or T.map {}, profile)
|
|
101
|
+
end
|
|
102
|
+
if not T.ismap(overlay) then overlay = T.map {} end
|
|
103
|
+
local overinst = T.getv(overlay, ikey)
|
|
104
|
+
local overdef = T.getv(overlay, dkey) or T.map {}
|
|
105
|
+
|
|
106
|
+
local basemap, baseorder = entries(baseinst)
|
|
107
|
+
local overmap, overorder = entries(overinst)
|
|
108
|
+
|
|
109
|
+
for _, group in ipairs { basemap, overmap, basedef, overdef } do
|
|
110
|
+
local names = {}
|
|
111
|
+
for k in pairs(group) do names[#names + 1] = k end
|
|
112
|
+
table.sort(names)
|
|
113
|
+
for _, r in ipairs(names) do checkreserved(r, reserved) end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
-- A PARTIAL ARRAY IS NOT A FILTER (section 9.1). sdkgen learned this the
|
|
117
|
+
-- hard way: deriving order from a partial array silently dropped
|
|
118
|
+
-- config-activated features. Refs in the base but absent from the
|
|
119
|
+
-- overlay still load, in sorted position AFTER the listed ones. A
|
|
120
|
+
-- profile may also INTRODUCE a ref the base never declared.
|
|
121
|
+
local order = {}
|
|
122
|
+
local seen = {}
|
|
123
|
+
for _, group in ipairs { overorder, baseorder } do
|
|
124
|
+
for _, r in ipairs(group) do
|
|
125
|
+
if not seen[r] then
|
|
126
|
+
seen[r] = true
|
|
127
|
+
order[#order + 1] = r
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
local instance = T.map {}
|
|
133
|
+
for i, ref in ipairs(order) do
|
|
134
|
+
local b = basemap[ref]
|
|
135
|
+
local o = overmap[ref]
|
|
136
|
+
|
|
137
|
+
-- MERGE THE ENTRIES AS AUTHORED, THEN APPLY DEFAULTS TO THE RESULT
|
|
138
|
+
-- (section 9.3). A safety rule, not a tidiness one: if the overlay had
|
|
139
|
+
-- its defaults filled in before merging it would carry a synthesized
|
|
140
|
+
-- active:true and overwrite a base's false - silently re-enabling a
|
|
141
|
+
-- deliberately disabled integration in production.
|
|
142
|
+
local active = pick(o, 'active', pick(b, 'active', true))
|
|
143
|
+
local start = pick(o, 'start', pick(b, 'start', 'eager'))
|
|
144
|
+
local block = pick(o, 'order', pick(b, 'order', nil))
|
|
145
|
+
|
|
146
|
+
-- Option layers, levels 3-6, IN LADDER ORDER. Never merged here.
|
|
147
|
+
local nm = R.refname(ref)
|
|
148
|
+
local layers = {}
|
|
149
|
+
for _, src in ipairs { { s = basedef[nm] }, { s = b },
|
|
150
|
+
{ s = overdef[nm] }, { s = o } } do
|
|
151
|
+
if T.has(src.s, 'options') then
|
|
152
|
+
layers[#layers + 1] = src.s.options
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
local ent = T.map {
|
|
157
|
+
pos = i - 1,
|
|
158
|
+
active = active,
|
|
159
|
+
start = start,
|
|
160
|
+
optionlayers = T.list(layers),
|
|
161
|
+
}
|
|
162
|
+
if nil ~= block then ent.order = block end
|
|
163
|
+
instance[ref] = ent
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
-- `default` DECLARES NOTHING (section 9.3). It is a base for every
|
|
167
|
+
-- instance of that definition; it does not create one, and an entry for
|
|
168
|
+
-- a name with no instances is inert rather than an error - which is what
|
|
169
|
+
-- makes a shared library of defaults shippable.
|
|
170
|
+
local defout = T.map {}
|
|
171
|
+
for _, n in ipairs(T.keys(basedef)) do defout[n] = basedef[n] end
|
|
172
|
+
for _, n in ipairs(T.keys(overdef)) do defout[n] = overdef[n] end
|
|
173
|
+
|
|
174
|
+
return T.map {
|
|
175
|
+
instance = instance,
|
|
176
|
+
order = T.list(order),
|
|
177
|
+
default = defout,
|
|
178
|
+
}
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
-- -------------------------------------------------------------------
|
|
182
|
+
-- resolve_options - section 9.3's ten levels, and 9.4's directives
|
|
183
|
+
-- -------------------------------------------------------------------
|
|
184
|
+
|
|
185
|
+
local function defaultsof(shape)
|
|
186
|
+
local out = T.map {}
|
|
187
|
+
for _, k in ipairs(T.keys(shape)) do
|
|
188
|
+
local v = shape[k]
|
|
189
|
+
if not T.has(v, '$MERGE') then
|
|
190
|
+
out[k] = v
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
return out
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
local function optsof(src, key)
|
|
197
|
+
if nil == src or T.NULL == src then return nil end
|
|
198
|
+
|
|
199
|
+
-- The array form is equivalent to the map form (section 9.1).
|
|
200
|
+
if T.islist(src) then
|
|
201
|
+
for i = 1, #src do
|
|
202
|
+
if R.canon_ref(T.getv(src[i], 'ref')) == key then
|
|
203
|
+
return T.getv(src[i], 'options')
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
return nil
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
for _, k in ipairs(T.keys(src)) do
|
|
210
|
+
if R.canon_ref(k) == key then
|
|
211
|
+
local entry = src[k]
|
|
212
|
+
if T.ismap(entry) then return T.getv(entry, 'options') end
|
|
213
|
+
return nil
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
return nil
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
local mergeone, deepto
|
|
220
|
+
|
|
221
|
+
-- Merge ONE layer onto the accumulator, honouring the shape's directives.
|
|
222
|
+
-- The directive holds at EVERY precedence level, not only between document
|
|
223
|
+
-- levels - section 9.4 makes it a property of the shape, which does not
|
|
224
|
+
-- know which layer a value arrived from.
|
|
225
|
+
mergeone = function(base, over, shape)
|
|
226
|
+
if nil == over then return base end
|
|
227
|
+
if not T.ismap(base) or not T.ismap(over) then return T.copy(over) end
|
|
228
|
+
|
|
229
|
+
local out = T.map {}
|
|
230
|
+
for k, v in pairs(base) do out[k] = v end
|
|
231
|
+
|
|
232
|
+
for _, k in ipairs(T.keys(over)) do
|
|
233
|
+
local o = over[k]
|
|
234
|
+
local directive = T.getv(T.getv(shape, k) or T.map {}, '$MERGE')
|
|
235
|
+
local b = out[k]
|
|
236
|
+
|
|
237
|
+
if 'replace' == directive then
|
|
238
|
+
out[k] = T.copy(o)
|
|
239
|
+
elseif 'append' == directive then
|
|
240
|
+
local merged = {}
|
|
241
|
+
if T.islist(b) then
|
|
242
|
+
for i = 1, #b do merged[#merged + 1] = b[i] end
|
|
243
|
+
end
|
|
244
|
+
if T.islist(o) then
|
|
245
|
+
for i = 1, #o do merged[#merged + 1] = o[i] end
|
|
246
|
+
else
|
|
247
|
+
merged[#merged + 1] = o
|
|
248
|
+
end
|
|
249
|
+
out[k] = T.list(merged)
|
|
250
|
+
elseif T.has(directive, 'deep') then
|
|
251
|
+
out[k] = deepto(b, o, directive.deep)
|
|
252
|
+
else
|
|
253
|
+
-- Library default: deep for maps, REPLACE for lists. struct.merge is
|
|
254
|
+
-- element-wise by index, which for option maps is nearly always
|
|
255
|
+
-- wrong - ["a"] over ["x","y","z"] yielding ["a","y","z"] is the
|
|
256
|
+
-- defect station hit on secrets.providers.
|
|
257
|
+
if T.ismap(b) and T.ismap(o) then
|
|
258
|
+
out[k] = mergeone(b, o, nil)
|
|
259
|
+
else
|
|
260
|
+
out[k] = T.copy(o)
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
return out
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
-- Merge N levels below this key, replace below that.
|
|
268
|
+
deepto = function(base, over, n)
|
|
269
|
+
if n <= 0 then return T.copy(over) end
|
|
270
|
+
if not T.ismap(base) or not T.ismap(over) then return T.copy(over) end
|
|
271
|
+
local out = T.map {}
|
|
272
|
+
for k, v in pairs(base) do out[k] = v end
|
|
273
|
+
for _, k in ipairs(T.keys(over)) do
|
|
274
|
+
out[k] = deepto(out[k], over[k], n - 1)
|
|
275
|
+
end
|
|
276
|
+
return out
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
function M.resolve_options(input)
|
|
280
|
+
local shape = T.getv(input, 'shape') or T.map {}
|
|
281
|
+
M.check_shape(shape)
|
|
282
|
+
|
|
283
|
+
local ref = R.canon_ref(T.getv(input, 'ref'))
|
|
284
|
+
local name = R.refname(ref)
|
|
285
|
+
local doc = T.getv(input, 'doc') or T.map {}
|
|
286
|
+
local profile = T.getv(input, 'profile')
|
|
287
|
+
|
|
288
|
+
local overlay
|
|
289
|
+
if nil ~= profile then
|
|
290
|
+
overlay = T.getv(T.getv(doc, 'profile') or T.map {}, profile)
|
|
291
|
+
end
|
|
292
|
+
if not T.ismap(overlay) then overlay = T.map {} end
|
|
293
|
+
|
|
294
|
+
-- ONE ordered merge, lowest to highest. Levels 3-6 are not two
|
|
295
|
+
-- namespaces collapsed separately and composed afterwards: that inverts
|
|
296
|
+
-- the rule that PROFILE SPECIFICITY OUTRANKS DEFINITION SPECIFICITY, so
|
|
297
|
+
-- a prod per-definition default would lose to a base instance value.
|
|
298
|
+
local layers = {
|
|
299
|
+
defaultsof(shape), -- 1
|
|
300
|
+
T.getv(input, 'hostdefaults'), -- 2
|
|
301
|
+
optsof(T.getv(doc, 'default'), name), -- 3
|
|
302
|
+
optsof(T.getv(doc, 'instance'), ref), -- 4
|
|
303
|
+
optsof(T.getv(overlay, 'default'), name), -- 5
|
|
304
|
+
optsof(T.getv(overlay, 'instance'), ref), -- 6
|
|
305
|
+
T.getv(input, 'env'), -- 7
|
|
306
|
+
T.getv(input, 'hostoptions'), -- 8
|
|
307
|
+
T.getv(input, 'loadoptions'), -- 9
|
|
308
|
+
T.getv(input, 'patch'), -- 10
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
local out = T.map {}
|
|
312
|
+
-- `ipairs` stops at the first nil, and a missing layer is normal - so
|
|
313
|
+
-- this walks the fixed ten by index.
|
|
314
|
+
for i = 1, 10 do
|
|
315
|
+
if nil ~= layers[i] then
|
|
316
|
+
out = mergeone(out, layers[i], shape)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
return out
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
-- Section 9.4: N is an integer of at least 1, and everything else is an
|
|
323
|
+
-- error.
|
|
324
|
+
--
|
|
325
|
+
-- `{"deep": 0}` is rejected DESPITE having an obvious reading, because
|
|
326
|
+
-- "replace at this key" already has a spelling and two spellings for one
|
|
327
|
+
-- behaviour is the defect class this repo exists to avoid.
|
|
328
|
+
function M.check_shape(shape)
|
|
329
|
+
if not T.ismap(shape) then return end
|
|
330
|
+
|
|
331
|
+
for _, k in ipairs(T.keys(shape)) do
|
|
332
|
+
local v = shape[k]
|
|
333
|
+
if T.has(v, '$MERGE') then
|
|
334
|
+
local directive = v['$MERGE']
|
|
335
|
+
|
|
336
|
+
if 'string' == type(directive) then
|
|
337
|
+
if not M.MERGE_WORDS[directive] then
|
|
338
|
+
T.fail('plugin_shape_invalid',
|
|
339
|
+
'invalid $MERGE directive at ' .. k .. ': ' .. directive,
|
|
340
|
+
T.map { key = k })
|
|
341
|
+
end
|
|
342
|
+
elseif T.has(directive, 'deep') then
|
|
343
|
+
local n = directive.deep
|
|
344
|
+
-- A JSON NUMBER, and an integer of at least 1. `math.type` is the
|
|
345
|
+
-- test: `true` is a boolean and `'2'` a string, and lua would
|
|
346
|
+
-- coerce the string in a comparison.
|
|
347
|
+
if 'integer' ~= math.type(n) or n < 1 then
|
|
348
|
+
T.fail('plugin_shape_invalid',
|
|
349
|
+
'invalid $MERGE deep at ' .. k .. ': ' .. T.encode(n),
|
|
350
|
+
T.map { key = k })
|
|
351
|
+
end
|
|
352
|
+
else
|
|
353
|
+
T.fail('plugin_shape_invalid',
|
|
354
|
+
'invalid $MERGE directive at ' .. k .. ': ' .. T.encode(directive),
|
|
355
|
+
T.map { key = k })
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
return M
|