@voxgig/sdkgen 2.0.2 → 3.0.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 +22 -2
  2. package/dist/action/doctor.d.ts +14 -0
  3. package/dist/action/doctor.js +296 -0
  4. package/dist/action/doctor.js.map +1 -0
  5. package/dist/action/feature.js +48 -9
  6. package/dist/action/feature.js.map +1 -1
  7. package/dist/action/target.d.ts +6 -1
  8. package/dist/action/target.js +134 -22
  9. package/dist/action/target.js.map +1 -1
  10. package/dist/cmp/Entity.js +5 -0
  11. package/dist/cmp/Entity.js.map +1 -1
  12. package/dist/cmp/Feature.js +2 -1
  13. package/dist/cmp/Feature.js.map +1 -1
  14. package/dist/cmp/Main.js +5 -1
  15. package/dist/cmp/Main.js.map +1 -1
  16. package/dist/cmp/ReadmeExplanation.js +1 -1
  17. package/dist/cmp/ReadmeExplanation.js.map +1 -1
  18. package/dist/cmp/ReadmeTop.js +16 -6
  19. package/dist/cmp/ReadmeTop.js.map +1 -1
  20. package/dist/cmp/Registered.d.ts +7 -0
  21. package/dist/cmp/Registered.js +70 -0
  22. package/dist/cmp/Registered.js.map +1 -0
  23. package/dist/cmp/Test.js +3 -1
  24. package/dist/cmp/Test.js.map +1 -1
  25. package/dist/helpers/dryrun.d.ts +10 -0
  26. package/dist/helpers/dryrun.js +35 -0
  27. package/dist/helpers/dryrun.js.map +1 -0
  28. package/dist/helpers/featureSource.d.ts +13 -0
  29. package/dist/helpers/featureSource.js +156 -0
  30. package/dist/helpers/featureSource.js.map +1 -0
  31. package/dist/helpers/naming.d.ts +9 -1
  32. package/dist/helpers/naming.js +66 -2
  33. package/dist/helpers/naming.js.map +1 -1
  34. package/dist/helpers/opExample.js +23 -3
  35. package/dist/helpers/opExample.js.map +1 -1
  36. package/dist/helpers/opShape.d.ts +11 -1
  37. package/dist/helpers/opShape.js +51 -0
  38. package/dist/helpers/opShape.js.map +1 -1
  39. package/dist/helpers/packageMeta.d.ts +8 -1
  40. package/dist/helpers/packageMeta.js +141 -10
  41. package/dist/helpers/packageMeta.js.map +1 -1
  42. package/dist/helpers/stdrep.d.ts +3 -0
  43. package/dist/helpers/stdrep.js +47 -0
  44. package/dist/helpers/stdrep.js.map +1 -0
  45. package/dist/helpers/testPolicy.d.ts +2 -0
  46. package/dist/helpers/testPolicy.js +46 -0
  47. package/dist/helpers/testPolicy.js.map +1 -0
  48. package/dist/sdkgen.d.ts +15 -6
  49. package/dist/sdkgen.js +45 -4
  50. package/dist/sdkgen.js.map +1 -1
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/model/sdkgen.aontu +125 -0
  53. package/package.json +5 -3
  54. package/project/.sdk/model/target/c.aontu +28 -3
  55. package/project/.sdk/model/target/clojure.aontu +24 -3
  56. package/project/.sdk/model/target/cpp.aontu +25 -3
  57. package/project/.sdk/model/target/csharp.aontu +25 -3
  58. package/project/.sdk/model/target/dart.aontu +15 -3
  59. package/project/.sdk/model/target/elixir.aontu +15 -3
  60. package/project/.sdk/model/target/go-cli.aontu +17 -1
  61. package/project/.sdk/model/target/go-mcp.aontu +17 -1
  62. package/project/.sdk/model/target/go.aontu +14 -4
  63. package/project/.sdk/model/target/haskell.aontu +24 -3
  64. package/project/.sdk/model/target/java.aontu +26 -3
  65. package/project/.sdk/model/target/js.aontu +15 -3
  66. package/project/.sdk/model/target/kotlin.aontu +26 -3
  67. package/project/.sdk/model/target/lean.aontu +25 -3
  68. package/project/.sdk/model/target/lua.aontu +15 -3
  69. package/project/.sdk/model/target/ocaml.aontu +24 -3
  70. package/project/.sdk/model/target/perl.aontu +15 -3
  71. package/project/.sdk/model/target/php.aontu +15 -3
  72. package/project/.sdk/model/target/py-data.aontu +16 -3
  73. package/project/.sdk/model/target/py.aontu +15 -3
  74. package/project/.sdk/model/target/rb.aontu +15 -3
  75. package/project/.sdk/model/target/rust.aontu +25 -3
  76. package/project/.sdk/model/target/scala.aontu +25 -3
  77. package/project/.sdk/model/target/swift.aontu +25 -3
  78. package/project/.sdk/model/target/ts.aontu +15 -3
  79. package/project/.sdk/model/target/zig.aontu +26 -3
  80. package/project/.sdk/src/cmp/c/Config_c.ts +10 -11
  81. package/project/.sdk/src/cmp/c/Entity_c.ts +5 -1
  82. package/project/.sdk/src/cmp/c/fragment/Entity.fragment.c +23 -5
  83. package/project/.sdk/src/cmp/c/fragment/EntityCreateOp.fragment.c +9 -2
  84. package/project/.sdk/src/cmp/c/fragment/EntityListOp.fragment.c +19 -2
  85. package/project/.sdk/src/cmp/c/fragment/EntityLoadOp.fragment.c +9 -2
  86. package/project/.sdk/src/cmp/c/fragment/EntityRemoveOp.fragment.c +12 -2
  87. package/project/.sdk/src/cmp/c/fragment/EntityUpdateOp.fragment.c +9 -2
  88. package/project/.sdk/src/cmp/c/fragment/Main.fragment.c +1 -0
  89. package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +6 -3
  90. package/project/.sdk/src/cmp/clojure/fragment/Entity.fragment.clj +18 -1
  91. package/project/.sdk/src/cmp/clojure/fragment/EntityCreateOp.fragment.clj +2 -2
  92. package/project/.sdk/src/cmp/clojure/fragment/EntityLoadOp.fragment.clj +2 -2
  93. package/project/.sdk/src/cmp/clojure/fragment/EntityRemoveOp.fragment.clj +12 -8
  94. package/project/.sdk/src/cmp/clojure/fragment/EntityUpdateOp.fragment.clj +2 -2
  95. package/project/.sdk/src/cmp/cpp/Entity_cpp.ts +5 -1
  96. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +12 -9
  97. package/project/.sdk/src/cmp/cpp/fragment/EntityCreateOp.fragment.cpp +8 -2
  98. package/project/.sdk/src/cmp/cpp/fragment/EntityListOp.fragment.cpp +18 -2
  99. package/project/.sdk/src/cmp/cpp/fragment/EntityLoadOp.fragment.cpp +8 -2
  100. package/project/.sdk/src/cmp/cpp/fragment/EntityRemoveOp.fragment.cpp +11 -2
  101. package/project/.sdk/src/cmp/cpp/fragment/EntityUpdateOp.fragment.cpp +8 -2
  102. package/project/.sdk/src/cmp/csharp/Package_csharp.ts +2 -1
  103. package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +3 -3
  104. package/project/.sdk/src/cmp/csharp/TestEntity_csharp.ts +6 -6
  105. package/project/.sdk/src/cmp/csharp/fragment/EntityBase.fragment.cs +38 -1
  106. package/project/.sdk/src/cmp/csharp/fragment/Main.fragment.cs +42 -33
  107. package/project/.sdk/src/cmp/dart/Package_dart.ts +2 -1
  108. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +13 -2
  109. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +2 -1
  110. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +3 -3
  111. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +1 -1
  112. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +17 -6
  113. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +13 -2
  114. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +13 -2
  115. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +3 -3
  116. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +8 -8
  117. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +18 -1
  118. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +9 -1
  119. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +9 -1
  120. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +15 -1
  121. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +9 -1
  122. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +8 -0
  123. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
  124. package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +2 -2
  125. package/project/.sdk/src/cmp/elixir/TestEntity_elixir.ts +11 -2
  126. package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +2 -1
  127. package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +1 -0
  128. package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +2 -1
  129. package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -1
  130. package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +2 -1
  131. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +38 -8
  132. package/project/.sdk/src/cmp/go/Entity_go.ts +2 -2
  133. package/project/.sdk/src/cmp/go/Main_go.ts +4 -5
  134. package/project/.sdk/src/cmp/go/Package_go.ts +8 -5
  135. package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +2 -2
  136. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +2 -2
  137. package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +4 -2
  138. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +2 -2
  139. package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +2 -2
  140. package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +2 -2
  141. package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +2 -2
  142. package/project/.sdk/src/cmp/go/TestDirect_go.ts +21 -15
  143. package/project/.sdk/src/cmp/go/TestEntity_go.ts +9 -9
  144. package/project/.sdk/src/cmp/go/Test_go.ts +2 -2
  145. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +42 -1
  146. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +4 -4
  147. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +4 -4
  148. package/project/.sdk/src/cmp/haskell/Package_haskell.ts +2 -1
  149. package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +10 -5
  150. package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +10 -8
  151. package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +14 -10
  152. package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +21 -18
  153. package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +4 -4
  154. package/project/.sdk/src/cmp/haskell/Test_haskell.ts +23 -11
  155. package/project/.sdk/src/cmp/java/Package_java.ts +2 -1
  156. package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +2 -1
  157. package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +2 -2
  158. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +1 -1
  159. package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +3 -3
  160. package/project/.sdk/src/cmp/java/TestDirect_java.ts +3 -3
  161. package/project/.sdk/src/cmp/java/TestEntity_java.ts +6 -6
  162. package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +34 -1
  163. package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +12 -0
  164. package/project/.sdk/src/cmp/js/Main_js.ts +4 -1
  165. package/project/.sdk/src/cmp/js/Package_js.ts +7 -1
  166. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -2
  167. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +2 -1
  168. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +13 -2
  169. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +13 -2
  170. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +2 -1
  171. package/project/.sdk/src/cmp/js/TestDirect_js.ts +3 -3
  172. package/project/.sdk/src/cmp/js/TestEntity_js.ts +8 -8
  173. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +22 -1
  174. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +9 -1
  175. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +9 -1
  176. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +15 -1
  177. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +9 -1
  178. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +13 -0
  179. package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +2 -1
  180. package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +2 -1
  181. package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +2 -2
  182. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +1 -1
  183. package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +3 -3
  184. package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +3 -3
  185. package/project/.sdk/src/cmp/kotlin/TestEntity_kotlin.ts +6 -6
  186. package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +32 -1
  187. package/project/.sdk/src/cmp/lean/Package_lean.ts +3 -1
  188. package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +9 -4
  189. package/project/.sdk/src/cmp/lua/Package_lua.ts +4 -3
  190. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +11 -3
  191. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +1 -1
  192. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +3 -3
  193. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +9 -9
  194. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +37 -1
  195. package/project/.sdk/src/cmp/lua/fragment/SdkError.fragment.lua +12 -0
  196. package/project/.sdk/src/cmp/ocaml/EntityOperation_ocaml.ts +30 -3
  197. package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +11 -5
  198. package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +3 -1
  199. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +10 -5
  200. package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +6 -2
  201. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +10 -8
  202. package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +14 -13
  203. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +20 -18
  204. package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +4 -4
  205. package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +8 -2
  206. package/project/.sdk/src/cmp/ocaml/TestEntity_ocaml.ts +8 -5
  207. package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +2 -1
  208. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +1 -1
  209. package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +3 -3
  210. package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +1 -1
  211. package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +3 -3
  212. package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +6 -6
  213. package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +36 -1
  214. package/project/.sdk/src/cmp/php/MainEntity_php.ts +21 -16
  215. package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
  216. package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +6 -6
  217. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +4 -3
  218. package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +2 -2
  219. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +1 -1
  220. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +12 -12
  221. package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +6 -6
  222. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +4 -4
  223. package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +2 -2
  224. package/project/.sdk/src/cmp/php/TestDirect_php.ts +3 -3
  225. package/project/.sdk/src/cmp/php/TestEntity_php.ts +17 -15
  226. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +20 -1
  227. package/project/.sdk/src/cmp/php/fragment/SdkError.fragment.php +11 -0
  228. package/project/.sdk/src/cmp/py/Package_py.ts +4 -3
  229. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +13 -2
  230. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +2 -1
  231. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +1 -1
  232. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +17 -6
  233. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +14 -3
  234. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +13 -2
  235. package/project/.sdk/src/cmp/py/TestDirect_py.ts +3 -3
  236. package/project/.sdk/src/cmp/py/TestEntity_py.ts +9 -9
  237. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +29 -1
  238. package/project/.sdk/src/cmp/py/fragment/SdkError.fragment.py +11 -0
  239. package/project/.sdk/src/cmp/py-data/Main_py-data.ts +2 -1
  240. package/project/.sdk/src/cmp/rb/Package_rb.ts +4 -3
  241. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +1 -1
  242. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +2 -1
  243. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +5 -5
  244. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +1 -1
  245. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +3 -3
  246. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +9 -9
  247. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +31 -1
  248. package/project/.sdk/src/cmp/rb/fragment/SdkError.fragment.rb +10 -1
  249. package/project/.sdk/src/cmp/rust/Entity_rust.ts +5 -1
  250. package/project/.sdk/src/cmp/rust/Main_rust.ts +21 -0
  251. package/project/.sdk/src/cmp/rust/Package_rust.ts +2 -1
  252. package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +3 -3
  253. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +12 -12
  254. package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +18 -0
  255. package/project/.sdk/src/cmp/rust/fragment/EntityCreateOp.fragment.rs +8 -2
  256. package/project/.sdk/src/cmp/rust/fragment/EntityListOp.fragment.rs +20 -3
  257. package/project/.sdk/src/cmp/rust/fragment/EntityLoadOp.fragment.rs +8 -2
  258. package/project/.sdk/src/cmp/rust/fragment/EntityRemoveOp.fragment.rs +10 -2
  259. package/project/.sdk/src/cmp/rust/fragment/EntityUpdateOp.fragment.rs +8 -2
  260. package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +10 -0
  261. package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +2 -1
  262. package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +3 -3
  263. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +1 -1
  264. package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +3 -3
  265. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +3 -3
  266. package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +27 -1
  267. package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +2 -1
  268. package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +3 -3
  269. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +1 -1
  270. package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +3 -3
  271. package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +34 -1
  272. package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +9 -1
  273. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +18 -1
  274. package/project/.sdk/src/cmp/ts/Gitignore_ts.ts +5 -2
  275. package/project/.sdk/src/cmp/ts/Main_ts.ts +4 -1
  276. package/project/.sdk/src/cmp/ts/Package_ts.ts +10 -1
  277. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -2
  278. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +2 -1
  279. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +21 -6
  280. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +52 -2
  281. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +14 -3
  282. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +34 -2
  283. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +64 -43
  284. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +8 -8
  285. package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +2 -2
  286. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +2 -2
  287. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +25 -1
  288. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +10 -2
  289. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +1 -1
  290. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +10 -2
  291. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +27 -3
  292. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +10 -2
  293. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +15 -0
  294. package/project/.sdk/src/cmp/zig/Entity_zig.ts +5 -1
  295. package/project/.sdk/src/cmp/zig/Package_zig.ts +3 -1
  296. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +39 -0
  297. package/project/.sdk/src/cmp/zig/fragment/EntityCreateOp.fragment.zig +2 -2
  298. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +21 -2
  299. package/project/.sdk/src/cmp/zig/fragment/EntityLoadOp.fragment.zig +2 -2
  300. package/project/.sdk/src/cmp/zig/fragment/EntityRemoveOp.fragment.zig +5 -2
  301. package/project/.sdk/src/cmp/zig/fragment/EntityUpdateOp.fragment.zig +2 -2
  302. package/project/.sdk/tm/c/VERSION +1 -1
  303. package/project/.sdk/tm/c/core/helpers.c +1 -0
  304. package/project/.sdk/tm/c/core/sdk.h +22 -6
  305. package/project/.sdk/tm/c/tests/feature_harness.h +1 -0
  306. package/project/.sdk/tm/c/tests/primary_utility_test.c +4 -1
  307. package/project/.sdk/tm/c/utility/make_url.c +1 -0
  308. package/project/.sdk/tm/c/utility/param.c +1 -0
  309. package/project/.sdk/tm/clojure/VERSION +1 -1
  310. package/project/.sdk/tm/cpp/VERSION +1 -1
  311. package/project/.sdk/tm/cpp/core/types.hpp +33 -8
  312. package/project/.sdk/tm/cpp/test/pipeline_test.cpp +5 -0
  313. package/project/.sdk/tm/cpp/test/runner_support.hpp +4 -4
  314. package/project/.sdk/tm/csharp/VERSION +1 -1
  315. package/project/.sdk/tm/csharp/core/Types.cs +6 -0
  316. package/project/.sdk/tm/csharp/test/FeatureHarness.cs +396 -0
  317. package/project/.sdk/tm/csharp/test/FeatureTest.cs +7 -385
  318. package/project/.sdk/tm/csharp/test/Runner.cs +4 -4
  319. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +4 -0
  320. package/project/.sdk/tm/dart/test/utility.dart +4 -4
  321. package/project/.sdk/tm/elixir/VERSION +1 -1
  322. package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +26 -0
  323. package/project/.sdk/tm/go/VERSION +1 -1
  324. package/project/.sdk/tm/go/core/types.go +6 -0
  325. package/project/.sdk/tm/go/test/feature_harness_test.go +361 -0
  326. package/project/.sdk/tm/go/test/feature_test.go +7 -350
  327. package/project/.sdk/tm/go/test/pipeline_test.go +6 -0
  328. package/project/.sdk/tm/go/test/runner_test.go +16 -4
  329. package/project/.sdk/tm/haskell/VERSION +1 -1
  330. package/project/.sdk/tm/haskell/src/SdkFeatures.hs +28 -5
  331. package/project/.sdk/tm/haskell/src/SdkTypes.hs +14 -5
  332. package/project/.sdk/tm/java/VERSION +1 -1
  333. package/project/.sdk/tm/java/test/RunnerSupport.java +4 -4
  334. package/project/.sdk/tm/java/utility/MakeError.java +4 -0
  335. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +4 -0
  336. package/project/.sdk/tm/js/test/utility.js +3 -3
  337. package/project/.sdk/tm/kotlin/VERSION +1 -1
  338. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +3 -3
  339. package/project/.sdk/tm/lean/VERSION +1 -1
  340. package/project/.sdk/tm/lean/test/TFeature.lean +27 -14
  341. package/project/.sdk/tm/lua/test/runner.lua +4 -4
  342. package/project/.sdk/tm/lua/utility/make_error.lua +4 -0
  343. package/project/.sdk/tm/ocaml/VERSION +1 -1
  344. package/project/.sdk/tm/ocaml/sdk_types.ml +14 -5
  345. package/project/.sdk/tm/ocaml/test/t_pipeline.ml +5 -2
  346. package/project/.sdk/tm/perl/t/runner.pm +4 -4
  347. package/project/.sdk/tm/php/VERSION +1 -1
  348. package/project/.sdk/tm/php/test/Runner.php +4 -4
  349. package/project/.sdk/tm/php/utility/MakeError.php +5 -0
  350. package/project/.sdk/tm/py/pkg/utility/make_error.py +4 -0
  351. package/project/.sdk/tm/py/test/runner.py +19 -4
  352. package/project/.sdk/tm/rb/test/runner.rb +4 -4
  353. package/project/.sdk/tm/rb/utility/make_error.rb +4 -0
  354. package/project/.sdk/tm/rust/VERSION +1 -1
  355. package/project/.sdk/tm/rust/core/types.rs +22 -6
  356. package/project/.sdk/tm/rust/tests/common/mod.rs +6 -6
  357. package/project/.sdk/tm/rust/tests/pipeline_test.rs +6 -0
  358. package/project/.sdk/tm/rust/utility/make_error.rs +4 -0
  359. package/project/.sdk/tm/scala/VERSION +1 -1
  360. package/project/.sdk/tm/swift/VERSION +1 -1
  361. package/project/.sdk/tm/ts/src/tsconfig.json +1 -0
  362. package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +4 -0
  363. package/project/.sdk/tm/ts/test/tsconfig.json +1 -0
  364. package/project/.sdk/tm/ts/test/utility.ts +3 -3
  365. package/project/.sdk/tm/zig/VERSION +1 -1
  366. package/src/action/doctor.ts +410 -0
  367. package/src/action/feature.ts +54 -16
  368. package/src/action/target.ts +174 -25
  369. package/src/cmp/Entity.ts +7 -0
  370. package/src/cmp/Feature.ts +3 -1
  371. package/src/cmp/Main.ts +7 -1
  372. package/src/cmp/ReadmeExplanation.ts +2 -2
  373. package/src/cmp/ReadmeTop.ts +22 -9
  374. package/src/cmp/Registered.ts +100 -0
  375. package/src/cmp/Test.ts +4 -1
  376. package/src/helpers/dryrun.ts +57 -0
  377. package/src/helpers/featureSource.ts +208 -0
  378. package/src/helpers/naming.ts +73 -2
  379. package/src/helpers/opExample.ts +19 -2
  380. package/src/helpers/opShape.ts +65 -0
  381. package/src/helpers/packageMeta.ts +163 -10
  382. package/src/helpers/stdrep.ts +56 -0
  383. package/src/helpers/testPolicy.ts +52 -0
  384. package/src/sdkgen.ts +70 -4
  385. package/project/.sdk/tm/rust/feature/mod.rs +0 -24
@@ -33,29 +33,29 @@ function hsType(type: any): string {
33
33
 
34
34
  const OP_SIGNATURES: Record<string, { sig: string, returns: string, desc: string }> = {
35
35
  load: {
36
- sig: 'eLoad ent match ctrl :: IO Value',
37
- returns: 'the entity data',
38
- desc: 'Load a single entity matching the given criteria. Returns the entity data and raises on error.',
36
+ sig: 'eLoad ent match ctrl :: IO Entity',
37
+ returns: 'the entity',
38
+ desc: 'Load a single entity matching the given criteria. Resolves to the ENTITY (read the record with `eDataGet`) and raises on error.',
39
39
  },
40
40
  list: {
41
- sig: 'eList ent match ctrl :: IO Value',
42
- returns: 'a list of entities',
43
- desc: 'List entities matching the given criteria. The match is optional pass an empty map to list all records. Returns a list `Value` and raises on error.',
41
+ sig: 'eList ent match ctrl :: IO [Entity]',
42
+ returns: 'one entity per record',
43
+ desc: 'List entities matching the given criteria. The match is optional \u2014 pass an empty map to list all records. Resolves to one ENTITY per record and raises on error.',
44
44
  },
45
45
  create: {
46
- sig: 'eCreate ent data ctrl :: IO Value',
47
- returns: 'the created entity data',
48
- desc: 'Create a new entity with the given data. Returns the created entity data and raises on error.',
46
+ sig: 'eCreate ent data ctrl :: IO Entity',
47
+ returns: 'the created entity',
48
+ desc: 'Create a new entity with the given data. Resolves to the ENTITY (read the record with `eDataGet`) and raises on error.',
49
49
  },
50
50
  update: {
51
- sig: 'eUpdate ent data ctrl :: IO Value',
52
- returns: 'the updated entity data',
53
- desc: 'Update an existing entity. The data must include the entity `id`. Returns the updated entity data and raises on error.',
51
+ sig: 'eUpdate ent data ctrl :: IO Entity',
52
+ returns: 'the updated entity',
53
+ desc: 'Update an existing entity. The data must include the entity `id`. Resolves to the ENTITY (read the record with `eDataGet`) and raises on error.',
54
54
  },
55
55
  remove: {
56
- sig: 'eRemove ent match ctrl :: IO Value',
57
- returns: 'the removed entity data',
58
- desc: 'Remove the entity matching the given criteria. Raises on error.',
56
+ sig: 'eRemove ent match ctrl :: IO Entity',
57
+ returns: 'the removed entity',
58
+ desc: 'Remove the entity matching the given criteria. Resolves to the ENTITY, marked deleted (`eDeleted`); it keeps the data it held. Raises on error.',
59
59
  },
60
60
  }
61
61
 
@@ -278,7 +278,8 @@ ${info.desc}
278
278
  ent <- Sdk.${eFn} sdk VNoval
279
279
  match <- emptyMap
280
280
  ctrl <- emptyMap
281
- results <- Sdk.eList ent match ctrl
281
+ results <- Sdk.eList ent match ctrl -- one ENTITY per record
282
+ datas <- mapM Sdk.eDataGet results
282
283
  \`\`\`
283
284
 
284
285
  `)
@@ -297,7 +298,8 @@ ${info.desc}
297
298
  })
298
299
  Content(`]
299
300
  ctrl <- emptyMap
300
- result <- Sdk.eCreate ent d ctrl
301
+ result <- Sdk.eCreate ent d ctrl -- the ENTITY
302
+ d2 <- Sdk.eDataGet result
301
303
  \`\`\`
302
304
 
303
305
  `)
@@ -318,7 +320,8 @@ ${info.desc}
318
320
  [${updateLines}
319
321
  ] -- fields to update
320
322
  ctrl <- emptyMap
321
- result <- Sdk.eUpdate ent d ctrl
323
+ result <- Sdk.eUpdate ent d ctrl -- the ENTITY
324
+ d2 <- Sdk.eDataGet result
322
325
  \`\`\`
323
326
 
324
327
  `)
@@ -63,12 +63,12 @@ main = do
63
63
 
64
64
  if (opnames.includes('list')) {
65
65
  Content(`
66
- -- List all ${eName.toLowerCase()}s (returns a list Value, raises on error)
66
+ -- List all ${eName.toLowerCase()}s (one ENTITY per record, raises on error)
67
67
  ent <- Sdk.${eFn} sdk VNoval
68
68
  match <- emptyMap
69
69
  ctrl <- emptyMap
70
70
  ${eFn}s <- Sdk.eList ent match ctrl
71
- print ${eFn}s
71
+ mapM_ (\\en -> print =<< Sdk.eDataGet en) ${eFn}s
72
72
  `)
73
73
  }
74
74
 
@@ -83,12 +83,12 @@ main = do
83
83
  it.name === idF ? 'example_id' : 'example_' + it.name)})`).join(', ')}]`
84
84
  : '[]'
85
85
  Content(`
86
- -- Load a specific ${eName.toLowerCase()} (returns the record, raises on error)
86
+ -- Load a specific ${eName.toLowerCase()} (returns the ENTITY, raises on error)
87
87
  ent2 <- Sdk.${eFn} sdk VNoval
88
88
  m <- jo ${loadArg}
89
89
  ctrl2 <- emptyMap
90
90
  ${eFn} <- Sdk.eLoad ent2 m ctrl2
91
- print ${eFn}
91
+ print =<< Sdk.eDataGet ${eFn}
92
92
  `)
93
93
  }
94
94
  }
@@ -81,7 +81,10 @@ ${basicFn} c = do
81
81
  ent <- C.${fn} sdk VNoval
82
82
  em1 <- emptyMap; em2 <- emptyMap
83
83
  lst <- eList ent em1 em2
84
- pure (islist lst)
84
+ -- \`list\` resolves to one ENTITY per record; the record is reached
85
+ -- through eDataGet. See AGENTS.md "Entity operations return ENTITIES".
86
+ ok <- mapM (\\en -> ismap <$> eDataGet en) lst
87
+ pure (all id ok)
85
88
  `
86
89
  }
87
90
  if (hasLoad) {
@@ -95,8 +98,9 @@ ${basicFn} c = do
95
98
  (id0 : _) -> do
96
99
  m <- jo [("id", VStr id0)]; ctrl <- emptyMap
97
100
  loaded <- eLoad ent m ctrl
98
- lid <- getp loaded "id"
99
- pure (ismap loaded && vstring lid == id0)
101
+ ld <- eDataGet loaded
102
+ lid <- getp ld "id"
103
+ pure (ismap ld && vstring lid == id0)
100
104
  `
101
105
  }
102
106
  if (hasCreate) {
@@ -106,8 +110,9 @@ ${basicFn} c = do
106
110
  d <- newRefData fixture "${e.name}"
107
111
  ctrl <- emptyMap
108
112
  created <- eCreate ent d ctrl
109
- cid <- getp created "id"
110
- pure (ismap created && not (isNoval cid))
113
+ cd <- eDataGet created
114
+ cid <- getp cd "id"
115
+ pure (ismap cd && not (isNoval cid))
111
116
  `
112
117
  }
113
118
  if (hasCreate && hasUpdate) {
@@ -117,12 +122,14 @@ ${basicFn} c = do
117
122
  d <- newRefData fixture "${e.name}"
118
123
  ctrl <- emptyMap
119
124
  created <- eCreate ent d ctrl
120
- cid <- getp created "id"
125
+ cd <- eDataGet created
126
+ cid <- getp cd "id"
121
127
  upd <- jo [("id", cid), ("${updField}", VStr "UpdatedMark")]
122
128
  ctrl2 <- emptyMap
123
129
  updated <- eUpdate ent upd ctrl2
124
- uv <- getp updated "${updField}"
125
- pure (ismap updated && vstring uv == "UpdatedMark")
130
+ ud <- eDataGet updated
131
+ uv <- getp ud "${updField}"
132
+ pure (ismap ud && vstring uv == "UpdatedMark")
126
133
  `
127
134
  }
128
135
  if (hasCreate && hasRemove) {
@@ -132,10 +139,15 @@ ${basicFn} c = do
132
139
  d <- newRefData fixture "${e.name}"
133
140
  ctrl <- emptyMap
134
141
  created <- eCreate ent d ctrl
135
- cid <- getp created "id"
142
+ cd <- eDataGet created
143
+ cid <- getp cd "id"
136
144
  rm <- jo [("id", cid)]; ctrl2 <- emptyMap
137
- _ <- eRemove ent rm ctrl2
138
- pure True
145
+ -- \`remove\` resolves to the entity, marked. It KEEPS the data it held.
146
+ removed <- eRemove ent rm ctrl2
147
+ gone <- readIORef (eDeleted removed)
148
+ rd <- eDataGet removed
149
+ rid <- getp rd "id"
150
+ pure (gone && vstring rid == vstring cid)
139
151
  `
140
152
  }
141
153
  // An op-less entity (no list/load/create — e.g. a bare path entity)
@@ -4,6 +4,7 @@ import {
4
4
  File,
5
5
  cmp,
6
6
  collectDeps,
7
+ packageVersion,
7
8
  } from '@voxgig/sdkgen'
8
9
 
9
10
 
@@ -51,7 +52,7 @@ const Package = cmp(async function Package(props: any) {
51
52
 
52
53
  <groupId>${groupId}</groupId>
53
54
  <artifactId>${artifactId}</artifactId>
54
- <version>0.0.1</version>
55
+ <version>${packageVersion(model, target.name)}</version>
55
56
  <name>${model.const.Name} SDK</name>
56
57
  <description>${model.const.Name} client SDK for Java (generated by @voxgig/sdkgen).</description>
57
58
 
@@ -51,7 +51,8 @@ const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
51
51
  // The op-driven test-mode line, shown only when the SDK has an entity op.
52
52
  // A direct()-only SDK (no ops anywhere) shows a direct() call instead.
53
53
  const testModeExample = primaryOp
54
- ? `// Entity ops return the bare record and raise on error.
54
+ ? `// Entity ops return the ENTITY and raises on error;
55
+ // call data() for the record.
55
56
  Object ${eVar} = client.${accessor}(null).${primaryOp}(${testArg}, null);
56
57
  // ${eVar} holds the mock response record
57
58
  System.out.println(${eVar});`
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, Content, isPublished, repoInfo } from '@voxgig/sdkgen'
2
+ import { cmp, Content, isPublished, repoInfo, packageVersion } from '@voxgig/sdkgen'
3
3
 
4
4
  import { mavenGroupId } from './utility_java'
5
5
 
@@ -18,7 +18,7 @@ const ReadmeInstall = cmp(function ReadmeInstall(props: any) {
18
18
  <dependency>
19
19
  <groupId>${groupId}</groupId>
20
20
  <artifactId>${artifactId}</artifactId>
21
- <version>0.0.1</version>
21
+ <version>${packageVersion(model, target.name)}</version>
22
22
  </dependency>
23
23
  \`\`\`
24
24
 
@@ -93,7 +93,7 @@ ${opRows}
93
93
 
94
94
  ### Result shape
95
95
 
96
- Entity operations return the bare result data (a \`Map\` for single-entity
96
+ Entity operations return the ENTITY (call data() for the record) (a \`Map\` for single-entity
97
97
  ops, an aggregate \`List\` for \`list\`) as \`Object\` and raise on error. Wrap
98
98
  calls in \`try\`/\`catch\` to handle failures.
99
99
 
@@ -123,7 +123,7 @@ catch (RuntimeException err) {
123
123
  Content(`### 3. Load ${neArticle} ${neName.toLowerCase()}
124
124
 
125
125
  ${neName} is nested under ${parentName}, so provide the \`${parentParam}\`.
126
- \`load()\` returns the bare record (as \`Object\`) and raises on error.
126
+ \`load()\` returns the ENTITY call data() for the record — and raises on error.
127
127
 
128
128
  \`\`\`java
129
129
  try {
@@ -151,7 +151,7 @@ catch (RuntimeException err) {
151
151
 
152
152
  Content(`### 3. Load ${article} ${eName.toLowerCase()}
153
153
 
154
- \`load()\` returns the bare record (as \`Object\`) and raises on error.
154
+ \`load()\` returns the ENTITY call data() for the record — and raises on error.
155
155
 
156
156
  \`\`\`java
157
157
  try {
@@ -191,7 +191,7 @@ catch (RuntimeException err) {
191
191
  \`\`\`java
192
192
  `)
193
193
  if (opnames.includes('create')) {
194
- Content(`// Create — returns the bare created record (as Object)
194
+ Content(`// Create — returns the ENTITY (call data() for the record)
195
195
  Object created = client.${accessor}(null).create(Map.of(${examplePairs('create').join(', ')}), null);
196
196
 
197
197
  `)
@@ -11,7 +11,7 @@ import {
11
11
  File,
12
12
  cmp,
13
13
  snakify,
14
- isAuthActive,
14
+ isAuthActive, envName, envToken
15
15
  } from '@voxgig/sdkgen'
16
16
 
17
17
 
@@ -70,7 +70,7 @@ const TestDirect = cmp(function TestDirect(props: any) {
70
70
  const entity: ModelEntity = props.entity
71
71
  const javapackage: string = props.javapackage
72
72
 
73
- const PROJECTNAME = nom(model, 'Name').toUpperCase().replace(/[^A-Z_]/g, '_')
73
+ const PROJECTNAME = envName(model)
74
74
  const SDK = model.const.Name + 'SDK'
75
75
 
76
76
  const authActive = isAuthActive(model)
@@ -132,7 +132,7 @@ const TestDirect = cmp(function TestDirect(props: any) {
132
132
  : ''
133
133
 
134
134
  // Build the ENTID env var name for this entity
135
- const entidEnvVar = `${PROJECTNAME}_TEST_${nom(entity, 'NAME').replace(/[^A-Z_]/g, '_')}_ENTID`
135
+ const entidEnvVar = `${PROJECTNAME}_TEST_${envToken(entity.name)}_ENTID`
136
136
 
137
137
  File({ name: entity.Name + 'DirectTest.' + target.ext }, () => {
138
138
 
@@ -17,7 +17,7 @@ import {
17
17
  each,
18
18
  buildIdNames,
19
19
  getMatchEntries,
20
- isAuthActive,
20
+ isAuthActive, envName, envToken
21
21
  } from '@voxgig/sdkgen'
22
22
 
23
23
 
@@ -58,8 +58,8 @@ const TestEntity = cmp(function TestEntity(props: any) {
58
58
  return
59
59
  }
60
60
 
61
- const PROJUPPER = nom(model.const, 'Name').toUpperCase().replace(/[^A-Z_]/g, '_')
62
- const ENTUPPER = entity.name.toUpperCase().replace(/[^A-Z_]/g, '_')
61
+ const PROJUPPER = envName(model)
62
+ const ENTUPPER = envToken(entity.name)
63
63
  const entidEnvVar = `${PROJUPPER}_TEST_${ENTUPPER}_ENTID`
64
64
 
65
65
  const SDK = model.const.Name + 'SDK'
@@ -339,7 +339,7 @@ const generateCreate: OpGen = (ctx, step, index) => {
339
339
 
340
340
  Content(`
341
341
  Object ${datavar}Result = ${entvar}.create(${datavar}, null);
342
- ${datavar} = Helpers.toMapAny(${datavar}Result);
342
+ ${datavar} = Helpers.toMapAny(${datavar}Result instanceof SdkEntity ? ((SdkEntity) ${datavar}Result).data() : ${datavar}Result);
343
343
  assertNotNull(${datavar}, "expected create result to be a map");
344
344
  `)
345
345
  if (null != ctx.entity.id) {
@@ -479,7 +479,7 @@ const generateUpdate: OpGen = (ctx, step, index) => {
479
479
 
480
480
  Content(`
481
481
  Object ${resdatavar}Result = ${entvar}.update(${datavar}Up, null);
482
- Map<String, Object> ${resdatavar} = Helpers.toMapAny(${resdatavar}Result);
482
+ Map<String, Object> ${resdatavar} = Helpers.toMapAny(${resdatavar}Result instanceof SdkEntity ? ((SdkEntity) ${resdatavar}Result).data() : ${resdatavar}Result);
483
483
  assertNotNull(${resdatavar}, "expected update result to be a map");
484
484
  `)
485
485
  if (hasEntIdU) {
@@ -546,7 +546,7 @@ const generateLoad: OpGen = (ctx, step, index) => {
546
546
  if (hasEntId) {
547
547
  Content(` ${matchvar}.put("id", ${srcdatavar}.get("id"));
548
548
  Object ${datavar}Loaded = ${entvar}.load(${matchvar}, null);
549
- Map<String, Object> ${datavar}LoadResult = Helpers.toMapAny(${datavar}Loaded);
549
+ Map<String, Object> ${datavar}LoadResult = Helpers.toMapAny(${datavar}Loaded instanceof SdkEntity ? ((SdkEntity) ${datavar}Loaded).data() : ${datavar}Loaded);
550
550
  assertNotNull(${datavar}LoadResult, "expected load result to be a map");
551
551
  assertEquals(${srcdatavar}.get("id"), ${datavar}LoadResult.get("id"),
552
552
  "expected load result id to match");
@@ -34,6 +34,20 @@ public abstract class EntityBase implements SdkEntity {
34
34
  protected Map<String, Object> match = new LinkedHashMap<>();
35
35
  protected Context entctx;
36
36
 
37
+ // Every operation resolves to the entity; `remove` additionally marks
38
+ // it. The instance KEEPS the data it held — a caller can still read what
39
+ // was deleted — but it is no longer a live record. See AGENTS.md.
40
+ private boolean deleted = false;
41
+
42
+ public void markDeleted() {
43
+ this.deleted = true;
44
+ }
45
+
46
+ public boolean deleted() {
47
+ return this.deleted;
48
+ }
49
+
50
+
37
51
  protected EntityBase(String name, SdkClient client, Map<String, Object> entopts) {
38
52
  if (entopts == null) {
39
53
  entopts = new LinkedHashMap<>();
@@ -127,7 +141,26 @@ public abstract class EntityBase implements SdkEntity {
127
141
 
128
142
  postDone.run();
129
143
 
130
- return utility.done.apply(ctx);
144
+ Object out = utility.done.apply(ctx);
145
+
146
+ // An operation resolves to the ENTITY, not the raw data. Entities are
147
+ // stateful: postDone has just absorbed resdata/resmatch into this
148
+ // instance, and the caller reaches the record through data(). Two
149
+ // structural exceptions: `list` resolves to the ARRAY of entity
150
+ // instances makeResult built, and a failed op with throwing disabled
151
+ // hands back the error payload unchanged. `remove` additionally marks
152
+ // the entity deleted; it KEEPS its data, so a caller can still read
153
+ // what was removed. See AGENTS.md "Entity operations return ENTITIES".
154
+ String opname = ctx.op == null ? null : ctx.op.name;
155
+
156
+ if (ctx.result != null && ctx.result.ok && !"list".equals(opname)) {
157
+ if ("remove".equals(opname)) {
158
+ this.markDeleted();
159
+ }
160
+ return this;
161
+ }
162
+
163
+ return out;
131
164
  }
132
165
  catch (RuntimeException err) {
133
166
  // An error already finalised by makeError (e.g. via done) must not
@@ -13,6 +13,18 @@ public class SdkError extends RuntimeException {
13
13
  public transient Object result;
14
14
  public transient Object spec;
15
15
 
16
+ /**
17
+ * HTTP status of the response that caused this error, or -1 when the
18
+ * request never got one. PROMOTED to the top level: it used to be
19
+ * reachable only at `err.result.status`, so every consumer coupled itself
20
+ * to the internal shape of `result`.
21
+ */
22
+ public int status = -1;
23
+
24
+ public boolean notFound() {
25
+ return 404 == this.status;
26
+ }
27
+
16
28
  public SdkError(String code, String msg, Context ctx) {
17
29
  super(msg);
18
30
  this.code = code == null ? "" : code;
@@ -4,7 +4,7 @@ import * as Path from 'node:path'
4
4
  import {
5
5
  cmp, each, names, cmap,
6
6
  List, File, Content, Copy, Folder, Fragment, Line, FeatureHook,
7
- entityClassName, entityCollection,
7
+ entityClassName, entityCollection, srcFeatureExcludes,
8
8
  } from '@voxgig/sdkgen'
9
9
 
10
10
 
@@ -43,6 +43,9 @@ const Main = cmp(async function Main(props: any) {
43
43
 
44
44
  Copy({
45
45
  from: 'tm/' + target.name,
46
+ // Root copies src/feature/<name>/ per ACTIVE feature; keep this blanket
47
+ // copy from restoring one that was switched off after `target add`.
48
+ exclude: srcFeatureExcludes(model),
46
49
  replace: {
47
50
  ...props.ctx$.stdrep,
48
51
  }
@@ -11,6 +11,7 @@ import {
11
11
  repoInfo,
12
12
  PUBLISHER,
13
13
  PUBLISHER_URL,
14
+ packageVersion,
14
15
  } from '@voxgig/sdkgen'
15
16
 
16
17
 
@@ -56,7 +57,7 @@ const Package = cmp(async function Package(props: any) {
56
57
  // The ts target publishes the canonical scoped npm name; the js target
57
58
  // appends `-js` so the two never collide on npm.
58
59
  name: packageName(model, 'js'),
59
- version: `0.0.1`,
60
+ version: packageVersion(model, target.name),
60
61
  description: pkgDescription(model, target.name),
61
62
  keywords: keywords(model),
62
63
  homepage: `${repoUrl}#readme`,
@@ -64,6 +65,11 @@ const Package = cmp(async function Package(props: any) {
64
65
  bugs: { url: issuesUrl },
65
66
  main: `src/${SdkName}SDK.js`,
66
67
  type: 'commonjs',
68
+
69
+ // What actually ships. Without `files`, `npm publish` packs the test
70
+ // suite and the build scaffolding too. The js target runs from `src`
71
+ // directly (no build step), so that is the whole package.
72
+ files: ['src'],
67
73
  scripts: {
68
74
  'test': 'node --test \'test/**/*.test.js\'',
69
75
  'test-some': 'node --experimental-test-isolation=none ' +
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, each, Content, canonToType, entityIdField, opRequestShape, safeVarName, exampleVarName, jsKey } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, canonToType, entityIdField, opRequestShape, safeVarName, exampleVarName, jsKey, matchArg, idLiteral } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -12,6 +12,17 @@ import { exampleValue } from './utility_js'
12
12
  // Operation method spelling differs between Go and other languages — Go
13
13
  // uses PascalCase methods with explicit ctrl arg, others use lowercase
14
14
  // methods with optional ctrl. The op descriptions are language-agnostic.
15
+ // A `list()` on a NESTED entity needs its parent path params. The
16
+ // quickstart used to emit `client.Moon().list()` for an entity at
17
+ // `/planet/{planet_id}/moon`, which 404s against a live server from a
18
+ // half-built URL — indistinguishable from "no such record". The model
19
+ // already marks those params `reqd: true`; matchArg renders exactly them.
20
+ function listMatchArg(ent: any): string {
21
+ const idF = entityIdField(ent)
22
+ return matchArg('ts', ent, 'list', idF, idLiteral(ent, 'list', idF))
23
+ }
24
+
25
+
15
26
  const OP_DESC: Record<string, { method: string, desc: string }> = {
16
27
  load: { method: 'load(match)', desc: 'Load a single entity by match criteria.' },
17
28
  list: { method: 'list(match)', desc: 'List entities matching the criteria.' },
@@ -124,7 +135,7 @@ const ${eVar} = await client.${entity.Name}().load(${loadArg})
124
135
  Content(`#### Example: List
125
136
 
126
137
  \`\`\`ts
127
- const ${eVar}s = await client.${entity.Name}().list()
138
+ const ${eVar}s = await client.${entity.Name}().list(${listMatchArg(entity)})
128
139
  \`\`\`
129
140
 
130
141
  `)
@@ -62,7 +62,8 @@ const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
62
62
  // and omits the stateful section (there is no op to retain state across).
63
63
  const testModeExample = primaryOp
64
64
  ? `const ${eVar} = await client.${eName}().${primaryOp}(${testCallArg})
65
- // ${eVar} is a bare entity populated with mock response data
65
+ // ${eVar} is the entity, populated with mock response data
66
+ // — call ${eVar}.data() for the record itself
66
67
  console.log(${eVar})`
67
68
  : `const result = await client.direct({ path: '/api/resource', method: 'GET' })
68
69
  console.log(result)`
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, each, Content, isAuthActive, packageName, envName, opRequestShape, entityIdField, entityOps, safeVarName, exampleVarName, jsKey } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, isAuthActive, packageName, envName, opRequestShape, entityIdField, entityOps, safeVarName, exampleVarName, jsKey, matchArg, idLiteral } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -10,6 +10,17 @@ import {
10
10
  import { exampleValue } from './utility_js'
11
11
 
12
12
 
13
+ // A `list()` on a NESTED entity needs its parent path params. The
14
+ // quickstart used to emit `client.Moon().list()` for an entity at
15
+ // `/planet/{planet_id}/moon`, which 404s against a live server from a
16
+ // half-built URL — indistinguishable from "no such record". The model
17
+ // already marks those params `reqd: true`; matchArg renders exactly them.
18
+ function listMatchArg(ent: any): string {
19
+ const idF = entityIdField(ent)
20
+ return matchArg('ts', ent, 'list', idF, idLiteral(ent, 'list', idF))
21
+ }
22
+
23
+
13
24
  const ReadmeQuick = cmp(function ReadmeQuick(props: any) {
14
25
  const { target, ctx$: { model } } = props
15
26
 
@@ -98,7 +109,7 @@ console.log(${eVar})
98
109
  ### List ${eName} Records
99
110
 
100
111
  \`\`\`js
101
- const ${eVar}s = await client.${eName}().list()
112
+ const ${eVar}s = await client.${eName}().list(${listMatchArg(exampleEntity)})
102
113
  for (const ${eVar} of ${eVar}s) {
103
114
  console.log(${eVar})
104
115
  }
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, Content, isAuthActive, packageName, envName, entityIdField, entityOps, opRequestShape, safeVarName, exampleVarName, jsKey } from '@voxgig/sdkgen'
2
+ import { cmp, Content, isAuthActive, packageName, envName, entityIdField, entityOps, opRequestShape, safeVarName, exampleVarName, jsKey, matchArg, idLiteral } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -10,6 +10,17 @@ import {
10
10
  import { exampleValue } from './utility_js'
11
11
 
12
12
 
13
+ // A `list()` on a NESTED entity needs its parent path params. The
14
+ // quickstart used to emit `client.Moon().list()` for an entity at
15
+ // `/planet/{planet_id}/moon`, which 404s against a live server from a
16
+ // half-built URL — indistinguishable from "no such record". The model
17
+ // already marks those params `reqd: true`; matchArg renders exactly them.
18
+ function listMatchArg(ent: any): string {
19
+ const idF = entityIdField(ent)
20
+ return matchArg('ts', ent, 'list', idF, idLiteral(ent, 'list', idF))
21
+ }
22
+
23
+
13
24
  const ReadmeTopQuick = cmp(function ReadmeTopQuick(props: any) {
14
25
  const { target, ctx$: { model } } = props
15
26
 
@@ -36,7 +47,7 @@ const client = ${ctor}
36
47
 
37
48
  if (opnames.includes('list')) {
38
49
  Content(`// List all ${eName.toLowerCase()}s (returns an array)
39
- const ${eVar}s = await client.${eName}().list()
50
+ const ${eVar}s = await client.${eName}().list(${listMatchArg(exampleEntity)})
40
51
  for (const ${eVar} of ${eVar}s) {
41
52
  console.log(${eVar})
42
53
  }
@@ -51,7 +51,8 @@ const client = ${model.const.Name}SDK.test()
51
51
  `${jsKey(it.name)}: ${exampleValue(exampleEntity, primaryOpDef, it.name, 'example_' + it.name)}`).join(', ')} }`
52
52
  }
53
53
  Content(`const ${eVar} = await client.${eName}().${primaryOp}(${arg})
54
- // ${eVar} is ${'list' === primaryOp ? 'an array of bare entities' : 'a bare entity'} populated with mock data
54
+ // ${eVar} is ${'list' === primaryOp ? 'an array of entities' : 'the entity'}, populated with mock data
55
+ // — call ${eVar}${'list' === primaryOp ? '[0]' : ''}.data() for the record itself
55
56
  console.log(${eVar})
56
57
  `)
57
58
  }
@@ -17,7 +17,7 @@ import {
17
17
  cmp,
18
18
  snakify,
19
19
  isAuthActive,
20
- jsProp,
20
+ jsProp, envName, envToken
21
21
  } from '@voxgig/sdkgen'
22
22
 
23
23
 
@@ -36,8 +36,8 @@ const TestDirect = cmp(function TestDirect(props: any) {
36
36
 
37
37
  const ff = projectPath('src/cmp/js/fragment/')
38
38
 
39
- const PROJECTNAME = nom(model, 'Name').toUpperCase().replace(/[^A-Z_]/g, '_')
40
- const entidEnvVar = `${PROJECTNAME}_TEST_${nom(entity, 'NAME').replace(/[^A-Z_]/g, '_')}_ENTID`
39
+ const PROJECTNAME = envName(model)
40
+ const entidEnvVar = `${PROJECTNAME}_TEST_${envToken(entity.name)}_ENTID`
41
41
 
42
42
  const authActive = isAuthActive(model)
43
43
  const apikeyEnvEntry = authActive
@@ -30,7 +30,7 @@ import {
30
30
  cmp,
31
31
  each,
32
32
  isAuthActive,
33
- entityDataIdField,
33
+ entityDataIdField, envName, envToken
34
34
  } from '@voxgig/sdkgen'
35
35
 
36
36
 
@@ -59,8 +59,8 @@ const TestEntity = cmp(function TestEntity(props: any) {
59
59
  const target = props.target
60
60
  const entity: ModelEntity = props.entity
61
61
 
62
- const PROJENVNAME = nom(model.const, 'NAME').replace(/[^A-Z_]/g, '_')
63
- const ENTENVNAME = nom(entity, 'NAME').replace(/[^A-Z_]/g, '_')
62
+ const PROJENVNAME = envName(model)
63
+ const ENTENVNAME = envToken(entity.name)
64
64
  const authActive = isAuthActive(model)
65
65
  const apikeyEnvEntry = authActive
66
66
  ? `\n '${PROJENVNAME}_APIKEY': 'NONE',`
@@ -256,7 +256,7 @@ const generateCreate: OpGen = (ctx, step, index) => {
256
256
  const hasEntIdC = null != entity.id
257
257
 
258
258
  Content(`
259
- ${datavar} = await ${entvar}.create(${datavar})
259
+ ${datavar} = (await ${entvar}.create(${datavar})).data()
260
260
  `)
261
261
  if (hasEntIdC) {
262
262
  Content(` assert(null != ${datavar}.id)
@@ -297,7 +297,7 @@ const generateList: OpGen = (ctx, step, index) => {
297
297
  })
298
298
 
299
299
  Content(`
300
- const ${listvar} = await ${entvar}.list(${matchvar})
300
+ const ${listvar} = (await ${entvar}.list(${matchvar})).map((e) => e.data())
301
301
  `)
302
302
  const allSteps = flow.step
303
303
  for (let vI = 0; vI < step.valid.length; vI++) {
@@ -370,7 +370,7 @@ const generateUpdate: OpGen = (ctx, step, index) => {
370
370
  }
371
371
 
372
372
  Content(`
373
- const ${resdatavar} = await ${entvar}.update(${datavar})
373
+ const ${resdatavar} = (await ${entvar}.update(${datavar})).data()
374
374
  `)
375
375
  if (hasEntIdU) {
376
376
  Content(` assert(${resdatavar}.id === ${datavar}.id)
@@ -435,13 +435,13 @@ const generateLoad: OpGen = (ctx, step, index) => {
435
435
  if (hasEntId) {
436
436
  Content(` const ${matchvar} = {}
437
437
  ${matchvar}.id = ${srcdatavar}.id
438
- const ${datavar} = await ${entvar}.load(${matchvar})
438
+ const ${datavar} = (await ${entvar}.load(${matchvar})).data()
439
439
  assert(${datavar}.id === ${srcdatavar}.id)
440
440
  `)
441
441
  }
442
442
  else {
443
443
  Content(` const ${matchvar} = {}
444
- const ${datavar} = await ${entvar}.load(${matchvar})
444
+ const ${datavar} = (await ${entvar}.load(${matchvar})).data()
445
445
  assert(null != ${datavar})
446
446
  `)
447
447
  }