@voxgig/sdkgen 4.8.2 → 4.9.0

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