@voxgig/sdkgen 1.2.0 → 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 +13 -6
  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,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 = new ${model.Name}SDK([
25
26
 
26
27
  publishedOptions.map((option: any) => {
27
28
  if ('apikey' === option.name) {
28
- Content(` "${option.name}" => getenv("${model.NAME}_APIKEY"),
29
+ Content(` "${option.name}" => 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,9 +18,9 @@ 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" => getenv("${model.NAME}_APIKEY"),\n`
23
- : ''
21
+ const ctor = isAuthActive(model)
22
+ ? `new ${model.const.Name}SDK([\n "apikey" => getenv("${envName(model)}_APIKEY"),\n])`
23
+ : `new ${model.const.Name}SDK()`
24
24
 
25
25
  Content(`### 1. Create a client
26
26
 
@@ -28,27 +28,46 @@ const ReadmeQuick = cmp(function ReadmeQuick(props: any) {
28
28
  <?php
29
29
  require_once '${model.const.Name.toLowerCase()}_sdk.php';
30
30
 
31
- $client = new ${model.const.Name}SDK([${apikeyArg}]);
31
+ $client = ${ctor};
32
32
  \`\`\`
33
33
 
34
34
  `)
35
35
 
36
36
  if (exampleEntity) {
37
37
  const eName = nom(exampleEntity, 'Name')
38
+ const article = /^[aeiou]/i.test(eName) ? "an" : "a"
38
39
  const opnames = Object.keys(exampleEntity.op || {})
40
+ // Model-driven id key: `idF` is the MATCH key (null when none). `dataIdF` is
41
+ // the id on the RETURNED record's data type — an entity can key its match on
42
+ // an id it does not carry as data, so `["id"]` off a returned record must be
43
+ // guarded on this, not the match key.
44
+ const idF = entityIdField(exampleEntity)
45
+ const dataIdF = entityDataIdField(exampleEntity)
46
+
47
+ // Model-driven display field: the entity's first non-id string field
48
+ // (falling back to any non-id field), so the list example prints a real
49
+ // column instead of a hardcoded "name" the entity may not have.
50
+ const fields = exampleEntity.fields || []
51
+ const displayField =
52
+ fields.find((f: any) => f && f.name !== 'id' && f.type === '$STRING') ||
53
+ fields.find((f: any) => f && f.name !== 'id') ||
54
+ null
55
+ const idCol = dataIdF ? `$item[${JSON.stringify(dataIdF)}]` : null
56
+ const dispCol = displayField ? `$item[${JSON.stringify(displayField.name)}]` : null
57
+ const itemPrint = [idCol, dispCol].filter(Boolean).join(' . " " . ') || 'json_encode($item)'
39
58
 
40
59
  if (opnames.includes('list')) {
41
- Content(`### 2. List ${eName.toLowerCase()}s
60
+ Content(`### 2. List ${eName.toLowerCase()} records
42
61
 
43
62
  \`\`\`php
44
- [$result, $err] = $client->${eName}(null)->list(null, null);
45
- if ($err) { throw new \\Exception($err); }
46
-
47
- if (is_array($result)) {
48
- foreach ($result as $item) {
49
- $d = $item->data_get();
50
- echo $d["id"] . " " . $d["name"] . "\\n";
63
+ try {
64
+ // list() returns an array of ${eName} records — iterate directly.
65
+ $${eName.toLowerCase()}s = $client->${eName}()->list();
66
+ foreach ($${eName.toLowerCase()}s as $item) {
67
+ echo ${itemPrint} . "\\n";
51
68
  }
69
+ } catch (\\Throwable $err) {
70
+ echo "Error: " . $err->getMessage();
52
71
  }
53
72
  \`\`\`
54
73
 
@@ -56,37 +75,76 @@ if (is_array($result)) {
56
75
  }
57
76
 
58
77
  if (opnames.includes('load')) {
59
- Content(`### 3. Load a ${eName.toLowerCase()}
78
+ Content(`### 3. Load ${article} ${eName.toLowerCase()}
60
79
 
61
80
  \`\`\`php
62
- [$result, $err] = $client->${eName}(null)->load(["id" => "example_id"], null);
63
- if ($err) { throw new \\Exception($err); }
64
- print_r($result);
81
+ try {
82
+ // load() returns the bare ${eName} record (throws on error).
83
+ $${eName.toLowerCase()} = $client->${eName}()->load(${idF ? `["${idF}" => "example_id"]` : ''});
84
+ print_r($${eName.toLowerCase()});
85
+ } catch (\\Throwable $err) {
86
+ echo "Error: " . $err->getMessage();
87
+ }
65
88
  \`\`\`
66
89
 
67
90
  `)
68
91
  }
69
92
 
93
+ // Model-driven example fields: derive the create/update body from the op
94
+ // shape (opRequestShape) so the docs reference REAL writable fields, not a
95
+ // hardcoded "name" the entity may not have. Literals are PHP-typed by the
96
+ // field's canonical type.
97
+ const idField = (exampleEntity.id && exampleEntity.id.field) || 'id'
98
+ const phpLit = (type: any): string => {
99
+ const k = canonKey(type)
100
+ if ('INTEGER' === k || 'NUMBER' === k) return '1'
101
+ if ('BOOLEAN' === k) return 'true'
102
+ if ('ARRAY' === k || 'OBJECT' === k) return '[]'
103
+ return '"example"'
104
+ }
105
+ const examplePairs = (opname: string): string[] => {
106
+ const items = opRequestShape(exampleEntity, opname).items
107
+ .filter((it: any) => it.name !== idField && it.name !== 'id')
108
+ const required = items.filter((it: any) => !it.optional)
109
+ const chosen = 'create' === opname
110
+ ? (required.length ? required : items.slice(0, 2))
111
+ : items.slice(0, 2)
112
+ return chosen.map((it: any) => `"${it.name}" => ${phpLit(it.type)}`)
113
+ }
114
+
115
+ // The id VALUE for an update/remove match: off the returned `$created`
116
+ // record only when its data type carries the id AND a create ran, else a
117
+ // type-correct literal.
118
+ const idParamType = (opname: string): any => {
119
+ const it = opRequestShape(exampleEntity, opname).items.find((x: any) => x.name === idF)
120
+ return it && it.type
121
+ }
122
+ const idValueFor = (opname: string): string => (null != dataIdF && opnames.includes('create'))
123
+ ? `$created["${dataIdF}"]`
124
+ : phpLit(idParamType(opname))
125
+
70
126
  if (opnames.includes('create') || opnames.includes('update') || opnames.includes('remove')) {
71
127
  Content(`### 4. Create, update, and remove
72
128
 
73
129
  \`\`\`php
74
130
  `)
75
131
  if (opnames.includes('create')) {
76
- Content(`// Create
77
- [$created, $_] = $client->${eName}(null)->create(["name" => "Example"], null);
132
+ Content(`// create() returns the bare created ${eName} record.
133
+ $created = $client->${eName}()->create([${examplePairs('create').join(', ')}]);
78
134
 
79
135
  `)
80
136
  }
81
137
  if (opnames.includes('update')) {
82
- Content(`// Update
83
- $client->${eName}(null)->update(["id" => $created["id"], "name" => "Example-Renamed"], null);
138
+ const updatePairs = (idF ? [`"${idF}" => ${idValueFor('update')}`] : []).concat(examplePairs('update'))
139
+ const fromCreated = null != dataIdF && opnames.includes('create')
140
+ Content(`// Update${fromCreated ? ` — index the bare record directly ($created["${dataIdF}"]).` : ''}
141
+ $client->${eName}()->update([${updatePairs.join(', ')}]);
84
142
 
85
143
  `)
86
144
  }
87
145
  if (opnames.includes('remove')) {
88
146
  Content(`// Remove
89
- $client->${eName}(null)->remove(["id" => $created["id"]], null);
147
+ $client->${eName}()->remove(${idF ? `["${idF}" => ${idValueFor('remove')}]` : ''});
90
148
  `)
91
149
  }
92
150
  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,
@@ -9,29 +9,29 @@ import {
9
9
 
10
10
  const OP_SIGNATURES: Record<string, { sig: string, returns: string, desc: string }> = {
11
11
  load: {
12
- sig: 'load(array $reqmatch, ?array $ctrl = null): array',
13
- returns: 'array [$result, $err]',
14
- desc: 'Load a single entity matching the given criteria.',
12
+ sig: 'load(array $reqmatch, ?array $ctrl = null): mixed',
13
+ returns: 'mixed — the result data; throws on error',
14
+ desc: 'Load a single entity matching the given criteria. Throws on error.',
15
15
  },
16
16
  list: {
17
- sig: 'list(array $reqmatch, ?array $ctrl = null): array',
18
- returns: 'array [$result, $err]',
19
- desc: 'List entities matching the given criteria. Returns an array.',
17
+ sig: 'list(?array $reqmatch = null, ?array $ctrl = null): mixed',
18
+ returns: 'array the list of results; throws on error',
19
+ desc: 'List entities matching the given criteria (call with no argument to list all). Returns an array. Throws on error.',
20
20
  },
21
21
  create: {
22
- sig: 'create(array $reqdata, ?array $ctrl = null): array',
23
- returns: 'array [$result, $err]',
24
- desc: 'Create a new entity with the given data.',
22
+ sig: 'create(array $reqdata, ?array $ctrl = null): mixed',
23
+ returns: 'mixed — the result data; throws on error',
24
+ desc: 'Create a new entity with the given data. Throws on error.',
25
25
  },
26
26
  update: {
27
- sig: 'update(array $reqdata, ?array $ctrl = null): array',
28
- returns: 'array [$result, $err]',
29
- desc: 'Update an existing entity. The data must include the entity `id`.',
27
+ sig: 'update(array $reqdata, ?array $ctrl = null): mixed',
28
+ returns: 'mixed — the result data; throws on error',
29
+ desc: 'Update an existing entity. The data must include the entity `id`. Throws on error.',
30
30
  },
31
31
  remove: {
32
- sig: 'remove(array $reqmatch, ?array $ctrl = null): array',
33
- returns: 'array [$result, $err]',
34
- desc: 'Remove the entity matching the given criteria.',
32
+ sig: 'remove(array $reqmatch, ?array $ctrl = null): mixed',
33
+ returns: 'mixed — the result data; throws on error',
34
+ desc: 'Remove the entity matching the given criteria. Throws on error.',
35
35
  },
36
36
  }
37
37
 
@@ -60,7 +60,7 @@ Complete API reference for the ${model.Name} ${target.title} SDK.
60
60
  `)
61
61
 
62
62
  Content(`\`\`\`php
63
- require_once __DIR__ . '/${model.name}_sdk.php';
63
+ require_once __DIR__ . '/${model.const.Name.toLowerCase()}_sdk.php';
64
64
 
65
65
  $client = new ${model.const.Name}SDK($options);
66
66
  \`\`\`
@@ -72,8 +72,7 @@ Create a new SDK client instance.
72
72
  | Name | Type | Description |
73
73
  | --- | --- | --- |
74
74
  | \`$options\` | \`array\` | SDK configuration options. |
75
- | \`$options["apikey"]\` | \`string\` | API key for authentication. |
76
- | \`$options["base"]\` | \`string\` | Base URL for API requests. |
75
+ ${isAuthActive(model) ? '| \`$options["apikey"]\` | \`string\` | API key for authentication. |\n' : ''}| \`$options["base"]\` | \`string\` | Base URL for API requests. |
77
76
  | \`$options["prefix"]\` | \`string\` | URL prefix appended after base. |
78
77
  | \`$options["suffix"]\` | \`string\` | URL suffix appended after path. |
79
78
  | \`$options["headers"]\` | \`array\` | Custom headers for all requests. |
@@ -115,17 +114,20 @@ Create a new \`${ent.Name}Entity\` instance. Pass \`null\` for no initial data.
115
114
  })
116
115
 
117
116
 
118
- Content(`#### \`optionsMap(): array\`
117
+ Content(`#### \`options_map(): array\`
119
118
 
120
119
  Return a deep copy of the current SDK options.
121
120
 
122
- #### \`getUtility(): ProjectNameUtility\`
121
+ #### \`get_utility(): ${model.const.Name}Utility\`
123
122
 
124
123
  Return a copy of the SDK utility object.
125
124
 
126
125
  #### \`direct(array $fetchargs = []): array\`
127
126
 
128
- Make a direct HTTP request to any API endpoint. Returns \`[$result, $err]\`.
127
+ Make a direct HTTP request to any API endpoint. This is the raw-HTTP escape
128
+ hatch: it does **not** throw. It returns a result array
129
+ \`["ok" => bool, "status" => int, "headers" => array, "data" => mixed]\`, or
130
+ \`["ok" => false, "err" => \\Exception]\` on failure. Branch on \`$result["ok"]\`.
129
131
 
130
132
  **Parameters:**
131
133
 
@@ -139,11 +141,12 @@ Make a direct HTTP request to any API endpoint. Returns \`[$result, $err]\`.
139
141
  | \`$fetchargs["body"]\` | \`mixed\` | Request body (arrays are JSON-serialized). |
140
142
  | \`$fetchargs["ctrl"]\` | \`array\` | Control options. |
141
143
 
142
- **Returns:** \`array [$result, $err]\`
144
+ **Returns:** \`array\` — the result dict (see above); never throws.
143
145
 
144
- #### \`prepare(array $fetchargs = []): array\`
146
+ #### \`prepare(array $fetchargs = []): mixed\`
145
147
 
146
- Prepare a fetch definition without sending the request. Returns \`[$fetchdef, $err]\`.
148
+ Prepare a fetch definition without sending the request. Returns the
149
+ \`$fetchdef\` array. Throws on error.
147
150
 
148
151
  `)
149
152
 
@@ -152,6 +155,9 @@ Prepare a fetch definition without sending the request. Returns \`[$fetchdef, $e
152
155
  publishedEntities.map((ent: any) => {
153
156
  const opnames = Object.keys(ent.op || {})
154
157
  const fields = ent.fields || []
158
+ // Model-driven id key: null when this entity has no id-like field, in
159
+ // which case load/remove match on no argument and update omits the id.
160
+ const idF = entityIdField(ent)
155
161
 
156
162
  Content(`
157
163
  ---
@@ -183,7 +189,7 @@ $${ent.name} = $client->${ent.Name}();
183
189
  each(fields, (field: any) => {
184
190
  const req = field.req ? 'Yes' : 'No'
185
191
  const desc = field.short || ''
186
- Content(`| \`${field.name}\` | \`${field.type || 'any'}\` | ${req} | ${desc} |
192
+ Content(`| \`${field.name}\` | \`${canonToType(field.type, target.name)}\` | ${req} | ${desc} |
187
193
  `)
188
194
  })
189
195
 
@@ -193,15 +199,18 @@ $${ent.name} = $client->${ent.Name}();
193
199
  // Field operations breakdown
194
200
  const hasFieldOps = fields.some((f: any) => f.op && Object.keys(f.op).length > 0)
195
201
  if (hasFieldOps) {
202
+ // Only emit columns for operations this entity actually exposes —
203
+ // never advertise a create/update/remove column the entity lacks.
204
+ const opcols = ['load', 'list', 'create', 'update', 'remove']
205
+ .filter((op: string) => opnames.includes(op) && ent.op[op]?.active !== false)
196
206
  Content(`### Field Usage by Operation
197
207
 
198
- | Field | load | list | create | update | remove |
199
- | --- | --- | --- | --- | --- | --- |
208
+ | Field | ${opcols.join(' | ')} |
209
+ | --- | ${opcols.map(() => '---').join(' | ')} |
200
210
  `)
201
211
  each(fields, (field: any) => {
202
212
  const fops = field.op || {}
203
- const cols = ['load', 'list', 'create', 'update', 'remove'].map((op: string) => {
204
- if (!opnames.includes(op)) return '-'
213
+ const cols = opcols.map((op: string) => {
205
214
  const fop = fops[op]
206
215
  if (null == fop) return '-'
207
216
  if (fop.active === false) return '-'
@@ -236,25 +245,25 @@ ${info.desc}
236
245
  // Show example
237
246
  if ('load' === opname || 'remove' === opname) {
238
247
  Content(`\`\`\`php
239
- [$result, $err] = $client->${ent.Name}()->${opname}(["id" => "${ent.name}_id"]);
248
+ $result = $client->${ent.Name}()->${opname}(${idF ? `["${idF}" => "${ent.name}_id"]` : ''});
240
249
  \`\`\`
241
250
 
242
251
  `)
243
252
  }
244
253
  else if ('list' === opname) {
245
254
  Content(`\`\`\`php
246
- [$results, $err] = $client->${ent.Name}()->list([]);
255
+ $results = $client->${ent.Name}()->list();
247
256
  \`\`\`
248
257
 
249
258
  `)
250
259
  }
251
260
  else if ('create' === opname) {
252
261
  Content(`\`\`\`php
253
- [$result, $err] = $client->${ent.Name}()->create([
262
+ $result = $client->${ent.Name}()->create([
254
263
  `)
255
264
  each(fields, (field: any) => {
256
265
  if ('id' !== field.name && field.req) {
257
- Content(` "${field.name}" => /* ${field.type || 'value'} */,
266
+ Content(` "${field.name}" => null, // ${canonToType(field.type, target.name)}
258
267
  `)
259
268
  }
260
269
  })
@@ -264,10 +273,10 @@ ${info.desc}
264
273
  `)
265
274
  }
266
275
  else if ('update' === opname) {
276
+ const updateIdLine = idF ? ` "${idF}" => "${ent.name}_id",\n` : ''
267
277
  Content(`\`\`\`php
268
- [$result, $err] = $client->${ent.Name}()->update([
269
- "id" => "${ent.name}_id",
270
- // Fields to update
278
+ $result = $client->${ent.Name}()->update([
279
+ ${updateIdLine} // Fields to update
271
280
  ]);
272
281
  \`\`\`
273
282
 
@@ -280,19 +289,19 @@ ${info.desc}
280
289
  // Common methods
281
290
  Content(`### Common Methods
282
291
 
283
- #### \`dataGet(): array\`
292
+ #### \`data_get(): array\`
284
293
 
285
294
  Get the entity data. Returns a copy of the current data.
286
295
 
287
- #### \`dataSet($data): void\`
296
+ #### \`data_set($data): void\`
288
297
 
289
298
  Set the entity data.
290
299
 
291
- #### \`matchGet(): array\`
300
+ #### \`match_get(): array\`
292
301
 
293
302
  Get the entity match criteria.
294
303
 
295
- #### \`matchSet($match): void\`
304
+ #### \`match_set($match): void\`
296
305
 
297
306
  Set the entity match criteria.
298
307
 
@@ -301,7 +310,7 @@ Set the entity match criteria.
301
310
  Create a new \`${ent.Name}Entity\` instance with the same client and
302
311
  options.
303
312
 
304
- #### \`getName(): string\`
313
+ #### \`get_name(): string\`
305
314
 
306
315
  Return the entity name.
307
316
 
@@ -7,7 +7,7 @@ const ReadmeTopHowto = cmp(function ReadmeTopHowto(props: any) {
7
7
 
8
8
  Content(`**PHP:**
9
9
  \`\`\`php
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,35 +15,43 @@ 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" => getenv("${model.NAME}_APIKEY"),\n`
20
- : ''
18
+ const authActive = isAuthActive(model)
19
+ const ctor = authActive
20
+ ? `new ${model.const.Name}SDK([\n "apikey" => getenv("${envName(model)}_APIKEY"),\n])`
21
+ : `new ${model.const.Name}SDK()`
21
22
 
22
23
  Content(`\`\`\`php
23
24
  <?php
24
25
  require_once '${model.const.Name.toLowerCase()}_sdk.php';
25
26
 
26
- $client = new ${model.const.Name}SDK([${apikeyArg}]);
27
+ $client = ${ctor};
27
28
 
28
29
  `)
29
30
 
30
31
  if (exampleEntity) {
31
32
  const eName = nom(exampleEntity, 'Name')
32
33
  const opnames = Object.keys(exampleEntity.op || {})
34
+ // Model-driven id key: null when the entity has no id-like field, in which
35
+ // case the load example takes no match argument.
36
+ const idF = entityIdField(exampleEntity)
37
+
38
+ let hasCall = false
33
39
 
34
40
  if (opnames.includes('list')) {
35
- Content(`// List all ${eName.toLowerCase()}s
36
- [$${eName.toLowerCase()}s, $err] = $client->${eName}(null)->list(null, null);
41
+ Content(`// List all ${eName.toLowerCase()}s (returns an array; throws on error)
42
+ $${eName.toLowerCase()}s = $client->${eName}()->list();
43
+ print_r($${eName.toLowerCase()}s);
37
44
  `)
45
+ hasCall = true
38
46
  }
39
47
 
40
48
  if (opnames.includes('load')) {
41
49
  Content(`
42
- // Load a specific ${eName.toLowerCase()}
43
- [$${eName.toLowerCase()}, $err] = $client->${eName}(null)->load(
44
- ["id" => "example_id"], null
45
- );
50
+ // Load a specific ${eName.toLowerCase()} (returns the bare record; throws on error)
51
+ $${eName.toLowerCase()} = $client->${eName}()->load(${idF ? `["${idF}" => "example_id"]` : ''});
52
+ print_r($${eName.toLowerCase()});
46
53
  `)
54
+ hasCall = true
47
55
  }
48
56
  }
49
57
 
@@ -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,16 @@ import {
8
8
  } from '@voxgig/apidef'
9
9
 
10
10
 
11
+ // A type-correct PHP literal for a field's canonical type.
12
+ function phpLit(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
+
11
21
  const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
12
22
  const { target, ctx$: { model } } = props
13
23
 
@@ -15,20 +25,40 @@ const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
15
25
 
16
26
  const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
17
27
 
18
- Content(`\`\`\`php
19
- $client = ${model.const.Name}SDK::test(null, null);
20
- `)
21
-
22
28
  if (exampleEntity) {
23
29
  const eName = nom(exampleEntity, 'Name')
24
- Content(`[$result, $err] = $client->${eName}(null)->load(
25
- ["id" => "test01"], null
26
- );
30
+ const ename = eName.toLowerCase()
31
+ // Model-driven id key: null when the entity has no id-like field.
32
+ const idF = entityIdField(exampleEntity)
33
+ // Drive the test-mode example off the entity's PRIMARY op (never a hardcoded
34
+ // `load` a create-only entity lacks).
35
+ const primaryOp = entityPrimaryOp(exampleEntity) || 'load'
36
+ const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
37
+ const recBody = idF ? `["${idF}" => "test01"]` : '[]'
38
+ let callArg = ''
39
+ if (isMatchOp) {
40
+ callArg = idF ? `["${idF}" => "test01"]` : ''
41
+ } else if ('create' === primaryOp || 'update' === primaryOp) {
42
+ const items = opRequestShape(exampleEntity, primaryOp).items
43
+ .filter((it: any) => it.name !== idF && it.name !== 'id')
44
+ const required = items.filter((it: any) => !it.optional)
45
+ const chosen = required.length ? required : items.slice(0, 3)
46
+ callArg = `[${chosen.map((it: any) => `"${it.name}" => ${phpLit(it.type)}`).join(', ')}]`
47
+ }
48
+ Content(`\`\`\`php
49
+ // Seed fixture data so offline calls resolve without a live server.
50
+ $client = ${model.const.Name}SDK::test([
51
+ "entity" => ["${ename}" => ["test01" => ${recBody}]],
52
+ ]);
53
+ $${ename} = $client->${eName}()->${primaryOp}(${callArg});
54
+ \`\`\`
27
55
  `)
28
- }
29
-
30
- Content(`\`\`\`
56
+ } else {
57
+ Content(`\`\`\`php
58
+ $client = ${model.const.Name}SDK::test();
59
+ \`\`\`
31
60
  `)
61
+ }
32
62
 
33
63
  })
34
64
 
@@ -190,7 +190,7 @@ ${listSkipBlock} $client = $setup["client"];
190
190
  `)
191
191
  }
192
192
  Content(`
193
- [$result, $err] = $client->direct([
193
+ $result = $client->direct([
194
194
  "path" => "${listPath}",
195
195
  "method" => "GET",
196
196
  "params" => $params,
@@ -198,7 +198,7 @@ ${listSkipBlock} $client = $setup["client"];
198
198
  `)
199
199
  } else {
200
200
  Content(`
201
- [$result, $err] = $client->direct([
201
+ $result = $client->direct([
202
202
  "path" => "${listPath}",
203
203
  "method" => "GET",
204
204
  "params" => [],
@@ -210,8 +210,8 @@ ${listSkipBlock} $client = $setup["client"];
210
210
  // Live mode is lenient: synthetic IDs frequently 4xx and the
211
211
  // list-response shape varies wildly across public APIs. Skip
212
212
  // rather than fail when the call doesn't return a usable list.
213
- if ($err !== null) {
214
- $this->markTestSkipped("list call failed (likely synthetic IDs against live API): " . (string)$err);
213
+ if (!empty($result["err"])) {
214
+ $this->markTestSkipped("list call failed (likely synthetic IDs against live API): " . (string)$result["err"]);
215
215
  return;
216
216
  }
217
217
  if (empty($result["ok"])) {
@@ -224,7 +224,7 @@ ${listSkipBlock} $client = $setup["client"];
224
224
  return;
225
225
  }
226
226
  } else {
227
- $this->assertNull($err);
227
+ $this->assertArrayNotHasKey("err", $result);
228
228
  $this->assertTrue($result["ok"]);
229
229
  $this->assertEquals(200, Helpers::to_int($result["status"]));
230
230
  $this->assertIsArray($result["data"]);
@@ -300,7 +300,7 @@ ${loadLiveQueryLines}
300
300
  }
301
301
 
302
302
  Content(`
303
- [$result, $err] = $client->direct([
303
+ $result = $client->direct([
304
304
  "path" => "${loadPath}",
305
305
  "method" => "GET",
306
306
  `)
@@ -317,8 +317,8 @@ ${loadLiveQueryLines}
317
317
  // Live mode is lenient: synthetic IDs frequently 4xx. Skip
318
318
  // rather than fail when the load endpoint isn't reachable
319
319
  // with the IDs we can construct from setup.idmap.
320
- if ($err !== null) {
321
- $this->markTestSkipped("load call failed (likely synthetic IDs against live API): " . (string)$err);
320
+ if (!empty($result["err"])) {
321
+ $this->markTestSkipped("load call failed (likely synthetic IDs against live API): " . (string)$result["err"]);
322
322
  return;
323
323
  }
324
324
  if (empty($result["ok"])) {
@@ -331,7 +331,7 @@ ${loadLiveQueryLines}
331
331
  return;
332
332
  }
333
333
  } else {
334
- $this->assertNull($err);
334
+ $this->assertArrayNotHasKey("err", $result);
335
335
  $this->assertTrue($result["ok"]);
336
336
  $this->assertEquals(200, Helpers::to_int($result["status"]));
337
337
  $this->assertNotNull($result["data"]);