@voxgig/sdkgen 2.0.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/bin/voxgig-sdkgen +22 -2
  2. package/dist/action/doctor.d.ts +14 -0
  3. package/dist/action/doctor.js +296 -0
  4. package/dist/action/doctor.js.map +1 -0
  5. package/dist/action/feature.js +48 -9
  6. package/dist/action/feature.js.map +1 -1
  7. package/dist/action/target.d.ts +6 -1
  8. package/dist/action/target.js +134 -22
  9. package/dist/action/target.js.map +1 -1
  10. package/dist/cmp/Entity.js +5 -0
  11. package/dist/cmp/Entity.js.map +1 -1
  12. package/dist/cmp/Feature.js +2 -1
  13. package/dist/cmp/Feature.js.map +1 -1
  14. package/dist/cmp/Main.js +5 -1
  15. package/dist/cmp/Main.js.map +1 -1
  16. package/dist/cmp/ReadmeExplanation.js +1 -1
  17. package/dist/cmp/ReadmeExplanation.js.map +1 -1
  18. package/dist/cmp/ReadmeTop.js +16 -6
  19. package/dist/cmp/ReadmeTop.js.map +1 -1
  20. package/dist/cmp/Registered.d.ts +7 -0
  21. package/dist/cmp/Registered.js +70 -0
  22. package/dist/cmp/Registered.js.map +1 -0
  23. package/dist/cmp/Test.js +3 -1
  24. package/dist/cmp/Test.js.map +1 -1
  25. package/dist/helpers/dryrun.d.ts +10 -0
  26. package/dist/helpers/dryrun.js +35 -0
  27. package/dist/helpers/dryrun.js.map +1 -0
  28. package/dist/helpers/featureSource.d.ts +13 -0
  29. package/dist/helpers/featureSource.js +156 -0
  30. package/dist/helpers/featureSource.js.map +1 -0
  31. package/dist/helpers/naming.d.ts +9 -1
  32. package/dist/helpers/naming.js +66 -2
  33. package/dist/helpers/naming.js.map +1 -1
  34. package/dist/helpers/opExample.js +23 -3
  35. package/dist/helpers/opExample.js.map +1 -1
  36. package/dist/helpers/opShape.d.ts +11 -1
  37. package/dist/helpers/opShape.js +51 -0
  38. package/dist/helpers/opShape.js.map +1 -1
  39. package/dist/helpers/packageMeta.d.ts +8 -1
  40. package/dist/helpers/packageMeta.js +141 -10
  41. package/dist/helpers/packageMeta.js.map +1 -1
  42. package/dist/helpers/stdrep.d.ts +3 -0
  43. package/dist/helpers/stdrep.js +47 -0
  44. package/dist/helpers/stdrep.js.map +1 -0
  45. package/dist/helpers/testPolicy.d.ts +2 -0
  46. package/dist/helpers/testPolicy.js +46 -0
  47. package/dist/helpers/testPolicy.js.map +1 -0
  48. package/dist/sdkgen.d.ts +15 -6
  49. package/dist/sdkgen.js +45 -4
  50. package/dist/sdkgen.js.map +1 -1
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/model/sdkgen.aontu +125 -0
  53. package/package.json +8 -5
  54. package/project/.sdk/model/target/c.aontu +28 -3
  55. package/project/.sdk/model/target/clojure.aontu +24 -3
  56. package/project/.sdk/model/target/cpp.aontu +25 -3
  57. package/project/.sdk/model/target/csharp.aontu +25 -3
  58. package/project/.sdk/model/target/dart.aontu +15 -3
  59. package/project/.sdk/model/target/elixir.aontu +15 -3
  60. package/project/.sdk/model/target/go-cli.aontu +17 -1
  61. package/project/.sdk/model/target/go-mcp.aontu +17 -1
  62. package/project/.sdk/model/target/go.aontu +14 -4
  63. package/project/.sdk/model/target/haskell.aontu +24 -3
  64. package/project/.sdk/model/target/java.aontu +26 -3
  65. package/project/.sdk/model/target/js.aontu +15 -3
  66. package/project/.sdk/model/target/kotlin.aontu +26 -3
  67. package/project/.sdk/model/target/lean.aontu +25 -3
  68. package/project/.sdk/model/target/lua.aontu +15 -3
  69. package/project/.sdk/model/target/ocaml.aontu +24 -3
  70. package/project/.sdk/model/target/perl.aontu +15 -3
  71. package/project/.sdk/model/target/php.aontu +15 -3
  72. package/project/.sdk/model/target/py-data.aontu +16 -3
  73. package/project/.sdk/model/target/py.aontu +15 -3
  74. package/project/.sdk/model/target/rb.aontu +15 -3
  75. package/project/.sdk/model/target/rust.aontu +25 -3
  76. package/project/.sdk/model/target/scala.aontu +25 -3
  77. package/project/.sdk/model/target/swift.aontu +25 -3
  78. package/project/.sdk/model/target/ts.aontu +15 -3
  79. package/project/.sdk/model/target/zig.aontu +26 -3
  80. package/project/.sdk/src/cmp/c/Config_c.ts +10 -11
  81. package/project/.sdk/src/cmp/c/Entity_c.ts +5 -1
  82. package/project/.sdk/src/cmp/c/fragment/Entity.fragment.c +23 -5
  83. package/project/.sdk/src/cmp/c/fragment/EntityCreateOp.fragment.c +9 -2
  84. package/project/.sdk/src/cmp/c/fragment/EntityListOp.fragment.c +19 -2
  85. package/project/.sdk/src/cmp/c/fragment/EntityLoadOp.fragment.c +9 -2
  86. package/project/.sdk/src/cmp/c/fragment/EntityRemoveOp.fragment.c +12 -2
  87. package/project/.sdk/src/cmp/c/fragment/EntityUpdateOp.fragment.c +9 -2
  88. package/project/.sdk/src/cmp/c/fragment/Main.fragment.c +1 -0
  89. package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +6 -3
  90. package/project/.sdk/src/cmp/clojure/fragment/Entity.fragment.clj +18 -1
  91. package/project/.sdk/src/cmp/clojure/fragment/EntityCreateOp.fragment.clj +2 -2
  92. package/project/.sdk/src/cmp/clojure/fragment/EntityLoadOp.fragment.clj +2 -2
  93. package/project/.sdk/src/cmp/clojure/fragment/EntityRemoveOp.fragment.clj +12 -8
  94. package/project/.sdk/src/cmp/clojure/fragment/EntityUpdateOp.fragment.clj +2 -2
  95. package/project/.sdk/src/cmp/cpp/Entity_cpp.ts +5 -1
  96. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +24 -11
  97. package/project/.sdk/src/cmp/cpp/fragment/EntityCreateOp.fragment.cpp +8 -2
  98. package/project/.sdk/src/cmp/cpp/fragment/EntityListOp.fragment.cpp +18 -2
  99. package/project/.sdk/src/cmp/cpp/fragment/EntityLoadOp.fragment.cpp +8 -2
  100. package/project/.sdk/src/cmp/cpp/fragment/EntityRemoveOp.fragment.cpp +11 -2
  101. package/project/.sdk/src/cmp/cpp/fragment/EntityUpdateOp.fragment.cpp +8 -2
  102. package/project/.sdk/src/cmp/csharp/Package_csharp.ts +2 -1
  103. package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +3 -3
  104. package/project/.sdk/src/cmp/csharp/TestEntity_csharp.ts +6 -6
  105. package/project/.sdk/src/cmp/csharp/fragment/EntityBase.fragment.cs +38 -1
  106. package/project/.sdk/src/cmp/csharp/fragment/Main.fragment.cs +42 -33
  107. package/project/.sdk/src/cmp/dart/Config_dart.ts +6 -0
  108. package/project/.sdk/src/cmp/dart/Package_dart.ts +2 -1
  109. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +13 -2
  110. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +2 -1
  111. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +3 -3
  112. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +1 -1
  113. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +17 -6
  114. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +13 -2
  115. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +13 -2
  116. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +3 -3
  117. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +8 -8
  118. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +18 -1
  119. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +9 -1
  120. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +9 -1
  121. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +15 -1
  122. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +9 -1
  123. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +8 -0
  124. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
  125. package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +2 -2
  126. package/project/.sdk/src/cmp/elixir/ReadmeTopQuick_elixir.ts +7 -4
  127. package/project/.sdk/src/cmp/elixir/TestEntity_elixir.ts +11 -2
  128. package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +2 -1
  129. package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +1 -0
  130. package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +2 -1
  131. package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -1
  132. package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +2 -1
  133. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +38 -8
  134. package/project/.sdk/src/cmp/go/Entity_go.ts +2 -2
  135. package/project/.sdk/src/cmp/go/Main_go.ts +4 -5
  136. package/project/.sdk/src/cmp/go/Package_go.ts +8 -5
  137. package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +2 -2
  138. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +2 -2
  139. package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +4 -2
  140. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +2 -2
  141. package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +2 -2
  142. package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +2 -2
  143. package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +2 -2
  144. package/project/.sdk/src/cmp/go/TestDirect_go.ts +21 -15
  145. package/project/.sdk/src/cmp/go/TestEntity_go.ts +9 -9
  146. package/project/.sdk/src/cmp/go/Test_go.ts +2 -2
  147. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +42 -1
  148. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +4 -4
  149. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +4 -4
  150. package/project/.sdk/src/cmp/haskell/Package_haskell.ts +2 -1
  151. package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +10 -5
  152. package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +10 -8
  153. package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +14 -10
  154. package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +21 -18
  155. package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +4 -4
  156. package/project/.sdk/src/cmp/haskell/Test_haskell.ts +23 -11
  157. package/project/.sdk/src/cmp/java/Package_java.ts +2 -1
  158. package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +2 -1
  159. package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +2 -2
  160. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +1 -1
  161. package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +3 -3
  162. package/project/.sdk/src/cmp/java/TestDirect_java.ts +3 -3
  163. package/project/.sdk/src/cmp/java/TestEntity_java.ts +6 -6
  164. package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +34 -1
  165. package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +12 -0
  166. package/project/.sdk/src/cmp/js/Main_js.ts +4 -1
  167. package/project/.sdk/src/cmp/js/Package_js.ts +7 -1
  168. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -2
  169. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +2 -1
  170. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +13 -2
  171. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +13 -2
  172. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +2 -1
  173. package/project/.sdk/src/cmp/js/TestDirect_js.ts +3 -3
  174. package/project/.sdk/src/cmp/js/TestEntity_js.ts +8 -8
  175. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +22 -1
  176. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +9 -1
  177. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +9 -1
  178. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +15 -1
  179. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +9 -1
  180. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +13 -0
  181. package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +2 -1
  182. package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +2 -1
  183. package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +2 -2
  184. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +1 -1
  185. package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +3 -3
  186. package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +3 -3
  187. package/project/.sdk/src/cmp/kotlin/TestEntity_kotlin.ts +6 -6
  188. package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +32 -1
  189. package/project/.sdk/src/cmp/lean/Package_lean.ts +3 -1
  190. package/project/.sdk/src/cmp/lean/Test_lean.ts +75 -21
  191. package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +9 -4
  192. package/project/.sdk/src/cmp/lua/Package_lua.ts +4 -3
  193. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +11 -3
  194. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +1 -1
  195. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +3 -3
  196. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +9 -9
  197. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +37 -1
  198. package/project/.sdk/src/cmp/lua/fragment/SdkError.fragment.lua +12 -0
  199. package/project/.sdk/src/cmp/ocaml/EntityOperation_ocaml.ts +30 -3
  200. package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +11 -5
  201. package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +3 -1
  202. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +10 -5
  203. package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +6 -2
  204. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +10 -8
  205. package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +14 -13
  206. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +20 -18
  207. package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +4 -4
  208. package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +8 -2
  209. package/project/.sdk/src/cmp/ocaml/TestEntity_ocaml.ts +8 -5
  210. package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +2 -1
  211. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +1 -1
  212. package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +3 -3
  213. package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +1 -1
  214. package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +3 -3
  215. package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +6 -6
  216. package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +36 -1
  217. package/project/.sdk/src/cmp/php/MainEntity_php.ts +21 -16
  218. package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
  219. package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +6 -6
  220. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +4 -3
  221. package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +2 -2
  222. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +1 -1
  223. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +12 -12
  224. package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +6 -6
  225. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +4 -4
  226. package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +2 -2
  227. package/project/.sdk/src/cmp/php/TestDirect_php.ts +3 -3
  228. package/project/.sdk/src/cmp/php/TestEntity_php.ts +17 -15
  229. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +20 -1
  230. package/project/.sdk/src/cmp/php/fragment/SdkError.fragment.php +11 -0
  231. package/project/.sdk/src/cmp/py/Package_py.ts +4 -3
  232. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +13 -2
  233. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +2 -1
  234. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +1 -1
  235. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +17 -6
  236. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +14 -3
  237. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +13 -2
  238. package/project/.sdk/src/cmp/py/TestDirect_py.ts +3 -3
  239. package/project/.sdk/src/cmp/py/TestEntity_py.ts +9 -9
  240. package/project/.sdk/src/cmp/py/Test_py.ts +4 -1
  241. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +29 -1
  242. package/project/.sdk/src/cmp/py/fragment/SdkError.fragment.py +11 -0
  243. package/project/.sdk/src/cmp/py-data/Main_py-data.ts +2 -1
  244. package/project/.sdk/src/cmp/rb/Package_rb.ts +4 -3
  245. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +1 -1
  246. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +2 -1
  247. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +5 -5
  248. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +1 -1
  249. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +3 -3
  250. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +9 -9
  251. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +31 -1
  252. package/project/.sdk/src/cmp/rb/fragment/SdkError.fragment.rb +10 -1
  253. package/project/.sdk/src/cmp/rust/Entity_rust.ts +5 -1
  254. package/project/.sdk/src/cmp/rust/Main_rust.ts +21 -0
  255. package/project/.sdk/src/cmp/rust/Package_rust.ts +2 -1
  256. package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +3 -3
  257. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +12 -12
  258. package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +18 -0
  259. package/project/.sdk/src/cmp/rust/fragment/EntityCreateOp.fragment.rs +8 -2
  260. package/project/.sdk/src/cmp/rust/fragment/EntityListOp.fragment.rs +20 -3
  261. package/project/.sdk/src/cmp/rust/fragment/EntityLoadOp.fragment.rs +8 -2
  262. package/project/.sdk/src/cmp/rust/fragment/EntityRemoveOp.fragment.rs +10 -2
  263. package/project/.sdk/src/cmp/rust/fragment/EntityUpdateOp.fragment.rs +8 -2
  264. package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +10 -0
  265. package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +2 -1
  266. package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +3 -3
  267. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +1 -1
  268. package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +3 -3
  269. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +3 -3
  270. package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +27 -1
  271. package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +2 -1
  272. package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +3 -3
  273. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +1 -1
  274. package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +3 -3
  275. package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +34 -1
  276. package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +9 -1
  277. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +18 -1
  278. package/project/.sdk/src/cmp/ts/Gitignore_ts.ts +5 -2
  279. package/project/.sdk/src/cmp/ts/Main_ts.ts +4 -1
  280. package/project/.sdk/src/cmp/ts/Package_ts.ts +10 -1
  281. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -2
  282. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +2 -1
  283. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +21 -6
  284. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +52 -2
  285. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +14 -3
  286. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +34 -2
  287. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +64 -43
  288. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +8 -8
  289. package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +2 -2
  290. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +2 -2
  291. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +25 -1
  292. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +10 -2
  293. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +1 -1
  294. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +10 -2
  295. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +27 -3
  296. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +10 -2
  297. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +15 -0
  298. package/project/.sdk/src/cmp/zig/Entity_zig.ts +5 -1
  299. package/project/.sdk/src/cmp/zig/Package_zig.ts +3 -1
  300. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +39 -0
  301. package/project/.sdk/src/cmp/zig/fragment/EntityCreateOp.fragment.zig +2 -2
  302. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +21 -2
  303. package/project/.sdk/src/cmp/zig/fragment/EntityLoadOp.fragment.zig +2 -2
  304. package/project/.sdk/src/cmp/zig/fragment/EntityRemoveOp.fragment.zig +5 -2
  305. package/project/.sdk/src/cmp/zig/fragment/EntityUpdateOp.fragment.zig +2 -2
  306. package/project/.sdk/tm/c/VERSION +1 -1
  307. package/project/.sdk/tm/c/core/helpers.c +1 -0
  308. package/project/.sdk/tm/c/core/sdk.h +22 -6
  309. package/project/.sdk/tm/c/tests/feature_harness.h +1 -0
  310. package/project/.sdk/tm/c/tests/primary_utility_test.c +4 -1
  311. package/project/.sdk/tm/c/utility/graphql.c +1 -1
  312. package/project/.sdk/tm/c/utility/make_url.c +1 -0
  313. package/project/.sdk/tm/c/utility/param.c +1 -0
  314. package/project/.sdk/tm/clojure/VERSION +1 -1
  315. package/project/.sdk/tm/cpp/VERSION +1 -1
  316. package/project/.sdk/tm/cpp/core/types.hpp +33 -8
  317. package/project/.sdk/tm/cpp/test/pipeline_test.cpp +5 -0
  318. package/project/.sdk/tm/cpp/test/runner_support.hpp +4 -4
  319. package/project/.sdk/tm/csharp/VERSION +1 -1
  320. package/project/.sdk/tm/csharp/core/Types.cs +6 -0
  321. package/project/.sdk/tm/csharp/test/FeatureHarness.cs +396 -0
  322. package/project/.sdk/tm/csharp/test/FeatureTest.cs +7 -385
  323. package/project/.sdk/tm/csharp/test/Runner.cs +4 -4
  324. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +4 -0
  325. package/project/.sdk/tm/dart/test/utility.dart +4 -4
  326. package/project/.sdk/tm/elixir/VERSION +1 -1
  327. package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +26 -0
  328. package/project/.sdk/tm/go/VERSION +1 -1
  329. package/project/.sdk/tm/go/core/types.go +6 -0
  330. package/project/.sdk/tm/go/test/feature_harness_test.go +361 -0
  331. package/project/.sdk/tm/go/test/feature_test.go +7 -350
  332. package/project/.sdk/tm/go/test/pipeline_test.go +6 -0
  333. package/project/.sdk/tm/go/test/runner_test.go +16 -4
  334. package/project/.sdk/tm/haskell/VERSION +1 -1
  335. package/project/.sdk/tm/haskell/src/SdkFeatures.hs +28 -5
  336. package/project/.sdk/tm/haskell/src/SdkTypes.hs +14 -5
  337. package/project/.sdk/tm/java/VERSION +1 -1
  338. package/project/.sdk/tm/java/test/RunnerSupport.java +4 -4
  339. package/project/.sdk/tm/java/utility/MakeError.java +4 -0
  340. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +4 -0
  341. package/project/.sdk/tm/js/test/utility.js +3 -3
  342. package/project/.sdk/tm/kotlin/VERSION +1 -1
  343. package/project/.sdk/tm/kotlin/core/Utility.kt +2 -0
  344. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +3 -3
  345. package/project/.sdk/tm/lean/Makefile +25 -0
  346. package/project/.sdk/tm/lean/VERSION +1 -1
  347. package/project/.sdk/tm/lean/src/SdkUtility.lean +11 -9
  348. package/project/.sdk/tm/lean/test/TFeature.lean +27 -14
  349. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +5 -2
  350. package/project/.sdk/tm/lua/test/runner.lua +4 -4
  351. package/project/.sdk/tm/lua/utility/make_error.lua +4 -0
  352. package/project/.sdk/tm/ocaml/VERSION +1 -1
  353. package/project/.sdk/tm/ocaml/sdk_types.ml +14 -5
  354. package/project/.sdk/tm/ocaml/test/t_pipeline.ml +5 -2
  355. package/project/.sdk/tm/perl/t/runner.pm +4 -4
  356. package/project/.sdk/tm/php/VERSION +1 -1
  357. package/project/.sdk/tm/php/test/Runner.php +4 -4
  358. package/project/.sdk/tm/php/utility/MakeError.php +5 -0
  359. package/project/.sdk/tm/py/pkg/utility/make_error.py +4 -0
  360. package/project/.sdk/tm/py/test/runner.py +19 -4
  361. package/project/.sdk/tm/rb/test/runner.rb +4 -4
  362. package/project/.sdk/tm/rb/utility/make_error.rb +4 -0
  363. package/project/.sdk/tm/rust/VERSION +1 -1
  364. package/project/.sdk/tm/rust/core/types.rs +22 -6
  365. package/project/.sdk/tm/rust/tests/common/mod.rs +6 -6
  366. package/project/.sdk/tm/rust/tests/pipeline_test.rs +6 -0
  367. package/project/.sdk/tm/rust/utility/make_error.rs +4 -0
  368. package/project/.sdk/tm/scala/VERSION +1 -1
  369. package/project/.sdk/tm/swift/VERSION +1 -1
  370. package/project/.sdk/tm/ts/src/tsconfig.json +1 -0
  371. package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +4 -0
  372. package/project/.sdk/tm/ts/test/tsconfig.json +1 -0
  373. package/project/.sdk/tm/ts/test/utility.ts +3 -3
  374. package/project/.sdk/tm/zig/VERSION +1 -1
  375. package/src/action/doctor.ts +410 -0
  376. package/src/action/feature.ts +54 -16
  377. package/src/action/target.ts +174 -25
  378. package/src/cmp/Entity.ts +7 -0
  379. package/src/cmp/Feature.ts +3 -1
  380. package/src/cmp/Main.ts +7 -1
  381. package/src/cmp/ReadmeExplanation.ts +2 -2
  382. package/src/cmp/ReadmeTop.ts +22 -9
  383. package/src/cmp/Registered.ts +100 -0
  384. package/src/cmp/Test.ts +4 -1
  385. package/src/helpers/dryrun.ts +57 -0
  386. package/src/helpers/featureSource.ts +208 -0
  387. package/src/helpers/naming.ts +73 -2
  388. package/src/helpers/opExample.ts +19 -2
  389. package/src/helpers/opShape.ts +65 -0
  390. package/src/helpers/packageMeta.ts +163 -10
  391. package/src/helpers/stdrep.ts +56 -0
  392. package/src/helpers/testPolicy.ts +52 -0
  393. package/src/sdkgen.ts +70 -4
  394. package/project/.sdk/tm/rust/feature/mod.rs +0 -24
@@ -45,7 +45,11 @@ const Entity = cmp(function Entity(props: any) {
45
45
  ({ indent }: any) => {
46
46
  const arg = ('create' === opname || 'update' === opname) ?
47
47
  'reqdata' : 'reqmatch'
48
- Content({ indent }, `Value ${opname}(const Value& ${arg}, const Value& ctrl) override {
48
+ // The stub mirrors the real signature: ops resolve to the
49
+ // ENTITY (`list` to a vector of them), so an unsupported op
50
+ // has to declare the same return type to satisfy SdkEntity.
51
+ const ret = 'list' === opname ? 'std::vector<SdkEntityPtr>' : 'SdkEntityPtr'
52
+ Content({ indent }, `${ret} ${opname}(const Value& ${arg}, const Value& ctrl) override {
49
53
  (void)${arg}; (void)ctrl;
50
54
  throw Helpers::unsupportedOp("${opname}", this->name_);
51
55
  }
@@ -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
 
@@ -148,6 +148,14 @@ static void ${evar}_entity_instance() {
148
148
  ASSERT_EQ(ent->getName(), std::string("${entity.name}"), "entity name");
149
149
  }
150
150
 
151
+ `)
152
+
153
+ // The stream test drives the list op; only emit it when the entity has a
154
+ // list op (a create/load-only entity has no list endpoint, so
155
+ // stream("list") throws "Operation \"list\" has no endpoint definitions").
156
+ const flowHasList = allSteps.some((s: any) => 'list' === s.op)
157
+ if (flowHasList) {
158
+ Content(`
151
159
  static void ${evar}_entity_stream() {
152
160
  // stream() runs the list op through the full pipeline and returns the
153
161
  // result items. Seed two entities via test mode; with the streaming feature
@@ -169,7 +177,10 @@ static void ${evar}_entity_stream() {
169
177
  std::vector<Value> pitems = pe->stream("list", Value::undef(), Value::undef());
170
178
  ASSERT_EQ((int)pitems.size(), 2, "fallback stream yields both items");
171
179
  }
180
+ `)
181
+ }
172
182
 
183
+ Content(`
173
184
  static void ${evar}_entity_basic() {
174
185
  auto setup = ${evar}_basic_setup(Value::undef());
175
186
  std::string mode = setup.live ? "live" : "unit";
@@ -212,8 +223,7 @@ static void ${evar}_entity_basic() {
212
223
 
213
224
  int main() {
214
225
  T_RUN(${evar}_entity_instance);
215
- T_RUN(${evar}_entity_stream);
216
- T_RUN(${evar}_entity_basic);
226
+ ${flowHasList ? ` T_RUN(${evar}_entity_stream);\n` : ''} T_RUN(${evar}_entity_basic);
217
227
  return sdktest::summary("${entity.name}_entity_test");
218
228
  }
219
229
  `)
@@ -254,7 +264,7 @@ const generateCreate: OpGen = (ctx, step: any, index) => {
254
264
  }
255
265
 
256
266
  Content(` {
257
- Value ${datavar}_result = ${entvar}->create(Struct::clone(${datavar}), Value::undef());
267
+ Value ${datavar}_result = ${entvar}->create(Struct::clone(${datavar}), Value::undef())->data();
258
268
  ${datavar} = Helpers::toMapAny(${datavar}_result);
259
269
  if (!${datavar}.is_map()) ${datavar} = vmap();
260
270
  ASSERT_TRUE(${datavar}.is_map(), "expected create result to be a map");
@@ -292,7 +302,10 @@ const generateList: OpGen = (ctx, step: any, index) => {
292
302
  Content(` setp(${matchvar}, "${key}", getp(setup.idmap, "${val}"));
293
303
  `)
294
304
  }
295
- 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()); }
296
309
  ASSERT_TRUE(${listvar}.is_list(), "expected list result to be an array");
297
310
  `)
298
311
 
@@ -368,7 +381,7 @@ const generateUpdate: OpGen = (ctx, step: any, index) => {
368
381
  }
369
382
  }
370
383
  }
371
- 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();
372
385
  Value ${resdatavar} = Helpers::toMapAny(${resdatavar}_result);
373
386
  if (!${resdatavar}.is_map()) ${resdatavar} = vmap();
374
387
  ASSERT_TRUE(${resdatavar}.is_map(), "expected update result to be a map");
@@ -405,14 +418,14 @@ const generateLoad: OpGen = (ctx, step: any, index) => {
405
418
  }
406
419
  if (hasEntId) {
407
420
  Content(` Value ${matchvar} = vmap({{"id", getp(${srcdatavar}, "id")}});
408
- Value ${datavar}_loaded = ${entvar}->load(Struct::clone(${matchvar}), Value::undef());
421
+ Value ${datavar}_loaded = ${entvar}->load(Struct::clone(${matchvar}), Value::undef())->data();
409
422
  Value ${datavar}_load_result = Helpers::toMapAny(${datavar}_loaded);
410
423
  ASSERT_TRUE(${datavar}_load_result.is_map(), "expected load result to be a map");
411
424
  ASSERT_EQ_VAL(getp(${datavar}_load_result, "id"), getp(${srcdatavar}, "id"), "expected load result id to match");
412
425
  `)
413
426
  } else {
414
427
  Content(` Value ${matchvar} = vmap();
415
- Value ${datavar}_loaded = ${entvar}->load(${matchvar}, Value::undef());
428
+ Value ${datavar}_loaded = ${entvar}->load(${matchvar}, Value::undef())->data();
416
429
  ASSERT_TRUE(!${datavar}_loaded.is_undef(), "expected load result to be non-nil");
417
430
  `)
418
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
  {
@@ -58,6 +58,12 @@ const Config = cmp(async function Config(props: any) {
58
58
 
59
59
  replace: {
60
60
 
61
+ // Config.fragment.dart carries `'name': 'ProjectName'` — without the
62
+ // standard replacements the generated SDK reports "ProjectName" as its
63
+ // own name at runtime. Every sibling dart component already spreads
64
+ // these; this one did not.
65
+ ...ctx$.stdrep,
66
+
61
67
  "'AUTHBLOCK'": authBlock,
62
68
 
63
69
  "'HEADERS'": dartValue(headers, 2),