@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,902 @@
1
+ // VENDORED: @voxgig/omni sdk-20260907-0029-0 (go/omni.go)
2
+ // Source: https://github.com/voxgig/omni @ 274708cc2d12b21707d975543953f845f8444be0 [tag: sdk-20260907-0029-0]
3
+ // License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ // Omni: the shared multi-language test runner.
5
+ //
6
+ // A test spec is plain JSON. The same spec file drives the same tests in
7
+ // every language that ships an omni port.
8
+ //
9
+ // Port of the canonical TypeScript implementation
10
+ // (typescript/src/Runner.ts). Behaviour must match, case for case.
11
+ //
12
+ // Go has no exceptions, so a failing check is returned as an error rather
13
+ // than thrown: `if err := runset(spec, subject); nil != err { t.Fatal(err) }`.
14
+
15
+ package omni
16
+
17
+ import (
18
+ "encoding/json"
19
+ "fmt"
20
+ "math"
21
+ "os"
22
+ "reflect"
23
+ "regexp"
24
+ "slices"
25
+ "sort"
26
+ "strconv"
27
+ "strings"
28
+ )
29
+
30
+ // Subject is the function under test. A spec entry's arguments arrive as a
31
+ // list of JSON values.
32
+ type Subject func(args ...any) (any, error)
33
+
34
+ // Flags are the run-time options for a set of test entries.
35
+ type Flags map[string]any
36
+
37
+ // Provider hosts the system under test. Every hook is optional.
38
+ type Provider struct {
39
+ // Subject resolves a test subject by name.
40
+ Subject func(name string) Subject
41
+ // Client builds a sub-provider from a DEF.client entry's options.
42
+ Client func(options any) (*Provider, error)
43
+ // Contextify wraps a map argument as a call context.
44
+ Contextify func(val any) any
45
+ // Inject resolves references in client options against the store.
46
+ Inject func(options any, store any) any
47
+ // Errify builds the `match.err` base from the raised error, REPLACING
48
+ // the default Errify. A library whose errors carry a code can then
49
+ // assert on it with `match: {err: {code: "x"}}` instead of
50
+ // pattern-matching prose.
51
+ //
52
+ // `any`, not `map[string]any`, because the canonical is `(err) => Json`
53
+ // and `match.err` compares a scalar or a list as readily as a map. The
54
+ // built-in Errify happens to return a map; a hook is not held to that.
55
+ Errify func(err any) any
56
+ }
57
+
58
+ // RunSet runs one set of test entries.
59
+ type RunSet func(testspec any, subject Subject) error
60
+
61
+ // RunSetFlags runs one set of test entries with flags.
62
+ type RunSetFlags func(testspec any, flags Flags, subject Subject) error
63
+
64
+ // RunPack is what a runner returns for one named spec section.
65
+ type RunPack struct {
66
+ Spec any
67
+ RunSet RunSet
68
+ RunSetFlags RunSetFlags
69
+ Subject Subject
70
+ Client *Provider
71
+ }
72
+
73
+ // Set returns a named group of the resolved spec.
74
+ func (runpack *RunPack) Set(name string) any {
75
+ if spec, is := runpack.Spec.(map[string]any); is {
76
+ return spec[name]
77
+ }
78
+ return nil
79
+ }
80
+
81
+ // Runner resolves one named section of a spec.
82
+ type Runner func(name string, store any) (*RunPack, error)
83
+
84
+ // SPECVERSION is the newest spec format version this runner understands. A
85
+ // spec with no OMNI block is version 0: the original, lenient format,
86
+ // frozen forever. Version 1 turns on strict entry validation (see
87
+ // checkentry).
88
+ const SPECVERSION = 1
89
+
90
+ // CAPABILITIES are the capability strings this runner supports beyond the
91
+ // version baseline. A spec's OMNI.requires list is checked against this: an
92
+ // unknown capability refuses the spec loudly at load time, instead of a
93
+ // lagging port silently mis-running it. (Empty today; future format
94
+ // features mint a string here.)
95
+ var CAPABILITIES = []string{}
96
+
97
+ // ENTRYFIELDS is the complete set of fields an entry may carry. Under
98
+ // version 1 anything else is an error: an unrecognised key is almost
99
+ // always a typo'd assertion, and a typo'd assertion is a test that
100
+ // silently stopped testing.
101
+ var ENTRYFIELDS = []string{"in", "args", "ctx", "out", "err", "match", "client", "id", "doc"}
102
+
103
+ // OmniError is a test failure (or a malformed spec). Distinct from errors
104
+ // returned by the subject under test, which are candidates for an `err`
105
+ // expectation.
106
+ type OmniError struct {
107
+ Message string
108
+ Entry any
109
+ }
110
+
111
+ func (omnierr *OmniError) Error() string {
112
+ return omnierr.Message
113
+ }
114
+
115
+ // IsOmniError reports whether an error is a test failure.
116
+ func IsOmniError(err error) bool {
117
+ _, is := err.(*OmniError)
118
+ return is
119
+ }
120
+
121
+ // LoadSpec loads a spec: a path to a JSON file, or an already-parsed value.
122
+ func LoadSpec(specref any) (any, error) {
123
+ if path, is := specref.(string); is {
124
+ text, err := os.ReadFile(path)
125
+ if nil != err {
126
+ return nil, &OmniError{Message: "omni: cannot read spec: " + path}
127
+ }
128
+ var alltests any
129
+ if err := json.Unmarshal(text, &alltests); nil != err {
130
+ return nil, &OmniError{Message: "omni: cannot parse spec: " + path + ": " + err.Error()}
131
+ }
132
+ return alltests, nil
133
+ }
134
+ return specref, nil
135
+ }
136
+
137
+ // resolveversion reads the spec's format version from its optional
138
+ // top-level OMNI block, and refuses a spec this runner cannot faithfully
139
+ // run: a version newer than SPECVERSION, or a required capability not in
140
+ // CAPABILITIES.
141
+ func resolveversion(alltests any) (int, error) {
142
+ specmap, is := alltests.(map[string]any)
143
+ if !is {
144
+ return 0, nil
145
+ }
146
+
147
+ // A present-but-null block is malformed, exactly as in canonical -
148
+ // only a genuinely absent OMNI key means version 0.
149
+ meta, has := specmap["OMNI"]
150
+ if !has {
151
+ return 0, nil
152
+ }
153
+
154
+ metamap, ismetamap := meta.(map[string]any)
155
+ version, isnum := ToNum(metamap["version"])
156
+ if !ismetamap || !isnum || version != math.Trunc(version) {
157
+ return 0, &OmniError{Message: "omni: malformed OMNI version block"}
158
+ }
159
+
160
+ if version < 0 || SPECVERSION < version {
161
+ return 0, &OmniError{Message: "omni: unsupported spec version: " + strconv.Itoa(int(version))}
162
+ }
163
+
164
+ if requires, has := metamap["requires"]; has {
165
+ list, is := requires.([]any)
166
+ if !is {
167
+ return 0, &OmniError{Message: "omni: malformed OMNI requires list"}
168
+ }
169
+ for _, cap := range list {
170
+ capstr, is := cap.(string)
171
+ if !is || !slices.Contains(CAPABILITIES, capstr) {
172
+ return 0, &OmniError{Message: "omni: spec requires unsupported capability: " + Stringify(cap)}
173
+ }
174
+ }
175
+ }
176
+
177
+ return int(version), nil
178
+ }
179
+
180
+ // checkentry is strict entry validation, applied when the spec declares
181
+ // version 1 or later. The lenient format converts each of these mistakes
182
+ // into a silent pass or a dead field; here they fail with the entry named.
183
+ func checkentry(flags Flags, index int, entry map[string]any) error {
184
+ keys := make([]string, 0, len(entry))
185
+ for key := range entry {
186
+ keys = append(keys, key)
187
+ }
188
+ sort.Strings(keys)
189
+
190
+ for _, key := range keys {
191
+ if !slices.Contains(ENTRYFIELDS, key) {
192
+ return fail(flags, index, entry, "unknown entry field: "+key, nil, nil)
193
+ }
194
+ }
195
+
196
+ argsources := 0
197
+ for _, key := range []string{"in", "args", "ctx"} {
198
+ if _, has := entry[key]; has {
199
+ argsources++
200
+ }
201
+ }
202
+ if 1 < argsources {
203
+ return fail(flags, index, entry, "entry has more than one of in, args, ctx", nil, nil)
204
+ }
205
+
206
+ if entryerr, has := entry["err"]; has && nil != entryerr {
207
+ if _, has := entry["out"]; has {
208
+ return fail(flags, index, entry, "entry has both err and out", nil, nil)
209
+ }
210
+ }
211
+
212
+ if id, has := entry["id"]; has {
213
+ if _, is := id.(string); !is {
214
+ return fail(flags, index, entry, "entry id is not a string", nil, nil)
215
+ }
216
+ }
217
+
218
+ return nil
219
+ }
220
+
221
+ // checkset validates a version-1 group up front, against the AUTHORED
222
+ // entries - null-normalisation would otherwise rewrite an authored null
223
+ // (e.g. id: null) into a sentinel string and hide it from validation. A
224
+ // malformed spec is a spec error, not a test result, so it fails before
225
+ // any subject runs.
226
+ func checkset(flags Flags, testspec any, normalset []any) error {
227
+ origset := normalset
228
+ var origmap map[string]any
229
+ if tmap, is := testspec.(map[string]any); is {
230
+ origmap = tmap
231
+ if oset, is := tmap["set"].([]any); is {
232
+ origset = oset
233
+ }
234
+ }
235
+
236
+ if 0 == len(origset) {
237
+ isempty, _ := origmap["empty"].(bool)
238
+ if !isempty {
239
+ return &OmniError{Message: "omni: empty test set: " + Stringify(flags["name"])}
240
+ }
241
+ }
242
+
243
+ for index, rawentry := range origset {
244
+ entry, is := rawentry.(map[string]any)
245
+ if !is {
246
+ return fail(flags, index, nil, "entry is not a map", nil, nil)
247
+ }
248
+ if err := checkentry(flags, index, entry); nil != err {
249
+ return err
250
+ }
251
+ }
252
+
253
+ return nil
254
+ }
255
+
256
+ // ResolveSpec finds `primary.<name>`, then `<name>`, then the whole spec.
257
+ func ResolveSpec(name string, alltests any) any {
258
+ if "" == name {
259
+ return alltests
260
+ }
261
+
262
+ if amap, is := alltests.(map[string]any); is {
263
+ if primary, is := amap["primary"].(map[string]any); is {
264
+ if section, has := primary[name]; has && nil != section {
265
+ return section
266
+ }
267
+ }
268
+ if section, has := amap[name]; has && nil != section {
269
+ return section
270
+ }
271
+ }
272
+
273
+ return alltests
274
+ }
275
+
276
+ func resolveclients(provider *Provider, spec any, store any) (map[string]*Provider, error) {
277
+ clients := map[string]*Provider{}
278
+
279
+ specmap, is := spec.(map[string]any)
280
+ if !is {
281
+ return clients, nil
282
+ }
283
+
284
+ defmap, is := specmap["DEF"].(map[string]any)
285
+ if !is {
286
+ return clients, nil
287
+ }
288
+
289
+ defclient, is := defmap["client"].(map[string]any)
290
+ if !is {
291
+ return clients, nil
292
+ }
293
+
294
+ // A spec may define clients that a given test run never references.
295
+ if nil == provider.Client {
296
+ return clients, nil
297
+ }
298
+
299
+ names := make([]string, 0, len(defclient))
300
+ for name := range defclient {
301
+ names = append(names, name)
302
+ }
303
+ sort.Strings(names)
304
+
305
+ for _, clientname := range names {
306
+ copts := any(map[string]any{})
307
+ if cdef, is := defclient[clientname].(map[string]any); is {
308
+ if ctest, is := cdef["test"].(map[string]any); is {
309
+ if options, has := ctest["options"]; has {
310
+ copts = Clone(options)
311
+ }
312
+ }
313
+ }
314
+
315
+ if nil != provider.Inject && IsMap(store) {
316
+ provider.Inject(copts, store)
317
+ }
318
+
319
+ client, err := provider.Client(copts)
320
+ if nil != err {
321
+ return nil, &OmniError{Message: "omni: cannot make client: " + clientname + ": " + err.Error()}
322
+ }
323
+ clients[clientname] = client
324
+ }
325
+
326
+ return clients, nil
327
+ }
328
+
329
+ func resolvesubject(name string, provider *Provider) Subject {
330
+ if "" == name || nil == provider || nil == provider.Subject {
331
+ return nil
332
+ }
333
+ return provider.Subject(name)
334
+ }
335
+
336
+ func resolveflags(flags Flags) Flags {
337
+ out := Flags{}
338
+ for key, val := range flags {
339
+ out[key] = val
340
+ }
341
+ if _, has := out["null"]; !has {
342
+ out["null"] = true
343
+ }
344
+ return out
345
+ }
346
+
347
+ func flagbool(flags Flags, name string) bool {
348
+ val, has := flags[name]
349
+ if !has || nil == val {
350
+ return false
351
+ }
352
+ flag, is := val.(bool)
353
+ return is && flag
354
+ }
355
+
356
+ // An entry with no `out` expects a null (or absent) result.
357
+ func resolveentry(entry map[string]any, flags Flags) map[string]any {
358
+ if out, has := entry["out"]; (!has || nil == out) && flagbool(flags, "null") {
359
+ entry["out"] = NULLMARK
360
+ }
361
+ return entry
362
+ }
363
+
364
+ type testpack struct {
365
+ client *Provider
366
+ subject Subject
367
+ }
368
+
369
+ func resolvetestpack(
370
+ name string,
371
+ entry map[string]any,
372
+ subject Subject,
373
+ provider *Provider,
374
+ clients map[string]*Provider,
375
+ ) (*testpack, error) {
376
+ pack := &testpack{client: provider, subject: subject}
377
+
378
+ clientname, has := entry["client"].(string)
379
+ if !has {
380
+ return pack, nil
381
+ }
382
+
383
+ client, found := clients[clientname]
384
+ if !found {
385
+ return nil, &OmniError{Message: "omni: unknown client: " + clientname, Entry: entry}
386
+ }
387
+
388
+ pack.client = client
389
+ if clientsubject := resolvesubject(name, client); nil != clientsubject {
390
+ pack.subject = clientsubject
391
+ }
392
+
393
+ return pack, nil
394
+ }
395
+
396
+ // Build the argument list: `ctx`, `args`, or `in`.
397
+ func resolveargs(entry map[string]any, pack *testpack, provider *Provider) []any {
398
+ var args []any
399
+
400
+ ctx, hasctx := entry["ctx"]
401
+ rawargs, hasargs := entry["args"]
402
+
403
+ if hasctx {
404
+ args = []any{ctx}
405
+ } else if hasargs {
406
+ if list, is := rawargs.([]any); is {
407
+ args = list
408
+ } else {
409
+ args = []any{rawargs}
410
+ }
411
+ } else {
412
+ args = []any{Clone(entry["in"])}
413
+ }
414
+
415
+ if (hasctx || hasargs) && 0 < len(args) {
416
+ if first, is := args[0].(map[string]any); is {
417
+ cloned := Clone(first)
418
+ if nil != provider.Contextify {
419
+ cloned = provider.Contextify(cloned)
420
+ }
421
+ if asmap, is := cloned.(map[string]any); is {
422
+ asmap["client"] = pack.client
423
+ }
424
+ args[0] = cloned
425
+ entry["ctx"] = cloned
426
+ }
427
+ }
428
+
429
+ return args
430
+ }
431
+
432
+ // FixJson normalises a value: nulls (and absent values) become NULLMARK,
433
+ // errors become {name,message} maps, containers become []any/map[string]any.
434
+ // Always returns a fresh copy.
435
+ func FixJson(val any, flags Flags) any {
436
+ donull := true
437
+ if nil != flags {
438
+ if raw, has := flags["null"]; has && nil != raw {
439
+ flag, is := raw.(bool)
440
+ donull = !is || flag
441
+ }
442
+ }
443
+ return fixjsonval(val, donull)
444
+ }
445
+
446
+ func fixjsonval(val any, donull bool) any {
447
+ if nil == val || IsAbsent(val) {
448
+ if donull {
449
+ return NULLMARK
450
+ }
451
+ return nil
452
+ }
453
+
454
+ if err, is := val.(error); is {
455
+ return Errify(err)
456
+ }
457
+
458
+ switch typed := val.(type) {
459
+ case string, bool, float64, float32,
460
+ int, int8, int16, int32, int64,
461
+ uint, uint8, uint16, uint32, uint64:
462
+ return typed
463
+ case []any:
464
+ out := make([]any, len(typed))
465
+ for index, entry := range typed {
466
+ out[index] = fixjsonval(entry, donull)
467
+ }
468
+ return out
469
+ case map[string]any:
470
+ out := make(map[string]any, len(typed))
471
+ for key, entry := range typed {
472
+ out[key] = fixjsonval(entry, donull)
473
+ }
474
+ return out
475
+ }
476
+
477
+ // Any other Go container: normalise via reflection.
478
+ value := reflect.ValueOf(val)
479
+ switch value.Kind() {
480
+ case reflect.Pointer, reflect.Interface:
481
+ if value.IsNil() {
482
+ if donull {
483
+ return NULLMARK
484
+ }
485
+ return nil
486
+ }
487
+ return fixjsonval(value.Elem().Interface(), donull)
488
+ case reflect.Slice, reflect.Array:
489
+ out := make([]any, value.Len())
490
+ for index := 0; index < value.Len(); index++ {
491
+ out[index] = fixjsonval(value.Index(index).Interface(), donull)
492
+ }
493
+ return out
494
+ case reflect.Map:
495
+ out := make(map[string]any, value.Len())
496
+ iter := value.MapRange()
497
+ for iter.Next() {
498
+ out[StrKey(iter.Key().Interface())] = fixjsonval(iter.Value().Interface(), donull)
499
+ }
500
+ return out
501
+ }
502
+
503
+ return val
504
+ }
505
+
506
+ // Errify is the JSON form of an error: always at least {name,message}.
507
+ func Errify(err any) map[string]any {
508
+ if aserr, is := err.(error); is {
509
+ name := reflect.TypeOf(aserr).String()
510
+ if strings.HasPrefix(name, "*") {
511
+ name = name[1:]
512
+ }
513
+ return map[string]any{"name": name, "message": aserr.Error()}
514
+ }
515
+ return map[string]any{"name": "Error", "message": fmt.Sprintf("%v", err)}
516
+ }
517
+
518
+ // errbase is the error base a `match.err` sees: the provider's own, when
519
+ // it has one.
520
+ func errbase(err any, provider *Provider) any {
521
+ if nil != provider && nil != provider.Errify {
522
+ return provider.Errify(err)
523
+ }
524
+ return Errify(err)
525
+ }
526
+
527
+ func errmessage(err error) string {
528
+ if nil == err {
529
+ return ""
530
+ }
531
+ return err.Error()
532
+ }
533
+
534
+ // The label of one entry, for failure messages.
535
+ func entryref(flags Flags, index int, entry map[string]any) string {
536
+ label := "set"
537
+ if name, is := flags["name"].(string); is && "" != name {
538
+ label = name
539
+ }
540
+ entryid := ""
541
+ if id, has := entry["id"]; has && nil != id {
542
+ entryid = " (" + Stringify(id) + ")"
543
+ }
544
+ return fmt.Sprintf("%s[%d]%s", label, index, entryid)
545
+ }
546
+
547
+ func fail(flags Flags, index int, entry map[string]any, reason string, expected *string, actual *string) *OmniError {
548
+ msg := "omni: " + entryref(flags, index, entry) + ": " + reason
549
+ if nil != expected {
550
+ msg += "\n expected: " + *expected
551
+ }
552
+ if nil != actual {
553
+ msg += "\n actual: " + *actual
554
+ }
555
+ msg += "\n entry: " + Stringify(entrysummary(entry))
556
+ return &OmniError{Message: msg, Entry: entry}
557
+ }
558
+
559
+ func strptr(val string) *string {
560
+ return &val
561
+ }
562
+
563
+ // The spec-defined part of an entry (drop runner bookkeeping).
564
+ func entrysummary(entry map[string]any) any {
565
+ out := map[string]any{}
566
+ for key, val := range entry {
567
+ if "res" != key && "thrown" != key && "ctx" != key {
568
+ out[key] = val
569
+ }
570
+ }
571
+ return out
572
+ }
573
+
574
+ func checkresult(flags Flags, index int, entry map[string]any, args []any, res any) error {
575
+ matched := false
576
+
577
+ if entryerr, has := entry["err"]; has && nil != entryerr {
578
+ return fail(flags, index, entry, "expected error did not occur",
579
+ strptr(Stringify(entryerr)), strptr(Stringify(res)))
580
+ }
581
+
582
+ if check, has := entry["match"]; has && nil != check {
583
+ base := map[string]any{
584
+ "in": entry["in"],
585
+ "args": args,
586
+ "out": entry["res"],
587
+ "ctx": entry["ctx"],
588
+ }
589
+ if err := Match(flags, index, entry, check, base); nil != err {
590
+ return err
591
+ }
592
+ matched = true
593
+ }
594
+
595
+ out := entry["out"]
596
+
597
+ if DeepEqual(res, out) {
598
+ return nil
599
+ }
600
+
601
+ // NOTE: a match with no explicit out is a complete check on its own.
602
+ if matched && (NULLMARK == out || nil == out) {
603
+ return nil
604
+ }
605
+
606
+ return fail(flags, index, entry, "result mismatch", strptr(Stringify(out)), strptr(Stringify(res)))
607
+ }
608
+
609
+ func handleerror(flags Flags, index int, entry map[string]any, err error, provider *Provider) error {
610
+ entryerr, has := entry["err"]
611
+
612
+ if has && nil != entryerr {
613
+ istrue := false
614
+ if flag, is := entryerr.(bool); is && flag {
615
+ istrue = true
616
+ }
617
+
618
+ if istrue || MatchVal(entryerr, errmessage(err)) {
619
+ if check, has := entry["match"]; has && nil != check {
620
+ base := map[string]any{
621
+ "in": entry["in"],
622
+ "out": entry["res"],
623
+ "ctx": entry["ctx"],
624
+ "err": errbase(err, provider),
625
+ }
626
+ return Match(flags, index, entry, check, base)
627
+ }
628
+ return nil
629
+ }
630
+
631
+ return fail(flags, index, entry, "error mismatch",
632
+ strptr(Stringify(entryerr)), strptr(errmessage(err)))
633
+ }
634
+
635
+ return fail(flags, index, entry, "unexpected error", nil, strptr(errmessage(err)))
636
+ }
637
+
638
+ // Match checks that every leaf of `check` is present, and matches, in
639
+ // `base`.
640
+ func Match(flags Flags, index int, entry map[string]any, check any, base any) error {
641
+ // Read the base DIRECTLY. The clone bought nothing - the walk below
642
+ // only reads, via GetPath - and it blows the stack on a cyclic base. A
643
+ // port driving entries with live objects rather than pure JSON produces
644
+ // those routinely (voxgig/sdkgen's corpus matches a live client context
645
+ // whose root context reaches the client again).
646
+ cbase := base
647
+ var failure error
648
+
649
+ Walk(Clone(check), func(_key any, val any, _parent any, path []any) any {
650
+ if nil != failure {
651
+ return val
652
+ }
653
+
654
+ where := "<root>"
655
+ if 0 < len(path) {
656
+ where = PathIfy(path)
657
+ }
658
+
659
+ if IsNode(val) {
660
+ return val
661
+ }
662
+
663
+ baseval := GetPath(cbase, path)
664
+
665
+ // The sentinels are tested BEFORE the identity check below. Otherwise
666
+ // a subject returning the literal string "__UNDEF__" satisfies an
667
+ // assertion that the key is absent - two mutually exclusive states
668
+ // passing one check. A sentinel that accepts its own literal is not a
669
+ // sentinel. (NULLMARK still accepts NULLMARK: under the default null
670
+ // flag a real null has already been normalised to it, so the two are
671
+ // genuinely indistinguishable here - that one needs a raw-value
672
+ // escape, not an ordering change.)
673
+
674
+ // Explicitly absent: satisfied only by a genuinely missing key, never
675
+ // by a present null (the distinction the sentinels exist to keep).
676
+ if UNDEFMARK == val {
677
+ if IsAbsent(baseval) {
678
+ return val
679
+ }
680
+ failure = fail(flags, index, entry, "expected absent at "+where,
681
+ strptr("absent"), strptr(Stringify(baseval)))
682
+ return val
683
+ }
684
+
685
+ // Explicitly null: satisfied only by a present null.
686
+ if NULLMARK == val {
687
+ if nil == baseval || NULLMARK == baseval {
688
+ return val
689
+ }
690
+ failure = fail(flags, index, entry, "expected null at "+where,
691
+ strptr("null"), strptr(Stringify(baseval)))
692
+ return val
693
+ }
694
+
695
+ // Explicitly present: any present value, including null.
696
+ if EXISTSMARK == val {
697
+ if !IsAbsent(baseval) {
698
+ return val
699
+ }
700
+ failure = fail(flags, index, entry, "expected present at "+where,
701
+ strptr("present"), strptr("absent"))
702
+ return val
703
+ }
704
+
705
+ // Identical values match. This sits below the sentinel branches on
706
+ // purpose - see the note above.
707
+ if DeepEqual(val, baseval) {
708
+ return val
709
+ }
710
+
711
+ // A concrete expectation never matches a missing key - a match leaf
712
+ // against an absent value must fail, not substring-match "undefined".
713
+ if IsAbsent(baseval) {
714
+ failure = fail(flags, index, entry, "match failed at "+where,
715
+ strptr(Stringify(val)), strptr("absent"))
716
+ return val
717
+ }
718
+
719
+ if !MatchVal(val, baseval) {
720
+ failure = fail(flags, index, entry, "match failed at "+where,
721
+ strptr(Stringify(val)), strptr(Stringify(baseval)))
722
+ }
723
+
724
+ return val
725
+ })
726
+
727
+ return failure
728
+ }
729
+
730
+ // MatchVal matches one leaf: /regex/ or case-insensitive substring for
731
+ // strings.
732
+ func MatchVal(check any, base any) bool {
733
+ if DeepEqual(check, base) {
734
+ return true
735
+ }
736
+
737
+ want := check
738
+
739
+ if nil == want {
740
+ return nil == base || IsAbsent(base) || NULLMARK == base
741
+ }
742
+
743
+ if text, is := want.(string); is {
744
+ // An empty want would substring-match anything: reject it.
745
+ if "" == text {
746
+ return false
747
+ }
748
+
749
+ basestr := Stringify(base)
750
+
751
+ if strings.HasPrefix(text, "/") && strings.HasSuffix(text, "/") && 2 < len(text) {
752
+ pattern, err := regexp.Compile(text[1 : len(text)-1])
753
+ if nil != err {
754
+ return false
755
+ }
756
+ return pattern.MatchString(basestr)
757
+ }
758
+
759
+ return strings.Contains(strings.ToLower(basestr), strings.ToLower(text))
760
+ }
761
+
762
+ return DeepEqual(want, base)
763
+ }
764
+
765
+ // NullModifier converts NULLMARK sentinels back into real nulls. Use as a
766
+ // Walk callback when a spec value must reach the subject as an actual null.
767
+ func NullModifier(key any, val any, parent any, _path []any) any {
768
+ if text, is := val.(string); is {
769
+ if NULLMARK == text {
770
+ return nil
771
+ }
772
+ return strings.ReplaceAll(text, NULLMARK, "null")
773
+ }
774
+ return val
775
+ }
776
+
777
+ // Call a subject, converting a panic into an error.
778
+ func safecall(subject Subject, args []any) (res any, err error) {
779
+ defer func() {
780
+ if recovered := recover(); nil != recovered {
781
+ if aserr, is := recovered.(error); is {
782
+ err = aserr
783
+ } else {
784
+ err = fmt.Errorf("%v", recovered)
785
+ }
786
+ }
787
+ }()
788
+
789
+ return subject(args...)
790
+ }
791
+
792
+ // MakeRunner makes a runner for a spec file (or spec value) and a provider.
793
+ func MakeRunner(specref any, provider *Provider) (Runner, error) {
794
+ alltests, err := LoadSpec(specref)
795
+ if nil != err {
796
+ return nil, err
797
+ }
798
+
799
+ specversion, err := resolveversion(alltests)
800
+ if nil != err {
801
+ return nil, err
802
+ }
803
+
804
+ useprovider := provider
805
+ if nil == useprovider {
806
+ useprovider = &Provider{}
807
+ }
808
+
809
+ return func(name string, store any) (*RunPack, error) {
810
+ spec := ResolveSpec(name, alltests)
811
+
812
+ clients, err := resolveclients(useprovider, spec, store)
813
+ if nil != err {
814
+ return nil, err
815
+ }
816
+
817
+ defsubject := resolvesubject(name, useprovider)
818
+
819
+ runsetflags := func(testspec any, flags Flags, subject Subject) error {
820
+ useflags := resolveflags(flags)
821
+ if label, is := useflags["name"].(string); !is || "" == label {
822
+ if "" != name {
823
+ useflags["name"] = name
824
+ } else {
825
+ useflags["name"] = "set"
826
+ }
827
+ }
828
+
829
+ usesubject := subject
830
+ if nil == usesubject {
831
+ usesubject = defsubject
832
+ }
833
+ if nil == usesubject {
834
+ return &OmniError{Message: "omni: no test subject for: " + Stringify(useflags["name"])}
835
+ }
836
+
837
+ testspecmap, is := FixJson(testspec, useflags).(map[string]any)
838
+ if !is {
839
+ return &OmniError{Message: "omni: test spec has no set: " + Stringify(useflags["name"])}
840
+ }
841
+
842
+ testset, is := testspecmap["set"].([]any)
843
+ if !is {
844
+ return &OmniError{Message: "omni: test spec has no set: " + Stringify(useflags["name"])}
845
+ }
846
+
847
+ if 1 <= specversion {
848
+ if err := checkset(useflags, testspec, testset); nil != err {
849
+ return err
850
+ }
851
+ }
852
+
853
+ for index, rawentry := range testset {
854
+ entry, is := rawentry.(map[string]any)
855
+ if !is {
856
+ return &OmniError{
857
+ Message: fmt.Sprintf("omni: %s[%d]: entry is not a map", useflags["name"], index),
858
+ }
859
+ }
860
+
861
+ entry = resolveentry(entry, useflags)
862
+
863
+ pack, err := resolvetestpack(name, entry, usesubject, useprovider, clients)
864
+ if nil != err {
865
+ return err
866
+ }
867
+
868
+ args := resolveargs(entry, pack, useprovider)
869
+
870
+ res, subjecterr := safecall(pack.subject, args)
871
+
872
+ if nil != subjecterr {
873
+ if err := handleerror(useflags, index, entry, subjecterr, useprovider); nil != err {
874
+ return err
875
+ }
876
+ continue
877
+ }
878
+
879
+ res = FixJson(res, useflags)
880
+ entry["res"] = res
881
+
882
+ if err := checkresult(useflags, index, entry, args, res); nil != err {
883
+ return err
884
+ }
885
+ }
886
+
887
+ return nil
888
+ }
889
+
890
+ runset := func(testspec any, subject Subject) error {
891
+ return runsetflags(testspec, Flags{}, subject)
892
+ }
893
+
894
+ return &RunPack{
895
+ Spec: spec,
896
+ RunSet: runset,
897
+ RunSetFlags: runsetflags,
898
+ Subject: defsubject,
899
+ Client: useprovider,
900
+ }, nil
901
+ }, nil
902
+ }