@voxgig/sdkgen 1.3.14 → 1.3.17

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 (398) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/action/action.js.map +1 -1
  3. package/dist/action/feature.js.map +1 -1
  4. package/dist/action/target.js.map +1 -1
  5. package/dist/cmp/AgentGuide.js.map +1 -1
  6. package/dist/cmp/AgentGuideContent.js.map +1 -1
  7. package/dist/cmp/AgentGuideFeature.js.map +1 -1
  8. package/dist/cmp/AgentGuideTop.js.map +1 -1
  9. package/dist/cmp/Changelog.js.map +1 -1
  10. package/dist/cmp/Deploy.js.map +1 -1
  11. package/dist/cmp/Entity.js.map +1 -1
  12. package/dist/cmp/Feature.js.map +1 -1
  13. package/dist/cmp/FeatureHook.js.map +1 -1
  14. package/dist/cmp/License.js.map +1 -1
  15. package/dist/cmp/Main.js.map +1 -1
  16. package/dist/cmp/Readme.js.map +1 -1
  17. package/dist/cmp/ReadmeEntity.js.map +1 -1
  18. package/dist/cmp/ReadmeErrors.js +1 -1
  19. package/dist/cmp/ReadmeErrors.js.map +1 -1
  20. package/dist/cmp/ReadmeExplanation.js +2 -2
  21. package/dist/cmp/ReadmeExplanation.js.map +1 -1
  22. package/dist/cmp/ReadmeHowto.js.map +1 -1
  23. package/dist/cmp/ReadmeInstall.js.map +1 -1
  24. package/dist/cmp/ReadmeIntro.js.map +1 -1
  25. package/dist/cmp/ReadmeModel.js.map +1 -1
  26. package/dist/cmp/ReadmeOptions.js.map +1 -1
  27. package/dist/cmp/ReadmeQuick.js.map +1 -1
  28. package/dist/cmp/ReadmeRef.js.map +1 -1
  29. package/dist/cmp/ReadmeTop.js +1 -1
  30. package/dist/cmp/ReadmeTop.js.map +1 -1
  31. package/dist/cmp/Security.js.map +1 -1
  32. package/dist/cmp/Test.js.map +1 -1
  33. package/dist/helpers/buildIdNames.js.map +1 -1
  34. package/dist/helpers/canonType.d.ts +3 -2
  35. package/dist/helpers/canonType.js +107 -24
  36. package/dist/helpers/canonType.js.map +1 -1
  37. package/dist/helpers/collectDeps.js.map +1 -1
  38. package/dist/helpers/getMatchEntries.js.map +1 -1
  39. package/dist/helpers/naming.d.ts +5 -1
  40. package/dist/helpers/naming.js +37 -0
  41. package/dist/helpers/naming.js.map +1 -1
  42. package/dist/helpers/opExample.d.ts +1 -1
  43. package/dist/helpers/opExample.js +37 -20
  44. package/dist/helpers/opExample.js.map +1 -1
  45. package/dist/helpers/opShape.d.ts +3 -1
  46. package/dist/helpers/opShape.js +91 -3
  47. package/dist/helpers/opShape.js.map +1 -1
  48. package/dist/helpers/packageMeta.js.map +1 -1
  49. package/dist/sdkgen.d.ts +3 -3
  50. package/dist/sdkgen.js +7 -1
  51. package/dist/sdkgen.js.map +1 -1
  52. package/dist/tsconfig.tsbuildinfo +1 -1
  53. package/dist/types.js.map +1 -1
  54. package/dist/utility.js.map +1 -1
  55. package/package.json +7 -6
  56. package/project/.sdk/model/target/haskell.aontu +6 -3
  57. package/project/.sdk/model/target/zig.aontu +12 -2
  58. package/project/.sdk/src/cmp/c/Config_c.ts +16 -4
  59. package/project/.sdk/src/cmp/c/EntityTypes_c.ts +168 -0
  60. package/project/.sdk/src/cmp/c/Main_c.ts +4 -0
  61. package/project/.sdk/src/cmp/c/ReadmeEntity_c.ts +192 -0
  62. package/project/.sdk/src/cmp/c/ReadmeExamplesTest_c.ts +152 -0
  63. package/project/.sdk/src/cmp/c/ReadmeExplanation_c.ts +55 -0
  64. package/project/.sdk/src/cmp/c/ReadmeHowto_c.ts +168 -0
  65. package/project/.sdk/src/cmp/c/ReadmeInstall_c.ts +52 -0
  66. package/project/.sdk/src/cmp/c/ReadmeIntro_c.ts +67 -0
  67. package/project/.sdk/src/cmp/c/ReadmeModel_c.ts +151 -0
  68. package/project/.sdk/src/cmp/c/ReadmeOptions_c.ts +65 -0
  69. package/project/.sdk/src/cmp/c/ReadmeQuick_c.ts +225 -0
  70. package/project/.sdk/src/cmp/c/ReadmeRef_c.ts +398 -0
  71. package/project/.sdk/src/cmp/c/ReadmeTopHowto_c.ts +24 -0
  72. package/project/.sdk/src/cmp/c/ReadmeTopQuick_c.ts +104 -0
  73. package/project/.sdk/src/cmp/c/ReadmeTopTest_c.ts +86 -0
  74. package/project/.sdk/src/cmp/c/TestEntity_c.ts +10 -0
  75. package/project/.sdk/src/cmp/c/Test_c.ts +4 -0
  76. package/project/.sdk/src/cmp/c/utility_c.ts +8 -2
  77. package/project/.sdk/src/cmp/clojure/ReadmeEntity_clojure.ts +182 -0
  78. package/project/.sdk/src/cmp/clojure/ReadmeExamplesTest_clojure.ts +54 -0
  79. package/project/.sdk/src/cmp/clojure/ReadmeExplanation_clojure.ts +44 -0
  80. package/project/.sdk/src/cmp/clojure/ReadmeHowto_clojure.ts +144 -0
  81. package/project/.sdk/src/cmp/clojure/ReadmeInstall_clojure.ts +51 -0
  82. package/project/.sdk/src/cmp/clojure/ReadmeIntro_clojure.ts +66 -0
  83. package/project/.sdk/src/cmp/clojure/ReadmeModel_clojure.ts +156 -0
  84. package/project/.sdk/src/cmp/clojure/ReadmeOptions_clojure.ts +61 -0
  85. package/project/.sdk/src/cmp/clojure/ReadmeQuick_clojure.ts +210 -0
  86. package/project/.sdk/src/cmp/clojure/ReadmeRef_clojure.ts +409 -0
  87. package/project/.sdk/src/cmp/clojure/ReadmeTopHowto_clojure.ts +24 -0
  88. package/project/.sdk/src/cmp/clojure/ReadmeTopQuick_clojure.ts +98 -0
  89. package/project/.sdk/src/cmp/clojure/ReadmeTopTest_clojure.ts +78 -0
  90. package/project/.sdk/src/cmp/clojure/TestDirect_clojure.ts +58 -0
  91. package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +79 -0
  92. package/project/.sdk/src/cmp/clojure/Test_clojure.ts +21 -65
  93. package/project/.sdk/src/cmp/cpp/EntityTypes_cpp.ts +174 -0
  94. package/project/.sdk/src/cmp/cpp/Main_cpp.ts +5 -0
  95. package/project/.sdk/src/cmp/cpp/ReadmeEntity_cpp.ts +170 -0
  96. package/project/.sdk/src/cmp/cpp/ReadmeExplanation_cpp.ts +45 -0
  97. package/project/.sdk/src/cmp/cpp/ReadmeHowto_cpp.ts +139 -0
  98. package/project/.sdk/src/cmp/cpp/ReadmeInstall_cpp.ts +42 -0
  99. package/project/.sdk/src/cmp/cpp/ReadmeIntro_cpp.ts +69 -0
  100. package/project/.sdk/src/cmp/cpp/ReadmeModel_cpp.ts +155 -0
  101. package/project/.sdk/src/cmp/cpp/ReadmeOptions_cpp.ts +62 -0
  102. package/project/.sdk/src/cmp/cpp/ReadmeQuick_cpp.ts +234 -0
  103. package/project/.sdk/src/cmp/cpp/ReadmeRef_cpp.ts +387 -0
  104. package/project/.sdk/src/cmp/cpp/ReadmeTopHowto_cpp.ts +24 -0
  105. package/project/.sdk/src/cmp/cpp/ReadmeTopQuick_cpp.ts +95 -0
  106. package/project/.sdk/src/cmp/cpp/ReadmeTopTest_cpp.ts +70 -0
  107. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +5 -1
  108. package/project/.sdk/src/cmp/csharp/EntityTypes_csharp.ts +196 -0
  109. package/project/.sdk/src/cmp/csharp/Main_csharp.ts +6 -0
  110. package/project/.sdk/src/cmp/csharp/ReadmeEntity_csharp.ts +174 -0
  111. package/project/.sdk/src/cmp/csharp/ReadmeExamplesTest_csharp.ts +198 -0
  112. package/project/.sdk/src/cmp/csharp/ReadmeExplanation_csharp.ts +42 -0
  113. package/project/.sdk/src/cmp/csharp/ReadmeHowto_csharp.ts +168 -0
  114. package/project/.sdk/src/cmp/csharp/ReadmeInstall_csharp.ts +41 -0
  115. package/project/.sdk/src/cmp/csharp/ReadmeIntro_csharp.ts +65 -0
  116. package/project/.sdk/src/cmp/csharp/ReadmeModel_csharp.ts +148 -0
  117. package/project/.sdk/src/cmp/csharp/ReadmeOptions_csharp.ts +60 -0
  118. package/project/.sdk/src/cmp/csharp/ReadmeQuick_csharp.ts +219 -0
  119. package/project/.sdk/src/cmp/csharp/ReadmeRef_csharp.ts +390 -0
  120. package/project/.sdk/src/cmp/csharp/ReadmeTopHowto_csharp.ts +25 -0
  121. package/project/.sdk/src/cmp/csharp/ReadmeTopQuick_csharp.ts +92 -0
  122. package/project/.sdk/src/cmp/csharp/ReadmeTopTest_csharp.ts +77 -0
  123. package/project/.sdk/src/cmp/csharp/Test_csharp.ts +4 -0
  124. package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +43 -29
  125. package/project/.sdk/src/cmp/dart/Entity_dart.ts +8 -0
  126. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +166 -0
  127. package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +238 -0
  128. package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +53 -0
  129. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +151 -0
  130. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +59 -0
  131. package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +65 -0
  132. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +151 -0
  133. package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +63 -0
  134. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +214 -0
  135. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +381 -0
  136. package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +24 -0
  137. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +95 -0
  138. package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +78 -0
  139. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +52 -0
  140. package/project/.sdk/src/cmp/dart/Test_dart.ts +6 -0
  141. package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +1 -3
  142. package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +1 -40
  143. package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +3 -3
  144. package/project/.sdk/src/cmp/elixir/EntityTypes_elixir.ts +165 -0
  145. package/project/.sdk/src/cmp/elixir/Main_elixir.ts +4 -0
  146. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
  147. package/project/.sdk/src/cmp/elixir/ReadmeEntity_elixir.ts +163 -0
  148. package/project/.sdk/src/cmp/elixir/ReadmeExamplesTest_elixir.ts +126 -0
  149. package/project/.sdk/src/cmp/elixir/ReadmeExplanation_elixir.ts +55 -0
  150. package/project/.sdk/src/cmp/elixir/ReadmeHowto_elixir.ts +149 -0
  151. package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +67 -0
  152. package/project/.sdk/src/cmp/elixir/ReadmeIntro_elixir.ts +66 -0
  153. package/project/.sdk/src/cmp/elixir/ReadmeModel_elixir.ts +150 -0
  154. package/project/.sdk/src/cmp/elixir/ReadmeOptions_elixir.ts +62 -0
  155. package/project/.sdk/src/cmp/elixir/ReadmeQuick_elixir.ts +198 -0
  156. package/project/.sdk/src/cmp/elixir/ReadmeRef_elixir.ts +333 -0
  157. package/project/.sdk/src/cmp/elixir/ReadmeTopHowto_elixir.ts +26 -0
  158. package/project/.sdk/src/cmp/elixir/ReadmeTopQuick_elixir.ts +79 -0
  159. package/project/.sdk/src/cmp/elixir/ReadmeTopTest_elixir.ts +68 -0
  160. package/project/.sdk/src/cmp/elixir/Test_elixir.ts +4 -0
  161. package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +4 -0
  162. package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +4 -0
  163. package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +4 -0
  164. package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -0
  165. package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +4 -0
  166. package/project/.sdk/src/cmp/elixir/utility_elixir.ts +32 -0
  167. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +12 -3
  168. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +6 -1
  169. package/project/.sdk/src/cmp/go/TestEntity_go.ts +10 -3
  170. package/project/.sdk/src/cmp/go/utility_go.ts +3 -2
  171. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +240 -43
  172. package/project/.sdk/src/cmp/go-cli/fragment/main.fragment.go +27 -5
  173. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +191 -30
  174. package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +181 -0
  175. package/project/.sdk/src/cmp/haskell/ReadmeExamplesTest_haskell.ts +125 -0
  176. package/project/.sdk/src/cmp/haskell/ReadmeExplanation_haskell.ts +48 -0
  177. package/project/.sdk/src/cmp/haskell/ReadmeHowto_haskell.ts +168 -0
  178. package/project/.sdk/src/cmp/haskell/ReadmeInstall_haskell.ts +51 -0
  179. package/project/.sdk/src/cmp/haskell/ReadmeIntro_haskell.ts +67 -0
  180. package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +160 -0
  181. package/project/.sdk/src/cmp/haskell/ReadmeOptions_haskell.ts +74 -0
  182. package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +237 -0
  183. package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +405 -0
  184. package/project/.sdk/src/cmp/haskell/ReadmeTopHowto_haskell.ts +31 -0
  185. package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +104 -0
  186. package/project/.sdk/src/cmp/haskell/ReadmeTopTest_haskell.ts +80 -0
  187. package/project/.sdk/src/cmp/haskell/Test_haskell.ts +27 -2
  188. package/project/.sdk/src/cmp/java/EntityTypes_java.ts +207 -0
  189. package/project/.sdk/src/cmp/java/Main_java.ts +6 -0
  190. package/project/.sdk/src/cmp/java/ReadmeEntity_java.ts +175 -0
  191. package/project/.sdk/src/cmp/java/ReadmeExamplesTest_java.ts +186 -0
  192. package/project/.sdk/src/cmp/java/ReadmeExplanation_java.ts +46 -0
  193. package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +156 -0
  194. package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +52 -0
  195. package/project/.sdk/src/cmp/java/ReadmeIntro_java.ts +66 -0
  196. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +150 -0
  197. package/project/.sdk/src/cmp/java/ReadmeOptions_java.ts +61 -0
  198. package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +230 -0
  199. package/project/.sdk/src/cmp/java/ReadmeRef_java.ts +388 -0
  200. package/project/.sdk/src/cmp/java/ReadmeTopHowto_java.ts +23 -0
  201. package/project/.sdk/src/cmp/java/ReadmeTopQuick_java.ts +103 -0
  202. package/project/.sdk/src/cmp/java/ReadmeTopTest_java.ts +77 -0
  203. package/project/.sdk/src/cmp/java/Test_java.ts +4 -0
  204. package/project/.sdk/src/cmp/js/EntityTypes_js.ts +25 -8
  205. package/project/.sdk/src/cmp/js/MainEntity_js.ts +4 -2
  206. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +4 -4
  207. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +13 -4
  208. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +4 -4
  209. package/project/.sdk/src/cmp/js/ReadmeRef_js.ts +5 -5
  210. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +4 -4
  211. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +4 -4
  212. package/project/.sdk/src/cmp/js/TestDirect_js.ts +6 -5
  213. package/project/.sdk/src/cmp/js/TestEntity_js.ts +7 -2
  214. package/project/.sdk/src/cmp/js/fragment/Entity.test.fragment.js +0 -31
  215. package/project/.sdk/src/cmp/kotlin/EntityTypes_kotlin.ts +201 -0
  216. package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +6 -0
  217. package/project/.sdk/src/cmp/kotlin/ReadmeEntity_kotlin.ts +175 -0
  218. package/project/.sdk/src/cmp/kotlin/ReadmeExamplesTest_kotlin.ts +173 -0
  219. package/project/.sdk/src/cmp/kotlin/ReadmeExplanation_kotlin.ts +47 -0
  220. package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +154 -0
  221. package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +50 -0
  222. package/project/.sdk/src/cmp/kotlin/ReadmeIntro_kotlin.ts +66 -0
  223. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +150 -0
  224. package/project/.sdk/src/cmp/kotlin/ReadmeOptions_kotlin.ts +61 -0
  225. package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +230 -0
  226. package/project/.sdk/src/cmp/kotlin/ReadmeRef_kotlin.ts +387 -0
  227. package/project/.sdk/src/cmp/kotlin/ReadmeTopHowto_kotlin.ts +23 -0
  228. package/project/.sdk/src/cmp/kotlin/ReadmeTopQuick_kotlin.ts +104 -0
  229. package/project/.sdk/src/cmp/kotlin/ReadmeTopTest_kotlin.ts +77 -0
  230. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +4 -0
  231. package/project/.sdk/src/cmp/lua/Config_lua.ts +1 -1
  232. package/project/.sdk/src/cmp/lua/EntityTypes_lua.ts +19 -5
  233. package/project/.sdk/src/cmp/lua/Main_lua.ts +14 -2
  234. package/project/.sdk/src/cmp/lua/ReadmeEntity_lua.ts +2 -2
  235. package/project/.sdk/src/cmp/lua/ReadmeHowto_lua.ts +6 -1
  236. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +3 -3
  237. package/project/.sdk/src/cmp/lua/ReadmeRef_lua.ts +2 -2
  238. package/project/.sdk/src/cmp/lua/ReadmeTopQuick_lua.ts +2 -2
  239. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +7 -2
  240. package/project/.sdk/src/cmp/lua/Test_lua.ts +1 -1
  241. package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +2 -0
  242. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +180 -0
  243. package/project/.sdk/src/cmp/ocaml/ReadmeExamplesTest_ocaml.ts +111 -0
  244. package/project/.sdk/src/cmp/ocaml/ReadmeExplanation_ocaml.ts +46 -0
  245. package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +147 -0
  246. package/project/.sdk/src/cmp/ocaml/ReadmeInstall_ocaml.ts +44 -0
  247. package/project/.sdk/src/cmp/ocaml/ReadmeIntro_ocaml.ts +68 -0
  248. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +155 -0
  249. package/project/.sdk/src/cmp/ocaml/ReadmeOptions_ocaml.ts +59 -0
  250. package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +205 -0
  251. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +402 -0
  252. package/project/.sdk/src/cmp/ocaml/ReadmeTopHowto_ocaml.ts +25 -0
  253. package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +86 -0
  254. package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +79 -0
  255. package/project/.sdk/src/cmp/ocaml/Test_ocaml.ts +4 -0
  256. package/project/.sdk/src/cmp/perl/ReadmeEntity_perl.ts +181 -0
  257. package/project/.sdk/src/cmp/perl/ReadmeExamplesTest_perl.ts +354 -0
  258. package/project/.sdk/src/cmp/perl/ReadmeExplanation_perl.ts +43 -0
  259. package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +149 -0
  260. package/project/.sdk/src/cmp/perl/ReadmeInstall_perl.ts +47 -0
  261. package/project/.sdk/src/cmp/perl/ReadmeIntro_perl.ts +66 -0
  262. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +150 -0
  263. package/project/.sdk/src/cmp/perl/ReadmeOptions_perl.ts +59 -0
  264. package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +216 -0
  265. package/project/.sdk/src/cmp/perl/ReadmeRef_perl.ts +399 -0
  266. package/project/.sdk/src/cmp/perl/ReadmeTopHowto_perl.ts +24 -0
  267. package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +91 -0
  268. package/project/.sdk/src/cmp/perl/ReadmeTopTest_perl.ts +83 -0
  269. package/project/.sdk/src/cmp/perl/Test_perl.ts +4 -0
  270. package/project/.sdk/src/cmp/php/EntityTypes_php.ts +23 -6
  271. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +6 -1
  272. package/project/.sdk/src/cmp/php/TestEntity_php.ts +7 -2
  273. package/project/.sdk/src/cmp/py/EntityTypes_py.ts +32 -7
  274. package/project/.sdk/src/cmp/py/Entity_py.ts +2 -10
  275. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +2 -2
  276. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +8 -3
  277. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +3 -3
  278. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +2 -2
  279. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +2 -2
  280. package/project/.sdk/src/cmp/py/ReadmeTopTest_py.ts +2 -2
  281. package/project/.sdk/src/cmp/py/TestEntity_py.ts +7 -2
  282. package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +19 -5
  283. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +2 -2
  284. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +8 -3
  285. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +3 -3
  286. package/project/.sdk/src/cmp/rb/ReadmeRef_rb.ts +2 -2
  287. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +2 -2
  288. package/project/.sdk/src/cmp/rb/ReadmeTopTest_rb.ts +2 -2
  289. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +7 -2
  290. package/project/.sdk/src/cmp/rust/EntityBase_rust.ts +4 -0
  291. package/project/.sdk/src/cmp/rust/EntityTypes_rust.ts +152 -0
  292. package/project/.sdk/src/cmp/rust/Entity_rust.ts +1 -1
  293. package/project/.sdk/src/cmp/rust/Main_rust.ts +5 -0
  294. package/project/.sdk/src/cmp/rust/ReadmeEntity_rust.ts +163 -0
  295. package/project/.sdk/src/cmp/rust/ReadmeExamplesTest_rust.ts +132 -0
  296. package/project/.sdk/src/cmp/rust/ReadmeExplanation_rust.ts +44 -0
  297. package/project/.sdk/src/cmp/rust/ReadmeHowto_rust.ts +142 -0
  298. package/project/.sdk/src/cmp/rust/ReadmeInstall_rust.ts +49 -0
  299. package/project/.sdk/src/cmp/rust/ReadmeIntro_rust.ts +66 -0
  300. package/project/.sdk/src/cmp/rust/ReadmeModel_rust.ts +153 -0
  301. package/project/.sdk/src/cmp/rust/ReadmeOptions_rust.ts +60 -0
  302. package/project/.sdk/src/cmp/rust/ReadmeQuick_rust.ts +212 -0
  303. package/project/.sdk/src/cmp/rust/ReadmeRef_rust.ts +384 -0
  304. package/project/.sdk/src/cmp/rust/ReadmeTopHowto_rust.ts +24 -0
  305. package/project/.sdk/src/cmp/rust/ReadmeTopQuick_rust.ts +95 -0
  306. package/project/.sdk/src/cmp/rust/ReadmeTopTest_rust.ts +81 -0
  307. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +10 -0
  308. package/project/.sdk/src/cmp/rust/Test_rust.ts +4 -0
  309. package/project/.sdk/src/cmp/scala/EntityTypes_scala.ts +202 -0
  310. package/project/.sdk/src/cmp/scala/Main_scala.ts +6 -0
  311. package/project/.sdk/src/cmp/scala/ReadmeEntity_scala.ts +175 -0
  312. package/project/.sdk/src/cmp/scala/ReadmeExamplesTest_scala.ts +163 -0
  313. package/project/.sdk/src/cmp/scala/ReadmeExplanation_scala.ts +49 -0
  314. package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +155 -0
  315. package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +58 -0
  316. package/project/.sdk/src/cmp/scala/ReadmeIntro_scala.ts +66 -0
  317. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +150 -0
  318. package/project/.sdk/src/cmp/scala/ReadmeOptions_scala.ts +61 -0
  319. package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +230 -0
  320. package/project/.sdk/src/cmp/scala/ReadmeRef_scala.ts +388 -0
  321. package/project/.sdk/src/cmp/scala/ReadmeTopHowto_scala.ts +23 -0
  322. package/project/.sdk/src/cmp/scala/ReadmeTopQuick_scala.ts +104 -0
  323. package/project/.sdk/src/cmp/scala/ReadmeTopTest_scala.ts +77 -0
  324. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +38 -10
  325. package/project/.sdk/src/cmp/scala/Test_scala.ts +8 -0
  326. package/project/.sdk/src/cmp/swift/EntityTypes_swift.ts +152 -0
  327. package/project/.sdk/src/cmp/swift/Main_swift.ts +5 -0
  328. package/project/.sdk/src/cmp/swift/ReadmeEntity_swift.ts +176 -0
  329. package/project/.sdk/src/cmp/swift/ReadmeExamplesTest_swift.ts +170 -0
  330. package/project/.sdk/src/cmp/swift/ReadmeExplanation_swift.ts +49 -0
  331. package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +159 -0
  332. package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +58 -0
  333. package/project/.sdk/src/cmp/swift/ReadmeIntro_swift.ts +64 -0
  334. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +149 -0
  335. package/project/.sdk/src/cmp/swift/ReadmeOptions_swift.ts +62 -0
  336. package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +232 -0
  337. package/project/.sdk/src/cmp/swift/ReadmeRef_swift.ts +387 -0
  338. package/project/.sdk/src/cmp/swift/ReadmeTopHowto_swift.ts +24 -0
  339. package/project/.sdk/src/cmp/swift/ReadmeTopQuick_swift.ts +105 -0
  340. package/project/.sdk/src/cmp/swift/ReadmeTopTest_swift.ts +77 -0
  341. package/project/.sdk/src/cmp/swift/Test_swift.ts +4 -0
  342. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +19 -5
  343. package/project/.sdk/src/cmp/ts/MainEntity_ts.ts +4 -2
  344. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +4 -4
  345. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +14 -4
  346. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +29 -11
  347. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +5 -5
  348. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +4 -4
  349. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +4 -4
  350. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +13 -11
  351. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +18 -2
  352. package/project/.sdk/src/cmp/zig/Config_zig.ts +22 -4
  353. package/project/.sdk/src/cmp/zig/Entity_zig.ts +1 -1
  354. package/project/.sdk/src/cmp/zig/Main_zig.ts +10 -4
  355. package/project/.sdk/src/cmp/zig/Package_zig.ts +53 -0
  356. package/project/.sdk/src/cmp/zig/ReadmeEntity_zig.ts +188 -0
  357. package/project/.sdk/src/cmp/zig/ReadmeExamplesTest_zig.ts +58 -0
  358. package/project/.sdk/src/cmp/zig/ReadmeExplanation_zig.ts +45 -0
  359. package/project/.sdk/src/cmp/zig/ReadmeHowto_zig.ts +143 -0
  360. package/project/.sdk/src/cmp/zig/ReadmeInstall_zig.ts +54 -0
  361. package/project/.sdk/src/cmp/zig/ReadmeIntro_zig.ts +66 -0
  362. package/project/.sdk/src/cmp/zig/ReadmeModel_zig.ts +152 -0
  363. package/project/.sdk/src/cmp/zig/ReadmeOptions_zig.ts +60 -0
  364. package/project/.sdk/src/cmp/zig/ReadmeQuick_zig.ts +211 -0
  365. package/project/.sdk/src/cmp/zig/ReadmeRef_zig.ts +400 -0
  366. package/project/.sdk/src/cmp/zig/ReadmeTopHowto_zig.ts +24 -0
  367. package/project/.sdk/src/cmp/zig/ReadmeTopQuick_zig.ts +96 -0
  368. package/project/.sdk/src/cmp/zig/ReadmeTopTest_zig.ts +82 -0
  369. package/project/.sdk/src/cmp/zig/TestDirect_zig.ts +66 -0
  370. package/project/.sdk/src/cmp/zig/TestEntity_zig.ts +79 -0
  371. package/project/.sdk/src/cmp/zig/Test_zig.ts +17 -61
  372. package/project/.sdk/tm/clojure/src/voxgig/struct.clj +1 -1
  373. package/project/.sdk/tm/cpp/test/feature_test.cpp +19 -0
  374. package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +4 -1
  375. package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +7 -1
  376. package/project/.sdk/tm/elixir/lib/utility/struct/voxgig_struct.ex +1 -1
  377. package/project/.sdk/tm/elixir/test/primary_utility_test.exs +7 -1
  378. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +3 -1
  379. package/project/.sdk/tm/haskell/test/Harness.hs +8 -3
  380. package/project/.sdk/tm/js/Makefile +1 -1
  381. package/project/.sdk/tm/js/jsconfig.json +12 -0
  382. package/project/.sdk/tm/ocaml/Makefile +5 -1
  383. package/project/.sdk/tm/php/utility/struct/Struct.php +1 -1
  384. package/project/.sdk/tm/py/utility/voxgig_struct/voxgig_struct.py +1 -1
  385. package/project/.sdk/tm/rb/utility/struct/voxgig_struct.rb +1 -1
  386. package/project/.sdk/tm/scala/sdktest/SdkTestMain.scala +8 -59
  387. package/project/.sdk/tm/ts/Makefile +1 -1
  388. package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +1 -1
  389. package/src/cmp/ReadmeErrors.ts +2 -2
  390. package/src/cmp/ReadmeExplanation.ts +3 -3
  391. package/src/cmp/ReadmeTop.ts +2 -2
  392. package/src/helpers/canonType.ts +116 -25
  393. package/src/helpers/naming.ts +47 -0
  394. package/src/helpers/opExample.ts +43 -20
  395. package/src/helpers/opShape.ts +102 -3
  396. package/src/sdkgen.ts +8 -2
  397. package/src/tsconfig.json +2 -0
  398. package/project/.sdk/tm/zig/build.zig.zon +0 -11
@@ -1,20 +1,22 @@
1
1
  // Canonical type-sentinel -> language primitive type mapper.
2
2
  //
3
- // SOURCE OF TRUTH for the sentinel set: @voxgig/apidef
4
- // ~/Projects/voxgig/apidef ts/src/utility.ts -> `const VALID_CANON`
5
- // (around line 908). VALID_CANON maps an OpenAPI type NAME -> a `$SENTINEL`
6
- // string (e.g. 'string' -> `$STRING`). The model stores those sentinels on
7
- // every `fields[].type` and op `points[].args.params[].type`.
3
+ // SOURCE OF TRUTH for the sentinel set: @voxgig/apidef (`VALID_CANON` +
4
+ // `CANON_ONE`, exported from the package). VALID_CANON maps an OpenAPI type
5
+ // NAME -> a `$SENTINEL` string (e.g. 'string' -> `$STRING`). The model stores
6
+ // those sentinels on every `fields[].type` and op `points[].args.params[].type`.
7
+ // A multi-type (OpenAPI `type: [a, b]`) is stored as the ARRAY-shaped union
8
+ // sentinel `['`$ONE`', [member, ...]]` (see canonToType below).
8
9
  //
9
10
  // This table maps the SENTINEL the other way -> a concrete primitive type in
10
11
  // each target language, so the typed-model generators (EntityTypes_<lang>.ts)
11
- // can turn the model's field/param sentinels into real language types.
12
+ // and the README type columns (ReadmeRef_<lang>.ts / ReadmeEntity_<lang>.ts)
13
+ // can turn the model's field/param sentinels into real language types. It is
14
+ // the SINGLE mapping per language: components must not keep local copies.
12
15
  //
13
- // Kept as a small duplicate here (rather than importing VALID_CANON) because
14
- // VALID_CANON is name->sentinel, is not exported from @voxgig/apidef, and would
15
- // need inverting; a sentinel->type table is what every language generator
16
- // actually needs. If VALID_CANON gains a new sentinel, add a row below (all
17
- // languages) and keep the two in sync.
16
+ // Kept as a small mirror here (rather than importing VALID_CANON at runtime)
17
+ // because apidef is a peer dependency and the table is the INVERSE direction;
18
+ // `ts/test/canontype.test.ts` asserts this table covers apidef's exported
19
+ // sentinel vocabulary whenever apidef is installed, so drift fails the suite.
18
20
  //
19
21
  // KNOWN GAPS (papered over sanely, documented for the port):
20
22
  // - Unknown / missing sentinel -> the language's "any" (never throws).
@@ -25,30 +27,99 @@
25
27
  // language's open record/map type.
26
28
  // - No enum/format/nullability beyond the `req` flag.
27
29
 
28
- // Target languages sdkgen supports (go-cli / go-mcp reuse 'go').
29
- type CanonLang = 'ts' | 'js' | 'py' | 'php' | 'rb' | 'lua' | 'go'
30
+ // Target languages sdkgen supports (go-cli / go-mcp reuse 'go'). The targets
31
+ // with a fully dynamic value model (clojure, haskell, ocaml, perl, zig) have
32
+ // no column: they emit no typed models and document types via the language's
33
+ // dynamic Value/map vocabulary.
34
+ type CanonLang =
35
+ | 'ts' | 'js' | 'py' | 'php' | 'rb' | 'lua' | 'go'
36
+ | 'csharp' | 'java' | 'kotlin' | 'scala' | 'swift' | 'dart'
37
+ | 'rust' | 'c' | 'cpp' | 'elixir'
30
38
 
31
39
  // Bare sentinel key (backticks + leading `$` stripped, upper-cased)
32
40
  // -> per-language primitive type name.
33
41
  //
34
- // ONLY the `ts` column is exercised + tested today (the reference target).
35
- // The other columns are a starting scaffold for the per-language port; verify
36
- // each against that language's idioms before wiring its EntityTypes_<lang>.ts.
42
+ // Column notes:
43
+ // - kotlin: every type is nullable (`?`) the kotlin emitter drops
44
+ // per-member optionality because the column is already-nullable.
45
+ // - java/scala: boxed JVM types (nullable), so optionality needs no marker.
46
+ // - rust/c/cpp/swift: `Value`/`voxgig_value*`/`VMap` are the vendored
47
+ // dynamic value types those runtimes ship.
37
48
  const CANON_TYPE: Record<string, Record<CanonLang, string>> = {
38
- STRING: { ts: 'string', js: 'string', py: 'str', php: 'string', rb: 'String', lua: 'string', go: 'string' },
39
- INTEGER: { ts: 'number', js: 'number', py: 'int', php: 'int', rb: 'Integer', lua: 'number', go: 'int' },
40
- NUMBER: { ts: 'number', js: 'number', py: 'float', php: 'float', rb: 'Float', lua: 'number', go: 'float64' },
41
- BOOLEAN: { ts: 'boolean', js: 'boolean', py: 'bool', php: 'bool', rb: 'Boolean', lua: 'boolean', go: 'bool' },
42
- NULL: { ts: 'null', js: 'null', py: 'None', php: 'null', rb: 'NilClass', lua: 'nil', go: 'any' },
43
- ARRAY: { ts: 'any[]', js: 'Array', py: 'list', php: 'array', rb: 'Array', lua: 'table', go: '[]any' },
44
- OBJECT: { ts: 'Record<string, any>', js: 'Object', py: 'dict', php: 'array', rb: 'Hash', lua: 'table', go: 'map[string]any' },
45
- ANY: { ts: 'any', js: '*', py: 'Any', php: 'mixed', rb: 'Object', lua: 'any', go: 'any' },
49
+ STRING: {
50
+ ts: 'string', js: 'string', py: 'str', php: 'string', rb: 'String',
51
+ lua: 'string', go: 'string', csharp: 'string', java: 'String',
52
+ kotlin: 'String?', scala: 'String', swift: 'String', dart: 'String',
53
+ rust: 'String', c: 'char*', cpp: 'std::string', elixir: 'String.t()',
54
+ },
55
+ INTEGER: {
56
+ ts: 'number', js: 'number', py: 'int', php: 'int', rb: 'Integer',
57
+ lua: 'number', go: 'int', csharp: 'long', java: 'Long',
58
+ kotlin: 'Long?', scala: 'java.lang.Long', swift: 'Int', dart: 'int',
59
+ rust: 'i64', c: 'int64_t', cpp: 'int64_t', elixir: 'integer()',
60
+ },
61
+ NUMBER: {
62
+ ts: 'number', js: 'number', py: 'float', php: 'float', rb: 'Float',
63
+ lua: 'number', go: 'float64', csharp: 'double', java: 'Double',
64
+ kotlin: 'Double?', scala: 'java.lang.Double', swift: 'Double', dart: 'num',
65
+ rust: 'f64', c: 'double', cpp: 'double', elixir: 'float()',
66
+ },
67
+ BOOLEAN: {
68
+ ts: 'boolean', js: 'boolean', py: 'bool', php: 'bool', rb: 'Boolean',
69
+ lua: 'boolean', go: 'bool', csharp: 'bool', java: 'Boolean',
70
+ kotlin: 'Boolean?', scala: 'java.lang.Boolean', swift: 'Bool', dart: 'bool',
71
+ rust: 'bool', c: 'bool', cpp: 'bool', elixir: 'boolean()',
72
+ },
73
+ NULL: {
74
+ ts: 'null', js: 'null', py: 'None', php: 'null', rb: 'NilClass',
75
+ lua: 'nil', go: 'any', csharp: 'object?', java: 'Object',
76
+ kotlin: 'Any?', scala: 'Object', swift: 'Value', dart: 'Object',
77
+ rust: 'Value', c: 'voxgig_value*', cpp: 'Value', elixir: 'nil',
78
+ },
79
+ ARRAY: {
80
+ ts: 'any[]', js: 'Array', py: 'list', php: 'array', rb: 'Array',
81
+ lua: 'table', go: '[]any', csharp: 'List<object?>', java: 'List<Object>',
82
+ kotlin: 'List<Any?>?', scala: 'java.util.List[Object]', swift: '[Value]',
83
+ dart: 'List<dynamic>', rust: 'Vec<Value>', c: 'voxgig_value*',
84
+ cpp: 'std::vector<Value>', elixir: 'list()',
85
+ },
86
+ OBJECT: {
87
+ ts: 'Record<string, any>', js: 'Object', py: 'dict', php: 'array',
88
+ rb: 'Hash', lua: 'table', go: 'map[string]any',
89
+ csharp: 'Dictionary<string, object?>', java: 'Map<String, Object>',
90
+ kotlin: 'Map<String, Any?>?', scala: 'java.util.Map[String, Object]',
91
+ swift: 'VMap', dart: 'Map<String, dynamic>',
92
+ rust: 'std::collections::HashMap<String, Value>', c: 'voxgig_value*',
93
+ cpp: 'std::map<std::string, Value>', elixir: 'map()',
94
+ },
95
+ ANY: {
96
+ ts: 'any', js: '*', py: 'Any', php: 'mixed', rb: 'Object',
97
+ lua: 'any', go: 'any', csharp: 'object?', java: 'Object',
98
+ kotlin: 'Any?', scala: 'Object', swift: 'Value', dart: 'dynamic',
99
+ rust: 'Value', c: 'voxgig_value*', cpp: 'Value', elixir: 'any()',
100
+ },
46
101
  }
47
102
 
48
103
  // Per-language fallback for unknown / missing sentinels.
49
104
  // js uses JSDoc's `*` (any type); lua uses `any` (LuaLS).
50
105
  const CANON_ANY: Record<CanonLang, string> = {
51
- ts: 'any', js: '*', py: 'Any', php: 'mixed', rb: 'Object', lua: 'any', go: 'any',
106
+ ts: 'any', js: '*', py: 'Any', php: 'mixed', rb: 'Object',
107
+ lua: 'any', go: 'any', csharp: 'object?', java: 'Object',
108
+ kotlin: 'Any?', scala: 'Object', swift: 'Value', dart: 'dynamic',
109
+ rust: 'Value', c: 'voxgig_value*', cpp: 'Value', elixir: 'any()',
110
+ }
111
+
112
+ // Union ($ONE) member separator for languages with a native union/sum type
113
+ // syntax. Languages absent here have no way to express an anonymous union in
114
+ // a type position, so a $ONE sentinel degrades to that language's "any".
115
+ // (php 8 unions exist but cannot combine with the `?` optional prefix the
116
+ // emitters use, so php deliberately degrades to `mixed`.)
117
+ const CANON_UNION_JOIN: Partial<Record<CanonLang, string>> = {
118
+ ts: ' | ',
119
+ js: '|',
120
+ py: ' | ',
121
+ lua: '|',
122
+ elixir: ' | ',
52
123
  }
53
124
 
54
125
 
@@ -64,10 +135,29 @@ function canonKey(sentinel: unknown): string {
64
135
 
65
136
  // Map a field/param type sentinel to a target-language primitive type.
66
137
  // Unknown or missing sentinel -> that language's "any" (never throws).
138
+ //
139
+ // The union sentinel `['`$ONE`', [member, ...]]` (apidef CANON_ONE, produced
140
+ // for OpenAPI multi-types) renders as a joined member union in languages with
141
+ // union syntax (see CANON_UNION_JOIN); elsewhere it degrades to "any".
142
+ // Members may themselves be unions (handled recursively) or the literal
143
+ // 'Any' apidef emits for an unknown member name (canonKey maps it to ANY).
67
144
  function canonToType(sentinel: unknown, lang: string): string {
68
145
  const l = lang as CanonLang
69
146
  const fallback = CANON_ANY[l] ?? 'any'
70
147
 
148
+ if (Array.isArray(sentinel)) {
149
+ if ('ONE' === canonKey(sentinel[0]) && Array.isArray(sentinel[1])) {
150
+ const join = CANON_UNION_JOIN[l]
151
+ if (null == join) {
152
+ return fallback
153
+ }
154
+ const members = sentinel[1].map((m: unknown) => canonToType(m, l))
155
+ const uniq = members.filter((m: string, i: number) => members.indexOf(m) === i)
156
+ return 0 === uniq.length ? fallback : uniq.join(join)
157
+ }
158
+ return fallback
159
+ }
160
+
71
161
  const row = CANON_TYPE[canonKey(sentinel)]
72
162
  if (null == row) {
73
163
  return fallback
@@ -82,6 +172,7 @@ export {
82
172
  canonKey,
83
173
  CANON_TYPE,
84
174
  CANON_ANY,
175
+ CANON_UNION_JOIN,
85
176
  }
86
177
 
87
178
  export type {
@@ -83,7 +83,54 @@ function safeVarName(name: string, lang: string): string {
83
83
  }
84
84
 
85
85
 
86
+ // A variable name for a doc EXAMPLE entity. Doc examples bind the SDK instance
87
+ // to `client` (e.g. `const client = ...SDK.test()`), so an entity whose
88
+ // lowercased name is also `client` — an API with a `Client` entity — would
89
+ // shadow it: `const client = client.Client()...` is self-referential (TS2448/
90
+ // TS7022) and breaks the readme_examples type-check. Append `_` to keep the
91
+ // example variable distinct from the SDK instance. Also applies the normal
92
+ // language-reserved-word guard.
93
+ function exampleVarName(name: string, lang: string): string {
94
+ const v = safeVarName(name, lang)
95
+ return 'client' === v ? v + '_' : v
96
+ }
97
+
98
+
99
+ // A valid ECMAScript identifier — the only shape `obj.name` can express.
100
+ const JS_IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/
101
+
102
+
103
+ // A safe JS/TS property-access expression for a SPEC-DERIVED key: dot
104
+ // notation when the key is a valid identifier, bracket notation otherwise.
105
+ // OpenAPI path/query parameter names are not constrained to identifiers —
106
+ // e.g. Evervault's `/payments/3ds-sessions/{3ds_session_id}` yields
107
+ // `3ds_session_id`, and `params.3ds_session_id` is a syntax error (TS1434).
108
+ // The other language targets already quote these keys (`params["..."]`);
109
+ // this keeps ts/js in parity.
110
+ function jsProp(obj: string, name: string): string {
111
+ return JS_IDENT.test(name) ? `${obj}.${name}` : `${obj}[${JSON.stringify(name)}]`
112
+ }
113
+
114
+
115
+ // A safe JS/TS OBJECT-LITERAL key for a spec-derived field name: bare when
116
+ // the name is a valid identifier, single-quoted otherwise. `{ 3ds_session_id:
117
+ // 1 }` is a syntax error (TS1351) — doc examples must quote such keys.
118
+ function jsKey(name: string): string {
119
+ return JS_IDENT.test(name) ? name : `'${name}'`
120
+ }
121
+
122
+
123
+ // As `jsProp`, but optional-chained: `obj?.name` / `obj?.["3ds_session_id"]`.
124
+ function jsOptProp(obj: string, name: string): string {
125
+ return JS_IDENT.test(name) ? `${obj}?.${name}` : `${obj}?.[${JSON.stringify(name)}]`
126
+ }
127
+
128
+
86
129
  export {
87
130
  isReservedName,
88
131
  safeVarName,
132
+ exampleVarName,
133
+ jsProp,
134
+ jsOptProp,
135
+ jsKey,
89
136
  }
@@ -52,15 +52,48 @@ function idLiteral(ent: any, op: string, idF: string | null): string {
52
52
 
53
53
  // Render a match object `{ idF: idLit }` (or empty when the entity has no id
54
54
  // key) in the target language's object syntax.
55
- function matchArg(lang: ExampleLang, idF: string | null, idLit: string): string {
56
- if (null == idF) return 'go' === lang ? 'nil' : ''
55
+ // Spec-derived field names are NOT constrained to be identifiers — e.g.
56
+ // Evervault's `/payments/3ds-sessions/{3ds_session_id}` yields the match key
57
+ // `3ds_session_id`. py/php/rb/go quote every literal key already, but ts/js
58
+ // (`{ key: v }`) and lua (`{ key = v }`) write them bare, and a leading digit
59
+ // or a `-` makes that a syntax error (TS1351 / Lua "'}' expected"). Quote
60
+ // exactly those, leaving ordinary keys in the idiomatic bare form.
61
+ const JS_IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/
62
+ const LUA_IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/
63
+
64
+ // A `key<sep>value` literal pair in the target language's object syntax.
65
+ function litPair(lang: ExampleLang, name: string, value: string): string {
57
66
  switch (lang) {
58
- case 'py': return `{"${idF}": ${idLit}}`
59
- case 'php': return `["${idF}" => ${idLit}]`
60
- case 'rb': return `{ "${idF}" => ${idLit} }`
61
- case 'lua': return `{ ${idF} = ${idLit} }`
62
- case 'go': return `map[string]any{"${idF}": ${idLit}}`
63
- default: return `{ ${idF}: ${idLit} }`
67
+ case 'py': return `"${name}": ${value}`
68
+ case 'php': return `"${name}" => ${value}`
69
+ case 'rb': return `"${name}" => ${value}`
70
+ case 'go': return `"${name}": ${value}`
71
+ case 'lua': return LUA_IDENT.test(name) ?
72
+ `${name} = ${value}` : `["${name}"] = ${value}`
73
+ default: return JS_IDENT.test(name) ?
74
+ `${name}: ${value}` : `'${name}': ${value}`
75
+ }
76
+ }
77
+
78
+
79
+ // The match argument for a load/remove — ALL required match params, not just
80
+ // the primary id. A composite-match entity (e.g. Umbrella's FlatPermission,
81
+ // `/public/database/{id}/permission/{msisdn}`) has two required path params
82
+ // (database_id + id); emitting only `{ id }` fails the typed <Name>LoadMatch.
83
+ // The idF field takes the specific id literal; other required fields take a
84
+ // type-correct example value (mirrors dataArg).
85
+ function matchArg(
86
+ lang: ExampleLang, ent: any, op: string, idF: string | null, idLit: string
87
+ ): string {
88
+ const items = opRequestShape(ent, op).items.filter((it: any) => !it.optional)
89
+ if (0 === items.length) return 'go' === lang ? 'nil' : ''
90
+ const pairs = items.map((it: any) =>
91
+ litPair(lang, it.name, it.name === idF ? idLit : litFor(lang, it.type)))
92
+ switch (lang) {
93
+ case 'py': return `{${pairs.join(', ')}}`
94
+ case 'php': return `[${pairs.join(', ')}]`
95
+ case 'go': return `map[string]any{${pairs.join(', ')}}`
96
+ default: return `{ ${pairs.join(', ')} }`
64
97
  }
65
98
  }
66
99
 
@@ -75,17 +108,7 @@ function dataArg(lang: ExampleLang, ent: any, op: string, idF: string | null): s
75
108
  // ALL required fields must appear (a typed CreateData rejects a partial); cap
76
109
  // only the optional fallback used when the op declares no required field.
77
110
  const chosen = required.length ? required : items.slice(0, 3)
78
- const pairs = chosen.map((it: any) => {
79
- const v = litFor(lang, it.type)
80
- switch (lang) {
81
- case 'py': return `"${it.name}": ${v}`
82
- case 'php': return `"${it.name}" => ${v}`
83
- case 'rb': return `"${it.name}" => ${v}`
84
- case 'lua': return `${it.name} = ${v}`
85
- case 'go': return `"${it.name}": ${v}`
86
- default: return `${it.name}: ${v}`
87
- }
88
- })
111
+ const pairs = chosen.map((it: any) => litPair(lang, it.name, litFor(lang, it.type)))
89
112
  switch (lang) {
90
113
  case 'php': return `[${pairs.join(', ')}]`
91
114
  case 'lua': return `{ ${pairs.join(', ')} }`
@@ -139,7 +162,7 @@ function primaryOpCall(
139
162
  if (isList) {
140
163
  arg = 'go' === lang ? 'nil' : ''
141
164
  } else if (isMatch) {
142
- arg = matchArg(lang, idF, idLit)
165
+ arg = matchArg(lang, ent, op, idF, idLit)
143
166
  } else if (isData) {
144
167
  arg = dataArg(lang, ent, op, idF)
145
168
  } else {
@@ -305,6 +305,64 @@ function entityClassName(ent: any, entityColl: any): string {
305
305
  }
306
306
 
307
307
 
308
+ // Cross-entity TYPE-name collision detection. entityClassNames keeps CLASS
309
+ // names collision-free, but the DATA/op type names are the raw `<Name>` /
310
+ // opTypeName(...) — two entities whose PascalCase Name coincides (e.g.
311
+ // `foo-bar` vs `foo_bar`), or a data-type name equal to another entity's
312
+ // op-type name, emit DUPLICATE top-level type declarations: a redeclaration
313
+ // compile error in go/rust/c/cpp/csharp and the JVM containers, silent
314
+ // merging in ts. The names cannot be auto-renamed here — the generated
315
+ // entity classes and op fragments reference them by token — so the guard
316
+ // surfaces the collision loudly instead. Returns the sorted duplicate names
317
+ // (empty when clean). Callers must have derived `Name` on each entity
318
+ // (every EntityTypes emitter does).
319
+ //
320
+ // Memoised per entity-collection object, like entityClassNames.
321
+ const _typeCollisionCache = new WeakMap<object, string[]>()
322
+
323
+ function entityTypeCollisions(entityColl: any): string[] {
324
+ const cached = _typeCollisionCache.get(entityColl)
325
+ if (null != cached) {
326
+ return cached
327
+ }
328
+
329
+ const counts: Record<string, number> = {}
330
+ const bump = (n: string) => { counts[n] = (counts[n] || 0) + 1 }
331
+
332
+ each(entityColl)
333
+ .filter((e: any) => e && null != e.name && null != e.Name)
334
+ .forEach((e: any) => {
335
+ bump(e.Name)
336
+ for (const op of ['load', 'list', 'create', 'update', 'remove']) {
337
+ if (e.op && e.op[op]) {
338
+ bump(opTypeName(e.Name, op))
339
+ }
340
+ }
341
+ })
342
+
343
+ const out = Object.keys(counts).filter((n) => 1 < counts[n]).sort()
344
+ _typeCollisionCache.set(entityColl, out)
345
+ return out
346
+ }
347
+
348
+
349
+ // Emitter convenience: warn (once per collection per target run) when the
350
+ // generated typed model would contain duplicate top-level type names.
351
+ function warnEntityTypeCollisions(entityColl: any, log: any, lang: string): string[] {
352
+ const dups = entityTypeCollisions(entityColl)
353
+ if (0 < dups.length && log && log.warn) {
354
+ log.warn({
355
+ point: 'entity-types-name-collision', lang, names: dups,
356
+ note: `${lang}: duplicate generated type name(s) ${dups.join(', ')} — ` +
357
+ `two entities produce the same PascalCase type name; rename one ` +
358
+ `entity (or alias it) in the model or the generated typed model ` +
359
+ `will not compile in statically-typed targets`,
360
+ })
361
+ }
362
+ return dups
363
+ }
364
+
365
+
308
366
  // Pick a representative entity for a single illustrative snippet (e.g. the
309
367
  // README's test-mode example): the first ACTIVE entity that exposes a read
310
368
  // op (list/load) so the snippet is meaningful, else the first with ANY
@@ -315,16 +373,55 @@ function entityClassName(ent: any, entityColl: any): string {
315
373
  // for deterministic output.
316
374
  function pickExampleEntity(entity: any): { entity: any, primaryOp: string | null } {
317
375
  const actives = each(entity).filter((e: any) => e && e.active !== false)
318
- const readable = actives.find((e: any) => {
376
+ const readable = actives.filter((e: any) => {
319
377
  const op = entityPrimaryOp(e)
320
378
  return 'list' === op || 'load' === op
321
379
  })
322
- const withOp = actives.find((e: any) => null != entityPrimaryOp(e))
323
- const chosen = readable || withOp || actives[0] || null
380
+ const withOp = actives.filter((e: any) => null != entityPrimaryOp(e))
381
+ // Prefer a readable entity, then any entity with an op, then anything at all.
382
+ // WITHIN the chosen tier pick an entity of MEDIAN "size" — median name length
383
+ // and median field count — so the generated README/examples showcase a
384
+ // representative entity, not the alphabetically-first one (often a degenerate
385
+ // stub with a terse name and no fields) nor an atypically sprawling one.
386
+ const pool = readable.length ? readable : (withOp.length ? withOp : actives)
387
+ const chosen = pickMedianEntity(pool)
324
388
  return { entity: chosen, primaryOp: null == chosen ? null : entityPrimaryOp(chosen) }
325
389
  }
326
390
 
327
391
 
392
+ // The pool entity closest to the median on both axes (name length, field
393
+ // count). Distance on each axis is normalised by that axis's own median so the
394
+ // two are comparable, then summed. Ties keep the pool's existing key-sorted
395
+ // order (each() is byte-stable), so the pick is deterministic.
396
+ function pickMedianEntity(pool: any[]): any {
397
+ if (0 === pool.length) return null
398
+ if (1 === pool.length) return pool[0]
399
+ const fieldCount = (e: any): number => (e && e.fields ? each(e.fields).length : 0)
400
+ const nameLen = (e: any): number => (e && e.name ? String(e.name).length : 0)
401
+ const medName = medianOf(pool.map(nameLen))
402
+ const medField = medianOf(pool.map(fieldCount))
403
+ let best = pool[0]
404
+ let bestScore = Infinity
405
+ for (const e of pool) {
406
+ const score =
407
+ Math.abs(nameLen(e) - medName) / (medName || 1) +
408
+ Math.abs(fieldCount(e) - medField) / (medField || 1)
409
+ if (score < bestScore) {
410
+ bestScore = score
411
+ best = e
412
+ }
413
+ }
414
+ return best
415
+ }
416
+
417
+
418
+ function medianOf(xs: number[]): number {
419
+ const s = xs.slice().sort((a, b) => a - b)
420
+ const m = Math.floor(s.length / 2)
421
+ return 0 === s.length ? 0 : (s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2)
422
+ }
423
+
424
+
328
425
  // The id field on the entity's DATA type (its fields[]), or null. DISTINCT from
329
426
  // entityIdField (the load-MATCH key): an API can model a load match that carries
330
427
  // an `id` param while the response entity itself has no `id` field, so `.id`
@@ -356,6 +453,8 @@ export {
356
453
  entityPrimaryOp,
357
454
  pickExampleEntity,
358
455
  entityClassName,
456
+ entityTypeCollisions,
457
+ warnEntityTypeCollisions,
359
458
  }
360
459
 
361
460
  export type {
package/src/sdkgen.ts CHANGED
@@ -51,8 +51,8 @@ import { getMatchEntries } from './helpers/getMatchEntries'
51
51
  import { collectDeps } from './helpers/collectDeps'
52
52
  import type { DepEntry } from './helpers/collectDeps'
53
53
  import { canonToType, canonKey } from './helpers/canonType'
54
- import { OP_SUFFIX, opTypeName, opParams, opRequestShape, entityIdField, entityDataIdField, entityOps, entityPrimaryOp, pickExampleEntity, entityClassName } from './helpers/opShape'
55
- import { isReservedName, safeVarName } from './helpers/naming'
54
+ import { OP_SUFFIX, opTypeName, opParams, opRequestShape, entityIdField, entityDataIdField, entityOps, entityPrimaryOp, pickExampleEntity, entityClassName, entityTypeCollisions, warnEntityTypeCollisions } from './helpers/opShape'
55
+ import { isReservedName, safeVarName, exampleVarName, jsProp, jsOptProp, jsKey } from './helpers/naming'
56
56
  import {
57
57
  packageName,
58
58
  installCommand,
@@ -471,8 +471,14 @@ export {
471
471
  entityPrimaryOp,
472
472
  pickExampleEntity,
473
473
  entityClassName,
474
+ entityTypeCollisions,
475
+ warnEntityTypeCollisions,
474
476
  isReservedName,
475
477
  safeVarName,
478
+ exampleVarName,
479
+ jsProp,
480
+ jsOptProp,
481
+ jsKey,
476
482
 
477
483
  packageName,
478
484
  installCommand,
package/src/tsconfig.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "esModuleInterop": true,
4
+ "composite": true,
4
5
  "module": "nodenext",
5
6
  "noEmitOnError": true,
6
7
  "skipLibCheck": true,
@@ -10,6 +11,7 @@
10
11
  "sourceMap": true,
11
12
  "strict": true,
12
13
  "target": "es2021",
14
+ "types": ["node"],
13
15
  "declaration": true,
14
16
  "declarationDir": "../dist"
15
17
  }
@@ -1,11 +0,0 @@
1
- .{
2
- .name = "voxgig_sdk",
3
- .version = "0.0.1",
4
- .dependencies = .{},
5
- .paths = .{
6
- "src",
7
- "test",
8
- "build.zig",
9
- "build.zig.zon",
10
- },
11
- }