@voxgig/sdkgen 2.0.2 → 3.1.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 (403) hide show
  1. package/bin/voxgig-sdkgen +22 -2
  2. package/dist/action/doctor.d.ts +14 -0
  3. package/dist/action/doctor.js +351 -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/ExternalTarget.d.ts +2 -0
  13. package/dist/cmp/ExternalTarget.js +104 -0
  14. package/dist/cmp/ExternalTarget.js.map +1 -0
  15. package/dist/cmp/Feature.js +2 -1
  16. package/dist/cmp/Feature.js.map +1 -1
  17. package/dist/cmp/Main.js +5 -1
  18. package/dist/cmp/Main.js.map +1 -1
  19. package/dist/cmp/ReadmeExplanation.js +1 -1
  20. package/dist/cmp/ReadmeExplanation.js.map +1 -1
  21. package/dist/cmp/ReadmeTop.js +16 -6
  22. package/dist/cmp/ReadmeTop.js.map +1 -1
  23. package/dist/cmp/Registered.d.ts +7 -0
  24. package/dist/cmp/Registered.js +70 -0
  25. package/dist/cmp/Registered.js.map +1 -0
  26. package/dist/cmp/Test.js +3 -1
  27. package/dist/cmp/Test.js.map +1 -1
  28. package/dist/helpers/dryrun.d.ts +10 -0
  29. package/dist/helpers/dryrun.js +35 -0
  30. package/dist/helpers/dryrun.js.map +1 -0
  31. package/dist/helpers/featureSource.d.ts +13 -0
  32. package/dist/helpers/featureSource.js +156 -0
  33. package/dist/helpers/featureSource.js.map +1 -0
  34. package/dist/helpers/naming.d.ts +9 -1
  35. package/dist/helpers/naming.js +66 -2
  36. package/dist/helpers/naming.js.map +1 -1
  37. package/dist/helpers/opExample.js +23 -3
  38. package/dist/helpers/opExample.js.map +1 -1
  39. package/dist/helpers/opShape.d.ts +11 -1
  40. package/dist/helpers/opShape.js +51 -0
  41. package/dist/helpers/opShape.js.map +1 -1
  42. package/dist/helpers/packageMeta.d.ts +16 -1
  43. package/dist/helpers/packageMeta.js +181 -10
  44. package/dist/helpers/packageMeta.js.map +1 -1
  45. package/dist/helpers/stdrep.d.ts +3 -0
  46. package/dist/helpers/stdrep.js +47 -0
  47. package/dist/helpers/stdrep.js.map +1 -0
  48. package/dist/helpers/testPolicy.d.ts +2 -0
  49. package/dist/helpers/testPolicy.js +46 -0
  50. package/dist/helpers/testPolicy.js.map +1 -0
  51. package/dist/sdkgen.d.ts +15 -6
  52. package/dist/sdkgen.js +273 -5
  53. package/dist/sdkgen.js.map +1 -1
  54. package/dist/tsconfig.tsbuildinfo +1 -1
  55. package/dist/types.d.ts +12 -0
  56. package/dist/utility.js +10 -1
  57. package/dist/utility.js.map +1 -1
  58. package/model/sdkgen.aontu +245 -0
  59. package/package.json +5 -3
  60. package/project/.sdk/model/target/c.aontu +28 -3
  61. package/project/.sdk/model/target/clojure.aontu +24 -3
  62. package/project/.sdk/model/target/cpp.aontu +25 -3
  63. package/project/.sdk/model/target/csharp.aontu +25 -3
  64. package/project/.sdk/model/target/dart.aontu +15 -3
  65. package/project/.sdk/model/target/elixir.aontu +15 -3
  66. package/project/.sdk/model/target/go-cli.aontu +16 -1
  67. package/project/.sdk/model/target/go-mcp.aontu +16 -1
  68. package/project/.sdk/model/target/go.aontu +14 -4
  69. package/project/.sdk/model/target/haskell.aontu +24 -3
  70. package/project/.sdk/model/target/java.aontu +25 -3
  71. package/project/.sdk/model/target/js.aontu +15 -3
  72. package/project/.sdk/model/target/kotlin.aontu +25 -3
  73. package/project/.sdk/model/target/lean.aontu +24 -3
  74. package/project/.sdk/model/target/lua.aontu +15 -3
  75. package/project/.sdk/model/target/ocaml.aontu +24 -3
  76. package/project/.sdk/model/target/perl.aontu +15 -3
  77. package/project/.sdk/model/target/php.aontu +15 -3
  78. package/project/.sdk/model/target/py-data.aontu +15 -3
  79. package/project/.sdk/model/target/py.aontu +15 -3
  80. package/project/.sdk/model/target/rb.aontu +15 -3
  81. package/project/.sdk/model/target/rust.aontu +25 -3
  82. package/project/.sdk/model/target/scala.aontu +24 -3
  83. package/project/.sdk/model/target/seneca-provider.aontu +118 -0
  84. package/project/.sdk/model/target/swift.aontu +25 -3
  85. package/project/.sdk/model/target/ts.aontu +15 -3
  86. package/project/.sdk/model/target/zig.aontu +25 -3
  87. package/project/.sdk/src/cmp/c/Config_c.ts +10 -11
  88. package/project/.sdk/src/cmp/c/Entity_c.ts +5 -1
  89. package/project/.sdk/src/cmp/c/fragment/Entity.fragment.c +23 -5
  90. package/project/.sdk/src/cmp/c/fragment/EntityCreateOp.fragment.c +9 -2
  91. package/project/.sdk/src/cmp/c/fragment/EntityListOp.fragment.c +19 -2
  92. package/project/.sdk/src/cmp/c/fragment/EntityLoadOp.fragment.c +9 -2
  93. package/project/.sdk/src/cmp/c/fragment/EntityRemoveOp.fragment.c +12 -2
  94. package/project/.sdk/src/cmp/c/fragment/EntityUpdateOp.fragment.c +9 -2
  95. package/project/.sdk/src/cmp/c/fragment/Main.fragment.c +1 -0
  96. package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +6 -3
  97. package/project/.sdk/src/cmp/clojure/fragment/Entity.fragment.clj +18 -1
  98. package/project/.sdk/src/cmp/clojure/fragment/EntityCreateOp.fragment.clj +2 -2
  99. package/project/.sdk/src/cmp/clojure/fragment/EntityLoadOp.fragment.clj +2 -2
  100. package/project/.sdk/src/cmp/clojure/fragment/EntityRemoveOp.fragment.clj +12 -8
  101. package/project/.sdk/src/cmp/clojure/fragment/EntityUpdateOp.fragment.clj +2 -2
  102. package/project/.sdk/src/cmp/cpp/Entity_cpp.ts +5 -1
  103. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +12 -9
  104. package/project/.sdk/src/cmp/cpp/fragment/EntityCreateOp.fragment.cpp +8 -2
  105. package/project/.sdk/src/cmp/cpp/fragment/EntityListOp.fragment.cpp +18 -2
  106. package/project/.sdk/src/cmp/cpp/fragment/EntityLoadOp.fragment.cpp +8 -2
  107. package/project/.sdk/src/cmp/cpp/fragment/EntityRemoveOp.fragment.cpp +11 -2
  108. package/project/.sdk/src/cmp/cpp/fragment/EntityUpdateOp.fragment.cpp +8 -2
  109. package/project/.sdk/src/cmp/csharp/Package_csharp.ts +2 -1
  110. package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +3 -3
  111. package/project/.sdk/src/cmp/csharp/TestEntity_csharp.ts +6 -6
  112. package/project/.sdk/src/cmp/csharp/fragment/EntityBase.fragment.cs +38 -1
  113. package/project/.sdk/src/cmp/csharp/fragment/Main.fragment.cs +42 -33
  114. package/project/.sdk/src/cmp/dart/Package_dart.ts +2 -1
  115. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +13 -2
  116. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +2 -1
  117. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +3 -3
  118. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +1 -1
  119. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +17 -6
  120. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +13 -2
  121. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +13 -2
  122. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +3 -3
  123. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +8 -8
  124. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +18 -1
  125. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +9 -1
  126. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +9 -1
  127. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +15 -1
  128. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +9 -1
  129. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +8 -0
  130. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
  131. package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +2 -2
  132. package/project/.sdk/src/cmp/elixir/TestEntity_elixir.ts +11 -2
  133. package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +2 -1
  134. package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +1 -0
  135. package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +2 -1
  136. package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -1
  137. package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +2 -1
  138. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +38 -8
  139. package/project/.sdk/src/cmp/go/Entity_go.ts +2 -2
  140. package/project/.sdk/src/cmp/go/Main_go.ts +4 -5
  141. package/project/.sdk/src/cmp/go/Package_go.ts +8 -5
  142. package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +2 -2
  143. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +2 -2
  144. package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +4 -2
  145. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +2 -2
  146. package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +2 -2
  147. package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +2 -2
  148. package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +2 -2
  149. package/project/.sdk/src/cmp/go/TestDirect_go.ts +21 -15
  150. package/project/.sdk/src/cmp/go/TestEntity_go.ts +9 -9
  151. package/project/.sdk/src/cmp/go/Test_go.ts +2 -2
  152. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +42 -1
  153. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +4 -4
  154. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +4 -4
  155. package/project/.sdk/src/cmp/haskell/Package_haskell.ts +2 -1
  156. package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +10 -5
  157. package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +10 -8
  158. package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +14 -10
  159. package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +21 -18
  160. package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +4 -4
  161. package/project/.sdk/src/cmp/haskell/Test_haskell.ts +23 -11
  162. package/project/.sdk/src/cmp/java/Package_java.ts +2 -1
  163. package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +2 -1
  164. package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +2 -2
  165. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +1 -1
  166. package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +3 -3
  167. package/project/.sdk/src/cmp/java/TestDirect_java.ts +3 -3
  168. package/project/.sdk/src/cmp/java/TestEntity_java.ts +6 -6
  169. package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +34 -1
  170. package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +12 -0
  171. package/project/.sdk/src/cmp/js/Main_js.ts +4 -1
  172. package/project/.sdk/src/cmp/js/Package_js.ts +7 -1
  173. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -2
  174. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +2 -1
  175. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +13 -2
  176. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +13 -2
  177. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +2 -1
  178. package/project/.sdk/src/cmp/js/TestDirect_js.ts +3 -3
  179. package/project/.sdk/src/cmp/js/TestEntity_js.ts +8 -8
  180. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +22 -1
  181. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +9 -1
  182. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +9 -1
  183. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +15 -1
  184. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +9 -1
  185. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +13 -0
  186. package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +2 -1
  187. package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +2 -1
  188. package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +2 -2
  189. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +1 -1
  190. package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +3 -3
  191. package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +3 -3
  192. package/project/.sdk/src/cmp/kotlin/TestEntity_kotlin.ts +6 -6
  193. package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +32 -1
  194. package/project/.sdk/src/cmp/lean/Package_lean.ts +3 -1
  195. package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +9 -4
  196. package/project/.sdk/src/cmp/lua/Package_lua.ts +4 -3
  197. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +11 -3
  198. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +1 -1
  199. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +3 -3
  200. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +9 -9
  201. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +37 -1
  202. package/project/.sdk/src/cmp/lua/fragment/SdkError.fragment.lua +12 -0
  203. package/project/.sdk/src/cmp/ocaml/EntityOperation_ocaml.ts +30 -3
  204. package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +11 -5
  205. package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +3 -1
  206. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +10 -5
  207. package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +6 -2
  208. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +10 -8
  209. package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +14 -13
  210. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +20 -18
  211. package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +4 -4
  212. package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +8 -2
  213. package/project/.sdk/src/cmp/ocaml/TestEntity_ocaml.ts +8 -5
  214. package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +2 -1
  215. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +1 -1
  216. package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +3 -3
  217. package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +1 -1
  218. package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +3 -3
  219. package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +6 -6
  220. package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +36 -1
  221. package/project/.sdk/src/cmp/php/MainEntity_php.ts +21 -16
  222. package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
  223. package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +6 -6
  224. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +4 -3
  225. package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +2 -2
  226. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +1 -1
  227. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +12 -12
  228. package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +6 -6
  229. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +4 -4
  230. package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +2 -2
  231. package/project/.sdk/src/cmp/php/TestDirect_php.ts +3 -3
  232. package/project/.sdk/src/cmp/php/TestEntity_php.ts +17 -15
  233. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +20 -1
  234. package/project/.sdk/src/cmp/php/fragment/SdkError.fragment.php +11 -0
  235. package/project/.sdk/src/cmp/py/Package_py.ts +4 -3
  236. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +13 -2
  237. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +2 -1
  238. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +1 -1
  239. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +17 -6
  240. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +14 -3
  241. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +13 -2
  242. package/project/.sdk/src/cmp/py/TestDirect_py.ts +3 -3
  243. package/project/.sdk/src/cmp/py/TestEntity_py.ts +9 -9
  244. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +29 -1
  245. package/project/.sdk/src/cmp/py/fragment/SdkError.fragment.py +11 -0
  246. package/project/.sdk/src/cmp/py-data/Main_py-data.ts +2 -1
  247. package/project/.sdk/src/cmp/rb/Package_rb.ts +4 -3
  248. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +1 -1
  249. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +2 -1
  250. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +5 -5
  251. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +1 -1
  252. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +3 -3
  253. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +9 -9
  254. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +31 -1
  255. package/project/.sdk/src/cmp/rb/fragment/SdkError.fragment.rb +10 -1
  256. package/project/.sdk/src/cmp/rust/Entity_rust.ts +5 -1
  257. package/project/.sdk/src/cmp/rust/Main_rust.ts +21 -0
  258. package/project/.sdk/src/cmp/rust/Package_rust.ts +2 -1
  259. package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +3 -3
  260. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +12 -12
  261. package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +18 -0
  262. package/project/.sdk/src/cmp/rust/fragment/EntityCreateOp.fragment.rs +8 -2
  263. package/project/.sdk/src/cmp/rust/fragment/EntityListOp.fragment.rs +20 -3
  264. package/project/.sdk/src/cmp/rust/fragment/EntityLoadOp.fragment.rs +8 -2
  265. package/project/.sdk/src/cmp/rust/fragment/EntityRemoveOp.fragment.rs +10 -2
  266. package/project/.sdk/src/cmp/rust/fragment/EntityUpdateOp.fragment.rs +8 -2
  267. package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +10 -0
  268. package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +2 -1
  269. package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +3 -3
  270. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +1 -1
  271. package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +3 -3
  272. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +3 -3
  273. package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +27 -1
  274. package/project/.sdk/src/cmp/seneca-provider/Extras_seneca-provider.ts +3915 -0
  275. package/project/.sdk/src/cmp/seneca-provider/Main_seneca-provider.ts +960 -0
  276. package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +2 -1
  277. package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +3 -3
  278. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +1 -1
  279. package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +3 -3
  280. package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +34 -1
  281. package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +9 -1
  282. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +18 -1
  283. package/project/.sdk/src/cmp/ts/Gitignore_ts.ts +5 -2
  284. package/project/.sdk/src/cmp/ts/Main_ts.ts +4 -1
  285. package/project/.sdk/src/cmp/ts/Package_ts.ts +10 -1
  286. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -2
  287. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +2 -1
  288. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +21 -6
  289. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +52 -2
  290. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +14 -3
  291. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +34 -2
  292. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +64 -43
  293. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +8 -8
  294. package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +2 -2
  295. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +2 -2
  296. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +25 -1
  297. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +10 -2
  298. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +1 -1
  299. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +10 -2
  300. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +27 -3
  301. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +10 -2
  302. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +15 -0
  303. package/project/.sdk/src/cmp/zig/Entity_zig.ts +5 -1
  304. package/project/.sdk/src/cmp/zig/Package_zig.ts +3 -1
  305. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +39 -0
  306. package/project/.sdk/src/cmp/zig/fragment/EntityCreateOp.fragment.zig +2 -2
  307. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +21 -2
  308. package/project/.sdk/src/cmp/zig/fragment/EntityLoadOp.fragment.zig +2 -2
  309. package/project/.sdk/src/cmp/zig/fragment/EntityRemoveOp.fragment.zig +5 -2
  310. package/project/.sdk/src/cmp/zig/fragment/EntityUpdateOp.fragment.zig +2 -2
  311. package/project/.sdk/tm/c/VERSION +1 -1
  312. package/project/.sdk/tm/c/core/helpers.c +1 -0
  313. package/project/.sdk/tm/c/core/sdk.h +22 -6
  314. package/project/.sdk/tm/c/tests/feature_harness.h +1 -0
  315. package/project/.sdk/tm/c/tests/primary_utility_test.c +4 -1
  316. package/project/.sdk/tm/c/utility/make_url.c +1 -0
  317. package/project/.sdk/tm/c/utility/param.c +1 -0
  318. package/project/.sdk/tm/clojure/VERSION +1 -1
  319. package/project/.sdk/tm/cpp/VERSION +1 -1
  320. package/project/.sdk/tm/cpp/core/types.hpp +33 -8
  321. package/project/.sdk/tm/cpp/test/pipeline_test.cpp +5 -0
  322. package/project/.sdk/tm/cpp/test/runner_support.hpp +4 -4
  323. package/project/.sdk/tm/csharp/VERSION +1 -1
  324. package/project/.sdk/tm/csharp/core/Types.cs +6 -0
  325. package/project/.sdk/tm/csharp/test/FeatureHarness.cs +396 -0
  326. package/project/.sdk/tm/csharp/test/FeatureTest.cs +7 -385
  327. package/project/.sdk/tm/csharp/test/Runner.cs +4 -4
  328. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +4 -0
  329. package/project/.sdk/tm/dart/test/utility.dart +4 -4
  330. package/project/.sdk/tm/elixir/VERSION +1 -1
  331. package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +26 -0
  332. package/project/.sdk/tm/go/VERSION +1 -1
  333. package/project/.sdk/tm/go/core/types.go +6 -0
  334. package/project/.sdk/tm/go/test/feature_harness_test.go +361 -0
  335. package/project/.sdk/tm/go/test/feature_test.go +7 -350
  336. package/project/.sdk/tm/go/test/pipeline_test.go +6 -0
  337. package/project/.sdk/tm/go/test/runner_test.go +16 -4
  338. package/project/.sdk/tm/haskell/VERSION +1 -1
  339. package/project/.sdk/tm/haskell/src/SdkFeatures.hs +28 -5
  340. package/project/.sdk/tm/haskell/src/SdkTypes.hs +14 -5
  341. package/project/.sdk/tm/java/VERSION +1 -1
  342. package/project/.sdk/tm/java/test/RunnerSupport.java +4 -4
  343. package/project/.sdk/tm/java/utility/MakeError.java +4 -0
  344. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +4 -0
  345. package/project/.sdk/tm/js/test/utility.js +3 -3
  346. package/project/.sdk/tm/kotlin/VERSION +1 -1
  347. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +3 -3
  348. package/project/.sdk/tm/lean/VERSION +1 -1
  349. package/project/.sdk/tm/lean/test/TFeature.lean +27 -14
  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/seneca-provider/CODE_OF_CONDUCT.md +132 -0
  370. package/project/.sdk/tm/seneca-provider/LICENSE +21 -0
  371. package/project/.sdk/tm/seneca-provider/Makefile +15 -0
  372. package/project/.sdk/tm/seneca-provider/src/tsconfig.json +18 -0
  373. package/project/.sdk/tm/seneca-provider/test/tsconfig.json +16 -0
  374. package/project/.sdk/tm/seneca-provider/tsfmt.json +3 -0
  375. package/project/.sdk/tm/swift/VERSION +1 -1
  376. package/project/.sdk/tm/ts/src/tsconfig.json +1 -0
  377. package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +4 -0
  378. package/project/.sdk/tm/ts/test/tsconfig.json +1 -0
  379. package/project/.sdk/tm/ts/test/utility.ts +3 -3
  380. package/project/.sdk/tm/zig/VERSION +1 -1
  381. package/src/action/doctor.ts +475 -0
  382. package/src/action/feature.ts +54 -16
  383. package/src/action/target.ts +174 -25
  384. package/src/cmp/Entity.ts +7 -0
  385. package/src/cmp/ExternalTarget.ts +125 -0
  386. package/src/cmp/Feature.ts +3 -1
  387. package/src/cmp/Main.ts +7 -1
  388. package/src/cmp/ReadmeExplanation.ts +2 -2
  389. package/src/cmp/ReadmeTop.ts +22 -9
  390. package/src/cmp/Registered.ts +100 -0
  391. package/src/cmp/Test.ts +4 -1
  392. package/src/helpers/dryrun.ts +57 -0
  393. package/src/helpers/featureSource.ts +208 -0
  394. package/src/helpers/naming.ts +73 -2
  395. package/src/helpers/opExample.ts +19 -2
  396. package/src/helpers/opShape.ts +65 -0
  397. package/src/helpers/packageMeta.ts +211 -10
  398. package/src/helpers/stdrep.ts +56 -0
  399. package/src/helpers/testPolicy.ts +52 -0
  400. package/src/sdkgen.ts +350 -5
  401. package/src/types.ts +24 -1
  402. package/src/utility.ts +10 -1
  403. package/project/.sdk/tm/rust/feature/mod.rs +0 -24
@@ -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
  }
@@ -24,6 +24,7 @@ class ProjectNameEntityBase {
24
24
  this._entopts = entopts
25
25
  this._utility = client.utility()
26
26
  this._data = {}
27
+ this._deleted = false
27
28
  this._match = {}
28
29
 
29
30
  const makeContext = this._utility.makeContext
@@ -37,6 +38,21 @@ class ProjectNameEntityBase {
37
38
  featureHook(this._entctx, 'PostConstructEntity')
38
39
  }
39
40
 
41
+
42
+ // True once a successful `remove` resolves on this instance. `remove`
43
+ // resolves to the entity like every other operation, and the instance KEEPS
44
+ // the data it held — a caller can still read what was deleted — but it is
45
+ // no longer a live record. See AGENTS.md.
46
+ markDeleted() {
47
+ this._deleted = true
48
+ }
49
+
50
+
51
+ deleted() {
52
+ return true === this._deleted
53
+ }
54
+
55
+
40
56
  entopts() {
41
57
  return this._utility.struct.merge([{}, this._entopts])
42
58
  }
@@ -161,7 +177,12 @@ class ProjectNameEntityBase {
161
177
 
162
178
  toJSON() {
163
179
  const struct = this._utility.struct
164
- return struct.merge([{}, struct.getdef(this._data, {}), { entity$: this.Name }])
180
+ // The marker is NAMESPACED. It used to be `entity$` a short, generic
181
+ // name, and the `$`-suffix convention is not unique to sdkgen. Seneca uses
182
+ // `entity$` on its own entities to hold the canon, so an SDK record fed
183
+ // into `entize` silently overwrote it and produced entities claiming a
184
+ // canon that does not exist: no error, just wrong entities.
185
+ return struct.merge([{}, struct.getdef(this._data, {}), { 'voxgig$entity': this.Name }])
165
186
  }
166
187
 
167
188
 
@@ -83,7 +83,15 @@ class EntityOperation {
83
83
  }
84
84
  }
85
85
 
86
- return done(ctx)
86
+ const out = done(ctx)
87
+
88
+ // An operation resolves to the ENTITY, not the raw data — the record
89
+ // has just been absorbed into this instance and is reached through
90
+ // data(). `done` still runs: it completes the pipeline and raises on
91
+ // failure, and when throwing is disabled it hands back the error
92
+ // payload, which passes through unchanged. See AGENTS.md "Entity
93
+ // operations return ENTITIES".
94
+ return (ctx.result && ctx.result.ok) ? this : out
87
95
  }
88
96
  catch (err) {
89
97
  // #PreUnexpected-Hook
@@ -88,7 +88,15 @@ class EntityOperation {
88
88
  }
89
89
  }
90
90
 
91
- return done(ctx)
91
+ const out = done(ctx)
92
+
93
+ // An operation resolves to the ENTITY, not the raw data — the record
94
+ // has just been absorbed into this instance and is reached through
95
+ // data(). `done` still runs: it completes the pipeline and raises on
96
+ // failure, and when throwing is disabled it hands back the error
97
+ // payload, which passes through unchanged. See AGENTS.md "Entity
98
+ // operations return ENTITIES".
99
+ return (ctx.result && ctx.result.ok) ? this : out
92
100
  }
93
101
  catch (err) {
94
102
  // #PreUnexpected-Hook
@@ -89,7 +89,21 @@ class EntityOperation {
89
89
  }
90
90
  }
91
91
 
92
- return done(ctx)
92
+ const out = done(ctx)
93
+
94
+ // An operation resolves to the ENTITY, not the raw data — the record
95
+ // has just been absorbed into this instance and is reached through
96
+ // data(). `done` still runs: it completes the pipeline and raises on
97
+ // failure, and when throwing is disabled it hands back the error
98
+ // payload, which passes through unchanged. See AGENTS.md "Entity
99
+ // operations return ENTITIES".
100
+ if (ctx.result && ctx.result.ok) {
101
+ // A removed entity keeps its data but is no longer a live record.
102
+ this.markDeleted()
103
+ return this
104
+ }
105
+
106
+ return out
93
107
  }
94
108
  catch (err) {
95
109
  // #PreUnexpected-Hook
@@ -89,7 +89,15 @@ class EntityOperation {
89
89
  }
90
90
  }
91
91
 
92
- return done(ctx)
92
+ const out = done(ctx)
93
+
94
+ // An operation resolves to the ENTITY, not the raw data — the record
95
+ // has just been absorbed into this instance and is reached through
96
+ // data(). `done` still runs: it completes the pipeline and raises on
97
+ // failure, and when throwing is disabled it hands back the error
98
+ // payload, which passes through unchanged. See AGENTS.md "Entity
99
+ // operations return ENTITIES".
100
+ return (ctx.result && ctx.result.ok) ? this : out
93
101
  }
94
102
  catch (err) {
95
103
  // #PreUnexpected-Hook
@@ -10,8 +10,21 @@ class ProjectNameError extends Error {
10
10
  super(msg)
11
11
  this.code = code
12
12
  this.ctx = ctx
13
+
14
+ // HTTP status of the response that caused this error, or -1 when the
15
+ // request never got one (transport failure, client-side abort).
16
+ //
17
+ // PROMOTED to the top level on purpose. It used to be reachable only at
18
+ // `err.result.status`, so every consumer wrote the same
19
+ // `404 === e?.result?.status` branch and coupled itself to the internal
20
+ // shape of `result`.
21
+ this.status = -1
13
22
  }
14
23
 
24
+
25
+ // `err.notFound` rather than a magic number at every call site.
26
+ get notFound() { return 404 === this.status }
27
+
15
28
  }
16
29
 
17
30
  module.exports = {
@@ -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
 
@@ -53,7 +54,7 @@ const Package = cmp(async function Package(props: any) {
53
54
  }
54
55
 
55
56
  group = "${group}"
56
- version = "0.0.1"
57
+ version = "${packageVersion(model, target.name)}"
57
58
 
58
59
  repositories {
59
60
  mavenCentral()
@@ -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
  val ${eVar} = client.${accessor}(null).${primaryOp}(${testArg}, null)
56
57
  // ${eVar} holds the mock response record
57
58
  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 { gradleGroup } from './utility_kotlin'
5
5
 
@@ -16,7 +16,7 @@ const ReadmeInstall = cmp(function ReadmeInstall(props: any) {
16
16
 
17
17
  \`\`\`kotlin
18
18
  dependencies {
19
- implementation("${group}:${artifactId}:0.0.1")
19
+ implementation("${group}:${artifactId}:${packageVersion(model, target.name)}")
20
20
  }
21
21
  \`\`\`
22
22
 
@@ -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 \`Any?\` and raise on error. Wrap
98
98
  calls in \`try\`/\`catch\` to handle failures.
99
99
 
@@ -123,7 +123,7 @@ catch (err: RuntimeException) {
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 \`Any?\`) and raises on error.
126
+ \`load()\` returns the ENTITY call data() for the record — and raises on error.
127
127
 
128
128
  \`\`\`kotlin
129
129
  try {
@@ -151,7 +151,7 @@ catch (err: RuntimeException) {
151
151
 
152
152
  Content(`### 3. Load ${article} ${eName.toLowerCase()}
153
153
 
154
- \`load()\` returns the bare record (as \`Any?\`) and raises on error.
154
+ \`load()\` returns the ENTITY call data() for the record — and raises on error.
155
155
 
156
156
  \`\`\`kotlin
157
157
  try {
@@ -191,7 +191,7 @@ catch (err: RuntimeException) {
191
191
  \`\`\`kotlin
192
192
  `)
193
193
  if (opnames.includes('create')) {
194
- Content(`// Create — returns the bare created record (as Any?)
194
+ Content(`// Create — returns the ENTITY (call data() for the record)
195
195
  val created = client.${accessor}(null).create(mutableMapOf<String, Any?>(${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
 
@@ -67,7 +67,7 @@ const TestDirect = cmp(function TestDirect(props: any) {
67
67
  const entity: ModelEntity = props.entity
68
68
  const kotlinpackage: string = props.kotlinpackage
69
69
 
70
- const PROJECTNAME = nom(model, 'Name').toUpperCase().replace(/[^A-Z_]/g, '_')
70
+ const PROJECTNAME = envName(model)
71
71
  const SDK = model.const.Name + 'SDK'
72
72
 
73
73
  const authActive = isAuthActive(model)
@@ -121,7 +121,7 @@ const TestDirect = cmp(function TestDirect(props: any) {
121
121
  ? loadParams.map((p: any) => ` params["${p.name}"] = ${kotlinLiteral(p.example)}`).join('\n')
122
122
  : ''
123
123
 
124
- const entidEnvVar = `${PROJECTNAME}_TEST_${nom(entity, 'NAME').replace(/[^A-Z_]/g, '_')}_ENTID`
124
+ const entidEnvVar = `${PROJECTNAME}_TEST_${envToken(entity.name)}_ENTID`
125
125
 
126
126
  File({ name: entity.Name + 'DirectTest.' + target.ext }, () => {
127
127