@voxgig/sdkgen 0.35.2 → 0.36.0

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 (385) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/cmp/Readme.js +5 -5
  3. package/dist/cmp/Readme.js.map +1 -1
  4. package/dist/cmp/ReadmeEntity.js +74 -24
  5. package/dist/cmp/ReadmeEntity.js.map +1 -1
  6. package/dist/cmp/ReadmeExplanation.d.ts +2 -0
  7. package/dist/cmp/ReadmeExplanation.js +308 -0
  8. package/dist/cmp/ReadmeExplanation.js.map +1 -0
  9. package/dist/cmp/ReadmeHowto.d.ts +2 -0
  10. package/dist/cmp/ReadmeHowto.js +18 -0
  11. package/dist/cmp/ReadmeHowto.js.map +1 -0
  12. package/dist/cmp/ReadmeIntro.js +8 -23
  13. package/dist/cmp/ReadmeIntro.js.map +1 -1
  14. package/dist/cmp/ReadmeModel.js +55 -91
  15. package/dist/cmp/ReadmeModel.js.map +1 -1
  16. package/dist/cmp/ReadmeOptions.js +35 -11
  17. package/dist/cmp/ReadmeOptions.js.map +1 -1
  18. package/dist/cmp/ReadmeQuick.js +4 -1
  19. package/dist/cmp/ReadmeQuick.js.map +1 -1
  20. package/dist/cmp/ReadmeRef.js +1042 -40
  21. package/dist/cmp/ReadmeRef.js.map +1 -1
  22. package/dist/cmp/ReadmeTop.d.ts +2 -0
  23. package/dist/cmp/ReadmeTop.js +171 -0
  24. package/dist/cmp/ReadmeTop.js.map +1 -0
  25. package/dist/sdkgen.d.ts +7 -1
  26. package/dist/sdkgen.js +13 -1
  27. package/dist/sdkgen.js.map +1 -1
  28. package/dist/tsconfig.tsbuildinfo +1 -1
  29. package/package.json +2 -2
  30. package/project/.sdk/model/feature/feature-index.jsonic +5 -0
  31. package/project/.sdk/model/feature/log.jsonic +5 -1
  32. package/project/.sdk/model/feature/test.jsonic +1 -1
  33. package/project/.sdk/model/target/lua.jsonic +23 -0
  34. package/project/.sdk/model/target/php.jsonic +22 -0
  35. package/project/.sdk/model/target/py.jsonic +23 -0
  36. package/project/.sdk/model/target/rb.jsonic +23 -0
  37. package/project/.sdk/src/cmp/go/Main_go.ts +2 -6
  38. package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +42 -0
  39. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +112 -0
  40. package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +29 -0
  41. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +129 -0
  42. package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +163 -0
  43. package/project/.sdk/src/cmp/go/ReadmeTopHowto_go.ts +24 -0
  44. package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +67 -0
  45. package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +40 -0
  46. package/project/.sdk/src/cmp/go/TestDirect_go.ts +46 -2
  47. package/project/.sdk/src/cmp/go/TestEntity_go.ts +360 -160
  48. package/project/.sdk/src/cmp/go/Test_go.ts +24 -1
  49. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +1 -1
  50. package/project/.sdk/src/cmp/lua/Config_lua.ts +112 -0
  51. package/project/.sdk/src/cmp/lua/EntityOperation_lua.ts +44 -0
  52. package/project/.sdk/src/cmp/lua/Entity_lua.ts +62 -0
  53. package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +23 -0
  54. package/project/.sdk/src/cmp/lua/Main_lua.ts +133 -0
  55. package/project/.sdk/src/cmp/lua/Package_lua.ts +80 -0
  56. package/project/.sdk/src/cmp/lua/ReadmeExplanation_lua.ts +42 -0
  57. package/project/.sdk/src/cmp/lua/ReadmeHowto_lua.ts +100 -0
  58. package/project/.sdk/src/cmp/lua/ReadmeInstall_lua.ts +26 -0
  59. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +129 -0
  60. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +99 -0
  61. package/project/.sdk/src/cmp/lua/ReadmeTopHowto_lua.ts +24 -0
  62. package/project/.sdk/src/cmp/lua/ReadmeTopQuick_lua.ts +55 -0
  63. package/project/.sdk/src/cmp/lua/ReadmeTopTest_lua.ts +38 -0
  64. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +261 -0
  65. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +483 -0
  66. package/project/.sdk/src/cmp/lua/Test_lua.ts +49 -0
  67. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +147 -0
  68. package/project/.sdk/src/cmp/lua/fragment/EntityCreateOp.fragment.lua +27 -0
  69. package/project/.sdk/src/cmp/lua/fragment/EntityListOp.fragment.lua +24 -0
  70. package/project/.sdk/src/cmp/lua/fragment/EntityLoadOp.fragment.lua +30 -0
  71. package/project/.sdk/src/cmp/lua/fragment/EntityRemoveOp.fragment.lua +30 -0
  72. package/project/.sdk/src/cmp/lua/fragment/EntityUpdateOp.fragment.lua +30 -0
  73. package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +256 -0
  74. package/project/.sdk/src/cmp/lua/fragment/SdkError.fragment.lua +26 -0
  75. package/project/.sdk/src/cmp/lua/tsconfig.json +15 -0
  76. package/project/.sdk/src/cmp/lua/utility_lua.ts +84 -0
  77. package/project/.sdk/src/cmp/php/Config_php.ts +107 -0
  78. package/project/.sdk/src/cmp/php/EntityOperation_php.ts +44 -0
  79. package/project/.sdk/src/cmp/php/Entity_php.ts +62 -0
  80. package/project/.sdk/src/cmp/php/MainEntity_php.ts +24 -0
  81. package/project/.sdk/src/cmp/php/Main_php.ts +135 -0
  82. package/project/.sdk/src/cmp/php/Package_php.ts +87 -0
  83. package/project/.sdk/src/cmp/php/ReadmeExplanation_php.ts +42 -0
  84. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +101 -0
  85. package/project/.sdk/src/cmp/php/ReadmeInstall_php.ts +19 -0
  86. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +129 -0
  87. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +100 -0
  88. package/project/.sdk/src/cmp/php/ReadmeTopHowto_php.ts +24 -0
  89. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +56 -0
  90. package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +38 -0
  91. package/project/.sdk/src/cmp/php/TestDirect_php.ts +270 -0
  92. package/project/.sdk/src/cmp/php/TestEntity_php.ts +484 -0
  93. package/project/.sdk/src/cmp/php/Test_php.ts +56 -0
  94. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +146 -0
  95. package/project/.sdk/src/cmp/php/fragment/EntityCreateOp.fragment.php +26 -0
  96. package/project/.sdk/src/cmp/php/fragment/EntityListOp.fragment.php +23 -0
  97. package/project/.sdk/src/cmp/php/fragment/EntityLoadOp.fragment.php +29 -0
  98. package/project/.sdk/src/cmp/php/fragment/EntityRemoveOp.fragment.php +29 -0
  99. package/project/.sdk/src/cmp/php/fragment/EntityUpdateOp.fragment.php +29 -0
  100. package/project/.sdk/src/cmp/php/fragment/Main.fragment.php +233 -0
  101. package/project/.sdk/src/cmp/php/fragment/SdkError.fragment.php +24 -0
  102. package/project/.sdk/src/cmp/php/tsconfig.json +15 -0
  103. package/project/.sdk/src/cmp/php/utility_php.ts +85 -0
  104. package/project/.sdk/src/cmp/py/Config_py.ts +93 -0
  105. package/project/.sdk/src/cmp/py/EntityOperation_py.ts +44 -0
  106. package/project/.sdk/src/cmp/py/Entity_py.ts +62 -0
  107. package/project/.sdk/src/cmp/py/MainEntity_py.ts +22 -0
  108. package/project/.sdk/src/cmp/py/Main_py.ts +156 -0
  109. package/project/.sdk/src/cmp/py/Package_py.ts +75 -0
  110. package/project/.sdk/src/cmp/py/ReadmeExplanation_py.ts +41 -0
  111. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +98 -0
  112. package/project/.sdk/src/cmp/py/ReadmeInstall_py.ts +25 -0
  113. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +130 -0
  114. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +100 -0
  115. package/project/.sdk/src/cmp/py/ReadmeTopHowto_py.ts +24 -0
  116. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +56 -0
  117. package/project/.sdk/src/cmp/py/ReadmeTopTest_py.ts +38 -0
  118. package/project/.sdk/src/cmp/py/TestDirect_py.ts +248 -0
  119. package/project/.sdk/src/cmp/py/TestEntity_py.ts +475 -0
  120. package/project/.sdk/src/cmp/py/Test_py.ts +55 -0
  121. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +112 -0
  122. package/project/.sdk/src/cmp/py/fragment/EntityCreateOp.fragment.py +25 -0
  123. package/project/.sdk/src/cmp/py/fragment/EntityListOp.fragment.py +22 -0
  124. package/project/.sdk/src/cmp/py/fragment/EntityLoadOp.fragment.py +27 -0
  125. package/project/.sdk/src/cmp/py/fragment/EntityRemoveOp.fragment.py +27 -0
  126. package/project/.sdk/src/cmp/py/fragment/EntityUpdateOp.fragment.py +27 -0
  127. package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +222 -0
  128. package/project/.sdk/src/cmp/py/fragment/SdkError.fragment.py +16 -0
  129. package/project/.sdk/src/cmp/py/tsconfig.json +15 -0
  130. package/project/.sdk/src/cmp/py/utility_py.ts +84 -0
  131. package/project/.sdk/src/cmp/rb/Config_rb.ts +101 -0
  132. package/project/.sdk/src/cmp/rb/EntityOperation_rb.ts +44 -0
  133. package/project/.sdk/src/cmp/rb/Entity_rb.ts +62 -0
  134. package/project/.sdk/src/cmp/rb/MainEntity_rb.ts +23 -0
  135. package/project/.sdk/src/cmp/rb/Main_rb.ts +130 -0
  136. package/project/.sdk/src/cmp/rb/Package_rb.ts +111 -0
  137. package/project/.sdk/src/cmp/rb/ReadmeExplanation_rb.ts +42 -0
  138. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +98 -0
  139. package/project/.sdk/src/cmp/rb/ReadmeInstall_rb.ts +31 -0
  140. package/project/.sdk/src/cmp/rb/ReadmeModel_rb.ts +129 -0
  141. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +99 -0
  142. package/project/.sdk/src/cmp/rb/ReadmeTopHowto_rb.ts +24 -0
  143. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +55 -0
  144. package/project/.sdk/src/cmp/rb/ReadmeTopTest_rb.ts +38 -0
  145. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +260 -0
  146. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +476 -0
  147. package/project/.sdk/src/cmp/rb/Test_rb.ts +50 -0
  148. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +116 -0
  149. package/project/.sdk/src/cmp/rb/fragment/EntityCreateOp.fragment.rb +25 -0
  150. package/project/.sdk/src/cmp/rb/fragment/EntityListOp.fragment.rb +20 -0
  151. package/project/.sdk/src/cmp/rb/fragment/EntityLoadOp.fragment.rb +26 -0
  152. package/project/.sdk/src/cmp/rb/fragment/EntityRemoveOp.fragment.rb +26 -0
  153. package/project/.sdk/src/cmp/rb/fragment/EntityUpdateOp.fragment.rb +26 -0
  154. package/project/.sdk/src/cmp/rb/fragment/Main.fragment.rb +203 -0
  155. package/project/.sdk/src/cmp/rb/fragment/SdkError.fragment.rb +16 -0
  156. package/project/.sdk/src/cmp/rb/tsconfig.json +15 -0
  157. package/project/.sdk/src/cmp/rb/utility_rb.ts +84 -0
  158. package/project/.sdk/src/cmp/ts/ReadmeExplanation_ts.ts +34 -0
  159. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +123 -0
  160. package/project/.sdk/src/cmp/ts/ReadmeInstall_ts.ts +1 -1
  161. package/project/.sdk/src/cmp/ts/ReadmeModel_ts.ts +159 -0
  162. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +69 -54
  163. package/project/.sdk/src/cmp/ts/ReadmeTopHowto_ts.ts +25 -0
  164. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +65 -0
  165. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +36 -0
  166. package/project/.sdk/tm/go/feature/log_feature.go +133 -0
  167. package/project/.sdk/tm/go/src/feature/log/.gitkeep +0 -0
  168. package/project/.sdk/tm/lua/LICENSE +22 -0
  169. package/project/.sdk/tm/lua/Makefile +10 -0
  170. package/project/.sdk/tm/lua/core/context.lua +208 -0
  171. package/project/.sdk/tm/lua/core/control.lua +17 -0
  172. package/project/.sdk/tm/lua/core/error.lua +30 -0
  173. package/project/.sdk/tm/lua/core/helpers.lua +30 -0
  174. package/project/.sdk/tm/lua/core/operation.lua +51 -0
  175. package/project/.sdk/tm/lua/core/response.lua +45 -0
  176. package/project/.sdk/tm/lua/core/result.lua +58 -0
  177. package/project/.sdk/tm/lua/core/spec.lua +29 -0
  178. package/project/.sdk/tm/lua/core/utility_type.lua +90 -0
  179. package/project/.sdk/tm/lua/feature/base_feature.lua +35 -0
  180. package/project/.sdk/tm/lua/feature/log_feature.lua +80 -0
  181. package/project/.sdk/tm/lua/feature/test_feature.lua +202 -0
  182. package/project/.sdk/tm/lua/src/feature/README.md +3 -0
  183. package/project/.sdk/tm/lua/src/feature/base/.gitkeep +0 -0
  184. package/project/.sdk/tm/lua/src/feature/log/.gitkeep +0 -0
  185. package/project/.sdk/tm/lua/src/feature/test/.gitkeep +0 -0
  186. package/project/.sdk/tm/lua/test/runner.lua +86 -0
  187. package/project/.sdk/tm/lua/utility/clean.lua +7 -0
  188. package/project/.sdk/tm/lua/utility/done.lua +19 -0
  189. package/project/.sdk/tm/lua/utility/feature_add.lua +8 -0
  190. package/project/.sdk/tm/lua/utility/feature_hook.lua +21 -0
  191. package/project/.sdk/tm/lua/utility/feature_init.lua +24 -0
  192. package/project/.sdk/tm/lua/utility/fetcher.lua +96 -0
  193. package/project/.sdk/tm/lua/utility/make_context.lua +9 -0
  194. package/project/.sdk/tm/lua/utility/make_error.lua +73 -0
  195. package/project/.sdk/tm/lua/utility/make_fetch_def.lua +43 -0
  196. package/project/.sdk/tm/lua/utility/make_options.lua +116 -0
  197. package/project/.sdk/tm/lua/utility/make_point.lua +92 -0
  198. package/project/.sdk/tm/lua/utility/make_request.lua +58 -0
  199. package/project/.sdk/tm/lua/utility/make_response.lua +44 -0
  200. package/project/.sdk/tm/lua/utility/make_result.lua +51 -0
  201. package/project/.sdk/tm/lua/utility/make_spec.lua +72 -0
  202. package/project/.sdk/tm/lua/utility/make_url.lua +46 -0
  203. package/project/.sdk/tm/lua/utility/param.lua +68 -0
  204. package/project/.sdk/tm/lua/utility/prepare_auth.lua +39 -0
  205. package/project/.sdk/tm/lua/utility/prepare_body.lua +14 -0
  206. package/project/.sdk/tm/lua/utility/prepare_headers.lua +20 -0
  207. package/project/.sdk/tm/lua/utility/prepare_method.lua +17 -0
  208. package/project/.sdk/tm/lua/utility/prepare_params.lua +36 -0
  209. package/project/.sdk/tm/lua/utility/prepare_path.lua +19 -0
  210. package/project/.sdk/tm/lua/utility/prepare_query.lua +41 -0
  211. package/project/.sdk/tm/lua/utility/register.lua +71 -0
  212. package/project/.sdk/tm/lua/utility/result_basic.lua +32 -0
  213. package/project/.sdk/tm/lua/utility/result_body.lua +17 -0
  214. package/project/.sdk/tm/lua/utility/result_headers.lua +22 -0
  215. package/project/.sdk/tm/lua/utility/struct/struct.lua +3417 -0
  216. package/project/.sdk/tm/lua/utility/transform_request.lua +31 -0
  217. package/project/.sdk/tm/lua/utility/transform_response.lua +44 -0
  218. package/project/.sdk/tm/php/LICENSE +22 -0
  219. package/project/.sdk/tm/php/Makefile +10 -0
  220. package/project/.sdk/tm/php/core/Context.php +139 -0
  221. package/project/.sdk/tm/php/core/Control.php +18 -0
  222. package/project/.sdk/tm/php/core/Error.php +37 -0
  223. package/project/.sdk/tm/php/core/Helpers.php +25 -0
  224. package/project/.sdk/tm/php/core/Operation.php +36 -0
  225. package/project/.sdk/tm/php/core/Response.php +30 -0
  226. package/project/.sdk/tm/php/core/Result.php +35 -0
  227. package/project/.sdk/tm/php/core/Spec.php +38 -0
  228. package/project/.sdk/tm/php/core/UtilityType.php +89 -0
  229. package/project/.sdk/tm/php/feature/BaseFeature.php +37 -0
  230. package/project/.sdk/tm/php/feature/LogFeature.php +65 -0
  231. package/project/.sdk/tm/php/feature/TestFeature.php +193 -0
  232. package/project/.sdk/tm/php/src/feature/README.md +3 -0
  233. package/project/.sdk/tm/php/src/feature/base/.gitkeep +0 -0
  234. package/project/.sdk/tm/php/src/feature/log/.gitkeep +0 -0
  235. package/project/.sdk/tm/php/src/feature/test/.gitkeep +0 -0
  236. package/project/.sdk/tm/php/test/Runner.php +89 -0
  237. package/project/.sdk/tm/php/utility/Clean.php +12 -0
  238. package/project/.sdk/tm/php/utility/Done.php +26 -0
  239. package/project/.sdk/tm/php/utility/FeatureAdd.php +12 -0
  240. package/project/.sdk/tm/php/utility/FeatureHook.php +23 -0
  241. package/project/.sdk/tm/php/utility/FeatureInit.php +25 -0
  242. package/project/.sdk/tm/php/utility/Fetcher.php +101 -0
  243. package/project/.sdk/tm/php/utility/MakeContext.php +14 -0
  244. package/project/.sdk/tm/php/utility/MakeError.php +59 -0
  245. package/project/.sdk/tm/php/utility/MakeFetchDef.php +36 -0
  246. package/project/.sdk/tm/php/utility/MakeOptions.php +98 -0
  247. package/project/.sdk/tm/php/utility/MakePoint.php +87 -0
  248. package/project/.sdk/tm/php/utility/MakeRequest.php +57 -0
  249. package/project/.sdk/tm/php/utility/MakeResponse.php +43 -0
  250. package/project/.sdk/tm/php/utility/MakeResult.php +50 -0
  251. package/project/.sdk/tm/php/utility/MakeSpec.php +64 -0
  252. package/project/.sdk/tm/php/utility/MakeUrl.php +41 -0
  253. package/project/.sdk/tm/php/utility/Param.php +66 -0
  254. package/project/.sdk/tm/php/utility/PrepareAuth.php +33 -0
  255. package/project/.sdk/tm/php/utility/PrepareBody.php +15 -0
  256. package/project/.sdk/tm/php/utility/PrepareHeaders.php +18 -0
  257. package/project/.sdk/tm/php/utility/PrepareMethod.php +21 -0
  258. package/project/.sdk/tm/php/utility/PrepareParams.php +34 -0
  259. package/project/.sdk/tm/php/utility/PreparePath.php +20 -0
  260. package/project/.sdk/tm/php/utility/PrepareQuery.php +32 -0
  261. package/project/.sdk/tm/php/utility/Register.php +67 -0
  262. package/project/.sdk/tm/php/utility/ResultBasic.php +29 -0
  263. package/project/.sdk/tm/php/utility/ResultBody.php +17 -0
  264. package/project/.sdk/tm/php/utility/ResultHeaders.php +21 -0
  265. package/project/.sdk/tm/php/utility/TransformRequest.php +27 -0
  266. package/project/.sdk/tm/php/utility/TransformResponse.php +42 -0
  267. package/project/.sdk/tm/php/utility/struct/Struct.php +3431 -0
  268. package/project/.sdk/tm/py/Makefile +10 -0
  269. package/project/.sdk/tm/py/core/__init__.py +0 -0
  270. package/project/.sdk/tm/py/core/context.py +199 -0
  271. package/project/.sdk/tm/py/core/control.py +12 -0
  272. package/project/.sdk/tm/py/core/error.py +18 -0
  273. package/project/.sdk/tm/py/core/helpers.py +15 -0
  274. package/project/.sdk/tm/py/core/operation.py +37 -0
  275. package/project/.sdk/tm/py/core/response.py +34 -0
  276. package/project/.sdk/tm/py/core/result.py +44 -0
  277. package/project/.sdk/tm/py/core/spec.py +23 -0
  278. package/project/.sdk/tm/py/core/utility_type.py +82 -0
  279. package/project/.sdk/tm/py/entity/__init__.py +0 -0
  280. package/project/.sdk/tm/py/feature/__init__.py +0 -0
  281. package/project/.sdk/tm/py/feature/base_feature.py +61 -0
  282. package/project/.sdk/tm/py/feature/log_feature.py +84 -0
  283. package/project/.sdk/tm/py/feature/test_feature.py +164 -0
  284. package/project/.sdk/tm/py/src/feature/README.md +3 -0
  285. package/project/.sdk/tm/py/src/feature/base/.gitkeep +0 -0
  286. package/project/.sdk/tm/py/src/feature/log/.gitkeep +0 -0
  287. package/project/.sdk/tm/py/src/feature/test/.gitkeep +0 -0
  288. package/project/.sdk/tm/py/test/__init__.py +0 -0
  289. package/project/.sdk/tm/py/test/runner.py +77 -0
  290. package/project/.sdk/tm/py/utility/__init__.py +0 -0
  291. package/project/.sdk/tm/py/utility/clean.py +5 -0
  292. package/project/.sdk/tm/py/utility/done.py +14 -0
  293. package/project/.sdk/tm/py/utility/feature_add.py +6 -0
  294. package/project/.sdk/tm/py/utility/feature_hook.py +15 -0
  295. package/project/.sdk/tm/py/utility/feature_init.py +18 -0
  296. package/project/.sdk/tm/py/utility/fetcher.py +95 -0
  297. package/project/.sdk/tm/py/utility/make_context.py +7 -0
  298. package/project/.sdk/tm/py/utility/make_error.py +64 -0
  299. package/project/.sdk/tm/py/utility/make_fetch_def.py +37 -0
  300. package/project/.sdk/tm/py/utility/make_options.py +103 -0
  301. package/project/.sdk/tm/py/utility/make_point.py +74 -0
  302. package/project/.sdk/tm/py/utility/make_request.py +52 -0
  303. package/project/.sdk/tm/py/utility/make_response.py +36 -0
  304. package/project/.sdk/tm/py/utility/make_result.py +41 -0
  305. package/project/.sdk/tm/py/utility/make_spec.py +68 -0
  306. package/project/.sdk/tm/py/utility/make_url.py +34 -0
  307. package/project/.sdk/tm/py/utility/param.py +55 -0
  308. package/project/.sdk/tm/py/utility/prepare_auth.py +34 -0
  309. package/project/.sdk/tm/py/utility/prepare_body.py +11 -0
  310. package/project/.sdk/tm/py/utility/prepare_headers.py +17 -0
  311. package/project/.sdk/tm/py/utility/prepare_method.py +15 -0
  312. package/project/.sdk/tm/py/utility/prepare_params.py +28 -0
  313. package/project/.sdk/tm/py/utility/prepare_path.py +16 -0
  314. package/project/.sdk/tm/py/utility/prepare_query.py +33 -0
  315. package/project/.sdk/tm/py/utility/register.py +68 -0
  316. package/project/.sdk/tm/py/utility/result_basic.py +26 -0
  317. package/project/.sdk/tm/py/utility/result_body.py +13 -0
  318. package/project/.sdk/tm/py/utility/result_headers.py +17 -0
  319. package/project/.sdk/tm/py/utility/transform_request.py +27 -0
  320. package/project/.sdk/tm/py/utility/transform_response.py +39 -0
  321. package/project/.sdk/tm/py/utility/voxgig_struct/__init__.py +72 -0
  322. package/project/.sdk/tm/py/utility/voxgig_struct/voxgig_struct.py +2770 -0
  323. package/project/.sdk/tm/rb/Gemfile +4 -0
  324. package/project/.sdk/tm/rb/LICENSE +22 -0
  325. package/project/.sdk/tm/rb/Makefile +10 -0
  326. package/project/.sdk/tm/rb/core/context.rb +105 -0
  327. package/project/.sdk/tm/rb/core/control.rb +11 -0
  328. package/project/.sdk/tm/rb/core/error.rb +24 -0
  329. package/project/.sdk/tm/rb/core/helpers.rb +16 -0
  330. package/project/.sdk/tm/rb/core/operation.rb +26 -0
  331. package/project/.sdk/tm/rb/core/response.rb +20 -0
  332. package/project/.sdk/tm/rb/core/result.rb +23 -0
  333. package/project/.sdk/tm/rb/core/spec.rb +23 -0
  334. package/project/.sdk/tm/rb/core/utility_type.rb +32 -0
  335. package/project/.sdk/tm/rb/feature/base_feature.rb +30 -0
  336. package/project/.sdk/tm/rb/feature/log_feature.rb +50 -0
  337. package/project/.sdk/tm/rb/feature/test_feature.rb +154 -0
  338. package/project/.sdk/tm/rb/src/feature/README.md +3 -0
  339. package/project/.sdk/tm/rb/src/feature/base/.gitkeep +0 -0
  340. package/project/.sdk/tm/rb/src/feature/log/.gitkeep +0 -0
  341. package/project/.sdk/tm/rb/src/feature/test/.gitkeep +0 -0
  342. package/project/.sdk/tm/rb/test/runner.rb +65 -0
  343. package/project/.sdk/tm/rb/utility/clean.rb +4 -0
  344. package/project/.sdk/tm/rb/utility/done.rb +14 -0
  345. package/project/.sdk/tm/rb/utility/feature_add.rb +6 -0
  346. package/project/.sdk/tm/rb/utility/feature_hook.rb +11 -0
  347. package/project/.sdk/tm/rb/utility/feature_init.rb +16 -0
  348. package/project/.sdk/tm/rb/utility/fetcher.rb +67 -0
  349. package/project/.sdk/tm/rb/utility/make_context.rb +7 -0
  350. package/project/.sdk/tm/rb/utility/make_error.rb +44 -0
  351. package/project/.sdk/tm/rb/utility/make_fetch_def.rb +24 -0
  352. package/project/.sdk/tm/rb/utility/make_options.rb +57 -0
  353. package/project/.sdk/tm/rb/utility/make_point.rb +77 -0
  354. package/project/.sdk/tm/rb/utility/make_request.rb +44 -0
  355. package/project/.sdk/tm/rb/utility/make_response.rb +25 -0
  356. package/project/.sdk/tm/rb/utility/make_result.rb +33 -0
  357. package/project/.sdk/tm/rb/utility/make_spec.rb +50 -0
  358. package/project/.sdk/tm/rb/utility/make_url.rb +32 -0
  359. package/project/.sdk/tm/rb/utility/param.rb +48 -0
  360. package/project/.sdk/tm/rb/utility/prepare_auth.rb +26 -0
  361. package/project/.sdk/tm/rb/utility/prepare_body.rb +6 -0
  362. package/project/.sdk/tm/rb/utility/prepare_headers.rb +11 -0
  363. package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -0
  364. package/project/.sdk/tm/rb/utility/prepare_params.rb +25 -0
  365. package/project/.sdk/tm/rb/utility/prepare_path.rb +13 -0
  366. package/project/.sdk/tm/rb/utility/prepare_query.rb +22 -0
  367. package/project/.sdk/tm/rb/utility/register.rb +63 -0
  368. package/project/.sdk/tm/rb/utility/result_basic.rb +23 -0
  369. package/project/.sdk/tm/rb/utility/result_body.rb +11 -0
  370. package/project/.sdk/tm/rb/utility/result_headers.rb +15 -0
  371. package/project/.sdk/tm/rb/utility/struct/voxgig_struct.rb +2256 -0
  372. package/project/.sdk/tm/rb/utility/transform_request.rb +15 -0
  373. package/project/.sdk/tm/rb/utility/transform_response.rb +23 -0
  374. package/src/cmp/Readme.ts +5 -5
  375. package/src/cmp/ReadmeEntity.ts +77 -25
  376. package/src/cmp/ReadmeExplanation.ts +333 -0
  377. package/src/cmp/ReadmeHowto.ts +28 -0
  378. package/src/cmp/ReadmeIntro.ts +10 -24
  379. package/src/cmp/ReadmeModel.ts +57 -88
  380. package/src/cmp/ReadmeOptions.ts +40 -11
  381. package/src/cmp/ReadmeQuick.ts +4 -1
  382. package/src/cmp/ReadmeRef.ts +1057 -40
  383. package/src/cmp/ReadmeTop.ts +213 -0
  384. package/src/sdkgen.ts +12 -0
  385. package/project/.sdk/tm/go/test/exists_test.go +0 -16
@@ -1,4 +1,10 @@
1
1
 
2
+ import {
3
+ flatten,
4
+ items,
5
+ join,
6
+ } from '@voxgig/struct'
7
+
2
8
  import {
3
9
  KIT,
4
10
  getModelPath,
@@ -13,6 +19,23 @@ import {
13
19
  } from '@voxgig/sdkgen'
14
20
 
15
21
 
22
+ // Convert snake_case to camelCase for Go variable names.
23
+ function goVar(name: string): string {
24
+ return name.replace(/_([a-z0-9])/g, (_: any, c: string) => c.toUpperCase())
25
+ }
26
+
27
+
28
+ type OpGen = (ctx: GenCtx, step: any, index: any) => void
29
+
30
+ type GenCtx = {
31
+ model: any
32
+ entity: any
33
+ gomodule: string
34
+ flow: any
35
+ PROJUPPER: string
36
+ }
37
+
38
+
16
39
  const TestEntity = cmp(function TestEntity(props: any) {
17
40
  const ctx$ = props.ctx$
18
41
  const model = ctx$.model
@@ -28,20 +51,9 @@ const TestEntity = cmp(function TestEntity(props: any) {
28
51
  return
29
52
  }
30
53
 
31
- const steps = basicflow.step || []
32
- const createStep = steps.find((s: any) => s.op === 'create')
33
- const updateStep = steps.find((s: any) => s.op === 'update')
34
- const listSteps = steps.filter((s: any) => s.op === 'list')
35
- const firstListStep = listSteps[0]
36
- const lastListStep = listSteps[listSteps.length - 1]
54
+ const PROJUPPER = model.const.Name.toUpperCase().replace(/[^A-Z_]/g, '_')
37
55
 
38
- const ref = createStep?.input?.ref || entity.name + '_ref01'
39
- // Convert snake_case ref to camelCase for Go variable names
40
- const refVar = ref.replace(/_([a-z0-9])/g, (_: any, c: string) => c.toUpperCase())
41
56
  const ancestors = (entity.relations?.ancestors || []).flat()
42
- const PROJUPPER = model.const.Name.toUpperCase().replace(/[^A-Z_]/g, '_')
43
- const textfield = updateStep?.input?.textfield || 'kind'
44
- const mark = updateStep?.spec?.[0]?.def?.mark || `Mark01-${ref}`
45
57
 
46
58
  // Build idmap names: entity's own + ancestor ids
47
59
  const idnames: string[] = []
@@ -50,25 +62,17 @@ const TestEntity = cmp(function TestEntity(props: any) {
50
62
  for (let i = 1; i <= 3; i++) idnames.push(`${anc}0${i}`)
51
63
  }
52
64
 
53
- // Get match entries from flow steps (filter out $ keys)
54
- const getMatch = (step: any) => {
55
- if (!step?.match) return []
56
- return Object.entries(step.match).filter(([k]: any) => !k.endsWith('$'))
57
- }
58
-
59
- const createMatch = getMatch(createStep)
60
- const firstListMatch = getMatch(firstListStep)
61
- const lastListMatch = getMatch(lastListStep)
65
+ const idnamesStr = idnames.map(n => `"${n}"`).join(', ')
62
66
 
63
- // Get update data entries (non-id, non-$ keys)
67
+ // Get all update data entries for alias generation
68
+ const allSteps = Object.values(basicflow.step) as any[]
69
+ const updateStep = allSteps.find((s: any) => s.op === 'update')
64
70
  const updateData = updateStep?.data
65
71
  ? Object.entries(updateStep.data).filter(([k]: any) => k !== 'id' && !k.endsWith('$'))
66
72
  : []
67
-
68
- // Aliases needed from update data entries
69
73
  const aliases = updateData.map(([k, v]: any) => [k, v])
70
74
 
71
- const idnamesStr = idnames.map(n => `"${n}"`).join(', ')
75
+ const genCtx: GenCtx = { model, entity, gomodule, flow: basicflow, PROJUPPER }
72
76
 
73
77
  File({ name: entity.name + '_entity_test.' + target.ext }, () => {
74
78
 
@@ -102,150 +106,32 @@ func Test${entity.Name}Entity(t *testing.T) {
102
106
  setup := ${entity.name}BasicSetup(nil)
103
107
  client := setup.client
104
108
 
105
- // CREATE
106
- ${entity.name}Ent := client.${entity.Name}(nil)
107
- ${refVar}Data := core.ToMapAny(vs.GetProp(
108
- vs.GetPath([]any{"new", "${entity.name}"}, setup.data), "${ref}"))
109
- `)
110
-
111
- // Add create match entries
112
- for (const [key, val] of createMatch) {
113
- Content(` ${refVar}Data["${key}"] = setup.idmap["${val}"]
114
- `)
115
- }
116
-
117
- Content(`
118
- createResult, err := ${entity.name}Ent.Create(${refVar}Data, nil)
119
- if err != nil {
120
- t.Fatalf("create failed: %v", err)
121
- }
122
- createData := core.ToMapAny(createResult)
123
- if createData == nil {
124
- t.Fatal("expected create result to be a map")
125
- }
126
- if createData["id"] == nil {
127
- t.Fatal("expected created entity to have an id")
128
- }
129
-
130
- // LIST
131
- `)
132
-
133
- // Generate list match map
134
- if (firstListMatch.length === 0) {
135
- Content(` ${refVar}Match := map[string]any{}
136
- `)
137
- } else {
138
- Content(` ${refVar}Match := map[string]any{
139
- `)
140
- for (const [key, val] of firstListMatch) {
141
- Content(` "${key}": setup.idmap["${val}"],
142
109
  `)
143
- }
144
- Content(` }
145
- `)
146
- }
147
-
148
- Content(` listResult, err := ${entity.name}Ent.List(${refVar}Match, nil)
149
- if err != nil {
150
- t.Fatalf("list failed: %v", err)
151
- }
152
- listData, ok := listResult.([]any)
153
- if !ok {
154
- t.Fatalf("expected list result to be an array, got %T", listResult)
155
- }
156
110
 
157
- found := vs.Select(entityListToData(listData), map[string]any{"id": createData["id"]})
158
- if vs.IsEmpty(found) {
159
- t.Fatal("expected to find created entity in list")
111
+ // Check if the flow has a create step; if not, bootstrap entity data
112
+ const flowHasCreate = allSteps.some((s: any) => s.op === 'create')
113
+ if (!flowHasCreate) {
114
+ const preambleRef = entity.name + '_ref01'
115
+ Content(` // Bootstrap entity data from existing test data (no create step in flow).
116
+ ${goVar(preambleRef)}DataRaw := vs.Items(core.ToMapAny(vs.GetProp(setup.data, "existing.${entity.name}")))
117
+ var ${goVar(preambleRef)}Data map[string]any
118
+ if len(${goVar(preambleRef)}DataRaw) > 0 {
119
+ ${goVar(preambleRef)}Data = core.ToMapAny(${goVar(preambleRef)}DataRaw[0][1])
160
120
  }
161
121
 
162
- // UPDATE
163
- markValue := fmt.Sprintf("${mark}_%d", setup.now)
164
- ${refVar}DataUp := map[string]any{
165
- "id": createData["id"],
166
- `)
167
-
168
- // Add update data entries
169
- for (const [key] of updateData) {
170
- Content(` "${key}": setup.idmap["${key}"],
171
122
  `)
172
123
  }
173
124
 
174
- Content(` "${textfield}": markValue,
175
- }
176
-
177
- updateResult, err := ${entity.name}Ent.Update(${refVar}DataUp, nil)
178
- if err != nil {
179
- t.Fatalf("update failed: %v", err)
180
- }
181
- updateData := core.ToMapAny(updateResult)
182
- if updateData == nil {
183
- t.Fatal("expected update result to be a map")
184
- }
185
- if updateData["id"] != createData["id"] {
186
- t.Fatal("expected update result id to match")
187
- }
188
- if updateData["${textfield}"] != markValue {
189
- t.Fatalf("expected ${textfield} to be updated, got %v", updateData["${textfield}"])
190
- }
191
-
192
- // LOAD
193
- ${refVar}MatchDt := map[string]any{
194
- "id": createData["id"],
195
- }
196
- loadResult, err := ${entity.name}Ent.Load(${refVar}MatchDt, nil)
197
- if err != nil {
198
- t.Fatalf("load failed: %v", err)
199
- }
200
- loadData := core.ToMapAny(loadResult)
201
- if loadData == nil {
202
- t.Fatal("expected load result to be a map")
203
- }
204
- if loadData["id"] != createData["id"] {
205
- t.Fatal("expected load result id to match")
206
- }
207
-
208
- // REMOVE
209
- ${refVar}MatchRm := map[string]any{
210
- "id": createData["id"],
211
- }
212
- _, err = ${entity.name}Ent.Remove(${refVar}MatchRm, nil)
213
- if err != nil {
214
- t.Fatalf("remove failed: %v", err)
215
- }
216
-
217
- // LIST (verify removed)
218
- `)
219
-
220
- // Generate verify list match map
221
- if (lastListMatch.length === 0) {
222
- Content(` ${refVar}MatchRt := map[string]any{}
223
- `)
224
- } else {
225
- Content(` ${refVar}MatchRt := map[string]any{
226
- `)
227
- for (const [key, val] of lastListMatch) {
228
- Content(` "${key}": setup.idmap["${val}"],
229
- `)
125
+ // Model-driven step iteration
126
+ each(basicflow.step, (step: any, index: any) => {
127
+ const opgen: OpGen = GENERATE_OP[step.op]
128
+ if (opgen) {
129
+ opgen(genCtx, step, index)
130
+ Content('\n')
230
131
  }
231
- Content(` }
232
- `)
233
- }
234
-
235
- Content(` listResult2, err := ${entity.name}Ent.List(${refVar}MatchRt, nil)
236
- if err != nil {
237
- t.Fatalf("list after remove failed: %v", err)
238
- }
239
- listData2, ok := listResult2.([]any)
240
- if !ok {
241
- t.Fatalf("expected list result to be an array, got %T", listResult2)
242
- }
132
+ })
243
133
 
244
- found2 := vs.Select(entityListToData(listData2), map[string]any{"id": createData["id"]})
245
- if !vs.IsEmpty(found2) {
246
- t.Fatal("expected removed entity to not be in list")
247
- }
248
- })
134
+ Content(` })
249
135
  }
250
136
 
251
137
  `)
@@ -336,6 +222,320 @@ func Test${entity.Name}Entity(t *testing.T) {
336
222
  })
337
223
 
338
224
 
225
+ // Get match entries from a step, filtering out $ keys.
226
+ function getMatchEntries(step: any): [string, any][] {
227
+ if (!step?.match) return []
228
+ return Object.entries(step.match).filter(([k]: any) => !k.endsWith('$'))
229
+ }
230
+
231
+
232
+ const generateCreate: OpGen = (ctx, step, index) => {
233
+ const { entity, flow } = ctx
234
+ const ref = step.input?.ref ?? entity.name + '_ref01'
235
+ const entvar = goVar(step.input?.entvar ?? ref + '_ent')
236
+ const datavar = goVar(step.input?.datavar ?? (ref + '_data' + (step.input?.suffix ?? '')))
237
+
238
+ const priorSteps = Object.values(flow.step).slice(0, Number(index)) as any[]
239
+ const needsEnt = !priorSteps.some((s: any) =>
240
+ ['create', 'list', 'load', 'update', 'remove'].includes(s.op))
241
+
242
+ const hasDatvar = priorSteps.some((s: any) => {
243
+ if ('create' === s.op) {
244
+ const priorRef = s.input?.ref ?? entity.name + '_ref01'
245
+ const priorDatvar = goVar(s.input?.datavar ?? (priorRef + '_data' + (s.input?.suffix ?? '')))
246
+ return priorDatvar === datavar
247
+ }
248
+ return false
249
+ })
250
+
251
+ Content(` // CREATE
252
+ `)
253
+ if (needsEnt) {
254
+ Content(` ${entvar} := client.${entity.Name}(nil)
255
+ `)
256
+ }
257
+
258
+ // Load data from test data file
259
+ if (hasDatvar) {
260
+ Content(` ${datavar} = core.ToMapAny(vs.GetProp(
261
+ vs.GetPath([]any{"new", "${entity.name}"}, setup.data), "${ref}"))
262
+ `)
263
+ } else {
264
+ Content(` ${datavar} := core.ToMapAny(vs.GetProp(
265
+ vs.GetPath([]any{"new", "${entity.name}"}, setup.data), "${ref}"))
266
+ `)
267
+ }
268
+
269
+ // Add match entries
270
+ const matchEntries = getMatchEntries(step)
271
+ for (const [key, val] of matchEntries) {
272
+ Content(` ${datavar}["${key}"] = setup.idmap["${val}"]
273
+ `)
274
+ }
275
+
276
+ Content(`
277
+ ${datavar}Result, err := ${entvar}.Create(${datavar}, nil)
278
+ if err != nil {
279
+ t.Fatalf("create failed: %v", err)
280
+ }
281
+ ${datavar} = core.ToMapAny(${datavar}Result)
282
+ if ${datavar} == nil {
283
+ t.Fatal("expected create result to be a map")
284
+ }
285
+ if ${datavar}["id"] == nil {
286
+ t.Fatal("expected created entity to have an id")
287
+ }
288
+ `)
289
+ }
290
+
291
+
292
+ const generateList: OpGen = (ctx, step, index) => {
293
+ const { entity, flow } = ctx
294
+ const ref = step.input?.ref ?? entity.name + '_ref01'
295
+ const entvar = goVar(step.input?.entvar ?? ref + '_ent')
296
+ const matchvar = goVar(step.input?.matchvar ?? (ref + '_match' + (step.input?.suffix ?? '')))
297
+ const listvar = goVar(step.input?.listvar ?? (ref + '_list' + (step.input?.suffix ?? '')))
298
+
299
+ const priorSteps = Object.values(flow.step).slice(0, Number(index)) as any[]
300
+ const needsEnt = !priorSteps.some((s: any) =>
301
+ ['create', 'list', 'load', 'update', 'remove'].includes(s.op))
302
+
303
+ Content(` // LIST
304
+ `)
305
+ if (needsEnt) {
306
+ Content(` ${entvar} := client.${entity.Name}(nil)
307
+ `)
308
+ }
309
+
310
+ // Generate match map
311
+ const matchEntries = getMatchEntries(step)
312
+ if (matchEntries.length === 0) {
313
+ Content(` ${matchvar} := map[string]any{}
314
+ `)
315
+ } else {
316
+ Content(` ${matchvar} := map[string]any{
317
+ `)
318
+ for (const [key, val] of matchEntries) {
319
+ Content(` "${key}": setup.idmap["${val}"],
320
+ `)
321
+ }
322
+ Content(` }
323
+ `)
324
+ }
325
+
326
+ Content(`
327
+ ${listvar}Result, err := ${entvar}.List(${matchvar}, nil)
328
+ if err != nil {
329
+ t.Fatalf("list failed: %v", err)
330
+ }
331
+ ${listvar}, ok := ${listvar}Result.([]any)
332
+ if !ok {
333
+ t.Fatalf("expected list result to be an array, got %T", ${listvar}Result)
334
+ }
335
+ `)
336
+
337
+ // Handle validators from step.valid
338
+ const allSteps = Object.values(flow.step) as any[]
339
+ if (step.valid) {
340
+ for (const validator of step.valid) {
341
+ const validRef = validator.def?.ref
342
+ const hasRefData = validRef && allSteps.some((s: any) => 'create' === s.op &&
343
+ ((s.input?.ref ?? entity.name + '_ref01') === validRef))
344
+
345
+ if ('ItemExists' === validator.apply && hasRefData) {
346
+ const refDataVar = goVar(validRef + '_data')
347
+ Content(`
348
+ foundItem := vs.Select(entityListToData(${listvar}), map[string]any{"id": ${refDataVar}["id"]})
349
+ if vs.IsEmpty(foundItem) {
350
+ t.Fatal("expected to find created entity in list")
351
+ }
352
+ `)
353
+ } else if ('ItemNotExists' === validator.apply && hasRefData) {
354
+ const refDataVar = goVar(validRef + '_data')
355
+ Content(`
356
+ notFoundItem := vs.Select(entityListToData(${listvar}), map[string]any{"id": ${refDataVar}["id"]})
357
+ if !vs.IsEmpty(notFoundItem) {
358
+ t.Fatal("expected removed entity to not be in list")
359
+ }
360
+ `)
361
+ }
362
+ }
363
+ }
364
+ }
365
+
366
+
367
+ const generateUpdate: OpGen = (ctx, step, index) => {
368
+ const { entity, flow } = ctx
369
+ const ref = step.input?.ref ?? entity.name + '_ref01'
370
+ const entvar = goVar(step.input?.entvar ?? ref + '_ent')
371
+ const datavar = goVar(step.input?.datavar ?? (ref + '_data' + (step.input?.suffix ?? '')))
372
+ const resdatavar = goVar(step.input?.resdatavar ?? (ref + '_resdata' + (step.input?.suffix ?? '')))
373
+ const markdefvar = goVar(step.input?.markdefvar ?? (ref + '_markdef' + (step.input?.suffix ?? '')))
374
+ const srcdatavar = goVar(step.input?.srcdatavar ?? (ref + '_data' + (step.input?.suffix ?? '')))
375
+
376
+ const priorSteps = Object.values(flow.step).slice(0, Number(index)) as any[]
377
+ const needsEnt = !priorSteps.some((s: any) =>
378
+ ['create', 'list', 'load', 'update', 'remove'].includes(s.op))
379
+
380
+ Content(` // UPDATE
381
+ `)
382
+ if (needsEnt) {
383
+ Content(` ${entvar} := client.${entity.Name}(nil)
384
+ `)
385
+ }
386
+ Content(` ${datavar}Up := map[string]any{
387
+ "id": ${srcdatavar}["id"],
388
+ `)
389
+
390
+ // Add data entries from step.data
391
+ if (step.data) {
392
+ const dataEntries = Object.entries(step.data).filter(([k]: any) => k !== 'id' && !k.endsWith('$'))
393
+ for (const [key] of dataEntries) {
394
+ Content(` "${key}": setup.idmap["${key}"],
395
+ `)
396
+ }
397
+ }
398
+
399
+ Content(` }
400
+ `)
401
+
402
+ // Handle TextFieldMark spec
403
+ if (step.spec) {
404
+ for (const spec of step.spec) {
405
+ if ('TextFieldMark' === spec.apply && null != step.input?.textfield) {
406
+ const fieldname = step.input.textfield
407
+ const fieldvalue = spec.def?.mark ?? `Mark01-${ref}`
408
+ Content(`
409
+ ${markdefvar}Name := "${fieldname}"
410
+ ${markdefvar}Value := fmt.Sprintf("${fieldvalue}_%d", setup.now)
411
+ ${datavar}Up[${markdefvar}Name] = ${markdefvar}Value
412
+ `)
413
+ }
414
+ }
415
+ }
416
+
417
+ Content(`
418
+ ${resdatavar}Result, err := ${entvar}.Update(${datavar}Up, nil)
419
+ if err != nil {
420
+ t.Fatalf("update failed: %v", err)
421
+ }
422
+ ${resdatavar} := core.ToMapAny(${resdatavar}Result)
423
+ if ${resdatavar} == nil {
424
+ t.Fatal("expected update result to be a map")
425
+ }
426
+ if ${resdatavar}["id"] != ${datavar}Up["id"] {
427
+ t.Fatal("expected update result id to match")
428
+ }
429
+ `)
430
+
431
+ // Assert TextFieldMark
432
+ if (step.spec) {
433
+ for (const spec of step.spec) {
434
+ if ('TextFieldMark' === spec.apply && null != step.input?.textfield) {
435
+ Content(` if ${resdatavar}[${markdefvar}Name] != ${markdefvar}Value {
436
+ t.Fatalf("expected %s to be updated, got %v", ${markdefvar}Name, ${resdatavar}[${markdefvar}Name])
437
+ }
438
+ `)
439
+ }
440
+ }
441
+ }
442
+ }
443
+
444
+
445
+ const generateLoad: OpGen = (ctx, step, index) => {
446
+ const { entity, flow } = ctx
447
+ const ref = step.input?.ref ?? entity.name + '_ref01'
448
+ const entvar = goVar(step.input?.entvar ?? ref + '_ent')
449
+ const matchvar = goVar(step.input?.matchvar ?? (ref + '_match' + (step.input?.suffix ?? '')))
450
+ const datavar = goVar(step.input?.datavar ?? (ref + '_data' + (step.input?.suffix ?? '')))
451
+ const srcdatavar = goVar(step.input?.srcdatavar ?? (ref + '_data' + (step.input?.suffix ?? '')))
452
+
453
+ const priorSteps = Object.values(flow.step).slice(0, Number(index)) as any[]
454
+ const hasEntVar = priorSteps.some((s: any) =>
455
+ ['create', 'list', 'load', 'update', 'remove'].includes(s.op))
456
+
457
+ // Check if srcdatavar was declared by a prior create step or preamble
458
+ const flowHasCreate = Object.values(flow.step).some((s: any) => (s as any).op === 'create')
459
+ const preambleRef = entity.name + '_ref01'
460
+ const hasSrcData = (!flowHasCreate && srcdatavar === goVar(preambleRef + '_data')) ||
461
+ priorSteps.some((s: any) => {
462
+ if ('create' === s.op) {
463
+ const priorRef = s.input?.ref ?? entity.name + '_ref01'
464
+ const priorDatvar = goVar(s.input?.datavar ?? (priorRef + '_data' + (s.input?.suffix ?? '')))
465
+ return priorDatvar === srcdatavar
466
+ }
467
+ return false
468
+ })
469
+
470
+ Content(` // LOAD
471
+ `)
472
+ if (!hasEntVar) {
473
+ Content(` ${entvar} := client.${entity.Name}(nil)
474
+ `)
475
+ }
476
+ if (!hasSrcData) {
477
+ Content(` ${srcdatavar}Raw := vs.Items(core.ToMapAny(vs.GetProp(setup.data, "existing.${entity.name}")))
478
+ var ${srcdatavar} map[string]any
479
+ if len(${srcdatavar}Raw) > 0 {
480
+ ${srcdatavar} = core.ToMapAny(${srcdatavar}Raw[0][1])
481
+ }
482
+ `)
483
+ }
484
+ Content(` ${matchvar} := map[string]any{
485
+ "id": ${srcdatavar}["id"],
486
+ }
487
+ ${datavar}Loaded, err := ${entvar}.Load(${matchvar}, nil)
488
+ if err != nil {
489
+ t.Fatalf("load failed: %v", err)
490
+ }
491
+ ${datavar}LoadResult := core.ToMapAny(${datavar}Loaded)
492
+ if ${datavar}LoadResult == nil {
493
+ t.Fatal("expected load result to be a map")
494
+ }
495
+ if ${datavar}LoadResult["id"] != ${srcdatavar}["id"] {
496
+ t.Fatal("expected load result id to match")
497
+ }
498
+ `)
499
+ }
500
+
501
+
502
+ const generateRemove: OpGen = (ctx, step, index) => {
503
+ const { entity, flow } = ctx
504
+ const ref = step.input?.ref ?? entity.name + '_ref01'
505
+ const entvar = goVar(step.input?.entvar ?? ref + '_ent')
506
+ const matchvar = goVar(step.input?.matchvar ?? (ref + '_match' + (step.input?.suffix ?? '')))
507
+ const srcdatavar = goVar(step.input?.srcdatavar ?? (ref + '_data'))
508
+
509
+ const priorSteps = Object.values(flow.step).slice(0, Number(index)) as any[]
510
+ const needsEnt = !priorSteps.some((s: any) =>
511
+ ['create', 'list', 'load', 'update', 'remove'].includes(s.op))
512
+
513
+ Content(` // REMOVE
514
+ `)
515
+ if (needsEnt) {
516
+ Content(` ${entvar} := client.${entity.Name}(nil)
517
+ `)
518
+ }
519
+ Content(` ${matchvar} := map[string]any{
520
+ "id": ${srcdatavar}["id"],
521
+ }
522
+ _, err = ${entvar}.Remove(${matchvar}, nil)
523
+ if err != nil {
524
+ t.Fatalf("remove failed: %v", err)
525
+ }
526
+ `)
527
+ }
528
+
529
+
530
+ const GENERATE_OP: Record<string, OpGen> = {
531
+ create: generateCreate,
532
+ list: generateList,
533
+ update: generateUpdate,
534
+ load: generateLoad,
535
+ remove: generateRemove,
536
+ }
537
+
538
+
339
539
  export {
340
540
  TestEntity
341
541
  }
@@ -8,7 +8,7 @@ import type {
8
8
  ModelEntity
9
9
  } from '@voxgig/apidef'
10
10
 
11
- import { cmp, each, Folder } from '@voxgig/sdkgen'
11
+ import { cmp, each, Folder, File, Content } from '@voxgig/sdkgen'
12
12
 
13
13
 
14
14
  import { TestEntity } from './TestEntity_go'
@@ -24,6 +24,29 @@ const Test = cmp(function Test(props: any) {
24
24
  const gomodule = orgPrefix + model.name + 'sdk'
25
25
 
26
26
  Folder({ name: 'test' }, () => {
27
+
28
+ // Generate exists_test.go programmatically to avoid duplication
29
+ // with any scaffolded test file (e.g. projectname_sdk_test.go).
30
+ File({ name: 'exists_test.' + target.ext }, () => {
31
+ Content(`package sdktest
32
+
33
+ import (
34
+ "testing"
35
+
36
+ sdk "${gomodule}"
37
+ )
38
+
39
+ func TestExists(t *testing.T) {
40
+ t.Run("test-mode", func(t *testing.T) {
41
+ testsdk := sdk.TestSDK(nil, nil)
42
+ if testsdk == nil {
43
+ t.Fatal("expected non-nil SDK")
44
+ }
45
+ })
46
+ }
47
+ `)
48
+ })
49
+
27
50
  each(model.main[KIT].entity, (entity: ModelEntity) => {
28
51
  TestEntity({ target, entity, gomodule })
29
52
  TestDirect({ target, entity, gomodule })
@@ -14,7 +14,7 @@ const ReadmeQuick = cmp(function ReadmeQuick(props: any) {
14
14
  const entity = getModelPath(model, `main.${KIT}.entity`)
15
15
 
16
16
  // Find the first published entity for examples
17
- const exampleEntity = Object.values(entity).find((e: any) => e.publish) as any
17
+ const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
18
18
 
19
19
  Content(`
20
20
  ### Create a Client