@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
|
@@ -111,6 +111,12 @@ public func inject(_ val: Value, _ store: Value, _ injdef: Injection? = nil) ->
|
|
|
111
111
|
if !idef.extra.isNoval { root.extra = idef.extra }
|
|
112
112
|
if !idef.meta.entries.isEmpty { root.meta = idef.meta }
|
|
113
113
|
if !idef.errs.items.isEmpty { root.errs = idef.errs }
|
|
114
|
+
// The caller's HANDLER, which canonical carries here too
|
|
115
|
+
// (typescript/src/StructUtility.ts inject). Dropping it made
|
|
116
|
+
// `validate`'s own `_validatehandler` dead code in every run, so the
|
|
117
|
+
// meta-path forms `q0$=x1` / `q0$~x1` never became the $EXACT / loose
|
|
118
|
+
// checks they name - the corpus pins it through validate.special.
|
|
119
|
+
root.handler = idef.handler
|
|
114
120
|
// Caller-provided meta/errs override above.
|
|
115
121
|
}
|
|
116
122
|
inj = root
|
|
@@ -184,21 +190,29 @@ public func inject(_ val: Value, _ store: Value, _ injdef: Injection? = nil) ->
|
|
|
184
190
|
public func checkPlacement(_ modes: Int, _ name: String, _ parentTypes: Int, _ inj: Injection)
|
|
185
191
|
-> Bool
|
|
186
192
|
{
|
|
193
|
+
// The canonical messages, verbatim (typescript/src/StructUtility.ts
|
|
194
|
+
// checkPlacement): PLACEMENT names, KEYPRE/KEYPOST/VAL order, the type
|
|
195
|
+
// expected of the parent, and the closing period. The corpus pins all
|
|
196
|
+
// four through transform.apply, whose err entries the silent-pass inline
|
|
197
|
+
// runner used to skip.
|
|
187
198
|
if (modes & inj.mode) == 0 {
|
|
188
|
-
let allowed = [M_KEYPRE,
|
|
199
|
+
let allowed = [M_KEYPRE, M_KEYPOST, M_VAL]
|
|
189
200
|
.filter { (modes & $0) != 0 }
|
|
190
|
-
.compactMap {
|
|
201
|
+
.compactMap { PLACEMENT[$0] }
|
|
191
202
|
.joined(separator: ",")
|
|
192
203
|
inj.errs.items.append(
|
|
193
204
|
.string(
|
|
194
|
-
"$\(name): invalid placement as " + (
|
|
205
|
+
"$\(name): invalid placement as " + (PLACEMENT[inj.mode] ?? "?")
|
|
206
|
+
+ ", expected: " + allowed + "."))
|
|
195
207
|
return false
|
|
196
208
|
}
|
|
197
209
|
if parentTypes != 0 {
|
|
198
210
|
let ptype = typify(inj.parent)
|
|
199
211
|
if (parentTypes & ptype) == 0 {
|
|
200
212
|
inj.errs.items.append(
|
|
201
|
-
.string(
|
|
213
|
+
.string(
|
|
214
|
+
"$\(name): invalid placement in parent " + typename(ptype)
|
|
215
|
+
+ ", expected: " + typename(parentTypes) + "."))
|
|
202
216
|
return false
|
|
203
217
|
}
|
|
204
218
|
}
|
|
@@ -213,7 +227,16 @@ public func injectorArgs(_ types: [Int], _ args: Value) -> (Value, [Value]) {
|
|
|
213
227
|
let arg = i < l.items.count ? l.items[i] : Value.noval
|
|
214
228
|
let atype = typify(arg)
|
|
215
229
|
if expected != T_any && (expected & atype) == 0 {
|
|
216
|
-
|
|
230
|
+
// The canonical message, verbatim (typescript/src/StructUtility.ts
|
|
231
|
+
// injectorArgs): the offending VALUE, its type, its 1-based position
|
|
232
|
+
// and the type expected. The corpus pins it through transform.apply,
|
|
233
|
+
// whose err entries the silent-pass inline runner used to skip.
|
|
234
|
+
return (
|
|
235
|
+
.string(
|
|
236
|
+
"invalid argument: " + stringify(arg, 22) + " (" + typename(atype)
|
|
237
|
+
+ " at position " + String(1 + i) + ") is not of type: "
|
|
238
|
+
+ typename(expected) + "."),
|
|
239
|
+
l.items)
|
|
217
240
|
}
|
|
218
241
|
out.append(arg)
|
|
219
242
|
}
|
|
@@ -89,7 +89,11 @@ public final class Injection: @unchecked Sendable {
|
|
|
89
89
|
// higher ancestor when |ancestor| >= 2). NONE deletes the slot.
|
|
90
90
|
@discardableResult
|
|
91
91
|
public func setval(_ v: Value, ancestor: Int = 0) -> Value {
|
|
92
|
-
|
|
92
|
+
// Canonical is `if (null == ancestor || ancestor < 2)`, so a NEGATIVE
|
|
93
|
+
// ancestor takes the parent branch. Taking abs() first sent
|
|
94
|
+
// validate_ONE's `setval(vcurrent, -2)` up two nodes instead, writing
|
|
95
|
+
// the match back over the wrong slot ($TOP leaked into the result).
|
|
96
|
+
let absAnc = ancestor
|
|
93
97
|
if absAnc < 2 {
|
|
94
98
|
if v.isNoval {
|
|
95
99
|
parent = delprop(parent, .string(key))
|
|
@@ -596,6 +596,9 @@ extension JSON {
|
|
|
596
596
|
if d == d.rounded() && abs(d) < 1e16 {
|
|
597
597
|
return String(Int64(d))
|
|
598
598
|
}
|
|
599
|
-
|
|
599
|
+
// Shortest round-trip, which is what canonical's `String(n)` gives.
|
|
600
|
+
// "%.17g" rendered 4.4 as "4.4000000000000004"; the corpus pins the
|
|
601
|
+
// canonical spelling through validate.basic's decimal type error.
|
|
602
|
+
return String(d)
|
|
600
603
|
}
|
|
601
604
|
}
|
|
@@ -9,11 +9,17 @@ import Foundation
|
|
|
9
9
|
private func invalidTypeMsg(
|
|
10
10
|
_ path: [String], _ needtype: String, _ vt: Int, _ v: Value, _ whence: String
|
|
11
11
|
) -> String {
|
|
12
|
-
|
|
12
|
+
// Canonical is `null == v`, which in JS is TRUE for a JSON null as well
|
|
13
|
+
// as for undefined - both render as "no value", with no type prefix. The
|
|
14
|
+
// corpus pins it through validate.invalid ("Expected string, but found
|
|
15
|
+
// no value." for `data: null`), whose err entries the silent-pass inline
|
|
16
|
+
// runner used to skip.
|
|
17
|
+
let novalue = v.isNoval || v.isNull
|
|
18
|
+
let vs = novalue ? "no value" : stringify(v)
|
|
13
19
|
let field =
|
|
14
20
|
path.count > 1
|
|
15
21
|
? "field " + pathify(.list(VList(path.map { Value.string($0) })), 1) + " to be " : ""
|
|
16
|
-
let extra =
|
|
22
|
+
let extra = novalue ? "" : typename(vt) + S_VIZ
|
|
17
23
|
return "Expected " + field + needtype + ", but found " + extra + vs + "."
|
|
18
24
|
}
|
|
19
25
|
|
|
@@ -144,9 +150,13 @@ public func validate_ONE(_ inj: Injection, _ val: Value, _ ref: String, _ store:
|
|
|
144
150
|
}
|
|
145
151
|
inj.keyI = inj.keys.count
|
|
146
152
|
inj.setval(inj.dparent, ancestor: 2)
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
153
|
+
// Canonical is `inj.path = slice(inj.path, -1)`, which in struct's own
|
|
154
|
+
// slice means DROP THE LAST element (start<0 => end = len+start,
|
|
155
|
+
// start = 0) - not "keep the last". Dropping the FIRST instead named
|
|
156
|
+
// the wrong field in every $ONE failure ("field 0" for "field x0");
|
|
157
|
+
// the corpus pins it through validate.one, whose err entries the
|
|
158
|
+
// silent-pass inline runner used to skip.
|
|
159
|
+
inj.path = Array(inj.path.dropLast())
|
|
150
160
|
inj.key = inj.path.last ?? ""
|
|
151
161
|
let tvals = slice(parent, 1)
|
|
152
162
|
guard case .list(let tl) = tvals else { return .noval }
|
|
@@ -22,7 +22,12 @@ func prepareMethodUtil(_ ctx: Context) -> String {
|
|
|
22
22
|
return pm.uppercased()
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
// No default: an op name outside the convention resolves to NO method,
|
|
26
|
+
// exactly as the ts reference (`methodMap[key]` is undefined there) and
|
|
27
|
+
// go's "" spelling of the same no-value. The silent-pass inline runner
|
|
28
|
+
// hid a stray "GET" fallback here; the shared corpus (prepareMethod,
|
|
29
|
+
// opname "bad" -> null) pins it now.
|
|
30
|
+
return methodMap[opname] ?? ""
|
|
26
31
|
}
|
|
27
32
|
|
|
28
33
|
func preparePathUtil(_ ctx: Context) -> String {
|
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
// The corpus test runner: vendored @voxgig/omni driven through its NATIVE
|
|
2
|
+
// API (`Omni.makeRunner(specref, provider)` / `RunPack.runsetflagsargs`),
|
|
3
|
+
// presented to the corpus suites in the struct-runner shape they already
|
|
4
|
+
// use (`run.spec`, `run.runset`, `run.runsetflags`, `run.client`). No
|
|
5
|
+
// compat shim is vendored: the adapter below IS the whole bridge, per
|
|
6
|
+
// language, per the vendor-tag rollout (docs/design/vendor-tag-rollout.md,
|
|
7
|
+
// Decision 4). It is the Swift peer of tm/csharp/test/OmniResolver.cs and
|
|
8
|
+
// tm/java/test/OmniResolver.java.
|
|
9
|
+
//
|
|
10
|
+
// Swift-specific decisions, each load-bearing:
|
|
11
|
+
//
|
|
12
|
+
// 1. THE VENDORED PORT IS ITS OWN MODULE. `Omni` is a SwiftPM target over
|
|
13
|
+
// Tests/vendor/omni, not files folded into the test target: the port
|
|
14
|
+
// calls `Omni.errify` by module name, and its top-level `clone`,
|
|
15
|
+
// `getpath`, `walk`, `stringify` and `pathify` collide head-on with the
|
|
16
|
+
// struct utility's functions of the same names. A .testTarget (not a
|
|
17
|
+
// .target) keeps the engine out of `swift build`, so a consumer's
|
|
18
|
+
// library build never compiles the test runner. Nothing outside this
|
|
19
|
+
// file imports Omni - the corpus suites see `OmniSpec` and
|
|
20
|
+
// `OmniResolver.Subject`, both spelled in the SDK's own Value model -
|
|
21
|
+
// so the collisions stay contained to the one file that can qualify
|
|
22
|
+
// them.
|
|
23
|
+
//
|
|
24
|
+
// 2. CONTEXTS STAY MAPS ACROSS THE RUNNER. omni sets `entry.ctx` to the
|
|
25
|
+
// contextified args[0] and `match: {ctx: ...}` reads THROUGH it with
|
|
26
|
+
// omni's own getpath, which walks JSON maps only. A typed Context there
|
|
27
|
+
// would make every ctx assertion read "absent". So subjects receive the
|
|
28
|
+
// MAP (an SDK `VMap`), build the typed Context with
|
|
29
|
+
// `OmniResolver.omniCtx(args[0], ...)` at the call site, run the
|
|
30
|
+
// utility, and write the observable ctx state back into the same map
|
|
31
|
+
// with `omniSyncCtx` - the maps-plus-sync idiom go, java and csharp use
|
|
32
|
+
// for the same contract (omni#56).
|
|
33
|
+
//
|
|
34
|
+
// 3. `match: {ctx: ...}` IS RETARGETED ONTO `match: {args: {"0": ...}}`.
|
|
35
|
+
// This is the one place the Swift port cannot follow canonical omni as
|
|
36
|
+
// written, and it is a VALUE-SEMANTICS consequence, not a choice.
|
|
37
|
+
// omni's `Json` is an enum: `resolveargs` hands `entry.ctx` and
|
|
38
|
+
// `args[0]` two COPIES of the contextified map, so a subject's writes -
|
|
39
|
+
// decision 2's sync - can never reach the copy `entry.ctx` holds, and
|
|
40
|
+
// `checkresult` reads `entry.get("ctx")` for the ctx base. The port
|
|
41
|
+
// provides the channel for exactly this case: `runsetflagsargs` lets a
|
|
42
|
+
// subject RETURN its arguments, and `checkresult` builds the `args`
|
|
43
|
+
// base from what came back. args[0] IS the ctx of a ctx entry (omni
|
|
44
|
+
// itself sets `args = [entry.get("ctx")]`), so moving the assertion
|
|
45
|
+
// from `ctx` to `args.0` reads the SAME map, post-call, and preserves
|
|
46
|
+
// every leaf. `retargetctx` below does that rewrite on the spec handed
|
|
47
|
+
// to the engine; nothing is dropped, weakened, or skipped. PHP faces
|
|
48
|
+
// the same copy-on-write problem and answers it with reference slots
|
|
49
|
+
// (tm/php/test/Omni.php decision 2), which Swift's enum has no
|
|
50
|
+
// equivalent of. The upstream fix is for the Swift port's `drive` to
|
|
51
|
+
// re-point `entry.ctx` at the returned `callargs[0]`, the way JS object
|
|
52
|
+
// identity does it implicitly - filed as a follow-up, not worked around
|
|
53
|
+
// by editing a vendored file.
|
|
54
|
+
//
|
|
55
|
+
// 4. NUMBERS. omni's Json carries one numeric case (Double); the SDK's
|
|
56
|
+
// Value distinguishes `.int` from `.double`, and struct's own
|
|
57
|
+
// `stringify`/`jsonify` print them differently. An integral Double
|
|
58
|
+
// therefore becomes `.int`, which is exactly what struct's JSON parser
|
|
59
|
+
// does with the same text - the shared corpus carries no integral float
|
|
60
|
+
// literal, so the mapping is lossless over it.
|
|
61
|
+
//
|
|
62
|
+
// 5. ZERO-ARGUMENT ENTRIES. A corpus entry with no `in`/`args`/`ctx`
|
|
63
|
+
// means "call the subject with NO value". The vendored Swift port
|
|
64
|
+
// distinguishes that natively - such an entry arrives as one
|
|
65
|
+
// `Json.absent` - so Swift needs neither go's novalargs spec rewrite
|
|
66
|
+
// nor lua/php's compat shim. The ONE conversion is the sentinel swap at
|
|
67
|
+
// the call boundary: `.absent` -> `Value.noval` on the way in,
|
|
68
|
+
// `Value.noval` -> `.absent` on the way out, so `typify()` answers
|
|
69
|
+
// T_noval where a JSON null answers T_null.
|
|
70
|
+
//
|
|
71
|
+
// 6. THE VENDORED SWIFT PORT AT THIS TAG carries the omni#54 runner fixes
|
|
72
|
+
// that matter here: `matchcheck` reads its base directly (no clone) and
|
|
73
|
+
// tests the sentinels BEFORE the identity check. `jsonstr` has no cycle
|
|
74
|
+
// guard, which only bites on cyclic values - decision 2 keeps typed
|
|
75
|
+
// state (a Context, the SDK client) out of the maps the runner walks,
|
|
76
|
+
// and the live provider crosses as an opaque `.native` leaf, so every
|
|
77
|
+
// value the runner stringifies is acyclic.
|
|
78
|
+
|
|
79
|
+
import Foundation
|
|
80
|
+
import XCTest
|
|
81
|
+
import Omni
|
|
82
|
+
|
|
83
|
+
@testable import ProjectNameSdk
|
|
84
|
+
|
|
85
|
+
/// An omni spec node, in the engine's own value model. Opaque on purpose:
|
|
86
|
+
/// the corpus suites pass these around without importing Omni, whose
|
|
87
|
+
/// top-level `clone`/`getpath`/`walk`/`stringify`/`pathify` would collide
|
|
88
|
+
/// with the struct utility's (decision 1).
|
|
89
|
+
struct OmniSpec {
|
|
90
|
+
fileprivate let json: Omni.Json
|
|
91
|
+
|
|
92
|
+
fileprivate init(_ json: Omni.Json) { self.json = json }
|
|
93
|
+
|
|
94
|
+
/// A child node by key (absent when missing).
|
|
95
|
+
func get(_ key: String) -> OmniSpec { OmniSpec(json.get(key)) }
|
|
96
|
+
|
|
97
|
+
/// A child node by path.
|
|
98
|
+
func get(_ keys: [String]) -> OmniSpec {
|
|
99
|
+
var cur = json
|
|
100
|
+
for k in keys { cur = cur.get(k) }
|
|
101
|
+
return OmniSpec(cur)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
var isMap: Bool { json.ismap }
|
|
105
|
+
var isAbsent: Bool { json.isabsent }
|
|
106
|
+
|
|
107
|
+
/// The number of entries in this node's `set` list; nil when there is no
|
|
108
|
+
/// `set` at all. The corpus suites use it to refuse a section that would
|
|
109
|
+
/// run ZERO cases.
|
|
110
|
+
var setCount: Int? { json.get("set").aslist?.count }
|
|
111
|
+
|
|
112
|
+
/// This node in the SDK's own Value model (for DEF/setup reads).
|
|
113
|
+
var value: Value { OmniResolver.tovalue(json) }
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
enum OmniResolver {
|
|
117
|
+
|
|
118
|
+
// The sentinels, under the names the corpus suites already use.
|
|
119
|
+
static let NULLMARK = Omni.NULLMARK
|
|
120
|
+
static let UNDEFMARK = Omni.UNDEFMARK
|
|
121
|
+
static let EXISTSMARK = Omni.EXISTSMARK
|
|
122
|
+
|
|
123
|
+
/// The function under test, in omni's argument shape but the SDK's value
|
|
124
|
+
/// model. Failure is reported by throwing.
|
|
125
|
+
typealias Subject = ([Value]) throws -> Value
|
|
126
|
+
|
|
127
|
+
/// A struct-corpus subject: one value in, one value out.
|
|
128
|
+
typealias StructSubject = (Value) throws -> Value
|
|
129
|
+
|
|
130
|
+
// ------------------------------------------------------------------
|
|
131
|
+
// Errors
|
|
132
|
+
// ------------------------------------------------------------------
|
|
133
|
+
|
|
134
|
+
/// Did the engine itself fail an entry (as opposed to the subject
|
|
135
|
+
/// throwing)? The smoke test asserts on this; the corpus suites turn it
|
|
136
|
+
/// into an XCTFail carrying the entry.
|
|
137
|
+
static func isOmniError(_ err: Error) -> Bool { err is Omni.OmniError }
|
|
138
|
+
|
|
139
|
+
/// The message of any error, engine or subject.
|
|
140
|
+
static func message(_ err: Error) -> String { Omni.errmessage(err) }
|
|
141
|
+
|
|
142
|
+
/// A subject-side failure carrying a plain message. Used where the SDK's
|
|
143
|
+
/// own port collects diagnostics instead of raising (struct's validate).
|
|
144
|
+
struct SubjectError: Error, CustomStringConvertible {
|
|
145
|
+
let message: String
|
|
146
|
+
init(_ message: String) { self.message = message }
|
|
147
|
+
var description: String { message }
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ------------------------------------------------------------------
|
|
151
|
+
// Value model conversion (decisions 4 and 5)
|
|
152
|
+
// ------------------------------------------------------------------
|
|
153
|
+
|
|
154
|
+
/// omni's model -> the SDK's.
|
|
155
|
+
static func tovalue(_ j: Omni.Json) -> Value {
|
|
156
|
+
switch j {
|
|
157
|
+
case .absent: return .noval
|
|
158
|
+
case .null: return .null
|
|
159
|
+
case .bool(let b): return .bool(b)
|
|
160
|
+
case .num(let d):
|
|
161
|
+
if d == d.rounded(.towardZero), abs(d) < 9_007_199_254_740_992.0 {
|
|
162
|
+
return .int(Int64(d))
|
|
163
|
+
}
|
|
164
|
+
return .double(d)
|
|
165
|
+
case .str(let s): return .string(s)
|
|
166
|
+
case .list(let items): return .list(VList(items.map { tovalue($0) }))
|
|
167
|
+
case .map(let entries):
|
|
168
|
+
let m = VMap()
|
|
169
|
+
for (k, v) in entries { m.entries[k] = tovalue(v) }
|
|
170
|
+
return .map(m)
|
|
171
|
+
// The live provider omni attaches to a ctx map crosses as an opaque
|
|
172
|
+
// leaf, keeping object identity so omniCtx can resolve it back.
|
|
173
|
+
case .provider(let p): return .nat(p)
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/// The SDK's model -> omni's.
|
|
178
|
+
static func tojson(_ v: Value) -> Omni.Json {
|
|
179
|
+
switch v {
|
|
180
|
+
case .noval: return .absent
|
|
181
|
+
case .null: return .null
|
|
182
|
+
case .bool(let b): return .bool(b)
|
|
183
|
+
case .int(let n): return .num(Double(n))
|
|
184
|
+
case .double(let d): return .num(d)
|
|
185
|
+
case .string(let s): return .str(s)
|
|
186
|
+
case .list(let l): return .list(l.items.map { tojson($0) })
|
|
187
|
+
case .map(let m):
|
|
188
|
+
var out: [(String, Omni.Json)] = []
|
|
189
|
+
for (k, e) in m.entries { out.append((k, tojson(e))) }
|
|
190
|
+
return .map(out)
|
|
191
|
+
case .native(let ref):
|
|
192
|
+
if let p = ref.value as? Omni.Provider { return .provider(p) }
|
|
193
|
+
return .str("[native]")
|
|
194
|
+
case .function: return .str("[function]")
|
|
195
|
+
case .sentinel(let s): return .str(s.marker)
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ------------------------------------------------------------------
|
|
200
|
+
// Decision 3: retarget `match: {ctx: ...}` onto `match: {args: {"0": ...}}`
|
|
201
|
+
// ------------------------------------------------------------------
|
|
202
|
+
|
|
203
|
+
/// Rewrite every entry of a group so a ctx assertion reads the map the
|
|
204
|
+
/// subject actually wrote to. Only entries that HAVE a ctx (or args)
|
|
205
|
+
/// argument source are touched, and only when `match.args` is not
|
|
206
|
+
/// already spoken for - anything else is left exactly as authored, so an
|
|
207
|
+
/// unexpected shape fails loudly rather than being quietly rewritten.
|
|
208
|
+
fileprivate static func retargetctx(_ testspec: Omni.Json) -> Omni.Json {
|
|
209
|
+
guard let set = testspec.get("set").aslist else { return testspec }
|
|
210
|
+
|
|
211
|
+
var out: [Omni.Json] = []
|
|
212
|
+
for rawentry in set {
|
|
213
|
+
var entry = rawentry
|
|
214
|
+
let check = entry.get("match")
|
|
215
|
+
if entry.ismap, check.ismap, check.has("ctx"), !check.has("args"),
|
|
216
|
+
entry.has("ctx") || entry.has("args")
|
|
217
|
+
{
|
|
218
|
+
var newcheck = check
|
|
219
|
+
newcheck.set("args", Omni.Json.mapOf([("0", check.get("ctx"))]))
|
|
220
|
+
// Drop the original leaf: it would read the stale pre-call copy.
|
|
221
|
+
if case .map(let fields) = newcheck {
|
|
222
|
+
newcheck = .map(fields.filter { $0.0 != "ctx" })
|
|
223
|
+
}
|
|
224
|
+
entry.set("match", newcheck)
|
|
225
|
+
}
|
|
226
|
+
out.append(entry)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
var spec = testspec
|
|
230
|
+
spec.set("set", .list(out))
|
|
231
|
+
return spec
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ------------------------------------------------------------------
|
|
235
|
+
// Provider
|
|
236
|
+
// ------------------------------------------------------------------
|
|
237
|
+
|
|
238
|
+
// The live client behind each provider. A DEF.client entry builds a new
|
|
239
|
+
// SDK instance, and omniCtx resolves it back off the ctx map's `client`
|
|
240
|
+
// slot; only DEF-BUILT providers may override a call site's explicit
|
|
241
|
+
// client, because the base provider rides on every ctx entry.
|
|
242
|
+
private final class ProviderBox {
|
|
243
|
+
var clients: [ObjectIdentifier: ProjectNameSDK] = [:]
|
|
244
|
+
var defbuilt: Set<ObjectIdentifier> = []
|
|
245
|
+
let lock = NSLock()
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
private static let providers = ProviderBox()
|
|
249
|
+
|
|
250
|
+
private static func register(_ provider: Omni.Provider, _ client: ProjectNameSDK,
|
|
251
|
+
_ isdef: Bool)
|
|
252
|
+
{
|
|
253
|
+
providers.lock.lock()
|
|
254
|
+
defer { providers.lock.unlock() }
|
|
255
|
+
providers.clients[ObjectIdentifier(provider)] = client
|
|
256
|
+
if isdef { providers.defbuilt.insert(ObjectIdentifier(provider)) }
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
private static func defclient(_ provider: Omni.Provider) -> ProjectNameSDK? {
|
|
260
|
+
providers.lock.lock()
|
|
261
|
+
defer { providers.lock.unlock() }
|
|
262
|
+
let id = ObjectIdentifier(provider)
|
|
263
|
+
return providers.defbuilt.contains(id) ? providers.clients[id] : nil
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/// Wrap a live client as an omni provider (decisions 2 and 3).
|
|
267
|
+
private static func sdkProvider(_ client: ProjectNameSDK, _ isdef: Bool = false)
|
|
268
|
+
-> Omni.Provider
|
|
269
|
+
{
|
|
270
|
+
let provider = Omni.Provider()
|
|
271
|
+
|
|
272
|
+
// A DEF.client entry becomes another live test SDK, wrapped the same
|
|
273
|
+
// way and marked DEF-built so omniCtx resolves it back.
|
|
274
|
+
provider.client = { options in
|
|
275
|
+
let opts = tovalue(options).asMap ?? VMap()
|
|
276
|
+
return sdkProvider(ProjectNameSDK.testSDK(nil, opts), true)
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Client options may reference the runner store.
|
|
280
|
+
provider.inject = { options, store in
|
|
281
|
+
let o = tovalue(options)
|
|
282
|
+
_ = ProjectNameSdk.inject(o, tovalue(store))
|
|
283
|
+
return tojson(o)
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Keep the SDK error's code beside its message, so a corpus
|
|
287
|
+
// `match: {err: {code: ...}}` can assert on it.
|
|
288
|
+
provider.errify = { err in
|
|
289
|
+
if let sdkerr = err as? ProjectNameError {
|
|
290
|
+
var entries: [(String, Omni.Json)] = [
|
|
291
|
+
("name", .str("ProjectNameError")),
|
|
292
|
+
("message", .str(sdkerr.message)),
|
|
293
|
+
]
|
|
294
|
+
if !sdkerr.code.isEmpty { entries.append(("code", .str(sdkerr.code))) }
|
|
295
|
+
return .map(entries)
|
|
296
|
+
}
|
|
297
|
+
return Omni.errify(err)
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
register(provider, client, isdef)
|
|
301
|
+
|
|
302
|
+
return provider
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// ------------------------------------------------------------------
|
|
306
|
+
// Run
|
|
307
|
+
// ------------------------------------------------------------------
|
|
308
|
+
|
|
309
|
+
/// What the runner returns for one named spec section - the struct-runner
|
|
310
|
+
/// shape the corpus call sites consume.
|
|
311
|
+
final class Run {
|
|
312
|
+
/// The resolved section, in omni's model.
|
|
313
|
+
let spec: OmniSpec
|
|
314
|
+
/// The live SDK the provider wraps.
|
|
315
|
+
let client: ProjectNameSDK
|
|
316
|
+
|
|
317
|
+
private let pack: Omni.RunPack
|
|
318
|
+
|
|
319
|
+
fileprivate init(_ pack: Omni.RunPack, _ client: ProjectNameSDK) {
|
|
320
|
+
self.pack = pack
|
|
321
|
+
self.spec = OmniSpec(pack.spec)
|
|
322
|
+
self.client = client
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/// A named group of the resolved spec.
|
|
326
|
+
func set(_ name: String) -> OmniSpec { OmniSpec(pack.set(name)) }
|
|
327
|
+
|
|
328
|
+
/// Run one group with omni's default flags.
|
|
329
|
+
func runset(_ testspec: OmniSpec, _ subject: @escaping Subject) throws {
|
|
330
|
+
try runsetflags(testspec, true, subject)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/// Run one group with an explicit `null` flag.
|
|
334
|
+
func runsetflags(_ testspec: OmniSpec, _ nullFlag: Bool,
|
|
335
|
+
_ subject: @escaping Subject) throws
|
|
336
|
+
{
|
|
337
|
+
try pack.runsetflagsargs(
|
|
338
|
+
retargetctx(testspec.json), Omni.Flags(null: nullFlag),
|
|
339
|
+
{ jargs in
|
|
340
|
+
// Maps and lists become VMap/VList - reference types - so a
|
|
341
|
+
// subject's in-place writes (decision 2's omniSyncCtx, struct's
|
|
342
|
+
// setpath) are visible in what we hand back as `callargs`, which
|
|
343
|
+
// is where `match.args` reads (decision 3).
|
|
344
|
+
let vargs = jargs.map { tovalue($0) }
|
|
345
|
+
let res = try subject(vargs)
|
|
346
|
+
return (vargs.map { tojson($0) }, tojson(res))
|
|
347
|
+
})
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/// Resolves one named section of a loaded spec.
|
|
352
|
+
typealias NamedRunner = (String) -> Run
|
|
353
|
+
|
|
354
|
+
/// The struct runner's makeRunner(testfile, client) signature, backed by
|
|
355
|
+
/// vendored omni. `testfile` is a spec path (absolutized against the
|
|
356
|
+
/// working directory - omni's docs say a port must resolve the path
|
|
357
|
+
/// itself).
|
|
358
|
+
static func makeRunner(_ testfile: String, _ client: ProjectNameSDK) throws
|
|
359
|
+
-> NamedRunner
|
|
360
|
+
{
|
|
361
|
+
let path = testfile.hasPrefix("/")
|
|
362
|
+
? testfile
|
|
363
|
+
: URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
|
|
364
|
+
.appendingPathComponent(testfile).path
|
|
365
|
+
return try namedRunner(try Omni.makeRunner(path, sdkProvider(client)), client)
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/// The same, for an already-parsed spec (omni's own capability), which
|
|
369
|
+
/// keeps the smoke test free of fixture files.
|
|
370
|
+
static func makeRunner(_ spec: Value, _ client: ProjectNameSDK) throws
|
|
371
|
+
-> NamedRunner
|
|
372
|
+
{
|
|
373
|
+
return try namedRunner(try Omni.makeRunner(tojson(spec), sdkProvider(client)), client)
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
private static func namedRunner(_ runner: Omni.Runner, _ client: ProjectNameSDK)
|
|
377
|
+
-> NamedRunner
|
|
378
|
+
{
|
|
379
|
+
return { name in Run(runner.runner(name), client) }
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// ------------------------------------------------------------------
|
|
383
|
+
// Contexts (decision 2)
|
|
384
|
+
// ------------------------------------------------------------------
|
|
385
|
+
|
|
386
|
+
/// Build the typed Context a generated utility takes from the ctx MAP
|
|
387
|
+
/// omni handed the subject (args[0]). The map's `client` entry - an omni
|
|
388
|
+
/// provider when a DEF entry selected one - resolves back to the live SDK
|
|
389
|
+
/// it wraps; otherwise the given client is used.
|
|
390
|
+
static func omniCtx(_ arg: Value, _ client: ProjectNameSDK, _ utility: Utility)
|
|
391
|
+
-> Context
|
|
392
|
+
{
|
|
393
|
+
let ctxmap = arg.asMap ?? VMap()
|
|
394
|
+
|
|
395
|
+
var usec = client
|
|
396
|
+
var useu = utility
|
|
397
|
+
if let ref = ctxmap.entries["client"]?.asNative as? Omni.Provider,
|
|
398
|
+
let live = defclient(ref)
|
|
399
|
+
{
|
|
400
|
+
usec = live
|
|
401
|
+
useu = live.getUtility()
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
let ctx = SdkRunner.makeCtxFromMap(ctxmap, usec, useu)
|
|
405
|
+
SdkRunner.fixCtx(ctx, usec)
|
|
406
|
+
return ctx
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/// Write the OBSERVABLE state of a typed context back into the ctx map
|
|
410
|
+
/// the entry holds, which is where a `match: {ctx: ...}` assertion reads
|
|
411
|
+
/// (retargeted onto `match.args.0` - decision 3). The subject mutated the
|
|
412
|
+
/// typed context; the map is what the runner can walk.
|
|
413
|
+
static func omniSyncCtx(_ arg: Value, _ ctx: Context) {
|
|
414
|
+
guard let ctxmap = arg.asMap else { return }
|
|
415
|
+
|
|
416
|
+
if let spec = ctx.spec {
|
|
417
|
+
let m = VMap()
|
|
418
|
+
m.entries["base"] = .string(spec.base)
|
|
419
|
+
m.entries["prefix"] = .string(spec.prefix)
|
|
420
|
+
m.entries["suffix"] = .string(spec.suffix)
|
|
421
|
+
m.entries["path"] = .string(spec.path)
|
|
422
|
+
m.entries["method"] = .string(spec.method)
|
|
423
|
+
m.entries["params"] = .map(spec.params)
|
|
424
|
+
m.entries["query"] = .map(spec.query)
|
|
425
|
+
m.entries["headers"] = .map(spec.headers)
|
|
426
|
+
m.entries["step"] = .string(spec.step)
|
|
427
|
+
m.entries["alias"] = .map(spec.alias)
|
|
428
|
+
if !spec.body.isNoval { m.entries["body"] = spec.body }
|
|
429
|
+
if !spec.url.isEmpty { m.entries["url"] = .string(spec.url) }
|
|
430
|
+
ctxmap.entries["spec"] = .map(m)
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
if let result = ctx.result {
|
|
434
|
+
let m = VMap()
|
|
435
|
+
m.entries["ok"] = .bool(result.ok)
|
|
436
|
+
m.entries["status"] = .int(Int64(result.status))
|
|
437
|
+
m.entries["statusText"] = .string(result.statusText)
|
|
438
|
+
m.entries["headers"] = .map(result.headers)
|
|
439
|
+
if !result.body.isNoval { m.entries["body"] = result.body }
|
|
440
|
+
if let err = result.err {
|
|
441
|
+
let em = VMap()
|
|
442
|
+
em.entries["message"] = .string(errMessage(err))
|
|
443
|
+
m.entries["err"] = .map(em)
|
|
444
|
+
}
|
|
445
|
+
if !result.resdata.isNoval { m.entries["resdata"] = result.resdata }
|
|
446
|
+
if let rm = result.resmatch { m.entries["resmatch"] = .map(rm) }
|
|
447
|
+
ctxmap.entries["result"] = .map(m)
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// Presence, not content: the corpus asserts `response: "__EXISTS__"`.
|
|
451
|
+
// Written only when the subject really produced one, so the assertion
|
|
452
|
+
// still fails when it did not.
|
|
453
|
+
if ctx.response != nil {
|
|
454
|
+
ctxmap.entries["response"] = .string("exists")
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// ------------------------------------------------------------------
|
|
459
|
+
// The struct corpus's nullModifier
|
|
460
|
+
// ------------------------------------------------------------------
|
|
461
|
+
|
|
462
|
+
/// A bare "__NULL__" becomes a real null; an embedded one inside a larger
|
|
463
|
+
/// string becomes the literal text "null". omni's own `nullmodifier`
|
|
464
|
+
/// RETURNS the replacement, while struct's `inject` passes this as its
|
|
465
|
+
/// `modify` hook and expects it to write `parent[key]` in place.
|
|
466
|
+
static let nullModifier: Modify = { val, key, parent, _, _ in
|
|
467
|
+
guard case .string(let text) = val else { return }
|
|
468
|
+
if NULLMARK == text {
|
|
469
|
+
setprop(parent, key, .null)
|
|
470
|
+
} else if text.contains(NULLMARK) {
|
|
471
|
+
setprop(parent, key, .string(text.replacingOccurrences(of: NULLMARK, with: "null")))
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|