@voxgig/sdkgen 2.0.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/bin/voxgig-sdkgen +22 -2
  2. package/dist/action/doctor.d.ts +14 -0
  3. package/dist/action/doctor.js +296 -0
  4. package/dist/action/doctor.js.map +1 -0
  5. package/dist/action/feature.js +48 -9
  6. package/dist/action/feature.js.map +1 -1
  7. package/dist/action/target.d.ts +6 -1
  8. package/dist/action/target.js +134 -22
  9. package/dist/action/target.js.map +1 -1
  10. package/dist/cmp/Entity.js +5 -0
  11. package/dist/cmp/Entity.js.map +1 -1
  12. package/dist/cmp/Feature.js +2 -1
  13. package/dist/cmp/Feature.js.map +1 -1
  14. package/dist/cmp/Main.js +5 -1
  15. package/dist/cmp/Main.js.map +1 -1
  16. package/dist/cmp/ReadmeExplanation.js +1 -1
  17. package/dist/cmp/ReadmeExplanation.js.map +1 -1
  18. package/dist/cmp/ReadmeTop.js +16 -6
  19. package/dist/cmp/ReadmeTop.js.map +1 -1
  20. package/dist/cmp/Registered.d.ts +7 -0
  21. package/dist/cmp/Registered.js +70 -0
  22. package/dist/cmp/Registered.js.map +1 -0
  23. package/dist/cmp/Test.js +3 -1
  24. package/dist/cmp/Test.js.map +1 -1
  25. package/dist/helpers/dryrun.d.ts +10 -0
  26. package/dist/helpers/dryrun.js +35 -0
  27. package/dist/helpers/dryrun.js.map +1 -0
  28. package/dist/helpers/featureSource.d.ts +13 -0
  29. package/dist/helpers/featureSource.js +156 -0
  30. package/dist/helpers/featureSource.js.map +1 -0
  31. package/dist/helpers/naming.d.ts +9 -1
  32. package/dist/helpers/naming.js +66 -2
  33. package/dist/helpers/naming.js.map +1 -1
  34. package/dist/helpers/opExample.js +23 -3
  35. package/dist/helpers/opExample.js.map +1 -1
  36. package/dist/helpers/opShape.d.ts +11 -1
  37. package/dist/helpers/opShape.js +51 -0
  38. package/dist/helpers/opShape.js.map +1 -1
  39. package/dist/helpers/packageMeta.d.ts +8 -1
  40. package/dist/helpers/packageMeta.js +141 -10
  41. package/dist/helpers/packageMeta.js.map +1 -1
  42. package/dist/helpers/stdrep.d.ts +3 -0
  43. package/dist/helpers/stdrep.js +47 -0
  44. package/dist/helpers/stdrep.js.map +1 -0
  45. package/dist/helpers/testPolicy.d.ts +2 -0
  46. package/dist/helpers/testPolicy.js +46 -0
  47. package/dist/helpers/testPolicy.js.map +1 -0
  48. package/dist/sdkgen.d.ts +15 -6
  49. package/dist/sdkgen.js +45 -4
  50. package/dist/sdkgen.js.map +1 -1
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/model/sdkgen.aontu +125 -0
  53. package/package.json +5 -3
  54. package/project/.sdk/model/target/c.aontu +28 -3
  55. package/project/.sdk/model/target/clojure.aontu +24 -3
  56. package/project/.sdk/model/target/cpp.aontu +25 -3
  57. package/project/.sdk/model/target/csharp.aontu +25 -3
  58. package/project/.sdk/model/target/dart.aontu +15 -3
  59. package/project/.sdk/model/target/elixir.aontu +15 -3
  60. package/project/.sdk/model/target/go-cli.aontu +17 -1
  61. package/project/.sdk/model/target/go-mcp.aontu +17 -1
  62. package/project/.sdk/model/target/go.aontu +14 -4
  63. package/project/.sdk/model/target/haskell.aontu +24 -3
  64. package/project/.sdk/model/target/java.aontu +26 -3
  65. package/project/.sdk/model/target/js.aontu +15 -3
  66. package/project/.sdk/model/target/kotlin.aontu +26 -3
  67. package/project/.sdk/model/target/lean.aontu +25 -3
  68. package/project/.sdk/model/target/lua.aontu +15 -3
  69. package/project/.sdk/model/target/ocaml.aontu +24 -3
  70. package/project/.sdk/model/target/perl.aontu +15 -3
  71. package/project/.sdk/model/target/php.aontu +15 -3
  72. package/project/.sdk/model/target/py-data.aontu +16 -3
  73. package/project/.sdk/model/target/py.aontu +15 -3
  74. package/project/.sdk/model/target/rb.aontu +15 -3
  75. package/project/.sdk/model/target/rust.aontu +25 -3
  76. package/project/.sdk/model/target/scala.aontu +25 -3
  77. package/project/.sdk/model/target/swift.aontu +25 -3
  78. package/project/.sdk/model/target/ts.aontu +15 -3
  79. package/project/.sdk/model/target/zig.aontu +26 -3
  80. package/project/.sdk/src/cmp/c/Config_c.ts +10 -11
  81. package/project/.sdk/src/cmp/c/Entity_c.ts +5 -1
  82. package/project/.sdk/src/cmp/c/fragment/Entity.fragment.c +23 -5
  83. package/project/.sdk/src/cmp/c/fragment/EntityCreateOp.fragment.c +9 -2
  84. package/project/.sdk/src/cmp/c/fragment/EntityListOp.fragment.c +19 -2
  85. package/project/.sdk/src/cmp/c/fragment/EntityLoadOp.fragment.c +9 -2
  86. package/project/.sdk/src/cmp/c/fragment/EntityRemoveOp.fragment.c +12 -2
  87. package/project/.sdk/src/cmp/c/fragment/EntityUpdateOp.fragment.c +9 -2
  88. package/project/.sdk/src/cmp/c/fragment/Main.fragment.c +1 -0
  89. package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +6 -3
  90. package/project/.sdk/src/cmp/clojure/fragment/Entity.fragment.clj +18 -1
  91. package/project/.sdk/src/cmp/clojure/fragment/EntityCreateOp.fragment.clj +2 -2
  92. package/project/.sdk/src/cmp/clojure/fragment/EntityLoadOp.fragment.clj +2 -2
  93. package/project/.sdk/src/cmp/clojure/fragment/EntityRemoveOp.fragment.clj +12 -8
  94. package/project/.sdk/src/cmp/clojure/fragment/EntityUpdateOp.fragment.clj +2 -2
  95. package/project/.sdk/src/cmp/cpp/Entity_cpp.ts +5 -1
  96. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +12 -9
  97. package/project/.sdk/src/cmp/cpp/fragment/EntityCreateOp.fragment.cpp +8 -2
  98. package/project/.sdk/src/cmp/cpp/fragment/EntityListOp.fragment.cpp +18 -2
  99. package/project/.sdk/src/cmp/cpp/fragment/EntityLoadOp.fragment.cpp +8 -2
  100. package/project/.sdk/src/cmp/cpp/fragment/EntityRemoveOp.fragment.cpp +11 -2
  101. package/project/.sdk/src/cmp/cpp/fragment/EntityUpdateOp.fragment.cpp +8 -2
  102. package/project/.sdk/src/cmp/csharp/Package_csharp.ts +2 -1
  103. package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +3 -3
  104. package/project/.sdk/src/cmp/csharp/TestEntity_csharp.ts +6 -6
  105. package/project/.sdk/src/cmp/csharp/fragment/EntityBase.fragment.cs +38 -1
  106. package/project/.sdk/src/cmp/csharp/fragment/Main.fragment.cs +42 -33
  107. package/project/.sdk/src/cmp/dart/Package_dart.ts +2 -1
  108. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +13 -2
  109. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +2 -1
  110. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +3 -3
  111. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +1 -1
  112. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +17 -6
  113. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +13 -2
  114. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +13 -2
  115. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +3 -3
  116. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +8 -8
  117. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +18 -1
  118. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +9 -1
  119. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +9 -1
  120. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +15 -1
  121. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +9 -1
  122. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +8 -0
  123. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
  124. package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +2 -2
  125. package/project/.sdk/src/cmp/elixir/TestEntity_elixir.ts +11 -2
  126. package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +2 -1
  127. package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +1 -0
  128. package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +2 -1
  129. package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -1
  130. package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +2 -1
  131. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +38 -8
  132. package/project/.sdk/src/cmp/go/Entity_go.ts +2 -2
  133. package/project/.sdk/src/cmp/go/Main_go.ts +4 -5
  134. package/project/.sdk/src/cmp/go/Package_go.ts +8 -5
  135. package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +2 -2
  136. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +2 -2
  137. package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +4 -2
  138. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +2 -2
  139. package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +2 -2
  140. package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +2 -2
  141. package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +2 -2
  142. package/project/.sdk/src/cmp/go/TestDirect_go.ts +21 -15
  143. package/project/.sdk/src/cmp/go/TestEntity_go.ts +9 -9
  144. package/project/.sdk/src/cmp/go/Test_go.ts +2 -2
  145. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +42 -1
  146. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +4 -4
  147. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +4 -4
  148. package/project/.sdk/src/cmp/haskell/Package_haskell.ts +2 -1
  149. package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +10 -5
  150. package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +10 -8
  151. package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +14 -10
  152. package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +21 -18
  153. package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +4 -4
  154. package/project/.sdk/src/cmp/haskell/Test_haskell.ts +23 -11
  155. package/project/.sdk/src/cmp/java/Package_java.ts +2 -1
  156. package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +2 -1
  157. package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +2 -2
  158. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +1 -1
  159. package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +3 -3
  160. package/project/.sdk/src/cmp/java/TestDirect_java.ts +3 -3
  161. package/project/.sdk/src/cmp/java/TestEntity_java.ts +6 -6
  162. package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +34 -1
  163. package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +12 -0
  164. package/project/.sdk/src/cmp/js/Main_js.ts +4 -1
  165. package/project/.sdk/src/cmp/js/Package_js.ts +7 -1
  166. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -2
  167. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +2 -1
  168. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +13 -2
  169. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +13 -2
  170. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +2 -1
  171. package/project/.sdk/src/cmp/js/TestDirect_js.ts +3 -3
  172. package/project/.sdk/src/cmp/js/TestEntity_js.ts +8 -8
  173. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +22 -1
  174. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +9 -1
  175. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +9 -1
  176. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +15 -1
  177. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +9 -1
  178. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +13 -0
  179. package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +2 -1
  180. package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +2 -1
  181. package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +2 -2
  182. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +1 -1
  183. package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +3 -3
  184. package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +3 -3
  185. package/project/.sdk/src/cmp/kotlin/TestEntity_kotlin.ts +6 -6
  186. package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +32 -1
  187. package/project/.sdk/src/cmp/lean/Package_lean.ts +3 -1
  188. package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +9 -4
  189. package/project/.sdk/src/cmp/lua/Package_lua.ts +4 -3
  190. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +11 -3
  191. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +1 -1
  192. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +3 -3
  193. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +9 -9
  194. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +37 -1
  195. package/project/.sdk/src/cmp/lua/fragment/SdkError.fragment.lua +12 -0
  196. package/project/.sdk/src/cmp/ocaml/EntityOperation_ocaml.ts +30 -3
  197. package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +11 -5
  198. package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +3 -1
  199. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +10 -5
  200. package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +6 -2
  201. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +10 -8
  202. package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +14 -13
  203. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +20 -18
  204. package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +4 -4
  205. package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +8 -2
  206. package/project/.sdk/src/cmp/ocaml/TestEntity_ocaml.ts +8 -5
  207. package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +2 -1
  208. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +1 -1
  209. package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +3 -3
  210. package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +1 -1
  211. package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +3 -3
  212. package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +6 -6
  213. package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +36 -1
  214. package/project/.sdk/src/cmp/php/MainEntity_php.ts +21 -16
  215. package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
  216. package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +6 -6
  217. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +4 -3
  218. package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +2 -2
  219. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +1 -1
  220. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +12 -12
  221. package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +6 -6
  222. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +4 -4
  223. package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +2 -2
  224. package/project/.sdk/src/cmp/php/TestDirect_php.ts +3 -3
  225. package/project/.sdk/src/cmp/php/TestEntity_php.ts +17 -15
  226. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +20 -1
  227. package/project/.sdk/src/cmp/php/fragment/SdkError.fragment.php +11 -0
  228. package/project/.sdk/src/cmp/py/Package_py.ts +4 -3
  229. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +13 -2
  230. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +2 -1
  231. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +1 -1
  232. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +17 -6
  233. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +14 -3
  234. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +13 -2
  235. package/project/.sdk/src/cmp/py/TestDirect_py.ts +3 -3
  236. package/project/.sdk/src/cmp/py/TestEntity_py.ts +9 -9
  237. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +29 -1
  238. package/project/.sdk/src/cmp/py/fragment/SdkError.fragment.py +11 -0
  239. package/project/.sdk/src/cmp/py-data/Main_py-data.ts +2 -1
  240. package/project/.sdk/src/cmp/rb/Package_rb.ts +4 -3
  241. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +1 -1
  242. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +2 -1
  243. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +5 -5
  244. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +1 -1
  245. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +3 -3
  246. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +9 -9
  247. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +31 -1
  248. package/project/.sdk/src/cmp/rb/fragment/SdkError.fragment.rb +10 -1
  249. package/project/.sdk/src/cmp/rust/Entity_rust.ts +5 -1
  250. package/project/.sdk/src/cmp/rust/Main_rust.ts +21 -0
  251. package/project/.sdk/src/cmp/rust/Package_rust.ts +2 -1
  252. package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +3 -3
  253. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +12 -12
  254. package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +18 -0
  255. package/project/.sdk/src/cmp/rust/fragment/EntityCreateOp.fragment.rs +8 -2
  256. package/project/.sdk/src/cmp/rust/fragment/EntityListOp.fragment.rs +20 -3
  257. package/project/.sdk/src/cmp/rust/fragment/EntityLoadOp.fragment.rs +8 -2
  258. package/project/.sdk/src/cmp/rust/fragment/EntityRemoveOp.fragment.rs +10 -2
  259. package/project/.sdk/src/cmp/rust/fragment/EntityUpdateOp.fragment.rs +8 -2
  260. package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +10 -0
  261. package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +2 -1
  262. package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +3 -3
  263. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +1 -1
  264. package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +3 -3
  265. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +3 -3
  266. package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +27 -1
  267. package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +2 -1
  268. package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +3 -3
  269. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +1 -1
  270. package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +3 -3
  271. package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +34 -1
  272. package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +9 -1
  273. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +18 -1
  274. package/project/.sdk/src/cmp/ts/Gitignore_ts.ts +5 -2
  275. package/project/.sdk/src/cmp/ts/Main_ts.ts +4 -1
  276. package/project/.sdk/src/cmp/ts/Package_ts.ts +10 -1
  277. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -2
  278. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +2 -1
  279. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +21 -6
  280. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +52 -2
  281. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +14 -3
  282. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +34 -2
  283. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +64 -43
  284. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +8 -8
  285. package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +2 -2
  286. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +2 -2
  287. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +25 -1
  288. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +10 -2
  289. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +1 -1
  290. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +10 -2
  291. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +27 -3
  292. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +10 -2
  293. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +15 -0
  294. package/project/.sdk/src/cmp/zig/Entity_zig.ts +5 -1
  295. package/project/.sdk/src/cmp/zig/Package_zig.ts +3 -1
  296. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +39 -0
  297. package/project/.sdk/src/cmp/zig/fragment/EntityCreateOp.fragment.zig +2 -2
  298. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +21 -2
  299. package/project/.sdk/src/cmp/zig/fragment/EntityLoadOp.fragment.zig +2 -2
  300. package/project/.sdk/src/cmp/zig/fragment/EntityRemoveOp.fragment.zig +5 -2
  301. package/project/.sdk/src/cmp/zig/fragment/EntityUpdateOp.fragment.zig +2 -2
  302. package/project/.sdk/tm/c/VERSION +1 -1
  303. package/project/.sdk/tm/c/core/helpers.c +1 -0
  304. package/project/.sdk/tm/c/core/sdk.h +22 -6
  305. package/project/.sdk/tm/c/tests/feature_harness.h +1 -0
  306. package/project/.sdk/tm/c/tests/primary_utility_test.c +4 -1
  307. package/project/.sdk/tm/c/utility/make_url.c +1 -0
  308. package/project/.sdk/tm/c/utility/param.c +1 -0
  309. package/project/.sdk/tm/clojure/VERSION +1 -1
  310. package/project/.sdk/tm/cpp/VERSION +1 -1
  311. package/project/.sdk/tm/cpp/core/types.hpp +33 -8
  312. package/project/.sdk/tm/cpp/test/pipeline_test.cpp +5 -0
  313. package/project/.sdk/tm/cpp/test/runner_support.hpp +4 -4
  314. package/project/.sdk/tm/csharp/VERSION +1 -1
  315. package/project/.sdk/tm/csharp/core/Types.cs +6 -0
  316. package/project/.sdk/tm/csharp/test/FeatureHarness.cs +396 -0
  317. package/project/.sdk/tm/csharp/test/FeatureTest.cs +7 -385
  318. package/project/.sdk/tm/csharp/test/Runner.cs +4 -4
  319. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +4 -0
  320. package/project/.sdk/tm/dart/test/utility.dart +4 -4
  321. package/project/.sdk/tm/elixir/VERSION +1 -1
  322. package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +26 -0
  323. package/project/.sdk/tm/go/VERSION +1 -1
  324. package/project/.sdk/tm/go/core/types.go +6 -0
  325. package/project/.sdk/tm/go/test/feature_harness_test.go +361 -0
  326. package/project/.sdk/tm/go/test/feature_test.go +7 -350
  327. package/project/.sdk/tm/go/test/pipeline_test.go +6 -0
  328. package/project/.sdk/tm/go/test/runner_test.go +16 -4
  329. package/project/.sdk/tm/haskell/VERSION +1 -1
  330. package/project/.sdk/tm/haskell/src/SdkFeatures.hs +28 -5
  331. package/project/.sdk/tm/haskell/src/SdkTypes.hs +14 -5
  332. package/project/.sdk/tm/java/VERSION +1 -1
  333. package/project/.sdk/tm/java/test/RunnerSupport.java +4 -4
  334. package/project/.sdk/tm/java/utility/MakeError.java +4 -0
  335. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +4 -0
  336. package/project/.sdk/tm/js/test/utility.js +3 -3
  337. package/project/.sdk/tm/kotlin/VERSION +1 -1
  338. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +3 -3
  339. package/project/.sdk/tm/lean/VERSION +1 -1
  340. package/project/.sdk/tm/lean/test/TFeature.lean +27 -14
  341. package/project/.sdk/tm/lua/test/runner.lua +4 -4
  342. package/project/.sdk/tm/lua/utility/make_error.lua +4 -0
  343. package/project/.sdk/tm/ocaml/VERSION +1 -1
  344. package/project/.sdk/tm/ocaml/sdk_types.ml +14 -5
  345. package/project/.sdk/tm/ocaml/test/t_pipeline.ml +5 -2
  346. package/project/.sdk/tm/perl/t/runner.pm +4 -4
  347. package/project/.sdk/tm/php/VERSION +1 -1
  348. package/project/.sdk/tm/php/test/Runner.php +4 -4
  349. package/project/.sdk/tm/php/utility/MakeError.php +5 -0
  350. package/project/.sdk/tm/py/pkg/utility/make_error.py +4 -0
  351. package/project/.sdk/tm/py/test/runner.py +19 -4
  352. package/project/.sdk/tm/rb/test/runner.rb +4 -4
  353. package/project/.sdk/tm/rb/utility/make_error.rb +4 -0
  354. package/project/.sdk/tm/rust/VERSION +1 -1
  355. package/project/.sdk/tm/rust/core/types.rs +22 -6
  356. package/project/.sdk/tm/rust/tests/common/mod.rs +6 -6
  357. package/project/.sdk/tm/rust/tests/pipeline_test.rs +6 -0
  358. package/project/.sdk/tm/rust/utility/make_error.rs +4 -0
  359. package/project/.sdk/tm/scala/VERSION +1 -1
  360. package/project/.sdk/tm/swift/VERSION +1 -1
  361. package/project/.sdk/tm/ts/src/tsconfig.json +1 -0
  362. package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +4 -0
  363. package/project/.sdk/tm/ts/test/tsconfig.json +1 -0
  364. package/project/.sdk/tm/ts/test/utility.ts +3 -3
  365. package/project/.sdk/tm/zig/VERSION +1 -1
  366. package/src/action/doctor.ts +410 -0
  367. package/src/action/feature.ts +54 -16
  368. package/src/action/target.ts +174 -25
  369. package/src/cmp/Entity.ts +7 -0
  370. package/src/cmp/Feature.ts +3 -1
  371. package/src/cmp/Main.ts +7 -1
  372. package/src/cmp/ReadmeExplanation.ts +2 -2
  373. package/src/cmp/ReadmeTop.ts +22 -9
  374. package/src/cmp/Registered.ts +100 -0
  375. package/src/cmp/Test.ts +4 -1
  376. package/src/helpers/dryrun.ts +57 -0
  377. package/src/helpers/featureSource.ts +208 -0
  378. package/src/helpers/naming.ts +73 -2
  379. package/src/helpers/opExample.ts +19 -2
  380. package/src/helpers/opShape.ts +65 -0
  381. package/src/helpers/packageMeta.ts +163 -10
  382. package/src/helpers/stdrep.ts +56 -0
  383. package/src/helpers/testPolicy.ts +52 -0
  384. package/src/sdkgen.ts +70 -4
  385. package/project/.sdk/tm/rust/feature/mod.rs +0 -24
@@ -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 { dartPackageName } from './Package_dart'
5
5
 
@@ -19,7 +19,7 @@ Or add it to your \`pubspec.yaml\`:
19
19
 
20
20
  \`\`\`yaml
21
21
  dependencies:
22
- ${pkg}: ^0.0.1
22
+ ${pkg}: ^${packageVersion(model, target.name)}
23
23
  \`\`\`
24
24
 
25
25
  `)
@@ -39,7 +39,7 @@ dependencies:
39
39
  git:
40
40
  url: ${repoUrl}
41
41
  path: ${target.name}
42
- ref: ${target.name}/v0.0.1
42
+ ref: ${target.name}/v${packageVersion(model, target.name)}
43
43
  \`\`\`
44
44
 
45
45
  Or depend on a local source checkout:
@@ -94,7 +94,7 @@ ${opRows}
94
94
 
95
95
  ### Result shape
96
96
 
97
- Entity operations return the bare result data (a \`Map\` for single-entity
97
+ Entity operations return the ENTITY (call data() for the record) (a \`Map\` for single-entity
98
98
  ops, a \`List\` of entity instances for \`list\`) and throw on error. Wrap calls
99
99
  in \`try\`/\`catch\` to handle failures.
100
100
 
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, each, Content, isAuthActive, envName, canonKey, opRequestShape, entityIdField, entityDataIdField, entityOps, safeVarName, exampleVarName } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, isAuthActive, envName, canonKey, opRequestShape, entityIdField, entityDataIdField, entityOps, safeVarName, exampleVarName, matchArg, idLiteral } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -10,6 +10,17 @@ import {
10
10
  import { dartPackageName } from './Package_dart'
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
 
@@ -74,7 +85,7 @@ it and read each record's data via \`.data()\`.
74
85
 
75
86
  \`\`\`dart
76
87
  try {
77
- final ${eVar}s = await client.${eName}().list();
88
+ final ${eVar}s = await client.${eName}().list(${listMatchArg(exampleEntity)});
78
89
  for (final item in ${eVar}s) {
79
90
  print(item.data());
80
91
  }
@@ -108,7 +119,7 @@ try {
108
119
  Content(`### 3. Load ${neArticle} ${neName.toLowerCase()}
109
120
 
110
121
  ${neName} is nested under ${parentName}, so provide the \`${parentParam}\`.
111
- \`load()\` returns the bare record (a \`Map\`) and throws on error.
122
+ \`load()\` returns the ENTITY call data() for the record — and throws on error.
112
123
 
113
124
  \`\`\`dart
114
125
  try {
@@ -135,7 +146,7 @@ try {
135
146
 
136
147
  Content(`### 3. Load ${article} ${eName.toLowerCase()}
137
148
 
138
- \`load()\` returns the bare record (a \`Map\`) and throws on error.
149
+ \`load()\` returns the ENTITY call data() for the record — and throws on error.
139
150
 
140
151
  \`\`\`dart
141
152
  try {
@@ -167,7 +178,7 @@ try {
167
178
  return it && it.type
168
179
  }
169
180
  const idValueFor = (opname: string): string => (null != dataIdF && opnames.includes('create'))
170
- ? `created['${dataIdF}']`
181
+ ? `created.data()['${dataIdF}']`
171
182
  : dartLit(idParamType(opname), 'example_id')
172
183
 
173
184
  if (opnames.includes('create') || opnames.includes('update') || opnames.includes('remove')) {
@@ -176,7 +187,7 @@ try {
176
187
  \`\`\`dart
177
188
  `)
178
189
  if (opnames.includes('create')) {
179
- Content(`// Create — returns the bare created record (a Map)
190
+ Content(`// Create — returns the ENTITY (call data() for the record)
180
191
  final created = await client.${eName}().create({${examplePairs('create').join(', ')}});
181
192
 
182
193
  `)
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, each, Content, canonToType, canonKey, File, isAuthActive, entityIdField, opRequestShape, safeVarName, exampleVarName } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, canonToType, canonKey, File, isAuthActive, entityIdField, opRequestShape, safeVarName, exampleVarName, matchArg, idLiteral } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -23,6 +23,17 @@ function dartLit(type: any, placeholder: string = 'example'): string {
23
23
  }
24
24
 
25
25
 
26
+ // A `list()` on a NESTED entity needs its parent path params. The
27
+ // quickstart used to emit `client.Moon().list()` for an entity at
28
+ // `/planet/{planet_id}/moon`, which 404s against a live server from a
29
+ // half-built URL — indistinguishable from "no such record". The model
30
+ // already marks those params `reqd: true`; matchArg renders exactly them.
31
+ function listMatchArg(ent: any): string {
32
+ const idF = entityIdField(ent)
33
+ return matchArg('ts', ent, 'list', idF, idLiteral(ent, 'list', idF))
34
+ }
35
+
36
+
26
37
  const OP_SIGNATURES: Record<string, { sig: string, returns: string, desc: string }> = {
27
38
  load: {
28
39
  sig: 'load(reqmatch, [ctrl]) -> Future<dynamic>',
@@ -268,7 +279,7 @@ final result = await client.${ent.Name}().${opname}(${arg});
268
279
  }
269
280
  else if ('list' === opname) {
270
281
  Content(`\`\`\`dart
271
- final results = await client.${ent.Name}().list();
282
+ final results = await client.${ent.Name}().list(${listMatchArg(ent)});
272
283
  for (final ${eVar} in results) {
273
284
  print(${eVar}.data());
274
285
  }
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, Content, isAuthActive, envName, canonKey, entityIdField, opRequestShape, safeVarName, exampleVarName } from '@voxgig/sdkgen'
2
+ import { cmp, Content, isAuthActive, envName, canonKey, entityIdField, opRequestShape, safeVarName, exampleVarName, matchArg, idLiteral } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -23,6 +23,17 @@ function dartLit(type: any, placeholder: string = 'example'): string {
23
23
  }
24
24
 
25
25
 
26
+ // A `list()` on a NESTED entity needs its parent path params. The
27
+ // quickstart used to emit `client.Moon().list()` for an entity at
28
+ // `/planet/{planet_id}/moon`, which 404s against a live server from a
29
+ // half-built URL — indistinguishable from "no such record". The model
30
+ // already marks those params `reqd: true`; matchArg renders exactly them.
31
+ function listMatchArg(ent: any): string {
32
+ const idF = entityIdField(ent)
33
+ return matchArg('ts', ent, 'list', idF, idLiteral(ent, 'list', idF))
34
+ }
35
+
36
+
26
37
  const ReadmeTopQuick = cmp(function ReadmeTopQuick(props: any) {
27
38
  const { target, ctx$: { model } } = props
28
39
 
@@ -55,7 +66,7 @@ Future<void> main() async {
55
66
 
56
67
  if (opnames.includes('list')) {
57
68
  Content(` // List all ${eName.toLowerCase()}s (returns a list of entities, throws on error)
58
- final ${eVar}s = await client.${eName}().list();
69
+ final ${eVar}s = await client.${eName}().list(${listMatchArg(exampleEntity)});
59
70
  for (final item in ${eVar}s) {
60
71
  print(item.data());
61
72
  }
@@ -16,7 +16,7 @@ import {
16
16
  Slot,
17
17
  cmp,
18
18
  snakify,
19
- isAuthActive,
19
+ isAuthActive, envName, envToken
20
20
  } from '@voxgig/sdkgen'
21
21
 
22
22
 
@@ -35,8 +35,8 @@ const TestDirect = cmp(function TestDirect(props: any) {
35
35
 
36
36
  const ff = projectPath('src/cmp/dart/fragment/')
37
37
 
38
- const PROJECTNAME = nom(model, 'Name').toUpperCase().replace(/[^A-Z_]/g, '_')
39
- const entidEnvVar = `${PROJECTNAME}_TEST_${nom(entity, 'NAME').replace(/[^A-Z_]/g, '_')}_ENTID`
38
+ const PROJECTNAME = envName(model)
39
+ const entidEnvVar = `${PROJECTNAME}_TEST_${envToken(entity.name)}_ENTID`
40
40
 
41
41
  const authActive = isAuthActive(model)
42
42
  const apikeyEnvEntry = authActive
@@ -23,7 +23,7 @@ import {
23
23
  Slot,
24
24
  cmp,
25
25
  each,
26
- isAuthActive,
26
+ isAuthActive, envName, envToken
27
27
  } from '@voxgig/sdkgen'
28
28
 
29
29
 
@@ -50,8 +50,8 @@ const TestEntity = cmp(function TestEntity(props: any) {
50
50
 
51
51
  const entity: ModelEntity = props.entity
52
52
 
53
- const PROJENVNAME = nom(model.const, 'NAME').replace(/[^A-Z_]/g, '_')
54
- const ENTENVNAME = nom(entity, 'NAME').replace(/[^A-Z_]/g, '_')
53
+ const PROJENVNAME = envName(model)
54
+ const ENTENVNAME = envToken(entity.name)
55
55
  const authActive = isAuthActive(model)
56
56
  const apikeyEnvEntry = authActive
57
57
  ? `\n '${PROJENVNAME}_APIKEY': 'NONE',`
@@ -333,7 +333,7 @@ const generateCreate: OpGen = (ctx, step, index) => {
333
333
  const hasEntIdC = null != entity.id
334
334
 
335
335
  Content(`
336
- ${datavar} = await ${entvar}.create(${datavar});
336
+ ${datavar} = (await ${entvar}.create(${datavar})).data();
337
337
  `)
338
338
  if (hasEntIdC) {
339
339
  Content(` ok(null != ${datavar}['id']);
@@ -373,7 +373,7 @@ const generateList: OpGen = (ctx, step, index) => {
373
373
  })
374
374
 
375
375
  Content(`
376
- final ${listvar} = await ${entvar}.list(${matchvar});
376
+ final ${listvar} = (await ${entvar}.list(${matchvar})).map((e) => e.data()).toList();
377
377
  `)
378
378
  const allSteps = flow.step
379
379
  for (let vI = 0; vI < step.valid.length; vI++) {
@@ -460,7 +460,7 @@ const generateUpdate: OpGen = (ctx, step, index) => {
460
460
  }
461
461
 
462
462
  Content(`
463
- final ${resdatavar} = await ${entvar}.update(${updvar});
463
+ final ${resdatavar} = (await ${entvar}.update(${updvar})).data();
464
464
  `)
465
465
  if (hasEntIdU) {
466
466
  Content(` ok(${resdatavar}['id'] == ${updvar}['id']);
@@ -550,13 +550,13 @@ const generateLoad: OpGen = (ctx, step, index) => {
550
550
  if (hasEntId) {
551
551
  Content(` final ${matchvar} = <String, dynamic>{};
552
552
  ${matchvar}['id'] = ${srcdatavar}['id'];
553
- final ${datavar} = await ${entvar}.load(${matchvar});
553
+ final ${datavar} = (await ${entvar}.load(${matchvar})).data();
554
554
  ok(${datavar}['id'] == ${srcdatavar}['id']);
555
555
  `)
556
556
  }
557
557
  else {
558
558
  Content(` final ${matchvar} = <String, dynamic>{};
559
- final ${datavar} = await ${entvar}.load(${matchvar});
559
+ final ${datavar} = (await ${entvar}.load(${matchvar})).data();
560
560
  ok(null != ${datavar});
561
561
  `)
562
562
  }
@@ -43,6 +43,18 @@ class ProjectNameEntityBase {
43
43
  featureHook(entctx, 'PostConstructEntity');
44
44
  }
45
45
 
46
+ // Every operation resolves to the entity; `remove` additionally marks
47
+ // it. The instance KEEPS the data it held — a caller can still read what
48
+ // was deleted — but it is no longer a live record. See AGENTS.md.
49
+ bool _deleted = false;
50
+
51
+ void markDeleted() {
52
+ _deleted = true;
53
+ }
54
+
55
+ bool deleted() => _deleted;
56
+
57
+
46
58
  dynamic entopts() {
47
59
  return utility.struct.merge([{}, entoptsMap]);
48
60
  }
@@ -235,7 +247,12 @@ class ProjectNameEntityBase {
235
247
  if (d is Map) {
236
248
  d.forEach((k, v) => out[k.toString()] = v);
237
249
  }
238
- out[r'entity$'] = Name;
250
+ // The marker is NAMESPACED. It used to be `entity$` a short, generic
251
+ // name, and the `$`-suffix convention is not unique to sdkgen. Seneca uses
252
+ // `entity$` on its own entities to hold the canon, so an SDK record fed
253
+ // into `entize` silently overwrote it and produced entities claiming a
254
+ // canon that does not exist: no error, just wrong entities.
255
+ out[r'voxgig$entity'] = Name;
239
256
  return out;
240
257
  }
241
258
 
@@ -72,7 +72,15 @@
72
72
  }
73
73
  }
74
74
 
75
- return done(ctx);
75
+ final out = done(ctx);
76
+
77
+ // An operation resolves to the ENTITY, not the raw data — the record
78
+ // has just been absorbed into this instance and is reached through
79
+ // data(). `done` still runs: it completes the pipeline and raises on
80
+ // failure, and when throwing is disabled it hands back the error
81
+ // payload, which passes through unchanged. See AGENTS.md "Entity
82
+ // operations return ENTITIES".
83
+ return (null != ctx.result && true == ctx.result.ok) ? this : out;
76
84
  } catch (err) {
77
85
  // #PreUnexpected-Hook
78
86
 
@@ -76,7 +76,15 @@
76
76
  }
77
77
  }
78
78
 
79
- return done(ctx);
79
+ final out = done(ctx);
80
+
81
+ // An operation resolves to the ENTITY, not the raw data — the record
82
+ // has just been absorbed into this instance and is reached through
83
+ // data(). `done` still runs: it completes the pipeline and raises on
84
+ // failure, and when throwing is disabled it hands back the error
85
+ // payload, which passes through unchanged. See AGENTS.md "Entity
86
+ // operations return ENTITIES".
87
+ return (null != ctx.result && true == ctx.result.ok) ? this : out;
80
88
  } catch (err) {
81
89
  // #PreUnexpected-Hook
82
90
 
@@ -76,7 +76,21 @@
76
76
  }
77
77
  }
78
78
 
79
- return done(ctx);
79
+ final out = done(ctx);
80
+
81
+ // An operation resolves to the ENTITY, not the raw data — the record
82
+ // has just been absorbed into this instance and is reached through
83
+ // data(). `done` still runs: it completes the pipeline and raises on
84
+ // failure, and when throwing is disabled it hands back the error
85
+ // payload, which passes through unchanged. See AGENTS.md "Entity
86
+ // operations return ENTITIES".
87
+ if (null != ctx.result && true == ctx.result.ok) {
88
+ // A removed entity keeps its data but is no longer a live record.
89
+ markDeleted();
90
+ return this;
91
+ }
92
+
93
+ return out;
80
94
  } catch (err) {
81
95
  // #PreUnexpected-Hook
82
96
 
@@ -76,7 +76,15 @@
76
76
  }
77
77
  }
78
78
 
79
- return done(ctx);
79
+ final out = done(ctx);
80
+
81
+ // An operation resolves to the ENTITY, not the raw data — the record
82
+ // has just been absorbed into this instance and is reached through
83
+ // data(). `done` still runs: it completes the pipeline and raises on
84
+ // failure, and when throwing is disabled it hands back the error
85
+ // payload, which passes through unchanged. See AGENTS.md "Entity
86
+ // operations return ENTITIES".
87
+ return (null != ctx.result && true == ctx.result.ok) ? this : out;
80
88
  } catch (err) {
81
89
  // #PreUnexpected-Hook
82
90
 
@@ -11,6 +11,14 @@ class ProjectNameError extends Error {
11
11
  dynamic result;
12
12
  dynamic spec;
13
13
 
14
+ // HTTP status of the response that caused this error, or -1 when the
15
+ // request never got one. PROMOTED to the top level: it used to be
16
+ // reachable only at `err.result['status']`, so every consumer coupled
17
+ // itself to the internal shape of `result`.
18
+ int status = -1;
19
+
20
+ bool get notFound => 404 == status;
21
+
14
22
  ProjectNameError(this.code, this.message, [this.ctx]);
15
23
 
16
24
  @override
@@ -5,6 +5,7 @@ import {
5
5
  cmp,
6
6
  pkgDescription,
7
7
  repoInfo,
8
+ packageVersion,
8
9
  } from '@voxgig/sdkgen'
9
10
 
10
11
 
@@ -17,6 +18,7 @@ import type {
17
18
  // third-party runtime deps, so the SDK ships with none either.
18
19
  const Package = cmp(async function Package(props: any) {
19
20
  const ctx$ = props.ctx$
21
+ const target = props.target
20
22
  const model: Model = ctx$.model
21
23
 
22
24
  const Name = model.const.Name
@@ -32,7 +34,7 @@ const Package = cmp(async function Package(props: any) {
32
34
  def project do
33
35
  [
34
36
  app: :${app},
35
- version: "0.0.1",
37
+ version: "${packageVersion(model, target.name)}",
36
38
  elixir: "~> 1.14",
37
39
  description: ${JSON.stringify(pkgDescription(model, 'elixir'))},
38
40
  elixirc_paths: elixirc_paths(Mix.env()),
@@ -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
 
5
5
  const ReadmeInstall = cmp(function ReadmeInstall(props: any) {
@@ -16,7 +16,7 @@ const ReadmeInstall = cmp(function ReadmeInstall(props: any) {
16
16
  \`\`\`elixir
17
17
  def deps do
18
18
  [
19
- {:${app}, "~> 0.0.1"}
19
+ {:${app}, "~> ${packageVersion(model, target.name)}"}
20
20
  ]
21
21
  end
22
22
  \`\`\`
@@ -70,8 +70,15 @@ defmodule ${Name}.${EName}EntityTest do
70
70
  test "should list records" do
71
71
  sdk = mk_sdk()
72
72
  ent = ${Name}.${ename}(sdk)
73
+ # The op resolves to one ENTITY per record; the record is reached with
74
+ # data_get. See AGENTS.md "Entity operations return ENTITIES".
73
75
  result = ${Name}.Entity.${EName}.list(ent, S.jm([]))
74
76
  assert S.islist(result)
77
+ if S.size(result) > 0 do
78
+ Enum.each(0..(S.size(result) - 1), fn i ->
79
+ assert S.ismap(${Name}.EntityBase.data_get(S.getelem(result, i)))
80
+ end)
81
+ end
75
82
  end
76
83
  `)
77
84
  }
@@ -84,7 +91,8 @@ defmodule ${Name}.${EName}EntityTest do
84
91
  if id != nil do
85
92
  sdk = mk_sdk()
86
93
  ent = ${Name}.${ename}(sdk)
87
- rec = ${Name}.Entity.${EName}.load(ent, S.jm(["id", id]))
94
+ loaded = ${Name}.Entity.${EName}.load(ent, S.jm(["id", id]))
95
+ rec = ${Name}.EntityBase.data_get(loaded)
88
96
  assert S.ismap(rec)
89
97
  assert S.getprop(rec, "id") == id
90
98
  end
@@ -97,7 +105,8 @@ defmodule ${Name}.${EName}EntityTest do
97
105
  test "should create then read back" do
98
106
  sdk = ${Name}.test(S.jm(["entity", S.jm(["${ename}", S.jm([])])]))
99
107
  ent = ${Name}.${ename}(sdk)
100
- made = ${Name}.Entity.${EName}.create(ent, S.jm(["name", "test-create"]))
108
+ created = ${Name}.Entity.${EName}.create(ent, S.jm(["name", "test-create"]))
109
+ made = ${Name}.EntityBase.data_get(created)
101
110
  assert S.ismap(made)
102
111
  assert S.getprop(made, "id") != nil
103
112
  end
@@ -26,7 +26,8 @@
26
26
  end
27
27
  end
28
28
 
29
- Pipeline.run_op(ctx, post_done)
29
+ out = Pipeline.run_op(ctx, post_done)
30
+ EntityBase.op_return(ent, ctx, out)
30
31
  end
31
32
 
32
33
  # EJECT-END
@@ -28,6 +28,7 @@
28
28
  end
29
29
  end
30
30
 
31
+ # `list` resolves to one ENTITY per record — make_result builds them.
31
32
  Pipeline.run_op(ctx, post_done)
32
33
  end
33
34
 
@@ -30,7 +30,8 @@
30
30
  end
31
31
  end
32
32
 
33
- Pipeline.run_op(ctx, post_done)
33
+ out = Pipeline.run_op(ctx, post_done)
34
+ EntityBase.op_return(ent, ctx, out)
34
35
  end
35
36
 
36
37
  # EJECT-END
@@ -30,7 +30,10 @@
30
30
  end
31
31
  end
32
32
 
33
- Pipeline.run_op(ctx, post_done)
33
+ out = Pipeline.run_op(ctx, post_done)
34
+ ent = EntityBase.op_return(ent, ctx, out)
35
+ # A removed entity keeps its data but is no longer a live record.
36
+ if ent == out, do: out, else: EntityBase.mark_deleted(ent)
34
37
  end
35
38
 
36
39
  # EJECT-END
@@ -28,7 +28,8 @@
28
28
  end
29
29
  end
30
30
 
31
- Pipeline.run_op(ctx, post_done)
31
+ out = Pipeline.run_op(ctx, post_done)
32
+ EntityBase.op_return(ent, ctx, out)
32
33
  end
33
34
 
34
35
  # EJECT-END
@@ -28,7 +28,7 @@
28
28
 
29
29
  import {
30
30
  cmp, each,
31
- File, Content, Folder,
31
+ File, Content, Folder, goModule
32
32
  } from '@voxgig/sdkgen'
33
33
 
34
34
  import { canonToType, opTypeName, opRequestShape, warnEntityTypeCollisions , deriveEntityNames } from '@voxgig/sdkgen'
@@ -165,6 +165,10 @@ const EntityTypes = cmp(function EntityTypes(props: any) {
165
165
  const { target } = props
166
166
  const { model, log } = props.ctx$
167
167
 
168
+ // This file is GENERATED, not templated, so the GOMODULE placeholder is
169
+ // never substituted for it — the module path has to be interpolated.
170
+ const gomodule = goModule(model, 'go')
171
+
168
172
  // only_active:false — getModelPath DROPS active:false entries by default,
169
173
  // but the consumer scaffold (create-sdkgen Root.ts) iterates the RAW entity
170
174
  // collection, so inactive entities still get generated entity code that
@@ -196,7 +200,11 @@ const EntityTypes = cmp(function EntityTypes(props: any) {
196
200
  // @voxgig/apidef VALID_CANON). Do not edit by hand.
197
201
  package entity
198
202
 
199
- import "encoding/json"
203
+ import (
204
+ "encoding/json"
205
+
206
+ "${gomodule}/core"
207
+ )
200
208
 
201
209
  `)
202
210
 
@@ -262,12 +270,26 @@ func asMap(v any) map[string]any {
262
270
  return out
263
271
  }
264
272
 
265
- // typedFrom decodes a runtime value (a map[string]any produced by the op
266
- // pipeline) into a typed model T via a JSON round-trip. On any error it
267
- // returns the zero value of T; the op's own (value, error) tuple carries the
268
- // real error.
273
+ // entityData unwraps an entity to its data map.
274
+ //
275
+ // Operations resolve to the ENTITY, not the raw data (see AGENTS.md), and an
276
+ // entity's fields are UNEXPORTED — marshalling one directly yields \`{}\`, so
277
+ // every typed accessor would silently hand back a zero-valued struct. The
278
+ // typed boundary therefore takes the data hop first.
279
+ func entityData(v any) any {
280
+ if ent, ok := v.(core.Entity); ok {
281
+ return ent.Data()
282
+ }
283
+ return v
284
+ }
285
+
286
+ // typedFrom decodes a runtime value (an entity, or the map[string]any the op
287
+ // pipeline produced) into a typed model T via a JSON round-trip. On any error
288
+ // it returns the zero value of T; the op's own (value, error) tuple carries
289
+ // the real error.
269
290
  func typedFrom[T any](v any) T {
270
291
  var out T
292
+ v = entityData(v)
271
293
  if v == nil {
272
294
  return out
273
295
  }
@@ -279,13 +301,21 @@ func typedFrom[T any](v any) T {
279
301
  return out
280
302
  }
281
303
 
282
- // typedSliceFrom decodes a runtime list value ([]any of maps) into a typed
283
- // slice []T via a JSON round-trip, for list ops.
304
+ // typedSliceFrom decodes a runtime list value into a typed slice []T via a
305
+ // JSON round-trip, for list ops. \`list\` resolves to a slice of ENTITY
306
+ // instances, so each element takes the data hop.
284
307
  func typedSliceFrom[T any](v any) []T {
285
308
  var out []T
286
309
  if v == nil {
287
310
  return out
288
311
  }
312
+ if list, ok := v.([]any); ok {
313
+ unwrapped := make([]any, 0, len(list))
314
+ for _, item := range list {
315
+ unwrapped = append(unwrapped, entityData(item))
316
+ }
317
+ v = unwrapped
318
+ }
289
319
  b, err := json.Marshal(v)
290
320
  if err != nil {
291
321
  return out
@@ -4,7 +4,7 @@ import * as Path from 'node:path'
4
4
  import {
5
5
  cmp, each, camelify, names,
6
6
  File, Content, Folder, Fragment, Line, FeatureHook, Slot,
7
- entityClassName, entityCollection,
7
+ entityClassName, entityCollection, goModule
8
8
  } from '@voxgig/sdkgen'
9
9
 
10
10
  import {
@@ -21,7 +21,7 @@ const Entity = cmp(function Entity(props: any) {
21
21
 
22
22
  // Module name: concatenated lowercase
23
23
  // Go module path == repo path on GitHub (org from model.origin).
24
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
24
+ const gomodule = goModule(model, 'go')
25
25
 
26
26
  // Collision-free entity CLASS name (see entityClassName): normally
27
27
  // `<Name>Entity`, but disambiguated (e.g. `<Name>EntityClient`) when it would
@@ -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, goModule, goPackageIdent
8
8
  } from '@voxgig/sdkgen'
9
9
 
10
10
 
@@ -37,11 +37,10 @@ const Main = cmp(async function Main(props: any) {
37
37
 
38
38
  // Go module path == the repo path on GitHub (org from model.origin),
39
39
  // e.g. github.com/voxgig-sdk/<slug>-sdk. Used in go.mod and every import.
40
- const gomodule = `github.com/${model.origin || 'voxgig-sdk'}/${model.name}-sdk/go`
40
+ const gomodule = goModule(model, 'go')
41
41
  // The root package name must be a plain Go identifier (can't be a path),
42
- // so it stays as the concatenated-lowercase form (e.g. voxgigdogsdk).
43
- const gopackage = (model.origin || 'voxgig-sdk').replace(/-sdk$/, '').replace(/[^a-z0-9]/gi, '') +
44
- model.name.replace(/[^a-z0-9]/gi, '').toLowerCase() + 'sdk'
42
+ // so it stays a concatenated-lowercase form (e.g. voxgigdogsdk).
43
+ const gopackage = goPackageIdent(model, 'go')
45
44
 
46
45
  Package({ target })
47
46