@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,171 @@
|
|
|
1
|
+
# VENDORED: @voxgig/plugin 0.1.6 (python/voxgig_plugin/order.py)
|
|
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
|
+
"""Ordering (section 7) - one rule, one place.
|
|
5
|
+
|
|
6
|
+
sdkgen grew two special cases in `makeOptions` (`test`, then `station`)
|
|
7
|
+
and the third was not far off. This sort is the whole replacement, and the
|
|
8
|
+
tiers are in this order for a reason:
|
|
9
|
+
|
|
10
|
+
1 constraints before/after edges, by ref or by name
|
|
11
|
+
2 bands integer, lower first, default 0
|
|
12
|
+
3 declaration ties break by `pos`
|
|
13
|
+
|
|
14
|
+
CONSTRAINTS BEAT BANDS precisely so the correct tool wins when both are
|
|
15
|
+
present. A band expresses a genuine cross-cutting layer; a constraint
|
|
16
|
+
expresses a relationship between two specific things; and a band chosen by
|
|
17
|
+
trial and error to fix an ordering bug is a bug wearing a number.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from .types import fail
|
|
21
|
+
from .ref import parse_ref
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def resolve_order(bindings, pin=None):
|
|
25
|
+
nodes = list(bindings)
|
|
26
|
+
byref = {b['ref']: b for b in nodes}
|
|
27
|
+
|
|
28
|
+
# Constraints are edges. A constraint naming an ABSENT binding is
|
|
29
|
+
# satisfied VACUOUSLY (section 7) - a plugin ordered `after: 'test'`
|
|
30
|
+
# must load in a host with no test plugin. That is sdkgen's __after__
|
|
31
|
+
# behaviour, kept.
|
|
32
|
+
edges = {b['ref']: [] for b in nodes}
|
|
33
|
+
|
|
34
|
+
for b in nodes:
|
|
35
|
+
block = b.get('order') or {}
|
|
36
|
+
# An ABSENT constraint and an EMPTY LIST are both "no constraint".
|
|
37
|
+
if declared(block.get('after')):
|
|
38
|
+
for target in targets(block['after'], nodes):
|
|
39
|
+
edges[target].append(b['ref'])
|
|
40
|
+
if declared(block.get('before')):
|
|
41
|
+
for target in targets(block['before'], nodes):
|
|
42
|
+
edges[b['ref']].append(target)
|
|
43
|
+
|
|
44
|
+
# Stable topological sort. Among ready nodes, band first (lower runs
|
|
45
|
+
# first), then `pos` - the position the DOCUMENT visibly states, not
|
|
46
|
+
# the order instances happened to load and not the incarnation `seq`.
|
|
47
|
+
indeg = {b['ref']: 0 for b in nodes}
|
|
48
|
+
for source in edges:
|
|
49
|
+
for target in edges[source]:
|
|
50
|
+
indeg[target] = indeg.get(target, 0) + 1
|
|
51
|
+
|
|
52
|
+
out = []
|
|
53
|
+
ready = [b for b in nodes if 0 == indeg[b['ref']]]
|
|
54
|
+
|
|
55
|
+
while 0 < len(ready):
|
|
56
|
+
ready.sort(key=lambda b: (band(b), b.get('pos') or 0))
|
|
57
|
+
nxt = ready.pop(0)
|
|
58
|
+
out.append(nxt['ref'])
|
|
59
|
+
for target in edges[nxt['ref']]:
|
|
60
|
+
indeg[target] -= 1
|
|
61
|
+
if 0 == indeg[target]:
|
|
62
|
+
ready.append(byref[target])
|
|
63
|
+
|
|
64
|
+
if len(out) != len(nodes):
|
|
65
|
+
stuck = [b['ref'] for b in nodes if b['ref'] not in out]
|
|
66
|
+
fail('plugin_order_cycle',
|
|
67
|
+
'before/after constraints cycle: ' + ' -> '.join(stuck),
|
|
68
|
+
{'cycle': stuck})
|
|
69
|
+
|
|
70
|
+
return applypin(out, edges, pin)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def band(b):
|
|
74
|
+
block = b.get('order') or {}
|
|
75
|
+
value = block.get('band')
|
|
76
|
+
return value if isinstance(value, int) and not isinstance(value, bool) else 0
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def declared(spec):
|
|
80
|
+
"""Was a constraint stated? An absent value and an EMPTY LIST are
|
|
81
|
+
both no-constraint - and an empty list is truthy in most languages,
|
|
82
|
+
which is exactly how this class of bug survives."""
|
|
83
|
+
if spec is None:
|
|
84
|
+
return False
|
|
85
|
+
if isinstance(spec, list):
|
|
86
|
+
return any('' != one for one in spec)
|
|
87
|
+
return '' != spec
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def targets(spec, nodes):
|
|
91
|
+
"""Matching is by REF, or by NAME across all of that definition's
|
|
92
|
+
instances (section 7) - which is the whole reason the two spellings
|
|
93
|
+
exist."""
|
|
94
|
+
hit = []
|
|
95
|
+
# One spelling or a LIST of them. A list fans out to the union of what
|
|
96
|
+
# each names, so after: ['a','b'] means after BOTH, and the same
|
|
97
|
+
# instance named twice - once by name, once by ref - is one edge.
|
|
98
|
+
specs = spec if isinstance(spec, list) else [spec]
|
|
99
|
+
for one in specs:
|
|
100
|
+
for b in nodes:
|
|
101
|
+
if b['ref'] in hit:
|
|
102
|
+
continue
|
|
103
|
+
if b['ref'] == one:
|
|
104
|
+
hit.append(b['ref'])
|
|
105
|
+
continue
|
|
106
|
+
if parse_ref(b['ref'])['name'] == one:
|
|
107
|
+
hit.append(b['ref'])
|
|
108
|
+
return hit
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def applypin(order, edges, pin=None):
|
|
112
|
+
"""A PIN IS NOT A CONSTRAINT (section 7).
|
|
113
|
+
|
|
114
|
+
Constraints and bands are negotiable by definition - they are what
|
|
115
|
+
plugins and documents say they want, and the sort's job is to satisfy
|
|
116
|
+
them all. A pin is the host stating a structural invariant of its own
|
|
117
|
+
architecture, which is a different kind of claim and must not lose a
|
|
118
|
+
tie to a document.
|
|
119
|
+
|
|
120
|
+
So a pin PLACES the binding at the named end, and an ordering that
|
|
121
|
+
would move it away is `plugin_order_pinned` - rejected, not honoured
|
|
122
|
+
into a broken wrap. Station's transport adapter must sit immediately
|
|
123
|
+
outside the base transport; an `order` list that moves it has to be an
|
|
124
|
+
error rather than a preference.
|
|
125
|
+
"""
|
|
126
|
+
if None is pin:
|
|
127
|
+
return order
|
|
128
|
+
out = list(order)
|
|
129
|
+
|
|
130
|
+
# SORTED, not insertion order. A pin map is data - it can arrive from
|
|
131
|
+
# a host's own construction options in any order, and two names
|
|
132
|
+
# pinned to the same end are order-sensitive (`{b:'first',
|
|
133
|
+
# a:'first'}` and `{a:'first', b:'first'}` give different results).
|
|
134
|
+
# Python dicts are insertion-ordered and a Go map has no order at
|
|
135
|
+
# all, so leaving it unstated made the same declaration mean
|
|
136
|
+
# different things in different ports.
|
|
137
|
+
for name in sorted(pin):
|
|
138
|
+
want = pin[name]
|
|
139
|
+
idx = -1
|
|
140
|
+
for i, ref in enumerate(out):
|
|
141
|
+
if parse_ref(ref)['name'] == name:
|
|
142
|
+
idx = i
|
|
143
|
+
break
|
|
144
|
+
if -1 == idx:
|
|
145
|
+
continue
|
|
146
|
+
|
|
147
|
+
# `first`/`outermost` is index 0; `last`/`innermost` is the end.
|
|
148
|
+
# Section 6.2 makes the first chain binding outermost, which is
|
|
149
|
+
# why the vocabulary is positional and why the two spellings pair
|
|
150
|
+
# this way.
|
|
151
|
+
wantfirst = 'first' == want or 'outermost' == want
|
|
152
|
+
ref = out.pop(idx)
|
|
153
|
+
if wantfirst:
|
|
154
|
+
out.insert(0, ref)
|
|
155
|
+
else:
|
|
156
|
+
out.append(ref)
|
|
157
|
+
|
|
158
|
+
# Now check that the placement did not break a constraint. This is the
|
|
159
|
+
# half that makes a pin a rejection rather than an override: the host
|
|
160
|
+
# wins on position, but it does not get to silently discard a
|
|
161
|
+
# relationship a plugin declared.
|
|
162
|
+
at = {ref: i for i, ref in enumerate(out)}
|
|
163
|
+
for source in edges:
|
|
164
|
+
for target in edges[source]:
|
|
165
|
+
if at[source] > at[target]:
|
|
166
|
+
fail('plugin_order_pinned',
|
|
167
|
+
'a pin would move a binding an ordering constrains: ' +
|
|
168
|
+
source + ' must precede ' + target,
|
|
169
|
+
{'before': source, 'after': target})
|
|
170
|
+
|
|
171
|
+
return out
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# VENDORED: @voxgig/plugin 0.1.6 (python/voxgig_plugin/point.py)
|
|
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
|
+
"""Extension points (section 6). Three kinds, chosen because they are what
|
|
5
|
+
the two existing systems actually needed, and no more.
|
|
6
|
+
|
|
7
|
+
A PLUGIN NEVER MUTATES THE HOST. That inversion is what makes deactivation
|
|
8
|
+
possible: sdkgen's `utility.fetcher = wrapped` is not undoable, but "this
|
|
9
|
+
instance holds slot 3 of the request chain" is undoable in O(1). OSGi named
|
|
10
|
+
it the whiteboard pattern in 2004, in a paper called *Listeners Considered
|
|
11
|
+
Harmful*, and for exactly this reason.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import functools
|
|
15
|
+
|
|
16
|
+
from .types import fail
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Section 6.1: "fan-out" is not one answer but four. In a language with
|
|
20
|
+
# asynchrony, "call every binding" hides a decision - start them all and
|
|
21
|
+
# wait, await each in turn, or do not wait - and a design that leaves it
|
|
22
|
+
# unsaid gets four different answers from four ports, in the concurrency
|
|
23
|
+
# behaviour of production code no corpus entry happens to cover.
|
|
24
|
+
MODES = ['emit', 'parallel', 'serial', 'bail']
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def emit(bindings, mode, arg):
|
|
28
|
+
"""Fan-out. Return values are ignored except in `bail`."""
|
|
29
|
+
if 'bail' == mode:
|
|
30
|
+
# Stops at the first binding that RETURNS A VALUE - the "handled,
|
|
31
|
+
# stop" case. A `None` RETURN DECLINES (section 6.1): python has
|
|
32
|
+
# one way to say nothing, and the model's rule is written to that
|
|
33
|
+
# rather than to JavaScript's null/undefined pair.
|
|
34
|
+
for b in bindings:
|
|
35
|
+
value = b['fn'](arg)
|
|
36
|
+
if None is not value:
|
|
37
|
+
return value
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
errors = []
|
|
41
|
+
for b in bindings:
|
|
42
|
+
try:
|
|
43
|
+
b['fn'](arg)
|
|
44
|
+
except Exception as err:
|
|
45
|
+
# `emit` raises synchronously; the collecting modes gather.
|
|
46
|
+
if 'emit' == mode:
|
|
47
|
+
raise
|
|
48
|
+
errors.append(err)
|
|
49
|
+
return None if 'emit' == mode else errors
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def compose(bindings, base):
|
|
53
|
+
"""Composition: b1(b2(b3(base))), FIRST BINDING OUTERMOST (section
|
|
54
|
+
6.2).
|
|
55
|
+
|
|
56
|
+
Recomputed by the host whenever the live set changes, and cached
|
|
57
|
+
between changes. Plugins receive `next` as an argument; they never see
|
|
58
|
+
or store the previous value of anything. A plugin that stashes `next`
|
|
59
|
+
and calls it after deactivation is a bug the host cannot prevent, and
|
|
60
|
+
this says so rather than pretending otherwise.
|
|
61
|
+
"""
|
|
62
|
+
nxt = base
|
|
63
|
+
for i in range(len(bindings) - 1, -1, -1):
|
|
64
|
+
fn = bindings[i]['fn']
|
|
65
|
+
inner = nxt
|
|
66
|
+
# `inner=inner, fn=fn` binds the CURRENT values into the default
|
|
67
|
+
# arguments. Python closures capture the variable, not the value,
|
|
68
|
+
# so a plain closure here would leave every layer calling the last
|
|
69
|
+
# one - the single most common way to get this loop wrong.
|
|
70
|
+
nxt = (lambda *args, fn=fn, inner=inner: fn(inner, *args))
|
|
71
|
+
return nxt
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def provider(bindings, spec):
|
|
75
|
+
"""At most one live implementation (section 6.3). The winner is the
|
|
76
|
+
highest band, ties broken by ref sort, and THE LOSERS ARE VISIBLE
|
|
77
|
+
rather than silently ignored."""
|
|
78
|
+
if 0 == len(bindings):
|
|
79
|
+
return {'winner': None, 'shadowed': []}
|
|
80
|
+
|
|
81
|
+
if spec.get('exclusive') and 1 < len(bindings):
|
|
82
|
+
refs = sorted(b['ref'] for b in bindings)
|
|
83
|
+
fail('plugin_point_exclusive',
|
|
84
|
+
'point is exclusive and has ' + str(len(bindings)) +
|
|
85
|
+
' bindings: ' + ', '.join(refs),
|
|
86
|
+
{'refs': refs})
|
|
87
|
+
|
|
88
|
+
ranked = sorted(bindings, key=functools.cmp_to_key(rank))
|
|
89
|
+
return {'winner': ranked[0], 'shadowed': [b['ref'] for b in ranked[1:]]}
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def rank(a, b):
|
|
93
|
+
if a['band'] != b['band']:
|
|
94
|
+
return b['band'] - a['band'] # HIGHEST band wins
|
|
95
|
+
return -1 if a['ref'] < b['ref'] else (1 if a['ref'] > b['ref'] else 0)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# VENDORED: @voxgig/plugin 0.1.6 (python/voxgig_plugin/ref.py)
|
|
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
|
+
"""Identity: name+tag, written `name$tag` (section 4).
|
|
5
|
+
|
|
6
|
+
The four pure functions, and the whole of what `ref` pins. They are the
|
|
7
|
+
first thing a new port implements and the first corpus section it passes.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import re
|
|
11
|
+
|
|
12
|
+
from .types import fail
|
|
13
|
+
|
|
14
|
+
# Section 4: `^[a-zA-Z@][a-zA-Z0-9.~_\-/]*$`, max 1024.
|
|
15
|
+
#
|
|
16
|
+
# `\Z`, NOT `$`. PYTHON'S `$` ALSO MATCHES BEFORE A TRAILING NEWLINE, so
|
|
17
|
+
# `^...$` accepts "abc\n" as a plugin name - and nothing else in the
|
|
18
|
+
# grammar, in this file, or (until `ref/name#trailing-newline`) in the
|
|
19
|
+
# corpus would ever say so. The anchors in the design's grammar mean
|
|
20
|
+
# STRING start and end; ruby needs `\A`/`\z` for the same reason, and
|
|
21
|
+
# worse, since its `^`/`$` match at every line boundary.
|
|
22
|
+
NAME_RE = re.compile(r'^[a-zA-Z@][a-zA-Z0-9.~_\-/]*\Z')
|
|
23
|
+
|
|
24
|
+
# Section 4: `^[a-zA-Z0-9.~_-]+$`, max 1024, or empty.
|
|
25
|
+
#
|
|
26
|
+
# The asymmetry with a name is deliberate: a tag MAY start with a digit
|
|
27
|
+
# because auto-tagging assigns integer tags (`stripe$1`), and a tag admits
|
|
28
|
+
# neither `@` nor `/` because a name is a package specifier and a tag is
|
|
29
|
+
# not.
|
|
30
|
+
TAG_RE = re.compile(r'^[a-zA-Z0-9.~_-]+\Z')
|
|
31
|
+
|
|
32
|
+
MAX = 1024
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def check_name(name):
|
|
36
|
+
if not isinstance(name, str):
|
|
37
|
+
return False
|
|
38
|
+
if 0 == len(name) or MAX < len(name):
|
|
39
|
+
return False
|
|
40
|
+
return None is not NAME_RE.match(name)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def check_tag(tag):
|
|
44
|
+
if not isinstance(tag, str):
|
|
45
|
+
return False
|
|
46
|
+
# The empty tag is an ordinary tag (section 4 rule 2). The
|
|
47
|
+
# single-instance case writes no tag and never learns tags exist.
|
|
48
|
+
if 0 == len(tag):
|
|
49
|
+
return True
|
|
50
|
+
if MAX < len(tag):
|
|
51
|
+
return False
|
|
52
|
+
return None is not TAG_RE.match(tag)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def parse_ref(text):
|
|
56
|
+
"""`name$tag` -> the pair. Canonicalizing: `stripe$` and `stripe` both
|
|
57
|
+
give tag ''."""
|
|
58
|
+
if not isinstance(text, str):
|
|
59
|
+
fail('plugin_bad_name', 'ref must be a string')
|
|
60
|
+
|
|
61
|
+
# Split on the FIRST `$`. Nothing in the grammar decides this - `$` is
|
|
62
|
+
# in neither character class - so the corpus is the arbiter (section 4
|
|
63
|
+
# rule 5), and it picks the split that blames the part actually at
|
|
64
|
+
# fault: `a$b$c` is a good name with a bad tag, not the reverse.
|
|
65
|
+
cut = text.find('$')
|
|
66
|
+
name = text if -1 == cut else text[:cut]
|
|
67
|
+
tag = '' if -1 == cut else text[cut + 1:]
|
|
68
|
+
|
|
69
|
+
if not check_name(name):
|
|
70
|
+
fail('plugin_bad_name', 'invalid plugin name: ' + name, {'name': name})
|
|
71
|
+
if not check_tag(tag):
|
|
72
|
+
fail('plugin_bad_tag', 'invalid plugin tag: ' + tag,
|
|
73
|
+
{'name': name, 'tag': tag})
|
|
74
|
+
|
|
75
|
+
return {'name': name, 'tag': tag}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def format_ref(name, tag=None):
|
|
79
|
+
"""The pair -> `name$tag`. An empty tag NEVER writes the separator,
|
|
80
|
+
which is the half of canonicalization format_ref owns: parse tolerates
|
|
81
|
+
`stripe$`, format never produces it, so a round trip is idempotent."""
|
|
82
|
+
tag = '' if None is tag else tag
|
|
83
|
+
if not check_name(name):
|
|
84
|
+
fail('plugin_bad_name', 'invalid plugin name: ' + str(name),
|
|
85
|
+
{'name': name})
|
|
86
|
+
if not check_tag(tag):
|
|
87
|
+
fail('plugin_bad_tag', 'invalid plugin tag: ' + str(tag),
|
|
88
|
+
{'name': name, 'tag': tag})
|
|
89
|
+
return name if '' == tag else name + '$' + tag
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def canon_ref(text):
|
|
93
|
+
"""The canonical spelling of a ref. Section 4 rule 5: ports must
|
|
94
|
+
canonicalize before comparison."""
|
|
95
|
+
ref = parse_ref(text)
|
|
96
|
+
return format_ref(ref['name'], ref['tag'])
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def try_ref(text):
|
|
100
|
+
"""The canonical ref this string denotes, or None if it denotes none -
|
|
101
|
+
the TOLERANT half of `canon_ref`, and the one a requirement name needs.
|
|
102
|
+
|
|
103
|
+
A REQUIREMENT NAME IS A CAPABILITY NAME FIRST (section 11.1), and
|
|
104
|
+
capability names are free-form: the design puts no grammar on them, so
|
|
105
|
+
`2fa` and `my cap` are perfectly good ones and neither is a well-formed
|
|
106
|
+
ref. `canon_ref` RAISES on those, so asking it "is this a ref?" made a
|
|
107
|
+
legal document kill the host. Answering None is the whole difference.
|
|
108
|
+
"""
|
|
109
|
+
if not isinstance(text, str):
|
|
110
|
+
return None
|
|
111
|
+
cut = text.find('$')
|
|
112
|
+
name = text if -1 == cut else text[:cut]
|
|
113
|
+
tag = '' if -1 == cut else text[cut + 1:]
|
|
114
|
+
if not check_name(name) or not check_tag(tag):
|
|
115
|
+
return None
|
|
116
|
+
return name if '' == tag else name + '$' + tag
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# VENDORED: @voxgig/plugin 0.1.6 (python/voxgig_plugin/resolve.py)
|
|
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
|
+
"""Dynamic resolution (section 10.2) - name to candidate module ids.
|
|
5
|
+
|
|
6
|
+
PURE. It returns the ids a host WOULD try, in order; it does not load
|
|
7
|
+
anything. That separation is what lets the corpus pin resolution in every
|
|
8
|
+
language including those with no dynamic loading at all, and it is why
|
|
9
|
+
section 15.4 puts real module loading in per-port integration tests rather
|
|
10
|
+
than here.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
DEFAULT_SOURCES = [
|
|
14
|
+
{'kind': 'module',
|
|
15
|
+
'prefix': ['@voxgig/plugin-', 'voxgig-plugin-', 'plugin-', '']},
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def resolve_candidates(name, sources=None):
|
|
20
|
+
out = []
|
|
21
|
+
|
|
22
|
+
# A SCOPED NAME RESOLVES VERBATIM ONLY (section 10.2). `@acme/thing`
|
|
23
|
+
# is already a package id; prefixing it produces
|
|
24
|
+
# `@voxgig/plugin-@acme/thing`, which is not a thing that can exist.
|
|
25
|
+
if name.startswith('@'):
|
|
26
|
+
return [name]
|
|
27
|
+
|
|
28
|
+
entries = sources if sources else DEFAULT_SOURCES
|
|
29
|
+
|
|
30
|
+
for src in entries:
|
|
31
|
+
if 'module' == src.get('kind'):
|
|
32
|
+
prefixes = src.get('prefix') or ['']
|
|
33
|
+
if 0 == len(prefixes):
|
|
34
|
+
prefixes = ['']
|
|
35
|
+
for prefix in prefixes:
|
|
36
|
+
found = prefix + name
|
|
37
|
+
if found not in out:
|
|
38
|
+
out.append(found)
|
|
39
|
+
elif 'path' == src.get('kind'):
|
|
40
|
+
found = src['dir'].rstrip('/') + '/' + name
|
|
41
|
+
if found not in out:
|
|
42
|
+
out.append(found)
|
|
43
|
+
|
|
44
|
+
return out
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def resolve_from(location):
|
|
48
|
+
"""A MODULE PATH IS NOT A NAME (section 10.2). The ref grammar starts
|
|
49
|
+
a name with a letter or `@`, so `./local/thing` is not a ref and never
|
|
50
|
+
reaches candidate generation - seneca allows a path where a plugin
|
|
51
|
+
name goes, and this design deliberately does not, because a ref is an
|
|
52
|
+
ADDRESS WITHIN A HOST and a path is a LOCATION ON A DISK.
|
|
53
|
+
|
|
54
|
+
Loading from an explicit location is a separate field that bypasses
|
|
55
|
+
candidate generation entirely: `from` is passed to the resolver
|
|
56
|
+
verbatim, and a resolver that cannot honour a location raises
|
|
57
|
+
plugin_resolve_failed.
|
|
58
|
+
"""
|
|
59
|
+
return [location]
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# VENDORED: @voxgig/plugin 0.1.6 (python/voxgig_plugin/types.py)
|
|
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
|
+
"""Shared types. Deliberately small: the design's section 19 budget says
|
|
5
|
+
the library owns naming, configuration, lifecycle, ordering, binding and
|
|
6
|
+
teardown, and nothing else.
|
|
7
|
+
|
|
8
|
+
PYTHON IS THE OTHER HALF OF P4'S PROVING PAIR (section 18): "the closest
|
|
9
|
+
dynamic analogue that is not JavaScript". It raises where the canonical
|
|
10
|
+
raises and go returns, so the interesting differences here are not about
|
|
11
|
+
errors — they are about the places JavaScript's coercion rules and
|
|
12
|
+
Python's disagree, and `True == 1` is the first of them.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# Section 5.1's seven statuses, and no more. A port that adds an eighth is
|
|
19
|
+
# diverging. `loading` and `closing` are observable only from inside a
|
|
20
|
+
# callback or from another thread.
|
|
21
|
+
STATUSES = ['declared', 'loaded', 'pending', 'live', 'failed',
|
|
22
|
+
'loading', 'closing']
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# Section 12's detail fields, IN THIS FIXED ORDER.
|
|
26
|
+
#
|
|
27
|
+
# The order is part of the contract, not a formatting preference. An
|
|
28
|
+
# earlier draft named six fields while other sections promised
|
|
29
|
+
# diagnostics that had nowhere to go, which would have left each port
|
|
30
|
+
# inventing its own order and breaking message parity.
|
|
31
|
+
DETAIL_ORDER = [
|
|
32
|
+
'host', 'ref', 'name', 'tag', 'point', 'key', 'capability',
|
|
33
|
+
'range', 'version', 'match', 'candidates', 'cycle', 'holders',
|
|
34
|
+
'refs', 'path', 'cause',
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def compactjson(value):
|
|
39
|
+
"""JSON.stringify's output: compact, and NOT ascii-escaped.
|
|
40
|
+
|
|
41
|
+
`ensure_ascii=True` would render a non-ASCII value as `\\uXXXX` where
|
|
42
|
+
every other port prints the character, which breaks section 12
|
|
43
|
+
message parity on exactly the inputs least likely to be tested.
|
|
44
|
+
"""
|
|
45
|
+
return json.dumps(value, separators=(',', ':'), ensure_ascii=False)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def formaterror(code, text, details=None):
|
|
49
|
+
"""`plugin/<code>: <text> [<key>=<value> ...]`
|
|
50
|
+
|
|
51
|
+
Values render as COMPACT JSON, so a value containing a space or a
|
|
52
|
+
bracket cannot break the parse, and a list renders as a JSON array.
|
|
53
|
+
The bracket is absent entirely when no field applies.
|
|
54
|
+
"""
|
|
55
|
+
details = details or {}
|
|
56
|
+
parts = []
|
|
57
|
+
for key in DETAIL_ORDER:
|
|
58
|
+
if key not in details:
|
|
59
|
+
continue
|
|
60
|
+
parts.append(key + '=' + compactjson(details[key]))
|
|
61
|
+
tail = '' if 0 == len(parts) else ' [' + ' '.join(parts) + ']'
|
|
62
|
+
return 'plugin/' + code + ': ' + text + tail
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class PluginError(Exception):
|
|
66
|
+
"""Every error carries a section 12 code. Ports compare by CODE and
|
|
67
|
+
never by message: wording is a port's own business, and pinning the
|
|
68
|
+
words would make every translation a corpus change. The FORMAT,
|
|
69
|
+
however, is pinned - a parseable message is what makes a log
|
|
70
|
+
searchable across twenty languages."""
|
|
71
|
+
|
|
72
|
+
def __init__(self, code, text, details=None):
|
|
73
|
+
super().__init__(formaterror(code, text, details))
|
|
74
|
+
self.code = code
|
|
75
|
+
self.text = text
|
|
76
|
+
self.details = details or {}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def fail(code, text, details=None):
|
|
80
|
+
raise PluginError(code, text, details)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def codeof(err):
|
|
84
|
+
"""The section 12 code of an error, or '' for one this library did not
|
|
85
|
+
raise. The corpus compares by code, so the driver needs one place
|
|
86
|
+
that knows how to read it."""
|
|
87
|
+
return getattr(err, 'code', '')
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# VENDORED: @voxgig/plugin 0.1.6 (python/voxgig_plugin/version.py)
|
|
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
|
+
"""Versions and ranges (section 11.2).
|
|
5
|
+
|
|
6
|
+
TWO FIELDS AND ONE PREDICATE. A capability declares `version`, a concrete
|
|
7
|
+
version. A requirement declares `range`. A requirement is satisfied when
|
|
8
|
+
the names match, the `match` passes, and:
|
|
9
|
+
|
|
10
|
+
the provider's `version` falls inside the requirement's `range`.
|
|
11
|
+
|
|
12
|
+
That is the whole rule. There is no third field and no second comparison -
|
|
13
|
+
an earlier draft added a provider-side `compat` range, which left three
|
|
14
|
+
values and no statement of how they combine, and three defensible
|
|
15
|
+
readings of one declaration is worse than the ambiguity it was introduced
|
|
16
|
+
to fix.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import re
|
|
20
|
+
|
|
21
|
+
from .types import fail
|
|
22
|
+
|
|
23
|
+
# `\Z`, NOT `$` — the same trap as the ref grammar. Python's `$` also
|
|
24
|
+
# matches before a trailing newline, so `^...$` accepts "2.1\n" as a
|
|
25
|
+
# range. Pinned by `version/rangebad#trailing-newline`.
|
|
26
|
+
VERSION_RE = re.compile(r'^(\d+)(?:\.(\d+))?(?:\.(\d+))?\Z')
|
|
27
|
+
|
|
28
|
+
# A COMPONENT IS BOUNDED, and the bound is the model's, not the host
|
|
29
|
+
# language's. Python integers are unbounded and JavaScript's stop being
|
|
30
|
+
# exact past 2^53, so `4294967296.0.0` compared as an ordinary number in
|
|
31
|
+
# one port and lost precision in another. 2^31-1 is the smallest bound
|
|
32
|
+
# every target language holds exactly, which makes it the model's.
|
|
33
|
+
COMPONENT_MAX = 2147483647
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def component(digits, whole, field):
|
|
37
|
+
value = int(digits)
|
|
38
|
+
if COMPONENT_MAX < value:
|
|
39
|
+
fail('plugin_bad_range',
|
|
40
|
+
'version component out of range in ' + whole + ': ' + digits,
|
|
41
|
+
{field: whole})
|
|
42
|
+
return value
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def parse_range(text):
|
|
46
|
+
"""Two forms and no more (section 11.2):
|
|
47
|
+
|
|
48
|
+
'2.1' >= 2.1.0 and < 3.0.0
|
|
49
|
+
'~2.1' >= 2.1.0 and < 2.2.0
|
|
50
|
+
"""
|
|
51
|
+
if not isinstance(text, str) or 0 == len(text):
|
|
52
|
+
fail('plugin_bad_range', 'invalid range: ' + str(text),
|
|
53
|
+
{'range': text})
|
|
54
|
+
|
|
55
|
+
tilde = text.startswith('~')
|
|
56
|
+
body = text[1:] if tilde else text
|
|
57
|
+
found = VERSION_RE.match(body)
|
|
58
|
+
if None is found:
|
|
59
|
+
fail('plugin_bad_range', 'invalid range: ' + text, {'range': text})
|
|
60
|
+
|
|
61
|
+
major = component(found.group(1), text, 'range')
|
|
62
|
+
minor = (0 if None is found.group(2)
|
|
63
|
+
else component(found.group(2), text, 'range'))
|
|
64
|
+
patch = (0 if None is found.group(3)
|
|
65
|
+
else component(found.group(3), text, 'range'))
|
|
66
|
+
|
|
67
|
+
lo = [major, minor, patch]
|
|
68
|
+
hi = [major, minor + 1, 0] if tilde else [major + 1, 0, 0]
|
|
69
|
+
return {'lo': lo, 'hi': hi}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def parse_version(text):
|
|
73
|
+
if not isinstance(text, str):
|
|
74
|
+
fail('plugin_bad_range', 'invalid version: ' + str(text),
|
|
75
|
+
{'version': text})
|
|
76
|
+
found = VERSION_RE.match(text)
|
|
77
|
+
if None is found:
|
|
78
|
+
fail('plugin_bad_range', 'invalid version: ' + text,
|
|
79
|
+
{'version': text})
|
|
80
|
+
return [
|
|
81
|
+
component(found.group(1), text, 'version'),
|
|
82
|
+
(0 if None is found.group(2)
|
|
83
|
+
else component(found.group(2), text, 'version')),
|
|
84
|
+
(0 if None is found.group(3)
|
|
85
|
+
else component(found.group(3), text, 'version')),
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def satisfies(version, text):
|
|
90
|
+
"""The one satisfaction predicate: lo <= version < hi."""
|
|
91
|
+
value = parse_version(version)
|
|
92
|
+
span = parse_range(text)
|
|
93
|
+
return 0 <= cmp(value, span['lo']) and 0 > cmp(value, span['hi'])
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def satisfiesq(version, text):
|
|
97
|
+
"""satisfies for the internal callers that treat an unparseable
|
|
98
|
+
version or range as "does not satisfy" - Capability and Graph, both of
|
|
99
|
+
which run over data the corpus has already admitted."""
|
|
100
|
+
try:
|
|
101
|
+
return satisfies(version, text)
|
|
102
|
+
except Exception:
|
|
103
|
+
return False
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def cmp(a, b):
|
|
107
|
+
for i in range(3):
|
|
108
|
+
x = a[i] if i < len(a) else 0
|
|
109
|
+
y = b[i] if i < len(b) else 0
|
|
110
|
+
if x != y:
|
|
111
|
+
return -1 if x < y else 1
|
|
112
|
+
return 0
|