@voxgig/sdkgen 4.8.2 → 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 +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/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,649 @@
1
+ # VENDORED: @voxgig/omni 0.1.0 (perl/lib/Voxgig/Omni/Runner.pm)
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
+ package Voxgig::Omni::Runner;
5
+
6
+ # Omni: the shared multi-language test runner.
7
+ #
8
+ # Port of the canonical TypeScript implementation
9
+ # (typescript/src/Runner.ts). Behaviour must match, case for case.
10
+
11
+ use strict;
12
+ use warnings;
13
+
14
+ use JSON::PP ();
15
+ use Scalar::Util qw(blessed reftype);
16
+
17
+ use Voxgig::Omni::Util qw(
18
+ ABSENT NULLMARK UNDEFMARK EXISTSMARK
19
+ clone deepequal getpath isabsent isbool islist ismap isnode isnum
20
+ jsonstr pathify stringify walk
21
+ );
22
+
23
+ use Exporter 'import';
24
+ our @EXPORT_OK = qw(
25
+ makeRunner loadspec resolvespec matchval match fixjson errify nullmodifier
26
+ SPECVERSION CAPABILITIES
27
+ );
28
+
29
+ # The newest spec format version this runner understands. A spec with no
30
+ # OMNI block is version 0: the original, lenient format, frozen forever.
31
+ # Version 1 turns on strict entry validation (see checkentry).
32
+ use constant SPECVERSION => 1;
33
+
34
+ # Capability strings this runner supports beyond the version baseline. A
35
+ # spec's OMNI.requires list is checked against this: an unknown capability
36
+ # refuses the spec loudly at load time, instead of a lagging port silently
37
+ # mis-running it. (Empty today; future format features mint a string here.)
38
+ use constant CAPABILITIES => [];
39
+
40
+ # The complete set of fields an entry may carry. Under version 1 anything
41
+ # else is an error: an unrecognised key is almost always a typo'd
42
+ # assertion, and a typo'd assertion is a test that silently stopped
43
+ # testing.
44
+ use constant ENTRYFIELDS => [qw(in args ctx out err match client id doc)];
45
+
46
+ # A test failure (or a malformed spec). Distinct from errors thrown by the
47
+ # subject under test, which are candidates for an `err` expectation.
48
+ {
49
+ package Voxgig::Omni::OmniError;
50
+ use overload '""' => sub { $_[0]->{message} }, fallback => 1;
51
+
52
+ sub new {
53
+ my ( $class, $message, $entry ) = @_;
54
+ return bless { message => $message, entry => $entry }, $class;
55
+ }
56
+
57
+ sub message { return $_[0]->{message} }
58
+ sub entry { return $_[0]->{entry} }
59
+ }
60
+
61
+ sub is_omni_error {
62
+ my ($err) = @_;
63
+ return ( blessed($err) && $err->isa('Voxgig::Omni::OmniError') ) ? 1 : 0;
64
+ }
65
+
66
+ # Load a spec: a path to a JSON file, or an already-parsed structure.
67
+ sub loadspec {
68
+ my ($specref) = @_;
69
+
70
+ if ( !ref $specref ) {
71
+ open( my $handle, '<', $specref )
72
+ or die Voxgig::Omni::OmniError->new( 'omni: cannot read spec: ' . $specref );
73
+ local $/ = undef;
74
+ my $text = <$handle>;
75
+ close($handle);
76
+ return JSON::PP->new->decode($text);
77
+ }
78
+
79
+ return $specref;
80
+ }
81
+
82
+ # Read the spec's format version from its optional top-level OMNI block,
83
+ # and refuse a spec this runner cannot faithfully run: a version newer
84
+ # than SPECVERSION, or a required capability not in CAPABILITIES.
85
+ sub resolveversion {
86
+ my ($alltests) = @_;
87
+
88
+ # JSON null decodes to undef, so `defined` cannot tell a null OMNI
89
+ # block from an absent one - only `exists` can. A present-but-null
90
+ # block is malformed, exactly as in canonical.
91
+ return 0 if !ismap($alltests) || !exists $alltests->{OMNI};
92
+ my $meta = $alltests->{OMNI};
93
+
94
+ # Perl scalars are untyped: a JSON number is told apart from anything
95
+ # else with isnum, and "integer" is int()-equality rather than typeof.
96
+ if ( !ismap($meta)
97
+ || !isnum( $meta->{version} )
98
+ || 0 != ( $meta->{version} - int( $meta->{version} ) ) )
99
+ {
100
+ die Voxgig::Omni::OmniError->new('omni: malformed OMNI version block');
101
+ }
102
+
103
+ my $version = $meta->{version};
104
+
105
+ if ( $version < 0 || SPECVERSION() < $version ) {
106
+ die Voxgig::Omni::OmniError->new( 'omni: unsupported spec version: ' . $version );
107
+ }
108
+
109
+ if ( exists $meta->{requires} ) {
110
+ my $requires = $meta->{requires};
111
+ die Voxgig::Omni::OmniError->new('omni: malformed OMNI requires list')
112
+ if !islist($requires);
113
+
114
+ for my $cap (@$requires) {
115
+ my $isstring = !ref($cap) && !isbool($cap);
116
+ die Voxgig::Omni::OmniError->new(
117
+ 'omni: spec requires unsupported capability: ' . stringify($cap) )
118
+ if !$isstring || !grep { $_ eq $cap } @{ CAPABILITIES() };
119
+ }
120
+ }
121
+
122
+ return $version;
123
+ }
124
+
125
+ # Strict entry validation, applied when the spec declares version 1 or
126
+ # later. The lenient format converts each of these mistakes into a silent
127
+ # pass or a dead field; here they fail with the entry named.
128
+ sub checkentry {
129
+ my ( $flags, $index, $entry ) = @_;
130
+
131
+ die fail( $flags, $index, $entry, 'entry is not a map' ) if !ismap($entry);
132
+
133
+ for my $key ( keys %$entry ) {
134
+ die fail( $flags, $index, $entry, 'unknown entry field: ' . $key )
135
+ if !grep { $_ eq $key } @{ ENTRYFIELDS() };
136
+ }
137
+
138
+ my $argsources = grep { exists $entry->{$_} } qw(in args ctx);
139
+ die fail( $flags, $index, $entry, 'entry has more than one of in, args, ctx' )
140
+ if 1 < $argsources;
141
+
142
+ die fail( $flags, $index, $entry, 'entry has both err and out' )
143
+ if defined $entry->{err} && exists $entry->{out};
144
+
145
+ die fail( $flags, $index, $entry, 'entry id is not a string' )
146
+ if exists $entry->{id}
147
+ && ( !defined $entry->{id} || ref( $entry->{id} ) || isbool( $entry->{id} ) );
148
+
149
+ return;
150
+ }
151
+
152
+ # Validate a version-1 group up front, against the AUTHORED entries -
153
+ # null-normalisation would otherwise rewrite an authored null (e.g.
154
+ # id: null) into a sentinel string and hide it from validation. A
155
+ # malformed spec is a spec error, not a test result, so it fails before
156
+ # any subject runs.
157
+ sub checkset {
158
+ my ( $flags, $testspec, $normalset ) = @_;
159
+
160
+ my $origset =
161
+ ( ismap($testspec) && islist( $testspec->{set} ) ) ? $testspec->{set} : $normalset;
162
+
163
+ my $empty = ismap($testspec) ? $testspec->{empty} : undef;
164
+ my $isemptyok = ( isbool($empty) && $empty ) ? 1 : 0;
165
+ die Voxgig::Omni::OmniError->new( 'omni: empty test set: ' . $flags->{name} )
166
+ if 0 == scalar(@$origset) && !$isemptyok;
167
+
168
+ for my $index ( 0 .. $#$origset ) {
169
+ checkentry( $flags, $index, $origset->[$index] );
170
+ }
171
+
172
+ return;
173
+ }
174
+
175
+ # Find `primary.<name>`, then `<name>`, then the whole spec.
176
+ sub resolvespec {
177
+ my ( $name, $alltests ) = @_;
178
+
179
+ return $alltests if !defined $name;
180
+
181
+ my $primary = ismap($alltests) ? $alltests->{primary} : undef;
182
+ return $primary->{$name} if ismap($primary) && defined $primary->{$name};
183
+
184
+ return $alltests->{$name} if ismap($alltests) && defined $alltests->{$name};
185
+
186
+ return $alltests;
187
+ }
188
+
189
+ # Build the named clients declared by the spec's DEF.client block.
190
+ sub resolveclients {
191
+ my ( $provider, $spec, $store ) = @_;
192
+ my %clients;
193
+
194
+ my $defclient =
195
+ ( ismap($spec) && ismap( $spec->{DEF} ) ) ? $spec->{DEF}{client} : undef;
196
+ return \%clients if !ismap($defclient);
197
+
198
+ # A spec may define clients that a given test run never references.
199
+ my $clientmaker = $provider->{client};
200
+ return \%clients if !defined $clientmaker;
201
+
202
+ for my $clientname ( keys %$defclient ) {
203
+ my $cdef = $defclient->{$clientname};
204
+ my $copts =
205
+ clone( ( ismap($cdef) && ismap( $cdef->{test} ) ? $cdef->{test}{options} : undef ) || {} );
206
+
207
+ my $injector = $provider->{inject};
208
+ $injector->( $copts, $store ) if ismap($store) && defined $injector;
209
+
210
+ $clients{$clientname} = $clientmaker->($copts);
211
+ }
212
+
213
+ return \%clients;
214
+ }
215
+
216
+ sub resolvesubject {
217
+ my ( $name, $provider ) = @_;
218
+ return undef if !defined $name || !defined $provider->{subject};
219
+ return $provider->{subject}->($name);
220
+ }
221
+
222
+ sub resolveflags {
223
+ my ($flags) = @_;
224
+ my %out = %{ $flags || {} };
225
+ $out{null} = !defined $out{null} ? 1 : ( $out{null} ? 1 : 0 );
226
+ return \%out;
227
+ }
228
+
229
+ # An entry with no `out` expects a null (or absent) result.
230
+ sub resolveentry {
231
+ my ( $entry, $flags ) = @_;
232
+ $entry->{out} = NULLMARK if !defined $entry->{out} && $flags->{null};
233
+ return $entry;
234
+ }
235
+
236
+ sub resolvetestpack {
237
+ my ( $name, $entry, $subject, $provider, $clients ) = @_;
238
+ my $testpack = { client => $provider, subject => $subject };
239
+
240
+ if ( defined $entry->{client} ) {
241
+ my $client = $clients->{ $entry->{client} };
242
+ die Voxgig::Omni::OmniError->new( 'omni: unknown client: ' . $entry->{client}, $entry )
243
+ if !defined $client;
244
+ $testpack->{client} = $client;
245
+ $testpack->{subject} = resolvesubject( $name, $client ) || $subject;
246
+ }
247
+
248
+ return $testpack;
249
+ }
250
+
251
+ # Build the argument list: `ctx`, `args`, or `in`.
252
+ sub resolveargs {
253
+ my ( $entry, $testpack, $provider ) = @_;
254
+ my $args;
255
+
256
+ if ( exists $entry->{ctx} ) {
257
+ $args = [ $entry->{ctx} ];
258
+ }
259
+ elsif ( exists $entry->{args} ) {
260
+ $args = $entry->{args};
261
+ }
262
+ else {
263
+ # exists, not truth: an entry carrying none of `in`/`args`/`ctx` is
264
+ # called with one ABSENT argument, not undef. `typify()` is
265
+ # 1073741824 where `typify(null)` is 4194432.
266
+ $args = [ exists $entry->{in} ? clone( $entry->{in} ) : ABSENT ];
267
+ }
268
+
269
+ if ( ( exists $entry->{ctx} || exists $entry->{args} ) && 0 < scalar(@$args) ) {
270
+ my $first = $args->[0];
271
+ if ( ismap($first) ) {
272
+ $first = clone($first);
273
+ my $contextify = $provider->{contextify};
274
+ $first = $contextify->($first) if defined $contextify;
275
+ $args->[0] = $first;
276
+ $entry->{ctx} = $first;
277
+ $first->{client} = $testpack->{client} if ismap($first);
278
+ }
279
+ }
280
+
281
+ return $args;
282
+ }
283
+
284
+ # Nulls become NULLMARK, errors become {name,message}. Always a copy.
285
+ sub fixjson {
286
+ my ( $val, $flags ) = @_;
287
+ my $donull = ( !defined $flags || !defined $flags->{null} ) ? 1 : ( $flags->{null} ? 1 : 0 );
288
+ return fixjsonval( $val, $donull );
289
+ }
290
+
291
+ sub fixjsonval {
292
+ my ( $val, $donull ) = @_;
293
+
294
+ if ( !defined $val || isabsent($val) ) {
295
+ # Canonical returns the value UNCHANGED when donull is false
296
+ # (typescript/src/Runner.ts): absent stays absent and undef stays
297
+ # undef. Answering undef for both collapsed two states the corpus
298
+ # distinguishes. Same defect omni-lua and omni-rust carried
299
+ # (voxgig/omni#17, #23).
300
+ return $donull ? NULLMARK : $val;
301
+ }
302
+
303
+ return errify($val) if blessed($val) && $val->isa('Voxgig::Omni::OmniError');
304
+
305
+ if ( islist($val) ) {
306
+ return [ map { fixjsonval( $_, $donull ) } @$val ];
307
+ }
308
+
309
+ if ( ismap($val) ) {
310
+ my %out;
311
+ for my $key ( keys %$val ) {
312
+ $out{$key} = fixjsonval( $val->{$key}, $donull );
313
+ }
314
+ return \%out;
315
+ }
316
+
317
+ return $val;
318
+ }
319
+
320
+ # The JSON form of an error: always at least {name,message}.
321
+ sub errify {
322
+ my ($err) = @_;
323
+ my $name = blessed($err) ? ref($err) : 'Error';
324
+ return { name => $name, message => errmessage($err) };
325
+ }
326
+
327
+ # The error base a `match.err` sees: the provider's own, when it has one.
328
+ # A library whose errors carry a `code` reaches `match: {err: {code}}`
329
+ # through `Provider.errify`, which REPLACES this rather than adding to it.
330
+ sub errbase {
331
+ my ( $err, $provider ) = @_;
332
+ my $hook = ref($provider) eq 'HASH' ? $provider->{errify} : undef;
333
+ return defined $hook ? $hook->($err) : errify($err);
334
+ }
335
+
336
+ # Perl's `die` decorates the message: `die "msg"` becomes "msg at FILE line
337
+ # N.\n", and `die "msg\n"` keeps the newline. Both are removed so that a
338
+ # message reads the same here as in every other port.
339
+ #
340
+ # Only that decoration is removed. A message whose own last character is a
341
+ # space keeps it - stripping trailing whitespace wholesale made Perl the one
342
+ # port where `err` could not pin such a message.
343
+ sub errmessage {
344
+ my ($err) = @_;
345
+ my $msg = "$err";
346
+ $msg =~ s/ at \S+ line \d+\.?\n?$//;
347
+ $msg =~ s/\n$//;
348
+ return $msg;
349
+ }
350
+
351
+ # The label of one entry, for failure messages.
352
+ sub entryref {
353
+ my ( $flags, $index, $entry ) = @_;
354
+ my $label = $flags->{name} || 'set';
355
+ my $entryid =
356
+ ( ismap($entry) && defined $entry->{id} ) ? ' (' . $entry->{id} . ')' : '';
357
+ return $label . '[' . $index . ']' . $entryid;
358
+ }
359
+
360
+ sub fail {
361
+ my ( $flags, $index, $entry, $reason, $expected, $actual ) = @_;
362
+ my $msg = 'omni: ' . entryref( $flags, $index, $entry ) . ': ' . $reason;
363
+ $msg .= "\n expected: " . $expected if defined $expected;
364
+ $msg .= "\n actual: " . $actual if defined $actual;
365
+ $msg .= "\n entry: " . stringify( entrysummary($entry) );
366
+ return Voxgig::Omni::OmniError->new( $msg, $entry );
367
+ }
368
+
369
+ # The spec-defined part of an entry (drop runner bookkeeping).
370
+ sub entrysummary {
371
+ my ($entry) = @_;
372
+ return $entry if !ismap($entry);
373
+ my %out;
374
+ for my $key ( keys %$entry ) {
375
+ $out{$key} = $entry->{$key} if $key ne 'res' && $key ne 'thrown' && $key ne 'ctx';
376
+ }
377
+ return \%out;
378
+ }
379
+
380
+ sub checkresult {
381
+ my ( $flags, $index, $entry, $args, $res ) = @_;
382
+ my $matched = 0;
383
+
384
+ if ( defined $entry->{err} ) {
385
+ die fail( $flags, $index, $entry, 'expected error did not occur',
386
+ stringify( $entry->{err} ), stringify($res) );
387
+ }
388
+
389
+ if ( defined $entry->{match} ) {
390
+ match(
391
+ $flags, $index, $entry,
392
+ $entry->{match},
393
+ {
394
+ 'in' => $entry->{in},
395
+ args => $args,
396
+ out => $entry->{res},
397
+ ctx => $entry->{ctx},
398
+ }
399
+ );
400
+ $matched = 1;
401
+ }
402
+
403
+ # Same conflation as resolveargs: an entry with NO `out` expects an ABSENT
404
+ # result, and one with `out: null` expects a null. Reading the key without
405
+ # asking whether it exists made both undef, so a subject that correctly
406
+ # returned nothing was compared against null and marked wrong. Canonical
407
+ # gets this for free - `entry.out` on a missing key IS undefined, which is
408
+ # also how TypeScript spells absent.
409
+ #
410
+ # (Under `null: true` this never fires - resolveentry has already put
411
+ # NULLMARK there.)
412
+ my $out = exists $entry->{out} ? $entry->{out} : ABSENT;
413
+
414
+ return if deepequal( $res, $out );
415
+
416
+ # NOTE: a match with no explicit out is a complete check on its own.
417
+ # `null == out` in canonical is true of undefined too, so absent counts.
418
+ return if $matched
419
+ && ( !defined $out || isabsent($out) || ( !ref($out) && $out eq NULLMARK ) );
420
+
421
+ die fail( $flags, $index, $entry, 'result mismatch', stringify($out), stringify($res) );
422
+ }
423
+
424
+ sub handleerror {
425
+ my ( $flags, $index, $entry, $err, $provider ) = @_;
426
+
427
+ my $entryerr = $entry->{err};
428
+
429
+ if ( defined $entryerr ) {
430
+ my $istrue = ( JSON::PP::is_bool($entryerr) && $entryerr ) ? 1 : 0;
431
+ if ( $istrue || matchval( $entryerr, errmessage($err) ) ) {
432
+ if ( defined $entry->{match} ) {
433
+ match(
434
+ $flags, $index, $entry,
435
+ $entry->{match},
436
+ {
437
+ 'in' => $entry->{in},
438
+ out => $entry->{res},
439
+ ctx => $entry->{ctx},
440
+ err => errbase( $err, $provider ),
441
+ }
442
+ );
443
+ }
444
+ return;
445
+ }
446
+
447
+ die fail( $flags, $index, $entry, 'error mismatch', stringify($entryerr),
448
+ errmessage($err) );
449
+ }
450
+
451
+ die fail( $flags, $index, $entry, 'unexpected error', undef, errmessage($err) );
452
+ }
453
+
454
+ # Check that every leaf of `check` is present, and matches, in `base`.
455
+ sub match {
456
+ my ( $flags, $index, $entry, $check, $base ) = @_;
457
+ my $cbase = clone($base);
458
+
459
+ my $apply = sub {
460
+ my ( $_key, $val, $_parent, $path ) = @_;
461
+
462
+ my $where = 0 == scalar(@$path) ? '<root>' : pathify($path);
463
+
464
+ return $val if isnode($val);
465
+
466
+ my $baseval = getpath( $cbase, $path );
467
+
468
+ my $isleafstr = !ref($val) && defined($val);
469
+
470
+ # The sentinels are tested BEFORE the identity check below. Otherwise
471
+ # a subject returning the literal string "__UNDEF__" satisfies an
472
+ # assertion that the key is absent - two mutually exclusive states
473
+ # passing one check. A sentinel that accepts its own literal is not a
474
+ # sentinel. (NULLMARK still accepts NULLMARK: under the default null
475
+ # flag a real null has already been normalised to it, so the two are
476
+ # genuinely indistinguishable here - that one needs a raw-value
477
+ # escape, not an ordering change.)
478
+
479
+ # Explicitly absent: satisfied only by a genuinely missing key, never
480
+ # by a present null (the distinction the sentinels exist to keep).
481
+ if ( $isleafstr && $val eq UNDEFMARK ) {
482
+ return $val if isabsent($baseval);
483
+ die fail( $flags, $index, $entry, 'expected absent at ' . $where,
484
+ 'absent', stringify($baseval) );
485
+ }
486
+
487
+ # Explicitly null: satisfied only by a present null.
488
+ if ( $isleafstr && $val eq NULLMARK ) {
489
+ return $val
490
+ if !defined($baseval)
491
+ || ( !ref($baseval) && $baseval eq NULLMARK );
492
+ die fail( $flags, $index, $entry, 'expected null at ' . $where,
493
+ 'null', stringify($baseval) );
494
+ }
495
+
496
+ # Explicitly present: any present value, including null.
497
+ if ( $isleafstr && $val eq EXISTSMARK ) {
498
+ return $val if !isabsent($baseval);
499
+ die fail( $flags, $index, $entry, 'expected present at ' . $where,
500
+ 'present', 'absent' );
501
+ }
502
+
503
+ # Identical values match. This sits below the sentinel branches on
504
+ # purpose - see the note above.
505
+ return $val if deepequal( $val, $baseval );
506
+
507
+ # A concrete expectation never matches a missing key - a match leaf
508
+ # against an absent value must fail, not substring-match "undefined".
509
+ if ( isabsent($baseval) ) {
510
+ die fail( $flags, $index, $entry, 'match failed at ' . $where,
511
+ stringify($val), 'absent' );
512
+ }
513
+
514
+ if ( !matchval( $val, $baseval ) ) {
515
+ die fail( $flags, $index, $entry, 'match failed at ' . $where,
516
+ stringify($val), stringify($baseval) );
517
+ }
518
+
519
+ return $val;
520
+ };
521
+
522
+ walk( clone($check), $apply );
523
+ }
524
+
525
+ # Match one leaf: /regex/ or case-insensitive substring for strings.
526
+ sub matchval {
527
+ my ( $check, $base ) = @_;
528
+
529
+ return 1 if deepequal( $check, $base );
530
+
531
+ my $want = $check;
532
+
533
+ if ( !defined $want ) {
534
+ return 1 if !defined $base || isabsent($base);
535
+ return ( !ref($base) && $base eq NULLMARK ) ? 1 : 0;
536
+ }
537
+
538
+ return 1 if ref($want) eq 'CODE';
539
+
540
+ if ( !ref($want) && !Voxgig::Omni::Util::isnum($want) ) {
541
+
542
+ # An empty want would substring-match anything: reject it.
543
+ return 0 if '' eq $want;
544
+
545
+ my $basestr = stringify($base);
546
+
547
+ if ( $want =~ m{^/(.+)/$}s ) {
548
+ my $pattern = $1;
549
+ return ( $basestr =~ /$pattern/ ) ? 1 : 0;
550
+ }
551
+
552
+ return ( index( lc($basestr), lc($want) ) >= 0 ) ? 1 : 0;
553
+ }
554
+
555
+ return deepequal( $want, $base );
556
+ }
557
+
558
+ # Convert NULLMARK sentinels back into real nulls.
559
+ sub nullmodifier {
560
+ my ( $val, $key, $parent ) = @_;
561
+ if ( !ref($val) && defined($val) && $val eq NULLMARK ) {
562
+ if ( islist($parent) ) { $parent->[$key] = undef }
563
+ else { $parent->{$key} = undef }
564
+ }
565
+ elsif ( !ref($val) && defined($val) ) {
566
+ my $text = $val;
567
+ $text =~ s/__NULL__/null/g;
568
+ if ( islist($parent) ) { $parent->[$key] = $text }
569
+ else { $parent->{$key} = $text }
570
+ }
571
+ return;
572
+ }
573
+
574
+ # Make a runner for a spec file (or spec structure) and a provider.
575
+ sub makeRunner {
576
+ my ( $specref, $provider ) = @_;
577
+ my $alltests = loadspec($specref);
578
+ my $specversion = resolveversion($alltests);
579
+ my $useprovider = $provider || {};
580
+
581
+ return sub {
582
+ my ( $name, $store ) = @_;
583
+
584
+ my $spec = resolvespec( $name, $alltests );
585
+ my $clients = resolveclients( $useprovider, $spec, defined $store ? $store : {} );
586
+ my $defsubject = resolvesubject( $name, $useprovider );
587
+
588
+ my $runsetflags = sub {
589
+ my ( $testspec, $flags, $testsubject ) = @_;
590
+
591
+ my $useflags = resolveflags($flags);
592
+ $useflags->{name} = $useflags->{name} || $name || 'set';
593
+
594
+ my $subject = $testsubject || $defsubject;
595
+ die Voxgig::Omni::OmniError->new( 'omni: no test subject for: ' . $useflags->{name} )
596
+ if !defined $subject;
597
+
598
+ my $testspecmap = fixjson( $testspec, $useflags );
599
+
600
+ die Voxgig::Omni::OmniError->new( 'omni: test spec has no set: ' . $useflags->{name} )
601
+ if !ismap($testspecmap) || !islist( $testspecmap->{set} );
602
+
603
+ my $testset = $testspecmap->{set};
604
+
605
+ checkset( $useflags, $testspec, $testset ) if 1 <= $specversion;
606
+
607
+ for my $index ( 0 .. $#$testset ) {
608
+ my $entry = $testset->[$index];
609
+
610
+ my $ok = eval {
611
+ $entry = resolveentry( $entry, $useflags );
612
+
613
+ my $testpack = resolvetestpack( $name, $entry, $subject, $useprovider, $clients );
614
+ my $args = resolveargs( $entry, $testpack, $useprovider );
615
+
616
+ my $res = $testpack->{subject}->(@$args);
617
+ $res = fixjson( $res, $useflags );
618
+ $entry->{res} = $res;
619
+
620
+ checkresult( $useflags, $index, $entry, $args, $res );
621
+ 1;
622
+ };
623
+
624
+ if ( !$ok ) {
625
+ my $err = $@;
626
+ die $err if is_omni_error($err);
627
+ handleerror( $useflags, $index, $entry, $err, $useprovider );
628
+ }
629
+ }
630
+
631
+ return;
632
+ };
633
+
634
+ my $runset = sub {
635
+ my ( $testspec, $testsubject ) = @_;
636
+ return $runsetflags->( $testspec, {}, $testsubject );
637
+ };
638
+
639
+ return {
640
+ spec => $spec,
641
+ runset => $runset,
642
+ runsetflags => $runsetflags,
643
+ subject => $defsubject,
644
+ client => $useprovider,
645
+ };
646
+ };
647
+ }
648
+
649
+ 1;