@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
@@ -1,18 +1,25 @@
1
- // ProjectName SDK — shared test runner support (mirrors java
1
+ // ProjectName SDK — shared test runner SUPPORT (mirrors java
2
2
  // test/RunnerSupport.java): env overrides, sdk-test-control.json skips, the
3
- // ../.sdk/test/test.json loader, and the runset/match engine.
3
+ // ../.sdk/test/test.json loader, and Context construction from a test-entry
4
+ // ctx map.
5
+ //
6
+ // SUPPORT ONLY. The runset/match ENGINE that used to live here (and the
7
+ // whole of the retired test/struct_runner.hpp) was replaced by the vendored
8
+ // @voxgig/omni runner — see test/omni_resolver.hpp, which drives it and
9
+ // calls make_ctx_from_map/fixctx below. The file KEEPS ITS NAME because the
10
+ // generated entity suites (<entity>_direct_test.cpp, <entity>_entity_test.cpp)
11
+ // include it for read_file, load_env_local, env_override,
12
+ // is_control_skipped, entity_list_to_data and now_ms.
4
13
 
5
14
  #ifndef SDK_TEST_RUNNER_SUPPORT_HPP
6
15
  #define SDK_TEST_RUNNER_SUPPORT_HPP
7
16
 
8
17
  #include <cctype>
9
18
  #include <chrono>
10
- #include <cmath>
11
19
  #include <cstdlib>
12
20
  #include <fstream>
13
21
  #include <functional>
14
22
  #include <map>
15
- #include <regex>
16
23
  #include <sstream>
17
24
  #include <string>
18
25
  #include <vector>
@@ -155,183 +162,6 @@ inline Value get_spec(const Value& spec, std::initializer_list<std::string> keys
155
162
  return Helpers::toMapAny(cur);
156
163
  }
157
164
 
158
- // ---- normalisation / matching ----------------------------------------
159
-
160
- inline Value json_normalize(const Value& v) {
161
- // Roundtrip through JSON to drop function values and canonicalise numbers.
162
- return vs::parse_json(vs::jsonify(v, 0));
163
- }
164
-
165
- // canon: integer-valued numbers -> int; maps sorted; recursive. Returns a
166
- // normalised Value used only for deep-equality.
167
- inline Value canon(const Value& v) {
168
- if (v.is_double()) {
169
- double d = v.as_double();
170
- if (std::isfinite(d) && std::floor(d) == d) return Value((int64_t)d);
171
- return v;
172
- }
173
- if (v.is_list()) {
174
- Value out = vlist();
175
- for (const auto& e : *v.as_list()) out.as_list()->push_back(canon(e));
176
- return out;
177
- }
178
- if (v.is_map()) {
179
- std::vector<std::string> keys = Struct::keysof(v); // sorted
180
- Value out = vmap();
181
- for (const auto& k : keys) map_put(out, k, canon(getp(v, k)));
182
- return out;
183
- }
184
- return v;
185
- }
186
-
187
- inline bool canon_eq(const Value& a, const Value& b) { return canon(a) == canon(b); }
188
-
189
- inline std::string to_lower(std::string s) {
190
- for (auto& c : s) c = static_cast<char>(std::tolower((unsigned char)c));
191
- return s;
192
- }
193
-
194
- inline bool match_string(const std::string& pattern, const std::string& val) {
195
- if (pattern.size() >= 2 && pattern.front() == '/' && pattern.back() == '/') {
196
- try {
197
- std::regex re(pattern.substr(1, pattern.size() - 2));
198
- return std::regex_search(val, re);
199
- } catch (...) { return false; }
200
- }
201
- return to_lower(val).find(to_lower(pattern)) != std::string::npos;
202
- }
203
-
204
- // match_deep: walk `check`; every leaf must equal/match base at that path.
205
- inline void match_deep(const std::string& where, const Value& check, const Value& base,
206
- const std::string& path) {
207
- if (check.is_undef()) return;
208
- if (check.is_map()) {
209
- for (const auto& kv : *check.as_map()) {
210
- Value bv = base.is_map() ? getp(base, kv.first) : Value::undef();
211
- match_deep(where, kv.second, bv, path + "." + kv.first);
212
- }
213
- return;
214
- }
215
- if (check.is_list()) {
216
- auto cl = check.as_list();
217
- for (size_t i = 0; i < cl->size(); i++) {
218
- Value bv = Value::undef();
219
- if (base.is_list() && i < base.as_list()->size()) bv = (*base.as_list())[i];
220
- match_deep(where, (*cl)[i], bv, path + "[" + std::to_string(i) + "]");
221
- }
222
- return;
223
- }
224
- // leaf
225
- if (check.is_string() && check.as_string() == "__EXISTS__") {
226
- sdktest::checks()++;
227
- if (is_nullish(base)) sdktest::record_fail(where, "match " + path + ": expected value to exist");
228
- return;
229
- }
230
- if (check.is_string() && check.as_string() == "__UNDEF__") {
231
- sdktest::checks()++;
232
- if (!is_nullish(base)) sdktest::record_fail(where, "match " + path + ": expected undef, got " + vs::jsonify(base, 0));
233
- return;
234
- }
235
- Value nc = json_normalize(check);
236
- Value nb = json_normalize(base);
237
- sdktest::checks()++;
238
- if (!canon_eq(nc, nb)) {
239
- if (check.is_string() && !check.as_string().empty() &&
240
- match_string(check.as_string(), Struct::stringify(base))) {
241
- return;
242
- }
243
- sdktest::record_fail(where, "match " + path + ": got " + vs::jsonify(nb, 0) + ", want " + vs::jsonify(nc, 0));
244
- }
245
- }
246
-
247
- // runset — drive a test.json entry set against a subject (which returns a
248
- // Value or throws SdkErrorPtr). Records failures via testlib.
249
- using RunSubject = std::function<Value(const Value& entry)>;
250
-
251
- inline void runset(const std::string& label, const Value& testspec, RunSubject subject) {
252
- if (!testspec.is_map()) return;
253
- Value set = getp(testspec, "set");
254
- if (!set.is_list()) return;
255
-
256
- auto entries = set.as_list();
257
- for (size_t i = 0; i < entries->size(); i++) {
258
- const Value& entry = (*entries)[i];
259
- if (!entry.is_map()) continue;
260
- std::string where = label + "#" + std::to_string(i);
261
-
262
- Value result = Value::undef();
263
- SdkErrorPtr err;
264
- std::string errMsg;
265
- try {
266
- result = subject(entry);
267
- } catch (const SdkErrorPtr& e) {
268
- err = e;
269
- errMsg = e->getMessage();
270
- } catch (const std::exception& e) {
271
- err = std::make_shared<SdkError>("", e.what(), nullptr);
272
- errMsg = e.what();
273
- }
274
-
275
- Value expectedErr = getp(entry, "err");
276
-
277
- if (err) {
278
- if (!is_nullish(expectedErr)) {
279
- sdktest::checks()++;
280
- if (expectedErr.is_string() && !match_string(expectedErr.as_string(), errMsg)) {
281
- sdktest::record_fail(where, "error mismatch: got \"" + errMsg + "\", want contains \"" + expectedErr.as_string() + "\"");
282
- }
283
- Value matchSpec = Helpers::toMapAny(getp(entry, "match"));
284
- if (matchSpec.is_map()) {
285
- Value resultMap = vmap();
286
- map_put(resultMap, "in", getp(entry, "in"));
287
- map_put(resultMap, "out", json_normalize(result));
288
- Value errRec = vmap();
289
- map_put(errRec, "message", Value(errMsg));
290
- map_put(resultMap, "err", errRec);
291
- match_deep(where, matchSpec, resultMap, "");
292
- }
293
- continue;
294
- }
295
- sdktest::checks()++;
296
- sdktest::record_fail(where, "unexpected error: " + errMsg);
297
- continue;
298
- }
299
-
300
- if (!is_nullish(expectedErr)) {
301
- sdktest::checks()++;
302
- sdktest::record_fail(where, "expected error containing \"" + Struct::stringify(expectedErr) + "\" but got " + vs::jsonify(json_normalize(result), 0));
303
- continue;
304
- }
305
-
306
- bool matched = false;
307
- Value matchSpec = Helpers::toMapAny(getp(entry, "match"));
308
- if (matchSpec.is_map()) {
309
- Value resultMap = vmap();
310
- map_put(resultMap, "in", getp(entry, "in"));
311
- map_put(resultMap, "out", json_normalize(result));
312
- if (!is_nullish(getp(entry, "args"))) {
313
- map_put(resultMap, "args", getp(entry, "args"));
314
- } else if (!is_nullish(getp(entry, "in"))) {
315
- map_put(resultMap, "args", vlist({getp(entry, "in")}));
316
- }
317
- if (!is_nullish(getp(entry, "ctx"))) map_put(resultMap, "ctx", getp(entry, "ctx"));
318
- match_deep(where, matchSpec, resultMap, "");
319
- matched = true;
320
- }
321
-
322
- Value expectedOut = getp(entry, "out");
323
- if (is_nullish(expectedOut) && matched) continue;
324
- if (!is_nullish(expectedOut)) {
325
- sdktest::checks()++;
326
- Value nr = json_normalize(result);
327
- Value ne = json_normalize(expectedOut);
328
- if (!canon_eq(nr, ne)) {
329
- sdktest::record_fail(where, "output mismatch: got " + vs::jsonify(nr, 0) + ", want " + vs::jsonify(ne, 0));
330
- }
331
- }
332
- }
333
- }
334
-
335
165
  // ---- Context construction from a JSON ctx map ------------------------
336
166
 
337
167
  struct EntityTestSetup {
@@ -345,6 +175,39 @@ struct EntityTestSetup {
345
175
  long long now = 0;
346
176
  };
347
177
 
178
+ // A minimal Entity for a test-entry ctx map. Context resolves the operation
179
+ // through the Entity INTERFACE — resolveOp keys the config lookup on
180
+ // entity->getName() — and a literal {"name": "planet"} map out of the
181
+ // fixture is not one, so entname would be "" and every op lookup would miss,
182
+ // reporting point_no_points for the whole makePoint group. (java's peer is
183
+ // PrimaryUtilityTest.PlEntity, go's is plEntity. cpp keeps it here rather
184
+ // than at the call site because Context holds a RAW Entity*, so the instance
185
+ // must outlive the Context: named_entity interns one per name for the life
186
+ // of the test binary.)
187
+ class NamedEntity : public Entity {
188
+ public:
189
+ explicit NamedEntity(std::string name) : name_(std::move(name)) {}
190
+ std::string getName() override { return name_; }
191
+ EntityPtr make() override { return std::make_shared<NamedEntity>(name_); }
192
+ Value data(const Value& arg) override { return Value::undef(); }
193
+ Value match(const Value& arg) override { return Value::undef(); }
194
+ void markDeleted() override { deleted_ = true; }
195
+ bool deleted() override { return deleted_; }
196
+
197
+ private:
198
+ std::string name_;
199
+ bool deleted_ = false;
200
+ };
201
+
202
+ inline Entity* named_entity(const std::string& name) {
203
+ static std::map<std::string, std::shared_ptr<NamedEntity>> interned;
204
+ auto it = interned.find(name);
205
+ if (it == interned.end()) {
206
+ it = interned.emplace(name, std::make_shared<NamedEntity>(name)).first;
207
+ }
208
+ return it->second.get();
209
+ }
210
+
348
211
  // makeCtxFromMap — build a Context from a test-entry ctx/args map.
349
212
  inline CtxPtr make_ctx_from_map(const Value& ctxmap_, std::shared_ptr<ProjectNameSDK> client,
350
213
  UtilityPtr utility) {
@@ -370,6 +233,30 @@ inline CtxPtr make_ctx_from_map(const Value& ctxmap_, std::shared_ptr<ProjectNam
370
233
  Value point = Helpers::toMapAny(getp(ctxmap, "point"));
371
234
  if (point.is_map()) cs.point = point;
372
235
 
236
+ // An entry may carry the whole operation lookup — the API config, the SDK
237
+ // options that gate it, and the entity it hangs off. makePoint's group is
238
+ // built entirely out of these three (java reads the same keys in its
239
+ // Context constructor); without them ctx.config falls back to the client's
240
+ // BAKED-IN config and the group asserts against the wrong endpoints.
241
+ Value configMap = Helpers::toMapAny(getp(ctxmap, "config"));
242
+ if (configMap.is_map()) cs.config = configMap;
243
+ Value optionsMap = Helpers::toMapAny(getp(ctxmap, "options"));
244
+ if (optionsMap.is_map()) cs.options = optionsMap;
245
+ Value entityMap = Helpers::toMapAny(getp(ctxmap, "entity"));
246
+ if (entityMap.is_map()) {
247
+ Value entname = getp(entityMap, "name");
248
+ if (entname.is_string()) cs.entity = named_entity(entname.as_string());
249
+ }
250
+
251
+ // EVERY entry gets its OWN op cache. resolveOp memoises on
252
+ // "<entity>:<opname>", and makePoint drives seven entries that all read
253
+ // planet:list from a DIFFERENT config — inheriting the client's root opmap
254
+ // would serve entry one's operation to all seven and the group would pass
255
+ // while testing one case. (java gets this for free: its makeCtxFromMap
256
+ // builds `new Context(ctxmap, null)`, so there is no base context to
257
+ // inherit a cache from.)
258
+ cs.opmap = std::make_shared<OpMap>();
259
+
373
260
  CtxPtr ctx = utility->makeContext(cs, client ? client->getRootCtx() : nullptr);
374
261
 
375
262
  if (client && !ctx->options.is_map()) ctx->options = client->optionsMap();
@@ -1,8 +1,20 @@
1
1
  // Voxgig Struct corpus driver — C++ port.
2
- // Mirrors java/src/test/StructCorpusTest.java.
3
2
  //
4
- // Loads build/test/test.json, drives every (category, name) pair, and prints
5
- // a per-.jsonic-file scoreboard plus a totals line.
3
+ // Drives the shared struct corpus (../.sdk/test/test.json, root key
4
+ // "struct") against the vendored struct utility THROUGH the VENDORED omni
5
+ // runner (test/omni_resolver.hpp over test/vendor/omni) — the engine half
6
+ // of the retired test/struct_runner.hpp. Mirrors
7
+ // tm/java/test/StructCorpusTest.java.
8
+ //
9
+ // Two behaviour changes came with the swap, both deliberate:
10
+ //
11
+ // - A missing category, a missing section or an EMPTY set now FAILS. The
12
+ // retired runner skipped all three silently, so a renamed fixture
13
+ // reported PASS while running zero assertions.
14
+ // - omni THROWS on the first bad entry in a group instead of recording
15
+ // every one, so a group reports its FIRST failure and the scoreboard
16
+ // below counts the entries that actually ran. Each group is its own
17
+ // T_RUN-style unit, so one bad group never hides the rest.
6
18
 
7
19
  #include <cstdio>
8
20
  #include <fstream>
@@ -11,21 +23,32 @@
11
23
  #include <string>
12
24
  #include <vector>
13
25
 
14
- #include "../utility/voxgigstruct/value.hpp"
15
- #include "../utility/voxgigstruct/value_io.hpp"
16
- #include "../utility/voxgigstruct/voxgig_struct.hpp"
17
- #include "struct_runner.hpp"
26
+ #include "omni_resolver.hpp"
27
+ #include "testlib.hpp"
18
28
 
19
29
  using namespace voxgig::structlib;
20
- using runner::get_spec;
21
- using runner::Result;
22
- using runner::runset;
23
- using runner::runsetflags;
24
- using runner::Subject;
30
+ namespace res = sdk::resolver;
25
31
 
26
32
  namespace {
27
33
 
28
- std::map<std::string, Result> SCOREBOARD;
34
+ // One corpus subject in the shape the groups below are written in: one
35
+ // value in, one value out. `in` is args[0], and because a Value shares its
36
+ // container by shared_ptr, an in-place rewrite by the subject reaches
37
+ // omni's `match: {args: ...}` through the resolver's refill.
38
+ using StructSubject = std::function<Value(const Value&)>;
39
+
40
+ res::Subject onearg(const StructSubject& subject) {
41
+ return [subject](std::vector<Value>& args) -> Value {
42
+ return subject(args.empty() ? Value::undef() : args[0]);
43
+ };
44
+ }
45
+
46
+ struct GroupResult {
47
+ long long cases = 0;
48
+ bool ok = true;
49
+ };
50
+
51
+ std::map<std::string, GroupResult> SCOREBOARD;
29
52
 
30
53
  const std::map<std::string, std::string>& category_to_file() {
31
54
  static const std::map<std::string, std::string> M = {
@@ -33,15 +56,78 @@ const std::map<std::string, std::string>& category_to_file() {
33
56
  {"merge", "merge.jsonic"}, {"getpath", "getpath.jsonic"},
34
57
  {"inject", "inject.jsonic"}, {"transform", "transform.jsonic"},
35
58
  {"validate", "validate.jsonic"}, {"select", "select.jsonic"},
59
+ {"nullsem", "nullsem.jsonic"},
36
60
  };
37
61
  return M;
38
62
  }
39
63
 
40
- void run(const std::string& cat, const std::string& name, bool null_flag, const Subject& s) {
64
+ // One client + one corpus runner for the whole binary.
65
+ res::Run& structRun() {
66
+ static res::Run run =
67
+ res::makeRunner("../.sdk/test/test.json", sdk::ProjectNameSDK::testSDK())
68
+ .runner("struct", Value::undef());
69
+ return run;
70
+ }
71
+
72
+ // Resolve one corpus group, failing LOUDLY when it would run zero cases.
73
+ Value group_spec(const std::string& cat, const std::string& name, const std::string& full) {
74
+ Value category = structRun().set(cat);
75
+ if (!category.is_map()) {
76
+ sdktest::record_fail(full, "struct corpus category missing: " + cat +
77
+ " - check .sdk/test/struct/");
78
+ return Value::undef();
79
+ }
80
+ Value spec = sdk::getp(category, Value(name));
81
+ if (!spec.is_map()) {
82
+ sdktest::record_fail(full, "struct corpus section missing: " + full +
83
+ " - check .sdk/test/struct/");
84
+ return Value::undef();
85
+ }
86
+ Value set = sdk::getp(spec, Value("set"));
87
+ if (!set.is_list() || set.as_list()->empty()) {
88
+ sdktest::record_fail(full, "struct corpus section is EMPTY: " + full +
89
+ " - zero cases would run");
90
+ return Value::undef();
91
+ }
92
+ return spec;
93
+ }
94
+
95
+ // Run one corpus group. A failing entry throws omni::OmniError naming the
96
+ // entry; it is recorded and the next group still runs.
97
+ void runflags(const std::string& cat, const std::string& name, bool null_flag,
98
+ const res::Subject& subject) {
41
99
  std::string full = cat + "." + name;
42
- Value spec = get_spec(cat, name);
43
- Result r = runsetflags(full, spec, null_flag, s);
44
- SCOREBOARD[full] = r;
100
+ sdktest::tests()++;
101
+ sdktest::checks()++;
102
+
103
+ GroupResult result;
104
+ long long before = res::cases();
105
+
106
+ Value spec = group_spec(cat, name, full);
107
+ if (spec.is_map()) {
108
+ try {
109
+ structRun().runsetflags(full, spec, null_flag, subject);
110
+ } catch (const res::OmniError& e) {
111
+ result.ok = false;
112
+ sdktest::record_fail(full, e.what());
113
+ } catch (const sdk::SdkErrorPtr& e) {
114
+ result.ok = false;
115
+ sdktest::record_fail(full, std::string("uncaught SdkError: ") + e->getMessage());
116
+ } catch (const std::exception& e) {
117
+ result.ok = false;
118
+ sdktest::record_fail(full, std::string("uncaught exception: ") + e.what());
119
+ }
120
+ } else {
121
+ result.ok = false;
122
+ }
123
+
124
+ result.cases = res::cases() - before;
125
+ SCOREBOARD[full] = result;
126
+ }
127
+
128
+ void run(const std::string& cat, const std::string& name, bool null_flag,
129
+ const StructSubject& subject) {
130
+ runflags(cat, name, null_flag, onearg(subject));
45
131
  }
46
132
 
47
133
  // Extract a named field from a test-spec object. This mirrors the canonical
@@ -56,6 +142,29 @@ inline Value getpDef(const Value& in, const std::string& k, const Value& def) {
56
142
  return lookup_v(in, Value(k)).is_undef() ? def : lookup_v(in, Value(k));
57
143
  }
58
144
 
145
+ // The struct-corpus nullModifier (was struct_runner.hpp's null_modifier): a
146
+ // bare "__NULL__" becomes a real null, and an embedded "__NULL__" inside a
147
+ // larger string is rewritten to the literal text "null".
148
+ void null_modifier(const Value& val, const Value& key, const Value& parent, Injection&,
149
+ const Value&) {
150
+ if (!val.is_string())
151
+ return;
152
+ const std::string& s = val.as_string();
153
+ if (s == res::NULLMARK) {
154
+ setprop(parent, key, Value(nullptr));
155
+ return;
156
+ }
157
+ if (s.find(res::NULLMARK) != std::string::npos) {
158
+ std::string out = s;
159
+ std::string::size_type pos = 0;
160
+ while ((pos = out.find(res::NULLMARK, pos)) != std::string::npos) {
161
+ out.replace(pos, res::NULLMARK.size(), "null");
162
+ pos += 4;
163
+ }
164
+ setprop(parent, key, Value(out));
165
+ }
166
+ }
167
+
59
168
  } // namespace
60
169
 
61
170
  int main() {
@@ -103,7 +212,7 @@ int main() {
103
212
  Value val = getpDef(in, "val", Value::undef());
104
213
  // Canonical subject: a stored-null (the NULLMARK in null mode) stringifies
105
214
  // as the literal text "null".
106
- if (val.is_string() && val.as_string() == runner::NULLMARK())
215
+ if (val.is_string() && val.as_string() == res::NULLMARK)
107
216
  val = Value("null");
108
217
  Value max = getp(in, "max");
109
218
  int m = max.is_int() ? static_cast<int>(max.as_int()) : -1;
@@ -119,7 +228,7 @@ int main() {
119
228
  // path *element* (the marker) is stripped from the rendered string; and a
120
229
  // wholly-null path renders "<unknown-path:null>".
121
230
  Value path = getpDef(in, "path", Value::undef());
122
- bool path_was_null = path.is_string() && path.as_string() == runner::NULLMARK();
231
+ bool path_was_null = path.is_string() && path.as_string() == res::NULLMARK;
123
232
  if (path_was_null)
124
233
  path = Value::undef();
125
234
  Value from = getp(in, "from");
@@ -336,7 +445,7 @@ int main() {
336
445
  // Canonical subject passes { modify: nullModifier }: an injected stored-null
337
446
  // (the marker, in null mode) renders as the literal text "null".
338
447
  Injection inj(Value::undef(), Value::undef());
339
- inj.modify = runner::null_modifier;
448
+ inj.modify = null_modifier;
340
449
  return inject(getp(in, "val"), getp(in, "store"), &inj);
341
450
  });
342
451
  run("inject", "deep", true,
@@ -427,49 +536,64 @@ int main() {
427
536
  return Value(out);
428
537
  });
429
538
 
430
- // Aggregate per-file scoreboard.
431
- std::map<std::string, std::pair<int, int>> by_file;
539
+ // ===== nullsem =====
540
+ // Does a PRESENT key holding a JSON null read as "no value"? Every lane
541
+ // runs {null: false}: with the flag on, the runner rewrites every null to
542
+ // "__NULL__" and the section asserts nothing about null at all.
543
+ run("nullsem", "getprop", false, [](const Value& in) {
544
+ Value alt = getpDef(in, "alt", Value::undef());
545
+ return alt.is_undef() ? getprop(getp(in, "val"), getp(in, "key"))
546
+ : getprop(getp(in, "val"), getp(in, "key"), alt);
547
+ });
548
+ run("nullsem", "getelem", false, [](const Value& in) {
549
+ Value alt = getpDef(in, "alt", Value::undef());
550
+ return alt.is_undef() ? getelem(getp(in, "val"), getp(in, "key"))
551
+ : getelem(getp(in, "val"), getp(in, "key"), alt);
552
+ });
553
+ run("nullsem", "getpath", false,
554
+ [](const Value& in) { return getpath_v(getp(in, "store"), getp(in, "path")); });
555
+ run("nullsem", "haskey", false,
556
+ [](const Value& in) { return Value(haskey(getp(in, "src"), getp(in, "key"))); });
557
+ run("nullsem", "keysof", false, [](const Value& in) {
558
+ auto out = std::make_shared<List>();
559
+ for (const auto& k : keysof(in))
560
+ out->push_back(Value(k));
561
+ return Value(out);
562
+ });
563
+
564
+ // ===== scoreboard =====
565
+ // Per-.jsonic-file case counts. `cases` is what the vendored runner
566
+ // actually DROVE: a group that throws stops at its first bad entry, so a
567
+ // count below the fixture's set size is itself a failure signal.
568
+ std::map<std::string, std::pair<long long, int>> by_file; // cases, failed groups
432
569
  std::map<std::string, std::vector<std::pair<std::string, std::string>>> details;
433
- int totalP = 0, totalT = 0;
570
+ long long total_cases = 0;
571
+ int failed_groups = 0;
572
+
434
573
  for (const auto& [key, r] : SCOREBOARD) {
435
574
  std::string cat = key.substr(0, key.find('.'));
436
575
  auto it = category_to_file().find(cat);
437
576
  std::string file = it == category_to_file().end() ? cat + ".jsonic" : it->second;
438
- by_file[file].first += r.passed;
439
- by_file[file].second += r.total;
440
- details[file].push_back({key, std::to_string(r.passed) + "/" + std::to_string(r.total)});
441
- totalP += r.passed;
442
- totalT += r.total;
577
+ by_file[file].first += r.cases;
578
+ by_file[file].second += r.ok ? 0 : 1;
579
+ details[file].push_back({key, std::to_string(r.cases) + (r.ok ? "" : " FAILED")});
580
+ total_cases += r.cases;
581
+ if (!r.ok)
582
+ failed_groups++;
443
583
  }
444
584
 
445
585
  std::cout << "\n========= STRUCT CORPUS SCOREBOARD =========\n";
446
586
  for (const auto& [file, pt] : by_file) {
447
- std::printf(" %-18s %4d / %4d\n", file.c_str(), pt.first, pt.second);
587
+ std::printf(" %-18s %5lld cases%s\n", file.c_str(), pt.first,
588
+ pt.second > 0 ? " (FAILURES)" : "");
448
589
  for (const auto& [name, tally] : details[file]) {
449
590
  std::printf(" %-30s %s\n", name.c_str(), tally.c_str());
450
591
  }
451
592
  }
452
- std::printf(" %-18s %4d / %4d\n", "TOTAL", totalP, totalT);
593
+ std::printf(" %-18s %5lld cases, %d group(s) failed\n", "TOTAL", total_cases, failed_groups);
453
594
  std::cout << "============================================\n";
454
595
 
455
- // Optionally print failure details when CORPUS_VERBOSE is set.
456
- if (const char* v = std::getenv("CORPUS_VERBOSE"); v && std::string(v) != "0") {
457
- for (const auto& [name, r] : SCOREBOARD) {
458
- if (r.failures.empty())
459
- continue;
460
- std::cerr << "\n--- " << name << " (" << r.passed << "/" << r.total << ") ---\n";
461
- int shown = 0;
462
- for (const auto& f : r.failures) {
463
- std::cerr << " " << f << "\n";
464
- if (++shown >= 5) {
465
- std::cerr << " ... " << (r.failures.size() - shown) << " more\n";
466
- break;
467
- }
468
- }
469
- }
470
- }
471
-
472
- // Write target/corpus-scoreboard.json
596
+ // Write corpus-scoreboard.json beside the binary's working directory.
473
597
  std::ofstream out("corpus-scoreboard.json");
474
598
  if (out) {
475
599
  out << "{\n \"files\": {\n";
@@ -478,17 +602,20 @@ int main() {
478
602
  if (!first)
479
603
  out << ",\n";
480
604
  first = false;
481
- out << " \"" << file << "\": {\"passed\": " << pt.first << ", \"total\": " << pt.second
605
+ out << " \"" << file << "\": {\"cases\": " << pt.first << ", \"failed\": " << pt.second
482
606
  << "}";
483
607
  }
484
- out << "\n },\n \"total\": {\"passed\": " << totalP << ", \"total\": " << totalT << "}\n}\n";
608
+ out << "\n },\n \"total\": {\"cases\": " << total_cases << ", \"failed\": " << failed_groups
609
+ << "}\n}\n";
485
610
  }
486
611
 
487
- // Green-bar: any failing corpus entry fails the test binary.
488
- if (totalP != totalT) {
489
- std::cerr << "struct corpus: " << (totalT - totalP) << " FAILED of " << totalT << "\n";
490
- return 1;
612
+ if (failed_groups > 0) {
613
+ std::cerr << "struct corpus: " << failed_groups << " group(s) FAILED of " << SCOREBOARD.size()
614
+ << "\n";
615
+ } else {
616
+ std::cout << "struct corpus: " << total_cases << " cases PASSED across " << SCOREBOARD.size()
617
+ << " groups\n";
491
618
  }
492
- std::cout << "struct corpus: " << totalP << "/" << totalT << " PASSED\n";
493
- return 0;
619
+
620
+ return sdktest::summary("struct_corpus_test");
494
621
  }