@voxgig/sdkgen 4.8.1 → 4.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/voxgig-sdkgen +1 -1
- package/dist/action/doctor.d.ts +1 -0
- package/dist/action/doctor.js +50 -2
- package/dist/action/doctor.js.map +1 -1
- package/dist/helpers/naming.js +4 -2
- package/dist/helpers/naming.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/model/sdkgen.aon +21 -0
- package/package.json +2 -2
- package/project/.sdk/model/feature/secrets.aon +120 -18
- package/project/.sdk/model/target/c.aon +10 -0
- package/project/.sdk/model/target/clojure.aon +13 -0
- package/project/.sdk/model/target/cpp.aon +10 -0
- package/project/.sdk/model/target/csharp.aon +9 -0
- package/project/.sdk/model/target/dart.aon +10 -0
- package/project/.sdk/model/target/elixir.aon +9 -0
- package/project/.sdk/model/target/go.aon +13 -0
- package/project/.sdk/model/target/java.aon +9 -0
- package/project/.sdk/model/target/js.aon +7 -0
- package/project/.sdk/model/target/kotlin.aon +9 -0
- package/project/.sdk/model/target/lean.aon +17 -0
- package/project/.sdk/model/target/lua.aon +8 -0
- package/project/.sdk/model/target/ocaml.aon +9 -0
- package/project/.sdk/model/target/perl.aon +8 -0
- package/project/.sdk/model/target/php.aon +8 -0
- package/project/.sdk/model/target/py.aon +13 -0
- package/project/.sdk/model/target/rb.aon +8 -0
- package/project/.sdk/model/target/rust.aon +10 -0
- package/project/.sdk/model/target/scala.aon +21 -2
- package/project/.sdk/model/target/swift.aon +18 -0
- package/project/.sdk/model/target/ts.aon +13 -0
- package/project/.sdk/src/cmp/clojure/Package_clojure.ts +9 -2
- package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +3 -0
- package/project/.sdk/src/cmp/dart/Test_dart.ts +2 -0
- package/project/.sdk/src/cmp/elixir/Package_elixir.ts +4 -1
- package/project/.sdk/src/cmp/go/Config_go.ts +59 -2
- package/project/.sdk/src/cmp/go/Main_go.ts +8 -2
- package/project/.sdk/src/cmp/java/Test_java.ts +6 -5
- package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +6 -5
- package/project/.sdk/src/cmp/lean/Package_lean.ts +23 -0
- package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +1 -0
- package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +1 -0
- package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +7 -3
- package/project/.sdk/src/cmp/py/Config_py.ts +82 -1
- package/project/.sdk/src/cmp/py/Main_py.ts +44 -0
- package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +2 -0
- package/project/.sdk/src/cmp/swift/Main_swift.ts +10 -0
- package/project/.sdk/src/cmp/swift/Package_swift.ts +13 -1
- package/project/.sdk/src/cmp/ts/Config_ts.ts +42 -17
- package/project/.sdk/src/cmp/ts/fragment/Config.data.fragment.ts +13 -1
- package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +13 -1
- package/project/.sdk/tm/c/Makefile +38 -3
- package/project/.sdk/tm/c/tests/omni_resolver.h +361 -0
- package/project/.sdk/tm/c/tests/omni_smoke_test.c +237 -0
- package/project/.sdk/tm/c/tests/primary_corpus_test.c +205 -284
- package/project/.sdk/tm/c/tests/struct_corpus_test.c +292 -212
- package/project/.sdk/tm/c/tests/vendor/omni/json.c +811 -0
- package/project/.sdk/tm/c/tests/vendor/omni/omni.h +240 -0
- package/project/.sdk/tm/c/tests/vendor/omni/runner.c +940 -0
- package/project/.sdk/tm/c/tests/vendor/omni/util.c +351 -0
- package/project/.sdk/tm/c/utility/struct/utility.c +7 -2
- package/project/.sdk/tm/clojure/test/sdk/test/omni.clj +401 -0
- package/project/.sdk/tm/clojure/test/sdk/test/omni_smoke.clj +81 -0
- package/project/.sdk/tm/clojure/test/sdk/test/primary.clj +92 -58
- package/project/.sdk/tm/clojure/test/sdk/test/struct_corpus.clj +122 -149
- package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +8 -3
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +145 -0
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +445 -0
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +145 -0
- package/project/.sdk/tm/cpp/Makefile +5 -1
- package/project/.sdk/tm/cpp/test/omni_resolver.hpp +473 -0
- package/project/.sdk/tm/cpp/test/omni_smoke_test.cpp +209 -0
- package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +243 -184
- package/project/.sdk/tm/cpp/test/runner_support.hpp +68 -181
- package/project/.sdk/tm/cpp/test/struct_corpus_test.cpp +183 -56
- package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +406 -0
- package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +751 -0
- package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +256 -0
- package/project/.sdk/tm/cpp/utility/pipeline.hpp +7 -1
- package/project/.sdk/tm/csharp/test/OmniResolver.cs +491 -0
- package/project/.sdk/tm/csharp/test/OmniSmokeTest.cs +106 -0
- package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +299 -316
- package/project/.sdk/tm/csharp/test/Runner.cs +104 -269
- package/project/.sdk/tm/csharp/test/StructUtilityTest.cs +535 -724
- package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +864 -0
- package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +347 -0
- package/project/.sdk/tm/csharp/utility/MakeSpec.cs +3 -1
- package/project/.sdk/tm/csharp/utility/PrepareMethod.cs +6 -1
- package/project/.sdk/tm/csharp/utility/struct/Struct.cs +21 -5
- package/project/.sdk/tm/dart/test/omni.dart +520 -0
- package/project/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
- package/project/.sdk/tm/dart/test/primary_test.dart +86 -28
- package/project/.sdk/tm/dart/test/struct_test.dart +438 -11
- package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
- package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
- package/project/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
- package/project/.sdk/tm/elixir/Makefile +11 -3
- package/project/.sdk/tm/elixir/test/omni_smoke_test.exs +117 -0
- package/project/.sdk/tm/elixir/test/primary_utility_test.exs +341 -16
- package/project/.sdk/tm/elixir/test/struct_corpus_test.exs +554 -9
- package/project/.sdk/tm/elixir/test/support/omni.ex +377 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +122 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +623 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +187 -0
- package/project/.sdk/tm/go/core/context.go +32 -16
- package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +261 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +78 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/config.go +652 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +250 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/env.go +194 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/export.go +80 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +238 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1575 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/order.go +248 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/point.go +184 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +123 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +79 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/types.go +296 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/util.go +87 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/version.go +161 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +292 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +201 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +187 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +184 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +114 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +156 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +209 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +241 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +151 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +152 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +143 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +120 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +439 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +685 -0
- package/project/.sdk/tm/go/feature/secrets_feature.go +675 -0
- package/project/.sdk/tm/go/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +799 -0
- package/project/.sdk/tm/go/test/omni/omni.go +897 -0
- package/project/.sdk/tm/go/test/omni/util.go +360 -0
- package/project/.sdk/tm/go/test/omniresolver_test.go +748 -0
- package/project/.sdk/tm/go/test/omnismoke_test.go +112 -0
- package/project/.sdk/tm/go/test/primary_utility_test.go +123 -191
- package/project/.sdk/tm/go/test/struct_utility_test.go +323 -16
- package/project/.sdk/tm/go/test/testsupport_test.go +294 -0
- package/project/.sdk/tm/go/utility/make_options.go +8 -1
- package/project/.sdk/tm/go/utility/prepare_method.go +5 -1
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +2 -2
- package/project/.sdk/tm/java/test/OmniResolver.java +355 -0
- package/project/.sdk/tm/java/test/OmniSmokeTest.java +99 -0
- package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +254 -280
- package/project/.sdk/tm/java/test/RunnerSupport.java +9 -194
- package/project/.sdk/tm/java/test/StructCorpusTest.java +119 -42
- package/project/.sdk/tm/java/test/vendor/omni/Json.java +287 -0
- package/project/.sdk/tm/java/test/vendor/omni/Runner.java +851 -0
- package/project/.sdk/tm/java/test/vendor/omni/Util.java +322 -0
- package/project/.sdk/tm/java/utility/MakeSpec.java +3 -1
- package/project/.sdk/tm/java/utility/PrepareMethod.java +5 -5
- package/project/.sdk/tm/java/utility/struct/Struct.java +17 -4
- package/project/.sdk/tm/js/src/utility/StructUtility.js +3 -3
- package/project/.sdk/tm/js/test/omni.js +251 -0
- package/project/.sdk/tm/js/test/omni.test.js +105 -0
- package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +6 -2
- package/project/.sdk/tm/js/test/utility/StructUtility.test.js +27 -2
- package/project/.sdk/tm/js/test/vendor/omni/index.js +77 -0
- package/project/.sdk/tm/js/test/vendor/omni/runner.js +613 -0
- package/project/.sdk/tm/js/test/vendor/omni/util.js +212 -0
- package/project/.sdk/tm/kotlin/core/Utility.kt +1 -1
- package/project/.sdk/tm/kotlin/test/OmniResolver.kt +343 -0
- package/project/.sdk/tm/kotlin/test/OmniSmokeTest.kt +100 -0
- package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +244 -262
- package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +9 -178
- package/project/.sdk/tm/kotlin/test/StructCorpusTest.kt +121 -32
- package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +264 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +615 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +139 -0
- package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -3
- package/project/.sdk/tm/kotlin/utility/Prepare.kt +6 -6
- package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +18 -2
- package/project/.sdk/tm/lean/Makefile +12 -5
- package/project/.sdk/tm/lean/src/SdkUtility.lean +14 -1
- package/project/.sdk/tm/lean/test/OmniResolver.lean +358 -0
- package/project/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
- package/project/.sdk/tm/lean/test/StructCorpus.lean +245 -574
- package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +155 -291
- package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
- package/project/.sdk/tm/lua/test/omni.lua +456 -0
- package/project/.sdk/tm/lua/test/omni_smoke_test.lua +103 -0
- package/project/.sdk/tm/lua/test/primary_utility_test.lua +250 -509
- package/project/.sdk/tm/lua/test/struct_utility_test.lua +161 -70
- package/project/.sdk/tm/lua/test/vendor/omni/json.lua +268 -0
- package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +385 -0
- package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +641 -0
- package/project/.sdk/tm/lua/test/vendor/omni/util.lua +282 -0
- package/project/.sdk/tm/lua/utility/prepare_method.lua +5 -1
- package/project/.sdk/tm/lua/utility/struct/regex.lua +663 -0
- package/project/.sdk/tm/lua/utility/struct/struct.lua +660 -420
- package/project/.sdk/tm/ocaml/Makefile +37 -12
- package/project/.sdk/tm/ocaml/test/omni_resolver.ml +284 -0
- package/project/.sdk/tm/ocaml/test/omni_smoke_test.ml +169 -0
- package/project/.sdk/tm/ocaml/test/primary_utility_test.ml +84 -100
- package/project/.sdk/tm/ocaml/test/struct_corpus.ml +225 -201
- package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1157 -0
- package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +88 -12
- package/project/.sdk/tm/perl/t/omni.pm +647 -0
- package/project/.sdk/tm/perl/t/omni_smoke.t +87 -0
- package/project/.sdk/tm/perl/t/primary_utility.t +189 -487
- package/project/.sdk/tm/perl/t/struct_utility.t +455 -389
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +649 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +253 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +24 -0
- package/project/.sdk/tm/perl/utility/prepare_method.pm +7 -2
- package/project/.sdk/tm/php/test/Omni.php +691 -0
- package/project/.sdk/tm/php/test/OmniSmokeTest.php +93 -0
- package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +210 -571
- package/project/.sdk/tm/php/test/StructUtilityTest.php +320 -342
- package/project/.sdk/tm/php/test/vendor/omni/Runner.php +644 -0
- package/project/.sdk/tm/php/test/vendor/omni/Util.php +283 -0
- package/project/.sdk/tm/php/utility/MakeSpec.php +10 -3
- package/project/.sdk/tm/php/utility/PrepareBody.php +7 -1
- package/project/.sdk/tm/php/utility/PrepareMethod.php +6 -2
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +36 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +141 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +50 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +333 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +198 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +147 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +52 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +139 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1053 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +171 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +95 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +116 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +59 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +87 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +112 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +74 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +116 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +192 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +120 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +140 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +62 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +101 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +152 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +115 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +92 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +101 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +119 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +125 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +211 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +455 -0
- package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +467 -0
- package/project/.sdk/tm/py/pkg/utility/prepare_method.py +5 -1
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/__init__.py +0 -2
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +780 -529
- package/project/.sdk/tm/py/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/py/test/feature/__init__.py +0 -0
- package/project/.sdk/tm/py/test/feature/secrets/__init__.py +0 -0
- package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +337 -0
- package/project/.sdk/tm/py/test/omni.py +415 -0
- package/project/.sdk/tm/py/test/test_omni_smoke.py +74 -0
- package/project/.sdk/tm/py/test/test_primary_utility.py +144 -668
- package/project/.sdk/tm/py/test/test_struct_utility.py +74 -27
- package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +62 -0
- package/project/.sdk/tm/py/test/voxgig_omni/runner.py +566 -0
- package/project/.sdk/tm/py/test/voxgig_omni/util.py +237 -0
- package/project/.sdk/tm/rb/test/omni.rb +505 -0
- package/project/.sdk/tm/rb/test/omni_smoke_test.rb +72 -0
- package/project/.sdk/tm/rb/test/primary_utility_test.rb +174 -560
- package/project/.sdk/tm/rb/test/struct_utility_test.rb +13 -7
- package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +493 -0
- package/project/.sdk/tm/rb/test/vendor/omni/util.rb +199 -0
- package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +15 -0
- package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -1
- package/project/.sdk/tm/rust/tests/common/mod.rs +19 -242
- package/project/.sdk/tm/rust/tests/omni_resolver/mod.rs +888 -0
- package/project/.sdk/tm/rust/tests/omni_smoke_test.rs +286 -0
- package/project/.sdk/tm/rust/tests/primary_utility_test.rs +318 -312
- package/project/.sdk/tm/rust/tests/struct_utility_test.rs +66 -28
- package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +412 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +38 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +392 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1001 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +161 -0
- package/project/.sdk/tm/rust/utility/prepare_method.rs +5 -1
- package/project/.sdk/tm/scala/Makefile +16 -6
- package/project/.sdk/tm/scala/sdktest/OmniResolver.scala +497 -0
- package/project/.sdk/tm/scala/sdktest/OmniSmoke.scala +192 -0
- package/project/.sdk/tm/scala/sdktest/PrimaryCorpus.scala +47 -19
- package/project/.sdk/tm/scala/sdktest/StructCorpus.scala +0 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +229 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +552 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +104 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Constants.swift +10 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Inject.swift +28 -5
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Injection.swift +5 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Minor.swift +4 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Validate.swift +15 -5
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +6 -1
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift +474 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniSmokeTest.swift +107 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +141 -178
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/Runner.swift +17 -113
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/StructUtilityTest.swift +295 -446
- package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +364 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +730 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +162 -0
- package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +7 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +148 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +55 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +344 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +205 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +138 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +46 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +349 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +181 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1132 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +177 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +119 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +102 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +61 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +112 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +100 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +37 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +163 -30
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +27 -22
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/aws.ts +26 -36
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/azuresecrets.ts +19 -21
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/boru.ts +36 -17
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/doppler.ts +14 -21
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/gcpsecrets.ts +27 -27
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/hashicorp.ts +25 -39
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +99 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/infisical.ts +14 -16
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/onepassword.ts +15 -22
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +98 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{Sigv4.ts → plugins/sigv4.ts} +7 -6
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +97 -23
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +37 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +4 -17
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +4 -16
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +11 -25
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +6 -23
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +106 -39
- package/project/.sdk/tm/ts/src/utility/StructUtility.ts +3 -3
- package/project/.sdk/tm/ts/test/omni.ts +104 -32
- package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +27 -0
- package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +32 -5
- package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +2 -2
- package/project/.sdk/tm/ts/test/vendor/omni/index.ts +2 -2
- package/project/.sdk/tm/zig/test/primary_utility_test.zig +1 -1
- package/project/.sdk/tm/zig/test/struct_runner.zig +5 -4
- package/project/sdkgen-package.json +1 -1
- package/src/action/doctor.ts +66 -2
- package/src/helpers/naming.ts +4 -2
- package/project/.sdk/tm/c/tests/runner.h +0 -274
- package/project/.sdk/tm/cpp/test/struct_runner.hpp +0 -314
- package/project/.sdk/tm/csharp/test/StructRunner.cs +0 -276
- package/project/.sdk/tm/dart/test/runner.dart +0 -406
- package/project/.sdk/tm/dart/test/struct_corpus.dart +0 -531
- package/project/.sdk/tm/elixir/test/support/struct_corpus.ex +0 -1088
- package/project/.sdk/tm/go/test/runner_test.go +0 -629
- package/project/.sdk/tm/go/test/struct_runner_test.go +0 -1094
- package/project/.sdk/tm/java/test/StructRunner.java +0 -281
- package/project/.sdk/tm/js/test/runner.js +0 -387
- package/project/.sdk/tm/kotlin/test/StructRunner.kt +0 -177
- package/project/.sdk/tm/lua/test/struct_runner.lua +0 -602
- package/project/.sdk/tm/ocaml/test/corpus_runner.ml +0 -185
- package/project/.sdk/tm/perl/t/struct_runner.pm +0 -275
- package/project/.sdk/tm/php/test/StructRunner.php +0 -275
- package/project/.sdk/tm/py/test/struct_runner.py +0 -411
- package/project/.sdk/tm/rb/test/struct_runner.rb +0 -309
- package/project/.sdk/tm/rust/tests/struct_runner/mod.rs +0 -424
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +0 -90
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +0 -66
- package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +0 -188
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin 0.1.6 (go/plugin/depend.go)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 8d8968afc0a2008fbd795b41ab166307d989f02a [tag: sdk-20260904-1610-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* Dependency cardinality, policy, and the restart graph (§11.3).
|
|
5
|
+
*
|
|
6
|
+
* TWO AXES, BOTH DECLARED BY THE DEFINITION THAT HAS THE REQUIREMENT,
|
|
7
|
+
* because only it knows what it can cope with:
|
|
8
|
+
*
|
|
9
|
+
* | static (default) | dynamic
|
|
10
|
+
* -------------|---------------------------|--------------------------
|
|
11
|
+
* mandatory | unmet -> pending; | unmet -> pending;
|
|
12
|
+
* (default) | lost -> pending, | lost -> STAYS LIVE,
|
|
13
|
+
* | recursively | notified
|
|
14
|
+
* -------------|---------------------------|--------------------------
|
|
15
|
+
* optional:true| never gates activation; | never gates activation;
|
|
16
|
+
* | a change deactivates and | a change is a
|
|
17
|
+
* | reactivates | notification, nothing else
|
|
18
|
+
*
|
|
19
|
+
* `dynamic` means the plugin has said, IN WRITING, that it can survive
|
|
20
|
+
* its provider being swapped underneath it. It is not the default
|
|
21
|
+
* because most plugins cannot, and the cost of wrongly assuming they can
|
|
22
|
+
* is a live instance holding a dead reference.
|
|
23
|
+
*
|
|
24
|
+
* The rebinding-preference axis is deliberately omitted. OSGi has
|
|
25
|
+
* reluctant vs greedy and it is a knob every author must understand to
|
|
26
|
+
* read anyone else's component; we take always-reluctant. Three axes
|
|
27
|
+
* were more than the model can carry across twenty ports. */
|
|
28
|
+
|
|
29
|
+
package plugin
|
|
30
|
+
|
|
31
|
+
import "sort"
|
|
32
|
+
|
|
33
|
+
// NormRequire: a bare string is shorthand for `{name}`.
|
|
34
|
+
func NormRequire(r any) Required {
|
|
35
|
+
if s, ok := r.(string); ok {
|
|
36
|
+
return Required{Name: s}
|
|
37
|
+
}
|
|
38
|
+
m := asmap(r)
|
|
39
|
+
out := Required{
|
|
40
|
+
Name: asstring(m["name"], ""),
|
|
41
|
+
Range: asstring(m["range"], ""),
|
|
42
|
+
Policy: asstring(m["policy"], ""),
|
|
43
|
+
}
|
|
44
|
+
if v, ok := m["match"].(map[string]any); ok {
|
|
45
|
+
out.Match = v
|
|
46
|
+
}
|
|
47
|
+
out.Optional = asbool(m["optional"], false)
|
|
48
|
+
return out
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* Requirements are the requirements a definition declared, normalized.
|
|
52
|
+
*
|
|
53
|
+
* BOTH AXES ARE READ AT TWO LEVELS, AND THE PER-REQUIREMENT ONE WINS.
|
|
54
|
+
*
|
|
55
|
+
* The instance-level `policy` and `optional` list are how a DOCUMENT
|
|
56
|
+
* states the axis without editing the definition, and they apply to
|
|
57
|
+
* every requirement. The per-requirement form is the one §11.1's object
|
|
58
|
+
* syntax exists for, and it is strictly more expressive: an instance
|
|
59
|
+
* that is `static` on its store and `dynamic` on its metrics cannot be
|
|
60
|
+
* written at all at the instance level, and that is the ordinary case
|
|
61
|
+
* rather than an exotic one.
|
|
62
|
+
*
|
|
63
|
+
* `optional` unions rather than overriding — both spellings are
|
|
64
|
+
* statements that this requirement need not gate activation, and there
|
|
65
|
+
* is no reading under which one of them means "actually, mandatory". */
|
|
66
|
+
func Requirements(options map[string]any) []Required {
|
|
67
|
+
raw, _ := aslist(options["requires"])
|
|
68
|
+
markedraw, _ := aslist(options["optional"])
|
|
69
|
+
marked := []string{}
|
|
70
|
+
for _, m := range markedraw {
|
|
71
|
+
marked = append(marked, asstring(m, ""))
|
|
72
|
+
}
|
|
73
|
+
fallback := asstring(options["policy"], "")
|
|
74
|
+
|
|
75
|
+
out := []Required{}
|
|
76
|
+
for _, r := range raw {
|
|
77
|
+
req := NormRequire(r)
|
|
78
|
+
if req.Optional || hasstring(marked, req.Name) {
|
|
79
|
+
req.Optional = true
|
|
80
|
+
}
|
|
81
|
+
if "" == req.Policy && "" != fallback {
|
|
82
|
+
req.Policy = fallback
|
|
83
|
+
}
|
|
84
|
+
out = append(out, req)
|
|
85
|
+
}
|
|
86
|
+
return out
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// RestartsOnLoss: does losing this requirement's SELECTED provider
|
|
90
|
+
// restart the consumer? The mandatory ones under `static`, and the
|
|
91
|
+
// `static` optional ones — both make a capability change deactivate and
|
|
92
|
+
// reactivate. `dynamic` never restarts: mandatory-dynamic stays live and
|
|
93
|
+
// is notified, optional-dynamic is a notification and nothing else.
|
|
94
|
+
func RestartsOnLoss(r Required) bool {
|
|
95
|
+
policy := r.Policy
|
|
96
|
+
if "" == policy {
|
|
97
|
+
policy = "static"
|
|
98
|
+
}
|
|
99
|
+
return "dynamic" != policy
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// GatesActivation: does an unmet requirement keep the consumer out of
|
|
103
|
+
// `live`?
|
|
104
|
+
//
|
|
105
|
+
// Cardinality alone decides this, NOT policy. `dynamic` is a statement
|
|
106
|
+
// about surviving a SWAP, not about starting without the thing at all —
|
|
107
|
+
// a mandatory-dynamic consumer still waits in `pending` for its first
|
|
108
|
+
// provider. Conflating the two would let a plugin that declared it can
|
|
109
|
+
// cope with replacement activate with nothing to call.
|
|
110
|
+
func GatesActivation(r Required) bool {
|
|
111
|
+
return !r.Optional
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* RestartCausing marks the edges that can cause a restart, which is
|
|
115
|
+
* exactly the set a cycle must be detected over (§11.3).
|
|
116
|
+
*
|
|
117
|
+
* Those are the mandatory requirements AND THE `static` OPTIONAL ONES,
|
|
118
|
+
* because both make a capability change deactivate and reactivate the
|
|
119
|
+
* consumer — and a cycle of restarts does not settle: A comes up, B
|
|
120
|
+
* restarts, which changes B's capability, which restarts A,
|
|
121
|
+
* indefinitely.
|
|
122
|
+
*
|
|
123
|
+
* ONLY `dynamic` OPTIONAL EDGES ARE EXCLUDED, and they are the ones the
|
|
124
|
+
* exclusion was for: two plugins that optionally and dynamically consume
|
|
125
|
+
* each other's capabilities both activate happily, neither gates on the
|
|
126
|
+
* other, and each is merely notified when the other appears. Nothing
|
|
127
|
+
* restarts, so nothing oscillates.
|
|
128
|
+
*
|
|
129
|
+
* An earlier draft of §11.3 excluded EVERY optional edge and thereby
|
|
130
|
+
* admitted the non-terminating case it was trying to permit. */
|
|
131
|
+
func RestartCausing(r Required) bool {
|
|
132
|
+
return GatesActivation(r) || RestartsOnLoss(r)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// DependNode is the requirement graph as plain data, for the pure
|
|
136
|
+
// detector.
|
|
137
|
+
type DependNode struct {
|
|
138
|
+
Ref string
|
|
139
|
+
Provides []string
|
|
140
|
+
Requires []Required
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* DependencyCycle: a cycle through restart-causing requirements is
|
|
144
|
+
* `plugin_dependency_cycle`, detected AT LOAD — before anything runs,
|
|
145
|
+
* because the failure it describes is a non-terminating reconcile and
|
|
146
|
+
* the only safe time to report that is before it starts.
|
|
147
|
+
*
|
|
148
|
+
* The graph is over capabilities, not refs: an edge runs from a consumer
|
|
149
|
+
* to EVERY node that provides what it needs, because any of them could
|
|
150
|
+
* be the one selected and a cycle through any is a cycle. A node also
|
|
151
|
+
* satisfies its own name as a ref (§11.1), which is why the ref is a
|
|
152
|
+
* provider of itself here. */
|
|
153
|
+
func DependencyCycle(nodes []DependNode) []string {
|
|
154
|
+
// TWO INDEXES, NOT ONE MERGED MAP. Capability names and refs are
|
|
155
|
+
// matched differently — a capability by its exact name, a ref through
|
|
156
|
+
// the canonical spelling (§4 rule 5) — and one map keyed by both can
|
|
157
|
+
// only do one of them. Keyed by both and looked up raw, as this was,
|
|
158
|
+
// a cycle spelled `a$`/`b$` found no providers and EVADED the
|
|
159
|
+
// load-time check that exists to catch a non-terminating reconcile.
|
|
160
|
+
bycap := map[string][]string{}
|
|
161
|
+
isref := map[string]bool{}
|
|
162
|
+
for _, n := range nodes {
|
|
163
|
+
isref[n.Ref] = true
|
|
164
|
+
for _, cap := range n.Provides {
|
|
165
|
+
bycap[cap] = append(bycap[cap], n.Ref)
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
edges := map[string][]string{}
|
|
170
|
+
for _, n := range nodes {
|
|
171
|
+
out := []string{}
|
|
172
|
+
for _, r := range n.Requires {
|
|
173
|
+
if !RestartCausing(r) {
|
|
174
|
+
continue
|
|
175
|
+
}
|
|
176
|
+
from := append([]string{}, bycap[r.Name]...)
|
|
177
|
+
// A node satisfies its own name AS A REF (§11.1),
|
|
178
|
+
// canonically — exactly what `providersof` does at runtime,
|
|
179
|
+
// so the load-time graph and the running one agree about
|
|
180
|
+
// what an edge is. `canon` hands back a name no ref could
|
|
181
|
+
// have unchanged, and no instance ref can equal one, so it
|
|
182
|
+
// is the tolerant test this needs.
|
|
183
|
+
if asref := canon(r.Name); isref[asref] && !hasstring(from, asref) {
|
|
184
|
+
from = append(from, asref)
|
|
185
|
+
}
|
|
186
|
+
for _, p := range from {
|
|
187
|
+
if p != n.Ref && !hasstring(out, p) {
|
|
188
|
+
out = append(out, p)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
sort.Strings(out)
|
|
193
|
+
edges[n.Ref] = out
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Iterative DFS with an explicit stack: twenty ports, and several of
|
|
197
|
+
// them have no recursion budget worth relying on.
|
|
198
|
+
const white, grey, black = 0, 1, 2
|
|
199
|
+
colour := map[string]int{}
|
|
200
|
+
for _, n := range nodes {
|
|
201
|
+
colour[n.Ref] = white
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
for _, start := range sortedkeys(edges) {
|
|
205
|
+
if white != colour[start] {
|
|
206
|
+
continue
|
|
207
|
+
}
|
|
208
|
+
path := []string{start}
|
|
209
|
+
type frame struct {
|
|
210
|
+
ref string
|
|
211
|
+
i int
|
|
212
|
+
}
|
|
213
|
+
stack := []frame{{ref: start, i: 0}}
|
|
214
|
+
colour[start] = grey
|
|
215
|
+
|
|
216
|
+
for 0 < len(stack) {
|
|
217
|
+
top := &stack[len(stack)-1]
|
|
218
|
+
if top.i >= len(edges[top.ref]) {
|
|
219
|
+
colour[top.ref] = black
|
|
220
|
+
stack = stack[:len(stack)-1]
|
|
221
|
+
path = path[:len(path)-1]
|
|
222
|
+
continue
|
|
223
|
+
}
|
|
224
|
+
next := edges[top.ref][top.i]
|
|
225
|
+
top.i++
|
|
226
|
+
if grey == colour[next] {
|
|
227
|
+
// Report the cycle itself, not the walk that found it.
|
|
228
|
+
return append(append([]string{}, path[indexof(path, next):]...), next)
|
|
229
|
+
}
|
|
230
|
+
if black == colour[next] {
|
|
231
|
+
continue
|
|
232
|
+
}
|
|
233
|
+
colour[next] = grey
|
|
234
|
+
path = append(path, next)
|
|
235
|
+
stack = append(stack, frame{ref: next, i: 0})
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return nil
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// CheckCycle raises on a cycle, naming it. Separate from the detector so
|
|
242
|
+
// the detector stays pure and corpus-testable.
|
|
243
|
+
func CheckCycle(nodes []DependNode) error {
|
|
244
|
+
if cycle := DependencyCycle(nodes); nil != cycle {
|
|
245
|
+
return Fail("plugin_dependency_cycle",
|
|
246
|
+
"requirements cycle: "+join(cycle, " -> "),
|
|
247
|
+
map[string]any{"cycle": cycle})
|
|
248
|
+
}
|
|
249
|
+
return nil
|
|
250
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin 0.1.6 (go/plugin/env.go)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 8d8968afc0a2008fbd795b41ab166307d989f02a [tag: sdk-20260904-1610-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* Environment overrides (§9.5) — level 7 of the ladder.
|
|
5
|
+
*
|
|
6
|
+
* One prefix, so nothing drifts: `VOXGIG_PLUGIN_*`.
|
|
7
|
+
*
|
|
8
|
+
* VOXGIG_PLUGIN_PROFILE the profile name
|
|
9
|
+
* VOXGIG_PLUGIN_<REF>_<PATH> one option
|
|
10
|
+
* VOXGIG_PLUGIN_ACTIVE/INACTIVE comma-separated refs, INACTIVE wins
|
|
11
|
+
*
|
|
12
|
+
* THE ENCODING IS LOSSY, AND THIS SAYS SO RATHER THAN PRETENDING
|
|
13
|
+
* OTHERWISE. Ref and path are upper-snake with `$` -> `__` and `.` ->
|
|
14
|
+
* `_`. But `_` is legal in a name and in a tag, and the mapping folds
|
|
15
|
+
* case, so `retry$fast` and `retry__fast` both encode to `RETRY__FAST`,
|
|
16
|
+
* as do `Retry$fast` and `retry$Fast`.
|
|
17
|
+
*
|
|
18
|
+
* Rather than restrict a grammar the rest of the stack already uses, the
|
|
19
|
+
* host DETECTS THE COLLISION: it encodes every ref it holds, and a key
|
|
20
|
+
* two refs claim is `plugin_env_ambiguous`, naming both. The affected
|
|
21
|
+
* pair stays configurable by document and by API, just not by
|
|
22
|
+
* environment — which is the honest trade.
|
|
23
|
+
*
|
|
24
|
+
* Pure: a function over a string map and a ref set. The corpus tests it
|
|
25
|
+
* without touching a real environment. */
|
|
26
|
+
|
|
27
|
+
package plugin
|
|
28
|
+
|
|
29
|
+
import (
|
|
30
|
+
"encoding/json"
|
|
31
|
+
"sort"
|
|
32
|
+
"strings"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
const envPrefix = "VOXGIG_PLUGIN_"
|
|
36
|
+
|
|
37
|
+
type EnvResult struct {
|
|
38
|
+
Profile string `json:"profile,omitempty"`
|
|
39
|
+
Options map[string]any `json:"options"`
|
|
40
|
+
Active []string `json:"active"`
|
|
41
|
+
Inactive []string `json:"inactive"`
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type EnvInput struct {
|
|
45
|
+
Env map[string]string `json:"env"`
|
|
46
|
+
// Refs is every ref the host holds. Needed because the encoding is
|
|
47
|
+
// lossy: without the set there is no way to know where the ref ends
|
|
48
|
+
// and the path begins in `RETRY__FAST_MIN_DELAY`.
|
|
49
|
+
Refs []string `json:"refs,omitempty"`
|
|
50
|
+
Reserved []string `json:"reserved,omitempty"`
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// EncodeRef: `retry$fast` -> `RETRY__FAST`.
|
|
54
|
+
func EncodeRef(ref string) string {
|
|
55
|
+
s := strings.ReplaceAll(ref, "$", "__")
|
|
56
|
+
s = strings.ReplaceAll(s, ".", "_")
|
|
57
|
+
return strings.ToUpper(s)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
func ApplyEnv(input EnvInput) (EnvResult, error) {
|
|
61
|
+
out := EnvResult{Options: map[string]any{}, Active: []string{}, Inactive: []string{}}
|
|
62
|
+
|
|
63
|
+
refs := []string{}
|
|
64
|
+
for _, r := range input.Refs {
|
|
65
|
+
c, err := CanonRef(r)
|
|
66
|
+
if nil != err {
|
|
67
|
+
return out, err
|
|
68
|
+
}
|
|
69
|
+
refs = append(refs, c)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Encode every ref the host holds, and refuse a key that two of them
|
|
73
|
+
// claim. Done up front so the collision is reported even when no
|
|
74
|
+
// environment variable exercises it — a latent ambiguity is still an
|
|
75
|
+
// ambiguity, and finding it at deploy time is the failure this
|
|
76
|
+
// exists to prevent.
|
|
77
|
+
byencoded := map[string][]string{}
|
|
78
|
+
for _, r := range refs {
|
|
79
|
+
e := EncodeRef(r)
|
|
80
|
+
byencoded[e] = append(byencoded[e], r)
|
|
81
|
+
}
|
|
82
|
+
for _, e := range sortedkeys(byencoded) {
|
|
83
|
+
if 1 < len(byencoded[e]) {
|
|
84
|
+
pair := append([]string{}, byencoded[e]...)
|
|
85
|
+
sort.Strings(pair)
|
|
86
|
+
return out, Fail("plugin_env_ambiguous",
|
|
87
|
+
"refs collide in the environment encoding as "+e+": "+strings.Join(pair, ", "),
|
|
88
|
+
map[string]any{"encoded": e, "refs": pair})
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Longest encoded ref first, so `retry$fast` wins over `retry` on
|
|
93
|
+
// `RETRY__FAST_MIN`. Shortest-first would read the tag as a path.
|
|
94
|
+
// Equal lengths break bytewise: the canonical leans on JavaScript's
|
|
95
|
+
// stable sort over insertion order, which a Go map cannot reproduce
|
|
96
|
+
// and which no entry can distinguish anyway.
|
|
97
|
+
encoded := sortedkeys(byencoded)
|
|
98
|
+
sort.SliceStable(encoded, func(i, j int) bool {
|
|
99
|
+
return len(encoded[i]) > len(encoded[j])
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
for _, key := range sortedkeys(input.Env) {
|
|
103
|
+
if !strings.HasPrefix(key, envPrefix) {
|
|
104
|
+
continue
|
|
105
|
+
}
|
|
106
|
+
rest := key[len(envPrefix):]
|
|
107
|
+
|
|
108
|
+
if "PROFILE" == rest {
|
|
109
|
+
out.Profile = input.Env[key]
|
|
110
|
+
continue
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if "ACTIVE" == rest || "INACTIVE" == rest {
|
|
114
|
+
for _, r := range splitlist(input.Env[key]) {
|
|
115
|
+
c, err := CanonRef(r)
|
|
116
|
+
if nil != err {
|
|
117
|
+
return out, err
|
|
118
|
+
}
|
|
119
|
+
// The reservation covers EVERY input layer (§9.1).
|
|
120
|
+
// VOXGIG_PLUGIN_INACTIVE=station is easier to set than
|
|
121
|
+
// editing a config file, and INACTIVE has the final
|
|
122
|
+
// word — so guarding documents alone would leave the one
|
|
123
|
+
// lever this mechanism exists to deny wide open.
|
|
124
|
+
if err := checkreservedref(c, input.Reserved); nil != err {
|
|
125
|
+
return out, err
|
|
126
|
+
}
|
|
127
|
+
if "ACTIVE" == rest {
|
|
128
|
+
out.Active = append(out.Active, c)
|
|
129
|
+
} else {
|
|
130
|
+
out.Inactive = append(out.Inactive, c)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
continue
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
enc := ""
|
|
137
|
+
for _, e := range encoded {
|
|
138
|
+
if rest == e || strings.HasPrefix(rest, e+"_") {
|
|
139
|
+
enc = e
|
|
140
|
+
break
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if "" == enc {
|
|
144
|
+
continue // not for any ref this host holds
|
|
145
|
+
}
|
|
146
|
+
ref := byencoded[enc][0]
|
|
147
|
+
if err := checkreservedref(ref, input.Reserved); nil != err {
|
|
148
|
+
return out, err
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if rest == enc {
|
|
152
|
+
continue // a ref with no path sets nothing
|
|
153
|
+
}
|
|
154
|
+
path := strings.Split(strings.ToLower(rest[len(enc)+1:]), "_")
|
|
155
|
+
|
|
156
|
+
node, ok := out.Options[ref].(map[string]any)
|
|
157
|
+
if !ok {
|
|
158
|
+
node = map[string]any{}
|
|
159
|
+
out.Options[ref] = node
|
|
160
|
+
}
|
|
161
|
+
for i := 0; i < len(path)-1; i++ {
|
|
162
|
+
child, ok := node[path[i]].(map[string]any)
|
|
163
|
+
if !ok {
|
|
164
|
+
child = map[string]any{}
|
|
165
|
+
node[path[i]] = child
|
|
166
|
+
}
|
|
167
|
+
node = child
|
|
168
|
+
}
|
|
169
|
+
node[path[len(path)-1]] = parsevalue(input.Env[key])
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return out, nil
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
func splitlist(v string) []string {
|
|
176
|
+
out := []string{}
|
|
177
|
+
for _, s := range strings.Split(v, ",") {
|
|
178
|
+
if t := strings.TrimSpace(s); 0 < len(t) {
|
|
179
|
+
out = append(out, t)
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return out
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// parsevalue: values parse as JSON, FALLING BACK TO STRING — so `8080`
|
|
186
|
+
// is a number, `true` is a boolean, `{"a":1}` is a map, and `hello` is
|
|
187
|
+
// the string it looks like rather than a parse error.
|
|
188
|
+
func parsevalue(v string) any {
|
|
189
|
+
var out any
|
|
190
|
+
if err := json.Unmarshal([]byte(v), &out); nil != err {
|
|
191
|
+
return v
|
|
192
|
+
}
|
|
193
|
+
return out
|
|
194
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin 0.1.6 (go/plugin/export.go)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 8d8968afc0a2008fbd795b41ab166307d989f02a [tag: sdk-20260904-1610-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* Exports (§11).
|
|
5
|
+
*
|
|
6
|
+
* An instance publishes values for other plugins and for the
|
|
7
|
+
* application. Read with `host.Exports("retry$fast/client")`.
|
|
8
|
+
*
|
|
9
|
+
* THE UNQUALIFIED ALIAS IS THE INTERESTING PART. `retry/client` resolves
|
|
10
|
+
* to the UNTAGGED instance if one exists; if not, and exactly one tagged
|
|
11
|
+
* instance exports that key, it resolves to that one; if two do, it is
|
|
12
|
+
* `plugin_export_ambiguous` — deliberately diverging from seneca's
|
|
13
|
+
* silent last-wins, because with multi-instance as a headline feature an
|
|
14
|
+
* ambiguous alias is a defect waiting for production. */
|
|
15
|
+
|
|
16
|
+
package plugin
|
|
17
|
+
|
|
18
|
+
import (
|
|
19
|
+
"sort"
|
|
20
|
+
"strconv"
|
|
21
|
+
"strings"
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
type Exported struct {
|
|
25
|
+
Ref string
|
|
26
|
+
Key string
|
|
27
|
+
Value any
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
func ResolveExport(spec string, exported []Exported) (any, error) {
|
|
31
|
+
cut := strings.Index(spec, "/")
|
|
32
|
+
if -1 == cut {
|
|
33
|
+
return nil, Fail("plugin_export_ambiguous", "export spec needs a key: "+spec,
|
|
34
|
+
map[string]any{"spec": spec})
|
|
35
|
+
}
|
|
36
|
+
head := spec[:cut]
|
|
37
|
+
key := spec[cut+1:]
|
|
38
|
+
|
|
39
|
+
// A fully qualified ref: exactly one answer or none.
|
|
40
|
+
want := canon(head)
|
|
41
|
+
for _, e := range exported {
|
|
42
|
+
if e.Ref == want && e.Key == key {
|
|
43
|
+
return e.Value, nil
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// An alias: the name, not a ref. Look at every instance of it.
|
|
48
|
+
byname := []Exported{}
|
|
49
|
+
for _, e := range exported {
|
|
50
|
+
if refname(e.Ref) == head && e.Key == key {
|
|
51
|
+
byname = append(byname, e)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if 0 == len(byname) {
|
|
55
|
+
return nil, nil
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
for _, e := range byname {
|
|
59
|
+
if r, err := ParseRef(e.Ref); nil == err && "" == r.Tag {
|
|
60
|
+
return e.Value, nil
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if 1 == len(byname) {
|
|
65
|
+
return byname[0].Value, nil
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
refs := []string{}
|
|
69
|
+
for _, e := range byname {
|
|
70
|
+
refs = append(refs, e.Ref)
|
|
71
|
+
}
|
|
72
|
+
sort.Strings(refs)
|
|
73
|
+
return nil, Fail("plugin_export_ambiguous",
|
|
74
|
+
"alias "+spec+" matches "+itoa(len(refs))+" instances: "+join(refs, ", "),
|
|
75
|
+
map[string]any{"spec": spec, "refs": refs})
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
func itoa(n int) string { return strconv.Itoa(n) }
|
|
79
|
+
|
|
80
|
+
func join(l []string, sep string) string { return strings.Join(l, sep) }
|