@voxgig/sdkgen 4.8.2 → 4.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/action/doctor.d.ts +1 -0
  3. package/dist/action/doctor.js +50 -2
  4. package/dist/action/doctor.js.map +1 -1
  5. package/dist/helpers/naming.js +4 -2
  6. package/dist/helpers/naming.js.map +1 -1
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/model/sdkgen.aon +21 -0
  9. package/package.json +1 -1
  10. package/project/.sdk/model/feature/secrets.aon +120 -18
  11. package/project/.sdk/model/target/c.aon +10 -0
  12. package/project/.sdk/model/target/clojure.aon +13 -0
  13. package/project/.sdk/model/target/cpp.aon +10 -0
  14. package/project/.sdk/model/target/csharp.aon +9 -0
  15. package/project/.sdk/model/target/dart.aon +10 -0
  16. package/project/.sdk/model/target/elixir.aon +9 -0
  17. package/project/.sdk/model/target/go.aon +13 -0
  18. package/project/.sdk/model/target/java.aon +9 -0
  19. package/project/.sdk/model/target/js.aon +7 -0
  20. package/project/.sdk/model/target/kotlin.aon +9 -0
  21. package/project/.sdk/model/target/lean.aon +17 -0
  22. package/project/.sdk/model/target/lua.aon +8 -0
  23. package/project/.sdk/model/target/ocaml.aon +9 -0
  24. package/project/.sdk/model/target/perl.aon +8 -0
  25. package/project/.sdk/model/target/php.aon +8 -0
  26. package/project/.sdk/model/target/py.aon +13 -0
  27. package/project/.sdk/model/target/rb.aon +8 -0
  28. package/project/.sdk/model/target/rust.aon +10 -0
  29. package/project/.sdk/model/target/scala.aon +21 -2
  30. package/project/.sdk/model/target/swift.aon +18 -0
  31. package/project/.sdk/model/target/ts.aon +13 -0
  32. package/project/.sdk/model/target/zig.aon +9 -0
  33. package/project/.sdk/src/cmp/clojure/Package_clojure.ts +9 -2
  34. package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +3 -0
  35. package/project/.sdk/src/cmp/dart/Test_dart.ts +2 -0
  36. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +4 -1
  37. package/project/.sdk/src/cmp/go/Config_go.ts +59 -2
  38. package/project/.sdk/src/cmp/go/Main_go.ts +8 -2
  39. package/project/.sdk/src/cmp/java/Test_java.ts +6 -5
  40. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +6 -5
  41. package/project/.sdk/src/cmp/lean/Package_lean.ts +23 -0
  42. package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +1 -0
  43. package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +1 -0
  44. package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
  45. package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +7 -3
  46. package/project/.sdk/src/cmp/py/Config_py.ts +82 -1
  47. package/project/.sdk/src/cmp/py/Main_py.ts +44 -0
  48. package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +2 -0
  49. package/project/.sdk/src/cmp/swift/Main_swift.ts +10 -0
  50. package/project/.sdk/src/cmp/swift/Package_swift.ts +13 -1
  51. package/project/.sdk/src/cmp/ts/Config_ts.ts +42 -17
  52. package/project/.sdk/src/cmp/ts/fragment/Config.data.fragment.ts +13 -1
  53. package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +13 -1
  54. package/project/.sdk/src/cmp/zig/Package_zig.ts +15 -11
  55. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +3 -3
  56. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +3 -3
  57. package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +3 -3
  58. package/project/.sdk/src/cmp/zig/utility_zig.ts +50 -1
  59. package/project/.sdk/tm/c/Makefile +38 -3
  60. package/project/.sdk/tm/c/tests/omni_resolver.h +361 -0
  61. package/project/.sdk/tm/c/tests/omni_smoke_test.c +237 -0
  62. package/project/.sdk/tm/c/tests/primary_corpus_test.c +205 -284
  63. package/project/.sdk/tm/c/tests/struct_corpus_test.c +292 -212
  64. package/project/.sdk/tm/c/tests/vendor/omni/json.c +811 -0
  65. package/project/.sdk/tm/c/tests/vendor/omni/omni.h +240 -0
  66. package/project/.sdk/tm/c/tests/vendor/omni/runner.c +940 -0
  67. package/project/.sdk/tm/c/tests/vendor/omni/util.c +351 -0
  68. package/project/.sdk/tm/c/utility/struct/utility.c +7 -2
  69. package/project/.sdk/tm/clojure/test/sdk/test/omni.clj +401 -0
  70. package/project/.sdk/tm/clojure/test/sdk/test/omni_smoke.clj +81 -0
  71. package/project/.sdk/tm/clojure/test/sdk/test/primary.clj +92 -58
  72. package/project/.sdk/tm/clojure/test/sdk/test/struct_corpus.clj +122 -149
  73. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +8 -3
  74. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +145 -0
  75. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +445 -0
  76. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +145 -0
  77. package/project/.sdk/tm/cpp/Makefile +5 -1
  78. package/project/.sdk/tm/cpp/test/omni_resolver.hpp +473 -0
  79. package/project/.sdk/tm/cpp/test/omni_smoke_test.cpp +209 -0
  80. package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +243 -184
  81. package/project/.sdk/tm/cpp/test/runner_support.hpp +68 -181
  82. package/project/.sdk/tm/cpp/test/struct_corpus_test.cpp +183 -56
  83. package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +406 -0
  84. package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +751 -0
  85. package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +256 -0
  86. package/project/.sdk/tm/cpp/utility/pipeline.hpp +7 -1
  87. package/project/.sdk/tm/csharp/test/OmniResolver.cs +491 -0
  88. package/project/.sdk/tm/csharp/test/OmniSmokeTest.cs +106 -0
  89. package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +299 -316
  90. package/project/.sdk/tm/csharp/test/Runner.cs +104 -269
  91. package/project/.sdk/tm/csharp/test/StructUtilityTest.cs +535 -724
  92. package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +864 -0
  93. package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +347 -0
  94. package/project/.sdk/tm/csharp/utility/MakeSpec.cs +3 -1
  95. package/project/.sdk/tm/csharp/utility/PrepareMethod.cs +6 -1
  96. package/project/.sdk/tm/csharp/utility/struct/Struct.cs +21 -5
  97. package/project/.sdk/tm/dart/test/omni.dart +520 -0
  98. package/project/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
  99. package/project/.sdk/tm/dart/test/primary_test.dart +86 -28
  100. package/project/.sdk/tm/dart/test/struct_test.dart +438 -11
  101. package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
  102. package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
  103. package/project/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
  104. package/project/.sdk/tm/elixir/Makefile +11 -3
  105. package/project/.sdk/tm/elixir/test/omni_smoke_test.exs +117 -0
  106. package/project/.sdk/tm/elixir/test/primary_utility_test.exs +341 -16
  107. package/project/.sdk/tm/elixir/test/struct_corpus_test.exs +554 -9
  108. package/project/.sdk/tm/elixir/test/support/omni.ex +377 -0
  109. package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +122 -0
  110. package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +623 -0
  111. package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +187 -0
  112. package/project/.sdk/tm/go/core/context.go +32 -16
  113. package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +261 -0
  114. package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +78 -0
  115. package/project/.sdk/tm/go/feature/secrets/plugin/config.go +652 -0
  116. package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +250 -0
  117. package/project/.sdk/tm/go/feature/secrets/plugin/env.go +194 -0
  118. package/project/.sdk/tm/go/feature/secrets/plugin/export.go +80 -0
  119. package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +238 -0
  120. package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1575 -0
  121. package/project/.sdk/tm/go/feature/secrets/plugin/order.go +248 -0
  122. package/project/.sdk/tm/go/feature/secrets/plugin/point.go +184 -0
  123. package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +123 -0
  124. package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +79 -0
  125. package/project/.sdk/tm/go/feature/secrets/plugin/types.go +296 -0
  126. package/project/.sdk/tm/go/feature/secrets/plugin/util.go +87 -0
  127. package/project/.sdk/tm/go/feature/secrets/plugin/version.go +161 -0
  128. package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +292 -0
  129. package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +201 -0
  130. package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +187 -0
  131. package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +184 -0
  132. package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +114 -0
  133. package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +156 -0
  134. package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +208 -0
  135. package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +241 -0
  136. package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +150 -0
  137. package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +152 -0
  138. package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +143 -0
  139. package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +120 -0
  140. package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +442 -0
  141. package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +714 -0
  142. package/project/.sdk/tm/go/feature/secrets_feature.go +675 -0
  143. package/project/.sdk/tm/go/src/feature/secrets/.gitkeep +0 -0
  144. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +799 -0
  145. package/project/.sdk/tm/go/test/omni/omni.go +902 -0
  146. package/project/.sdk/tm/go/test/omni/util.go +381 -0
  147. package/project/.sdk/tm/go/test/omniresolver_test.go +748 -0
  148. package/project/.sdk/tm/go/test/omnismoke_test.go +112 -0
  149. package/project/.sdk/tm/go/test/primary_utility_test.go +123 -191
  150. package/project/.sdk/tm/go/test/struct_utility_test.go +323 -16
  151. package/project/.sdk/tm/go/test/testsupport_test.go +294 -0
  152. package/project/.sdk/tm/go/utility/make_options.go +8 -1
  153. package/project/.sdk/tm/go/utility/prepare_method.go +5 -1
  154. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +2 -2
  155. package/project/.sdk/tm/java/test/OmniResolver.java +355 -0
  156. package/project/.sdk/tm/java/test/OmniSmokeTest.java +99 -0
  157. package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +254 -280
  158. package/project/.sdk/tm/java/test/RunnerSupport.java +9 -194
  159. package/project/.sdk/tm/java/test/StructCorpusTest.java +119 -42
  160. package/project/.sdk/tm/java/test/vendor/omni/Json.java +287 -0
  161. package/project/.sdk/tm/java/test/vendor/omni/Runner.java +851 -0
  162. package/project/.sdk/tm/java/test/vendor/omni/Util.java +322 -0
  163. package/project/.sdk/tm/java/utility/MakeSpec.java +3 -1
  164. package/project/.sdk/tm/java/utility/PrepareMethod.java +5 -5
  165. package/project/.sdk/tm/java/utility/struct/Struct.java +17 -4
  166. package/project/.sdk/tm/js/src/utility/StructUtility.js +3 -3
  167. package/project/.sdk/tm/js/test/omni.js +251 -0
  168. package/project/.sdk/tm/js/test/omni.test.js +105 -0
  169. package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +6 -2
  170. package/project/.sdk/tm/js/test/utility/StructUtility.test.js +27 -2
  171. package/project/.sdk/tm/js/test/vendor/omni/index.js +77 -0
  172. package/project/.sdk/tm/js/test/vendor/omni/runner.js +628 -0
  173. package/project/.sdk/tm/js/test/vendor/omni/util.js +229 -0
  174. package/project/.sdk/tm/kotlin/core/Utility.kt +1 -1
  175. package/project/.sdk/tm/kotlin/test/OmniResolver.kt +343 -0
  176. package/project/.sdk/tm/kotlin/test/OmniSmokeTest.kt +100 -0
  177. package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +244 -262
  178. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +9 -178
  179. package/project/.sdk/tm/kotlin/test/StructCorpusTest.kt +121 -32
  180. package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +264 -0
  181. package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +615 -0
  182. package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +139 -0
  183. package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -3
  184. package/project/.sdk/tm/kotlin/utility/Prepare.kt +6 -6
  185. package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +18 -2
  186. package/project/.sdk/tm/lean/Makefile +12 -5
  187. package/project/.sdk/tm/lean/src/SdkUtility.lean +14 -1
  188. package/project/.sdk/tm/lean/test/OmniResolver.lean +358 -0
  189. package/project/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
  190. package/project/.sdk/tm/lean/test/StructCorpus.lean +245 -574
  191. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +155 -291
  192. package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
  193. package/project/.sdk/tm/lua/test/omni.lua +456 -0
  194. package/project/.sdk/tm/lua/test/omni_smoke_test.lua +103 -0
  195. package/project/.sdk/tm/lua/test/primary_utility_test.lua +250 -509
  196. package/project/.sdk/tm/lua/test/struct_utility_test.lua +161 -70
  197. package/project/.sdk/tm/lua/test/vendor/omni/json.lua +268 -0
  198. package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +385 -0
  199. package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +641 -0
  200. package/project/.sdk/tm/lua/test/vendor/omni/util.lua +282 -0
  201. package/project/.sdk/tm/lua/utility/prepare_method.lua +5 -1
  202. package/project/.sdk/tm/lua/utility/struct/regex.lua +663 -0
  203. package/project/.sdk/tm/lua/utility/struct/struct.lua +660 -420
  204. package/project/.sdk/tm/ocaml/Makefile +37 -12
  205. package/project/.sdk/tm/ocaml/test/omni_resolver.ml +284 -0
  206. package/project/.sdk/tm/ocaml/test/omni_smoke_test.ml +169 -0
  207. package/project/.sdk/tm/ocaml/test/primary_utility_test.ml +84 -100
  208. package/project/.sdk/tm/ocaml/test/struct_corpus.ml +225 -201
  209. package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1157 -0
  210. package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +88 -12
  211. package/project/.sdk/tm/perl/t/omni.pm +647 -0
  212. package/project/.sdk/tm/perl/t/omni_smoke.t +87 -0
  213. package/project/.sdk/tm/perl/t/primary_utility.t +189 -487
  214. package/project/.sdk/tm/perl/t/struct_utility.t +455 -389
  215. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +649 -0
  216. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +253 -0
  217. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +24 -0
  218. package/project/.sdk/tm/perl/utility/prepare_method.pm +7 -2
  219. package/project/.sdk/tm/php/test/Omni.php +691 -0
  220. package/project/.sdk/tm/php/test/OmniSmokeTest.php +93 -0
  221. package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +210 -571
  222. package/project/.sdk/tm/php/test/StructUtilityTest.php +320 -342
  223. package/project/.sdk/tm/php/test/vendor/omni/Runner.php +644 -0
  224. package/project/.sdk/tm/php/test/vendor/omni/Util.php +283 -0
  225. package/project/.sdk/tm/php/utility/MakeSpec.php +10 -3
  226. package/project/.sdk/tm/php/utility/PrepareBody.php +7 -1
  227. package/project/.sdk/tm/php/utility/PrepareMethod.php +6 -2
  228. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +36 -0
  229. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +141 -0
  230. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +50 -0
  231. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +333 -0
  232. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +198 -0
  233. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +147 -0
  234. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +52 -0
  235. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +139 -0
  236. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1053 -0
  237. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +171 -0
  238. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +95 -0
  239. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +116 -0
  240. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +59 -0
  241. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +87 -0
  242. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +112 -0
  243. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +76 -0
  244. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +116 -0
  245. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +192 -0
  246. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +120 -0
  247. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +140 -0
  248. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +62 -0
  249. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +101 -0
  250. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +151 -0
  251. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +115 -0
  252. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +90 -0
  253. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +101 -0
  254. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +119 -0
  255. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +125 -0
  256. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +211 -0
  257. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +475 -0
  258. package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +467 -0
  259. package/project/.sdk/tm/py/pkg/utility/prepare_method.py +5 -1
  260. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/__init__.py +0 -2
  261. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +780 -529
  262. package/project/.sdk/tm/py/src/feature/secrets/.gitkeep +0 -0
  263. package/project/.sdk/tm/py/test/feature/__init__.py +0 -0
  264. package/project/.sdk/tm/py/test/feature/secrets/__init__.py +0 -0
  265. package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +337 -0
  266. package/project/.sdk/tm/py/test/omni.py +415 -0
  267. package/project/.sdk/tm/py/test/test_omni_smoke.py +74 -0
  268. package/project/.sdk/tm/py/test/test_primary_utility.py +144 -668
  269. package/project/.sdk/tm/py/test/test_struct_utility.py +74 -27
  270. package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +62 -0
  271. package/project/.sdk/tm/py/test/voxgig_omni/runner.py +580 -0
  272. package/project/.sdk/tm/py/test/voxgig_omni/util.py +252 -0
  273. package/project/.sdk/tm/rb/test/omni.rb +505 -0
  274. package/project/.sdk/tm/rb/test/omni_smoke_test.rb +72 -0
  275. package/project/.sdk/tm/rb/test/primary_utility_test.rb +174 -560
  276. package/project/.sdk/tm/rb/test/struct_utility_test.rb +13 -7
  277. package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +493 -0
  278. package/project/.sdk/tm/rb/test/vendor/omni/util.rb +199 -0
  279. package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +15 -0
  280. package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -1
  281. package/project/.sdk/tm/rust/tests/common/mod.rs +19 -242
  282. package/project/.sdk/tm/rust/tests/omni_resolver/mod.rs +888 -0
  283. package/project/.sdk/tm/rust/tests/omni_smoke_test.rs +286 -0
  284. package/project/.sdk/tm/rust/tests/primary_utility_test.rs +318 -312
  285. package/project/.sdk/tm/rust/tests/struct_utility_test.rs +66 -28
  286. package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +412 -0
  287. package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +38 -0
  288. package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +392 -0
  289. package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1001 -0
  290. package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +161 -0
  291. package/project/.sdk/tm/rust/utility/prepare_method.rs +5 -1
  292. package/project/.sdk/tm/scala/Makefile +16 -6
  293. package/project/.sdk/tm/scala/sdktest/OmniResolver.scala +497 -0
  294. package/project/.sdk/tm/scala/sdktest/OmniSmoke.scala +192 -0
  295. package/project/.sdk/tm/scala/sdktest/PrimaryCorpus.scala +47 -19
  296. package/project/.sdk/tm/scala/sdktest/StructCorpus.scala +0 -0
  297. package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +229 -0
  298. package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +552 -0
  299. package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +104 -0
  300. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Constants.swift +10 -0
  301. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Inject.swift +28 -5
  302. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Injection.swift +5 -1
  303. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Minor.swift +4 -1
  304. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Validate.swift +15 -5
  305. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +6 -1
  306. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift +474 -0
  307. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniSmokeTest.swift +107 -0
  308. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +141 -178
  309. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/Runner.swift +17 -113
  310. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/StructUtilityTest.swift +295 -446
  311. package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +364 -0
  312. package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +730 -0
  313. package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +162 -0
  314. package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +7 -0
  315. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +148 -0
  316. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +55 -0
  317. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +344 -0
  318. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +205 -0
  319. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +138 -0
  320. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +46 -0
  321. package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +349 -0
  322. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +181 -0
  323. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1132 -0
  324. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +177 -0
  325. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +119 -0
  326. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +102 -0
  327. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +61 -0
  328. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +112 -0
  329. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +100 -0
  330. package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +37 -0
  331. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +163 -30
  332. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +27 -22
  333. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/aws.ts +26 -36
  334. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/azuresecrets.ts +19 -21
  335. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/boru.ts +36 -17
  336. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/doppler.ts +14 -21
  337. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/gcpsecrets.ts +27 -27
  338. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/hashicorp.ts +25 -39
  339. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +99 -0
  340. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/infisical.ts +14 -16
  341. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/onepassword.ts +15 -22
  342. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +98 -0
  343. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{Sigv4.ts → plugins/sigv4.ts} +7 -6
  344. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +97 -23
  345. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +37 -0
  346. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +4 -17
  347. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +4 -16
  348. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +11 -25
  349. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +6 -23
  350. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +106 -39
  351. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +3 -3
  352. package/project/.sdk/tm/ts/test/omni.ts +104 -32
  353. package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +27 -0
  354. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +32 -5
  355. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +2 -2
  356. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +2 -2
  357. package/project/.sdk/tm/zig/Makefile +15 -1
  358. package/project/.sdk/tm/zig/build.zig +23 -5
  359. package/project/.sdk/tm/zig/core/helpers.zig +52 -11
  360. package/project/.sdk/tm/zig/core/mem.zig +17 -1
  361. package/project/.sdk/tm/zig/core/utility.zig +23 -19
  362. package/project/.sdk/tm/zig/feature/audit.zig +2 -2
  363. package/project/.sdk/tm/zig/feature/cache.zig +2 -2
  364. package/project/.sdk/tm/zig/feature/debug.zig +5 -5
  365. package/project/.sdk/tm/zig/feature/netsim.zig +2 -2
  366. package/project/.sdk/tm/zig/feature/paging.zig +2 -2
  367. package/project/.sdk/tm/zig/feature/proxy.zig +15 -8
  368. package/project/.sdk/tm/zig/feature/streaming.zig +5 -5
  369. package/project/.sdk/tm/zig/feature/support.zig +3 -3
  370. package/project/.sdk/tm/zig/feature/telemetry.zig +5 -5
  371. package/project/.sdk/tm/zig/feature/test.zig +10 -5
  372. package/project/.sdk/tm/zig/test/fh.zig +10 -10
  373. package/project/.sdk/tm/zig/test/gotcha_test.zig +5 -5
  374. package/project/.sdk/tm/zig/test/omniresolver.zig +515 -0
  375. package/project/.sdk/tm/zig/test/omnismoke_test.zig +284 -0
  376. package/project/.sdk/tm/zig/test/pipeline_test.zig +8 -8
  377. package/project/.sdk/tm/zig/test/primary_utility_test.zig +145 -155
  378. package/project/.sdk/tm/zig/test/struct_corpus.zig +264 -187
  379. package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +1314 -0
  380. package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +446 -0
  381. package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +7 -4
  382. package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +356 -157
  383. package/project/sdkgen-package.json +1 -1
  384. package/src/action/doctor.ts +66 -2
  385. package/src/helpers/naming.ts +4 -2
  386. package/project/.sdk/tm/c/tests/runner.h +0 -274
  387. package/project/.sdk/tm/cpp/test/struct_runner.hpp +0 -314
  388. package/project/.sdk/tm/csharp/test/StructRunner.cs +0 -276
  389. package/project/.sdk/tm/dart/test/runner.dart +0 -406
  390. package/project/.sdk/tm/dart/test/struct_corpus.dart +0 -531
  391. package/project/.sdk/tm/elixir/test/support/struct_corpus.ex +0 -1088
  392. package/project/.sdk/tm/go/test/runner_test.go +0 -629
  393. package/project/.sdk/tm/go/test/struct_runner_test.go +0 -1094
  394. package/project/.sdk/tm/java/test/StructRunner.java +0 -281
  395. package/project/.sdk/tm/js/test/runner.js +0 -387
  396. package/project/.sdk/tm/kotlin/test/StructRunner.kt +0 -177
  397. package/project/.sdk/tm/lua/test/struct_runner.lua +0 -602
  398. package/project/.sdk/tm/ocaml/test/corpus_runner.ml +0 -185
  399. package/project/.sdk/tm/perl/t/struct_runner.pm +0 -275
  400. package/project/.sdk/tm/php/test/StructRunner.php +0 -275
  401. package/project/.sdk/tm/py/test/struct_runner.py +0 -411
  402. package/project/.sdk/tm/rb/test/struct_runner.rb +0 -309
  403. package/project/.sdk/tm/rust/tests/struct_runner/mod.rs +0 -424
  404. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +0 -90
  405. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +0 -66
  406. package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +0 -188
  407. package/project/.sdk/tm/zig/test/struct_runner.zig +0 -464
@@ -0,0 +1,652 @@
1
+ // VENDORED: @voxgig/plugin 0.1.6 (go/plugin/config.go)
2
+ // Source: https://github.com/voxgig/plugin @ b48ae643eb0eb56c5ebe3198da98cecdf6a7f7fc [tag: sdk-20260907-0029-0]
3
+ // License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ /* The declarative document (§9): normalization, and the ten-level
5
+ * precedence ladder.
6
+ *
7
+ * TWO FUNCTIONS, AND THE SPLIT BETWEEN THEM IS FORCED.
8
+ *
9
+ * NormalizeConfig normalizes STRUCTURE and ENTRY KEYS. It does not
10
+ * merge options, and cannot: §9.4 makes merge behaviour a property of
11
+ * the definition's option SHAPE, which normalization has never seen. A
12
+ * normalizer that flattened the option layers would make
13
+ * `$MERGE: append` unimplementable at load time, because the layers it
14
+ * must concatenate would already be collapsed.
15
+ *
16
+ * ResolveOptions applies the ladder, and it is the only place that
17
+ * knows the shape. */
18
+
19
+ package plugin
20
+
21
+ import "sort"
22
+
23
+ // ---------------------------------------------------------------------
24
+ // NormalizeConfig
25
+ // ---------------------------------------------------------------------
26
+
27
+ type Keys struct {
28
+ Instance string `json:"instance,omitempty"`
29
+ Default string `json:"default,omitempty"`
30
+ }
31
+
32
+ type NormalizeInput struct {
33
+ Doc any `json:"doc"`
34
+ Profile string `json:"profile,omitempty"`
35
+ // Keys is §9.1: a host may rename `instance` and `default` into its
36
+ // own vocabulary.
37
+ Keys Keys `json:"keys,omitempty"`
38
+ // Reserved is §9.1: refs the host declares itself and always wins on.
39
+ Reserved []string `json:"reserved,omitempty"`
40
+ }
41
+
42
+ func NormalizeConfig(input NormalizeInput) (Normalized, error) {
43
+ doc := asmap(input.Doc)
44
+ ikey := or(input.Keys.Instance, "instance")
45
+ dkey := or(input.Keys.Default, "default")
46
+ reserved := input.Reserved
47
+
48
+ // The rename is applied at TWO PLACES AND NO OTHERS: the document
49
+ // root, and every profile.<name> overlay root (§9.1). A rename
50
+ // applied only at the root would leave `profile.prod.sdk`
51
+ // untranslated and silently drop every environment override the host
52
+ // depends on. Recursing further would be worse: option data is the
53
+ // definition's.
54
+ baseinst := doc[ikey]
55
+ basedef := asmap(doc[dkey])
56
+
57
+ var overlay map[string]any
58
+ if "" != input.Profile {
59
+ overlay = asmap(asmap(doc["profile"])[input.Profile])
60
+ }
61
+ overinst := overlay[ikey]
62
+ overdef := asmap(overlay[dkey])
63
+
64
+ // Entry layers, base then overlay, each as {ref -> entry} plus the
65
+ // order the form implies.
66
+ base, err := entries(baseinst)
67
+ if nil != err {
68
+ return Normalized{}, err
69
+ }
70
+ over, err := entries(overinst)
71
+ if nil != err {
72
+ return Normalized{}, err
73
+ }
74
+
75
+ for _, group := range [][]string{
76
+ sortedkeys(base.emap), sortedkeys(over.emap),
77
+ sortedkeys(basedef), sortedkeys(overdef),
78
+ } {
79
+ for _, r := range group {
80
+ if err := checkreservedref(r, reserved); nil != err {
81
+ return Normalized{}, err
82
+ }
83
+ }
84
+ }
85
+
86
+ // A PARTIAL ARRAY IS NOT A FILTER (§9.1). sdkgen learned this the
87
+ // hard way: deriving order from a partial array silently dropped
88
+ // config-activated features. Refs in the base but absent from the
89
+ // overlay still load, in sorted position AFTER the listed ones. A
90
+ // profile may also INTRODUCE a ref the base never declared.
91
+ order := []string{}
92
+ for _, r := range over.order {
93
+ if !hasstring(order, r) {
94
+ order = append(order, r)
95
+ }
96
+ }
97
+ // The remainder keeps the BASE's own order — array position for the
98
+ // array form, sorted refs for the map form. Re-sorting here would
99
+ // discard an array document's positional order entirely, which is
100
+ // the one thing the array form exists to express.
101
+ for _, r := range base.order {
102
+ if !hasstring(order, r) {
103
+ order = append(order, r)
104
+ }
105
+ }
106
+
107
+ instance := map[string]*Instance{}
108
+ for i, ref := range order {
109
+ b := base.emap[ref]
110
+ o := over.emap[ref]
111
+
112
+ // MERGE THE ENTRIES AS AUTHORED, THEN APPLY DEFAULTS TO THE
113
+ // RESULT (§9.3). A safety rule, not a tidiness one: if the
114
+ // overlay had its defaults filled in before merging it would
115
+ // carry a synthesized active:true and overwrite a base's false —
116
+ // silently re-enabling a deliberately disabled integration in
117
+ // production.
118
+ active := asbool(pick(o, "active", pick(b, "active", true)), true)
119
+ start := asstring(pick(o, "start", pick(b, "start", "eager")), "eager")
120
+ ord := pick(o, "order", pick(b, "order", nil))
121
+
122
+ // Option layers, levels 3-6, IN LADDER ORDER. Never merged here.
123
+ layers := []any{}
124
+ nm := refname(ref)
125
+ if v, ok := asmap(basedef[nm])["options"]; ok {
126
+ layers = append(layers, v)
127
+ }
128
+ if v, ok := asmap(b)["options"]; ok {
129
+ layers = append(layers, v)
130
+ }
131
+ if v, ok := asmap(overdef[nm])["options"]; ok {
132
+ layers = append(layers, v)
133
+ }
134
+ if v, ok := asmap(o)["options"]; ok {
135
+ layers = append(layers, v)
136
+ }
137
+
138
+ ent := &Instance{Pos: i, Active: active, Start: start, OptionLayers: layers}
139
+ if nil != ord {
140
+ ent.Order = orderblock(ord)
141
+ }
142
+ instance[ref] = ent
143
+ }
144
+
145
+ // `default` DECLARES NOTHING (§9.3). It is a base for every instance
146
+ // of that definition; it does not create one, and an entry for a
147
+ // name with no instances is inert rather than an error — which is
148
+ // what makes a shared library of defaults shippable.
149
+ defout := map[string]any{}
150
+ for _, n := range sortedkeys(basedef) {
151
+ defout[n] = basedef[n]
152
+ }
153
+ for _, n := range sortedkeys(overdef) {
154
+ defout[n] = overdef[n]
155
+ }
156
+
157
+ return Normalized{Instance: instance, Order: order, Default: defout}, nil
158
+ }
159
+
160
+ type entryset struct {
161
+ emap map[string]any
162
+ order []string
163
+ }
164
+
165
+ // entries reduces both document forms to {ref -> entry} plus the order
166
+ // the form implies: array POSITION for the array form, sorted refs for
167
+ // the map form.
168
+ func entries(src any) (entryset, error) {
169
+ out := entryset{emap: map[string]any{}, order: []string{}}
170
+ if nil == src {
171
+ return out, nil
172
+ }
173
+
174
+ if list, ok := aslist(src); ok {
175
+ for _, item := range list {
176
+ raw, _ := asmap(item)["ref"]
177
+ s, _ := raw.(string)
178
+ ref, err := CanonRef(s)
179
+ if nil != err {
180
+ return out, err
181
+ }
182
+ out.emap[ref] = item
183
+ out.order = append(out.order, ref)
184
+ }
185
+ return out, nil
186
+ }
187
+
188
+ // Map-form refs arrive as KEYS, through a different path than an
189
+ // array element's `ref` field — and must canonicalize the same way.
190
+ m := asmap(src)
191
+ for _, key := range sortedkeys(m) {
192
+ ref, err := CanonRef(key)
193
+ if nil != err {
194
+ return out, err
195
+ }
196
+ out.emap[ref] = m[key]
197
+ }
198
+ // Byte-wise, NOT locale-aware and NOT case-folded. All-lowercase
199
+ // refs sort identically under all three, so only mixed input
200
+ // discriminates: '@' is 0x40, uppercase 0x41-0x5A, lowercase
201
+ // 0x61-0x7A. Go's sort.Strings is exactly bytewise.
202
+ out.order = sortedkeys(out.emap)
203
+ sort.Strings(out.order)
204
+ return out, nil
205
+ }
206
+
207
+ // checkreservedref is §9.1: reservation is all-or-nothing per NAME, so
208
+ // the tagged forms go too. A configuration surface that can disable the
209
+ // thing reading it is not a surface, it is a trap.
210
+ func checkreservedref(ref string, reserved []string) error {
211
+ if 0 == len(reserved) {
212
+ return nil
213
+ }
214
+ if hasstring(reserved, refname(ref)) {
215
+ return Fail("plugin_ref_reserved", "ref is reserved by the host: "+ref,
216
+ map[string]any{"ref": ref})
217
+ }
218
+ return nil
219
+ }
220
+
221
+ // ---------------------------------------------------------------------
222
+ // ResolveOptions — §9.3's ten levels, and §9.4's merge directives
223
+ // ---------------------------------------------------------------------
224
+
225
+ type ResolveInput struct {
226
+ Ref string `json:"ref"`
227
+ // Shape is level 1 — the definition's option shape. Also carries the
228
+ // $MERGE directives, which is why merging cannot happen without it.
229
+ Shape any `json:"shape,omitempty"`
230
+ HostDefaults any `json:"hostdefaults,omitempty"` // 2
231
+ Doc any `json:"doc,omitempty"` // 3-6
232
+ Profile string `json:"profile,omitempty"`
233
+ Env any `json:"env,omitempty"` // 7
234
+ HostOptions any `json:"hostoptions,omitempty"` // 8
235
+ LoadOptions any `json:"loadoptions,omitempty"` // 9
236
+ Patch any `json:"patch,omitempty"` // 10
237
+ }
238
+
239
+ func ResolveOptions(input ResolveInput) (map[string]any, error) {
240
+ shape := asmap(input.Shape)
241
+ if err := CheckShape(shape); nil != err {
242
+ return nil, err
243
+ }
244
+
245
+ ref, err := CanonRef(input.Ref)
246
+ if nil != err {
247
+ return nil, err
248
+ }
249
+ name := refname(ref)
250
+ doc := asmap(input.Doc)
251
+
252
+ var overlay map[string]any
253
+ if "" != input.Profile {
254
+ overlay = asmap(asmap(doc["profile"])[input.Profile])
255
+ }
256
+
257
+ // ONE ordered merge, lowest to highest. Levels 3-6 are not two
258
+ // namespaces collapsed separately and composed afterwards: that
259
+ // inverts the rule that PROFILE SPECIFICITY OUTRANKS DEFINITION
260
+ // SPECIFICITY, so a prod per-definition default would lose to a base
261
+ // instance value.
262
+ lo3, err := optsof(doc["default"], name)
263
+ if nil != err {
264
+ return nil, err
265
+ }
266
+ lo4, err := optsof(doc["instance"], ref)
267
+ if nil != err {
268
+ return nil, err
269
+ }
270
+ lo5, err := optsof(overlay["default"], name)
271
+ if nil != err {
272
+ return nil, err
273
+ }
274
+ lo6, err := optsof(overlay["instance"], ref)
275
+ if nil != err {
276
+ return nil, err
277
+ }
278
+
279
+ layers := []any{
280
+ defaultsof(shape), // 1
281
+ input.HostDefaults, // 2
282
+ lo3, lo4, lo5, lo6, // 3-6
283
+ input.Env, // 7
284
+ input.HostOptions, // 8
285
+ input.LoadOptions, // 9
286
+ input.Patch, // 10
287
+ }
288
+
289
+ var out any = map[string]any{}
290
+ for _, layer := range layers {
291
+ if nil == layer {
292
+ continue
293
+ }
294
+ out = mergeone(out, layer, shape)
295
+ }
296
+ return asmap(out), nil
297
+ }
298
+
299
+ // defaultsof: the shape's non-directive values are the level-1 defaults.
300
+ func defaultsof(shape map[string]any) map[string]any {
301
+ out := map[string]any{}
302
+ for _, k := range sortedkeys(shape) {
303
+ v := shape[k]
304
+ if m, ok := v.(map[string]any); ok {
305
+ if _, has := m["$MERGE"]; has {
306
+ continue
307
+ }
308
+ }
309
+ out[k] = v
310
+ }
311
+ return out
312
+ }
313
+
314
+ func optsof(src any, key string) (any, error) {
315
+ if nil == src {
316
+ return nil, nil
317
+ }
318
+ // The array form is equivalent to the map form (§9.1).
319
+ if list, ok := aslist(src); ok {
320
+ for _, item := range list {
321
+ raw, _ := asmap(item)["ref"]
322
+ s, _ := raw.(string)
323
+ c, err := CanonRef(s)
324
+ if nil != err {
325
+ return nil, err
326
+ }
327
+ if c == key {
328
+ v, has := asmap(item)["options"]
329
+ if !has {
330
+ return nil, nil
331
+ }
332
+ return v, nil
333
+ }
334
+ }
335
+ return nil, nil
336
+ }
337
+ m := asmap(src)
338
+ for _, k := range sortedkeys(m) {
339
+ c, err := CanonRef(k)
340
+ if nil != err {
341
+ return nil, err
342
+ }
343
+ if c == key {
344
+ v, has := asmap(m[k])["options"]
345
+ if !has {
346
+ return nil, nil
347
+ }
348
+ return v, nil
349
+ }
350
+ }
351
+ return nil, nil
352
+ }
353
+
354
+ // mergeone merges ONE layer onto the accumulator, honouring the shape's
355
+ // directives. The directive holds at EVERY precedence level, not only
356
+ // between document levels — §9.4 makes it a property of the shape, which
357
+ // does not know which layer a value arrived from.
358
+ func mergeone(base any, over any, shape map[string]any) any {
359
+ if nil == over {
360
+ return base
361
+ }
362
+ if !ismap(base) || !ismap(over) {
363
+ return clonevalue(over)
364
+ }
365
+
366
+ bm := asmap(base)
367
+ om := asmap(over)
368
+ out := map[string]any{}
369
+ for k, v := range bm {
370
+ out[k] = v
371
+ }
372
+
373
+ for _, k := range sortedkeys(om) {
374
+ var directive any
375
+ if nil != shape {
376
+ directive = asmap(shape[k])["$MERGE"]
377
+ }
378
+ b := out[k]
379
+ o := om[k]
380
+
381
+ if "replace" == directive {
382
+ out[k] = clonevalue(o)
383
+ } else if "append" == directive {
384
+ bl, ok := aslist(b)
385
+ if !ok {
386
+ bl = []any{}
387
+ }
388
+ ol, ok := aslist(o)
389
+ if !ok {
390
+ ol = []any{o}
391
+ }
392
+ joined := make([]any, 0, len(bl)+len(ol))
393
+ joined = append(joined, bl...)
394
+ joined = append(joined, ol...)
395
+ out[k] = joined
396
+ } else if n, deep := deepof(directive); deep {
397
+ out[k] = deepto(b, o, n)
398
+ } else {
399
+ // Library default: deep for maps, REPLACE for lists.
400
+ // struct.merge is element-wise by index, which for option
401
+ // maps is nearly always wrong — ["a"] over ["x","y","z"]
402
+ // yielding ["a","y","z"] is the defect station hit on
403
+ // secrets.providers.
404
+ if ismap(b) && ismap(o) {
405
+ out[k] = mergeone(b, o, nil)
406
+ } else {
407
+ out[k] = clonevalue(o)
408
+ }
409
+ }
410
+ }
411
+ return out
412
+ }
413
+
414
+ // deepto merges N levels below this key, replacing below that.
415
+ func deepto(base any, over any, n int) any {
416
+ if 0 >= n {
417
+ return clonevalue(over)
418
+ }
419
+ if !ismap(base) || !ismap(over) {
420
+ return clonevalue(over)
421
+ }
422
+ bm, om := asmap(base), asmap(over)
423
+ out := map[string]any{}
424
+ for k, v := range bm {
425
+ out[k] = v
426
+ }
427
+ for _, k := range sortedkeys(om) {
428
+ out[k] = deepto(out[k], om[k], n-1)
429
+ }
430
+ return out
431
+ }
432
+
433
+ // §9.4: N is an integer of at least 1, and everything else is an error.
434
+ //
435
+ // `{"deep": 0}` is rejected DESPITE having an obvious reading, because
436
+ // "replace at this key" already has a spelling and two spellings for one
437
+ // behaviour is the defect class this repo exists to avoid. Without the
438
+ // stated domain each port picks its own reading — reject, replace,
439
+ // unlimited merge, or clamp to 1 — and the same document resolves
440
+ // differently per language.
441
+ var mergeWords = []string{"replace", "append"}
442
+
443
+ func CheckShape(shape any) error {
444
+ m, ok := shape.(map[string]any)
445
+ if !ok {
446
+ return nil
447
+ }
448
+ for _, k := range sortedkeys(m) {
449
+ v, ok := m[k].(map[string]any)
450
+ if !ok {
451
+ continue
452
+ }
453
+ d, has := v["$MERGE"]
454
+ if !has {
455
+ continue
456
+ }
457
+
458
+ if s, ok := d.(string); ok {
459
+ if !hasstring(mergeWords, s) {
460
+ return Fail("plugin_shape_invalid",
461
+ "invalid $MERGE directive at "+k+": "+s,
462
+ map[string]any{"key": k, "directive": d})
463
+ }
464
+ continue
465
+ }
466
+ if dm, ok := d.(map[string]any); ok {
467
+ if n, has := dm["deep"]; has {
468
+ if !isposint(n) {
469
+ return Fail("plugin_shape_invalid",
470
+ "invalid $MERGE deep at "+k+": "+compactjson(n),
471
+ map[string]any{"key": k, "directive": d})
472
+ }
473
+ continue
474
+ }
475
+ }
476
+ return Fail("plugin_shape_invalid",
477
+ "invalid $MERGE directive at "+k+": "+compactjson(d),
478
+ map[string]any{"key": k, "directive": d})
479
+ }
480
+ return nil
481
+ }
482
+
483
+ // deepof reads `{"deep": N}` off a directive, after CheckShape has
484
+ // already established the domain.
485
+ func deepof(directive any) (int, bool) {
486
+ dm, ok := directive.(map[string]any)
487
+ if !ok {
488
+ return 0, false
489
+ }
490
+ n, has := dm["deep"]
491
+ if !has {
492
+ return 0, false
493
+ }
494
+ f, ok := tonumber(n)
495
+ if !ok {
496
+ return 0, false
497
+ }
498
+ return int(f), true
499
+ }
500
+
501
+ // ---------------------------------------------------------------------
502
+ // The JSON-value readers. The canonical gets these from JavaScript's
503
+ // coercion rules; a typed port needs them written down, which is a
504
+ // large part of why go is P4's first port.
505
+ // ---------------------------------------------------------------------
506
+
507
+ func asmap(v any) map[string]any {
508
+ if m, ok := v.(map[string]any); ok {
509
+ return m
510
+ }
511
+ return map[string]any{}
512
+ }
513
+
514
+ // pick is the canonical's `pick(src, key, dflt)`: PRESENCE decides, not
515
+ // truthiness and not nil. A JSON `null` is a present value in
516
+ // JavaScript (`undefined !== null`), so it must be one here.
517
+ func pick(src any, key string, dflt any) any {
518
+ m, ok := src.(map[string]any)
519
+ if !ok {
520
+ return dflt
521
+ }
522
+ if v, has := m[key]; has {
523
+ return v
524
+ }
525
+ return dflt
526
+ }
527
+
528
+ func asbool(v any, dflt bool) bool {
529
+ if b, ok := v.(bool); ok {
530
+ return b
531
+ }
532
+ return dflt
533
+ }
534
+
535
+ func asstring(v any, dflt string) string {
536
+ if s, ok := v.(string); ok {
537
+ return s
538
+ }
539
+ return dflt
540
+ }
541
+
542
+ func or(v string, dflt string) string {
543
+ if "" == v {
544
+ return dflt
545
+ }
546
+ return v
547
+ }
548
+
549
+ // tonumber accepts every numeric shape a decoded document can carry:
550
+ // encoding/json gives float64, a hand-built map may carry int.
551
+ func tonumber(v any) (float64, bool) {
552
+ switch n := v.(type) {
553
+ case float64:
554
+ return n, true
555
+ case float32:
556
+ return float64(n), true
557
+ case int:
558
+ return float64(n), true
559
+ case int64:
560
+ return float64(n), true
561
+ }
562
+ return 0, false
563
+ }
564
+
565
+ func isposint(v any) bool {
566
+ f, ok := tonumber(v)
567
+ if !ok {
568
+ return false
569
+ }
570
+ return f == float64(int(f)) && 1 <= f
571
+ }
572
+
573
+ // asorderref reads ONE spelling or a LIST of them into an OrderRef, and
574
+ // KEEPS THE AUTHORED VALUE so normalization can hand it back untouched.
575
+ //
576
+ // It used to be a bare asstring(), so a list decoded to "" and the
577
+ // constraint was SILENTLY DROPPED - the sort ran as if nothing had been
578
+ // declared.
579
+ //
580
+ // `stated` is separate from the value because an ABSENT key and a key
581
+ // authored as `null` are different documents, and a map index alone
582
+ // cannot tell them apart.
583
+ //
584
+ // The other four ports have no type like this at all: they carry the
585
+ // authored block straight through (`ent.order = ord`), so every spelling
586
+ // survives normalization by construction. Go is the only port that
587
+ // decodes and rebuilds, and a rebuild loses whatever it does not model -
588
+ // first the list form, then scalar-vs-one-element-list, then an authored
589
+ // empty list, then an authored null. One cause, four parity breaks, none
590
+ // of which the corpus could see until `config/normorder` was written.
591
+ // Keeping the authored value ends the class rather than the instance.
592
+ func asorderref(v any, stated bool) OrderRef {
593
+ if !stated {
594
+ return OrderRef{}
595
+ }
596
+
597
+ out := OrderRef{raw: v, set: true, list: []string{}}
598
+
599
+ // Slices are COPIED into `raw`. A caller that keeps its own handle on
600
+ // the slice it passed in must not be able to change what this ref
601
+ // marshals afterwards, while the parsed form stays as it was.
602
+ switch list := v.(type) {
603
+ case string:
604
+ if "" != list {
605
+ out.list = append(out.list, list)
606
+ }
607
+ case []string:
608
+ out.raw = append([]string{}, list...)
609
+ for _, one := range list {
610
+ if "" != one {
611
+ out.list = append(out.list, one)
612
+ }
613
+ }
614
+ case []any:
615
+ out.raw = append([]any{}, list...)
616
+ for _, item := range list {
617
+ if one, ok := item.(string); ok && "" != one {
618
+ out.list = append(out.list, one)
619
+ }
620
+ }
621
+ }
622
+
623
+ // Anything else - a number, a map, a null - names no binding, so it
624
+ // constrains nothing. It was still STATED, and goes back verbatim.
625
+
626
+ return out
627
+ }
628
+
629
+ // orderblock decodes an `order` entry off a document. The canonical
630
+ // stores the raw value and reads `.before`, `.after`, `.band` off it
631
+ // wherever it lands; a typed port decodes once, here.
632
+ func orderblock(v any) *OrderBlock {
633
+ m, ok := v.(map[string]any)
634
+ if !ok {
635
+ return nil
636
+ }
637
+
638
+ out := &OrderBlock{}
639
+
640
+ before, statedbefore := m["before"]
641
+ after, statedafter := m["after"]
642
+
643
+ out.Before = asorderref(before, statedbefore)
644
+ out.After = asorderref(after, statedafter)
645
+
646
+ if f, ok := tonumber(m["band"]); ok {
647
+ n := int(f)
648
+ out.Band = &n
649
+ }
650
+
651
+ return out
652
+ }