@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
@@ -13,6 +13,23 @@ 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` | Load a single entity by match criteria. Raises on error. |',
25
+ list: '| `list` | `(reqmatch = nil, ctrl) -> Array` | List entities matching the criteria (call with no argument to list all). Raises on error. |',
26
+ create: '| `create` | `(reqdata, ctrl) -> any` | Create a new entity. Raises on error. |',
27
+ update: '| `update` | `(reqdata, ctrl) -> any` | Update an existing entity. Raises on error. |',
28
+ remove: '| `remove` | `(reqmatch, ctrl) -> any` | Remove an entity. Raises on error. |',
29
+ }
30
+ const opRows = ['load', 'list', 'create', 'update', 'remove']
31
+ .filter((o) => opUnion.has(o)).map((o) => opRowDefs[o]).join('\n')
32
+
16
33
  const apikeyOptionRow = isAuthActive(model)
17
34
  ? '| `apikey` | `String` | API key for authentication. |\n'
18
35
  : ''
@@ -49,12 +66,13 @@ Creates a test-mode client with mock transport. Both arguments may be \`nil\`.
49
66
  | --- | --- | --- |
50
67
  | \`options_map\` | \`() -> Hash\` | Deep copy of current SDK options. |
51
68
  | \`get_utility\` | \`() -> Utility\` | Copy of the SDK utility object. |
52
- | \`prepare\` | \`(fetchargs) -> [Hash, err]\` | Build an HTTP request definition without sending. |
53
- | \`direct\` | \`(fetchargs) -> [Hash, err]\` | Build and send an HTTP request. |
69
+ | \`prepare\` | \`(fetchargs) -> Hash\` | Build an HTTP request definition without sending. Raises on error. |
70
+ | \`direct\` | \`(fetchargs) -> Hash\` | Build and send an HTTP request. Returns a result hash (\`result["ok"]\`); does not raise. |
54
71
  `)
55
72
 
56
73
  each(entityList, (ent: any) => {
57
- Content(`| \`${ent.Name}\` | \`(data) -> ${ent.Name}Entity\` | Create a ${ent.Name} entity instance. |
74
+ const article = /^[aeiou]/i.test(ent.Name) ? 'an' : 'a'
75
+ Content(`| \`${ent.Name}\` | \`(data) -> ${ent.Name}Entity\` | Create ${article} ${ent.Name} entity instance. |
58
76
  `)
59
77
  })
60
78
 
@@ -65,11 +83,7 @@ All entities share the same interface.
65
83
 
66
84
  | Method | Signature | Description |
67
85
  | --- | --- | --- |
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. |
86
+ ${opRows}
73
87
  | \`data_get\` | \`() -> Hash\` | Get entity data. |
74
88
  | \`data_set\` | \`(data)\` | Set entity data. |
75
89
  | \`match_get\` | \`() -> Hash\` | Get entity match criteria. |
@@ -79,8 +93,12 @@ All entities share the same interface.
79
93
 
80
94
  ### Result shape
81
95
 
82
- Entity operations return \`[any, err]\`. The first value is a
83
- \`Hash\` with these keys:
96
+ Entity operations return the result data directly. On failure they
97
+ raise a \`${model.const.Name}Error\` (a \`StandardError\` subclass), so wrap
98
+ calls in \`begin\`/\`rescue\` where you need to handle errors.
99
+
100
+ The \`direct\` escape hatch is the exception: it never raises and instead
101
+ returns a result \`Hash\` with these keys:
84
102
 
85
103
  | Key | Type | Description |
86
104
  | --- | --- | --- |
@@ -88,8 +106,7 @@ Entity operations return \`[any, err]\`. The first value is a
88
106
  | \`status\` | \`Integer\` | HTTP status code. |
89
107
  | \`headers\` | \`Hash\` | Response headers. |
90
108
  | \`data\` | \`any\` | Parsed JSON response body. |
91
-
92
- On error, \`ok\` is \`false\` and \`err\` contains the error value.
109
+ | \`err\` | \`Error\` | Present when \`ok\` is \`false\`. |
93
110
 
94
111
  `)
95
112
 
@@ -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 @@ client = ${model.Name}SDK.new({
25
26
 
26
27
  publishedOptions.map((option: any) => {
27
28
  if ('apikey' === option.name) {
28
- Content(` "${option.name}" => ENV["${model.NAME}_APIKEY"],
29
+ Content(` "${option.name}" => ENV["${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,57 @@ 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" => ENV["${model.NAME}_APIKEY"],\n`
23
- : ''
21
+ const ctor = isAuthActive(model)
22
+ ? `${model.const.Name}SDK.new({\n "apikey" => ENV["${envName(model)}_APIKEY"],\n})`
23
+ : `${model.const.Name}SDK.new`
24
24
 
25
25
  Content(`### 1. Create a client
26
26
 
27
27
  \`\`\`ruby
28
28
  require_relative "${model.const.Name}_sdk"
29
29
 
30
- client = ${model.const.Name}SDK.new({${apikeyArg}})
30
+ 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 keys: `idF` is the load-MATCH key (null when the entity
40
+ // has no id-like field — a response-wrapped spec); when null, load/remove
41
+ // take no argument. `dataIdF` is the id on the RETURNED record's data type —
42
+ // an entity can key its match on an id it does not carry as data, so both a
43
+ // listed record's id column and a `created["id"]` read must be guarded on
44
+ // this, not the match key.
45
+ const idF = entityIdField(exampleEntity)
46
+ const dataIdF = entityDataIdField(exampleEntity)
47
+
48
+ // Model-driven display field: the entity's first non-id string field
49
+ // (falling back to any non-id field), so the list example prints a real
50
+ // column instead of a hardcoded "name" the entity may not have.
51
+ const fields = exampleEntity.fields || []
52
+ const displayField =
53
+ fields.find((f: any) => f && f.name !== 'id' && f.type === '$STRING') ||
54
+ fields.find((f: any) => f && f.name !== 'id') ||
55
+ null
56
+ const idCol = dataIdF ? `#{item[${JSON.stringify(dataIdF)}]}` : null
57
+ const dispCol = displayField ? `#{item[${JSON.stringify(displayField.name)}]}` : null
58
+ const itemPrint = [idCol, dispCol].filter(Boolean).join(' ') || '#{item}'
38
59
 
39
60
  if (opnames.includes('list')) {
40
- Content(`### 2. List ${eName.toLowerCase()}s
61
+ Content(`### 2. List ${eName.toLowerCase()} records
41
62
 
42
63
  \`\`\`ruby
43
- result, err = client.${eName}(nil).list(nil, nil)
44
- raise err if err
45
-
46
- if result.is_a?(Array)
47
- result.each do |item|
48
- d = item.data_get
49
- puts "#{d["id"]} #{d["name"]}"
64
+ begin
65
+ # list returns an Array of ${eName} records — iterate directly.
66
+ ${eName.toLowerCase()}s = client.${eName}.list
67
+ ${eName.toLowerCase()}s.each do |item|
68
+ puts "${itemPrint}"
50
69
  end
70
+ rescue => err
71
+ warn "list failed: #{err}"
51
72
  end
52
73
  \`\`\`
53
74
 
@@ -55,37 +76,79 @@ end
55
76
  }
56
77
 
57
78
  if (opnames.includes('load')) {
58
- Content(`### 3. Load a ${eName.toLowerCase()}
79
+ Content(`### 3. Load ${article} ${eName.toLowerCase()}
59
80
 
60
81
  \`\`\`ruby
61
- result, err = client.${eName}(nil).load({ "id" => "example_id" }, nil)
62
- raise err if err
63
- puts result
82
+ begin
83
+ # load returns the bare ${eName} record (raises on error).
84
+ ${eName.toLowerCase()} = client.${eName}.load(${idF ? `{ "${idF}" => "example_id" }` : ''})
85
+ puts ${eName.toLowerCase()}
86
+ rescue => err
87
+ warn "load failed: #{err}"
88
+ end
64
89
  \`\`\`
65
90
 
66
91
  `)
67
92
  }
68
93
 
94
+ // Model-driven example fields: derive the create/update body from the op
95
+ // shape (opRequestShape) so the docs reference REAL writable fields, not a
96
+ // hardcoded "name" the entity may not have. Literals are Ruby-typed by the
97
+ // field's canonical type.
98
+ const idField = (exampleEntity.id && exampleEntity.id.field) || 'id'
99
+ const rbLit = (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) return '[]'
104
+ if ('OBJECT' === k) return '{}'
105
+ return '"example"'
106
+ }
107
+ const examplePairs = (opname: string): string[] => {
108
+ const items = opRequestShape(exampleEntity, opname).items
109
+ .filter((it: any) => it.name !== idField && it.name !== 'id')
110
+ const required = items.filter((it: any) => !it.optional)
111
+ // create needs ALL required fields; update is a patch, so a couple suffice.
112
+ const chosen = 'create' === opname
113
+ ? (required.length ? required : items.slice(0, 2))
114
+ : items.slice(0, 2)
115
+ return chosen.map((it: any) => `"${it.name}" => ${rbLit(it.type)}`)
116
+ }
117
+
118
+ // The id VALUE for an update/remove match: off the returned `created`
119
+ // record only when its data type carries the id AND a create ran, else a
120
+ // type-correct literal (so an update-without-create never references an
121
+ // undefined `created`).
122
+ const idParamType = (opname: string): any => {
123
+ const it = opRequestShape(exampleEntity, opname).items.find((x: any) => x.name === idF)
124
+ return it && it.type
125
+ }
126
+ const idValueFor = (opname: string): string => (null != dataIdF && opnames.includes('create'))
127
+ ? `created["${dataIdF}"]`
128
+ : rbLit(idParamType(opname))
129
+
69
130
  if (opnames.includes('create') || opnames.includes('update') || opnames.includes('remove')) {
70
131
  Content(`### 4. Create, update, and remove
71
132
 
72
133
  \`\`\`ruby
73
134
  `)
74
135
  if (opnames.includes('create')) {
75
- Content(`# Create
76
- created, _ = client.${eName}(nil).create({ "name" => "Example" }, nil)
136
+ Content(`# create returns the bare created ${eName} record.
137
+ created = client.${eName}.create({ ${examplePairs('create').join(', ')} })
77
138
 
78
139
  `)
79
140
  }
80
141
  if (opnames.includes('update')) {
81
- Content(`# Update
82
- client.${eName}(nil).update({ "id" => created["id"], "name" => "Example-Renamed" }, nil)
142
+ const updatePairs = (idF ? [`"${idF}" => ${idValueFor('update')}`] : []).concat(examplePairs('update'))
143
+ const fromCreated = null != dataIdF && opnames.includes('create')
144
+ Content(`# Update${fromCreated ? ` — index the bare record directly (created["${dataIdF}"]).` : ''}
145
+ client.${eName}.update({ ${updatePairs.join(', ')} })
83
146
 
84
147
  `)
85
148
  }
86
149
  if (opnames.includes('remove')) {
87
150
  Content(`# Remove
88
- client.${eName}(nil).remove({ "id" => created["id"] }, nil)
151
+ client.${eName}.remove(${idF ? `{ "${idF}" => ${idValueFor('remove')} }` : ''})
89
152
  `)
90
153
  }
91
154
  Content(`\`\`\`
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, each, Content, File, isAuthActive } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, canonToType, canonKey, File, isAuthActive, entityIdField } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -7,31 +7,43 @@ import {
7
7
  } from '@voxgig/apidef'
8
8
 
9
9
 
10
+ // A type-correct Ruby literal for a field's canonical type — the create body
11
+ // is EXECUTED by the doc test, so it must carry a real value per field.
12
+ function rbLit(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) return '[]'
17
+ if ('OBJECT' === k) return '{}'
18
+ return '"example"'
19
+ }
20
+
21
+
10
22
  const OP_SIGNATURES: Record<string, { sig: string, returns: string, desc: string }> = {
11
23
  load: {
12
- sig: 'load(reqmatch, ctrl = nil) -> result, err',
13
- returns: 'result, err',
14
- desc: 'Load a single entity matching the given criteria.',
24
+ sig: 'load(reqmatch, ctrl = nil) -> result',
25
+ returns: 'result',
26
+ desc: 'Load a single entity matching the given criteria. Raises on error.',
15
27
  },
16
28
  list: {
17
- sig: 'list(reqmatch, ctrl = nil) -> result, err',
18
- returns: 'result, err',
19
- desc: 'List entities matching the given criteria. Returns an array.',
29
+ sig: 'list(reqmatch = nil, ctrl = nil) -> Array',
30
+ returns: 'Array',
31
+ desc: 'List entities matching the given criteria (call with no argument to list all). Returns an array. Raises on error.',
20
32
  },
21
33
  create: {
22
- sig: 'create(reqdata, ctrl = nil) -> result, err',
23
- returns: 'result, err',
24
- desc: 'Create a new entity with the given data.',
34
+ sig: 'create(reqdata, ctrl = nil) -> result',
35
+ returns: 'result',
36
+ desc: 'Create a new entity with the given data. Raises on error.',
25
37
  },
26
38
  update: {
27
- sig: 'update(reqdata, ctrl = nil) -> result, err',
28
- returns: 'result, err',
29
- desc: 'Update an existing entity. The data must include the entity `id`.',
39
+ sig: 'update(reqdata, ctrl = nil) -> result',
40
+ returns: 'result',
41
+ desc: 'Update an existing entity. The data must include the entity `id`. Raises on error.',
30
42
  },
31
43
  remove: {
32
- sig: 'remove(reqmatch, ctrl = nil) -> result, err',
33
- returns: 'result, err',
34
- desc: 'Remove the entity matching the given criteria.',
44
+ sig: 'remove(reqmatch, ctrl = nil) -> result',
45
+ returns: 'result',
46
+ desc: 'Remove the entity matching the given criteria. Raises on error.',
35
47
  },
36
48
  }
37
49
 
@@ -60,7 +72,7 @@ Complete API reference for the ${model.Name} ${target.title} SDK.
60
72
  `)
61
73
 
62
74
  Content(`\`\`\`ruby
63
- require_relative '${model.name}_sdk'
75
+ require_relative '${model.const.Name}_sdk'
64
76
 
65
77
  client = ${model.const.Name}SDK.new(options)
66
78
  \`\`\`
@@ -72,8 +84,7 @@ Create a new SDK client instance.
72
84
  | Name | Type | Description |
73
85
  | --- | --- | --- |
74
86
  | \`options\` | \`Hash\` | SDK configuration options. |
75
- | \`options["apikey"]\` | \`String\` | API key for authentication. |
76
- | \`options["base"]\` | \`String\` | Base URL for API requests. |
87
+ ${isAuthActive(model) ? '| \`options["apikey"]\` | \`String\` | API key for authentication. |\n' : ''}| \`options["base"]\` | \`String\` | Base URL for API requests. |
77
88
  | \`options["prefix"]\` | \`String\` | URL prefix appended after base. |
78
89
  | \`options["suffix"]\` | \`String\` | URL suffix appended after path. |
79
90
  | \`options["headers"]\` | \`Hash\` | Custom headers for all requests. |
@@ -123,9 +134,11 @@ Return a deep copy of the current SDK options.
123
134
 
124
135
  Return a copy of the SDK utility object.
125
136
 
126
- #### \`direct(fetchargs = {}) -> Hash, err\`
137
+ #### \`direct(fetchargs = {}) -> Hash\`
127
138
 
128
- Make a direct HTTP request to any API endpoint.
139
+ Make a direct HTTP request to any API endpoint. Returns a result hash
140
+ (\`{ "ok" => ..., "status" => ..., "data" => ..., "err" => ... }\`); it
141
+ does not raise — inspect \`result["ok"]\`.
129
142
 
130
143
  **Parameters:**
131
144
 
@@ -139,14 +152,14 @@ Make a direct HTTP request to any API endpoint.
139
152
  | \`fetchargs["body"]\` | \`any\` | Request body (hashes are JSON-serialized). |
140
153
  | \`fetchargs["ctrl"]\` | \`Hash\` | Control options (e.g. \`{ "explain" => true }\`). |
141
154
 
142
- **Returns:** \`Hash, err\`
155
+ **Returns:** \`Hash\`
143
156
 
144
- #### \`prepare(fetchargs = {}) -> Hash, err\`
157
+ #### \`prepare(fetchargs = {}) -> Hash\`
145
158
 
146
159
  Prepare a fetch definition without sending the request. Accepts the
147
- same parameters as \`direct()\`.
160
+ same parameters as \`direct()\`. Raises on error.
148
161
 
149
- **Returns:** \`Hash, err\`
162
+ **Returns:** \`Hash\` (the fetch definition; raises on error)
150
163
 
151
164
  `)
152
165
 
@@ -155,6 +168,9 @@ same parameters as \`direct()\`.
155
168
  publishedEntities.map((ent: any) => {
156
169
  const opnames = Object.keys(ent.op || {})
157
170
  const fields = ent.fields || []
171
+ // Model-driven id key: null when this entity has no id-like field, in
172
+ // which case load/remove match on no argument and update omits the id.
173
+ const idF = entityIdField(ent)
158
174
 
159
175
  Content(`
160
176
  ---
@@ -186,7 +202,7 @@ ${ent.name} = client.${ent.Name}
186
202
  each(fields, (field: any) => {
187
203
  const req = field.req ? 'Yes' : 'No'
188
204
  const desc = field.short || ''
189
- Content(`| \`${field.name}\` | \`${field.type || 'any'}\` | ${req} | ${desc} |
205
+ Content(`| \`${field.name}\` | \`${canonToType(field.type, target.name)}\` | ${req} | ${desc} |
190
206
  `)
191
207
  })
192
208
 
@@ -196,15 +212,18 @@ ${ent.name} = client.${ent.Name}
196
212
  // Field operations breakdown
197
213
  const hasFieldOps = fields.some((f: any) => f.op && Object.keys(f.op).length > 0)
198
214
  if (hasFieldOps) {
215
+ // Only emit columns for operations this entity actually exposes —
216
+ // never advertise a create/update/remove column the entity lacks.
217
+ const opcols = ['load', 'list', 'create', 'update', 'remove']
218
+ .filter((op: string) => opnames.includes(op) && ent.op[op]?.active !== false)
199
219
  Content(`### Field Usage by Operation
200
220
 
201
- | Field | load | list | create | update | remove |
202
- | --- | --- | --- | --- | --- | --- |
221
+ | Field | ${opcols.join(' | ')} |
222
+ | --- | ${opcols.map(() => '---').join(' | ')} |
203
223
  `)
204
224
  each(fields, (field: any) => {
205
225
  const fops = field.op || {}
206
- const cols = ['load', 'list', 'create', 'update', 'remove'].map((op: string) => {
207
- if (!opnames.includes(op)) return '-'
226
+ const cols = opcols.map((op: string) => {
208
227
  const fop = fops[op]
209
228
  if (null == fop) return '-'
210
229
  if (fop.active === false) return '-'
@@ -239,25 +258,25 @@ ${info.desc}
239
258
  // Show example
240
259
  if ('load' === opname || 'remove' === opname) {
241
260
  Content(`\`\`\`ruby
242
- result, err = client.${ent.Name}.${opname}({ "id" => "${ent.name}_id" })
261
+ result = client.${ent.Name}.${opname}(${idF ? `{ "${idF}" => "${ent.name}_id" }` : ''})
243
262
  \`\`\`
244
263
 
245
264
  `)
246
265
  }
247
266
  else if ('list' === opname) {
248
267
  Content(`\`\`\`ruby
249
- results, err = client.${ent.Name}.list(nil)
268
+ results = client.${ent.Name}.list
250
269
  \`\`\`
251
270
 
252
271
  `)
253
272
  }
254
273
  else if ('create' === opname) {
255
274
  Content(`\`\`\`ruby
256
- result, err = client.${ent.Name}.create({
275
+ result = client.${ent.Name}.create({
257
276
  `)
258
277
  each(fields, (field: any) => {
259
278
  if ('id' !== field.name && field.req) {
260
- Content(` "${field.name}" => # ${field.type || 'value'},
279
+ Content(` "${field.name}" => ${rbLit(field.type)}, # ${canonToType(field.type, target.name)}
261
280
  `)
262
281
  }
263
282
  })
@@ -267,10 +286,10 @@ result, err = client.${ent.Name}.create({
267
286
  `)
268
287
  }
269
288
  else if ('update' === opname) {
289
+ const updateIdLine = idF ? ` "${idF}" => "${ent.name}_id",\n` : ''
270
290
  Content(`\`\`\`ruby
271
- result, err = client.${ent.Name}.update({
272
- "id" => "${ent.name}_id",
273
- # Fields to update
291
+ result = client.${ent.Name}.update({
292
+ ${updateIdLine} # Fields to update
274
293
  })
275
294
  \`\`\`
276
295
 
@@ -7,7 +7,7 @@ const ReadmeTopHowto = cmp(function ReadmeTopHowto(props: any) {
7
7
 
8
8
  Content(`**Ruby:**
9
9
  \`\`\`ruby
10
- result, err = client.direct({
10
+ result = client.direct({
11
11
  "path" => "/api/resource/{id}",
12
12
  "method" => "GET",
13
13
  "params" => { "id" => "example" },
@@ -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" => ENV["${model.NAME}_APIKEY"],\n`
20
- : ''
18
+ const authActive = isAuthActive(model)
19
+ const ctor = authActive
20
+ ? `${model.const.Name}SDK.new({\n "apikey" => ENV["${envName(model)}_APIKEY"],\n})`
21
+ : `${model.const.Name}SDK.new`
21
22
 
22
23
  Content(`\`\`\`ruby
23
24
  require_relative "${model.const.Name}_sdk"
24
25
 
25
- client = ${model.const.Name}SDK.new({${apikeyArg}})
26
+ 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
- Content(`# List all ${eName.toLowerCase()}s
35
- ${eName.toLowerCase()}s, err = client.${eName}(nil).list(nil, nil)
40
+ Content(`# List all ${eName.toLowerCase()}s (returns an Array; raises on error)
41
+ ${eName.toLowerCase()}s = client.${eName}.list
42
+ puts ${eName.toLowerCase()}s
36
43
  `)
44
+ hasCall = true
37
45
  }
38
46
 
39
47
  if (opnames.includes('load')) {
40
48
  Content(`
41
- # Load a specific ${eName.toLowerCase()}
42
- ${eName.toLowerCase()}, err = client.${eName}(nil).load(
43
- { "id" => "example_id" }, nil
44
- )
49
+ # Load a specific ${eName.toLowerCase()} (returns the bare record; raises on error)
50
+ ${eName.toLowerCase()} = client.${eName}.load(${idF ? `{ "${idF}" => "example_id" }` : ''})
51
+ puts ${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,17 @@ import {
8
8
  } from '@voxgig/apidef'
9
9
 
10
10
 
11
+ // A type-correct Ruby literal for a field's canonical type.
12
+ function rbLit(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) return '[]'
17
+ if ('OBJECT' === k) return '{}'
18
+ return '"example"'
19
+ }
20
+
21
+
11
22
  const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
12
23
  const { target, ctx$: { model } } = props
13
24
 
@@ -15,20 +26,41 @@ const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
15
26
 
16
27
  const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
17
28
 
18
- Content(`\`\`\`ruby
19
- client = ${model.const.Name}SDK.test(nil, nil)
20
- `)
21
-
22
29
  if (exampleEntity) {
23
30
  const eName = nom(exampleEntity, 'Name')
24
- Content(`result, err = client.${eName}(nil).load(
25
- { "id" => "test01" }, nil
26
- )
31
+ const ename = eName.toLowerCase()
32
+ // Model-driven id key: null when the entity has no id-like field, so the
33
+ // seeded record carries no id and a match op takes no argument.
34
+ const idF = entityIdField(exampleEntity)
35
+ // Drive the test-mode example off the entity's PRIMARY op — never a
36
+ // hardcoded `load` a create-only entity lacks.
37
+ const primaryOp = entityPrimaryOp(exampleEntity) || 'load'
38
+ const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
39
+ const recBody = idF ? `{ "${idF}" => "test01" }` : '{}'
40
+ let callArg = ''
41
+ if (isMatchOp) {
42
+ callArg = idF ? `{ "${idF}" => "test01" }` : ''
43
+ } else if ('create' === primaryOp || 'update' === primaryOp) {
44
+ const items = opRequestShape(exampleEntity, primaryOp).items
45
+ .filter((it: any) => it.name !== idF && it.name !== 'id')
46
+ const required = items.filter((it: any) => !it.optional)
47
+ const chosen = required.length ? required : items.slice(0, 3)
48
+ callArg = `{ ${chosen.map((it: any) => `"${it.name}" => ${rbLit(it.type)}`).join(', ')} }`
49
+ }
50
+ Content(`\`\`\`ruby
51
+ # Seed fixture data so offline calls resolve without a live server.
52
+ client = ${model.const.Name}SDK.test({
53
+ "entity" => { "${ename}" => { "test01" => ${recBody} } },
54
+ })
55
+ ${ename} = client.${eName}.${primaryOp}(${callArg})
56
+ \`\`\`
27
57
  `)
28
- }
29
-
30
- Content(`\`\`\`
58
+ } else {
59
+ Content(`\`\`\`ruby
60
+ client = ${model.const.Name}SDK.test
61
+ \`\`\`
31
62
  `)
63
+ }
32
64
 
33
65
  })
34
66