@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
@@ -16,7 +16,7 @@ import {
16
16
  cmp,
17
17
  each,
18
18
  buildIdNames,
19
- getMatchEntries,
19
+ getMatchEntries, envName, envToken
20
20
  } from '@voxgig/sdkgen'
21
21
 
22
22
 
@@ -43,7 +43,7 @@ const TestEntity = cmp(function TestEntity(props: any) {
43
43
  const entity: ModelEntity = props.entity
44
44
 
45
45
  const ProjectName = model.const.Name
46
- const PROJUPPER = nom(model.const, 'Name').toUpperCase().replace(/[^A-Z_]/g, '_')
46
+ const PROJUPPER = envName(model)
47
47
 
48
48
  const basicflow: ModelEntityFlow | undefined =
49
49
  getModelPath(model, `main.${KIT}.flow.Basic${nom(entity, 'Name')}Flow`)
@@ -111,12 +111,12 @@ static ${entity.Name}Setup ${evar}_basic_setup(const Value& extra) {
111
111
  if (!idmap.is_map()) idmap = vmap();
112
112
 
113
113
  Value env = env_override(vmap({
114
- {"${PROJUPPER}_TEST_${nom(entity, 'NAME').replace(/[^A-Z_]/g, '_')}_ENTID", idmap},
114
+ {"${PROJUPPER}_TEST_${envToken(entity.name)}_ENTID", idmap},
115
115
  {"${PROJUPPER}_TEST_LIVE", Value("FALSE")},
116
116
  {"${PROJUPPER}_TEST_EXPLAIN", Value("FALSE")}
117
117
  }));
118
118
 
119
- Value idmap_resolved = Helpers::toMapAny(getp(env, "${PROJUPPER}_TEST_${nom(entity, 'NAME').replace(/[^A-Z_]/g, '_')}_ENTID"));
119
+ Value idmap_resolved = Helpers::toMapAny(getp(env, "${PROJUPPER}_TEST_${envToken(entity.name)}_ENTID"));
120
120
  if (!idmap_resolved.is_map()) idmap_resolved = idmap;
121
121
  `)
122
122
 
@@ -264,7 +264,7 @@ const generateCreate: OpGen = (ctx, step: any, index) => {
264
264
  }
265
265
 
266
266
  Content(` {
267
- Value ${datavar}_result = ${entvar}->create(Struct::clone(${datavar}), Value::undef());
267
+ Value ${datavar}_result = ${entvar}->create(Struct::clone(${datavar}), Value::undef())->data();
268
268
  ${datavar} = Helpers::toMapAny(${datavar}_result);
269
269
  if (!${datavar}.is_map()) ${datavar} = vmap();
270
270
  ASSERT_TRUE(${datavar}.is_map(), "expected create result to be a map");
@@ -302,7 +302,10 @@ const generateList: OpGen = (ctx, step: any, index) => {
302
302
  Content(` setp(${matchvar}, "${key}", getp(setup.idmap, "${val}"));
303
303
  `)
304
304
  }
305
- Content(` Value ${listvar} = ${entvar}->list(Struct::clone(${matchvar}), Value::undef());
305
+ Content(` auto ${listvar}_ents = ${entvar}->list(Struct::clone(${matchvar}), Value::undef());
306
+ // list resolves to one ENTITY per record; the flow asserts on the records.
307
+ Value ${listvar} = vlist();
308
+ for (const auto& e : ${listvar}_ents) { ${listvar}.as_list()->push_back(e->data()); }
306
309
  ASSERT_TRUE(${listvar}.is_list(), "expected list result to be an array");
307
310
  `)
308
311
 
@@ -378,7 +381,7 @@ const generateUpdate: OpGen = (ctx, step: any, index) => {
378
381
  }
379
382
  }
380
383
  }
381
- Content(` Value ${resdatavar}_result = ${entvar}->update(Struct::clone(${datavar}_up), Value::undef());
384
+ Content(` Value ${resdatavar}_result = ${entvar}->update(Struct::clone(${datavar}_up), Value::undef())->data();
382
385
  Value ${resdatavar} = Helpers::toMapAny(${resdatavar}_result);
383
386
  if (!${resdatavar}.is_map()) ${resdatavar} = vmap();
384
387
  ASSERT_TRUE(${resdatavar}.is_map(), "expected update result to be a map");
@@ -415,14 +418,14 @@ const generateLoad: OpGen = (ctx, step: any, index) => {
415
418
  }
416
419
  if (hasEntId) {
417
420
  Content(` Value ${matchvar} = vmap({{"id", getp(${srcdatavar}, "id")}});
418
- Value ${datavar}_loaded = ${entvar}->load(Struct::clone(${matchvar}), Value::undef());
421
+ Value ${datavar}_loaded = ${entvar}->load(Struct::clone(${matchvar}), Value::undef())->data();
419
422
  Value ${datavar}_load_result = Helpers::toMapAny(${datavar}_loaded);
420
423
  ASSERT_TRUE(${datavar}_load_result.is_map(), "expected load result to be a map");
421
424
  ASSERT_EQ_VAL(getp(${datavar}_load_result, "id"), getp(${srcdatavar}, "id"), "expected load result id to match");
422
425
  `)
423
426
  } else {
424
427
  Content(` Value ${matchvar} = vmap();
425
- Value ${datavar}_loaded = ${entvar}->load(${matchvar}, Value::undef());
428
+ Value ${datavar}_loaded = ${entvar}->load(${matchvar}, Value::undef())->data();
426
429
  ASSERT_TRUE(!${datavar}_loaded.is_undef(), "expected load result to be non-nil");
427
430
  `)
428
431
  }
@@ -1,6 +1,6 @@
1
1
  // EJECT-START
2
2
 
3
- Value create(const Value& reqdata, const Value& ctrl) override {
3
+ SdkEntityPtr create(const Value& reqdata, const Value& ctrl) override {
4
4
  CtxSpec cs;
5
5
  cs.setOpname("create");
6
6
  cs.ctrlMap = ctrl.is_map() ? ctrl : vmap();
@@ -9,7 +9,7 @@
9
9
  cs.reqdata = reqdata.is_map() ? reqdata : vmap();
10
10
  CtxPtr ctx = this->utility->makeContext(cs, this->entctx);
11
11
 
12
- return runOp(ctx, [this, ctx]() {
12
+ runOp(ctx, [this, ctx]() {
13
13
  if (ctx->result) {
14
14
  if (!is_nullish(ctx->result->resdata)) {
15
15
  Value d = Helpers::toMapAny(Struct::clone(ctx->result->resdata));
@@ -17,6 +17,12 @@
17
17
  }
18
18
  }
19
19
  });
20
+
21
+ // The operation resolves to THIS entity: runOp has just absorbed the
22
+ // result into it, and the caller reaches the record through data().
23
+ // See AGENTS.md "Entity operations return ENTITIES".
24
+
25
+ return this->self();
20
26
  }
21
27
 
22
28
  // EJECT-END
@@ -1,6 +1,6 @@
1
1
  // EJECT-START
2
2
 
3
- Value list(const Value& reqmatch, const Value& ctrl) override {
3
+ std::vector<SdkEntityPtr> list(const Value& reqmatch, const Value& ctrl) override {
4
4
  CtxSpec cs;
5
5
  cs.setOpname("list");
6
6
  cs.ctrlMap = ctrl.is_map() ? ctrl : vmap();
@@ -9,13 +9,29 @@
9
9
  cs.reqmatch = reqmatch.is_map() ? reqmatch : vmap();
10
10
  CtxPtr ctx = this->utility->makeContext(cs, this->entctx);
11
11
 
12
- return runOp(ctx, [this, ctx]() {
12
+ Value out = runOp(ctx, [this, ctx]() {
13
13
  if (ctx->result) {
14
14
  if (ctx->result->resmatch.is_map()) {
15
15
  this->match_ = ctx->result->resmatch;
16
16
  }
17
17
  }
18
18
  });
19
+
20
+ // `list` resolves to one ENTITY per record. makeResult cannot build them
21
+ // here - it works in Value, which has no slot for an entity - so the op
22
+ // does, mirroring what the dynamic targets get from makeResult.
23
+ std::vector<SdkEntityPtr> items;
24
+ if (out.is_list()) {
25
+ for (const auto& entry : *out.as_list()) {
26
+ SdkEntityPtr ent = std::static_pointer_cast<SdkEntity>(this->make());
27
+ if (entry.is_map()) {
28
+ ent->data(entry);
29
+ }
30
+ items.push_back(ent);
31
+ }
32
+ }
33
+
34
+ return items;
19
35
  }
20
36
 
21
37
  // EJECT-END
@@ -1,6 +1,6 @@
1
1
  // EJECT-START
2
2
 
3
- Value load(const Value& reqmatch, const Value& ctrl) override {
3
+ SdkEntityPtr load(const Value& reqmatch, const Value& ctrl) override {
4
4
  CtxSpec cs;
5
5
  cs.setOpname("load");
6
6
  cs.ctrlMap = ctrl.is_map() ? ctrl : vmap();
@@ -9,7 +9,7 @@
9
9
  cs.reqmatch = reqmatch.is_map() ? reqmatch : vmap();
10
10
  CtxPtr ctx = this->utility->makeContext(cs, this->entctx);
11
11
 
12
- return runOp(ctx, [this, ctx]() {
12
+ runOp(ctx, [this, ctx]() {
13
13
  if (ctx->result) {
14
14
  if (ctx->result->resmatch.is_map()) {
15
15
  this->match_ = ctx->result->resmatch;
@@ -20,6 +20,12 @@
20
20
  }
21
21
  }
22
22
  });
23
+
24
+ // The operation resolves to THIS entity: runOp has just absorbed the
25
+ // result into it, and the caller reaches the record through data().
26
+ // See AGENTS.md "Entity operations return ENTITIES".
27
+
28
+ return this->self();
23
29
  }
24
30
 
25
31
  // EJECT-END
@@ -1,6 +1,6 @@
1
1
  // EJECT-START
2
2
 
3
- Value remove(const Value& reqmatch, const Value& ctrl) override {
3
+ SdkEntityPtr remove(const Value& reqmatch, const Value& ctrl) override {
4
4
  CtxSpec cs;
5
5
  cs.setOpname("remove");
6
6
  cs.ctrlMap = ctrl.is_map() ? ctrl : vmap();
@@ -9,13 +9,22 @@
9
9
  cs.reqmatch = reqmatch.is_map() ? reqmatch : vmap();
10
10
  CtxPtr ctx = this->utility->makeContext(cs, this->entctx);
11
11
 
12
- return runOp(ctx, [this, ctx]() {
12
+ runOp(ctx, [this, ctx]() {
13
13
  if (ctx->result) {
14
14
  if (ctx->result->resmatch.is_map()) {
15
15
  this->match_ = ctx->result->resmatch;
16
16
  }
17
17
  }
18
18
  });
19
+
20
+ // The operation resolves to THIS entity: runOp has just absorbed the
21
+ // result into it, and the caller reaches the record through data().
22
+ // See AGENTS.md "Entity operations return ENTITIES".
23
+
24
+ // A removed entity keeps its data but is no longer a live record.
25
+ this->markDeleted();
26
+
27
+ return this->self();
19
28
  }
20
29
 
21
30
  // EJECT-END
@@ -1,6 +1,6 @@
1
1
  // EJECT-START
2
2
 
3
- Value update(const Value& reqdata, const Value& ctrl) override {
3
+ SdkEntityPtr update(const Value& reqdata, const Value& ctrl) override {
4
4
  CtxSpec cs;
5
5
  cs.setOpname("update");
6
6
  cs.ctrlMap = ctrl.is_map() ? ctrl : vmap();
@@ -9,7 +9,7 @@
9
9
  cs.reqdata = reqdata.is_map() ? reqdata : vmap();
10
10
  CtxPtr ctx = this->utility->makeContext(cs, this->entctx);
11
11
 
12
- return runOp(ctx, [this, ctx]() {
12
+ runOp(ctx, [this, ctx]() {
13
13
  if (ctx->result) {
14
14
  if (!is_nullish(ctx->result->resdata)) {
15
15
  Value d = Helpers::toMapAny(Struct::clone(ctx->result->resdata));
@@ -17,6 +17,12 @@
17
17
  }
18
18
  }
19
19
  });
20
+
21
+ // The operation resolves to THIS entity: runOp has just absorbed the
22
+ // result into it, and the caller reaches the record through data().
23
+ // See AGENTS.md "Entity operations return ENTITIES".
24
+
25
+ return this->self();
20
26
  }
21
27
 
22
28
  // EJECT-END
@@ -7,6 +7,7 @@ import {
7
7
  collectDeps,
8
8
  pkgDescription,
9
9
  repoInfo,
10
+ packageVersion,
10
11
  } from '@voxgig/sdkgen'
11
12
 
12
13
 
@@ -56,7 +57,7 @@ const Package = cmp(async function Package(props: any) {
56
57
  <NoWarn>$(NoWarn);CS8600;CS8601;CS8602;CS8603;CS8604;CS8618;CS8625;CS1591</NoWarn>
57
58
 
58
59
  <!-- NuGet package metadata (publication pending; see Makefile). -->
59
- <Version>0.0.1</Version>
60
+ <Version>${packageVersion(model, target.name)}</Version>
60
61
  <PackageId>${Name}.Sdk</PackageId>
61
62
  <Authors>Voxgig</Authors>
62
63
  <Description>${pkgDescription(model, 'csharp')}</Description>
@@ -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
  import { formatCsValue } from './utility_csharp'
@@ -62,8 +62,8 @@ const TestDirect = cmp(function TestDirect(props: any) {
62
62
  const entity: ModelEntity = props.entity
63
63
 
64
64
  const Name = model.const.Name
65
- const PROJECTNAME = nom(model, 'Name').toUpperCase().replace(/[^A-Z_]/g, '_')
66
- const ENTUPPER = nom(entity, 'NAME').replace(/[^A-Z_]/g, '_')
65
+ const PROJECTNAME = envName(model)
66
+ const ENTUPPER = envToken(entity.name)
67
67
 
68
68
  const authActive = isAuthActive(model)
69
69
  const apikeyEnvEntry = authActive
@@ -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
 
@@ -54,8 +54,8 @@ const TestEntity = cmp(function TestEntity(props: any) {
54
54
  }
55
55
 
56
56
  const Name = model.const.Name
57
- const PROJUPPER = nom(model.const, 'Name').toUpperCase().replace(/[^A-Z_]/g, '_')
58
- const ENTUPPER = entity.name.toUpperCase().replace(/[^A-Z_]/g, '_')
57
+ const PROJUPPER = envName(model)
58
+ const ENTUPPER = envToken(entity.name)
59
59
 
60
60
  const authActive = isAuthActive(model)
61
61
  const apikeyEnvEntry = authActive
@@ -358,7 +358,7 @@ const generateCreate: OpGen = (ctx, step, index) => {
358
358
 
359
359
  Content(`
360
360
  var ${datavar}Result = ${entvar}.Create(${datavar}, null);
361
- ${datavar} = Helpers.ToMapAny(${datavar}Result);
361
+ ${datavar} = Helpers.ToMapAny(${datavar}Result is IEntity ce ? ce.Data() : ${datavar}Result);
362
362
  Assert.True(${datavar} != null, "expected create result to be a map");
363
363
  `)
364
364
  if (null != ctx.entity.id) {
@@ -500,7 +500,7 @@ const generateUpdate: OpGen = (ctx, step, index) => {
500
500
 
501
501
  Content(`
502
502
  var ${resdatavar}Result = ${entvar}.Update(${datavar}Up, null);
503
- var ${resdatavar} = Helpers.ToMapAny(${resdatavar}Result);
503
+ var ${resdatavar} = Helpers.ToMapAny(${resdatavar}Result is IEntity ue ? ue.Data() : ${resdatavar}Result);
504
504
  Assert.True(${resdatavar} != null, "expected update result to be a map");
505
505
  `)
506
506
  if (hasEntIdU) {
@@ -569,7 +569,7 @@ const generateLoad: OpGen = (ctx, step, index) => {
569
569
  ["id"] = ${srcdatavar}!["id"],
570
570
  };
571
571
  var ${datavar}Loaded = ${entvar}.Load(${matchvar}, null);
572
- var ${datavar}LoadResult = Helpers.ToMapAny(${datavar}Loaded);
572
+ var ${datavar}LoadResult = Helpers.ToMapAny(${datavar}Loaded is IEntity le ? le.Data() : ${datavar}Loaded);
573
573
  Assert.True(${datavar}LoadResult != null, "expected load result to be a map");
574
574
  Assert.True(StructRunner.DeepEqual(${datavar}LoadResult!["id"], ${srcdatavar}["id"]),
575
575
  "expected load result id to match");
@@ -19,6 +19,22 @@ public abstract class ProjectNameEntityBase : IEntity
19
19
  protected Dictionary<string, object?> match = new();
20
20
  protected Context entctx;
21
21
 
22
+ // Every operation resolves to the entity; `remove` additionally marks
23
+ // it. The instance KEEPS the data it held — a caller can still read what
24
+ // was deleted — but it is no longer a live record. See AGENTS.md.
25
+ private bool _deleted = false;
26
+
27
+ public void MarkDeleted()
28
+ {
29
+ this._deleted = true;
30
+ }
31
+
32
+ public bool Deleted()
33
+ {
34
+ return this._deleted;
35
+ }
36
+
37
+
22
38
  protected ProjectNameEntityBase(ProjectNameSDK client,
23
39
  Dictionary<string, object?>? entopts, string name)
24
40
  {
@@ -167,7 +183,28 @@ public abstract class ProjectNameEntityBase : IEntity
167
183
 
168
184
  postDone();
169
185
 
170
- return utility.Done(ctx);
186
+ var outv = utility.Done(ctx);
187
+
188
+ // An operation resolves to the ENTITY, not the raw data. Entities are
189
+ // stateful: postDone has just absorbed Resdata/Resmatch into this
190
+ // instance, and the caller reaches the record through Data(). Two
191
+ // structural exceptions: `list` resolves to the ARRAY of entity
192
+ // instances MakeResult built, and a failed op with throwing disabled
193
+ // hands back the error payload unchanged. `remove` additionally marks
194
+ // the entity deleted; it KEEPS its data, so a caller can still read
195
+ // what was removed. See AGENTS.md "Entity operations return ENTITIES".
196
+ var opname = ctx.Op?.Name;
197
+
198
+ if (ctx.Result != null && ctx.Result.Ok && "list" != opname)
199
+ {
200
+ if ("remove" == opname)
201
+ {
202
+ this.MarkDeleted();
203
+ }
204
+ return this;
205
+ }
206
+
207
+ return outv;
171
208
  }
172
209
 
173
210
  // Streaming operations. Runs `action` through the full pipeline and returns
@@ -8,6 +8,15 @@ namespace ProjectNameSdk;
8
8
 
9
9
  public class ProjectNameSDK
10
10
  {
11
+ // NOTE: type references in EXPRESSION position are `global::`-qualified
12
+ // throughout this class. Entity accessors are PascalCase methods declared
13
+ // on it (see MainEntity_csharp), so an entity named `utility` declares
14
+ // `Utility(...)` here and C# then resolves the simple name `Utility` in an
15
+ // expression to the METHOD, not the type: "'X.Utility(...)' is a method,
16
+ // which is not valid in the given context". Qualifying makes the class
17
+ // immune to that whatever the API names its entities. Type POSITIONS
18
+ // (field and return types) are unaffected and stay unqualified.
19
+
11
20
  public string Mode = "live";
12
21
  private Dictionary<string, object?> _options;
13
22
  private readonly Utility _utility;
@@ -18,7 +27,7 @@ public class ProjectNameSDK
18
27
  {
19
28
  _utility = new Utility();
20
29
 
21
- var config = SdkConfig.MakeConfig();
30
+ var config = global::ProjectNameSdk.SdkConfig.MakeConfig();
22
31
 
23
32
  _rootctx = _utility.MakeContext(new Dictionary<string, object?>
24
33
  {
@@ -31,8 +40,8 @@ public class ProjectNameSDK
31
40
 
32
41
  _options = _utility.MakeOptions(_rootctx);
33
42
 
34
- if (Equals(StructUtils.GetPath(_options,
35
- StructUtils.Jt("feature", "test", "active")), true))
43
+ if (Equals(global::Voxgig.Struct.StructUtils.GetPath(_options,
44
+ global::Voxgig.Struct.StructUtils.Jt("feature", "test", "active")), true))
36
45
  {
37
46
  Mode = "test";
38
47
  }
@@ -45,25 +54,25 @@ public class ProjectNameSDK
45
54
  // features (retry/cache/netsim/proxy/ratelimit) wrap whatever is
46
55
  // current, so `test` must be added before them to sit at the base of
47
56
  // the chain.
48
- var featureOpts = Helpers.ToMapAny(StructUtils.GetProp(_options, "feature"))
57
+ var featureOpts = global::ProjectNameSdk.Helpers.ToMapAny(global::Voxgig.Struct.StructUtils.GetProp(_options, "feature"))
49
58
  ?? new Dictionary<string, object?>();
50
- var featureOrder = StructUtils.GetPath(_options,
51
- StructUtils.Jt("__derived__", "featureorder")) as List<object?>
59
+ var featureOrder = global::Voxgig.Struct.StructUtils.GetPath(_options,
60
+ global::Voxgig.Struct.StructUtils.Jt("__derived__", "featureorder")) as List<object?>
52
61
  ?? new List<object?>();
53
62
  foreach (var fnameObj in featureOrder)
54
63
  {
55
64
  var fname = fnameObj as string ?? "";
56
- var fopts = Helpers.ToMapAny(StructUtils.GetProp(featureOpts, fname));
65
+ var fopts = global::ProjectNameSdk.Helpers.ToMapAny(global::Voxgig.Struct.StructUtils.GetProp(featureOpts, fname));
57
66
  if (fopts != null &&
58
67
  fopts.TryGetValue("active", out var active) &&
59
68
  active is bool ab && ab)
60
69
  {
61
- _utility.FeatureAdd(_rootctx, SdkConfig.MakeFeature(fname));
70
+ _utility.FeatureAdd(_rootctx, global::ProjectNameSdk.SdkConfig.MakeFeature(fname));
62
71
  }
63
72
  }
64
73
 
65
74
  // Add extension features.
66
- if (StructUtils.GetProp(_options, "extend") is List<object?> extList)
75
+ if (global::Voxgig.Struct.StructUtils.GetProp(_options, "extend") is List<object?> extList)
67
76
  {
68
77
  foreach (var f in extList)
69
78
  {
@@ -85,13 +94,13 @@ public class ProjectNameSDK
85
94
 
86
95
  public Dictionary<string, object?> OptionsMap()
87
96
  {
88
- return StructUtils.Clone(_options) as Dictionary<string, object?>
97
+ return global::Voxgig.Struct.StructUtils.Clone(_options) as Dictionary<string, object?>
89
98
  ?? new Dictionary<string, object?>();
90
99
  }
91
100
 
92
101
  public Utility GetUtility()
93
102
  {
94
- return Utility.Copy(_utility);
103
+ return global::ProjectNameSdk.Utility.Copy(_utility);
95
104
  }
96
105
 
97
106
  public Context GetRootCtx()
@@ -105,7 +114,7 @@ public class ProjectNameSDK
105
114
 
106
115
  fetchargs ??= new Dictionary<string, object?>();
107
116
 
108
- var ctrl = Helpers.ToMapAny(StructUtils.GetProp(fetchargs, "ctrl"))
117
+ var ctrl = global::ProjectNameSdk.Helpers.ToMapAny(global::Voxgig.Struct.StructUtils.GetProp(fetchargs, "ctrl"))
109
118
  ?? new Dictionary<string, object?>();
110
119
 
111
120
  var ctx = utility.MakeContext(new Dictionary<string, object?>
@@ -116,23 +125,23 @@ public class ProjectNameSDK
116
125
 
117
126
  var options = _options;
118
127
 
119
- var path = StructUtils.GetProp(fetchargs, "path") as string ?? "";
120
- var method = StructUtils.GetProp(fetchargs, "method") as string ?? "";
128
+ var path = global::Voxgig.Struct.StructUtils.GetProp(fetchargs, "path") as string ?? "";
129
+ var method = global::Voxgig.Struct.StructUtils.GetProp(fetchargs, "method") as string ?? "";
121
130
  if (method == "")
122
131
  {
123
132
  method = "GET";
124
133
  }
125
134
 
126
- var pathParams = Helpers.ToMapAny(StructUtils.GetProp(fetchargs, "params"))
135
+ var pathParams = global::ProjectNameSdk.Helpers.ToMapAny(global::Voxgig.Struct.StructUtils.GetProp(fetchargs, "params"))
127
136
  ?? new Dictionary<string, object?>();
128
- var query = Helpers.ToMapAny(StructUtils.GetProp(fetchargs, "query"))
137
+ var query = global::ProjectNameSdk.Helpers.ToMapAny(global::Voxgig.Struct.StructUtils.GetProp(fetchargs, "query"))
129
138
  ?? new Dictionary<string, object?>();
130
139
 
131
140
  var headers = utility.PrepareHeaders(ctx);
132
141
 
133
- var basev = StructUtils.GetProp(options, "base") as string ?? "";
134
- var prefix = StructUtils.GetProp(options, "prefix") as string ?? "";
135
- var suffix = StructUtils.GetProp(options, "suffix") as string ?? "";
142
+ var basev = global::Voxgig.Struct.StructUtils.GetProp(options, "base") as string ?? "";
143
+ var prefix = global::Voxgig.Struct.StructUtils.GetProp(options, "prefix") as string ?? "";
144
+ var suffix = global::Voxgig.Struct.StructUtils.GetProp(options, "suffix") as string ?? "";
136
145
 
137
146
  ctx.Spec = new Spec(new Dictionary<string, object?>
138
147
  {
@@ -144,12 +153,12 @@ public class ProjectNameSDK
144
153
  ["params"] = pathParams,
145
154
  ["query"] = query,
146
155
  ["headers"] = headers,
147
- ["body"] = StructUtils.GetProp(fetchargs, "body"),
156
+ ["body"] = global::Voxgig.Struct.StructUtils.GetProp(fetchargs, "body"),
148
157
  ["step"] = "start",
149
158
  });
150
159
 
151
160
  // Merge user-provided headers.
152
- if (StructUtils.GetProp(fetchargs, "headers") is Dictionary<string, object?> uhm)
161
+ if (global::Voxgig.Struct.StructUtils.GetProp(fetchargs, "headers") is Dictionary<string, object?> uhm)
153
162
  {
154
163
  foreach (var kv in uhm)
155
164
  {
@@ -178,13 +187,13 @@ public class ProjectNameSDK
178
187
  // Is this raw-access op permitted by the SDK's allow.op option?
179
188
  private bool OpAllowed(string op)
180
189
  {
181
- return StructUtils.GetPath(_options, StructUtils.Jt("allow", "op"))
190
+ return global::Voxgig.Struct.StructUtils.GetPath(_options, global::Voxgig.Struct.StructUtils.Jt("allow", "op"))
182
191
  is string allow && allow.Contains(op);
183
192
  }
184
193
 
185
194
  private Dictionary<string, object?> OpDenied(string op)
186
195
  {
187
- var allow = StructUtils.GetPath(_options, StructUtils.Jt("allow", "op"))
196
+ var allow = global::Voxgig.Struct.StructUtils.GetPath(_options, global::Voxgig.Struct.StructUtils.Jt("allow", "op"))
188
197
  as string ?? "";
189
198
  return new Dictionary<string, object?>
190
199
  {
@@ -219,7 +228,7 @@ public class ProjectNameSDK
219
228
 
220
229
  fetchargs ??= new Dictionary<string, object?>();
221
230
 
222
- var ctrl = Helpers.ToMapAny(StructUtils.GetProp(fetchargs, "ctrl"))
231
+ var ctrl = global::ProjectNameSdk.Helpers.ToMapAny(global::Voxgig.Struct.StructUtils.GetProp(fetchargs, "ctrl"))
223
232
  ?? new Dictionary<string, object?>();
224
233
 
225
234
  var ctx = utility.MakeContext(new Dictionary<string, object?>
@@ -255,8 +264,8 @@ public class ProjectNameSDK
255
264
 
256
265
  if (fetched is Dictionary<string, object?> fm)
257
266
  {
258
- var status = Helpers.ToInt(StructUtils.GetProp(fm, "status"));
259
- var headers = StructUtils.GetProp(fm, "headers");
267
+ var status = global::ProjectNameSdk.Helpers.ToInt(global::Voxgig.Struct.StructUtils.GetProp(fm, "status"));
268
+ var headers = global::Voxgig.Struct.StructUtils.GetProp(fm, "headers");
260
269
 
261
270
  // No-body responses (204, 304) and explicit zero content-length
262
271
  // must skip JSON parsing - calling json() on an empty body errors.
@@ -264,12 +273,12 @@ public class ProjectNameSDK
264
273
  if (headers is Dictionary<string, object?> hm &&
265
274
  hm.TryGetValue("content-length", out var cl) && cl != null)
266
275
  {
267
- contentLength = StructUtils.Stringify(cl);
276
+ contentLength = global::Voxgig.Struct.StructUtils.Stringify(cl);
268
277
  }
269
278
  var noBody = status == 204 || status == 304 || contentLength == "0";
270
279
 
271
280
  object? jsonData = null;
272
- if (!noBody && StructUtils.GetProp(fm, "json") is Func<object?> jf)
281
+ if (!noBody && global::Voxgig.Struct.StructUtils.GetProp(fm, "json") is Func<object?> jf)
273
282
  {
274
283
  // jf() returns null on parse error in our fetcher.
275
284
  jsonData = jf();
@@ -333,12 +342,12 @@ public class ProjectNameSDK
333
342
  // ok:false with no err — so returning early on status would discard
334
343
  // the server's own diagnostics, which are the only useful part of
335
344
  // that response.
336
- var errors = StructUtils.GetPath(res, StructUtils.Jt("data", "errors"))
345
+ var errors = global::Voxgig.Struct.StructUtils.GetPath(res, global::Voxgig.Struct.StructUtils.Jt("data", "errors"))
337
346
  as List<object?>;
338
347
 
339
348
  if (null != errors && 0 < errors.Count)
340
349
  {
341
- var msg = StructUtils.GetProp(errors[0], "message") as string;
350
+ var msg = global::Voxgig.Struct.StructUtils.GetProp(errors[0], "message") as string;
342
351
  if (string.IsNullOrEmpty(msg))
343
352
  {
344
353
  msg = "graphql error";
@@ -356,14 +365,14 @@ public class ProjectNameSDK
356
365
  public static ProjectNameSDK TestSDK(Dictionary<string, object?>? testopts,
357
366
  Dictionary<string, object?>? sdkopts)
358
367
  {
359
- sdkopts = StructUtils.Clone(sdkopts ?? new Dictionary<string, object?>())
368
+ sdkopts = global::Voxgig.Struct.StructUtils.Clone(sdkopts ?? new Dictionary<string, object?>())
360
369
  as Dictionary<string, object?> ?? new Dictionary<string, object?>();
361
370
 
362
- testopts = StructUtils.Clone(testopts ?? new Dictionary<string, object?>())
371
+ testopts = global::Voxgig.Struct.StructUtils.Clone(testopts ?? new Dictionary<string, object?>())
363
372
  as Dictionary<string, object?> ?? new Dictionary<string, object?>();
364
373
  testopts["active"] = true;
365
374
 
366
- StructUtils.SetPath(sdkopts, StructUtils.Jt("feature", "test"), testopts);
375
+ global::Voxgig.Struct.StructUtils.SetPath(sdkopts, global::Voxgig.Struct.StructUtils.Jt("feature", "test"), testopts);
367
376
 
368
377
  var sdk = new ProjectNameSDK(sdkopts)
369
378
  {
@@ -7,6 +7,7 @@ import {
7
7
  pkgDescription,
8
8
  keywords,
9
9
  repoInfo,
10
+ packageVersion,
10
11
  } from '@voxgig/sdkgen'
11
12
 
12
13
 
@@ -39,7 +40,7 @@ const Package = cmp(async function Package(props: any) {
39
40
  Content(`name: ${dartPackageName(model)}
40
41
  description: >-
41
42
  ${pkgDescription(model, target.name)}
42
- version: 0.0.1
43
+ version: ${packageVersion(model, target.name)}
43
44
  homepage: ${repoUrl}
44
45
  repository: ${repoUrl}
45
46
  issue_tracker: ${issuesUrl}
@@ -1,5 +1,5 @@
1
1
 
2
- import { cmp, each, Content, canonToType, canonKey, entityIdField, opRequestShape, safeVarName, exampleVarName } from '@voxgig/sdkgen'
2
+ import { cmp, each, Content, canonToType, canonKey, entityIdField, opRequestShape, safeVarName, exampleVarName, matchArg, idLiteral } from '@voxgig/sdkgen'
3
3
 
4
4
  import {
5
5
  KIT,
@@ -22,6 +22,17 @@ function dartLit(type: any, placeholder: string = 'example'): string {
22
22
 
23
23
 
24
24
  // Op method spellings + descriptions (language-agnostic wording).
25
+ // A `list()` on a NESTED entity needs its parent path params. The
26
+ // quickstart used to emit `client.Moon().list()` for an entity at
27
+ // `/planet/{planet_id}/moon`, which 404s against a live server from a
28
+ // half-built URL — indistinguishable from "no such record". The model
29
+ // already marks those params `reqd: true`; matchArg renders exactly them.
30
+ function listMatchArg(ent: any): string {
31
+ const idF = entityIdField(ent)
32
+ return matchArg('ts', ent, 'list', idF, idLiteral(ent, 'list', idF))
33
+ }
34
+
35
+
25
36
  const OP_DESC: Record<string, { method: string, desc: string }> = {
26
37
  load: { method: 'load(match)', desc: 'Load a single entity by match criteria.' },
27
38
  list: { method: 'list()', desc: 'List entities, optionally matching the given criteria.' },
@@ -132,7 +143,7 @@ final ${eVar} = await client.${entity.Name}().load(${loadArg});
132
143
  Content(`#### Example: List
133
144
 
134
145
  \`\`\`dart
135
- final ${eVar}s = await client.${entity.Name}().list();
146
+ final ${eVar}s = await client.${entity.Name}().list(${listMatchArg(entity)});
136
147
  \`\`\`
137
148
 
138
149
  `)
@@ -46,7 +46,8 @@ const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
46
46
  // The op-driven test-mode line, shown only when the SDK has an entity op.
47
47
  // A direct()-only SDK (no ops anywhere) shows a direct() call instead.
48
48
  const testModeExample = primaryOp
49
- ? `// Entity ops return the bare record and throw on error.
49
+ ? `// Entity ops return the ENTITY and throws on error;
50
+ // call data() for the record.
50
51
  final ${eVar} = await client.${eName}().${primaryOp}(${testArg});
51
52
  // ${eVar} contains the mock response record
52
53
  print(${eVar});`