@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,497 @@
1
+ // The corpus test runner: vendored @voxgig/omni driven through its NATIVE
2
+ // API (voxgig.omni.Runner.makeRunner / RunPack.runsetflagsargs), presented to
3
+ // the corpus drivers in the shape they already use (run.spec, run.set,
4
+ // run.runset, run.runsetargs, run.compare). No compatibility shim is
5
+ // vendored: the adapter below IS the whole bridge, per language, per the
6
+ // vendor-tag rollout (docs/design/vendor-tag-rollout.md, Decision 4).
7
+ //
8
+ // It supersedes, IN PLACE, the hand-written corpus ENGINE that used to live
9
+ // fused inside sdktest/StructCorpus.scala (`object Runner`'s jsonRead,
10
+ // fixJson, eqv, matchval, doMatch, resolveArgs, checkResult, handleError and
11
+ // runSet). Both corpus drivers keep their file names — StructCorpus.scala
12
+ // and PrimaryCorpus.scala — so no emitted call site moved and there is no
13
+ // orphan file for `doctor prune` to delete. It is the Scala peer of
14
+ // tm/java/test/OmniResolver.java, tm/rust/tests/omni_resolver/mod.rs and
15
+ // tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift.
16
+ //
17
+ // Lives in the DEFAULT package alongside SdkTestMain / Runner /
18
+ // SdkTestSupport, which is where scala-cli's generated test mains live.
19
+ //
20
+ // Scala-specific decisions, each load-bearing:
21
+ //
22
+ // 1. TWO VALUE MODELS, ONE CONVERSION PAIR. omni's `Json` is a closed,
23
+ // IMMUTABLE enum (ListMap-backed); this SDK's struct port uses a MUTABLE
24
+ // `Value` ADT (ArrayBuffer / LinkedHashMap). Every crossing is an explicit
25
+ // `tostruct` / `toomni`. `Json.Absent` <-> `Noval` and `Json.Null` <->
26
+ // `VNull` keep apart the two no-value states the corpus distinguishes —
27
+ // which is also why Scala needs neither go's `novalargs` spec rewrite nor
28
+ // lua/php's compat shim for the corpus's ZERO-ARGUMENT entries: an entry
29
+ // with no `in`/`args`/`ctx` arrives from omni as one `Json.Absent`
30
+ // argument and becomes exactly this port's own `Noval`, which is what the
31
+ // retired hand-written `resolveArgs` produced for the same entry.
32
+ //
33
+ // 2. ARGUMENTS ARE WRITTEN BACK. `SubjectArgs` (List[Json] => (List[Json],
34
+ // Json)) is the channel omni provides for a subject that MUTATES its
35
+ // arguments, which `match: {args: ...}` then asserts on —
36
+ // `struct/minor/setpath` (7 entries) and `struct/merge/integrity` (6) turn
37
+ // on it. Decision 1 handed the subject a CONVERTED COPY, so EVERY subject
38
+ // here runs through `runsetflagsargs` and the wrapper converts the
39
+ // (possibly mutated) `Value` arguments back into omni's own list after the
40
+ // call. A dynamic port's shim gets this free from shared object identity;
41
+ // Scala cannot, because omni's Json has no mutable variant.
42
+ //
43
+ // 3. `match: {ctx: ...}` IS RETARGETED ONTO `match: {args: {"0": ...}}`.
44
+ // The one place this port cannot follow canonical omni as written, and a
45
+ // VALUE-SEMANTICS consequence, not a choice. omni's `resolveargs` stores
46
+ // `entry.ctx` and `args[0]` as two COPIES of the contextified map, and
47
+ // `checkresult` reads `entry.get("ctx")` for the ctx base — so a subject's
48
+ // post-call writes (decision 2) can never reach the copy `entry.ctx`
49
+ // holds, and eight `primary` entries assert exactly that post-call state.
50
+ // args[0] IS the ctx of a ctx entry (omni itself sets
51
+ // `args = List(entry.get("ctx"))`), so moving the assertion from `ctx` to
52
+ // `args.0` reads the SAME map, post-call, and preserves every leaf:
53
+ // nothing is dropped, weakened or skipped. `retargetctx` below does that
54
+ // rewrite on the spec handed to the engine. Rust and Swift face the
55
+ // identical problem and answer it identically; the upstream fix is for the
56
+ // port's `drive` to re-point `entry.ctx` at the returned `args[0]`, the way
57
+ // JS object identity does implicitly — a follow-up, not a hand-edit of a
58
+ // vendored file.
59
+ //
60
+ // 4. NUMBERS NEED NOTHING HERE. omni's parser reads every JSON number as
61
+ // Double and this port's `VNum` is also Double. The PRIMARY corpus still
62
+ // narrows an integral Double to a java.lang.Long on its own Java bridge
63
+ // (PrimaryCorpus.toJava) — that is a struct-to-SDK concern, not an
64
+ // omni-to-struct one, and it stays where it was.
65
+ //
66
+ // 5. KEY ORDER SURVIVES. omni's Scala port models a map as an insertion-
67
+ // ordered `ListMap`, and this port's `VMap` is a `LinkedHashMap`, so the
68
+ // round trip preserves author order. (The Rust port needed a sortedness
69
+ // tripwire because its omni maps are `BTreeMap`; Scala needs none.)
70
+ //
71
+ // 6. FAILURES ARE ACCUMULATED, NOT RAISED. omni stops a GROUP at its first
72
+ // bad entry and throws an `OmniError`; the corpus mains report the whole
73
+ // corpus in one banner at the end and exit non-zero. `drive` records the
74
+ // message and carries on, so one run still names every broken group.
75
+ //
76
+ // 7. ABSENCE HAS TWO KINDS, AND ONLY ONE OF THEM IS BENIGN. Every group is
77
+ // looked up as an `OmniGroup`, which keeps the PARENT node beside the
78
+ // group, because the parent is what tells them apart:
79
+ //
80
+ // * the whole SECTION is missing — a project corpus that predates it.
81
+ // Fleet-wide this is real and load-bearing: `struct.nullsem` is absent
82
+ // from every project corpus checked (399 of 399), so failing on it
83
+ // would turn the fleet red for a corpus-version skew nobody caused.
84
+ // SKIPPED, and NAMED in the banner.
85
+ //
86
+ // * the section IS carried and the GROUP is gone. Nothing legitimate
87
+ // does that: across 691 project corpora, every group these drivers ask
88
+ // for is present and non-empty whenever its section is. It is a corpus
89
+ // regression, so it FAILS. It used to be a skip, and for the four
90
+ // single-node groups `compare` drives it was not even that — `compare`
91
+ // had no guard at all, so deleting `struct/merge/basic`,
92
+ // `struct/inject/basic` or `struct/transform/basic` left a run
93
+ // BIT-IDENTICAL to a healthy one (`PASS 1216 FAIL 0`, exit 0): the
94
+ // absent node became `Noval` on both sides, `fixjson` rendered both as
95
+ // NULLMARK, and NULLMARK deep-equals NULLMARK.
96
+ //
97
+ // 8. THE PASS COUNT IS WHAT THE ENGINE RAN, NOT WHAT THE CORPUS DECLARES.
98
+ // `drive` counts the times omni invoked the subject wrapper — omni calls
99
+ // it exactly once per entry — and reports THAT. A count read off the spec
100
+ // cannot tell a working engine from a disconnected one: with the
101
+ // `runsetflagsargs` call commented out, the old `report.pass(entrycount)`
102
+ // still printed `PASS 1216 FAIL 0` and exited 0. A number that survives
103
+ // the engine being unplugged is worse than no number, because it reads as
104
+ // evidence. The declared count is kept only as a TRIPWIRE: if the engine
105
+ // ran a different number of entries than the group declares, that
106
+ // mismatch is itself a failure.
107
+
108
+ import scala.collection.immutable.ListMap
109
+ import scala.collection.mutable.{ArrayBuffer, LinkedHashMap}
110
+
111
+ import voxgig.omni.{
112
+ Flags,
113
+ Json as OJson,
114
+ OmniError,
115
+ Provider,
116
+ RunPack,
117
+ RunnerPack,
118
+ Runner as OmniRunner,
119
+ Util as OmniUtil
120
+ }
121
+ import voxgig.omni.{
122
+ EXISTSMARK as OMNI_EXISTSMARK,
123
+ NULLMARK as OMNI_NULLMARK,
124
+ UNDEFMARK as OMNI_UNDEFMARK
125
+ }
126
+
127
+ import voxgig.struct.{
128
+ Noval,
129
+ VBool,
130
+ VFunc,
131
+ VList,
132
+ VMap,
133
+ VNull,
134
+ VNum,
135
+ VSentinel,
136
+ VStr,
137
+ Value
138
+ }
139
+
140
+ import SCALAPACKAGE.core.SdkError
141
+
142
+
143
+ // Pass/fail/skip accumulator shared by every section of one corpus run
144
+ // (decision 6). `prefix` is the banner the main prints, so the two mains stay
145
+ // distinguishable in a mixed log.
146
+ final class OmniReport(val prefix: String) {
147
+
148
+ var passed: Int = 0
149
+ val failures = ArrayBuffer.empty[String]
150
+ val skipped = ArrayBuffer.empty[String]
151
+
152
+ def pass(n: Int): Unit = { passed += n }
153
+
154
+ def fail(label: String, msg: String): Unit =
155
+ failures.append("FAIL " + label + " - " + msg.replace('\n', ' '))
156
+
157
+ /**
158
+ * A group that did not run for a reason that is NOT a defect. `why` is
159
+ * carried into the banner beside the label, because "skipped" on its own
160
+ * cannot be read: a section this corpus predates and a group that declares
161
+ * no entries are different facts and the reader has to be able to tell.
162
+ */
163
+ def skip(label: String, why: String): Unit =
164
+ skipped.append(label + " (" + why + ")")
165
+
166
+ /**
167
+ * A run that checked NOTHING is a failure, not a pass. Every group of a
168
+ * section this project's corpus does not carry is skipped (see
169
+ * OmniRun.drive), so a corpus whose whole section went missing would
170
+ * otherwise finish green with zero checks — the exact silent-pass this
171
+ * migration exists to prevent. The corpus mains call this before finish().
172
+ */
173
+ def requireran(what: String): Unit =
174
+ if (0 == passed && failures.isEmpty) {
175
+ fail(what, "no corpus entries ran at all - the section is missing or " +
176
+ "empty (skipped: " + skipped.mkString(", ") + ")")
177
+ }
178
+
179
+ /** Print the banner; the process exit code (0 clean, 1 on any failure). */
180
+ def finish(): Int = {
181
+ failures.foreach(println)
182
+ // Each entry carries its own reason now, so the header does not claim
183
+ // one: "absent from this corpus" was wrong for a group that is present
184
+ // and declares no entries.
185
+ if (skipped.nonEmpty) {
186
+ println("SKIPPED (nothing ran, and why): " + skipped.mkString(", "))
187
+ }
188
+ println(s"\n${prefix}PASS $passed FAIL ${failures.length}")
189
+ if (failures.nonEmpty) 1 else 0
190
+ }
191
+ }
192
+
193
+
194
+ /**
195
+ * One named corpus group: the node the drivers hand to the engine, the PATH
196
+ * that named it, and the PARENT it was looked up in. The parent is not
197
+ * decoration — it is the only thing that separates a section this project's
198
+ * corpus does not carry (benign) from a group that vanished out of a section
199
+ * it does carry (a regression). See decision 7.
200
+ */
201
+ final case class OmniGroup(path: List[String], node: OJson, parent: OJson) {
202
+ def pathname: String = path.mkString(".")
203
+ }
204
+
205
+
206
+ /** What the runner returns for one named spec section. */
207
+ final class OmniRun(
208
+ pack: RunPack,
209
+ val all: OJson,
210
+ val report: OmniReport,
211
+ val sectionname: String = "") {
212
+
213
+ /** The resolved section. */
214
+ val spec: OJson = pack.spec
215
+
216
+ /** A raw node of the resolved section, by path. */
217
+ def set(keys: String*): OJson = keys.foldLeft(spec)((node, key) => node.get(key))
218
+
219
+ /**
220
+ * The same lookup, keeping the PARENT so the two kinds of absence stay
221
+ * distinguishable (decision 7). Every group a corpus driver runs comes
222
+ * through here.
223
+ */
224
+ def group(keys: String*): OmniGroup = {
225
+ val parent = keys.dropRight(1).foldLeft(spec)((node, key) => node.get(key))
226
+ // The section name leads the path, so a message naming the group names
227
+ // it the way the corpus file does — `struct.merge.basic`, not `basic`.
228
+ val path = if (sectionname.isEmpty) keys.toList else sectionname :: keys.toList
229
+ OmniGroup(path, if (keys.isEmpty) spec else parent.get(keys.last), parent)
230
+ }
231
+
232
+ /**
233
+ * Run one group whose subject takes the single corpus argument. The
234
+ * converted argument is written back after the call (decision 2), so
235
+ * `match: {args: ...}` sees what the subject did to it.
236
+ */
237
+ def runset(label: String, grp: OmniGroup, nulls: Boolean = true)(
238
+ subject: Value => Value): Unit =
239
+ drive(label, grp, nulls, args => {
240
+ val input = OmniResolver.tostruct(args.headOption.getOrElse(OJson.Absent))
241
+ val out = subject(input)
242
+ val back = OmniResolver.toomni(input)
243
+ (if (args.isEmpty) List(back) else back :: args.tail, OmniResolver.toomni(out))
244
+ })
245
+
246
+ /**
247
+ * Run one group whose subject takes omni's WHOLE argument list — the shape
248
+ * the `primary` suite needs, where a ctx entry arrives as args(0), a MAP,
249
+ * which the call site turns into a typed Context and writes observable
250
+ * state back into (decisions 2 and 3).
251
+ */
252
+ def runsetargs(label: String, grp: OmniGroup, nulls: Boolean = true)(
253
+ subject: Seq[Value] => Value): Unit =
254
+ drive(label, grp, nulls, args => {
255
+ val input = args.map(OmniResolver.tostruct)
256
+ val out = subject(input)
257
+ (input.map(OmniResolver.toomni), OmniResolver.toomni(out))
258
+ })
259
+
260
+ /**
261
+ * Compare one expected/actual pair directly, for the handful of corpus
262
+ * nodes that are a single `{in, out}` object rather than a `set` and so
263
+ * never reach omni at all (`merge/basic`, `inject/basic`,
264
+ * `transform/basic`, `walk/log`). Both sides go through omni's own
265
+ * `fixjson`, which is exactly what it does to everything it runs.
266
+ *
267
+ * The group is required, not just its label: unlike `drive`, which hands a
268
+ * node to the engine, the CALL SITE here reads the node to build both
269
+ * sides. An absent or hollowed-out node therefore does not compare nothing
270
+ * — it compares `Noval` with `Noval`, which `fixjson` renders as NULLMARK
271
+ * on both sides, and NULLMARK deep-equals NULLMARK. That is a PASS with no
272
+ * subject and no data behind it, which is why the shape check below runs
273
+ * before the comparison and both sides are by-name (decision 7).
274
+ */
275
+ def compare(label: String, grp: OmniGroup, expected: => Value, actual: => Value,
276
+ nulls: Boolean = true): Unit = {
277
+
278
+ if (absent(label, grp)) return
279
+
280
+ if (!grp.node.ismap || !grp.node.has("in") || !grp.node.has("out")) {
281
+ report.fail(label, "corpus node " + grp.pathname + " carries no in/out " +
282
+ "pair - there is nothing to compare, and both sides would read as null")
283
+ return
284
+ }
285
+
286
+ try {
287
+ val want = OmniResolver.fixjson(OmniResolver.toomni(expected), nulls)
288
+ val got = OmniResolver.fixjson(OmniResolver.toomni(actual), nulls)
289
+ if (OmniUtil.deepequal(want, got)) report.pass(1)
290
+ else report.fail(label,
291
+ s"Expected: ${OmniUtil.stringify(want)}, got: ${OmniUtil.stringify(got)}")
292
+ }
293
+ catch { case e: Throwable => report.fail(label, OmniResolver.errtext(e)) }
294
+ }
295
+
296
+ // Hand one group to omni and record the outcome (decisions 6, 7 and 8).
297
+ private def drive(
298
+ label: String,
299
+ grp: OmniGroup,
300
+ nulls: Boolean,
301
+ call: List[OJson] => (List[OJson], OJson)): Unit = {
302
+
303
+ if (absent(label, grp)) return
304
+
305
+ val declared = OmniResolver.entrycount(grp.node)
306
+ val flags = Flags(nulls = nulls, name = Some(label))
307
+
308
+ // What the ENGINE actually ran. omni's own drive loop invokes this
309
+ // wrapper exactly once per entry, so `ran` counts real work; the
310
+ // declared count is only the tripwire it is checked against
311
+ // (decision 8).
312
+ var ran = 0
313
+ val counted: List[OJson] => (List[OJson], OJson) = args => { ran += 1; call(args) }
314
+
315
+ try {
316
+ pack.runsetflagsargs(OmniResolver.retargetctx(grp.node), flags, counted)
317
+
318
+ if (ran != declared) {
319
+ report.fail(label, "the engine ran " + ran + " of the " + declared +
320
+ " entries " + grp.pathname + " declares - the pass count reports " +
321
+ "what RAN, so it will not paper over the gap")
322
+ }
323
+ else if (0 == declared) report.skip(label, "declares no entries")
324
+ else report.pass(ran)
325
+ }
326
+ catch {
327
+ case e: OmniError => report.fail(label, e.text)
328
+ case e: Throwable => report.fail(label, OmniResolver.errtext(e))
329
+ }
330
+ }
331
+
332
+ /**
333
+ * The two kinds of absence (decision 7). Returns true when the group did
334
+ * not run and the outcome has already been recorded.
335
+ */
336
+ private def absent(label: String, grp: OmniGroup): Boolean =
337
+ if (!grp.node.isabsent) false
338
+ else if (grp.parent.isabsent) {
339
+ // The whole section is missing: a project corpus older than the
340
+ // section. Real fleet-wide (struct.nullsem), and not a defect — but
341
+ // NAMED in the banner, never passed over in silence.
342
+ report.skip(label, "section absent from this corpus")
343
+ true
344
+ }
345
+ else {
346
+ // The section is carried and the group is not. Nothing legitimate does
347
+ // that, so it is a corpus regression: a skip here would let the group
348
+ // stop running behind a green banner.
349
+ report.fail(label, "corpus group " + grp.pathname + " is absent from a " +
350
+ "section this corpus DOES carry - the group stopped running and " +
351
+ "checked nothing")
352
+ true
353
+ }
354
+ }
355
+
356
+
357
+ object OmniResolver {
358
+
359
+ // The sentinels, under the names the corpus drivers already use.
360
+ val NULLMARK: String = OMNI_NULLMARK
361
+ val UNDEFMARK: String = OMNI_UNDEFMARK
362
+ val EXISTSMARK: String = OMNI_EXISTSMARK
363
+
364
+ // ---- the two value models (decision 1) ---------------------------------
365
+
366
+ /** omni's model -> this SDK's struct model. */
367
+ def tostruct(val0: OJson): Value = val0 match {
368
+ case OJson.Absent => Noval
369
+ case OJson.Null => VNull
370
+ case OJson.Bool(flag) => VBool(flag)
371
+ case OJson.Num(num) => VNum(num)
372
+ case OJson.Str(text) => VStr(text)
373
+ case OJson.JList(xs) => VList(ArrayBuffer.from(xs.map(tostruct)))
374
+ case OJson.JMap(xs) =>
375
+ val out = LinkedHashMap.empty[String, Value]
376
+ xs.foreach { case (key, entry) => out.put(key, tostruct(entry)) }
377
+ VMap(out)
378
+ }
379
+
380
+ /**
381
+ * This SDK's struct model -> omni's.
382
+ *
383
+ * `VFunc` and `VSentinel` have no JSON shape at all. They reach here only
384
+ * when a corpus entry puts a callable in data (`getelem` with a callable
385
+ * `alt`, `$APPLY`, a user `$FORMAT`) or a walker returns SKIP/DELETE, and
386
+ * in every such case the corpus asserts on what the call RETURNED, not on
387
+ * the callable. `Json.Absent` is the honest answer — it is what omni's own
388
+ * model says about a value that is not JSON, and omni's `fixjson` then
389
+ * renders it as NULLMARK under the null flag, the same place the retired
390
+ * hand-written `fixJson` put it.
391
+ */
392
+ def toomni(val0: Value): OJson = val0 match {
393
+ case Noval => OJson.Absent
394
+ case VNull => OJson.Null
395
+ case VBool(flag) => OJson.Bool(flag)
396
+ case VNum(num) => OJson.Num(num)
397
+ case VStr(text) => OJson.Str(text)
398
+ case VList(buf) => OJson.JList(buf.toList.map(toomni))
399
+ case VMap(map) =>
400
+ OJson.JMap(ListMap.from(map.toSeq.map { case (key, entry) => (key, toomni(entry)) }))
401
+ case VFunc(_) => OJson.Absent
402
+ case VSentinel(_) => OJson.Absent
403
+ }
404
+
405
+ // ---- spec access -------------------------------------------------------
406
+
407
+ /**
408
+ * Load the shared corpus. omni's docs say a port must resolve the spec path
409
+ * itself, so it is absolutized against the working directory here.
410
+ */
411
+ def loadspec(path: String): OJson =
412
+ OmniRunner.loadspec(
413
+ java.nio.file.Paths.get(path).toAbsolutePath.normalize.toString)
414
+
415
+ /** How many entries a group declares. */
416
+ def entrycount(node: OJson): Int =
417
+ node.get("set").aslist.map(_.length).getOrElse(0)
418
+
419
+ /** omni's own null normalisation, for values that never reach the engine. */
420
+ def fixjson(val0: OJson, nulls: Boolean): OJson = OmniRunner.fixjson(val0, nulls)
421
+
422
+ def errtext(err: Throwable): String = err match {
423
+ case e: OmniError => e.text
424
+ case e => Option(e.getMessage).getOrElse(String.valueOf(e))
425
+ }
426
+
427
+ // ---- the runner --------------------------------------------------------
428
+
429
+ /**
430
+ * Wrap a live SDK client as an omni provider.
431
+ *
432
+ * Only `errify` is hooked. There is no subject-by-name hook: this port's
433
+ * utilities are typed methods on `Utility`, so a generic name lookup cannot
434
+ * produce omni's `List[Json] => Json` subject without a per-name adapter,
435
+ * and every call site passes its subject explicitly. The corpus carries no
436
+ * `DEF.client` block for the sections these mains drive — a section that
437
+ * needs differently-optioned defaults declares `DEF.setup`, which
438
+ * PrimaryCorpus reads directly to build its own client.
439
+ *
440
+ * `errify` keeps the SDK error's CODE beside its message, so a corpus
441
+ * `match: {err: {code: ...}}` can assert on it rather than pattern-matching
442
+ * prose (the Scala analogue of the java/csharp resolvers' same hook).
443
+ */
444
+ def sdkProvider(): Provider = Provider(
445
+ errify = Some((err: Throwable) => err match {
446
+ case e: SdkError =>
447
+ var out = ListMap(
448
+ "name" -> OJson.Str("SdkError"),
449
+ "message" -> OJson.Str(String.valueOf(e.getMessage)))
450
+ if (e.code != null && e.code.nonEmpty) {
451
+ out = out.updated("code", OJson.Str(e.code))
452
+ }
453
+ OJson.JMap(out)
454
+ case other => OmniRunner.errify(other)
455
+ })
456
+ )
457
+
458
+ /** A runner over an already-parsed spec (omni's own capability, which keeps
459
+ * the smoke test free of a fixture file). */
460
+ def makeRunner(spec: OJson): RunnerPack = OmniRunner.makeRunner(spec, sdkProvider())
461
+
462
+ /** A runner over the shared corpus at `path`. */
463
+ def makeRunner(path: String): RunnerPack = makeRunner(loadspec(path))
464
+
465
+ /** Resolve one named section (`primary.<name>`, then `<name>`). */
466
+ def section(pack: RunnerPack, all: OJson, name: String, report: OmniReport): OmniRun =
467
+ new OmniRun(pack.runner(name), all, report, name)
468
+
469
+ // ---- decision 3 --------------------------------------------------------
470
+
471
+ /**
472
+ * Retarget `match: {ctx: ...}` onto `match: {args: {"0": ...}}`, and only
473
+ * when the entry HAS a ctx or args (so args(0) IS that map) and the check
474
+ * does not already assert on `args`. See decision 3 above.
475
+ */
476
+ def retargetctx(testspec: OJson): OJson = testspec.get("set").aslist match {
477
+ case None => testspec
478
+ case Some(entries) =>
479
+ val out = entries.map { entry =>
480
+ val check = entry.get("match")
481
+ if (entry.ismap && check.ismap && check.has("ctx") && !check.has("args") &&
482
+ (entry.has("ctx") || entry.has("args"))) {
483
+ var newcheck = ListMap.empty[String, OJson]
484
+ check.asmap.get.foreach { case (key, sub) =>
485
+ // Drop the original leaf: it would read the stale pre-call copy
486
+ // omni keeps in `entry.ctx`.
487
+ if ("ctx" != key) newcheck = newcheck.updated(key, sub)
488
+ }
489
+ newcheck = newcheck.updated("args",
490
+ OJson.JMap(ListMap("0" -> check.get("ctx"))))
491
+ entry.set("match", OJson.JMap(newcheck))
492
+ }
493
+ else entry
494
+ }
495
+ testspec.set("set", OJson.JList(out))
496
+ }
497
+ }