@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,652 @@
|
|
|
1
|
+
// VENDORED: @voxgig/plugin 0.1.6 (go/plugin/config.go)
|
|
2
|
+
// Source: https://github.com/voxgig/plugin @ 8d8968afc0a2008fbd795b41ab166307d989f02a [tag: sdk-20260904-1610-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
/* The declarative document (§9): normalization, and the ten-level
|
|
5
|
+
* precedence ladder.
|
|
6
|
+
*
|
|
7
|
+
* TWO FUNCTIONS, AND THE SPLIT BETWEEN THEM IS FORCED.
|
|
8
|
+
*
|
|
9
|
+
* NormalizeConfig normalizes STRUCTURE and ENTRY KEYS. It does not
|
|
10
|
+
* merge options, and cannot: §9.4 makes merge behaviour a property of
|
|
11
|
+
* the definition's option SHAPE, which normalization has never seen. A
|
|
12
|
+
* normalizer that flattened the option layers would make
|
|
13
|
+
* `$MERGE: append` unimplementable at load time, because the layers it
|
|
14
|
+
* must concatenate would already be collapsed.
|
|
15
|
+
*
|
|
16
|
+
* ResolveOptions applies the ladder, and it is the only place that
|
|
17
|
+
* knows the shape. */
|
|
18
|
+
|
|
19
|
+
package plugin
|
|
20
|
+
|
|
21
|
+
import "sort"
|
|
22
|
+
|
|
23
|
+
// ---------------------------------------------------------------------
|
|
24
|
+
// NormalizeConfig
|
|
25
|
+
// ---------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
type Keys struct {
|
|
28
|
+
Instance string `json:"instance,omitempty"`
|
|
29
|
+
Default string `json:"default,omitempty"`
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
type NormalizeInput struct {
|
|
33
|
+
Doc any `json:"doc"`
|
|
34
|
+
Profile string `json:"profile,omitempty"`
|
|
35
|
+
// Keys is §9.1: a host may rename `instance` and `default` into its
|
|
36
|
+
// own vocabulary.
|
|
37
|
+
Keys Keys `json:"keys,omitempty"`
|
|
38
|
+
// Reserved is §9.1: refs the host declares itself and always wins on.
|
|
39
|
+
Reserved []string `json:"reserved,omitempty"`
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
func NormalizeConfig(input NormalizeInput) (Normalized, error) {
|
|
43
|
+
doc := asmap(input.Doc)
|
|
44
|
+
ikey := or(input.Keys.Instance, "instance")
|
|
45
|
+
dkey := or(input.Keys.Default, "default")
|
|
46
|
+
reserved := input.Reserved
|
|
47
|
+
|
|
48
|
+
// The rename is applied at TWO PLACES AND NO OTHERS: the document
|
|
49
|
+
// root, and every profile.<name> overlay root (§9.1). A rename
|
|
50
|
+
// applied only at the root would leave `profile.prod.sdk`
|
|
51
|
+
// untranslated and silently drop every environment override the host
|
|
52
|
+
// depends on. Recursing further would be worse: option data is the
|
|
53
|
+
// definition's.
|
|
54
|
+
baseinst := doc[ikey]
|
|
55
|
+
basedef := asmap(doc[dkey])
|
|
56
|
+
|
|
57
|
+
var overlay map[string]any
|
|
58
|
+
if "" != input.Profile {
|
|
59
|
+
overlay = asmap(asmap(doc["profile"])[input.Profile])
|
|
60
|
+
}
|
|
61
|
+
overinst := overlay[ikey]
|
|
62
|
+
overdef := asmap(overlay[dkey])
|
|
63
|
+
|
|
64
|
+
// Entry layers, base then overlay, each as {ref -> entry} plus the
|
|
65
|
+
// order the form implies.
|
|
66
|
+
base, err := entries(baseinst)
|
|
67
|
+
if nil != err {
|
|
68
|
+
return Normalized{}, err
|
|
69
|
+
}
|
|
70
|
+
over, err := entries(overinst)
|
|
71
|
+
if nil != err {
|
|
72
|
+
return Normalized{}, err
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
for _, group := range [][]string{
|
|
76
|
+
sortedkeys(base.emap), sortedkeys(over.emap),
|
|
77
|
+
sortedkeys(basedef), sortedkeys(overdef),
|
|
78
|
+
} {
|
|
79
|
+
for _, r := range group {
|
|
80
|
+
if err := checkreservedref(r, reserved); nil != err {
|
|
81
|
+
return Normalized{}, err
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// A PARTIAL ARRAY IS NOT A FILTER (§9.1). sdkgen learned this the
|
|
87
|
+
// hard way: deriving order from a partial array silently dropped
|
|
88
|
+
// config-activated features. Refs in the base but absent from the
|
|
89
|
+
// overlay still load, in sorted position AFTER the listed ones. A
|
|
90
|
+
// profile may also INTRODUCE a ref the base never declared.
|
|
91
|
+
order := []string{}
|
|
92
|
+
for _, r := range over.order {
|
|
93
|
+
if !hasstring(order, r) {
|
|
94
|
+
order = append(order, r)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// The remainder keeps the BASE's own order — array position for the
|
|
98
|
+
// array form, sorted refs for the map form. Re-sorting here would
|
|
99
|
+
// discard an array document's positional order entirely, which is
|
|
100
|
+
// the one thing the array form exists to express.
|
|
101
|
+
for _, r := range base.order {
|
|
102
|
+
if !hasstring(order, r) {
|
|
103
|
+
order = append(order, r)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
instance := map[string]*Instance{}
|
|
108
|
+
for i, ref := range order {
|
|
109
|
+
b := base.emap[ref]
|
|
110
|
+
o := over.emap[ref]
|
|
111
|
+
|
|
112
|
+
// MERGE THE ENTRIES AS AUTHORED, THEN APPLY DEFAULTS TO THE
|
|
113
|
+
// RESULT (§9.3). A safety rule, not a tidiness one: if the
|
|
114
|
+
// overlay had its defaults filled in before merging it would
|
|
115
|
+
// carry a synthesized active:true and overwrite a base's false —
|
|
116
|
+
// silently re-enabling a deliberately disabled integration in
|
|
117
|
+
// production.
|
|
118
|
+
active := asbool(pick(o, "active", pick(b, "active", true)), true)
|
|
119
|
+
start := asstring(pick(o, "start", pick(b, "start", "eager")), "eager")
|
|
120
|
+
ord := pick(o, "order", pick(b, "order", nil))
|
|
121
|
+
|
|
122
|
+
// Option layers, levels 3-6, IN LADDER ORDER. Never merged here.
|
|
123
|
+
layers := []any{}
|
|
124
|
+
nm := refname(ref)
|
|
125
|
+
if v, ok := asmap(basedef[nm])["options"]; ok {
|
|
126
|
+
layers = append(layers, v)
|
|
127
|
+
}
|
|
128
|
+
if v, ok := asmap(b)["options"]; ok {
|
|
129
|
+
layers = append(layers, v)
|
|
130
|
+
}
|
|
131
|
+
if v, ok := asmap(overdef[nm])["options"]; ok {
|
|
132
|
+
layers = append(layers, v)
|
|
133
|
+
}
|
|
134
|
+
if v, ok := asmap(o)["options"]; ok {
|
|
135
|
+
layers = append(layers, v)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
ent := &Instance{Pos: i, Active: active, Start: start, OptionLayers: layers}
|
|
139
|
+
if nil != ord {
|
|
140
|
+
ent.Order = orderblock(ord)
|
|
141
|
+
}
|
|
142
|
+
instance[ref] = ent
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// `default` DECLARES NOTHING (§9.3). It is a base for every instance
|
|
146
|
+
// of that definition; it does not create one, and an entry for a
|
|
147
|
+
// name with no instances is inert rather than an error — which is
|
|
148
|
+
// what makes a shared library of defaults shippable.
|
|
149
|
+
defout := map[string]any{}
|
|
150
|
+
for _, n := range sortedkeys(basedef) {
|
|
151
|
+
defout[n] = basedef[n]
|
|
152
|
+
}
|
|
153
|
+
for _, n := range sortedkeys(overdef) {
|
|
154
|
+
defout[n] = overdef[n]
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return Normalized{Instance: instance, Order: order, Default: defout}, nil
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
type entryset struct {
|
|
161
|
+
emap map[string]any
|
|
162
|
+
order []string
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// entries reduces both document forms to {ref -> entry} plus the order
|
|
166
|
+
// the form implies: array POSITION for the array form, sorted refs for
|
|
167
|
+
// the map form.
|
|
168
|
+
func entries(src any) (entryset, error) {
|
|
169
|
+
out := entryset{emap: map[string]any{}, order: []string{}}
|
|
170
|
+
if nil == src {
|
|
171
|
+
return out, nil
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if list, ok := aslist(src); ok {
|
|
175
|
+
for _, item := range list {
|
|
176
|
+
raw, _ := asmap(item)["ref"]
|
|
177
|
+
s, _ := raw.(string)
|
|
178
|
+
ref, err := CanonRef(s)
|
|
179
|
+
if nil != err {
|
|
180
|
+
return out, err
|
|
181
|
+
}
|
|
182
|
+
out.emap[ref] = item
|
|
183
|
+
out.order = append(out.order, ref)
|
|
184
|
+
}
|
|
185
|
+
return out, nil
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Map-form refs arrive as KEYS, through a different path than an
|
|
189
|
+
// array element's `ref` field — and must canonicalize the same way.
|
|
190
|
+
m := asmap(src)
|
|
191
|
+
for _, key := range sortedkeys(m) {
|
|
192
|
+
ref, err := CanonRef(key)
|
|
193
|
+
if nil != err {
|
|
194
|
+
return out, err
|
|
195
|
+
}
|
|
196
|
+
out.emap[ref] = m[key]
|
|
197
|
+
}
|
|
198
|
+
// Byte-wise, NOT locale-aware and NOT case-folded. All-lowercase
|
|
199
|
+
// refs sort identically under all three, so only mixed input
|
|
200
|
+
// discriminates: '@' is 0x40, uppercase 0x41-0x5A, lowercase
|
|
201
|
+
// 0x61-0x7A. Go's sort.Strings is exactly bytewise.
|
|
202
|
+
out.order = sortedkeys(out.emap)
|
|
203
|
+
sort.Strings(out.order)
|
|
204
|
+
return out, nil
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// checkreservedref is §9.1: reservation is all-or-nothing per NAME, so
|
|
208
|
+
// the tagged forms go too. A configuration surface that can disable the
|
|
209
|
+
// thing reading it is not a surface, it is a trap.
|
|
210
|
+
func checkreservedref(ref string, reserved []string) error {
|
|
211
|
+
if 0 == len(reserved) {
|
|
212
|
+
return nil
|
|
213
|
+
}
|
|
214
|
+
if hasstring(reserved, refname(ref)) {
|
|
215
|
+
return Fail("plugin_ref_reserved", "ref is reserved by the host: "+ref,
|
|
216
|
+
map[string]any{"ref": ref})
|
|
217
|
+
}
|
|
218
|
+
return nil
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// ---------------------------------------------------------------------
|
|
222
|
+
// ResolveOptions — §9.3's ten levels, and §9.4's merge directives
|
|
223
|
+
// ---------------------------------------------------------------------
|
|
224
|
+
|
|
225
|
+
type ResolveInput struct {
|
|
226
|
+
Ref string `json:"ref"`
|
|
227
|
+
// Shape is level 1 — the definition's option shape. Also carries the
|
|
228
|
+
// $MERGE directives, which is why merging cannot happen without it.
|
|
229
|
+
Shape any `json:"shape,omitempty"`
|
|
230
|
+
HostDefaults any `json:"hostdefaults,omitempty"` // 2
|
|
231
|
+
Doc any `json:"doc,omitempty"` // 3-6
|
|
232
|
+
Profile string `json:"profile,omitempty"`
|
|
233
|
+
Env any `json:"env,omitempty"` // 7
|
|
234
|
+
HostOptions any `json:"hostoptions,omitempty"` // 8
|
|
235
|
+
LoadOptions any `json:"loadoptions,omitempty"` // 9
|
|
236
|
+
Patch any `json:"patch,omitempty"` // 10
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
func ResolveOptions(input ResolveInput) (map[string]any, error) {
|
|
240
|
+
shape := asmap(input.Shape)
|
|
241
|
+
if err := CheckShape(shape); nil != err {
|
|
242
|
+
return nil, err
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
ref, err := CanonRef(input.Ref)
|
|
246
|
+
if nil != err {
|
|
247
|
+
return nil, err
|
|
248
|
+
}
|
|
249
|
+
name := refname(ref)
|
|
250
|
+
doc := asmap(input.Doc)
|
|
251
|
+
|
|
252
|
+
var overlay map[string]any
|
|
253
|
+
if "" != input.Profile {
|
|
254
|
+
overlay = asmap(asmap(doc["profile"])[input.Profile])
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// ONE ordered merge, lowest to highest. Levels 3-6 are not two
|
|
258
|
+
// namespaces collapsed separately and composed afterwards: that
|
|
259
|
+
// inverts the rule that PROFILE SPECIFICITY OUTRANKS DEFINITION
|
|
260
|
+
// SPECIFICITY, so a prod per-definition default would lose to a base
|
|
261
|
+
// instance value.
|
|
262
|
+
lo3, err := optsof(doc["default"], name)
|
|
263
|
+
if nil != err {
|
|
264
|
+
return nil, err
|
|
265
|
+
}
|
|
266
|
+
lo4, err := optsof(doc["instance"], ref)
|
|
267
|
+
if nil != err {
|
|
268
|
+
return nil, err
|
|
269
|
+
}
|
|
270
|
+
lo5, err := optsof(overlay["default"], name)
|
|
271
|
+
if nil != err {
|
|
272
|
+
return nil, err
|
|
273
|
+
}
|
|
274
|
+
lo6, err := optsof(overlay["instance"], ref)
|
|
275
|
+
if nil != err {
|
|
276
|
+
return nil, err
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
layers := []any{
|
|
280
|
+
defaultsof(shape), // 1
|
|
281
|
+
input.HostDefaults, // 2
|
|
282
|
+
lo3, lo4, lo5, lo6, // 3-6
|
|
283
|
+
input.Env, // 7
|
|
284
|
+
input.HostOptions, // 8
|
|
285
|
+
input.LoadOptions, // 9
|
|
286
|
+
input.Patch, // 10
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
var out any = map[string]any{}
|
|
290
|
+
for _, layer := range layers {
|
|
291
|
+
if nil == layer {
|
|
292
|
+
continue
|
|
293
|
+
}
|
|
294
|
+
out = mergeone(out, layer, shape)
|
|
295
|
+
}
|
|
296
|
+
return asmap(out), nil
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// defaultsof: the shape's non-directive values are the level-1 defaults.
|
|
300
|
+
func defaultsof(shape map[string]any) map[string]any {
|
|
301
|
+
out := map[string]any{}
|
|
302
|
+
for _, k := range sortedkeys(shape) {
|
|
303
|
+
v := shape[k]
|
|
304
|
+
if m, ok := v.(map[string]any); ok {
|
|
305
|
+
if _, has := m["$MERGE"]; has {
|
|
306
|
+
continue
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
out[k] = v
|
|
310
|
+
}
|
|
311
|
+
return out
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
func optsof(src any, key string) (any, error) {
|
|
315
|
+
if nil == src {
|
|
316
|
+
return nil, nil
|
|
317
|
+
}
|
|
318
|
+
// The array form is equivalent to the map form (§9.1).
|
|
319
|
+
if list, ok := aslist(src); ok {
|
|
320
|
+
for _, item := range list {
|
|
321
|
+
raw, _ := asmap(item)["ref"]
|
|
322
|
+
s, _ := raw.(string)
|
|
323
|
+
c, err := CanonRef(s)
|
|
324
|
+
if nil != err {
|
|
325
|
+
return nil, err
|
|
326
|
+
}
|
|
327
|
+
if c == key {
|
|
328
|
+
v, has := asmap(item)["options"]
|
|
329
|
+
if !has {
|
|
330
|
+
return nil, nil
|
|
331
|
+
}
|
|
332
|
+
return v, nil
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return nil, nil
|
|
336
|
+
}
|
|
337
|
+
m := asmap(src)
|
|
338
|
+
for _, k := range sortedkeys(m) {
|
|
339
|
+
c, err := CanonRef(k)
|
|
340
|
+
if nil != err {
|
|
341
|
+
return nil, err
|
|
342
|
+
}
|
|
343
|
+
if c == key {
|
|
344
|
+
v, has := asmap(m[k])["options"]
|
|
345
|
+
if !has {
|
|
346
|
+
return nil, nil
|
|
347
|
+
}
|
|
348
|
+
return v, nil
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return nil, nil
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// mergeone merges ONE layer onto the accumulator, honouring the shape's
|
|
355
|
+
// directives. The directive holds at EVERY precedence level, not only
|
|
356
|
+
// between document levels — §9.4 makes it a property of the shape, which
|
|
357
|
+
// does not know which layer a value arrived from.
|
|
358
|
+
func mergeone(base any, over any, shape map[string]any) any {
|
|
359
|
+
if nil == over {
|
|
360
|
+
return base
|
|
361
|
+
}
|
|
362
|
+
if !ismap(base) || !ismap(over) {
|
|
363
|
+
return clonevalue(over)
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
bm := asmap(base)
|
|
367
|
+
om := asmap(over)
|
|
368
|
+
out := map[string]any{}
|
|
369
|
+
for k, v := range bm {
|
|
370
|
+
out[k] = v
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
for _, k := range sortedkeys(om) {
|
|
374
|
+
var directive any
|
|
375
|
+
if nil != shape {
|
|
376
|
+
directive = asmap(shape[k])["$MERGE"]
|
|
377
|
+
}
|
|
378
|
+
b := out[k]
|
|
379
|
+
o := om[k]
|
|
380
|
+
|
|
381
|
+
if "replace" == directive {
|
|
382
|
+
out[k] = clonevalue(o)
|
|
383
|
+
} else if "append" == directive {
|
|
384
|
+
bl, ok := aslist(b)
|
|
385
|
+
if !ok {
|
|
386
|
+
bl = []any{}
|
|
387
|
+
}
|
|
388
|
+
ol, ok := aslist(o)
|
|
389
|
+
if !ok {
|
|
390
|
+
ol = []any{o}
|
|
391
|
+
}
|
|
392
|
+
joined := make([]any, 0, len(bl)+len(ol))
|
|
393
|
+
joined = append(joined, bl...)
|
|
394
|
+
joined = append(joined, ol...)
|
|
395
|
+
out[k] = joined
|
|
396
|
+
} else if n, deep := deepof(directive); deep {
|
|
397
|
+
out[k] = deepto(b, o, n)
|
|
398
|
+
} else {
|
|
399
|
+
// Library default: deep for maps, REPLACE for lists.
|
|
400
|
+
// struct.merge is element-wise by index, which for option
|
|
401
|
+
// maps is nearly always wrong — ["a"] over ["x","y","z"]
|
|
402
|
+
// yielding ["a","y","z"] is the defect station hit on
|
|
403
|
+
// secrets.providers.
|
|
404
|
+
if ismap(b) && ismap(o) {
|
|
405
|
+
out[k] = mergeone(b, o, nil)
|
|
406
|
+
} else {
|
|
407
|
+
out[k] = clonevalue(o)
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return out
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// deepto merges N levels below this key, replacing below that.
|
|
415
|
+
func deepto(base any, over any, n int) any {
|
|
416
|
+
if 0 >= n {
|
|
417
|
+
return clonevalue(over)
|
|
418
|
+
}
|
|
419
|
+
if !ismap(base) || !ismap(over) {
|
|
420
|
+
return clonevalue(over)
|
|
421
|
+
}
|
|
422
|
+
bm, om := asmap(base), asmap(over)
|
|
423
|
+
out := map[string]any{}
|
|
424
|
+
for k, v := range bm {
|
|
425
|
+
out[k] = v
|
|
426
|
+
}
|
|
427
|
+
for _, k := range sortedkeys(om) {
|
|
428
|
+
out[k] = deepto(out[k], om[k], n-1)
|
|
429
|
+
}
|
|
430
|
+
return out
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// §9.4: N is an integer of at least 1, and everything else is an error.
|
|
434
|
+
//
|
|
435
|
+
// `{"deep": 0}` is rejected DESPITE having an obvious reading, because
|
|
436
|
+
// "replace at this key" already has a spelling and two spellings for one
|
|
437
|
+
// behaviour is the defect class this repo exists to avoid. Without the
|
|
438
|
+
// stated domain each port picks its own reading — reject, replace,
|
|
439
|
+
// unlimited merge, or clamp to 1 — and the same document resolves
|
|
440
|
+
// differently per language.
|
|
441
|
+
var mergeWords = []string{"replace", "append"}
|
|
442
|
+
|
|
443
|
+
func CheckShape(shape any) error {
|
|
444
|
+
m, ok := shape.(map[string]any)
|
|
445
|
+
if !ok {
|
|
446
|
+
return nil
|
|
447
|
+
}
|
|
448
|
+
for _, k := range sortedkeys(m) {
|
|
449
|
+
v, ok := m[k].(map[string]any)
|
|
450
|
+
if !ok {
|
|
451
|
+
continue
|
|
452
|
+
}
|
|
453
|
+
d, has := v["$MERGE"]
|
|
454
|
+
if !has {
|
|
455
|
+
continue
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
if s, ok := d.(string); ok {
|
|
459
|
+
if !hasstring(mergeWords, s) {
|
|
460
|
+
return Fail("plugin_shape_invalid",
|
|
461
|
+
"invalid $MERGE directive at "+k+": "+s,
|
|
462
|
+
map[string]any{"key": k, "directive": d})
|
|
463
|
+
}
|
|
464
|
+
continue
|
|
465
|
+
}
|
|
466
|
+
if dm, ok := d.(map[string]any); ok {
|
|
467
|
+
if n, has := dm["deep"]; has {
|
|
468
|
+
if !isposint(n) {
|
|
469
|
+
return Fail("plugin_shape_invalid",
|
|
470
|
+
"invalid $MERGE deep at "+k+": "+compactjson(n),
|
|
471
|
+
map[string]any{"key": k, "directive": d})
|
|
472
|
+
}
|
|
473
|
+
continue
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
return Fail("plugin_shape_invalid",
|
|
477
|
+
"invalid $MERGE directive at "+k+": "+compactjson(d),
|
|
478
|
+
map[string]any{"key": k, "directive": d})
|
|
479
|
+
}
|
|
480
|
+
return nil
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// deepof reads `{"deep": N}` off a directive, after CheckShape has
|
|
484
|
+
// already established the domain.
|
|
485
|
+
func deepof(directive any) (int, bool) {
|
|
486
|
+
dm, ok := directive.(map[string]any)
|
|
487
|
+
if !ok {
|
|
488
|
+
return 0, false
|
|
489
|
+
}
|
|
490
|
+
n, has := dm["deep"]
|
|
491
|
+
if !has {
|
|
492
|
+
return 0, false
|
|
493
|
+
}
|
|
494
|
+
f, ok := tonumber(n)
|
|
495
|
+
if !ok {
|
|
496
|
+
return 0, false
|
|
497
|
+
}
|
|
498
|
+
return int(f), true
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// ---------------------------------------------------------------------
|
|
502
|
+
// The JSON-value readers. The canonical gets these from JavaScript's
|
|
503
|
+
// coercion rules; a typed port needs them written down, which is a
|
|
504
|
+
// large part of why go is P4's first port.
|
|
505
|
+
// ---------------------------------------------------------------------
|
|
506
|
+
|
|
507
|
+
func asmap(v any) map[string]any {
|
|
508
|
+
if m, ok := v.(map[string]any); ok {
|
|
509
|
+
return m
|
|
510
|
+
}
|
|
511
|
+
return map[string]any{}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// pick is the canonical's `pick(src, key, dflt)`: PRESENCE decides, not
|
|
515
|
+
// truthiness and not nil. A JSON `null` is a present value in
|
|
516
|
+
// JavaScript (`undefined !== null`), so it must be one here.
|
|
517
|
+
func pick(src any, key string, dflt any) any {
|
|
518
|
+
m, ok := src.(map[string]any)
|
|
519
|
+
if !ok {
|
|
520
|
+
return dflt
|
|
521
|
+
}
|
|
522
|
+
if v, has := m[key]; has {
|
|
523
|
+
return v
|
|
524
|
+
}
|
|
525
|
+
return dflt
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
func asbool(v any, dflt bool) bool {
|
|
529
|
+
if b, ok := v.(bool); ok {
|
|
530
|
+
return b
|
|
531
|
+
}
|
|
532
|
+
return dflt
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
func asstring(v any, dflt string) string {
|
|
536
|
+
if s, ok := v.(string); ok {
|
|
537
|
+
return s
|
|
538
|
+
}
|
|
539
|
+
return dflt
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
func or(v string, dflt string) string {
|
|
543
|
+
if "" == v {
|
|
544
|
+
return dflt
|
|
545
|
+
}
|
|
546
|
+
return v
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
// tonumber accepts every numeric shape a decoded document can carry:
|
|
550
|
+
// encoding/json gives float64, a hand-built map may carry int.
|
|
551
|
+
func tonumber(v any) (float64, bool) {
|
|
552
|
+
switch n := v.(type) {
|
|
553
|
+
case float64:
|
|
554
|
+
return n, true
|
|
555
|
+
case float32:
|
|
556
|
+
return float64(n), true
|
|
557
|
+
case int:
|
|
558
|
+
return float64(n), true
|
|
559
|
+
case int64:
|
|
560
|
+
return float64(n), true
|
|
561
|
+
}
|
|
562
|
+
return 0, false
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
func isposint(v any) bool {
|
|
566
|
+
f, ok := tonumber(v)
|
|
567
|
+
if !ok {
|
|
568
|
+
return false
|
|
569
|
+
}
|
|
570
|
+
return f == float64(int(f)) && 1 <= f
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
// asorderref reads ONE spelling or a LIST of them into an OrderRef, and
|
|
574
|
+
// KEEPS THE AUTHORED VALUE so normalization can hand it back untouched.
|
|
575
|
+
//
|
|
576
|
+
// It used to be a bare asstring(), so a list decoded to "" and the
|
|
577
|
+
// constraint was SILENTLY DROPPED - the sort ran as if nothing had been
|
|
578
|
+
// declared.
|
|
579
|
+
//
|
|
580
|
+
// `stated` is separate from the value because an ABSENT key and a key
|
|
581
|
+
// authored as `null` are different documents, and a map index alone
|
|
582
|
+
// cannot tell them apart.
|
|
583
|
+
//
|
|
584
|
+
// The other four ports have no type like this at all: they carry the
|
|
585
|
+
// authored block straight through (`ent.order = ord`), so every spelling
|
|
586
|
+
// survives normalization by construction. Go is the only port that
|
|
587
|
+
// decodes and rebuilds, and a rebuild loses whatever it does not model -
|
|
588
|
+
// first the list form, then scalar-vs-one-element-list, then an authored
|
|
589
|
+
// empty list, then an authored null. One cause, four parity breaks, none
|
|
590
|
+
// of which the corpus could see until `config/normorder` was written.
|
|
591
|
+
// Keeping the authored value ends the class rather than the instance.
|
|
592
|
+
func asorderref(v any, stated bool) OrderRef {
|
|
593
|
+
if !stated {
|
|
594
|
+
return OrderRef{}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
out := OrderRef{raw: v, set: true, list: []string{}}
|
|
598
|
+
|
|
599
|
+
// Slices are COPIED into `raw`. A caller that keeps its own handle on
|
|
600
|
+
// the slice it passed in must not be able to change what this ref
|
|
601
|
+
// marshals afterwards, while the parsed form stays as it was.
|
|
602
|
+
switch list := v.(type) {
|
|
603
|
+
case string:
|
|
604
|
+
if "" != list {
|
|
605
|
+
out.list = append(out.list, list)
|
|
606
|
+
}
|
|
607
|
+
case []string:
|
|
608
|
+
out.raw = append([]string{}, list...)
|
|
609
|
+
for _, one := range list {
|
|
610
|
+
if "" != one {
|
|
611
|
+
out.list = append(out.list, one)
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
case []any:
|
|
615
|
+
out.raw = append([]any{}, list...)
|
|
616
|
+
for _, item := range list {
|
|
617
|
+
if one, ok := item.(string); ok && "" != one {
|
|
618
|
+
out.list = append(out.list, one)
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// Anything else - a number, a map, a null - names no binding, so it
|
|
624
|
+
// constrains nothing. It was still STATED, and goes back verbatim.
|
|
625
|
+
|
|
626
|
+
return out
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
// orderblock decodes an `order` entry off a document. The canonical
|
|
630
|
+
// stores the raw value and reads `.before`, `.after`, `.band` off it
|
|
631
|
+
// wherever it lands; a typed port decodes once, here.
|
|
632
|
+
func orderblock(v any) *OrderBlock {
|
|
633
|
+
m, ok := v.(map[string]any)
|
|
634
|
+
if !ok {
|
|
635
|
+
return nil
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
out := &OrderBlock{}
|
|
639
|
+
|
|
640
|
+
before, statedbefore := m["before"]
|
|
641
|
+
after, statedafter := m["after"]
|
|
642
|
+
|
|
643
|
+
out.Before = asorderref(before, statedbefore)
|
|
644
|
+
out.After = asorderref(after, statedafter)
|
|
645
|
+
|
|
646
|
+
if f, ok := tonumber(m["band"]); ok {
|
|
647
|
+
n := int(f)
|
|
648
|
+
out.Band = &n
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
return out
|
|
652
|
+
}
|