@voxgig/sdkgen 1.2.1 → 1.3.1

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 (329) hide show
  1. package/bin/voxgig-sdkgen +2 -2
  2. package/dist/action/action.d.ts +2 -1
  3. package/dist/action/action.js +15 -9
  4. package/dist/action/action.js.map +1 -1
  5. package/dist/action/feature.js +6 -3
  6. package/dist/action/feature.js.map +1 -1
  7. package/dist/action/target.d.ts +7 -1
  8. package/dist/action/target.js +13 -6
  9. package/dist/action/target.js.map +1 -1
  10. package/dist/cmp/Changelog.d.ts +2 -0
  11. package/dist/cmp/Changelog.js +30 -0
  12. package/dist/cmp/Changelog.js.map +1 -0
  13. package/dist/cmp/Deploy.d.ts +2 -0
  14. package/dist/cmp/Deploy.js +227 -0
  15. package/dist/cmp/Deploy.js.map +1 -0
  16. package/dist/cmp/FeatureHook.js +5 -6
  17. package/dist/cmp/FeatureHook.js.map +1 -1
  18. package/dist/cmp/License.d.ts +2 -0
  19. package/dist/cmp/License.js +44 -0
  20. package/dist/cmp/License.js.map +1 -0
  21. package/dist/cmp/Readme.js +2 -0
  22. package/dist/cmp/Readme.js.map +1 -1
  23. package/dist/cmp/ReadmeErrors.d.ts +2 -0
  24. package/dist/cmp/ReadmeErrors.js +210 -0
  25. package/dist/cmp/ReadmeErrors.js.map +1 -0
  26. package/dist/cmp/ReadmeExplanation.js +213 -223
  27. package/dist/cmp/ReadmeExplanation.js.map +1 -1
  28. package/dist/cmp/ReadmeModel.js +6 -1
  29. package/dist/cmp/ReadmeModel.js.map +1 -1
  30. package/dist/cmp/ReadmeTop.js +389 -82
  31. package/dist/cmp/ReadmeTop.js.map +1 -1
  32. package/dist/cmp/Security.d.ts +2 -0
  33. package/dist/cmp/Security.js +36 -0
  34. package/dist/cmp/Security.js.map +1 -0
  35. package/dist/helpers/canonType.d.ts +7 -0
  36. package/dist/helpers/canonType.js +74 -0
  37. package/dist/helpers/canonType.js.map +1 -0
  38. package/dist/helpers/collectDeps.d.ts +3 -2
  39. package/dist/helpers/collectDeps.js.map +1 -1
  40. package/dist/helpers/naming.d.ts +3 -0
  41. package/dist/helpers/naming.js +51 -0
  42. package/dist/helpers/naming.js.map +1 -0
  43. package/dist/helpers/opExample.d.ts +13 -0
  44. package/dist/helpers/opExample.js +149 -0
  45. package/dist/helpers/opExample.js.map +1 -0
  46. package/dist/helpers/opShape.d.ts +18 -0
  47. package/dist/helpers/opShape.js +193 -0
  48. package/dist/helpers/opShape.js.map +1 -0
  49. package/dist/helpers/packageMeta.d.ts +27 -0
  50. package/dist/helpers/packageMeta.js +224 -0
  51. package/dist/helpers/packageMeta.js.map +1 -0
  52. package/dist/sdkgen.d.ts +11 -1
  53. package/dist/sdkgen.js +57 -18
  54. package/dist/sdkgen.js.map +1 -1
  55. package/dist/tsconfig.tsbuildinfo +1 -1
  56. package/dist/types.d.ts +65 -2
  57. package/dist/types.js.map +1 -1
  58. package/dist/utility.js +20 -11
  59. package/dist/utility.js.map +1 -1
  60. package/model/sdkgen.aontu +137 -0
  61. package/package.json +11 -5
  62. package/project/.sdk/model/target/go-cli.jsonic +47 -0
  63. package/project/.sdk/model/target/go-mcp.jsonic +41 -0
  64. package/project/.sdk/model/target/go.jsonic +9 -3
  65. package/project/.sdk/model/target/js.jsonic +13 -0
  66. package/project/.sdk/model/target/lua.jsonic +13 -0
  67. package/project/.sdk/model/target/php.jsonic +13 -0
  68. package/project/.sdk/model/target/py.jsonic +13 -0
  69. package/project/.sdk/model/target/rb.jsonic +13 -0
  70. package/project/.sdk/model/target/ts.jsonic +13 -0
  71. package/project/.sdk/src/cmp/go/EntityOperation_go.ts +1 -0
  72. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +197 -0
  73. package/project/.sdk/src/cmp/go/Entity_go.ts +2 -1
  74. package/project/.sdk/src/cmp/go/MainEntity_go.ts +6 -0
  75. package/project/.sdk/src/cmp/go/Main_go.ts +23 -3
  76. package/project/.sdk/src/cmp/go/Package_go.ts +1 -1
  77. package/project/.sdk/src/cmp/go/ReadmeEntity_go.ts +18 -6
  78. package/project/.sdk/src/cmp/go/ReadmeExamplesTest_go.ts +684 -0
  79. package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +1 -1
  80. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +48 -8
  81. package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +11 -6
  82. package/project/.sdk/src/cmp/go/ReadmeIntro_go.ts +40 -1
  83. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +63 -17
  84. package/project/.sdk/src/cmp/go/ReadmeOptions_go.ts +4 -3
  85. package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +124 -115
  86. package/project/.sdk/src/cmp/go/ReadmeRef_go.ts +28 -15
  87. package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +33 -9
  88. package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +35 -5
  89. package/project/.sdk/src/cmp/go/TestEntity_go.ts +1 -1
  90. package/project/.sdk/src/cmp/go/Test_go.ts +5 -1
  91. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +21 -0
  92. package/project/.sdk/src/cmp/go/fragment/EntityCreateOp.fragment.go +11 -0
  93. package/project/.sdk/src/cmp/go/fragment/EntityListOp.fragment.go +11 -0
  94. package/project/.sdk/src/cmp/go/fragment/EntityLoadOp.fragment.go +11 -0
  95. package/project/.sdk/src/cmp/go/fragment/EntityRemoveOp.fragment.go +11 -0
  96. package/project/.sdk/src/cmp/go/fragment/EntityUpdateOp.fragment.go +11 -0
  97. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +195 -0
  98. package/project/.sdk/src/cmp/go-cli/fragment/main.fragment.go +106 -0
  99. package/project/.sdk/src/cmp/go-cli/fragment/words.fragment.go +132 -0
  100. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +184 -0
  101. package/project/.sdk/src/cmp/go-mcp/fragment/main.fragment.go +68 -0
  102. package/project/.sdk/src/cmp/go-mcp/fragment/tools.fragment.go +114 -0
  103. package/project/.sdk/src/cmp/js/EntityTypes_js.ts +111 -0
  104. package/project/.sdk/src/cmp/js/MainEntity_js.ts +1 -0
  105. package/project/.sdk/src/cmp/js/Main_js.ts +3 -0
  106. package/project/.sdk/src/cmp/js/Package_js.ts +16 -7
  107. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -7
  108. package/project/.sdk/src/cmp/js/ReadmeExplanation_js.ts +2 -2
  109. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +52 -11
  110. package/project/.sdk/src/cmp/js/ReadmeIntro_js.ts +39 -1
  111. package/project/.sdk/src/cmp/js/ReadmeModel_js.ts +50 -18
  112. package/project/.sdk/src/cmp/js/ReadmeOptions_js.ts +4 -3
  113. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +45 -19
  114. package/project/.sdk/src/cmp/js/ReadmeRef_js.ts +24 -13
  115. package/project/.sdk/src/cmp/js/ReadmeTopHowto_js.ts +3 -0
  116. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +28 -12
  117. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +23 -3
  118. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +5 -0
  119. package/project/.sdk/src/cmp/js/fragment/EntityListOp.fragment.js +5 -0
  120. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +5 -0
  121. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +5 -0
  122. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +5 -0
  123. package/project/.sdk/src/cmp/js/utility_js.ts +57 -0
  124. package/project/.sdk/src/cmp/lua/EntityTypes_lua.ts +113 -0
  125. package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +8 -0
  126. package/project/.sdk/src/cmp/lua/Main_lua.ts +4 -0
  127. package/project/.sdk/src/cmp/lua/Package_lua.ts +23 -4
  128. package/project/.sdk/src/cmp/lua/ReadmeEntity_lua.ts +12 -10
  129. package/project/.sdk/src/cmp/lua/ReadmeExamplesTest_lua.ts +293 -0
  130. package/project/.sdk/src/cmp/lua/ReadmeHowto_lua.ts +46 -8
  131. package/project/.sdk/src/cmp/lua/ReadmeInstall_lua.ts +19 -3
  132. package/project/.sdk/src/cmp/lua/ReadmeIntro_lua.ts +38 -1
  133. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +51 -16
  134. package/project/.sdk/src/cmp/lua/ReadmeOptions_lua.ts +4 -3
  135. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +79 -18
  136. package/project/.sdk/src/cmp/lua/ReadmeRef_lua.ts +25 -20
  137. package/project/.sdk/src/cmp/lua/ReadmeTopQuick_lua.ts +17 -9
  138. package/project/.sdk/src/cmp/lua/ReadmeTopTest_lua.ts +32 -5
  139. package/project/.sdk/src/cmp/lua/Test_lua.ts +4 -0
  140. package/project/.sdk/src/cmp/lua/fragment/EntityCreateOp.fragment.lua +4 -0
  141. package/project/.sdk/src/cmp/lua/fragment/EntityListOp.fragment.lua +4 -0
  142. package/project/.sdk/src/cmp/lua/fragment/EntityLoadOp.fragment.lua +4 -0
  143. package/project/.sdk/src/cmp/lua/fragment/EntityRemoveOp.fragment.lua +4 -0
  144. package/project/.sdk/src/cmp/lua/fragment/EntityUpdateOp.fragment.lua +4 -0
  145. package/project/.sdk/src/cmp/php/EntityTypes_php.ts +142 -0
  146. package/project/.sdk/src/cmp/php/MainEntity_php.ts +18 -1
  147. package/project/.sdk/src/cmp/php/Main_php.ts +4 -0
  148. package/project/.sdk/src/cmp/php/Package_php.ts +18 -7
  149. package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +15 -11
  150. package/project/.sdk/src/cmp/php/ReadmeExamplesTest_php.ts +401 -0
  151. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +56 -13
  152. package/project/.sdk/src/cmp/php/ReadmeInstall_php.ts +15 -3
  153. package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +40 -1
  154. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +26 -8
  155. package/project/.sdk/src/cmp/php/ReadmeOptions_php.ts +4 -3
  156. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +80 -22
  157. package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +51 -42
  158. package/project/.sdk/src/cmp/php/ReadmeTopHowto_php.ts +1 -1
  159. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +19 -11
  160. package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +41 -11
  161. package/project/.sdk/src/cmp/php/TestDirect_php.ts +9 -9
  162. package/project/.sdk/src/cmp/php/TestEntity_php.ts +6 -12
  163. package/project/.sdk/src/cmp/php/Test_php.ts +4 -0
  164. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +13 -1
  165. package/project/.sdk/src/cmp/php/fragment/EntityCreateOp.fragment.php +10 -1
  166. package/project/.sdk/src/cmp/php/fragment/EntityListOp.fragment.php +10 -1
  167. package/project/.sdk/src/cmp/php/fragment/EntityLoadOp.fragment.php +10 -1
  168. package/project/.sdk/src/cmp/php/fragment/EntityRemoveOp.fragment.php +10 -1
  169. package/project/.sdk/src/cmp/php/fragment/EntityUpdateOp.fragment.php +10 -1
  170. package/project/.sdk/src/cmp/php/fragment/Main.fragment.php +22 -14
  171. package/project/.sdk/src/cmp/py/EntityTypes_py.ts +184 -0
  172. package/project/.sdk/src/cmp/py/Entity_py.ts +27 -0
  173. package/project/.sdk/src/cmp/py/MainEntity_py.ts +2 -1
  174. package/project/.sdk/src/cmp/py/Main_py.ts +35 -0
  175. package/project/.sdk/src/cmp/py/Package_py.ts +24 -3
  176. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +27 -11
  177. package/project/.sdk/src/cmp/py/ReadmeExamplesTest_py.ts +626 -0
  178. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +53 -14
  179. package/project/.sdk/src/cmp/py/ReadmeInstall_py.ts +19 -3
  180. package/project/.sdk/src/cmp/py/ReadmeIntro_py.ts +48 -1
  181. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +28 -10
  182. package/project/.sdk/src/cmp/py/ReadmeOptions_py.ts +4 -3
  183. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +73 -24
  184. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +57 -37
  185. package/project/.sdk/src/cmp/py/ReadmeTopHowto_py.ts +1 -1
  186. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +19 -11
  187. package/project/.sdk/src/cmp/py/ReadmeTopTest_py.ts +30 -5
  188. package/project/.sdk/src/cmp/py/TestDirect_py.ts +7 -9
  189. package/project/.sdk/src/cmp/py/TestEntity_py.ts +6 -14
  190. package/project/.sdk/src/cmp/py/Test_py.ts +4 -0
  191. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +5 -2
  192. package/project/.sdk/src/cmp/py/fragment/EntityCreateOp.fragment.py +1 -1
  193. package/project/.sdk/src/cmp/py/fragment/EntityListOp.fragment.py +5 -1
  194. package/project/.sdk/src/cmp/py/fragment/EntityLoadOp.fragment.py +6 -1
  195. package/project/.sdk/src/cmp/py/fragment/EntityRemoveOp.fragment.py +6 -1
  196. package/project/.sdk/src/cmp/py/fragment/EntityUpdateOp.fragment.py +1 -1
  197. package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +17 -10
  198. package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +136 -0
  199. package/project/.sdk/src/cmp/rb/MainEntity_rb.ts +1 -0
  200. package/project/.sdk/src/cmp/rb/Main_rb.ts +4 -0
  201. package/project/.sdk/src/cmp/rb/Package_rb.ts +34 -7
  202. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +26 -10
  203. package/project/.sdk/src/cmp/rb/ReadmeExamplesTest_rb.ts +289 -0
  204. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +72 -21
  205. package/project/.sdk/src/cmp/rb/ReadmeInstall_rb.ts +16 -4
  206. package/project/.sdk/src/cmp/rb/ReadmeIntro_rb.ts +40 -1
  207. package/project/.sdk/src/cmp/rb/ReadmeModel_rb.ts +29 -12
  208. package/project/.sdk/src/cmp/rb/ReadmeOptions_rb.ts +4 -3
  209. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +85 -22
  210. package/project/.sdk/src/cmp/rb/ReadmeRef_rb.ts +56 -37
  211. package/project/.sdk/src/cmp/rb/ReadmeTopHowto_rb.ts +1 -1
  212. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +19 -11
  213. package/project/.sdk/src/cmp/rb/ReadmeTopTest_rb.ts +43 -11
  214. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +9 -9
  215. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +6 -12
  216. package/project/.sdk/src/cmp/rb/Test_rb.ts +4 -0
  217. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +2 -0
  218. package/project/.sdk/src/cmp/rb/fragment/EntityCreateOp.fragment.rb +5 -0
  219. package/project/.sdk/src/cmp/rb/fragment/EntityListOp.fragment.rb +20 -2
  220. package/project/.sdk/src/cmp/rb/fragment/EntityLoadOp.fragment.rb +8 -1
  221. package/project/.sdk/src/cmp/rb/fragment/EntityRemoveOp.fragment.rb +6 -1
  222. package/project/.sdk/src/cmp/rb/fragment/EntityUpdateOp.fragment.rb +5 -0
  223. package/project/.sdk/src/cmp/rb/fragment/Main.fragment.rb +24 -8
  224. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +105 -0
  225. package/project/.sdk/src/cmp/ts/Entity_ts.ts +17 -1
  226. package/project/.sdk/src/cmp/ts/MainEntity_ts.ts +1 -0
  227. package/project/.sdk/src/cmp/ts/Main_ts.ts +6 -0
  228. package/project/.sdk/src/cmp/ts/Package_ts.ts +14 -7
  229. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -7
  230. package/project/.sdk/src/cmp/ts/ReadmeExampleTest_ts.ts +81 -0
  231. package/project/.sdk/src/cmp/ts/ReadmeExamplesTest_ts.ts +446 -0
  232. package/project/.sdk/src/cmp/ts/ReadmeExplanation_ts.ts +2 -2
  233. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +57 -11
  234. package/project/.sdk/src/cmp/ts/ReadmeInstall_ts.ts +19 -6
  235. package/project/.sdk/src/cmp/ts/ReadmeIntro_ts.ts +39 -1
  236. package/project/.sdk/src/cmp/ts/ReadmeModel_ts.ts +50 -18
  237. package/project/.sdk/src/cmp/ts/ReadmeOptions_ts.ts +4 -3
  238. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +95 -40
  239. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +24 -13
  240. package/project/.sdk/src/cmp/ts/ReadmeTopHowto_ts.ts +3 -0
  241. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +44 -12
  242. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +23 -3
  243. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +2 -2
  244. package/project/.sdk/src/cmp/ts/Test_ts.ts +5 -0
  245. package/project/.sdk/src/cmp/ts/fragment/Entity.fragment.ts +3 -1
  246. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +10 -5
  247. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +4 -2
  248. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +4 -2
  249. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +4 -2
  250. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +4 -2
  251. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +4 -2
  252. package/project/.sdk/src/cmp/ts/utility_ts.ts +59 -0
  253. package/project/.sdk/tm/go/LICENSE +1 -1
  254. package/project/.sdk/tm/go/Makefile +36 -1
  255. package/project/.sdk/tm/go/VERSION +1 -0
  256. package/project/.sdk/tm/go/core/context.go +12 -7
  257. package/project/.sdk/tm/go-cli/src/feature/README.md +6 -0
  258. package/project/.sdk/tm/go-cli/src/feature/base/.gitkeep +0 -0
  259. package/project/.sdk/tm/go-cli/src/feature/log/.gitkeep +0 -0
  260. package/project/.sdk/tm/go-cli/src/feature/test/.gitkeep +0 -0
  261. package/project/.sdk/tm/go-mcp/src/feature/README.md +6 -0
  262. package/project/.sdk/tm/go-mcp/src/feature/base/.gitkeep +0 -0
  263. package/project/.sdk/tm/go-mcp/src/feature/log/.gitkeep +0 -0
  264. package/project/.sdk/tm/go-mcp/src/feature/test/.gitkeep +0 -0
  265. package/project/.sdk/tm/js/LICENSE +1 -1
  266. package/project/.sdk/tm/js/Makefile +41 -0
  267. package/project/.sdk/tm/lua/LICENSE +1 -1
  268. package/project/.sdk/tm/lua/Makefile +40 -1
  269. package/project/.sdk/tm/lua/core/context.lua +13 -8
  270. package/project/.sdk/tm/php/LICENSE +1 -1
  271. package/project/.sdk/tm/php/Makefile +31 -1
  272. package/project/.sdk/tm/php/VERSION +1 -0
  273. package/project/.sdk/tm/php/core/Context.php +12 -6
  274. package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +13 -4
  275. package/project/.sdk/tm/php/utility/Done.php +2 -2
  276. package/project/.sdk/tm/php/utility/MakeError.php +3 -3
  277. package/project/.sdk/tm/py/LICENSE +1 -1
  278. package/project/.sdk/tm/py/Makefile +34 -1
  279. package/project/.sdk/tm/py/core/context.py +12 -7
  280. package/project/.sdk/tm/py/test/test_primary_utility.py +15 -4
  281. package/project/.sdk/tm/py/utility/done.py +3 -1
  282. package/project/.sdk/tm/py/utility/make_error.py +2 -2
  283. package/project/.sdk/tm/rb/LICENSE +1 -1
  284. package/project/.sdk/tm/rb/Makefile +33 -1
  285. package/project/.sdk/tm/rb/core/context.rb +8 -3
  286. package/project/.sdk/tm/rb/test/primary_utility_test.rb +2 -2
  287. package/project/.sdk/tm/rb/utility/done.rb +3 -1
  288. package/project/.sdk/tm/rb/utility/make_error.rb +5 -2
  289. package/project/.sdk/tm/ts/LICENSE +1 -1
  290. package/project/.sdk/tm/ts/Makefile +42 -0
  291. package/project/.sdk/tm/ts/src/Context.ts +8 -3
  292. package/src/action/action.ts +17 -10
  293. package/src/action/feature.ts +8 -6
  294. package/src/action/target.ts +17 -8
  295. package/src/cmp/Changelog.ts +34 -0
  296. package/src/cmp/Deploy.ts +258 -0
  297. package/src/cmp/FeatureHook.ts +6 -8
  298. package/src/cmp/License.ts +49 -0
  299. package/src/cmp/Readme.ts +2 -0
  300. package/src/cmp/ReadmeErrors.ts +257 -0
  301. package/src/cmp/ReadmeExplanation.ts +250 -230
  302. package/src/cmp/ReadmeModel.ts +7 -2
  303. package/src/cmp/ReadmeTop.ts +411 -95
  304. package/src/cmp/Security.ts +41 -0
  305. package/src/helpers/canonType.ts +89 -0
  306. package/src/helpers/collectDeps.ts +5 -3
  307. package/src/helpers/naming.ts +59 -0
  308. package/src/helpers/opExample.ts +170 -0
  309. package/src/helpers/opShape.ts +236 -0
  310. package/src/helpers/packageMeta.ts +236 -0
  311. package/src/sdkgen.ts +87 -20
  312. package/src/tsconfig.json +1 -0
  313. package/src/types.ts +85 -2
  314. package/src/utility.ts +22 -11
  315. package/README.md +0 -2
  316. package/dist/action/lang.d.ts +0 -2
  317. package/dist/action/lang.js +0 -68
  318. package/dist/action/lang.js.map +0 -1
  319. package/dist/cmp/Hook.d.ts +0 -2
  320. package/dist/cmp/Hook.js +0 -10
  321. package/dist/cmp/Hook.js.map +0 -1
  322. package/dist/cmp/Top.d.ts +0 -2
  323. package/dist/cmp/Top.js +0 -23
  324. package/dist/cmp/Top.js.map +0 -1
  325. package/dist/prepare-openapi.d.ts +0 -2
  326. package/dist/prepare-openapi.js +0 -37
  327. package/dist/prepare-openapi.js.map +0 -1
  328. package/model/sdkgen.jsonic +0 -74
  329. package/project/.sdk/tm/go/utility/struct/go.mod +0 -3
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, each, Content, isAuthActive } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, isAuthActive, entityIdField } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -13,6 +13,40 @@ const ReadmeModel = cmp(function ReadmeModel(props: any) {
13
13
  const entity = getModelPath(model, `main.${KIT}.entity`)
14
14
  const entityList = each(entity).filter((e: any) => e.active !== false)
15
15
 
16
+ // Model-driven op rows for the shared entity interface: emit a
17
+ // load/list/create/update/remove row only for operations at least one active
18
+ // entity actually exposes (a read-only entity has just list+load) — never
19
+ // document an operation no entity has.
20
+ const opUnion = new Set<string>()
21
+ entityList.forEach((e: any) => Object.keys(e.op || {})
22
+ .forEach((o: string) => { if (e.op[o] && e.op[o].active !== false) opUnion.add(o) }))
23
+ const opRowDefs: Record<string, string> = {
24
+ load: '| `load` | `(reqmatch, ctrl) -> any, err` | Load a single entity by match criteria. |',
25
+ list: '| `list` | `(reqmatch, ctrl) -> any, err` | List entities matching the criteria. |',
26
+ create: '| `create` | `(reqdata, ctrl) -> any, err` | Create a new entity. |',
27
+ update: '| `update` | `(reqdata, ctrl) -> any, err` | Update an existing entity. |',
28
+ remove: '| `remove` | `(reqmatch, ctrl) -> any, err` | Remove an entity. |',
29
+ }
30
+ const opRows = ['load', 'list', 'create', 'update', 'remove']
31
+ .filter((o) => opUnion.has(o)).map((o) => opRowDefs[o]).join('\n')
32
+
33
+ // Model-driven Result-shape rows: only describe the operations that
34
+ // actually exist. Record-returning ops (load/create/update/remove) share
35
+ // one row; list has its own — never name a missing op.
36
+ const recordOps = ['load', 'create', 'update', 'remove'].filter((o) => opUnion.has(o))
37
+ .map((o) => '`' + o + '`')
38
+ const resultRows: string[] = []
39
+ if (recordOps.length) resultRows.push('| ' + recordOps.join(' / ') + ' | the entity record (a `table`) |')
40
+ if (opUnion.has('list')) resultRows.push('| `list` | an array (`table`) of entity records |')
41
+ const resultShapeRows = resultRows.join('\n')
42
+
43
+ const exEnt: any = entityList[0] || {}
44
+ const eName = exEnt.Name || 'Entity'
45
+ const eLower = String(exEnt.name || 'entity').toLowerCase()
46
+ // Model-driven id key: null when the example entity has no id-like field, so
47
+ // the Result-shape load illustration takes no match argument.
48
+ const idF = entityIdField(exEnt)
49
+
16
50
  const apikeyOptionRow = isAuthActive(model)
17
51
  ? '| `apikey` | `string` | API key for authentication. |\n'
18
52
  : ''
@@ -54,7 +88,8 @@ Creates a test-mode client with mock transport. Both arguments may be \`nil\`.
54
88
  `)
55
89
 
56
90
  each(entityList, (ent: any) => {
57
- Content(`| \`${ent.Name}\` | \`(data) -> ${ent.Name}Entity\` | Create a ${ent.Name} entity instance. |
91
+ const article = /^[aeiou]/i.test(ent.Name) ? 'an' : 'a'
92
+ Content(`| \`${ent.Name}\` | \`(data) -> ${ent.Name}Entity\` | Create ${article} ${ent.Name} entity instance. |
58
93
  `)
59
94
  })
60
95
 
@@ -65,11 +100,7 @@ All entities share the same interface.
65
100
 
66
101
  | Method | Signature | Description |
67
102
  | --- | --- | --- |
68
- | \`load\` | \`(reqmatch, ctrl) -> any, err\` | Load a single entity by match criteria. |
69
- | \`list\` | \`(reqmatch, ctrl) -> any, err\` | List entities matching the criteria. |
70
- | \`create\` | \`(reqdata, ctrl) -> any, err\` | Create a new entity. |
71
- | \`update\` | \`(reqdata, ctrl) -> any, err\` | Update an existing entity. |
72
- | \`remove\` | \`(reqmatch, ctrl) -> any, err\` | Remove an entity. |
103
+ ${opRows}
73
104
  | \`data_get\` | \`() -> table\` | Get entity data. |
74
105
  | \`data_set\` | \`(data)\` | Set entity data. |
75
106
  | \`match_get\` | \`() -> table\` | Get entity match criteria. |
@@ -79,17 +110,21 @@ All entities share the same interface.
79
110
 
80
111
  ### Result shape
81
112
 
82
- Entity operations return \`(any, err)\`. The first value is a
83
- \`table\` with these keys:
113
+ Entity operations return \`(value, err)\`. The \`value\` is the operation's
114
+ data **directly** there is no wrapper:
84
115
 
85
- | Key | Type | Description |
86
- | --- | --- | --- |
87
- | \`ok\` | \`boolean\` | \`true\` if the HTTP status is 2xx. |
88
- | \`status\` | \`number\` | HTTP status code. |
89
- | \`headers\` | \`table\` | Response headers. |
90
- | \`data\` | \`any\` | Parsed JSON response body. |
116
+ | Operation | \`value\` |
117
+ | --- | --- |
118
+ ${resultShapeRows}
119
+
120
+ Check \`err\` first (it is non-\`nil\` on failure), then use \`value\`:
121
+
122
+ local ${eLower}, err = client:${eName}():load(${idF ? `{ ${idF} = "example_id" }` : ''})
123
+ if err then error(err) end
124
+ -- ${eLower} is the loaded record
91
125
 
92
- On error, \`ok\` is \`false\` and \`err\` contains the error value.
126
+ Only \`direct()\` returns a response envelope — a \`table\` with \`ok\`,
127
+ \`status\`, \`headers\`, and \`data\` keys.
93
128
 
94
129
  `)
95
130
 
@@ -1,12 +1,13 @@
1
1
 
2
- import { cmp, each, Content } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, envName, isAuthActive } from '@voxgig/sdkgen'
3
3
 
4
4
 
5
5
  const ReadmeOptions = cmp(function ReadmeOptions(props: any) {
6
6
  const { target } = props
7
7
  const { model } = props.ctx$
8
8
 
9
- const publishedOptions = each(target.options).filter((option: any) => option.publish)
9
+ const publishedOptions = each(target.options).filter((option: any) =>
10
+ option.publish && ('apikey' !== option.name || isAuthActive(model)))
10
11
  if (0 === publishedOptions.length) {
11
12
  return
12
13
  }
@@ -25,7 +26,7 @@ local client = sdk.new({
25
26
 
26
27
  publishedOptions.map((option: any) => {
27
28
  if ('apikey' === option.name) {
28
- Content(` ${option.name} = os.getenv("${model.NAME}_APIKEY"),
29
+ Content(` ${option.name} = os.getenv("${envName(model)}_APIKEY"),
29
30
  `)
30
31
  }
31
32
  else {
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, each, Content, isAuthActive } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, isAuthActive, envName, canonKey, opRequestShape, entityIdField, entityDataIdField } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -18,36 +18,62 @@ const ReadmeQuick = cmp(function ReadmeQuick(props: any) {
18
18
  e.active !== false && e.ancestors && e.ancestors.length > 0
19
19
  ) as any
20
20
 
21
- const apikeyArg = isAuthActive(model)
22
- ? `\n apikey = os.getenv("${model.NAME}_APIKEY"),\n`
23
- : ''
21
+ const ctor = isAuthActive(model)
22
+ ? `sdk.new({\n apikey = os.getenv("${envName(model)}_APIKEY"),\n})`
23
+ : `sdk.new()`
24
24
 
25
25
  Content(`### 1. Create a client
26
26
 
27
27
  \`\`\`lua
28
28
  local sdk = require("${model.name}_sdk")
29
29
 
30
- local client = sdk.new({${apikeyArg}})
30
+ local client = ${ctor}
31
31
  \`\`\`
32
32
 
33
33
  `)
34
34
 
35
35
  if (exampleEntity) {
36
36
  const eName = nom(exampleEntity, 'Name')
37
+ const article = /^[aeiou]/i.test(eName) ? "an" : "a"
37
38
  const opnames = Object.keys(exampleEntity.op || {})
39
+ // Model-driven id key: `idF` is the MATCH key (null when none). `dataIdF`
40
+ // is the id on the RETURNED record's data type — an entity can key its match
41
+ // on an id it does not carry as data, so a record id read (`item["id"]`,
42
+ // `created["id"]`) must be guarded on this, not the match key.
43
+ const idF = entityIdField(exampleEntity)
44
+ const dataIdF = entityDataIdField(exampleEntity)
45
+
46
+ // MODEL-DRIVEN display field: the list example must reference a field
47
+ // the entity actually has, not a hardcoded "name". Pick the entity's
48
+ // first non-id string field (falling back to the first non-id field of
49
+ // any type). The id key stays `id` — the SDK renames every id param to
50
+ // `id`, matching the load example and the seeded test fixture.
51
+ const idNames = new Set<string>(['id',
52
+ (exampleEntity.id && exampleEntity.id.field) || 'id'])
53
+ const fields: any[] = Array.isArray(exampleEntity.fields) ? exampleEntity.fields : []
54
+ const isStringField = (f: any) =>
55
+ f && typeof f.type === 'string' && /STRING/i.test(f.type)
56
+ const displayFieldObj =
57
+ fields.find((f: any) => f && !idNames.has(f.name) && isStringField(f)) ||
58
+ fields.find((f: any) => f && !idNames.has(f.name))
59
+ const displayField = displayFieldObj ? displayFieldObj.name : null
60
+ const idCol = dataIdF ? `item["${dataIdF}"]` : null
61
+ const dispCol = displayField ? `item["${displayField}"]` : null
62
+ const printCols = [idCol, dispCol].filter(Boolean).join(', ')
63
+ const printLine = printCols ? ` print(${printCols})` : ` print(item)`
38
64
 
39
65
  if (opnames.includes('list')) {
40
- Content(`### 2. List ${eName.toLowerCase()}s
66
+ Content(`### 2. List ${eName.toLowerCase()} records
67
+
68
+ Entity operations return \`(value, err)\`. For \`list\`, \`value\` is the
69
+ array of records itself — iterate it directly (there is no wrapper).
41
70
 
42
71
  \`\`\`lua
43
- local result, err = client:${eName}(nil):list(nil, nil)
72
+ local ${eName.toLowerCase()}s, err = client:${eName}():list()
44
73
  if err then error(err) end
45
74
 
46
- if type(result) == "table" then
47
- for _, item in ipairs(result) do
48
- local d = item:data_get()
49
- print(d["id"], d["name"])
50
- end
75
+ for _, item in ipairs(${eName.toLowerCase()}s) do
76
+ ${printLine}
51
77
  end
52
78
  \`\`\`
53
79
 
@@ -55,17 +81,50 @@ end
55
81
  }
56
82
 
57
83
  if (opnames.includes('load')) {
58
- Content(`### 3. Load a ${eName.toLowerCase()}
84
+ Content(`### 3. Load ${article} ${eName.toLowerCase()}
59
85
 
60
86
  \`\`\`lua
61
- local result, err = client:${eName}(nil):load({ id = "example_id" }, nil)
87
+ local ${eName.toLowerCase()}, err = client:${eName}():load(${idF ? `{ ${idF} = "example_id" }` : ''})
62
88
  if err then error(err) end
63
- print(result)
89
+ print(${eName.toLowerCase()})
64
90
  \`\`\`
65
91
 
66
92
  `)
67
93
  }
68
94
 
95
+ // Model-driven example fields: derive the create/update body from the op
96
+ // shape (opRequestShape) so the docs reference REAL writable fields, not a
97
+ // hardcoded "name" the entity may not have. Literals are Lua-typed by the
98
+ // field's canonical type; non-identifier keys use bracket syntax.
99
+ const luaLit = (type: any): string => {
100
+ const k = canonKey(type)
101
+ if ('INTEGER' === k || 'NUMBER' === k) return '1'
102
+ if ('BOOLEAN' === k) return 'true'
103
+ if ('ARRAY' === k || 'OBJECT' === k) return '{}'
104
+ return '"example"'
105
+ }
106
+ const luaKey = (name: string): string =>
107
+ /^[A-Za-z_]\w*$/.test(name) ? name : `["${name}"]`
108
+ const examplePairs = (opname: string): string[] => {
109
+ const items = opRequestShape(exampleEntity, opname).items
110
+ .filter((it: any) => !idNames.has(it.name))
111
+ const required = items.filter((it: any) => !it.optional)
112
+ const chosen = 'create' === opname
113
+ ? (required.length ? required : items.slice(0, 2))
114
+ : items.slice(0, 2)
115
+ return chosen.map((it: any) => `${luaKey(it.name)} = ${luaLit(it.type)}`)
116
+ }
117
+
118
+ // The id VALUE for an update/remove match: off the returned `created` record
119
+ // only when its data type carries the id AND a create ran, else a literal.
120
+ const idParamType = (opname: string): any => {
121
+ const it = opRequestShape(exampleEntity, opname).items.find((x: any) => x.name === idF)
122
+ return it && it.type
123
+ }
124
+ const idValueFor = (opname: string): string => (null != dataIdF && opnames.includes('create'))
125
+ ? `created["${dataIdF}"]`
126
+ : luaLit(idParamType(opname))
127
+
69
128
  if (opnames.includes('create') || opnames.includes('update') || opnames.includes('remove')) {
70
129
  Content(`### 4. Create, update, and remove
71
130
 
@@ -73,19 +132,21 @@ print(result)
73
132
  `)
74
133
  if (opnames.includes('create')) {
75
134
  Content(`-- Create
76
- local created, _ = client:${eName}(nil):create({ name = "Example" }, nil)
135
+ local created, err = client:${eName}():create({ ${examplePairs('create').join(', ')} })
136
+ if err then error(err) end
77
137
 
78
138
  `)
79
139
  }
80
140
  if (opnames.includes('update')) {
141
+ const updatePairs = (idF ? [`${idF} = ${idValueFor('update')}`] : []).concat(examplePairs('update'))
81
142
  Content(`-- Update
82
- client:${eName}(nil):update({ id = created["id"], name = "Example-Renamed" }, nil)
143
+ client:${eName}():update({ ${updatePairs.join(', ')} })
83
144
 
84
145
  `)
85
146
  }
86
147
  if (opnames.includes('remove')) {
87
148
  Content(`-- Remove
88
- client:${eName}(nil):remove({ id = created["id"] }, nil)
149
+ client:${eName}():remove(${idF ? `{ ${idF} = ${idValueFor('remove')} }` : ''})
89
150
  `)
90
151
  }
91
152
  Content(`\`\`\`
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, each, Content, File, isAuthActive } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, canonToType, File, isAuthActive, entityIdField } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -71,8 +71,7 @@ Create a new SDK client instance.
71
71
  | Name | Type | Description |
72
72
  | --- | --- | --- |
73
73
  | \`options\` | \`table\` | SDK configuration options. |
74
- | \`options.apikey\` | \`string\` | API key for authentication. |
75
- | \`options.base\` | \`string\` | Base URL for API requests. |
74
+ ${isAuthActive(model) ? '| \`options.apikey\` | \`string\` | API key for authentication. |\n' : ''}| \`options.base\` | \`string\` | Base URL for API requests. |
76
75
  | \`options.prefix\` | \`string\` | URL prefix appended after base. |
77
76
  | \`options.suffix\` | \`string\` | URL suffix appended after path. |
78
77
  | \`options.headers\` | \`table\` | Custom headers for all requests. |
@@ -87,12 +86,12 @@ Create a new SDK client instance.
87
86
 
88
87
  `)
89
88
 
90
- Content(`#### \`sdk.test(testopts, sdkopts)\`
89
+ Content(`#### \`sdk.test(testopts?, sdkopts?)\`
91
90
 
92
- Create a test client with mock features active. Both arguments may be \`nil\`.
91
+ Create a test client with mock features active. Both arguments are optional.
93
92
 
94
93
  \`\`\`lua
95
- local client = sdk.test(nil, nil)
94
+ local client = sdk.test()
96
95
  \`\`\`
97
96
 
98
97
  `)
@@ -154,6 +153,9 @@ same parameters as \`direct()\`.
154
153
  publishedEntities.map((ent: any) => {
155
154
  const opnames = Object.keys(ent.op || {})
156
155
  const fields = ent.fields || []
156
+ // Model-driven id key: null when this entity has no id-like field, in
157
+ // which case load/remove match on no argument and update omits the id.
158
+ const idF = entityIdField(ent)
157
159
 
158
160
  Content(`
159
161
  ---
@@ -185,7 +187,7 @@ local ${ent.name} = client:${ent.Name}(nil)
185
187
  each(fields, (field: any) => {
186
188
  const req = field.req ? 'Yes' : 'No'
187
189
  const desc = field.short || ''
188
- Content(`| \`${field.name}\` | \`${field.type || 'any'}\` | ${req} | ${desc} |
190
+ Content(`| \`${field.name}\` | \`${canonToType(field.type, target.name)}\` | ${req} | ${desc} |
189
191
  `)
190
192
  })
191
193
 
@@ -195,15 +197,18 @@ local ${ent.name} = client:${ent.Name}(nil)
195
197
  // Field operations breakdown
196
198
  const hasFieldOps = fields.some((f: any) => f.op && Object.keys(f.op).length > 0)
197
199
  if (hasFieldOps) {
200
+ // Only emit columns for operations this entity actually exposes —
201
+ // never advertise a create/update/remove column the entity lacks.
202
+ const opcols = ['load', 'list', 'create', 'update', 'remove']
203
+ .filter((op: string) => opnames.includes(op) && ent.op[op]?.active !== false)
198
204
  Content(`### Field Usage by Operation
199
205
 
200
- | Field | load | list | create | update | remove |
201
- | --- | --- | --- | --- | --- | --- |
206
+ | Field | ${opcols.join(' | ')} |
207
+ | --- | ${opcols.map(() => '---').join(' | ')} |
202
208
  `)
203
209
  each(fields, (field: any) => {
204
210
  const fops = field.op || {}
205
- const cols = ['load', 'list', 'create', 'update', 'remove'].map((op: string) => {
206
- if (!opnames.includes(op)) return '-'
211
+ const cols = opcols.map((op: string) => {
207
212
  const fop = fops[op]
208
213
  if (null == fop) return '-'
209
214
  if (fop.active === false) return '-'
@@ -238,39 +243,39 @@ ${info.desc}
238
243
  // Show example
239
244
  if ('load' === opname || 'remove' === opname) {
240
245
  Content(`\`\`\`lua
241
- local result, err = client:${ent.Name}(nil):${opname}({ id = "${ent.name}_id" }, nil)
246
+ local result, err = client:${ent.Name}():${opname}(${idF ? `{ ${idF} = "${ent.name}_id" }` : ''})
242
247
  \`\`\`
243
248
 
244
249
  `)
245
250
  }
246
251
  else if ('list' === opname) {
247
252
  Content(`\`\`\`lua
248
- local results, err = client:${ent.Name}(nil):list(nil, nil)
253
+ local results, err = client:${ent.Name}():list()
249
254
  \`\`\`
250
255
 
251
256
  `)
252
257
  }
253
258
  else if ('create' === opname) {
254
259
  Content(`\`\`\`lua
255
- local result, err = client:${ent.Name}(nil):create({
260
+ local result, err = client:${ent.Name}():create({
256
261
  `)
257
262
  each(fields, (field: any) => {
258
263
  if ('id' !== field.name && field.req) {
259
- Content(` ${field.name} = --[[ ${field.type || 'value'} ]],
264
+ Content(` ${field.name} = --[[ ${canonToType(field.type, target.name)} ]],
260
265
  `)
261
266
  }
262
267
  })
263
- Content(`}, nil)
268
+ Content(`})
264
269
  \`\`\`
265
270
 
266
271
  `)
267
272
  }
268
273
  else if ('update' === opname) {
274
+ const updateIdLine = idF ? ` ${idF} = "${ent.name}_id",\n` : ''
269
275
  Content(`\`\`\`lua
270
- local result, err = client:${ent.Name}(nil):update({
271
- id = "${ent.name}_id",
272
- -- Fields to update
273
- }, nil)
276
+ local result, err = client:${ent.Name}():update({
277
+ ${updateIdLine} -- Fields to update
278
+ })
274
279
  \`\`\`
275
280
 
276
281
  `)
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, Content, isAuthActive } from '@voxgig/sdkgen'
2
+ import { cmp, Content, isAuthActive, envName, entityIdField } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -15,34 +15,42 @@ const ReadmeTopQuick = cmp(function ReadmeTopQuick(props: any) {
15
15
 
16
16
  const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
17
17
 
18
- const apikeyArg = isAuthActive(model)
19
- ? `\n apikey = os.getenv("${model.NAME}_APIKEY"),\n`
20
- : ''
18
+ const authActive = isAuthActive(model)
19
+ const ctor = authActive
20
+ ? `sdk.new({\n apikey = os.getenv("${envName(model)}_APIKEY"),\n})`
21
+ : `sdk.new()`
21
22
 
22
23
  Content(`\`\`\`lua
23
24
  local sdk = require("${model.name}_sdk")
24
25
 
25
- local client = sdk.new({${apikeyArg}})
26
+ local client = ${ctor}
26
27
 
27
28
  `)
28
29
 
29
30
  if (exampleEntity) {
30
31
  const eName = nom(exampleEntity, 'Name')
31
32
  const opnames = Object.keys(exampleEntity.op || {})
33
+ // Model-driven id key: null when the entity has no id-like field, in which
34
+ // case the load example takes no match argument.
35
+ const idF = entityIdField(exampleEntity)
36
+
37
+ let hasCall = false
32
38
 
33
39
  if (opnames.includes('list')) {
34
40
  Content(`-- List all ${eName.toLowerCase()}s
35
- local ${eName.toLowerCase()}s, err = client:${eName}(nil):list(nil, nil)
41
+ local ${eName.toLowerCase()}s, err = client:${eName}():list()
42
+ print(${eName.toLowerCase()}s)
36
43
  `)
44
+ hasCall = true
37
45
  }
38
46
 
39
47
  if (opnames.includes('load')) {
40
48
  Content(`
41
49
  -- Load a specific ${eName.toLowerCase()}
42
- local ${eName.toLowerCase()}, err = client:${eName}(nil):load(
43
- { id = "example_id" }, nil
44
- )
50
+ local ${eName.toLowerCase()}, err = client:${eName}():load(${idF ? `{ ${idF} = "example_id" }` : ''})
51
+ print(${eName.toLowerCase()})
45
52
  `)
53
+ hasCall = true
46
54
  }
47
55
  }
48
56
 
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, Content } from '@voxgig/sdkgen'
2
+ import { cmp, Content, canonKey, entityIdField, entityPrimaryOp, opRequestShape } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -8,6 +8,20 @@ import {
8
8
  } from '@voxgig/apidef'
9
9
 
10
10
 
11
+ // A type-correct Lua literal for a field's canonical type.
12
+ function luaLit(type: any): string {
13
+ const k = canonKey(type)
14
+ if ('INTEGER' === k || 'NUMBER' === k) return '1'
15
+ if ('BOOLEAN' === k) return 'true'
16
+ if ('ARRAY' === k || 'OBJECT' === k) return '{}'
17
+ return '"example"'
18
+ }
19
+
20
+ function luaKey(name: string): string {
21
+ return /^[A-Za-z_]\w*$/.test(name) ? name : `["${name}"]`
22
+ }
23
+
24
+
11
25
  const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
12
26
  const { target, ctx$: { model } } = props
13
27
 
@@ -16,14 +30,27 @@ const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
16
30
  const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
17
31
 
18
32
  Content(`\`\`\`lua
19
- local client = sdk.test(nil, nil)
33
+ local client = sdk.test()
20
34
  `)
21
35
 
22
36
  if (exampleEntity) {
23
37
  const eName = nom(exampleEntity, 'Name')
24
- Content(`local result, err = client:${eName}(nil):load(
25
- { id = "test01" }, nil
26
- )
38
+ // Drive the test-mode example off the entity's PRIMARY op (never a hardcoded
39
+ // `load` a create-only entity lacks).
40
+ const idF = entityIdField(exampleEntity)
41
+ const primaryOp = entityPrimaryOp(exampleEntity) || 'load'
42
+ const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
43
+ let arg = ''
44
+ if (isMatchOp) {
45
+ arg = idF ? `{ ${idF} = "test01" }` : ''
46
+ } else if ('create' === primaryOp || 'update' === primaryOp) {
47
+ const items = opRequestShape(exampleEntity, primaryOp).items
48
+ .filter((it: any) => it.name !== idF && it.name !== 'id')
49
+ const required = items.filter((it: any) => !it.optional)
50
+ const chosen = required.length ? required : items.slice(0, 3)
51
+ arg = `{ ${chosen.map((it: any) => `${luaKey(it.name)} = ${luaLit(it.type)}`).join(', ')} }`
52
+ }
53
+ Content(`local result, err = client:${eName}():${primaryOp}(${arg})
27
54
  `)
28
55
  }
29
56
 
@@ -13,6 +13,7 @@ import { cmp, each, Folder, File, Content } from '@voxgig/sdkgen'
13
13
 
14
14
  import { TestEntity } from './TestEntity_lua'
15
15
  import { TestDirect } from './TestDirect_lua'
16
+ import { ReadmeExamplesTest } from './ReadmeExamplesTest_lua'
16
17
 
17
18
 
18
19
  const Test = cmp(function Test(props: any) {
@@ -40,6 +41,9 @@ end)
40
41
  TestEntity({ target, entity })
41
42
  TestDirect({ target, entity })
42
43
  })
44
+
45
+ // README ```lua example snippets: syntax-check + offline run.
46
+ ReadmeExamplesTest({ target })
43
47
  })
44
48
  })
45
49
 
@@ -5,6 +5,10 @@ local entityCreateOp = {}
5
5
 
6
6
  -- EJECT-START
7
7
 
8
+ ---@param reqdata EntityNameCreateData
9
+ ---@param ctrl? table
10
+ ---@return EntityName
11
+ ---@return string? err
8
12
  function EntityNameEntity:create(reqdata, ctrl)
9
13
  local utility = self._utility
10
14
  local ctx = utility.make_context({
@@ -2,6 +2,10 @@ local entityListOp = {}
2
2
 
3
3
  -- EJECT-START
4
4
 
5
+ ---@param reqmatch EntityNameListMatch
6
+ ---@param ctrl? table
7
+ ---@return EntityName[]
8
+ ---@return string? err
5
9
  function EntityNameEntity:list(reqmatch, ctrl)
6
10
  local utility = self._utility
7
11
  local ctx = utility.make_context({
@@ -5,6 +5,10 @@ local entityLoadOp = {}
5
5
 
6
6
  -- EJECT-START
7
7
 
8
+ ---@param reqmatch EntityNameLoadMatch
9
+ ---@param ctrl? table
10
+ ---@return EntityName
11
+ ---@return string? err
8
12
  function EntityNameEntity:load(reqmatch, ctrl)
9
13
  local utility = self._utility
10
14
  local ctx = utility.make_context({
@@ -5,6 +5,10 @@ local entityRemoveOp = {}
5
5
 
6
6
  -- EJECT-START
7
7
 
8
+ ---@param reqmatch EntityNameRemoveMatch
9
+ ---@param ctrl? table
10
+ ---@return EntityName
11
+ ---@return string? err
8
12
  function EntityNameEntity:remove(reqmatch, ctrl)
9
13
  local utility = self._utility
10
14
  local ctx = utility.make_context({
@@ -5,6 +5,10 @@ local entityUpdateOp = {}
5
5
 
6
6
  -- EJECT-START
7
7
 
8
+ ---@param reqdata EntityNameUpdateData
9
+ ---@param ctrl? table
10
+ ---@return EntityName
11
+ ---@return string? err
8
12
  function EntityNameEntity:update(reqdata, ctrl)
9
13
  local utility = self._utility
10
14
  local ctx = utility.make_context({