@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
@@ -0,0 +1,202 @@
1
+
2
+
3
+ // Typed-model generator (Scala target). Port of EntityTypes_java.ts /
4
+ // EntityTypes_py.ts.
5
+ //
6
+ // Reads main.<KIT>.entity.<e>.fields[] and per-op params
7
+ // (op.<name>.points[].args.params[]) and emits ONE file, core/<Name>Types.scala,
8
+ // holding an `object <Name>Types` with a nested `final case class` per active
9
+ // entity plus a request/match case class per active op.
10
+ //
11
+ // WHY A CONTAINER OBJECT: keeps the whole reference model in one file whatever
12
+ // the entity count and matches the java target's single-container layout
13
+ // (<Name>Types.java). Scala permits multiple top-level types per file, but a
14
+ // container object mirrors the JVM sibling and keeps the generated core/ dir
15
+ // tidy.
16
+ //
17
+ // TYPE CHOICE: reference `case class` types with BOXED (nullable) component
18
+ // types, NOT the wired runtime type. The generated ops take/return the loose
19
+ // object model (java.util.Map[String, Object] / Object), so these case classes
20
+ // are NOT wired into the op signatures — they are documentation/DX reference
21
+ // shapes a caller may use to describe a payload before converting it to a map.
22
+ // This mirrors the java target's reference records and the JS target's JSDoc
23
+ // typedefs (annotation only, no runtime effect). Emitting unused case classes
24
+ // is harmless — they compile and have no runtime effect.
25
+ //
26
+ // OPTIONAL FIELDS: every component is a boxed reference type, hence inherently
27
+ // nullable, so a `req:false` field/param needs no distinct rendering in Scala.
28
+ //
29
+ // Sentinels map to Scala types via the SHARED canonToType 'scala' column (the
30
+ // single source of truth per language — do not keep a local table here).
31
+ //
32
+ // Keep the SAME type-name scheme as every other language: <Name>,
33
+ // <Name>LoadMatch, <Name>ListMatch, <Name>CreateData, <Name>UpdateData,
34
+ // <Name>RemoveMatch (via the shared opTypeName helper).
35
+
36
+ import {
37
+ cmp, each, names,
38
+ File, Content,
39
+ } from '@voxgig/sdkgen'
40
+
41
+ import { canonToType, opTypeName, opRequestShape, warnEntityTypeCollisions } from '@voxgig/sdkgen'
42
+
43
+ import {
44
+ KIT,
45
+ getModelPath,
46
+ } from '@voxgig/apidef'
47
+
48
+ import { scalaPackage } from './utility_scala'
49
+
50
+
51
+ const LANG = 'scala'
52
+
53
+
54
+ // Scala reserved words that cannot be a case-class parameter name.
55
+ const SCALA_KEYWORDS = new Set<string>([
56
+ 'abstract', 'case', 'catch', 'class', 'def', 'do', 'else', 'enum', 'export',
57
+ 'extends', 'false', 'final', 'finally', 'for', 'forSome', 'given', 'if',
58
+ 'implicit', 'import', 'lazy', 'match', 'new', 'null', 'object', 'override',
59
+ 'package', 'private', 'protected', 'return', 'sealed', 'super', 'then',
60
+ 'this', 'throw', 'trait', 'true', 'try', 'type', 'val', 'var', 'while',
61
+ 'with', 'yield',
62
+ ])
63
+
64
+
65
+ // A field/param name that has a safe Scala identifier rendering. Names that are
66
+ // not valid identifiers (hyphens, leading digits) have no clean parameter form
67
+ // and are skipped — they remain reachable via the runtime map.
68
+ function scalaIdent(name: string): boolean {
69
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(name) && !SCALA_KEYWORDS.has(name)
70
+ }
71
+
72
+
73
+ // Emit a nested `final case class <typeName>(...)` from {name, type} items. An
74
+ // item whose name is not a legal identifier is skipped (WITH a warning — the
75
+ // key stays reachable via the runtime map, but its absence from the typed
76
+ // model should be visible, not silent); a duplicate component name (after the
77
+ // identifier filter) is dropped. An empty case class is a valid,
78
+ // zero-parameter shape.
79
+ function emitCaseClass(typeName: string, items: any[], log?: any): void {
80
+ const seen = new Set<string>()
81
+ const usable = items.filter((it: any) => {
82
+ if (!it || null == it.name) {
83
+ return false
84
+ }
85
+ if (!scalaIdent(it.name)) {
86
+ if (log && log.warn) {
87
+ log.warn({
88
+ point: 'entity-types-skip-field', typeName, field: it.name,
89
+ note: `scala: field "${it.name}" of ${typeName} has no legal ` +
90
+ `Scala identifier form; omitted from the typed model (still ` +
91
+ `reachable via the runtime map)`,
92
+ })
93
+ }
94
+ return false
95
+ }
96
+ if (seen.has(it.name)) {
97
+ return false
98
+ }
99
+ seen.add(it.name)
100
+ return true
101
+ })
102
+
103
+ if (0 === usable.length) {
104
+ Content(` final case class ${typeName}()
105
+
106
+ `)
107
+ return
108
+ }
109
+
110
+ const params = usable
111
+ .map((it: any) => `${it.name}: ${canonToType(it.type, LANG)}`)
112
+ .join(', ')
113
+ Content(` final case class ${typeName}(${params})
114
+
115
+ `)
116
+ }
117
+
118
+
119
+ const EntityTypes = cmp(function EntityTypes(props: any) {
120
+ const { model, log } = props.ctx$
121
+ const target = props.target || {}
122
+ const ext = target.ext || 'scala'
123
+
124
+ const scalapackage = props.scalapackage || scalaPackage(model)
125
+
126
+ // only_active:false — getModelPath DROPS active:false entries by default,
127
+ // but the consumer scaffold (create-sdkgen Root.ts) iterates the RAW entity
128
+ // collection, so inactive entities still get generated entity code that
129
+ // references these typed names. The typed model must cover them too.
130
+ const entity = getModelPath(model, `main.${KIT}.entity`, { only_active: false, required: false })
131
+ // Emit for EVERY entity that gets generated entity code: the consumer
132
+ // scaffold (create-sdkgen Root.ts) iterates entities WITHOUT an active
133
+ // filter, so inactive entities still get class files referencing these
134
+ // typed names. Filter on `name` (always present), NOT `active` — parity
135
+ // with the go emitter's fix.
136
+ const entityList = each(entity).filter((e: any) => e && null != e.name)
137
+ // Derive the PascalCase Name up-front — it is set LAZILY by names(), so an
138
+ // entity not yet named (e.g. a fieldless placeholder) would otherwise read
139
+ // `Name = undefined` below. Parity with the go/py/java/csharp emitter's fix.
140
+ entityList.forEach((e: any) => { if (null == e.Name) names(e, e.name) })
141
+
142
+ // Surface duplicate generated type names (two entities with the same
143
+ // PascalCase Name) — they would redeclare a type in statically-typed
144
+ // targets. Detection only; renaming is a model-level decision.
145
+ warnEntityTypeCollisions(entity, log, LANG)
146
+
147
+ File({ name: model.const.Name + 'Types.' + ext }, () => {
148
+
149
+ Content(`package ${scalapackage}.core
150
+
151
+ // Typed reference models for the ${model.const.Name} SDK.
152
+ //
153
+ // GENERATED from the API model: main.${KIT}.entity.<e>.fields[] and per-op
154
+ // params (op.<name>.points[].args.params[]). Field/param types come from the
155
+ // canonical type sentinels (source of truth: @voxgig/apidef VALID_CANON). Do
156
+ // not edit by hand.
157
+ //
158
+ // These case classes are documentation/DX reference shapes ONLY. The SDK ops
159
+ // take and return the loose object model (java.util.Map[String, Object] /
160
+ // Object) at runtime, so these types are not wired into the op signatures —
161
+ // use them to describe a payload before converting it to a map. Every
162
+ // component is a boxed (nullable) type, so an optional (req:false) key needs
163
+ // no distinct rendering.
164
+
165
+ object ${model.const.Name}Types {
166
+
167
+ `)
168
+
169
+ entityList.forEach((ent: any) => {
170
+ const Name = ent.Name
171
+ const fields = (ent.fields ? each(ent.fields) : [])
172
+ .filter((f: any) => f.active !== false)
173
+
174
+ // Entity data model: one component per field.
175
+ emitCaseClass(Name, fields.map((f: any) => ({
176
+ name: f.name, type: f.type,
177
+ })), log)
178
+
179
+ // Per active op: a request/match case class. Members come from the shared
180
+ // partiality policy (opRequestShape).
181
+ const ops = ent.op || {}
182
+ ;['load', 'list', 'create', 'update', 'remove'].forEach((opname: string) => {
183
+ if (null == ops[opname]) {
184
+ return
185
+ }
186
+
187
+ const typeName = opTypeName(Name, opname)
188
+ const { items } = opRequestShape(ent, opname)
189
+
190
+ emitCaseClass(typeName, items, log)
191
+ })
192
+ })
193
+
194
+ Content(`}
195
+ `)
196
+ })
197
+ })
198
+
199
+
200
+ export {
201
+ EntityTypes,
202
+ }
@@ -23,6 +23,7 @@ import { Config } from './Config_scala'
23
23
  import { Gitignore } from './Gitignore_scala'
24
24
  import { MainEntity } from './MainEntity_scala'
25
25
  import { EntityBase } from './EntityBase_scala'
26
+ import { EntityTypes } from './EntityTypes_scala'
26
27
  import { scalaPackage } from './utility_scala'
27
28
 
28
29
 
@@ -83,6 +84,11 @@ const Main = cmp(async function Main(props: any) {
83
84
  })
84
85
 
85
86
  Config({ target })
87
+
88
+ // Generate the typed reference-model file (<Name>Types.scala) beside the
89
+ // other generated core files. Documentation/DX shapes only — not wired
90
+ // into the loose-object-model op signatures.
91
+ EntityTypes({ target, scalapackage })
86
92
  })
87
93
 
88
94
  })
@@ -0,0 +1,175 @@
1
+
2
+ import { cmp, each, Content, canonToType, canonKey, entityIdField, opRequestShape } from '@voxgig/sdkgen'
3
+
4
+ import {
5
+ KIT,
6
+ getModelPath,
7
+ } from '@voxgig/apidef'
8
+
9
+ import { scalaVarName } from './utility_scala'
10
+
11
+
12
+ // Type names come from the shared canonToType 'scala' column (single source of truth).
13
+
14
+ // A type-correct Scala literal for a field's canonical type.
15
+ function scalaLit(type: any, placeholder: string = 'example'): string {
16
+ const k = canonKey(type)
17
+ if ('INTEGER' === k) return '1L'
18
+ if ('NUMBER' === k) return '1.0'
19
+ if ('BOOLEAN' === k) return 'true'
20
+ if ('ARRAY' === k) return 'java.util.List.of()'
21
+ if ('OBJECT' === k) return 'java.util.Map.of()'
22
+ return `"${placeholder}"`
23
+ }
24
+
25
+
26
+ // Operation method spelling for Scala: camelCase methods over the loose object
27
+ // model. The op descriptions are language-agnostic.
28
+ const OP_DESC: Record<string, { method: string, desc: string }> = {
29
+ load: { method: 'load(match, null)', desc: 'Load a single entity by match criteria.' },
30
+ list: { method: 'list(null, null)', desc: 'List entities, optionally matching the given criteria.' },
31
+ create: { method: 'create(data, null)', desc: 'Create a new entity with the given data.' },
32
+ update: { method: 'update(data, null)', desc: 'Update an existing entity.' },
33
+ remove: { method: 'remove(match, null)', desc: 'Remove the matching entity.' },
34
+ }
35
+
36
+
37
+ const ReadmeEntity = cmp(function ReadmeEntity(props: any) {
38
+ const { target } = props
39
+ const { model } = props.ctx$
40
+
41
+ const entity = getModelPath(model, `main.${KIT}.entity`)
42
+
43
+ const publishedEntities = each(entity)
44
+ .filter((entity: any) => entity.active !== false)
45
+
46
+ if (0 === publishedEntities.length) {
47
+ return
48
+ }
49
+
50
+ Content(`
51
+
52
+ ## Entities
53
+
54
+ `)
55
+
56
+ publishedEntities.map((entity: any) => {
57
+ const opnames = Object.keys(entity.op || {})
58
+ const fields = entity.fields || []
59
+ // Model-driven id key: null when this entity has no id-like field.
60
+ const idF = entityIdField(entity)
61
+ // Sanitise the local variable name — a camelCased Scala keyword gets a
62
+ // trailing underscore (scalaVarName) so the snippet compiles.
63
+ const eVar = scalaVarName(entity.name)
64
+ const accessor = scalaVarName(entity.name)
65
+
66
+ Content(`
67
+ ### ${entity.Name}
68
+
69
+ `)
70
+
71
+ if (entity.short) {
72
+ Content(`${entity.short}
73
+
74
+ `)
75
+ }
76
+
77
+ Content(`Create an instance: \`val ${eVar} = client.${accessor}(null)\`
78
+
79
+ `)
80
+
81
+ if (opnames.length > 0) {
82
+ Content(`#### Operations
83
+
84
+ | Method | Description |
85
+ | --- | --- |
86
+ `)
87
+ opnames.map((opname: string) => {
88
+ const info = OP_DESC[opname]
89
+ if (info) {
90
+ Content(`| \`${info.method}\` | ${info.desc} |
91
+ `)
92
+ }
93
+ })
94
+
95
+ Content(`
96
+ `)
97
+ }
98
+
99
+ if (fields.length > 0) {
100
+ Content(`#### Fields
101
+
102
+ | Field | Type | Description |
103
+ | --- | --- | --- |
104
+ `)
105
+
106
+ each(fields, (field: any) => {
107
+ const desc = field.short || ''
108
+ Content(`| \`${field.name}\` | \`${canonToType(field.type, target.name)}\` | ${desc} |
109
+ `)
110
+ })
111
+
112
+ Content(`
113
+ `)
114
+ }
115
+
116
+ if (opnames.includes('load')) {
117
+ // The id key plus every REQUIRED match key (parent path params like
118
+ // page_id) — the same shape the runtime resolves path params from, so
119
+ // the example always works.
120
+ const loadItems = opRequestShape(entity, 'load').items
121
+ .filter((it: any) => !it.optional || it.name === idF)
122
+ .sort((a: any, b: any) =>
123
+ (a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
124
+ const loadArg = 0 < loadItems.length
125
+ ? `java.util.Map.of(${loadItems.map((it: any) =>
126
+ `"${it.name}", ${scalaLit(it.type,
127
+ it.name === idF ? entity.name + '_id' : it.name)}`).join(', ')})`
128
+ : 'null'
129
+ Content(`#### Example: Load
130
+
131
+ \`\`\`scala
132
+ val ${eVar} = client.${accessor}(null).load(${loadArg}, null)
133
+ \`\`\`
134
+
135
+ `)
136
+ }
137
+
138
+ if (opnames.includes('list')) {
139
+ Content(`#### Example: List
140
+
141
+ \`\`\`scala
142
+ val ${eVar}List = client.${accessor}(null).list(null, null)
143
+ \`\`\`
144
+
145
+ `)
146
+ }
147
+
148
+ if (opnames.includes('create')) {
149
+ // Members come from the SAME shape the runtime validates
150
+ // (opRequestShape): every required member must appear — including a
151
+ // required id and parent keys like page_id — with a real literal.
152
+ const createItems = opRequestShape(entity, 'create').items
153
+ .filter((it: any) => !it.optional)
154
+ Content(`#### Example: Create
155
+
156
+ \`\`\`scala
157
+ val ${eVar} = client.${accessor}(null).create(java.util.Map.of(
158
+ `)
159
+ createItems.map((it: any, i: number) => {
160
+ const comma = i < createItems.length - 1 ? ',' : ''
161
+ Content(` "${it.name}", ${scalaLit(it.type, 'example_' + it.name)}${comma} // ${canonToType(it.type, target.name)}
162
+ `)
163
+ })
164
+ Content(`), null)
165
+ \`\`\`
166
+
167
+ `)
168
+ }
169
+ })
170
+ })
171
+
172
+
173
+ export {
174
+ ReadmeEntity
175
+ }
@@ -0,0 +1,163 @@
1
+
2
+ import { cmp, File, Content } from '@voxgig/sdkgen'
3
+
4
+
5
+ // Emits sdktest/ReadmeExamplesTest.scala — a PRESENCE + STRUCTURE gate over
6
+ // every scala fenced block in the repository ROOT README.md, the per-language
7
+ // scala/README.md, AND the per-language scala/REFERENCE.md. It is a
8
+ // default-package scala-cli object exposing run(rep) and is driven by the
9
+ // generated SdkEntityTestMain aggregator (mirrors the generated per-entity
10
+ // test objects).
11
+ //
12
+ // SCOPE NOTE (deliberate, documented): the Python/TS/Go equivalents EXECUTE and
13
+ // type-check every documented block. That is infeasible here — the generated
14
+ // Scala SDK compiles with scala-cli only (no in-process Scala compiler wired
15
+ // into the test runtime), so a test cannot compile-and-run arbitrary doc
16
+ // snippets at test time. This gate therefore guarantees the weaker-but-real
17
+ // invariant that keeps the docs honest as the generator evolves:
18
+ // 1. every doc exists and contains at least one scala block (nothing was
19
+ // dropped);
20
+ // 2. every scala block is structurally well-formed — its braces, parentheses
21
+ // and brackets balance (catches a truncated or malformed generated
22
+ // snippet).
23
+ // A per-doc summary line makes the coverage visible in the test output.
24
+ //
25
+ // The emitted Scala is written WITHOUT literal backticks (the fence marker is
26
+ // built at runtime as 96.toChar.toString.repeat(3)) so this TS template literal
27
+ // stays clean.
28
+ const ReadmeExamplesTest = cmp(function ReadmeExamplesTest(props: any) {
29
+ const { target, ctx$: { model } } = props
30
+
31
+ const Name = model.const.Name
32
+
33
+ File({ name: 'ReadmeExamplesTest.' + target.ext }, () => {
34
+ Content(`// ${Name} SDK — documentation scala-examples PRESENCE + STRUCTURE gate.
35
+ //
36
+ // GUARANTEE (see ReadmeExamplesTest_scala.ts for why this is a structure gate
37
+ // and not an execute gate): every scala example in the docs is accounted for.
38
+ // A dependency-free scala-cli test object (default package, driven by
39
+ // SdkEntityTestMain) over every scala fenced code block in three documents:
40
+ // - the repository ROOT README.md (one directory above the scala module),
41
+ // - the per-language scala/README.md,
42
+ // - the per-language scala/REFERENCE.md.
43
+ //
44
+ // Checks, PER DOCUMENT:
45
+ // 1. PRESENCE: the doc exists and holds at least one scala block.
46
+ // 2. STRUCTURE: every scala block's braces / parens / brackets balance, so a
47
+ // truncated or malformed generated snippet fails loudly.
48
+ //
49
+ // GENERATED by @voxgig/sdkgen — do not edit by hand.
50
+
51
+ import java.nio.file.{Files, Path, Paths}
52
+
53
+ object ReadmeExamplesTest {
54
+
55
+ // The three documents to scan, resolved relative to the scala module
56
+ // directory (the working directory when scala-cli runs the tests). Each row
57
+ // is {label, relative path}.
58
+ private def docs(): Array[Array[String]] = Array(
59
+ Array("root README", ".." + java.io.File.separator + "README.md"),
60
+ Array("scala README.md", "README.md"),
61
+ Array("scala REFERENCE.md", "REFERENCE.md")
62
+ )
63
+
64
+ // Extract every scala fenced block. Split on the triple-backtick fence:
65
+ // odd-indexed segments are the inside of a fenced block (info string on the
66
+ // first line, then the code). Only blocks whose info string is exactly
67
+ // "scala" are returned.
68
+ private def scalaBlocks(text: String): java.util.List[String] = {
69
+ val fence = 96.toChar.toString.repeat(3)
70
+ val parts = text.split(java.util.regex.Pattern.quote(fence), -1)
71
+ val blocks = new java.util.ArrayList[String]()
72
+ var i = 1
73
+ while (i < parts.length) {
74
+ val seg = parts(i)
75
+ val nl = seg.indexOf('\\n')
76
+ val info = (if (nl < 0) seg else seg.substring(0, nl)).trim()
77
+ if (info == "scala") {
78
+ blocks.add(if (nl < 0) "" else seg.substring(nl + 1))
79
+ }
80
+ i += 2
81
+ }
82
+ blocks
83
+ }
84
+
85
+ private def readDoc(path: Path): String =
86
+ new String(Files.readAllBytes(path), "UTF-8")
87
+
88
+ // True when every open/close delimiter balances (ignores the subtlety of
89
+ // delimiters inside string literals — a generated snippet never nests an
90
+ // unbalanced delimiter in a string, and this catches truncation).
91
+ private def balanced(block: String): Boolean = {
92
+ val stack = new java.util.ArrayDeque[Character]()
93
+ var i = 0
94
+ while (i < block.length) {
95
+ val ch = block.charAt(i)
96
+ ch match {
97
+ case '(' => stack.push(')')
98
+ case '[' => stack.push(']')
99
+ case '{' => stack.push('}')
100
+ case ')' | ']' | '}' =>
101
+ if (stack.isEmpty || stack.pop().charValue() != ch) return false
102
+ case _ =>
103
+ }
104
+ i += 1
105
+ }
106
+ stack.isEmpty
107
+ }
108
+
109
+ def run(rep: SdkTestReport): Unit = {
110
+ val ds = docs()
111
+
112
+ // PRESENCE: each doc exists and holds at least one scala block.
113
+ var di = 0
114
+ while (di < ds.length) {
115
+ val label = ds(di)(0)
116
+ val rel = ds(di)(1)
117
+ rep.scope("readme-examples.presence." + label) {
118
+ val path = Paths.get(rel)
119
+ rep.check("readme-examples.presence." + label + ".exists",
120
+ Files.exists(path), label + " not found: " + path)
121
+ if (Files.exists(path)) {
122
+ val blocks = scalaBlocks(readDoc(path))
123
+ rep.check("readme-examples.presence." + label, blocks.size() > 0,
124
+ "expected at least one scala block in " + label)
125
+ }
126
+ }
127
+ di += 1
128
+ }
129
+
130
+ // STRUCTURE: every scala block's delimiters balance.
131
+ rep.scope("readme-examples.structure") {
132
+ val failures = new java.util.ArrayList[String]()
133
+ var dj = 0
134
+ while (dj < ds.length) {
135
+ val label = ds(dj)(0)
136
+ val path = Paths.get(ds(dj)(1))
137
+ if (Files.exists(path)) {
138
+ val blocks = scalaBlocks(readDoc(path))
139
+ var balancedCount = 0
140
+ var bi = 0
141
+ while (bi < blocks.size()) {
142
+ if (balanced(blocks.get(bi))) balancedCount += 1
143
+ else failures.add(label + " scala block #" + bi + " has unbalanced delimiters")
144
+ bi += 1
145
+ }
146
+ println("[readme-examples] " + label + " scala blocks: total=" +
147
+ blocks.size() + " balanced=" + balancedCount)
148
+ }
149
+ dj += 1
150
+ }
151
+ rep.check("readme-examples.structure", failures.isEmpty(),
152
+ String.join("; ", failures))
153
+ }
154
+ }
155
+ }
156
+ `)
157
+ })
158
+ })
159
+
160
+
161
+ export {
162
+ ReadmeExamplesTest
163
+ }
@@ -0,0 +1,49 @@
1
+
2
+ import { cmp, Content } from '@voxgig/sdkgen'
3
+
4
+ import { scalaPackage } from './utility_scala'
5
+
6
+
7
+ const ReadmeExplanation = cmp(function ReadmeExplanation(props: any) {
8
+ const { target, ctx$: { model } } = props
9
+
10
+ const pkg = scalaPackage(model)
11
+
12
+ Content(`### Data as maps
13
+
14
+ The Scala SDK uses a loose object model — \`java.util.Map[String, Object]\`
15
+ throughout — rather than a bespoke typed class per endpoint. This mirrors the
16
+ dynamic nature of the API and keeps the SDK flexible: no regeneration is
17
+ needed when the API schema changes.
18
+
19
+ Use \`Helpers.toMapAny(value)\` to safely coerce a value to a
20
+ \`java.util.Map[String, Object]\`. A \`${model.const.Name}Types.scala\` module of
21
+ reference \`case class\` types is also generated for editor documentation.
22
+
23
+ ### Project structure
24
+
25
+ \`\`\`
26
+ scala/
27
+ ├── project.scala -- scala-cli project config (Scala 3, no deps)
28
+ ├── core/ -- Main SDK client, config, entity base, error type
29
+ ├── entity/ -- Entity implementations
30
+ ├── feature/ -- Built-in features (Base, Test, Log, ...)
31
+ ├── utility/ -- Utility functions and the vendored struct library
32
+ └── sdktest/ -- Generated per-entity tests (scala-cli mains)
33
+ \`\`\`
34
+
35
+ The main client class (\`${model.const.Name}SDK\`, package \`${pkg}.core\`)
36
+ exposes the entity accessors. Reference entity or utility types directly only
37
+ when needed. The SDK is a dependency-free scala-cli project: JSON parsing is
38
+ the vendored \`utility/Json.java\`, HTTP transport is the JDK
39
+ \`java.net.http.HttpClient\`, and the struct library is inlined under
40
+ \`utility/struct\`.
41
+
42
+ `)
43
+
44
+ })
45
+
46
+
47
+ export {
48
+ ReadmeExplanation
49
+ }