@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
@@ -111,6 +111,12 @@ public func inject(_ val: Value, _ store: Value, _ injdef: Injection? = nil) ->
111
111
  if !idef.extra.isNoval { root.extra = idef.extra }
112
112
  if !idef.meta.entries.isEmpty { root.meta = idef.meta }
113
113
  if !idef.errs.items.isEmpty { root.errs = idef.errs }
114
+ // The caller's HANDLER, which canonical carries here too
115
+ // (typescript/src/StructUtility.ts inject). Dropping it made
116
+ // `validate`'s own `_validatehandler` dead code in every run, so the
117
+ // meta-path forms `q0$=x1` / `q0$~x1` never became the $EXACT / loose
118
+ // checks they name - the corpus pins it through validate.special.
119
+ root.handler = idef.handler
114
120
  // Caller-provided meta/errs override above.
115
121
  }
116
122
  inj = root
@@ -184,21 +190,29 @@ public func inject(_ val: Value, _ store: Value, _ injdef: Injection? = nil) ->
184
190
  public func checkPlacement(_ modes: Int, _ name: String, _ parentTypes: Int, _ inj: Injection)
185
191
  -> Bool
186
192
  {
193
+ // The canonical messages, verbatim (typescript/src/StructUtility.ts
194
+ // checkPlacement): PLACEMENT names, KEYPRE/KEYPOST/VAL order, the type
195
+ // expected of the parent, and the closing period. The corpus pins all
196
+ // four through transform.apply, whose err entries the silent-pass inline
197
+ // runner used to skip.
187
198
  if (modes & inj.mode) == 0 {
188
- let allowed = [M_KEYPRE, M_VAL, M_KEYPOST]
199
+ let allowed = [M_KEYPRE, M_KEYPOST, M_VAL]
189
200
  .filter { (modes & $0) != 0 }
190
- .compactMap { MODENAME[$0] }
201
+ .compactMap { PLACEMENT[$0] }
191
202
  .joined(separator: ",")
192
203
  inj.errs.items.append(
193
204
  .string(
194
- "$\(name): invalid placement as " + (MODENAME[inj.mode] ?? "?") + ", expected: " + allowed))
205
+ "$\(name): invalid placement as " + (PLACEMENT[inj.mode] ?? "?")
206
+ + ", expected: " + allowed + "."))
195
207
  return false
196
208
  }
197
209
  if parentTypes != 0 {
198
210
  let ptype = typify(inj.parent)
199
211
  if (parentTypes & ptype) == 0 {
200
212
  inj.errs.items.append(
201
- .string("$\(name): invalid placement in parent " + typename(ptype) + "."))
213
+ .string(
214
+ "$\(name): invalid placement in parent " + typename(ptype)
215
+ + ", expected: " + typename(parentTypes) + "."))
202
216
  return false
203
217
  }
204
218
  }
@@ -213,7 +227,16 @@ public func injectorArgs(_ types: [Int], _ args: Value) -> (Value, [Value]) {
213
227
  let arg = i < l.items.count ? l.items[i] : Value.noval
214
228
  let atype = typify(arg)
215
229
  if expected != T_any && (expected & atype) == 0 {
216
- return (.string("argument \(i) not of type: " + typename(expected)), l.items)
230
+ // The canonical message, verbatim (typescript/src/StructUtility.ts
231
+ // injectorArgs): the offending VALUE, its type, its 1-based position
232
+ // and the type expected. The corpus pins it through transform.apply,
233
+ // whose err entries the silent-pass inline runner used to skip.
234
+ return (
235
+ .string(
236
+ "invalid argument: " + stringify(arg, 22) + " (" + typename(atype)
237
+ + " at position " + String(1 + i) + ") is not of type: "
238
+ + typename(expected) + "."),
239
+ l.items)
217
240
  }
218
241
  out.append(arg)
219
242
  }
@@ -89,7 +89,11 @@ public final class Injection: @unchecked Sendable {
89
89
  // higher ancestor when |ancestor| >= 2). NONE deletes the slot.
90
90
  @discardableResult
91
91
  public func setval(_ v: Value, ancestor: Int = 0) -> Value {
92
- let absAnc = abs(ancestor)
92
+ // Canonical is `if (null == ancestor || ancestor < 2)`, so a NEGATIVE
93
+ // ancestor takes the parent branch. Taking abs() first sent
94
+ // validate_ONE's `setval(vcurrent, -2)` up two nodes instead, writing
95
+ // the match back over the wrong slot ($TOP leaked into the result).
96
+ let absAnc = ancestor
93
97
  if absAnc < 2 {
94
98
  if v.isNoval {
95
99
  parent = delprop(parent, .string(key))
@@ -596,6 +596,9 @@ extension JSON {
596
596
  if d == d.rounded() && abs(d) < 1e16 {
597
597
  return String(Int64(d))
598
598
  }
599
- return String(format: "%.17g", d)
599
+ // Shortest round-trip, which is what canonical's `String(n)` gives.
600
+ // "%.17g" rendered 4.4 as "4.4000000000000004"; the corpus pins the
601
+ // canonical spelling through validate.basic's decimal type error.
602
+ return String(d)
600
603
  }
601
604
  }
@@ -9,11 +9,17 @@ import Foundation
9
9
  private func invalidTypeMsg(
10
10
  _ path: [String], _ needtype: String, _ vt: Int, _ v: Value, _ whence: String
11
11
  ) -> String {
12
- let vs = v.isNoval ? "no value" : stringify(v)
12
+ // Canonical is `null == v`, which in JS is TRUE for a JSON null as well
13
+ // as for undefined - both render as "no value", with no type prefix. The
14
+ // corpus pins it through validate.invalid ("Expected string, but found
15
+ // no value." for `data: null`), whose err entries the silent-pass inline
16
+ // runner used to skip.
17
+ let novalue = v.isNoval || v.isNull
18
+ let vs = novalue ? "no value" : stringify(v)
13
19
  let field =
14
20
  path.count > 1
15
21
  ? "field " + pathify(.list(VList(path.map { Value.string($0) })), 1) + " to be " : ""
16
- let extra = v.isNoval ? "" : typename(vt) + S_VIZ
22
+ let extra = novalue ? "" : typename(vt) + S_VIZ
17
23
  return "Expected " + field + needtype + ", but found " + extra + vs + "."
18
24
  }
19
25
 
@@ -144,9 +150,13 @@ public func validate_ONE(_ inj: Injection, _ val: Value, _ ref: String, _ store:
144
150
  }
145
151
  inj.keyI = inj.keys.count
146
152
  inj.setval(inj.dparent, ancestor: 2)
147
- if inj.path.count > 1 {
148
- inj.path = Array(inj.path.suffix(inj.path.count - 1))
149
- }
153
+ // Canonical is `inj.path = slice(inj.path, -1)`, which in struct's own
154
+ // slice means DROP THE LAST element (start<0 => end = len+start,
155
+ // start = 0) - not "keep the last". Dropping the FIRST instead named
156
+ // the wrong field in every $ONE failure ("field 0" for "field x0");
157
+ // the corpus pins it through validate.one, whose err entries the
158
+ // silent-pass inline runner used to skip.
159
+ inj.path = Array(inj.path.dropLast())
150
160
  inj.key = inj.path.last ?? ""
151
161
  let tvals = slice(parent, 1)
152
162
  guard case .list(let tl) = tvals else { return .noval }
@@ -22,7 +22,12 @@ func prepareMethodUtil(_ ctx: Context) -> String {
22
22
  return pm.uppercased()
23
23
  }
24
24
 
25
- return methodMap[opname] ?? "GET"
25
+ // No default: an op name outside the convention resolves to NO method,
26
+ // exactly as the ts reference (`methodMap[key]` is undefined there) and
27
+ // go's "" spelling of the same no-value. The silent-pass inline runner
28
+ // hid a stray "GET" fallback here; the shared corpus (prepareMethod,
29
+ // opname "bad" -> null) pins it now.
30
+ return methodMap[opname] ?? ""
26
31
  }
27
32
 
28
33
  func preparePathUtil(_ ctx: Context) -> String {
@@ -0,0 +1,474 @@
1
+ // The corpus test runner: vendored @voxgig/omni driven through its NATIVE
2
+ // API (`Omni.makeRunner(specref, provider)` / `RunPack.runsetflagsargs`),
3
+ // presented to the corpus suites in the struct-runner shape they already
4
+ // use (`run.spec`, `run.runset`, `run.runsetflags`, `run.client`). No
5
+ // compat shim is vendored: the adapter below IS the whole bridge, per
6
+ // language, per the vendor-tag rollout (docs/design/vendor-tag-rollout.md,
7
+ // Decision 4). It is the Swift peer of tm/csharp/test/OmniResolver.cs and
8
+ // tm/java/test/OmniResolver.java.
9
+ //
10
+ // Swift-specific decisions, each load-bearing:
11
+ //
12
+ // 1. THE VENDORED PORT IS ITS OWN MODULE. `Omni` is a SwiftPM target over
13
+ // Tests/vendor/omni, not files folded into the test target: the port
14
+ // calls `Omni.errify` by module name, and its top-level `clone`,
15
+ // `getpath`, `walk`, `stringify` and `pathify` collide head-on with the
16
+ // struct utility's functions of the same names. A .testTarget (not a
17
+ // .target) keeps the engine out of `swift build`, so a consumer's
18
+ // library build never compiles the test runner. Nothing outside this
19
+ // file imports Omni - the corpus suites see `OmniSpec` and
20
+ // `OmniResolver.Subject`, both spelled in the SDK's own Value model -
21
+ // so the collisions stay contained to the one file that can qualify
22
+ // them.
23
+ //
24
+ // 2. CONTEXTS STAY MAPS ACROSS THE RUNNER. omni sets `entry.ctx` to the
25
+ // contextified args[0] and `match: {ctx: ...}` reads THROUGH it with
26
+ // omni's own getpath, which walks JSON maps only. A typed Context there
27
+ // would make every ctx assertion read "absent". So subjects receive the
28
+ // MAP (an SDK `VMap`), build the typed Context with
29
+ // `OmniResolver.omniCtx(args[0], ...)` at the call site, run the
30
+ // utility, and write the observable ctx state back into the same map
31
+ // with `omniSyncCtx` - the maps-plus-sync idiom go, java and csharp use
32
+ // for the same contract (omni#56).
33
+ //
34
+ // 3. `match: {ctx: ...}` IS RETARGETED ONTO `match: {args: {"0": ...}}`.
35
+ // This is the one place the Swift port cannot follow canonical omni as
36
+ // written, and it is a VALUE-SEMANTICS consequence, not a choice.
37
+ // omni's `Json` is an enum: `resolveargs` hands `entry.ctx` and
38
+ // `args[0]` two COPIES of the contextified map, so a subject's writes -
39
+ // decision 2's sync - can never reach the copy `entry.ctx` holds, and
40
+ // `checkresult` reads `entry.get("ctx")` for the ctx base. The port
41
+ // provides the channel for exactly this case: `runsetflagsargs` lets a
42
+ // subject RETURN its arguments, and `checkresult` builds the `args`
43
+ // base from what came back. args[0] IS the ctx of a ctx entry (omni
44
+ // itself sets `args = [entry.get("ctx")]`), so moving the assertion
45
+ // from `ctx` to `args.0` reads the SAME map, post-call, and preserves
46
+ // every leaf. `retargetctx` below does that rewrite on the spec handed
47
+ // to the engine; nothing is dropped, weakened, or skipped. PHP faces
48
+ // the same copy-on-write problem and answers it with reference slots
49
+ // (tm/php/test/Omni.php decision 2), which Swift's enum has no
50
+ // equivalent of. The upstream fix is for the Swift port's `drive` to
51
+ // re-point `entry.ctx` at the returned `callargs[0]`, the way JS object
52
+ // identity does it implicitly - filed as a follow-up, not worked around
53
+ // by editing a vendored file.
54
+ //
55
+ // 4. NUMBERS. omni's Json carries one numeric case (Double); the SDK's
56
+ // Value distinguishes `.int` from `.double`, and struct's own
57
+ // `stringify`/`jsonify` print them differently. An integral Double
58
+ // therefore becomes `.int`, which is exactly what struct's JSON parser
59
+ // does with the same text - the shared corpus carries no integral float
60
+ // literal, so the mapping is lossless over it.
61
+ //
62
+ // 5. ZERO-ARGUMENT ENTRIES. A corpus entry with no `in`/`args`/`ctx`
63
+ // means "call the subject with NO value". The vendored Swift port
64
+ // distinguishes that natively - such an entry arrives as one
65
+ // `Json.absent` - so Swift needs neither go's novalargs spec rewrite
66
+ // nor lua/php's compat shim. The ONE conversion is the sentinel swap at
67
+ // the call boundary: `.absent` -> `Value.noval` on the way in,
68
+ // `Value.noval` -> `.absent` on the way out, so `typify()` answers
69
+ // T_noval where a JSON null answers T_null.
70
+ //
71
+ // 6. THE VENDORED SWIFT PORT AT THIS TAG carries the omni#54 runner fixes
72
+ // that matter here: `matchcheck` reads its base directly (no clone) and
73
+ // tests the sentinels BEFORE the identity check. `jsonstr` has no cycle
74
+ // guard, which only bites on cyclic values - decision 2 keeps typed
75
+ // state (a Context, the SDK client) out of the maps the runner walks,
76
+ // and the live provider crosses as an opaque `.native` leaf, so every
77
+ // value the runner stringifies is acyclic.
78
+
79
+ import Foundation
80
+ import XCTest
81
+ import Omni
82
+
83
+ @testable import ProjectNameSdk
84
+
85
+ /// An omni spec node, in the engine's own value model. Opaque on purpose:
86
+ /// the corpus suites pass these around without importing Omni, whose
87
+ /// top-level `clone`/`getpath`/`walk`/`stringify`/`pathify` would collide
88
+ /// with the struct utility's (decision 1).
89
+ struct OmniSpec {
90
+ fileprivate let json: Omni.Json
91
+
92
+ fileprivate init(_ json: Omni.Json) { self.json = json }
93
+
94
+ /// A child node by key (absent when missing).
95
+ func get(_ key: String) -> OmniSpec { OmniSpec(json.get(key)) }
96
+
97
+ /// A child node by path.
98
+ func get(_ keys: [String]) -> OmniSpec {
99
+ var cur = json
100
+ for k in keys { cur = cur.get(k) }
101
+ return OmniSpec(cur)
102
+ }
103
+
104
+ var isMap: Bool { json.ismap }
105
+ var isAbsent: Bool { json.isabsent }
106
+
107
+ /// The number of entries in this node's `set` list; nil when there is no
108
+ /// `set` at all. The corpus suites use it to refuse a section that would
109
+ /// run ZERO cases.
110
+ var setCount: Int? { json.get("set").aslist?.count }
111
+
112
+ /// This node in the SDK's own Value model (for DEF/setup reads).
113
+ var value: Value { OmniResolver.tovalue(json) }
114
+ }
115
+
116
+ enum OmniResolver {
117
+
118
+ // The sentinels, under the names the corpus suites already use.
119
+ static let NULLMARK = Omni.NULLMARK
120
+ static let UNDEFMARK = Omni.UNDEFMARK
121
+ static let EXISTSMARK = Omni.EXISTSMARK
122
+
123
+ /// The function under test, in omni's argument shape but the SDK's value
124
+ /// model. Failure is reported by throwing.
125
+ typealias Subject = ([Value]) throws -> Value
126
+
127
+ /// A struct-corpus subject: one value in, one value out.
128
+ typealias StructSubject = (Value) throws -> Value
129
+
130
+ // ------------------------------------------------------------------
131
+ // Errors
132
+ // ------------------------------------------------------------------
133
+
134
+ /// Did the engine itself fail an entry (as opposed to the subject
135
+ /// throwing)? The smoke test asserts on this; the corpus suites turn it
136
+ /// into an XCTFail carrying the entry.
137
+ static func isOmniError(_ err: Error) -> Bool { err is Omni.OmniError }
138
+
139
+ /// The message of any error, engine or subject.
140
+ static func message(_ err: Error) -> String { Omni.errmessage(err) }
141
+
142
+ /// A subject-side failure carrying a plain message. Used where the SDK's
143
+ /// own port collects diagnostics instead of raising (struct's validate).
144
+ struct SubjectError: Error, CustomStringConvertible {
145
+ let message: String
146
+ init(_ message: String) { self.message = message }
147
+ var description: String { message }
148
+ }
149
+
150
+ // ------------------------------------------------------------------
151
+ // Value model conversion (decisions 4 and 5)
152
+ // ------------------------------------------------------------------
153
+
154
+ /// omni's model -> the SDK's.
155
+ static func tovalue(_ j: Omni.Json) -> Value {
156
+ switch j {
157
+ case .absent: return .noval
158
+ case .null: return .null
159
+ case .bool(let b): return .bool(b)
160
+ case .num(let d):
161
+ if d == d.rounded(.towardZero), abs(d) < 9_007_199_254_740_992.0 {
162
+ return .int(Int64(d))
163
+ }
164
+ return .double(d)
165
+ case .str(let s): return .string(s)
166
+ case .list(let items): return .list(VList(items.map { tovalue($0) }))
167
+ case .map(let entries):
168
+ let m = VMap()
169
+ for (k, v) in entries { m.entries[k] = tovalue(v) }
170
+ return .map(m)
171
+ // The live provider omni attaches to a ctx map crosses as an opaque
172
+ // leaf, keeping object identity so omniCtx can resolve it back.
173
+ case .provider(let p): return .nat(p)
174
+ }
175
+ }
176
+
177
+ /// The SDK's model -> omni's.
178
+ static func tojson(_ v: Value) -> Omni.Json {
179
+ switch v {
180
+ case .noval: return .absent
181
+ case .null: return .null
182
+ case .bool(let b): return .bool(b)
183
+ case .int(let n): return .num(Double(n))
184
+ case .double(let d): return .num(d)
185
+ case .string(let s): return .str(s)
186
+ case .list(let l): return .list(l.items.map { tojson($0) })
187
+ case .map(let m):
188
+ var out: [(String, Omni.Json)] = []
189
+ for (k, e) in m.entries { out.append((k, tojson(e))) }
190
+ return .map(out)
191
+ case .native(let ref):
192
+ if let p = ref.value as? Omni.Provider { return .provider(p) }
193
+ return .str("[native]")
194
+ case .function: return .str("[function]")
195
+ case .sentinel(let s): return .str(s.marker)
196
+ }
197
+ }
198
+
199
+ // ------------------------------------------------------------------
200
+ // Decision 3: retarget `match: {ctx: ...}` onto `match: {args: {"0": ...}}`
201
+ // ------------------------------------------------------------------
202
+
203
+ /// Rewrite every entry of a group so a ctx assertion reads the map the
204
+ /// subject actually wrote to. Only entries that HAVE a ctx (or args)
205
+ /// argument source are touched, and only when `match.args` is not
206
+ /// already spoken for - anything else is left exactly as authored, so an
207
+ /// unexpected shape fails loudly rather than being quietly rewritten.
208
+ fileprivate static func retargetctx(_ testspec: Omni.Json) -> Omni.Json {
209
+ guard let set = testspec.get("set").aslist else { return testspec }
210
+
211
+ var out: [Omni.Json] = []
212
+ for rawentry in set {
213
+ var entry = rawentry
214
+ let check = entry.get("match")
215
+ if entry.ismap, check.ismap, check.has("ctx"), !check.has("args"),
216
+ entry.has("ctx") || entry.has("args")
217
+ {
218
+ var newcheck = check
219
+ newcheck.set("args", Omni.Json.mapOf([("0", check.get("ctx"))]))
220
+ // Drop the original leaf: it would read the stale pre-call copy.
221
+ if case .map(let fields) = newcheck {
222
+ newcheck = .map(fields.filter { $0.0 != "ctx" })
223
+ }
224
+ entry.set("match", newcheck)
225
+ }
226
+ out.append(entry)
227
+ }
228
+
229
+ var spec = testspec
230
+ spec.set("set", .list(out))
231
+ return spec
232
+ }
233
+
234
+ // ------------------------------------------------------------------
235
+ // Provider
236
+ // ------------------------------------------------------------------
237
+
238
+ // The live client behind each provider. A DEF.client entry builds a new
239
+ // SDK instance, and omniCtx resolves it back off the ctx map's `client`
240
+ // slot; only DEF-BUILT providers may override a call site's explicit
241
+ // client, because the base provider rides on every ctx entry.
242
+ private final class ProviderBox {
243
+ var clients: [ObjectIdentifier: ProjectNameSDK] = [:]
244
+ var defbuilt: Set<ObjectIdentifier> = []
245
+ let lock = NSLock()
246
+ }
247
+
248
+ private static let providers = ProviderBox()
249
+
250
+ private static func register(_ provider: Omni.Provider, _ client: ProjectNameSDK,
251
+ _ isdef: Bool)
252
+ {
253
+ providers.lock.lock()
254
+ defer { providers.lock.unlock() }
255
+ providers.clients[ObjectIdentifier(provider)] = client
256
+ if isdef { providers.defbuilt.insert(ObjectIdentifier(provider)) }
257
+ }
258
+
259
+ private static func defclient(_ provider: Omni.Provider) -> ProjectNameSDK? {
260
+ providers.lock.lock()
261
+ defer { providers.lock.unlock() }
262
+ let id = ObjectIdentifier(provider)
263
+ return providers.defbuilt.contains(id) ? providers.clients[id] : nil
264
+ }
265
+
266
+ /// Wrap a live client as an omni provider (decisions 2 and 3).
267
+ private static func sdkProvider(_ client: ProjectNameSDK, _ isdef: Bool = false)
268
+ -> Omni.Provider
269
+ {
270
+ let provider = Omni.Provider()
271
+
272
+ // A DEF.client entry becomes another live test SDK, wrapped the same
273
+ // way and marked DEF-built so omniCtx resolves it back.
274
+ provider.client = { options in
275
+ let opts = tovalue(options).asMap ?? VMap()
276
+ return sdkProvider(ProjectNameSDK.testSDK(nil, opts), true)
277
+ }
278
+
279
+ // Client options may reference the runner store.
280
+ provider.inject = { options, store in
281
+ let o = tovalue(options)
282
+ _ = ProjectNameSdk.inject(o, tovalue(store))
283
+ return tojson(o)
284
+ }
285
+
286
+ // Keep the SDK error's code beside its message, so a corpus
287
+ // `match: {err: {code: ...}}` can assert on it.
288
+ provider.errify = { err in
289
+ if let sdkerr = err as? ProjectNameError {
290
+ var entries: [(String, Omni.Json)] = [
291
+ ("name", .str("ProjectNameError")),
292
+ ("message", .str(sdkerr.message)),
293
+ ]
294
+ if !sdkerr.code.isEmpty { entries.append(("code", .str(sdkerr.code))) }
295
+ return .map(entries)
296
+ }
297
+ return Omni.errify(err)
298
+ }
299
+
300
+ register(provider, client, isdef)
301
+
302
+ return provider
303
+ }
304
+
305
+ // ------------------------------------------------------------------
306
+ // Run
307
+ // ------------------------------------------------------------------
308
+
309
+ /// What the runner returns for one named spec section - the struct-runner
310
+ /// shape the corpus call sites consume.
311
+ final class Run {
312
+ /// The resolved section, in omni's model.
313
+ let spec: OmniSpec
314
+ /// The live SDK the provider wraps.
315
+ let client: ProjectNameSDK
316
+
317
+ private let pack: Omni.RunPack
318
+
319
+ fileprivate init(_ pack: Omni.RunPack, _ client: ProjectNameSDK) {
320
+ self.pack = pack
321
+ self.spec = OmniSpec(pack.spec)
322
+ self.client = client
323
+ }
324
+
325
+ /// A named group of the resolved spec.
326
+ func set(_ name: String) -> OmniSpec { OmniSpec(pack.set(name)) }
327
+
328
+ /// Run one group with omni's default flags.
329
+ func runset(_ testspec: OmniSpec, _ subject: @escaping Subject) throws {
330
+ try runsetflags(testspec, true, subject)
331
+ }
332
+
333
+ /// Run one group with an explicit `null` flag.
334
+ func runsetflags(_ testspec: OmniSpec, _ nullFlag: Bool,
335
+ _ subject: @escaping Subject) throws
336
+ {
337
+ try pack.runsetflagsargs(
338
+ retargetctx(testspec.json), Omni.Flags(null: nullFlag),
339
+ { jargs in
340
+ // Maps and lists become VMap/VList - reference types - so a
341
+ // subject's in-place writes (decision 2's omniSyncCtx, struct's
342
+ // setpath) are visible in what we hand back as `callargs`, which
343
+ // is where `match.args` reads (decision 3).
344
+ let vargs = jargs.map { tovalue($0) }
345
+ let res = try subject(vargs)
346
+ return (vargs.map { tojson($0) }, tojson(res))
347
+ })
348
+ }
349
+ }
350
+
351
+ /// Resolves one named section of a loaded spec.
352
+ typealias NamedRunner = (String) -> Run
353
+
354
+ /// The struct runner's makeRunner(testfile, client) signature, backed by
355
+ /// vendored omni. `testfile` is a spec path (absolutized against the
356
+ /// working directory - omni's docs say a port must resolve the path
357
+ /// itself).
358
+ static func makeRunner(_ testfile: String, _ client: ProjectNameSDK) throws
359
+ -> NamedRunner
360
+ {
361
+ let path = testfile.hasPrefix("/")
362
+ ? testfile
363
+ : URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
364
+ .appendingPathComponent(testfile).path
365
+ return try namedRunner(try Omni.makeRunner(path, sdkProvider(client)), client)
366
+ }
367
+
368
+ /// The same, for an already-parsed spec (omni's own capability), which
369
+ /// keeps the smoke test free of fixture files.
370
+ static func makeRunner(_ spec: Value, _ client: ProjectNameSDK) throws
371
+ -> NamedRunner
372
+ {
373
+ return try namedRunner(try Omni.makeRunner(tojson(spec), sdkProvider(client)), client)
374
+ }
375
+
376
+ private static func namedRunner(_ runner: Omni.Runner, _ client: ProjectNameSDK)
377
+ -> NamedRunner
378
+ {
379
+ return { name in Run(runner.runner(name), client) }
380
+ }
381
+
382
+ // ------------------------------------------------------------------
383
+ // Contexts (decision 2)
384
+ // ------------------------------------------------------------------
385
+
386
+ /// Build the typed Context a generated utility takes from the ctx MAP
387
+ /// omni handed the subject (args[0]). The map's `client` entry - an omni
388
+ /// provider when a DEF entry selected one - resolves back to the live SDK
389
+ /// it wraps; otherwise the given client is used.
390
+ static func omniCtx(_ arg: Value, _ client: ProjectNameSDK, _ utility: Utility)
391
+ -> Context
392
+ {
393
+ let ctxmap = arg.asMap ?? VMap()
394
+
395
+ var usec = client
396
+ var useu = utility
397
+ if let ref = ctxmap.entries["client"]?.asNative as? Omni.Provider,
398
+ let live = defclient(ref)
399
+ {
400
+ usec = live
401
+ useu = live.getUtility()
402
+ }
403
+
404
+ let ctx = SdkRunner.makeCtxFromMap(ctxmap, usec, useu)
405
+ SdkRunner.fixCtx(ctx, usec)
406
+ return ctx
407
+ }
408
+
409
+ /// Write the OBSERVABLE state of a typed context back into the ctx map
410
+ /// the entry holds, which is where a `match: {ctx: ...}` assertion reads
411
+ /// (retargeted onto `match.args.0` - decision 3). The subject mutated the
412
+ /// typed context; the map is what the runner can walk.
413
+ static func omniSyncCtx(_ arg: Value, _ ctx: Context) {
414
+ guard let ctxmap = arg.asMap else { return }
415
+
416
+ if let spec = ctx.spec {
417
+ let m = VMap()
418
+ m.entries["base"] = .string(spec.base)
419
+ m.entries["prefix"] = .string(spec.prefix)
420
+ m.entries["suffix"] = .string(spec.suffix)
421
+ m.entries["path"] = .string(spec.path)
422
+ m.entries["method"] = .string(spec.method)
423
+ m.entries["params"] = .map(spec.params)
424
+ m.entries["query"] = .map(spec.query)
425
+ m.entries["headers"] = .map(spec.headers)
426
+ m.entries["step"] = .string(spec.step)
427
+ m.entries["alias"] = .map(spec.alias)
428
+ if !spec.body.isNoval { m.entries["body"] = spec.body }
429
+ if !spec.url.isEmpty { m.entries["url"] = .string(spec.url) }
430
+ ctxmap.entries["spec"] = .map(m)
431
+ }
432
+
433
+ if let result = ctx.result {
434
+ let m = VMap()
435
+ m.entries["ok"] = .bool(result.ok)
436
+ m.entries["status"] = .int(Int64(result.status))
437
+ m.entries["statusText"] = .string(result.statusText)
438
+ m.entries["headers"] = .map(result.headers)
439
+ if !result.body.isNoval { m.entries["body"] = result.body }
440
+ if let err = result.err {
441
+ let em = VMap()
442
+ em.entries["message"] = .string(errMessage(err))
443
+ m.entries["err"] = .map(em)
444
+ }
445
+ if !result.resdata.isNoval { m.entries["resdata"] = result.resdata }
446
+ if let rm = result.resmatch { m.entries["resmatch"] = .map(rm) }
447
+ ctxmap.entries["result"] = .map(m)
448
+ }
449
+
450
+ // Presence, not content: the corpus asserts `response: "__EXISTS__"`.
451
+ // Written only when the subject really produced one, so the assertion
452
+ // still fails when it did not.
453
+ if ctx.response != nil {
454
+ ctxmap.entries["response"] = .string("exists")
455
+ }
456
+ }
457
+
458
+ // ------------------------------------------------------------------
459
+ // The struct corpus's nullModifier
460
+ // ------------------------------------------------------------------
461
+
462
+ /// A bare "__NULL__" becomes a real null; an embedded one inside a larger
463
+ /// string becomes the literal text "null". omni's own `nullmodifier`
464
+ /// RETURNS the replacement, while struct's `inject` passes this as its
465
+ /// `modify` hook and expects it to write `parent[key]` in place.
466
+ static let nullModifier: Modify = { val, key, parent, _, _ in
467
+ guard case .string(let text) = val else { return }
468
+ if NULLMARK == text {
469
+ setprop(parent, key, .null)
470
+ } else if text.contains(NULLMARK) {
471
+ setprop(parent, key, .string(text.replacingOccurrences(of: NULLMARK, with: "null")))
472
+ }
473
+ }
474
+ }