@voxgig/sdkgen 4.8.1 → 4.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) 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 +2 -2
  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/src/cmp/clojure/Package_clojure.ts +9 -2
  33. package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +3 -0
  34. package/project/.sdk/src/cmp/dart/Test_dart.ts +2 -0
  35. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +4 -1
  36. package/project/.sdk/src/cmp/go/Config_go.ts +59 -2
  37. package/project/.sdk/src/cmp/go/Main_go.ts +8 -2
  38. package/project/.sdk/src/cmp/java/Test_java.ts +6 -5
  39. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +6 -5
  40. package/project/.sdk/src/cmp/lean/Package_lean.ts +23 -0
  41. package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +1 -0
  42. package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +1 -0
  43. package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
  44. package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +7 -3
  45. package/project/.sdk/src/cmp/py/Config_py.ts +82 -1
  46. package/project/.sdk/src/cmp/py/Main_py.ts +44 -0
  47. package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +2 -0
  48. package/project/.sdk/src/cmp/swift/Main_swift.ts +10 -0
  49. package/project/.sdk/src/cmp/swift/Package_swift.ts +13 -1
  50. package/project/.sdk/src/cmp/ts/Config_ts.ts +42 -17
  51. package/project/.sdk/src/cmp/ts/fragment/Config.data.fragment.ts +13 -1
  52. package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +13 -1
  53. package/project/.sdk/tm/c/Makefile +38 -3
  54. package/project/.sdk/tm/c/tests/omni_resolver.h +361 -0
  55. package/project/.sdk/tm/c/tests/omni_smoke_test.c +237 -0
  56. package/project/.sdk/tm/c/tests/primary_corpus_test.c +205 -284
  57. package/project/.sdk/tm/c/tests/struct_corpus_test.c +292 -212
  58. package/project/.sdk/tm/c/tests/vendor/omni/json.c +811 -0
  59. package/project/.sdk/tm/c/tests/vendor/omni/omni.h +240 -0
  60. package/project/.sdk/tm/c/tests/vendor/omni/runner.c +940 -0
  61. package/project/.sdk/tm/c/tests/vendor/omni/util.c +351 -0
  62. package/project/.sdk/tm/c/utility/struct/utility.c +7 -2
  63. package/project/.sdk/tm/clojure/test/sdk/test/omni.clj +401 -0
  64. package/project/.sdk/tm/clojure/test/sdk/test/omni_smoke.clj +81 -0
  65. package/project/.sdk/tm/clojure/test/sdk/test/primary.clj +92 -58
  66. package/project/.sdk/tm/clojure/test/sdk/test/struct_corpus.clj +122 -149
  67. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +8 -3
  68. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +145 -0
  69. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +445 -0
  70. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +145 -0
  71. package/project/.sdk/tm/cpp/Makefile +5 -1
  72. package/project/.sdk/tm/cpp/test/omni_resolver.hpp +473 -0
  73. package/project/.sdk/tm/cpp/test/omni_smoke_test.cpp +209 -0
  74. package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +243 -184
  75. package/project/.sdk/tm/cpp/test/runner_support.hpp +68 -181
  76. package/project/.sdk/tm/cpp/test/struct_corpus_test.cpp +183 -56
  77. package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +406 -0
  78. package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +751 -0
  79. package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +256 -0
  80. package/project/.sdk/tm/cpp/utility/pipeline.hpp +7 -1
  81. package/project/.sdk/tm/csharp/test/OmniResolver.cs +491 -0
  82. package/project/.sdk/tm/csharp/test/OmniSmokeTest.cs +106 -0
  83. package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +299 -316
  84. package/project/.sdk/tm/csharp/test/Runner.cs +104 -269
  85. package/project/.sdk/tm/csharp/test/StructUtilityTest.cs +535 -724
  86. package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +864 -0
  87. package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +347 -0
  88. package/project/.sdk/tm/csharp/utility/MakeSpec.cs +3 -1
  89. package/project/.sdk/tm/csharp/utility/PrepareMethod.cs +6 -1
  90. package/project/.sdk/tm/csharp/utility/struct/Struct.cs +21 -5
  91. package/project/.sdk/tm/dart/test/omni.dart +520 -0
  92. package/project/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
  93. package/project/.sdk/tm/dart/test/primary_test.dart +86 -28
  94. package/project/.sdk/tm/dart/test/struct_test.dart +438 -11
  95. package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
  96. package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
  97. package/project/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
  98. package/project/.sdk/tm/elixir/Makefile +11 -3
  99. package/project/.sdk/tm/elixir/test/omni_smoke_test.exs +117 -0
  100. package/project/.sdk/tm/elixir/test/primary_utility_test.exs +341 -16
  101. package/project/.sdk/tm/elixir/test/struct_corpus_test.exs +554 -9
  102. package/project/.sdk/tm/elixir/test/support/omni.ex +377 -0
  103. package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +122 -0
  104. package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +623 -0
  105. package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +187 -0
  106. package/project/.sdk/tm/go/core/context.go +32 -16
  107. package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +261 -0
  108. package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +78 -0
  109. package/project/.sdk/tm/go/feature/secrets/plugin/config.go +652 -0
  110. package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +250 -0
  111. package/project/.sdk/tm/go/feature/secrets/plugin/env.go +194 -0
  112. package/project/.sdk/tm/go/feature/secrets/plugin/export.go +80 -0
  113. package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +238 -0
  114. package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1575 -0
  115. package/project/.sdk/tm/go/feature/secrets/plugin/order.go +248 -0
  116. package/project/.sdk/tm/go/feature/secrets/plugin/point.go +184 -0
  117. package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +123 -0
  118. package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +79 -0
  119. package/project/.sdk/tm/go/feature/secrets/plugin/types.go +296 -0
  120. package/project/.sdk/tm/go/feature/secrets/plugin/util.go +87 -0
  121. package/project/.sdk/tm/go/feature/secrets/plugin/version.go +161 -0
  122. package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +292 -0
  123. package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +201 -0
  124. package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +187 -0
  125. package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +184 -0
  126. package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +114 -0
  127. package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +156 -0
  128. package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +209 -0
  129. package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +241 -0
  130. package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +151 -0
  131. package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +152 -0
  132. package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +143 -0
  133. package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +120 -0
  134. package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +439 -0
  135. package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +685 -0
  136. package/project/.sdk/tm/go/feature/secrets_feature.go +675 -0
  137. package/project/.sdk/tm/go/src/feature/secrets/.gitkeep +0 -0
  138. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +799 -0
  139. package/project/.sdk/tm/go/test/omni/omni.go +897 -0
  140. package/project/.sdk/tm/go/test/omni/util.go +360 -0
  141. package/project/.sdk/tm/go/test/omniresolver_test.go +748 -0
  142. package/project/.sdk/tm/go/test/omnismoke_test.go +112 -0
  143. package/project/.sdk/tm/go/test/primary_utility_test.go +123 -191
  144. package/project/.sdk/tm/go/test/struct_utility_test.go +323 -16
  145. package/project/.sdk/tm/go/test/testsupport_test.go +294 -0
  146. package/project/.sdk/tm/go/utility/make_options.go +8 -1
  147. package/project/.sdk/tm/go/utility/prepare_method.go +5 -1
  148. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +2 -2
  149. package/project/.sdk/tm/java/test/OmniResolver.java +355 -0
  150. package/project/.sdk/tm/java/test/OmniSmokeTest.java +99 -0
  151. package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +254 -280
  152. package/project/.sdk/tm/java/test/RunnerSupport.java +9 -194
  153. package/project/.sdk/tm/java/test/StructCorpusTest.java +119 -42
  154. package/project/.sdk/tm/java/test/vendor/omni/Json.java +287 -0
  155. package/project/.sdk/tm/java/test/vendor/omni/Runner.java +851 -0
  156. package/project/.sdk/tm/java/test/vendor/omni/Util.java +322 -0
  157. package/project/.sdk/tm/java/utility/MakeSpec.java +3 -1
  158. package/project/.sdk/tm/java/utility/PrepareMethod.java +5 -5
  159. package/project/.sdk/tm/java/utility/struct/Struct.java +17 -4
  160. package/project/.sdk/tm/js/src/utility/StructUtility.js +3 -3
  161. package/project/.sdk/tm/js/test/omni.js +251 -0
  162. package/project/.sdk/tm/js/test/omni.test.js +105 -0
  163. package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +6 -2
  164. package/project/.sdk/tm/js/test/utility/StructUtility.test.js +27 -2
  165. package/project/.sdk/tm/js/test/vendor/omni/index.js +77 -0
  166. package/project/.sdk/tm/js/test/vendor/omni/runner.js +613 -0
  167. package/project/.sdk/tm/js/test/vendor/omni/util.js +212 -0
  168. package/project/.sdk/tm/kotlin/core/Utility.kt +1 -1
  169. package/project/.sdk/tm/kotlin/test/OmniResolver.kt +343 -0
  170. package/project/.sdk/tm/kotlin/test/OmniSmokeTest.kt +100 -0
  171. package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +244 -262
  172. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +9 -178
  173. package/project/.sdk/tm/kotlin/test/StructCorpusTest.kt +121 -32
  174. package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +264 -0
  175. package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +615 -0
  176. package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +139 -0
  177. package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -3
  178. package/project/.sdk/tm/kotlin/utility/Prepare.kt +6 -6
  179. package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +18 -2
  180. package/project/.sdk/tm/lean/Makefile +12 -5
  181. package/project/.sdk/tm/lean/src/SdkUtility.lean +14 -1
  182. package/project/.sdk/tm/lean/test/OmniResolver.lean +358 -0
  183. package/project/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
  184. package/project/.sdk/tm/lean/test/StructCorpus.lean +245 -574
  185. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +155 -291
  186. package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
  187. package/project/.sdk/tm/lua/test/omni.lua +456 -0
  188. package/project/.sdk/tm/lua/test/omni_smoke_test.lua +103 -0
  189. package/project/.sdk/tm/lua/test/primary_utility_test.lua +250 -509
  190. package/project/.sdk/tm/lua/test/struct_utility_test.lua +161 -70
  191. package/project/.sdk/tm/lua/test/vendor/omni/json.lua +268 -0
  192. package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +385 -0
  193. package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +641 -0
  194. package/project/.sdk/tm/lua/test/vendor/omni/util.lua +282 -0
  195. package/project/.sdk/tm/lua/utility/prepare_method.lua +5 -1
  196. package/project/.sdk/tm/lua/utility/struct/regex.lua +663 -0
  197. package/project/.sdk/tm/lua/utility/struct/struct.lua +660 -420
  198. package/project/.sdk/tm/ocaml/Makefile +37 -12
  199. package/project/.sdk/tm/ocaml/test/omni_resolver.ml +284 -0
  200. package/project/.sdk/tm/ocaml/test/omni_smoke_test.ml +169 -0
  201. package/project/.sdk/tm/ocaml/test/primary_utility_test.ml +84 -100
  202. package/project/.sdk/tm/ocaml/test/struct_corpus.ml +225 -201
  203. package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1157 -0
  204. package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +88 -12
  205. package/project/.sdk/tm/perl/t/omni.pm +647 -0
  206. package/project/.sdk/tm/perl/t/omni_smoke.t +87 -0
  207. package/project/.sdk/tm/perl/t/primary_utility.t +189 -487
  208. package/project/.sdk/tm/perl/t/struct_utility.t +455 -389
  209. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +649 -0
  210. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +253 -0
  211. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +24 -0
  212. package/project/.sdk/tm/perl/utility/prepare_method.pm +7 -2
  213. package/project/.sdk/tm/php/test/Omni.php +691 -0
  214. package/project/.sdk/tm/php/test/OmniSmokeTest.php +93 -0
  215. package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +210 -571
  216. package/project/.sdk/tm/php/test/StructUtilityTest.php +320 -342
  217. package/project/.sdk/tm/php/test/vendor/omni/Runner.php +644 -0
  218. package/project/.sdk/tm/php/test/vendor/omni/Util.php +283 -0
  219. package/project/.sdk/tm/php/utility/MakeSpec.php +10 -3
  220. package/project/.sdk/tm/php/utility/PrepareBody.php +7 -1
  221. package/project/.sdk/tm/php/utility/PrepareMethod.php +6 -2
  222. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +36 -0
  223. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +141 -0
  224. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +50 -0
  225. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +333 -0
  226. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +198 -0
  227. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +147 -0
  228. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +52 -0
  229. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +139 -0
  230. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1053 -0
  231. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +171 -0
  232. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +95 -0
  233. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +116 -0
  234. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +59 -0
  235. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +87 -0
  236. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +112 -0
  237. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +74 -0
  238. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +116 -0
  239. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +192 -0
  240. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +120 -0
  241. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +140 -0
  242. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +62 -0
  243. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +101 -0
  244. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +152 -0
  245. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +115 -0
  246. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +92 -0
  247. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +101 -0
  248. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +119 -0
  249. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +125 -0
  250. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +211 -0
  251. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +455 -0
  252. package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +467 -0
  253. package/project/.sdk/tm/py/pkg/utility/prepare_method.py +5 -1
  254. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/__init__.py +0 -2
  255. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +780 -529
  256. package/project/.sdk/tm/py/src/feature/secrets/.gitkeep +0 -0
  257. package/project/.sdk/tm/py/test/feature/__init__.py +0 -0
  258. package/project/.sdk/tm/py/test/feature/secrets/__init__.py +0 -0
  259. package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +337 -0
  260. package/project/.sdk/tm/py/test/omni.py +415 -0
  261. package/project/.sdk/tm/py/test/test_omni_smoke.py +74 -0
  262. package/project/.sdk/tm/py/test/test_primary_utility.py +144 -668
  263. package/project/.sdk/tm/py/test/test_struct_utility.py +74 -27
  264. package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +62 -0
  265. package/project/.sdk/tm/py/test/voxgig_omni/runner.py +566 -0
  266. package/project/.sdk/tm/py/test/voxgig_omni/util.py +237 -0
  267. package/project/.sdk/tm/rb/test/omni.rb +505 -0
  268. package/project/.sdk/tm/rb/test/omni_smoke_test.rb +72 -0
  269. package/project/.sdk/tm/rb/test/primary_utility_test.rb +174 -560
  270. package/project/.sdk/tm/rb/test/struct_utility_test.rb +13 -7
  271. package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +493 -0
  272. package/project/.sdk/tm/rb/test/vendor/omni/util.rb +199 -0
  273. package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +15 -0
  274. package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -1
  275. package/project/.sdk/tm/rust/tests/common/mod.rs +19 -242
  276. package/project/.sdk/tm/rust/tests/omni_resolver/mod.rs +888 -0
  277. package/project/.sdk/tm/rust/tests/omni_smoke_test.rs +286 -0
  278. package/project/.sdk/tm/rust/tests/primary_utility_test.rs +318 -312
  279. package/project/.sdk/tm/rust/tests/struct_utility_test.rs +66 -28
  280. package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +412 -0
  281. package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +38 -0
  282. package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +392 -0
  283. package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1001 -0
  284. package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +161 -0
  285. package/project/.sdk/tm/rust/utility/prepare_method.rs +5 -1
  286. package/project/.sdk/tm/scala/Makefile +16 -6
  287. package/project/.sdk/tm/scala/sdktest/OmniResolver.scala +497 -0
  288. package/project/.sdk/tm/scala/sdktest/OmniSmoke.scala +192 -0
  289. package/project/.sdk/tm/scala/sdktest/PrimaryCorpus.scala +47 -19
  290. package/project/.sdk/tm/scala/sdktest/StructCorpus.scala +0 -0
  291. package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +229 -0
  292. package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +552 -0
  293. package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +104 -0
  294. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Constants.swift +10 -0
  295. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Inject.swift +28 -5
  296. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Injection.swift +5 -1
  297. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Minor.swift +4 -1
  298. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Validate.swift +15 -5
  299. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +6 -1
  300. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift +474 -0
  301. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniSmokeTest.swift +107 -0
  302. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +141 -178
  303. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/Runner.swift +17 -113
  304. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/StructUtilityTest.swift +295 -446
  305. package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +364 -0
  306. package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +730 -0
  307. package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +162 -0
  308. package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +7 -0
  309. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +148 -0
  310. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +55 -0
  311. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +344 -0
  312. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +205 -0
  313. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +138 -0
  314. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +46 -0
  315. package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +349 -0
  316. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +181 -0
  317. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1132 -0
  318. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +177 -0
  319. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +119 -0
  320. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +102 -0
  321. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +61 -0
  322. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +112 -0
  323. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +100 -0
  324. package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +37 -0
  325. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +163 -30
  326. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +27 -22
  327. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/aws.ts +26 -36
  328. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/azuresecrets.ts +19 -21
  329. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/boru.ts +36 -17
  330. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/doppler.ts +14 -21
  331. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/gcpsecrets.ts +27 -27
  332. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/hashicorp.ts +25 -39
  333. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +99 -0
  334. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/infisical.ts +14 -16
  335. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/onepassword.ts +15 -22
  336. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +98 -0
  337. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{Sigv4.ts → plugins/sigv4.ts} +7 -6
  338. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +97 -23
  339. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +37 -0
  340. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +4 -17
  341. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +4 -16
  342. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +11 -25
  343. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +6 -23
  344. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +106 -39
  345. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +3 -3
  346. package/project/.sdk/tm/ts/test/omni.ts +104 -32
  347. package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +27 -0
  348. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +32 -5
  349. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +2 -2
  350. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +2 -2
  351. package/project/.sdk/tm/zig/test/primary_utility_test.zig +1 -1
  352. package/project/.sdk/tm/zig/test/struct_runner.zig +5 -4
  353. package/project/sdkgen-package.json +1 -1
  354. package/src/action/doctor.ts +66 -2
  355. package/src/helpers/naming.ts +4 -2
  356. package/project/.sdk/tm/c/tests/runner.h +0 -274
  357. package/project/.sdk/tm/cpp/test/struct_runner.hpp +0 -314
  358. package/project/.sdk/tm/csharp/test/StructRunner.cs +0 -276
  359. package/project/.sdk/tm/dart/test/runner.dart +0 -406
  360. package/project/.sdk/tm/dart/test/struct_corpus.dart +0 -531
  361. package/project/.sdk/tm/elixir/test/support/struct_corpus.ex +0 -1088
  362. package/project/.sdk/tm/go/test/runner_test.go +0 -629
  363. package/project/.sdk/tm/go/test/struct_runner_test.go +0 -1094
  364. package/project/.sdk/tm/java/test/StructRunner.java +0 -281
  365. package/project/.sdk/tm/js/test/runner.js +0 -387
  366. package/project/.sdk/tm/kotlin/test/StructRunner.kt +0 -177
  367. package/project/.sdk/tm/lua/test/struct_runner.lua +0 -602
  368. package/project/.sdk/tm/ocaml/test/corpus_runner.ml +0 -185
  369. package/project/.sdk/tm/perl/t/struct_runner.pm +0 -275
  370. package/project/.sdk/tm/php/test/StructRunner.php +0 -275
  371. package/project/.sdk/tm/py/test/struct_runner.py +0 -411
  372. package/project/.sdk/tm/rb/test/struct_runner.rb +0 -309
  373. package/project/.sdk/tm/rust/tests/struct_runner/mod.rs +0 -424
  374. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +0 -90
  375. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +0 -66
  376. package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +0 -188
@@ -0,0 +1,897 @@
1
+ // VENDORED: @voxgig/omni sdk-20260904-1610-0 (go/omni.go)
2
+ // Source: https://github.com/voxgig/omni @ 8c3e1b573a8d35796f7fc45e3226b977023cabf7 [tag: sdk-20260904-1610-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
+ cbase := Clone(base)
642
+ var failure error
643
+
644
+ Walk(Clone(check), func(_key any, val any, _parent any, path []any) any {
645
+ if nil != failure {
646
+ return val
647
+ }
648
+
649
+ where := "<root>"
650
+ if 0 < len(path) {
651
+ where = PathIfy(path)
652
+ }
653
+
654
+ if IsNode(val) {
655
+ return val
656
+ }
657
+
658
+ baseval := GetPath(cbase, path)
659
+
660
+ // The sentinels are tested BEFORE the identity check below. Otherwise
661
+ // a subject returning the literal string "__UNDEF__" satisfies an
662
+ // assertion that the key is absent - two mutually exclusive states
663
+ // passing one check. A sentinel that accepts its own literal is not a
664
+ // sentinel. (NULLMARK still accepts NULLMARK: under the default null
665
+ // flag a real null has already been normalised to it, so the two are
666
+ // genuinely indistinguishable here - that one needs a raw-value
667
+ // escape, not an ordering change.)
668
+
669
+ // Explicitly absent: satisfied only by a genuinely missing key, never
670
+ // by a present null (the distinction the sentinels exist to keep).
671
+ if UNDEFMARK == val {
672
+ if IsAbsent(baseval) {
673
+ return val
674
+ }
675
+ failure = fail(flags, index, entry, "expected absent at "+where,
676
+ strptr("absent"), strptr(Stringify(baseval)))
677
+ return val
678
+ }
679
+
680
+ // Explicitly null: satisfied only by a present null.
681
+ if NULLMARK == val {
682
+ if nil == baseval || NULLMARK == baseval {
683
+ return val
684
+ }
685
+ failure = fail(flags, index, entry, "expected null at "+where,
686
+ strptr("null"), strptr(Stringify(baseval)))
687
+ return val
688
+ }
689
+
690
+ // Explicitly present: any present value, including null.
691
+ if EXISTSMARK == val {
692
+ if !IsAbsent(baseval) {
693
+ return val
694
+ }
695
+ failure = fail(flags, index, entry, "expected present at "+where,
696
+ strptr("present"), strptr("absent"))
697
+ return val
698
+ }
699
+
700
+ // Identical values match. This sits below the sentinel branches on
701
+ // purpose - see the note above.
702
+ if DeepEqual(val, baseval) {
703
+ return val
704
+ }
705
+
706
+ // A concrete expectation never matches a missing key - a match leaf
707
+ // against an absent value must fail, not substring-match "undefined".
708
+ if IsAbsent(baseval) {
709
+ failure = fail(flags, index, entry, "match failed at "+where,
710
+ strptr(Stringify(val)), strptr("absent"))
711
+ return val
712
+ }
713
+
714
+ if !MatchVal(val, baseval) {
715
+ failure = fail(flags, index, entry, "match failed at "+where,
716
+ strptr(Stringify(val)), strptr(Stringify(baseval)))
717
+ }
718
+
719
+ return val
720
+ })
721
+
722
+ return failure
723
+ }
724
+
725
+ // MatchVal matches one leaf: /regex/ or case-insensitive substring for
726
+ // strings.
727
+ func MatchVal(check any, base any) bool {
728
+ if DeepEqual(check, base) {
729
+ return true
730
+ }
731
+
732
+ want := check
733
+
734
+ if nil == want {
735
+ return nil == base || IsAbsent(base) || NULLMARK == base
736
+ }
737
+
738
+ if text, is := want.(string); is {
739
+ // An empty want would substring-match anything: reject it.
740
+ if "" == text {
741
+ return false
742
+ }
743
+
744
+ basestr := Stringify(base)
745
+
746
+ if strings.HasPrefix(text, "/") && strings.HasSuffix(text, "/") && 2 < len(text) {
747
+ pattern, err := regexp.Compile(text[1 : len(text)-1])
748
+ if nil != err {
749
+ return false
750
+ }
751
+ return pattern.MatchString(basestr)
752
+ }
753
+
754
+ return strings.Contains(strings.ToLower(basestr), strings.ToLower(text))
755
+ }
756
+
757
+ return DeepEqual(want, base)
758
+ }
759
+
760
+ // NullModifier converts NULLMARK sentinels back into real nulls. Use as a
761
+ // Walk callback when a spec value must reach the subject as an actual null.
762
+ func NullModifier(key any, val any, parent any, _path []any) any {
763
+ if text, is := val.(string); is {
764
+ if NULLMARK == text {
765
+ return nil
766
+ }
767
+ return strings.ReplaceAll(text, NULLMARK, "null")
768
+ }
769
+ return val
770
+ }
771
+
772
+ // Call a subject, converting a panic into an error.
773
+ func safecall(subject Subject, args []any) (res any, err error) {
774
+ defer func() {
775
+ if recovered := recover(); nil != recovered {
776
+ if aserr, is := recovered.(error); is {
777
+ err = aserr
778
+ } else {
779
+ err = fmt.Errorf("%v", recovered)
780
+ }
781
+ }
782
+ }()
783
+
784
+ return subject(args...)
785
+ }
786
+
787
+ // MakeRunner makes a runner for a spec file (or spec value) and a provider.
788
+ func MakeRunner(specref any, provider *Provider) (Runner, error) {
789
+ alltests, err := LoadSpec(specref)
790
+ if nil != err {
791
+ return nil, err
792
+ }
793
+
794
+ specversion, err := resolveversion(alltests)
795
+ if nil != err {
796
+ return nil, err
797
+ }
798
+
799
+ useprovider := provider
800
+ if nil == useprovider {
801
+ useprovider = &Provider{}
802
+ }
803
+
804
+ return func(name string, store any) (*RunPack, error) {
805
+ spec := ResolveSpec(name, alltests)
806
+
807
+ clients, err := resolveclients(useprovider, spec, store)
808
+ if nil != err {
809
+ return nil, err
810
+ }
811
+
812
+ defsubject := resolvesubject(name, useprovider)
813
+
814
+ runsetflags := func(testspec any, flags Flags, subject Subject) error {
815
+ useflags := resolveflags(flags)
816
+ if label, is := useflags["name"].(string); !is || "" == label {
817
+ if "" != name {
818
+ useflags["name"] = name
819
+ } else {
820
+ useflags["name"] = "set"
821
+ }
822
+ }
823
+
824
+ usesubject := subject
825
+ if nil == usesubject {
826
+ usesubject = defsubject
827
+ }
828
+ if nil == usesubject {
829
+ return &OmniError{Message: "omni: no test subject for: " + Stringify(useflags["name"])}
830
+ }
831
+
832
+ testspecmap, is := FixJson(testspec, useflags).(map[string]any)
833
+ if !is {
834
+ return &OmniError{Message: "omni: test spec has no set: " + Stringify(useflags["name"])}
835
+ }
836
+
837
+ testset, is := testspecmap["set"].([]any)
838
+ if !is {
839
+ return &OmniError{Message: "omni: test spec has no set: " + Stringify(useflags["name"])}
840
+ }
841
+
842
+ if 1 <= specversion {
843
+ if err := checkset(useflags, testspec, testset); nil != err {
844
+ return err
845
+ }
846
+ }
847
+
848
+ for index, rawentry := range testset {
849
+ entry, is := rawentry.(map[string]any)
850
+ if !is {
851
+ return &OmniError{
852
+ Message: fmt.Sprintf("omni: %s[%d]: entry is not a map", useflags["name"], index),
853
+ }
854
+ }
855
+
856
+ entry = resolveentry(entry, useflags)
857
+
858
+ pack, err := resolvetestpack(name, entry, usesubject, useprovider, clients)
859
+ if nil != err {
860
+ return err
861
+ }
862
+
863
+ args := resolveargs(entry, pack, useprovider)
864
+
865
+ res, subjecterr := safecall(pack.subject, args)
866
+
867
+ if nil != subjecterr {
868
+ if err := handleerror(useflags, index, entry, subjecterr, useprovider); nil != err {
869
+ return err
870
+ }
871
+ continue
872
+ }
873
+
874
+ res = FixJson(res, useflags)
875
+ entry["res"] = res
876
+
877
+ if err := checkresult(useflags, index, entry, args, res); nil != err {
878
+ return err
879
+ }
880
+ }
881
+
882
+ return nil
883
+ }
884
+
885
+ runset := func(testspec any, subject Subject) error {
886
+ return runsetflags(testspec, Flags{}, subject)
887
+ }
888
+
889
+ return &RunPack{
890
+ Spec: spec,
891
+ RunSet: runset,
892
+ RunSetFlags: runsetflags,
893
+ Subject: defsubject,
894
+ Client: useprovider,
895
+ }, nil
896
+ }, nil
897
+ }