@voxgig/sdkgen 2.0.1 → 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 (394) 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 +8 -5
  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 +24 -11
  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/Config_dart.ts +6 -0
  108. package/project/.sdk/src/cmp/dart/Package_dart.ts +2 -1
  109. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +13 -2
  110. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +2 -1
  111. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +3 -3
  112. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +1 -1
  113. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +17 -6
  114. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +13 -2
  115. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +13 -2
  116. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +3 -3
  117. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +8 -8
  118. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +18 -1
  119. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +9 -1
  120. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +9 -1
  121. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +15 -1
  122. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +9 -1
  123. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +8 -0
  124. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
  125. package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +2 -2
  126. package/project/.sdk/src/cmp/elixir/ReadmeTopQuick_elixir.ts +7 -4
  127. package/project/.sdk/src/cmp/elixir/TestEntity_elixir.ts +11 -2
  128. package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +2 -1
  129. package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +1 -0
  130. package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +2 -1
  131. package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -1
  132. package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +2 -1
  133. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +38 -8
  134. package/project/.sdk/src/cmp/go/Entity_go.ts +2 -2
  135. package/project/.sdk/src/cmp/go/Main_go.ts +4 -5
  136. package/project/.sdk/src/cmp/go/Package_go.ts +8 -5
  137. package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +2 -2
  138. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +2 -2
  139. package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +4 -2
  140. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +2 -2
  141. package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +2 -2
  142. package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +2 -2
  143. package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +2 -2
  144. package/project/.sdk/src/cmp/go/TestDirect_go.ts +21 -15
  145. package/project/.sdk/src/cmp/go/TestEntity_go.ts +9 -9
  146. package/project/.sdk/src/cmp/go/Test_go.ts +2 -2
  147. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +42 -1
  148. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +4 -4
  149. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +4 -4
  150. package/project/.sdk/src/cmp/haskell/Package_haskell.ts +2 -1
  151. package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +10 -5
  152. package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +10 -8
  153. package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +14 -10
  154. package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +21 -18
  155. package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +4 -4
  156. package/project/.sdk/src/cmp/haskell/Test_haskell.ts +23 -11
  157. package/project/.sdk/src/cmp/java/Package_java.ts +2 -1
  158. package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +2 -1
  159. package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +2 -2
  160. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +1 -1
  161. package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +3 -3
  162. package/project/.sdk/src/cmp/java/TestDirect_java.ts +3 -3
  163. package/project/.sdk/src/cmp/java/TestEntity_java.ts +6 -6
  164. package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +34 -1
  165. package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +12 -0
  166. package/project/.sdk/src/cmp/js/Main_js.ts +4 -1
  167. package/project/.sdk/src/cmp/js/Package_js.ts +7 -1
  168. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -2
  169. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +2 -1
  170. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +13 -2
  171. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +13 -2
  172. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +2 -1
  173. package/project/.sdk/src/cmp/js/TestDirect_js.ts +3 -3
  174. package/project/.sdk/src/cmp/js/TestEntity_js.ts +8 -8
  175. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +22 -1
  176. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +9 -1
  177. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +9 -1
  178. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +15 -1
  179. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +9 -1
  180. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +13 -0
  181. package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +2 -1
  182. package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +2 -1
  183. package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +2 -2
  184. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +1 -1
  185. package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +3 -3
  186. package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +3 -3
  187. package/project/.sdk/src/cmp/kotlin/TestEntity_kotlin.ts +6 -6
  188. package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +32 -1
  189. package/project/.sdk/src/cmp/lean/Package_lean.ts +3 -1
  190. package/project/.sdk/src/cmp/lean/Test_lean.ts +75 -21
  191. package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +9 -4
  192. package/project/.sdk/src/cmp/lua/Package_lua.ts +4 -3
  193. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +11 -3
  194. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +1 -1
  195. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +3 -3
  196. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +9 -9
  197. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +37 -1
  198. package/project/.sdk/src/cmp/lua/fragment/SdkError.fragment.lua +12 -0
  199. package/project/.sdk/src/cmp/ocaml/EntityOperation_ocaml.ts +30 -3
  200. package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +11 -5
  201. package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +3 -1
  202. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +10 -5
  203. package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +6 -2
  204. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +10 -8
  205. package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +14 -13
  206. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +20 -18
  207. package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +4 -4
  208. package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +8 -2
  209. package/project/.sdk/src/cmp/ocaml/TestEntity_ocaml.ts +8 -5
  210. package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +2 -1
  211. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +1 -1
  212. package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +3 -3
  213. package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +1 -1
  214. package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +3 -3
  215. package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +6 -6
  216. package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +36 -1
  217. package/project/.sdk/src/cmp/php/MainEntity_php.ts +21 -16
  218. package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
  219. package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +6 -6
  220. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +4 -3
  221. package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +2 -2
  222. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +1 -1
  223. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +12 -12
  224. package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +6 -6
  225. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +4 -4
  226. package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +2 -2
  227. package/project/.sdk/src/cmp/php/TestDirect_php.ts +3 -3
  228. package/project/.sdk/src/cmp/php/TestEntity_php.ts +17 -15
  229. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +20 -1
  230. package/project/.sdk/src/cmp/php/fragment/SdkError.fragment.php +11 -0
  231. package/project/.sdk/src/cmp/py/Package_py.ts +4 -3
  232. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +13 -2
  233. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +2 -1
  234. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +1 -1
  235. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +17 -6
  236. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +14 -3
  237. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +13 -2
  238. package/project/.sdk/src/cmp/py/TestDirect_py.ts +3 -3
  239. package/project/.sdk/src/cmp/py/TestEntity_py.ts +9 -9
  240. package/project/.sdk/src/cmp/py/Test_py.ts +4 -1
  241. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +29 -1
  242. package/project/.sdk/src/cmp/py/fragment/SdkError.fragment.py +11 -0
  243. package/project/.sdk/src/cmp/py-data/Main_py-data.ts +2 -1
  244. package/project/.sdk/src/cmp/rb/Package_rb.ts +4 -3
  245. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +1 -1
  246. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +2 -1
  247. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +5 -5
  248. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +1 -1
  249. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +3 -3
  250. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +9 -9
  251. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +31 -1
  252. package/project/.sdk/src/cmp/rb/fragment/SdkError.fragment.rb +10 -1
  253. package/project/.sdk/src/cmp/rust/Entity_rust.ts +5 -1
  254. package/project/.sdk/src/cmp/rust/Main_rust.ts +21 -0
  255. package/project/.sdk/src/cmp/rust/Package_rust.ts +2 -1
  256. package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +3 -3
  257. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +12 -12
  258. package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +18 -0
  259. package/project/.sdk/src/cmp/rust/fragment/EntityCreateOp.fragment.rs +8 -2
  260. package/project/.sdk/src/cmp/rust/fragment/EntityListOp.fragment.rs +20 -3
  261. package/project/.sdk/src/cmp/rust/fragment/EntityLoadOp.fragment.rs +8 -2
  262. package/project/.sdk/src/cmp/rust/fragment/EntityRemoveOp.fragment.rs +10 -2
  263. package/project/.sdk/src/cmp/rust/fragment/EntityUpdateOp.fragment.rs +8 -2
  264. package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +10 -0
  265. package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +2 -1
  266. package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +3 -3
  267. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +1 -1
  268. package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +3 -3
  269. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +3 -3
  270. package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +27 -1
  271. package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +2 -1
  272. package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +3 -3
  273. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +1 -1
  274. package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +3 -3
  275. package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +34 -1
  276. package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +9 -1
  277. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +18 -1
  278. package/project/.sdk/src/cmp/ts/Gitignore_ts.ts +5 -2
  279. package/project/.sdk/src/cmp/ts/Main_ts.ts +4 -1
  280. package/project/.sdk/src/cmp/ts/Package_ts.ts +10 -1
  281. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -2
  282. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +2 -1
  283. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +21 -6
  284. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +52 -2
  285. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +14 -3
  286. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +34 -2
  287. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +64 -43
  288. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +8 -8
  289. package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +2 -2
  290. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +2 -2
  291. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +25 -1
  292. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +10 -2
  293. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +1 -1
  294. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +10 -2
  295. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +27 -3
  296. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +10 -2
  297. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +15 -0
  298. package/project/.sdk/src/cmp/zig/Entity_zig.ts +5 -1
  299. package/project/.sdk/src/cmp/zig/Package_zig.ts +3 -1
  300. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +39 -0
  301. package/project/.sdk/src/cmp/zig/fragment/EntityCreateOp.fragment.zig +2 -2
  302. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +21 -2
  303. package/project/.sdk/src/cmp/zig/fragment/EntityLoadOp.fragment.zig +2 -2
  304. package/project/.sdk/src/cmp/zig/fragment/EntityRemoveOp.fragment.zig +5 -2
  305. package/project/.sdk/src/cmp/zig/fragment/EntityUpdateOp.fragment.zig +2 -2
  306. package/project/.sdk/tm/c/VERSION +1 -1
  307. package/project/.sdk/tm/c/core/helpers.c +1 -0
  308. package/project/.sdk/tm/c/core/sdk.h +22 -6
  309. package/project/.sdk/tm/c/tests/feature_harness.h +1 -0
  310. package/project/.sdk/tm/c/tests/primary_utility_test.c +4 -1
  311. package/project/.sdk/tm/c/utility/graphql.c +1 -1
  312. package/project/.sdk/tm/c/utility/make_url.c +1 -0
  313. package/project/.sdk/tm/c/utility/param.c +1 -0
  314. package/project/.sdk/tm/clojure/VERSION +1 -1
  315. package/project/.sdk/tm/cpp/VERSION +1 -1
  316. package/project/.sdk/tm/cpp/core/types.hpp +33 -8
  317. package/project/.sdk/tm/cpp/test/pipeline_test.cpp +5 -0
  318. package/project/.sdk/tm/cpp/test/runner_support.hpp +4 -4
  319. package/project/.sdk/tm/csharp/VERSION +1 -1
  320. package/project/.sdk/tm/csharp/core/Types.cs +6 -0
  321. package/project/.sdk/tm/csharp/test/FeatureHarness.cs +396 -0
  322. package/project/.sdk/tm/csharp/test/FeatureTest.cs +7 -385
  323. package/project/.sdk/tm/csharp/test/Runner.cs +4 -4
  324. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +4 -0
  325. package/project/.sdk/tm/dart/test/utility.dart +4 -4
  326. package/project/.sdk/tm/elixir/VERSION +1 -1
  327. package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +26 -0
  328. package/project/.sdk/tm/go/VERSION +1 -1
  329. package/project/.sdk/tm/go/core/types.go +6 -0
  330. package/project/.sdk/tm/go/test/feature_harness_test.go +361 -0
  331. package/project/.sdk/tm/go/test/feature_test.go +7 -350
  332. package/project/.sdk/tm/go/test/pipeline_test.go +6 -0
  333. package/project/.sdk/tm/go/test/runner_test.go +16 -4
  334. package/project/.sdk/tm/haskell/VERSION +1 -1
  335. package/project/.sdk/tm/haskell/src/SdkFeatures.hs +28 -5
  336. package/project/.sdk/tm/haskell/src/SdkTypes.hs +14 -5
  337. package/project/.sdk/tm/java/VERSION +1 -1
  338. package/project/.sdk/tm/java/test/RunnerSupport.java +4 -4
  339. package/project/.sdk/tm/java/utility/MakeError.java +4 -0
  340. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +4 -0
  341. package/project/.sdk/tm/js/test/utility.js +3 -3
  342. package/project/.sdk/tm/kotlin/VERSION +1 -1
  343. package/project/.sdk/tm/kotlin/core/Utility.kt +2 -0
  344. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +3 -3
  345. package/project/.sdk/tm/lean/Makefile +25 -0
  346. package/project/.sdk/tm/lean/VERSION +1 -1
  347. package/project/.sdk/tm/lean/src/SdkUtility.lean +11 -9
  348. package/project/.sdk/tm/lean/test/TFeature.lean +27 -14
  349. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +5 -2
  350. package/project/.sdk/tm/lua/test/runner.lua +4 -4
  351. package/project/.sdk/tm/lua/utility/make_error.lua +4 -0
  352. package/project/.sdk/tm/ocaml/VERSION +1 -1
  353. package/project/.sdk/tm/ocaml/sdk_types.ml +14 -5
  354. package/project/.sdk/tm/ocaml/test/t_pipeline.ml +5 -2
  355. package/project/.sdk/tm/perl/t/runner.pm +4 -4
  356. package/project/.sdk/tm/php/VERSION +1 -1
  357. package/project/.sdk/tm/php/test/Runner.php +4 -4
  358. package/project/.sdk/tm/php/utility/MakeError.php +5 -0
  359. package/project/.sdk/tm/py/pkg/utility/make_error.py +4 -0
  360. package/project/.sdk/tm/py/test/runner.py +19 -4
  361. package/project/.sdk/tm/rb/test/runner.rb +4 -4
  362. package/project/.sdk/tm/rb/utility/make_error.rb +4 -0
  363. package/project/.sdk/tm/rust/VERSION +1 -1
  364. package/project/.sdk/tm/rust/core/types.rs +22 -6
  365. package/project/.sdk/tm/rust/tests/common/mod.rs +6 -6
  366. package/project/.sdk/tm/rust/tests/pipeline_test.rs +6 -0
  367. package/project/.sdk/tm/rust/utility/make_error.rs +4 -0
  368. package/project/.sdk/tm/scala/VERSION +1 -1
  369. package/project/.sdk/tm/swift/VERSION +1 -1
  370. package/project/.sdk/tm/ts/src/tsconfig.json +1 -0
  371. package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +4 -0
  372. package/project/.sdk/tm/ts/test/tsconfig.json +1 -0
  373. package/project/.sdk/tm/ts/test/utility.ts +3 -3
  374. package/project/.sdk/tm/zig/VERSION +1 -1
  375. package/src/action/doctor.ts +410 -0
  376. package/src/action/feature.ts +54 -16
  377. package/src/action/target.ts +174 -25
  378. package/src/cmp/Entity.ts +7 -0
  379. package/src/cmp/Feature.ts +3 -1
  380. package/src/cmp/Main.ts +7 -1
  381. package/src/cmp/ReadmeExplanation.ts +2 -2
  382. package/src/cmp/ReadmeTop.ts +22 -9
  383. package/src/cmp/Registered.ts +100 -0
  384. package/src/cmp/Test.ts +4 -1
  385. package/src/helpers/dryrun.ts +57 -0
  386. package/src/helpers/featureSource.ts +208 -0
  387. package/src/helpers/naming.ts +73 -2
  388. package/src/helpers/opExample.ts +19 -2
  389. package/src/helpers/opShape.ts +65 -0
  390. package/src/helpers/packageMeta.ts +163 -10
  391. package/src/helpers/stdrep.ts +56 -0
  392. package/src/helpers/testPolicy.ts +52 -0
  393. package/src/sdkgen.ts +70 -4
  394. package/project/.sdk/tm/rust/feature/mod.rs +0 -24
@@ -21,11 +21,11 @@ const ReadmeModel = cmp(function ReadmeModel(props: any) {
21
21
  entityList.forEach((e: any) => Object.keys(e.op || {})
22
22
  .forEach((o: string) => { if (e.op[o] && e.op[o].active !== false) opUnion.add(o) }))
23
23
  const opRowDefs: Record<string, string> = {
24
- load: '| `eLoad` | `Value -> Value -> IO Value` | Load a single entity by match criteria. Raises on error. |',
25
- list: '| `eList` | `Value -> Value -> IO Value` | List entities matching the criteria. Raises on error. |',
26
- create: '| `eCreate` | `Value -> Value -> IO Value` | Create a new entity. Raises on error. |',
27
- update: '| `eUpdate` | `Value -> Value -> IO Value` | Update an existing entity. Raises on error. |',
28
- remove: '| `eRemove` | `Value -> Value -> IO Value` | Remove an entity. Raises on error. |',
24
+ load: '| `eLoad` | `Value -> Value -> IO Entity` | Load a single entity by match criteria. Resolves to the entity. Raises on error. |',
25
+ list: '| `eList` | `Value -> Value -> IO [Entity]` | List entities matching the criteria. Resolves to one entity per record. Raises on error. |',
26
+ create: '| `eCreate` | `Value -> Value -> IO Entity` | Create a new entity. Resolves to the entity. Raises on error. |',
27
+ update: '| `eUpdate` | `Value -> Value -> IO Entity` | Update an existing entity. Resolves to the entity. Raises on error. |',
28
+ remove: '| `eRemove` | `Value -> Value -> IO Entity` | Remove an entity. Resolves to the entity, marked deleted. Raises on error. |',
29
29
  }
30
30
  const opRows = ['load', 'list', 'create', 'update', 'remove']
31
31
  .filter((o) => opUnion.has(o)).map((o) => opRowDefs[o]).join('\n')
@@ -103,9 +103,11 @@ ${opRows}
103
103
 
104
104
  ### Result shape
105
105
 
106
- Entity operations return the bare result \`Value\` (a map for single-entity
107
- ops, a list for \`eList\`) and raise on error. Wrap calls in
108
- \`Control.Exception.try\` to handle failures.
106
+ Entity operations resolve to the ENTITY, not the raw record \u2014 \`eList\` to
107
+ one entity per record \u2014 and raise on error. The record is reached through
108
+ \`eDataGet\`, which returns the entity's data container. \`eRemove\` resolves to
109
+ the entity marked deleted (\`eDeleted\`); it keeps the data it held. Wrap calls
110
+ in \`Control.Exception.try\` to handle failures.
109
111
 
110
112
  The \`direct\` escape hatch never raises — it returns a result \`Value\`
111
113
  you branch on via its \`ok\` field (read with \`getp result "ok"\`):
@@ -90,14 +90,15 @@ to recover from failures.
90
90
  if (opnames.includes('list')) {
91
91
  Content(`### 2. List ${eName.toLowerCase()} records
92
92
 
93
- \`eList ent match ctrl\` returns a list \`Value\` and raises on error.
93
+ \`eList ent match ctrl\` resolves to one ENTITY per record and raises on
94
+ error. Read a record with \`eDataGet\`.
94
95
 
95
96
  \`\`\`haskell
96
97
  ent <- Sdk.${eFn} sdk VNoval
97
98
  match <- emptyMap
98
99
  ctrl <- emptyMap
99
100
  ${eFn}s <- Sdk.eList ent match ctrl
100
- print ${eFn}s
101
+ mapM_ (\\en -> print =<< Sdk.eDataGet en) ${eFn}s
101
102
  \`\`\`
102
103
 
103
104
  `)
@@ -123,14 +124,15 @@ to recover from failures.
123
124
  Content(`### 3. Load ${neArticle} ${neName.toLowerCase()}
124
125
 
125
126
  ${neName} is nested under ${parentName}, so provide the \`${parentParam}\`.
126
- \`eLoad\` returns the bare record and raises on error.
127
+ \`eLoad\` resolves to the ENTITY and raises on error; \`eDataGet\` gives the
128
+ record.
127
129
 
128
130
  \`\`\`haskell
129
131
  ${neFn}Ent <- Sdk.${neFn} sdk VNoval
130
132
  m <- jo [${neMatch.join(', ')}]
131
133
  ctrl2 <- emptyMap
132
134
  ${neFn} <- Sdk.eLoad ${neFn}Ent m ctrl2
133
- print ${neFn}
135
+ print =<< Sdk.eDataGet ${neFn}
134
136
  \`\`\`
135
137
 
136
138
  `)
@@ -148,14 +150,15 @@ ${neName} is nested under ${parentName}, so provide the \`${parentParam}\`.
148
150
 
149
151
  Content(`### 3. Load ${article} ${eName.toLowerCase()}
150
152
 
151
- \`eLoad ent match ctrl\` returns the bare record and raises on error.
153
+ \`eLoad ent match ctrl\` resolves to the ENTITY and raises on error;
154
+ \`eDataGet\` gives the record.
152
155
 
153
156
  \`\`\`haskell
154
157
  ent2 <- Sdk.${eFn} sdk VNoval
155
158
  m <- jo ${loadArg}
156
159
  ctrl2 <- emptyMap
157
160
  ${eFn} <- Sdk.eLoad ent2 m ctrl2
158
- print ${eFn}
161
+ print =<< Sdk.eDataGet ${eFn}
159
162
  \`\`\`
160
163
 
161
164
  `)
@@ -192,7 +195,7 @@ ${neName} is nested under ${parentName}, so provide the \`${parentParam}\`.
192
195
  d <- jo [${examplePairs('create').join(', ')}]
193
196
  cctrl <- emptyMap
194
197
  created <- Sdk.eCreate createEnt d cctrl
195
- print created
198
+ print =<< Sdk.eDataGet created
196
199
  \`\`\`
197
200
 
198
201
  `)
@@ -204,7 +207,7 @@ ${neName} is nested under ${parentName}, so provide the \`${parentParam}\`.
204
207
  upd <- jo [${updatePairs.join(', ')}]
205
208
  uctrl <- emptyMap
206
209
  updated <- Sdk.eUpdate updateEnt upd uctrl
207
- print updated
210
+ print =<< Sdk.eDataGet updated
208
211
  \`\`\`
209
212
 
210
213
  `)
@@ -221,8 +224,9 @@ ${neName} is nested under ${parentName}, so provide the \`${parentParam}\`.
221
224
  removeEnt <- Sdk.${eFn} sdk VNoval
222
225
  rm <- jo [${removePairs.length ? removePairs.join(', ') : ''}]
223
226
  rctrl <- emptyMap
224
- _ <- Sdk.eRemove removeEnt rm rctrl
225
- return ()
227
+ -- Resolves to the entity, marked deleted; it keeps the data it held.
228
+ removed <- Sdk.eRemove removeEnt rm rctrl
229
+ print =<< readIORef (Sdk.eDeleted removed)
226
230
  \`\`\`
227
231
 
228
232
  `)
@@ -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
  }