@voxgig/sdkgen 4.8.2 → 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 +1 -1
- 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,552 @@
|
|
|
1
|
+
// VENDORED: @voxgig/omni sdk-20260904-1610-0 (scala/src/Runner.scala)
|
|
2
|
+
// Source: https://github.com/voxgig/omni @ 8c3e1b573a8d35796f7fc45e3226b977023cabf7 [tag: sdk-20260904-1610-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
// Omni: the shared multi-language test runner (Scala port).
|
|
5
|
+
//
|
|
6
|
+
// Port of the canonical TypeScript implementation
|
|
7
|
+
// (typescript/src/Runner.ts). Behaviour must match, case for case.
|
|
8
|
+
|
|
9
|
+
package voxgig.omni
|
|
10
|
+
|
|
11
|
+
import java.nio.file.{Files, Paths}
|
|
12
|
+
import java.util.regex.Pattern
|
|
13
|
+
import scala.collection.immutable.ListMap
|
|
14
|
+
import scala.util.control.NonFatal
|
|
15
|
+
|
|
16
|
+
import Util.*
|
|
17
|
+
|
|
18
|
+
/** The function under test. Arguments arrive as JSON values; failure is
|
|
19
|
+
* reported by throwing.
|
|
20
|
+
*/
|
|
21
|
+
type Subject = List[Json] => Json
|
|
22
|
+
|
|
23
|
+
/** A subject that may REPLACE its arguments, which `match.args` can then
|
|
24
|
+
* assert on. `minor/setpath` is the case in point: eight of its nine entries
|
|
25
|
+
* assert that the store was rewritten in place, and `merge/integrity` all
|
|
26
|
+
* six.
|
|
27
|
+
*
|
|
28
|
+
* This port's [[Json]] is an immutable value model, so a consumer holding a
|
|
29
|
+
* converted copy has no way to write through the argument list even when its
|
|
30
|
+
* own nodes are mutable (struct/scala's are `ArrayBuffer` / `LinkedHashMap`).
|
|
31
|
+
* Returning the arguments alongside the result is the only channel there is.
|
|
32
|
+
*
|
|
33
|
+
* Separate from [[Subject]] rather than replacing it: a signature change
|
|
34
|
+
* would break every consumer for a capability most subjects do not need.
|
|
35
|
+
* omni-rust, -cpp, -ocaml, -elixir, -haskell and -clojure carry the same
|
|
36
|
+
* pair, for the same reason.
|
|
37
|
+
*/
|
|
38
|
+
type SubjectArgs = List[Json] => (List[Json], Json)
|
|
39
|
+
|
|
40
|
+
/** A test failure (or a malformed spec). Distinct from an exception thrown
|
|
41
|
+
* by the subject under test, which is a candidate for an `err` expectation.
|
|
42
|
+
*/
|
|
43
|
+
class OmniError(val text: String, val entry: Json = Json.Absent) extends RuntimeException(text)
|
|
44
|
+
|
|
45
|
+
/** Run-time options for a set of test entries. */
|
|
46
|
+
case class Flags(nulls: Boolean = true, name: Option[String] = None)
|
|
47
|
+
|
|
48
|
+
object Flags:
|
|
49
|
+
def nonull(): Flags = Flags(nulls = false)
|
|
50
|
+
|
|
51
|
+
/** The host of the system under test. Every hook is optional. */
|
|
52
|
+
case class Provider(
|
|
53
|
+
subject: Option[String => Option[Subject]] = None,
|
|
54
|
+
client: Option[Json => Provider] = None,
|
|
55
|
+
contextify: Option[Json => Json] = None,
|
|
56
|
+
inject: Option[(Json, Json) => Json] = None,
|
|
57
|
+
// Build the `match.err` base from the raised error, REPLACING `errify`.
|
|
58
|
+
// A library whose errors carry a code can then assert on it with
|
|
59
|
+
// `match: {err: {code: "x"}}` instead of pattern-matching prose.
|
|
60
|
+
errify: Option[Throwable => Json] = None,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
// The newest spec format version this runner understands. A spec with no
|
|
64
|
+
// OMNI block is version 0: the original, lenient format, frozen forever.
|
|
65
|
+
// Version 1 turns on strict entry validation (see checkentry).
|
|
66
|
+
val SPECVERSION: Int = 1
|
|
67
|
+
|
|
68
|
+
// Capability strings this runner supports beyond the version baseline. A
|
|
69
|
+
// spec's OMNI.requires list is checked against this: an unknown capability
|
|
70
|
+
// refuses the spec loudly at load time, instead of a lagging port silently
|
|
71
|
+
// mis-running it. (Empty today; future format features mint a string here.)
|
|
72
|
+
val CAPABILITIES: List[String] = List.empty[String]
|
|
73
|
+
|
|
74
|
+
// The complete set of fields an entry may carry. Under version 1 anything
|
|
75
|
+
// else is an error: an unrecognised key is almost always a typo'd
|
|
76
|
+
// assertion, and a typo'd assertion is a test that silently stopped
|
|
77
|
+
// testing.
|
|
78
|
+
private val ENTRYFIELDS =
|
|
79
|
+
List("in", "args", "ctx", "out", "err", "match", "client", "id", "doc")
|
|
80
|
+
|
|
81
|
+
object Runner:
|
|
82
|
+
|
|
83
|
+
/** Load a spec: a path to a JSON file. */
|
|
84
|
+
def loadspec(path: String): Json =
|
|
85
|
+
val file = Paths.get(path)
|
|
86
|
+
if !Files.exists(file) then throw OmniError(s"omni: cannot read spec: $path")
|
|
87
|
+
Json.parse(Files.readString(file))
|
|
88
|
+
|
|
89
|
+
// Read the spec's format version from its optional top-level OMNI block,
|
|
90
|
+
// and refuse a spec this runner cannot faithfully run: a version newer
|
|
91
|
+
// than SPECVERSION, or a required capability not in CAPABILITIES. A
|
|
92
|
+
// present-but-null OMNI block is malformed - only a genuinely absent key
|
|
93
|
+
// means legacy version 0.
|
|
94
|
+
def resolveversion(alltests: Json): Int =
|
|
95
|
+
if !alltests.has("OMNI") then return 0
|
|
96
|
+
|
|
97
|
+
val meta = alltests.get("OMNI")
|
|
98
|
+
val version = meta.get("version").asnum
|
|
99
|
+
|
|
100
|
+
if !meta.ismap || version.isEmpty || version.get != math.floor(version.get) then
|
|
101
|
+
throw OmniError("omni: malformed OMNI version block")
|
|
102
|
+
|
|
103
|
+
val versionval = version.get
|
|
104
|
+
|
|
105
|
+
if versionval < 0 || SPECVERSION < versionval then
|
|
106
|
+
throw OmniError(s"omni: unsupported spec version: ${numstr(versionval)}")
|
|
107
|
+
|
|
108
|
+
if meta.has("requires") then
|
|
109
|
+
val requires = meta.get("requires").aslist.getOrElse {
|
|
110
|
+
throw OmniError("omni: malformed OMNI requires list")
|
|
111
|
+
}
|
|
112
|
+
for cap <- requires do
|
|
113
|
+
cap.asstr match
|
|
114
|
+
case Some(text) if CAPABILITIES.contains(text) => ()
|
|
115
|
+
case _ =>
|
|
116
|
+
throw OmniError(s"omni: spec requires unsupported capability: ${stringify(cap)}")
|
|
117
|
+
|
|
118
|
+
versionval.toInt
|
|
119
|
+
|
|
120
|
+
/** Find `primary.<name>`, then `<name>`, then the whole spec. */
|
|
121
|
+
def resolvespec(name: String, alltests: Json): Json =
|
|
122
|
+
if name.isEmpty then return alltests
|
|
123
|
+
|
|
124
|
+
val primary = alltests.get("primary").get(name)
|
|
125
|
+
if !primary.isabsent then return primary
|
|
126
|
+
|
|
127
|
+
val section = alltests.get(name)
|
|
128
|
+
if !section.isabsent then return section
|
|
129
|
+
|
|
130
|
+
alltests
|
|
131
|
+
|
|
132
|
+
/** Nulls (and absent values) become NULLMARK. Always a fresh copy. */
|
|
133
|
+
def fixjson(value: Json, donull: Boolean): Json =
|
|
134
|
+
// Canonical returns the value UNCHANGED when donull is false
|
|
135
|
+
// (typescript/src/Runner.ts): absent stays absent and null stays null.
|
|
136
|
+
// Answering Json.Null for both collapsed two states the corpus
|
|
137
|
+
// distinguishes. Same defect omni-lua and omni-rust carried
|
|
138
|
+
// (voxgig/omni#17, #23).
|
|
139
|
+
if value.isnone then (if donull then Json.str(NULLMARK) else value)
|
|
140
|
+
else
|
|
141
|
+
value match
|
|
142
|
+
case Json.JList(entries) => Json.JList(entries.map(fixjson(_, donull)))
|
|
143
|
+
case Json.JMap(entries) =>
|
|
144
|
+
Json.JMap(ListMap.from(entries.map((key, entry) => (key, fixjson(entry, donull)))))
|
|
145
|
+
case other => other
|
|
146
|
+
|
|
147
|
+
/** The JSON form of an error: always at least {name,message}. */
|
|
148
|
+
def errify(err: Throwable): Json =
|
|
149
|
+
Json.map("name" -> Json.str(err.getClass.getSimpleName), "message" -> Json.str(errmessage(err)))
|
|
150
|
+
|
|
151
|
+
def errmessage(err: Throwable): String =
|
|
152
|
+
Option(err.getMessage).getOrElse(err.getClass.getSimpleName)
|
|
153
|
+
|
|
154
|
+
/** Match one leaf: /regex/ or case-insensitive substring for strings. */
|
|
155
|
+
def matchval(check: Json, base: Json): Boolean =
|
|
156
|
+
if deepequal(check, base) then return true
|
|
157
|
+
|
|
158
|
+
check.asstr match
|
|
159
|
+
case Some(text) =>
|
|
160
|
+
// An empty want would substring-match anything.
|
|
161
|
+
if text.isEmpty then return false
|
|
162
|
+
|
|
163
|
+
val basestr = stringify(base)
|
|
164
|
+
|
|
165
|
+
if 2 < text.length && text.startsWith("/") && text.endsWith("/") then
|
|
166
|
+
try Pattern.compile(text.substring(1, text.length - 1)).matcher(basestr).find()
|
|
167
|
+
catch case NonFatal(_) => false
|
|
168
|
+
else basestr.toLowerCase.contains(text.toLowerCase)
|
|
169
|
+
|
|
170
|
+
case None => deepequal(check, base)
|
|
171
|
+
|
|
172
|
+
/** Convert NULLMARK sentinels back into real nulls. */
|
|
173
|
+
def nullmodifier(value: Json): Json = value.asstr match
|
|
174
|
+
case Some(NULLMARK) => Json.Null
|
|
175
|
+
case Some(text) => Json.str(text.replace(NULLMARK, "null"))
|
|
176
|
+
case None => value
|
|
177
|
+
|
|
178
|
+
/** Make a runner for a spec file path and a provider. */
|
|
179
|
+
def makeRunner(path: String, provider: Provider): RunnerPack =
|
|
180
|
+
RunnerPack(loadspec(path), provider)
|
|
181
|
+
|
|
182
|
+
/** Make a runner for an in-memory spec and a provider. */
|
|
183
|
+
def makeRunner(spec: Json, provider: Provider = Provider()): RunnerPack =
|
|
184
|
+
RunnerPack(spec, provider)
|
|
185
|
+
|
|
186
|
+
/** A loaded spec plus its provider. */
|
|
187
|
+
class RunnerPack(alltests: Json, provider: Provider):
|
|
188
|
+
|
|
189
|
+
// Resolved once, at construction (i.e. inside makeRunner) - fail fast on
|
|
190
|
+
// a spec version this runner cannot faithfully run, before any set runs.
|
|
191
|
+
private val specversion: Int = Runner.resolveversion(alltests)
|
|
192
|
+
|
|
193
|
+
/** Resolve one named section of the spec. */
|
|
194
|
+
def runner(name: String, store: Json = Json.Absent): RunPack =
|
|
195
|
+
val spec = Runner.resolvespec(name, alltests)
|
|
196
|
+
var clients = Map.empty[String, Provider]
|
|
197
|
+
|
|
198
|
+
val defclient = spec.get("DEF").get("client").asmap
|
|
199
|
+
|
|
200
|
+
// A spec may define clients that a given test run never references.
|
|
201
|
+
(defclient, provider.client) match
|
|
202
|
+
case (Some(entries), Some(clientmaker)) =>
|
|
203
|
+
for (clientname, cdef) <- entries do
|
|
204
|
+
var copts = cdef.get("test").get("options")
|
|
205
|
+
if copts.isabsent then copts = Json.map()
|
|
206
|
+
provider.inject.foreach { inject =>
|
|
207
|
+
if store.ismap then copts = inject(copts, store)
|
|
208
|
+
}
|
|
209
|
+
clients = clients.updated(clientname, clientmaker(copts))
|
|
210
|
+
case _ => ()
|
|
211
|
+
|
|
212
|
+
val subject = if name.isEmpty then None else provider.subject.flatMap(_(name))
|
|
213
|
+
|
|
214
|
+
RunPack(spec, subject, provider, clients, name, specversion)
|
|
215
|
+
|
|
216
|
+
/** What a runner returns for one named spec section. */
|
|
217
|
+
class RunPack(
|
|
218
|
+
val spec: Json,
|
|
219
|
+
val subject: Option[Subject],
|
|
220
|
+
val client: Provider,
|
|
221
|
+
clients: Map[String, Provider],
|
|
222
|
+
name: String,
|
|
223
|
+
specversion: Int,
|
|
224
|
+
):
|
|
225
|
+
|
|
226
|
+
/** A named group of the resolved spec. */
|
|
227
|
+
def set(setname: String): Json = spec.get(setname)
|
|
228
|
+
|
|
229
|
+
/** Run one set of test entries. */
|
|
230
|
+
def runset(testspec: Json, testsubject: Option[Subject] = None): Unit =
|
|
231
|
+
runsetflags(testspec, Flags(), testsubject)
|
|
232
|
+
|
|
233
|
+
/** Run one set of test entries with flags. */
|
|
234
|
+
def runsetflags(testspec: Json, flags: Flags, testsubject: Option[Subject] = None): Unit =
|
|
235
|
+
drive(testspec, flags, testsubject, None)
|
|
236
|
+
|
|
237
|
+
/** Everything [[runsetflags]] does, for a subject that may replace its
|
|
238
|
+
* arguments. See [[SubjectArgs]].
|
|
239
|
+
*/
|
|
240
|
+
def runsetflagsargs(testspec: Json, flags: Flags, argsubject: SubjectArgs): Unit =
|
|
241
|
+
drive(testspec, flags, None, Some(argsubject))
|
|
242
|
+
|
|
243
|
+
private def drive(
|
|
244
|
+
testspec: Json,
|
|
245
|
+
flags: Flags,
|
|
246
|
+
testsubject: Option[Subject],
|
|
247
|
+
argsubject: Option[SubjectArgs],
|
|
248
|
+
): Unit =
|
|
249
|
+
val label = flags.name.getOrElse(if name.isEmpty then "set" else name)
|
|
250
|
+
|
|
251
|
+
val usesubject = argsubject match
|
|
252
|
+
case Some(_) => None
|
|
253
|
+
case None =>
|
|
254
|
+
Some(testsubject.orElse(subject).getOrElse {
|
|
255
|
+
throw OmniError(s"omni: no test subject for: $label")
|
|
256
|
+
})
|
|
257
|
+
|
|
258
|
+
val testspecmap = Runner.fixjson(testspec, flags.nulls)
|
|
259
|
+
val testset = testspecmap.get("set").aslist.getOrElse {
|
|
260
|
+
throw OmniError(s"omni: test spec has no set: $label")
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Validated against the AUTHORED group (testspec, not testspecmap) -
|
|
264
|
+
// null-normalisation above would otherwise hide an authored null from
|
|
265
|
+
// checkentry. A malformed spec fails here, before any subject runs.
|
|
266
|
+
if 1 <= specversion then
|
|
267
|
+
checkset(label, testspec, testset)
|
|
268
|
+
|
|
269
|
+
for (rawentry, index) <- testset.zipWithIndex do
|
|
270
|
+
if !rawentry.ismap then
|
|
271
|
+
throw OmniError(s"omni: $label[$index]: entry is not a map")
|
|
272
|
+
|
|
273
|
+
var entry = rawentry
|
|
274
|
+
|
|
275
|
+
// An entry with no `out` expects a null (or absent) result.
|
|
276
|
+
if flags.nulls && entry.get("out").isnone then
|
|
277
|
+
entry = entry.set("out", Json.str(NULLMARK))
|
|
278
|
+
|
|
279
|
+
var entrysubject = usesubject
|
|
280
|
+
var entryclient = client
|
|
281
|
+
|
|
282
|
+
entry.get("client").asstr.foreach { clientname =>
|
|
283
|
+
val found = clients.getOrElse(
|
|
284
|
+
clientname,
|
|
285
|
+
throw OmniError(s"omni: unknown client: $clientname", entry),
|
|
286
|
+
)
|
|
287
|
+
entryclient = found
|
|
288
|
+
if entrysubject.isDefined then
|
|
289
|
+
found.subject.flatMap(_(name)).foreach { clientsubject =>
|
|
290
|
+
entrysubject = Some(clientsubject)
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
val (args, withctx) = resolveargs(entry, entryclient)
|
|
295
|
+
entry = withctx
|
|
296
|
+
|
|
297
|
+
try
|
|
298
|
+
// An args-subject returns its arguments alongside the result, so
|
|
299
|
+
// `match.args` sees what the subject actually did with them.
|
|
300
|
+
val (callargs, rawres) = (argsubject, entrysubject) match
|
|
301
|
+
case (Some(call), _) => call(args)
|
|
302
|
+
case (None, Some(call)) => (args, call(args))
|
|
303
|
+
case (None, None) => throw OmniError(s"omni: no test subject for: $label")
|
|
304
|
+
val res = Runner.fixjson(rawres, flags.nulls)
|
|
305
|
+
entry = entry.set("res", res)
|
|
306
|
+
checkresult(label, index, entry, callargs, res)
|
|
307
|
+
catch
|
|
308
|
+
case omnierr: OmniError => throw omnierr
|
|
309
|
+
case NonFatal(err) => handleerror(label, index, entry, err)
|
|
310
|
+
|
|
311
|
+
// Build the argument list: `ctx`, `args`, or `in`. `entryclient` is the
|
|
312
|
+
// provider resolved for this entry (the root provider, or its own
|
|
313
|
+
// `client:` override) - always set by the time this runs.
|
|
314
|
+
private def resolveargs(entry: Json, entryclient: Provider): (List[Json], Json) =
|
|
315
|
+
val hasctx = entry.has("ctx")
|
|
316
|
+
val hasargs = entry.has("args")
|
|
317
|
+
|
|
318
|
+
var args =
|
|
319
|
+
if hasctx then List(entry.get("ctx"))
|
|
320
|
+
else if hasargs then entry.get("args").aslist.getOrElse(List(entry.get("args")))
|
|
321
|
+
else List(entry.get("in"))
|
|
322
|
+
|
|
323
|
+
var out = entry
|
|
324
|
+
|
|
325
|
+
if (hasctx || hasargs) && args.nonEmpty && args.head.ismap then
|
|
326
|
+
var first = args.head
|
|
327
|
+
client.contextify.foreach { contextify => first = contextify(first) }
|
|
328
|
+
|
|
329
|
+
// The resolved client is a live Provider (closures over the system
|
|
330
|
+
// under test), and this port's Json is a closed value model with no
|
|
331
|
+
// host-object variant to hold one - so canonical's
|
|
332
|
+
// `first.client = testpack.client` becomes presence, not identity:
|
|
333
|
+
// enough for a subject to prove the runner attached a client at
|
|
334
|
+
// all. `entryclient` is always set by the caller, so the marker is
|
|
335
|
+
// unconditional once we get here.
|
|
336
|
+
if first.ismap then first = first.set("client", Json.Bool(true))
|
|
337
|
+
|
|
338
|
+
args = first :: args.tail
|
|
339
|
+
out = out.set("ctx", first)
|
|
340
|
+
|
|
341
|
+
(args, out)
|
|
342
|
+
|
|
343
|
+
// Validate a version-1 group up front, against the AUTHORED entries -
|
|
344
|
+
// null-normalisation would otherwise rewrite an authored null (e.g.
|
|
345
|
+
// id: null) into a sentinel string and hide it from validation. A
|
|
346
|
+
// malformed spec is a spec error, not a test result, so it fails before
|
|
347
|
+
// any subject runs.
|
|
348
|
+
private def checkset(label: String, testspec: Json, normalset: List[Json]): Unit =
|
|
349
|
+
val origset = testspec.get("set").aslist.getOrElse(normalset)
|
|
350
|
+
|
|
351
|
+
val markedempty = testspec.get("empty") match
|
|
352
|
+
case Json.Bool(true) => true
|
|
353
|
+
case _ => false
|
|
354
|
+
|
|
355
|
+
if origset.isEmpty && !markedempty then
|
|
356
|
+
throw OmniError(s"omni: empty test set: $label")
|
|
357
|
+
|
|
358
|
+
for (entry, index) <- origset.zipWithIndex do
|
|
359
|
+
checkentry(label, index, entry)
|
|
360
|
+
|
|
361
|
+
// Strict entry validation, applied when the spec declares version 1 or
|
|
362
|
+
// later. The lenient format converts each of these mistakes into a
|
|
363
|
+
// silent pass or a dead field; here they fail with the entry named.
|
|
364
|
+
private def checkentry(label: String, index: Int, entry: Json): Unit =
|
|
365
|
+
if !entry.ismap then throw fail(label, index, entry, "entry is not a map")
|
|
366
|
+
|
|
367
|
+
for key <- entry.asmap.get.keys do
|
|
368
|
+
if !ENTRYFIELDS.contains(key) then
|
|
369
|
+
throw fail(label, index, entry, s"unknown entry field: $key")
|
|
370
|
+
|
|
371
|
+
val argsources = List("in", "args", "ctx").count(entry.has)
|
|
372
|
+
if 1 < argsources then
|
|
373
|
+
throw fail(label, index, entry, "entry has more than one of in, args, ctx")
|
|
374
|
+
|
|
375
|
+
if !entry.get("err").isnone && entry.has("out") then
|
|
376
|
+
throw fail(label, index, entry, "entry has both err and out")
|
|
377
|
+
|
|
378
|
+
if entry.has("id") && entry.get("id").asstr.isEmpty then
|
|
379
|
+
throw fail(label, index, entry, "entry id is not a string")
|
|
380
|
+
|
|
381
|
+
private def checkresult(
|
|
382
|
+
label: String,
|
|
383
|
+
index: Int,
|
|
384
|
+
entry: Json,
|
|
385
|
+
args: List[Json],
|
|
386
|
+
res: Json,
|
|
387
|
+
): Unit =
|
|
388
|
+
var matched = false
|
|
389
|
+
|
|
390
|
+
val entryerr = entry.get("err")
|
|
391
|
+
if !entryerr.isnone then
|
|
392
|
+
throw fail(
|
|
393
|
+
label, index, entry, "expected error did not occur",
|
|
394
|
+
Some(stringify(entryerr)), Some(stringify(res)),
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
val check = entry.get("match")
|
|
398
|
+
if !check.isnone then
|
|
399
|
+
val base = Json.map(
|
|
400
|
+
"in" -> entry.get("in"),
|
|
401
|
+
"args" -> Json.JList(args),
|
|
402
|
+
"out" -> entry.get("res"),
|
|
403
|
+
"ctx" -> entry.get("ctx"),
|
|
404
|
+
)
|
|
405
|
+
matchcheck(label, index, entry, check, base)
|
|
406
|
+
matched = true
|
|
407
|
+
|
|
408
|
+
val out = entry.get("out")
|
|
409
|
+
|
|
410
|
+
if deepequal(res, out) then return
|
|
411
|
+
|
|
412
|
+
// NOTE: a match with no explicit out is a complete check on its own.
|
|
413
|
+
if matched && (out.isnone || out.asstr.contains(NULLMARK)) then return
|
|
414
|
+
|
|
415
|
+
throw fail(label, index, entry, "result mismatch", Some(stringify(out)), Some(stringify(res)))
|
|
416
|
+
|
|
417
|
+
/** The error base a `match.err` sees: the provider's own, when it has one. */
|
|
418
|
+
private def errbase(err: Throwable): Json =
|
|
419
|
+
client.errify match
|
|
420
|
+
case Some(hook) => hook(err)
|
|
421
|
+
case None => Runner.errify(err)
|
|
422
|
+
|
|
423
|
+
private def handleerror(label: String, index: Int, entry: Json, err: Throwable): Unit =
|
|
424
|
+
val entryerr = entry.get("err")
|
|
425
|
+
|
|
426
|
+
if !entryerr.isnone then
|
|
427
|
+
val istrue = entryerr match
|
|
428
|
+
case Json.Bool(true) => true
|
|
429
|
+
case _ => false
|
|
430
|
+
|
|
431
|
+
if istrue || Runner.matchval(entryerr, Json.str(Runner.errmessage(err))) then
|
|
432
|
+
val check = entry.get("match")
|
|
433
|
+
if !check.isnone then
|
|
434
|
+
val base = Json.map(
|
|
435
|
+
"in" -> entry.get("in"),
|
|
436
|
+
"out" -> entry.get("res"),
|
|
437
|
+
"ctx" -> entry.get("ctx"),
|
|
438
|
+
"err" -> errbase(err),
|
|
439
|
+
)
|
|
440
|
+
matchcheck(label, index, entry, check, base)
|
|
441
|
+
return
|
|
442
|
+
|
|
443
|
+
throw fail(
|
|
444
|
+
label, index, entry, "error mismatch",
|
|
445
|
+
Some(stringify(entryerr)), Some(Runner.errmessage(err)),
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
throw fail(label, index, entry, "unexpected error", None, Some(Runner.errmessage(err)))
|
|
449
|
+
|
|
450
|
+
// Check that every leaf of `check` is present, and matches, in `base`.
|
|
451
|
+
private def matchcheck(
|
|
452
|
+
label: String,
|
|
453
|
+
index: Int,
|
|
454
|
+
entry: Json,
|
|
455
|
+
check: Json,
|
|
456
|
+
base: Json,
|
|
457
|
+
path: List[String] = List(),
|
|
458
|
+
): Unit =
|
|
459
|
+
val where = if path.isEmpty then "<root>" else pathify(path)
|
|
460
|
+
|
|
461
|
+
check match
|
|
462
|
+
case Json.JList(entries) =>
|
|
463
|
+
for (subcheck, at) <- entries.zipWithIndex do
|
|
464
|
+
matchcheck(label, index, entry, subcheck, base, path :+ at.toString)
|
|
465
|
+
|
|
466
|
+
case Json.JMap(entries) =>
|
|
467
|
+
for (key, subcheck) <- entries do
|
|
468
|
+
matchcheck(label, index, entry, subcheck, base, path :+ key)
|
|
469
|
+
|
|
470
|
+
case leaf =>
|
|
471
|
+
val baseval = getpath(base, path)
|
|
472
|
+
|
|
473
|
+
// The sentinels are tested BEFORE the identity check below.
|
|
474
|
+
// Otherwise a subject returning the literal string "__UNDEF__"
|
|
475
|
+
// satisfies an assertion that the key is absent - two mutually
|
|
476
|
+
// exclusive states passing one check. A sentinel that accepts its
|
|
477
|
+
// own literal is not a sentinel. (NULLMARK still accepts NULLMARK:
|
|
478
|
+
// under the default null flag a real null has already been
|
|
479
|
+
// normalised to it, so the two are genuinely indistinguishable here
|
|
480
|
+
// - that one needs a raw-value escape, not an ordering change.)
|
|
481
|
+
|
|
482
|
+
// Explicitly absent: satisfied only by a genuinely missing key,
|
|
483
|
+
// never by a present null (the distinction the sentinels exist to
|
|
484
|
+
// keep).
|
|
485
|
+
if leaf.asstr.contains(UNDEFMARK) then
|
|
486
|
+
if !baseval.isabsent then
|
|
487
|
+
throw fail(
|
|
488
|
+
label, index, entry, s"expected absent at $where",
|
|
489
|
+
Some("absent"), Some(stringify(baseval)),
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
// Explicitly null: satisfied only by a present null.
|
|
493
|
+
else if leaf.asstr.contains(NULLMARK) then
|
|
494
|
+
if !(baseval.isnull || baseval.asstr.contains(NULLMARK)) then
|
|
495
|
+
throw fail(
|
|
496
|
+
label, index, entry, s"expected null at $where",
|
|
497
|
+
Some("null"), Some(stringify(baseval)),
|
|
498
|
+
)
|
|
499
|
+
|
|
500
|
+
// Explicitly present: any present value, including null.
|
|
501
|
+
else if leaf.asstr.contains(EXISTSMARK) then
|
|
502
|
+
if baseval.isabsent then
|
|
503
|
+
throw fail(
|
|
504
|
+
label, index, entry, s"expected present at $where",
|
|
505
|
+
Some("present"), Some("absent"),
|
|
506
|
+
)
|
|
507
|
+
|
|
508
|
+
// Identical values match. This sits below the sentinel branches on
|
|
509
|
+
// purpose - see the note above.
|
|
510
|
+
else if deepequal(leaf, baseval) then ()
|
|
511
|
+
|
|
512
|
+
// A concrete expectation never matches a missing key - a match leaf
|
|
513
|
+
// against an absent value must fail, not substring-match
|
|
514
|
+
// "undefined".
|
|
515
|
+
else if baseval.isabsent then
|
|
516
|
+
throw fail(
|
|
517
|
+
label, index, entry, s"match failed at $where",
|
|
518
|
+
Some(stringify(leaf)), Some("absent"),
|
|
519
|
+
)
|
|
520
|
+
|
|
521
|
+
else if !Runner.matchval(leaf, baseval) then
|
|
522
|
+
throw fail(
|
|
523
|
+
label, index, entry, s"match failed at $where",
|
|
524
|
+
Some(stringify(leaf)), Some(stringify(baseval)),
|
|
525
|
+
)
|
|
526
|
+
|
|
527
|
+
// The label of one entry, for failure messages.
|
|
528
|
+
private def entryref(label: String, index: Int, entry: Json): String =
|
|
529
|
+
val id = entry.get("id")
|
|
530
|
+
val idpart = if id.isabsent then "" else s" (${stringify(id)})"
|
|
531
|
+
s"$label[$index]$idpart"
|
|
532
|
+
|
|
533
|
+
private def fail(
|
|
534
|
+
label: String,
|
|
535
|
+
index: Int,
|
|
536
|
+
entry: Json,
|
|
537
|
+
reason: String,
|
|
538
|
+
expected: Option[String] = None,
|
|
539
|
+
actual: Option[String] = None,
|
|
540
|
+
): OmniError =
|
|
541
|
+
val msg = StringBuilder(s"omni: ${entryref(label, index, entry)}: $reason")
|
|
542
|
+
|
|
543
|
+
expected.foreach(text => msg.append(s"\n expected: $text"))
|
|
544
|
+
actual.foreach(text => msg.append(s"\n actual: $text"))
|
|
545
|
+
|
|
546
|
+
val summary = entry.asmap
|
|
547
|
+
.map(entries => entries.filterNot((key, _) => Set("res", "thrown", "ctx").contains(key)))
|
|
548
|
+
.getOrElse(ListMap.empty[String, Json])
|
|
549
|
+
|
|
550
|
+
msg.append(s"\n entry: ${stringify(Json.JMap(summary))}")
|
|
551
|
+
|
|
552
|
+
OmniError(msg.toString, entry)
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// VENDORED: @voxgig/omni sdk-20260904-1610-0 (scala/src/Util.scala)
|
|
2
|
+
// Source: https://github.com/voxgig/omni @ 8c3e1b573a8d35796f7fc45e3226b977023cabf7 [tag: sdk-20260904-1610-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
// Omni internal JSON utilities.
|
|
5
|
+
//
|
|
6
|
+
// Self-contained by design: the omni runner must be able to test *any*
|
|
7
|
+
// library, including libraries that provide these same operations.
|
|
8
|
+
|
|
9
|
+
package voxgig.omni
|
|
10
|
+
|
|
11
|
+
import scala.collection.immutable.ListMap
|
|
12
|
+
|
|
13
|
+
val NULLMARK = "__NULL__" // Value is JSON null.
|
|
14
|
+
val UNDEFMARK = "__UNDEF__" // Value is not present.
|
|
15
|
+
val EXISTSMARK = "__EXISTS__" // Value exists (not undefined).
|
|
16
|
+
|
|
17
|
+
object Util:
|
|
18
|
+
|
|
19
|
+
/** Deep copy a JSON value (the value model is immutable). */
|
|
20
|
+
def clone(value: Json): Json = value
|
|
21
|
+
|
|
22
|
+
/** Read a value by path. Returns Absent when any step is missing. */
|
|
23
|
+
def getpath(value: Json, path: List[String]): Json = path match
|
|
24
|
+
case Nil => value
|
|
25
|
+
case part :: rest =>
|
|
26
|
+
val next = value match
|
|
27
|
+
case Json.JList(entries) =>
|
|
28
|
+
part.toIntOption.filter(index => 0 <= index && index < entries.length) match
|
|
29
|
+
case Some(index) => entries(index)
|
|
30
|
+
case None => Json.Absent
|
|
31
|
+
case Json.JMap(entries) => entries.getOrElse(part, Json.Absent)
|
|
32
|
+
case _ => Json.Absent
|
|
33
|
+
|
|
34
|
+
if next.isabsent then Json.Absent else getpath(next, rest)
|
|
35
|
+
|
|
36
|
+
/** Depth-first walk: children first, then the containing node. */
|
|
37
|
+
def walk(value: Json, apply: (Json, List[String]) => Json, path: List[String] = List()): Json =
|
|
38
|
+
val next = value match
|
|
39
|
+
case Json.JList(entries) =>
|
|
40
|
+
Json.JList(entries.zipWithIndex.map { (entry, index) =>
|
|
41
|
+
walk(entry, apply, path :+ index.toString)
|
|
42
|
+
})
|
|
43
|
+
case Json.JMap(entries) =>
|
|
44
|
+
Json.JMap(ListMap.from(entries.map { (key, entry) => (key, walk(entry, apply, path :+ key)) }))
|
|
45
|
+
case other => other
|
|
46
|
+
|
|
47
|
+
apply(next, path)
|
|
48
|
+
|
|
49
|
+
/** Deep structural equality: numbers by value, bools never numbers. */
|
|
50
|
+
def deepequal(a: Json, b: Json): Boolean = (a, b) match
|
|
51
|
+
case (Json.Absent, Json.Absent) => true
|
|
52
|
+
case (Json.Null, Json.Null) => true
|
|
53
|
+
case (Json.Bool(x), Json.Bool(y)) => x == y
|
|
54
|
+
case (Json.Num(x), Json.Num(y)) => x == y || (x.isNaN && y.isNaN)
|
|
55
|
+
case (Json.Str(x), Json.Str(y)) => x == y
|
|
56
|
+
case (Json.JList(x), Json.JList(y)) =>
|
|
57
|
+
x.length == y.length && x.zip(y).forall((xe, ye) => deepequal(xe, ye))
|
|
58
|
+
case (Json.JMap(x), Json.JMap(y)) =>
|
|
59
|
+
x.size == y.size && x.forall((key, entry) => y.get(key).exists(deepequal(entry, _)))
|
|
60
|
+
case _ => false
|
|
61
|
+
|
|
62
|
+
/** Render a number the same way in every port: 5.0 prints as 5. */
|
|
63
|
+
def numstr(value: Double): String =
|
|
64
|
+
if value.isNaN || value.isInfinite then "null"
|
|
65
|
+
else if value == value.toLong.toDouble && math.abs(value) < 9007199254740992.0 then
|
|
66
|
+
value.toLong.toString
|
|
67
|
+
else value.toString
|
|
68
|
+
|
|
69
|
+
/** Render a string as a JSON string literal. */
|
|
70
|
+
def quote(value: String): String =
|
|
71
|
+
val out = StringBuilder("\"")
|
|
72
|
+
|
|
73
|
+
for ch <- value do
|
|
74
|
+
ch match
|
|
75
|
+
case '"' => out.append("\\\"")
|
|
76
|
+
case '\\' => out.append("\\\\")
|
|
77
|
+
case '\n' => out.append("\\n")
|
|
78
|
+
case '\r' => out.append("\\r")
|
|
79
|
+
case '\t' => out.append("\\t")
|
|
80
|
+
case _ =>
|
|
81
|
+
if ch < 0x20 then out.append("\\u%04x".format(ch.toInt))
|
|
82
|
+
else out.append(ch)
|
|
83
|
+
|
|
84
|
+
out.append('"').toString
|
|
85
|
+
|
|
86
|
+
/** Compact JSON text with map keys sorted, identical in every port. */
|
|
87
|
+
def jsonstr(value: Json): String = value match
|
|
88
|
+
case Json.Absent => "undefined"
|
|
89
|
+
case Json.Null => "null"
|
|
90
|
+
case Json.Bool(flag) => if flag then "true" else "false"
|
|
91
|
+
case Json.Num(entry) => numstr(entry)
|
|
92
|
+
case Json.Str(text) => quote(text)
|
|
93
|
+
case Json.JList(entries) => "[" + entries.map(jsonstr).mkString(",") + "]"
|
|
94
|
+
case Json.JMap(entries) =>
|
|
95
|
+
"{" + entries.keys.toList.sorted.map(key => quote(key) + ":" + jsonstr(entries(key)))
|
|
96
|
+
.mkString(",") + "}"
|
|
97
|
+
|
|
98
|
+
/** Strings verbatim, everything else as compact JSON. */
|
|
99
|
+
def stringify(value: Json): String = value match
|
|
100
|
+
case Json.Str(text) => text
|
|
101
|
+
case other => jsonstr(other)
|
|
102
|
+
|
|
103
|
+
/** Render a path as a dotted string. */
|
|
104
|
+
def pathify(path: List[String]): String = path.mkString(".")
|
|
@@ -15,6 +15,16 @@ public let MODENAME: [Int: String] = [
|
|
|
15
15
|
M_VAL: "val",
|
|
16
16
|
]
|
|
17
17
|
|
|
18
|
+
// The names a PLACEMENT error uses. Distinct from MODENAME: canonical
|
|
19
|
+
// (typescript/src/StructUtility.ts PLACEMENT) calls M_VAL "value" and BOTH
|
|
20
|
+
// key modes just "key", and the corpus pins that wording through
|
|
21
|
+
// transform.apply.
|
|
22
|
+
public let PLACEMENT: [Int: String] = [
|
|
23
|
+
M_KEYPRE: "key",
|
|
24
|
+
M_KEYPOST: "key",
|
|
25
|
+
M_VAL: "value",
|
|
26
|
+
]
|
|
27
|
+
|
|
18
28
|
// MARK: - Backtick-quoted command names
|
|
19
29
|
|
|
20
30
|
public let S_BKEY = "`$KEY`"
|