@voxgig/sdkgen 2.0.2 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/bin/voxgig-sdkgen +22 -2
  2. package/dist/action/doctor.d.ts +14 -0
  3. package/dist/action/doctor.js +351 -0
  4. package/dist/action/doctor.js.map +1 -0
  5. package/dist/action/feature.js +48 -9
  6. package/dist/action/feature.js.map +1 -1
  7. package/dist/action/target.d.ts +6 -1
  8. package/dist/action/target.js +134 -22
  9. package/dist/action/target.js.map +1 -1
  10. package/dist/cmp/Entity.js +5 -0
  11. package/dist/cmp/Entity.js.map +1 -1
  12. package/dist/cmp/ExternalTarget.d.ts +2 -0
  13. package/dist/cmp/ExternalTarget.js +104 -0
  14. package/dist/cmp/ExternalTarget.js.map +1 -0
  15. package/dist/cmp/Feature.js +2 -1
  16. package/dist/cmp/Feature.js.map +1 -1
  17. package/dist/cmp/Main.js +5 -1
  18. package/dist/cmp/Main.js.map +1 -1
  19. package/dist/cmp/ReadmeExplanation.js +1 -1
  20. package/dist/cmp/ReadmeExplanation.js.map +1 -1
  21. package/dist/cmp/ReadmeTop.js +16 -6
  22. package/dist/cmp/ReadmeTop.js.map +1 -1
  23. package/dist/cmp/Registered.d.ts +7 -0
  24. package/dist/cmp/Registered.js +70 -0
  25. package/dist/cmp/Registered.js.map +1 -0
  26. package/dist/cmp/Test.js +3 -1
  27. package/dist/cmp/Test.js.map +1 -1
  28. package/dist/helpers/dryrun.d.ts +10 -0
  29. package/dist/helpers/dryrun.js +35 -0
  30. package/dist/helpers/dryrun.js.map +1 -0
  31. package/dist/helpers/featureSource.d.ts +13 -0
  32. package/dist/helpers/featureSource.js +156 -0
  33. package/dist/helpers/featureSource.js.map +1 -0
  34. package/dist/helpers/naming.d.ts +9 -1
  35. package/dist/helpers/naming.js +66 -2
  36. package/dist/helpers/naming.js.map +1 -1
  37. package/dist/helpers/opExample.js +23 -3
  38. package/dist/helpers/opExample.js.map +1 -1
  39. package/dist/helpers/opShape.d.ts +11 -1
  40. package/dist/helpers/opShape.js +51 -0
  41. package/dist/helpers/opShape.js.map +1 -1
  42. package/dist/helpers/packageMeta.d.ts +16 -1
  43. package/dist/helpers/packageMeta.js +181 -10
  44. package/dist/helpers/packageMeta.js.map +1 -1
  45. package/dist/helpers/stdrep.d.ts +3 -0
  46. package/dist/helpers/stdrep.js +47 -0
  47. package/dist/helpers/stdrep.js.map +1 -0
  48. package/dist/helpers/testPolicy.d.ts +2 -0
  49. package/dist/helpers/testPolicy.js +46 -0
  50. package/dist/helpers/testPolicy.js.map +1 -0
  51. package/dist/sdkgen.d.ts +15 -6
  52. package/dist/sdkgen.js +273 -5
  53. package/dist/sdkgen.js.map +1 -1
  54. package/dist/tsconfig.tsbuildinfo +1 -1
  55. package/dist/types.d.ts +12 -0
  56. package/dist/utility.js +10 -1
  57. package/dist/utility.js.map +1 -1
  58. package/model/sdkgen.aontu +245 -0
  59. package/package.json +5 -3
  60. package/project/.sdk/model/target/c.aontu +28 -3
  61. package/project/.sdk/model/target/clojure.aontu +24 -3
  62. package/project/.sdk/model/target/cpp.aontu +25 -3
  63. package/project/.sdk/model/target/csharp.aontu +25 -3
  64. package/project/.sdk/model/target/dart.aontu +15 -3
  65. package/project/.sdk/model/target/elixir.aontu +15 -3
  66. package/project/.sdk/model/target/go-cli.aontu +16 -1
  67. package/project/.sdk/model/target/go-mcp.aontu +16 -1
  68. package/project/.sdk/model/target/go.aontu +14 -4
  69. package/project/.sdk/model/target/haskell.aontu +24 -3
  70. package/project/.sdk/model/target/java.aontu +25 -3
  71. package/project/.sdk/model/target/js.aontu +15 -3
  72. package/project/.sdk/model/target/kotlin.aontu +25 -3
  73. package/project/.sdk/model/target/lean.aontu +24 -3
  74. package/project/.sdk/model/target/lua.aontu +15 -3
  75. package/project/.sdk/model/target/ocaml.aontu +24 -3
  76. package/project/.sdk/model/target/perl.aontu +15 -3
  77. package/project/.sdk/model/target/php.aontu +15 -3
  78. package/project/.sdk/model/target/py-data.aontu +15 -3
  79. package/project/.sdk/model/target/py.aontu +15 -3
  80. package/project/.sdk/model/target/rb.aontu +15 -3
  81. package/project/.sdk/model/target/rust.aontu +25 -3
  82. package/project/.sdk/model/target/scala.aontu +24 -3
  83. package/project/.sdk/model/target/seneca-provider.aontu +118 -0
  84. package/project/.sdk/model/target/swift.aontu +25 -3
  85. package/project/.sdk/model/target/ts.aontu +15 -3
  86. package/project/.sdk/model/target/zig.aontu +25 -3
  87. package/project/.sdk/src/cmp/c/Config_c.ts +10 -11
  88. package/project/.sdk/src/cmp/c/Entity_c.ts +5 -1
  89. package/project/.sdk/src/cmp/c/fragment/Entity.fragment.c +23 -5
  90. package/project/.sdk/src/cmp/c/fragment/EntityCreateOp.fragment.c +9 -2
  91. package/project/.sdk/src/cmp/c/fragment/EntityListOp.fragment.c +19 -2
  92. package/project/.sdk/src/cmp/c/fragment/EntityLoadOp.fragment.c +9 -2
  93. package/project/.sdk/src/cmp/c/fragment/EntityRemoveOp.fragment.c +12 -2
  94. package/project/.sdk/src/cmp/c/fragment/EntityUpdateOp.fragment.c +9 -2
  95. package/project/.sdk/src/cmp/c/fragment/Main.fragment.c +1 -0
  96. package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +6 -3
  97. package/project/.sdk/src/cmp/clojure/fragment/Entity.fragment.clj +18 -1
  98. package/project/.sdk/src/cmp/clojure/fragment/EntityCreateOp.fragment.clj +2 -2
  99. package/project/.sdk/src/cmp/clojure/fragment/EntityLoadOp.fragment.clj +2 -2
  100. package/project/.sdk/src/cmp/clojure/fragment/EntityRemoveOp.fragment.clj +12 -8
  101. package/project/.sdk/src/cmp/clojure/fragment/EntityUpdateOp.fragment.clj +2 -2
  102. package/project/.sdk/src/cmp/cpp/Entity_cpp.ts +5 -1
  103. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +12 -9
  104. package/project/.sdk/src/cmp/cpp/fragment/EntityCreateOp.fragment.cpp +8 -2
  105. package/project/.sdk/src/cmp/cpp/fragment/EntityListOp.fragment.cpp +18 -2
  106. package/project/.sdk/src/cmp/cpp/fragment/EntityLoadOp.fragment.cpp +8 -2
  107. package/project/.sdk/src/cmp/cpp/fragment/EntityRemoveOp.fragment.cpp +11 -2
  108. package/project/.sdk/src/cmp/cpp/fragment/EntityUpdateOp.fragment.cpp +8 -2
  109. package/project/.sdk/src/cmp/csharp/Package_csharp.ts +2 -1
  110. package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +3 -3
  111. package/project/.sdk/src/cmp/csharp/TestEntity_csharp.ts +6 -6
  112. package/project/.sdk/src/cmp/csharp/fragment/EntityBase.fragment.cs +38 -1
  113. package/project/.sdk/src/cmp/csharp/fragment/Main.fragment.cs +42 -33
  114. package/project/.sdk/src/cmp/dart/Package_dart.ts +2 -1
  115. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +13 -2
  116. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +2 -1
  117. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +3 -3
  118. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +1 -1
  119. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +17 -6
  120. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +13 -2
  121. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +13 -2
  122. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +3 -3
  123. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +8 -8
  124. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +18 -1
  125. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +9 -1
  126. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +9 -1
  127. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +15 -1
  128. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +9 -1
  129. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +8 -0
  130. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
  131. package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +2 -2
  132. package/project/.sdk/src/cmp/elixir/TestEntity_elixir.ts +11 -2
  133. package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +2 -1
  134. package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +1 -0
  135. package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +2 -1
  136. package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -1
  137. package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +2 -1
  138. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +38 -8
  139. package/project/.sdk/src/cmp/go/Entity_go.ts +2 -2
  140. package/project/.sdk/src/cmp/go/Main_go.ts +4 -5
  141. package/project/.sdk/src/cmp/go/Package_go.ts +8 -5
  142. package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +2 -2
  143. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +2 -2
  144. package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +4 -2
  145. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +2 -2
  146. package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +2 -2
  147. package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +2 -2
  148. package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +2 -2
  149. package/project/.sdk/src/cmp/go/TestDirect_go.ts +21 -15
  150. package/project/.sdk/src/cmp/go/TestEntity_go.ts +9 -9
  151. package/project/.sdk/src/cmp/go/Test_go.ts +2 -2
  152. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +42 -1
  153. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +4 -4
  154. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +4 -4
  155. package/project/.sdk/src/cmp/haskell/Package_haskell.ts +2 -1
  156. package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +10 -5
  157. package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +10 -8
  158. package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +14 -10
  159. package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +21 -18
  160. package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +4 -4
  161. package/project/.sdk/src/cmp/haskell/Test_haskell.ts +23 -11
  162. package/project/.sdk/src/cmp/java/Package_java.ts +2 -1
  163. package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +2 -1
  164. package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +2 -2
  165. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +1 -1
  166. package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +3 -3
  167. package/project/.sdk/src/cmp/java/TestDirect_java.ts +3 -3
  168. package/project/.sdk/src/cmp/java/TestEntity_java.ts +6 -6
  169. package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +34 -1
  170. package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +12 -0
  171. package/project/.sdk/src/cmp/js/Main_js.ts +4 -1
  172. package/project/.sdk/src/cmp/js/Package_js.ts +7 -1
  173. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -2
  174. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +2 -1
  175. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +13 -2
  176. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +13 -2
  177. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +2 -1
  178. package/project/.sdk/src/cmp/js/TestDirect_js.ts +3 -3
  179. package/project/.sdk/src/cmp/js/TestEntity_js.ts +8 -8
  180. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +22 -1
  181. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +9 -1
  182. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +9 -1
  183. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +15 -1
  184. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +9 -1
  185. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +13 -0
  186. package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +2 -1
  187. package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +2 -1
  188. package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +2 -2
  189. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +1 -1
  190. package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +3 -3
  191. package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +3 -3
  192. package/project/.sdk/src/cmp/kotlin/TestEntity_kotlin.ts +6 -6
  193. package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +32 -1
  194. package/project/.sdk/src/cmp/lean/Package_lean.ts +3 -1
  195. package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +9 -4
  196. package/project/.sdk/src/cmp/lua/Package_lua.ts +4 -3
  197. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +11 -3
  198. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +1 -1
  199. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +3 -3
  200. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +9 -9
  201. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +37 -1
  202. package/project/.sdk/src/cmp/lua/fragment/SdkError.fragment.lua +12 -0
  203. package/project/.sdk/src/cmp/ocaml/EntityOperation_ocaml.ts +30 -3
  204. package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +11 -5
  205. package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +3 -1
  206. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +10 -5
  207. package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +6 -2
  208. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +10 -8
  209. package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +14 -13
  210. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +20 -18
  211. package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +4 -4
  212. package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +8 -2
  213. package/project/.sdk/src/cmp/ocaml/TestEntity_ocaml.ts +8 -5
  214. package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +2 -1
  215. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +1 -1
  216. package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +3 -3
  217. package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +1 -1
  218. package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +3 -3
  219. package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +6 -6
  220. package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +36 -1
  221. package/project/.sdk/src/cmp/php/MainEntity_php.ts +21 -16
  222. package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
  223. package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +6 -6
  224. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +4 -3
  225. package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +2 -2
  226. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +1 -1
  227. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +12 -12
  228. package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +6 -6
  229. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +4 -4
  230. package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +2 -2
  231. package/project/.sdk/src/cmp/php/TestDirect_php.ts +3 -3
  232. package/project/.sdk/src/cmp/php/TestEntity_php.ts +17 -15
  233. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +20 -1
  234. package/project/.sdk/src/cmp/php/fragment/SdkError.fragment.php +11 -0
  235. package/project/.sdk/src/cmp/py/Package_py.ts +4 -3
  236. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +13 -2
  237. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +2 -1
  238. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +1 -1
  239. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +17 -6
  240. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +14 -3
  241. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +13 -2
  242. package/project/.sdk/src/cmp/py/TestDirect_py.ts +3 -3
  243. package/project/.sdk/src/cmp/py/TestEntity_py.ts +9 -9
  244. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +29 -1
  245. package/project/.sdk/src/cmp/py/fragment/SdkError.fragment.py +11 -0
  246. package/project/.sdk/src/cmp/py-data/Main_py-data.ts +2 -1
  247. package/project/.sdk/src/cmp/rb/Package_rb.ts +4 -3
  248. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +1 -1
  249. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +2 -1
  250. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +5 -5
  251. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +1 -1
  252. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +3 -3
  253. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +9 -9
  254. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +31 -1
  255. package/project/.sdk/src/cmp/rb/fragment/SdkError.fragment.rb +10 -1
  256. package/project/.sdk/src/cmp/rust/Entity_rust.ts +5 -1
  257. package/project/.sdk/src/cmp/rust/Main_rust.ts +21 -0
  258. package/project/.sdk/src/cmp/rust/Package_rust.ts +2 -1
  259. package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +3 -3
  260. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +12 -12
  261. package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +18 -0
  262. package/project/.sdk/src/cmp/rust/fragment/EntityCreateOp.fragment.rs +8 -2
  263. package/project/.sdk/src/cmp/rust/fragment/EntityListOp.fragment.rs +20 -3
  264. package/project/.sdk/src/cmp/rust/fragment/EntityLoadOp.fragment.rs +8 -2
  265. package/project/.sdk/src/cmp/rust/fragment/EntityRemoveOp.fragment.rs +10 -2
  266. package/project/.sdk/src/cmp/rust/fragment/EntityUpdateOp.fragment.rs +8 -2
  267. package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +10 -0
  268. package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +2 -1
  269. package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +3 -3
  270. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +1 -1
  271. package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +3 -3
  272. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +3 -3
  273. package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +27 -1
  274. package/project/.sdk/src/cmp/seneca-provider/Extras_seneca-provider.ts +3915 -0
  275. package/project/.sdk/src/cmp/seneca-provider/Main_seneca-provider.ts +960 -0
  276. package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +2 -1
  277. package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +3 -3
  278. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +1 -1
  279. package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +3 -3
  280. package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +34 -1
  281. package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +9 -1
  282. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +18 -1
  283. package/project/.sdk/src/cmp/ts/Gitignore_ts.ts +5 -2
  284. package/project/.sdk/src/cmp/ts/Main_ts.ts +4 -1
  285. package/project/.sdk/src/cmp/ts/Package_ts.ts +10 -1
  286. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -2
  287. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +2 -1
  288. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +21 -6
  289. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +52 -2
  290. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +14 -3
  291. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +34 -2
  292. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +64 -43
  293. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +8 -8
  294. package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +2 -2
  295. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +2 -2
  296. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +25 -1
  297. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +10 -2
  298. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +1 -1
  299. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +10 -2
  300. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +27 -3
  301. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +10 -2
  302. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +15 -0
  303. package/project/.sdk/src/cmp/zig/Entity_zig.ts +5 -1
  304. package/project/.sdk/src/cmp/zig/Package_zig.ts +3 -1
  305. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +39 -0
  306. package/project/.sdk/src/cmp/zig/fragment/EntityCreateOp.fragment.zig +2 -2
  307. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +21 -2
  308. package/project/.sdk/src/cmp/zig/fragment/EntityLoadOp.fragment.zig +2 -2
  309. package/project/.sdk/src/cmp/zig/fragment/EntityRemoveOp.fragment.zig +5 -2
  310. package/project/.sdk/src/cmp/zig/fragment/EntityUpdateOp.fragment.zig +2 -2
  311. package/project/.sdk/tm/c/VERSION +1 -1
  312. package/project/.sdk/tm/c/core/helpers.c +1 -0
  313. package/project/.sdk/tm/c/core/sdk.h +22 -6
  314. package/project/.sdk/tm/c/tests/feature_harness.h +1 -0
  315. package/project/.sdk/tm/c/tests/primary_utility_test.c +4 -1
  316. package/project/.sdk/tm/c/utility/make_url.c +1 -0
  317. package/project/.sdk/tm/c/utility/param.c +1 -0
  318. package/project/.sdk/tm/clojure/VERSION +1 -1
  319. package/project/.sdk/tm/cpp/VERSION +1 -1
  320. package/project/.sdk/tm/cpp/core/types.hpp +33 -8
  321. package/project/.sdk/tm/cpp/test/pipeline_test.cpp +5 -0
  322. package/project/.sdk/tm/cpp/test/runner_support.hpp +4 -4
  323. package/project/.sdk/tm/csharp/VERSION +1 -1
  324. package/project/.sdk/tm/csharp/core/Types.cs +6 -0
  325. package/project/.sdk/tm/csharp/test/FeatureHarness.cs +396 -0
  326. package/project/.sdk/tm/csharp/test/FeatureTest.cs +7 -385
  327. package/project/.sdk/tm/csharp/test/Runner.cs +4 -4
  328. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +4 -0
  329. package/project/.sdk/tm/dart/test/utility.dart +4 -4
  330. package/project/.sdk/tm/elixir/VERSION +1 -1
  331. package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +26 -0
  332. package/project/.sdk/tm/go/VERSION +1 -1
  333. package/project/.sdk/tm/go/core/types.go +6 -0
  334. package/project/.sdk/tm/go/test/feature_harness_test.go +361 -0
  335. package/project/.sdk/tm/go/test/feature_test.go +7 -350
  336. package/project/.sdk/tm/go/test/pipeline_test.go +6 -0
  337. package/project/.sdk/tm/go/test/runner_test.go +16 -4
  338. package/project/.sdk/tm/haskell/VERSION +1 -1
  339. package/project/.sdk/tm/haskell/src/SdkFeatures.hs +28 -5
  340. package/project/.sdk/tm/haskell/src/SdkTypes.hs +14 -5
  341. package/project/.sdk/tm/java/VERSION +1 -1
  342. package/project/.sdk/tm/java/test/RunnerSupport.java +4 -4
  343. package/project/.sdk/tm/java/utility/MakeError.java +4 -0
  344. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +4 -0
  345. package/project/.sdk/tm/js/test/utility.js +3 -3
  346. package/project/.sdk/tm/kotlin/VERSION +1 -1
  347. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +3 -3
  348. package/project/.sdk/tm/lean/VERSION +1 -1
  349. package/project/.sdk/tm/lean/test/TFeature.lean +27 -14
  350. package/project/.sdk/tm/lua/test/runner.lua +4 -4
  351. package/project/.sdk/tm/lua/utility/make_error.lua +4 -0
  352. package/project/.sdk/tm/ocaml/VERSION +1 -1
  353. package/project/.sdk/tm/ocaml/sdk_types.ml +14 -5
  354. package/project/.sdk/tm/ocaml/test/t_pipeline.ml +5 -2
  355. package/project/.sdk/tm/perl/t/runner.pm +4 -4
  356. package/project/.sdk/tm/php/VERSION +1 -1
  357. package/project/.sdk/tm/php/test/Runner.php +4 -4
  358. package/project/.sdk/tm/php/utility/MakeError.php +5 -0
  359. package/project/.sdk/tm/py/pkg/utility/make_error.py +4 -0
  360. package/project/.sdk/tm/py/test/runner.py +19 -4
  361. package/project/.sdk/tm/rb/test/runner.rb +4 -4
  362. package/project/.sdk/tm/rb/utility/make_error.rb +4 -0
  363. package/project/.sdk/tm/rust/VERSION +1 -1
  364. package/project/.sdk/tm/rust/core/types.rs +22 -6
  365. package/project/.sdk/tm/rust/tests/common/mod.rs +6 -6
  366. package/project/.sdk/tm/rust/tests/pipeline_test.rs +6 -0
  367. package/project/.sdk/tm/rust/utility/make_error.rs +4 -0
  368. package/project/.sdk/tm/scala/VERSION +1 -1
  369. package/project/.sdk/tm/seneca-provider/CODE_OF_CONDUCT.md +132 -0
  370. package/project/.sdk/tm/seneca-provider/LICENSE +21 -0
  371. package/project/.sdk/tm/seneca-provider/Makefile +15 -0
  372. package/project/.sdk/tm/seneca-provider/src/tsconfig.json +18 -0
  373. package/project/.sdk/tm/seneca-provider/test/tsconfig.json +16 -0
  374. package/project/.sdk/tm/seneca-provider/tsfmt.json +3 -0
  375. package/project/.sdk/tm/swift/VERSION +1 -1
  376. package/project/.sdk/tm/ts/src/tsconfig.json +1 -0
  377. package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +4 -0
  378. package/project/.sdk/tm/ts/test/tsconfig.json +1 -0
  379. package/project/.sdk/tm/ts/test/utility.ts +3 -3
  380. package/project/.sdk/tm/zig/VERSION +1 -1
  381. package/src/action/doctor.ts +475 -0
  382. package/src/action/feature.ts +54 -16
  383. package/src/action/target.ts +174 -25
  384. package/src/cmp/Entity.ts +7 -0
  385. package/src/cmp/ExternalTarget.ts +125 -0
  386. package/src/cmp/Feature.ts +3 -1
  387. package/src/cmp/Main.ts +7 -1
  388. package/src/cmp/ReadmeExplanation.ts +2 -2
  389. package/src/cmp/ReadmeTop.ts +22 -9
  390. package/src/cmp/Registered.ts +100 -0
  391. package/src/cmp/Test.ts +4 -1
  392. package/src/helpers/dryrun.ts +57 -0
  393. package/src/helpers/featureSource.ts +208 -0
  394. package/src/helpers/naming.ts +73 -2
  395. package/src/helpers/opExample.ts +19 -2
  396. package/src/helpers/opShape.ts +65 -0
  397. package/src/helpers/packageMeta.ts +211 -10
  398. package/src/helpers/stdrep.ts +56 -0
  399. package/src/helpers/testPolicy.ts +52 -0
  400. package/src/sdkgen.ts +350 -5
  401. package/src/types.ts +24 -1
  402. package/src/utility.ts +10 -1
  403. package/project/.sdk/tm/rust/feature/mod.rs +0 -24
@@ -0,0 +1,57 @@
1
+ // Report what a dry run WOULD have done.
2
+ //
3
+ // `@voxgig/util`'s showChanges only lists merged and conflicted files, which
4
+ // on a fresh `target add` is nothing at all — so `-y target add ts` printed
5
+ // `** DRY RUN **`, listed no files, and (before the control fix) wrote them
6
+ // anyway. A preview that shows nothing is indistinguishable from a preview of
7
+ // nothing, which is exactly the wrong answer for the command whose whole job
8
+ // is to overwrite a project's vendored scaffold.
9
+
10
+ // Subset of jostraca's result: the per-outcome file lists.
11
+ type FileLists = {
12
+ written?: string[]
13
+ merged?: string[]
14
+ conflicted?: string[]
15
+ unchanged?: string[]
16
+ preserved?: string[]
17
+ }
18
+
19
+
20
+ // Log every path the run touched, one line each, plus a total. `written`
21
+ // covers both new and overwritten files — in a dry run nothing reached disk,
22
+ // so the list IS the preview.
23
+ function showDryrun(log: any, point: string, jres: any, folder?: string) {
24
+ const files: FileLists = (jres && jres.files) || {}
25
+
26
+ const prefix = null == folder ? '' :
27
+ (folder.endsWith('/') ? folder : folder + '/')
28
+
29
+ const rel = (p: string) => ('' !== prefix && p.startsWith(prefix)) ?
30
+ p.slice(prefix.length) : p
31
+
32
+ let count = 0
33
+
34
+ for (const kind of ['written', 'merged', 'conflicted'] as const) {
35
+ for (const file of (files[kind] || [])) {
36
+ count++
37
+ log.info({ point, file, kind, note: kind + ': ' + rel(file) })
38
+ }
39
+ }
40
+
41
+ log.info({
42
+ point, count,
43
+ note: '** DRY RUN ** ' + count + ' file' + (1 === count ? '' : 's') +
44
+ ' would change; nothing was written'
45
+ })
46
+
47
+ return count
48
+ }
49
+
50
+
51
+ export type {
52
+ FileLists,
53
+ }
54
+
55
+ export {
56
+ showDryrun,
57
+ }
@@ -0,0 +1,208 @@
1
+ // Locate the per-feature source inside a target's template tree.
2
+ //
3
+ // WHY THIS EXISTS
4
+ //
5
+ // `target add` is supposed to copy source for the features the model
6
+ // declares, and nothing else. It used to do that with a single hardcoded
7
+ // path assumption:
8
+ //
9
+ // Copy({ from: 'tm/<lang>', exclude: [/src\/feature/] })
10
+ // Folder({ name: 'src/feature' }, () => /* copy each model feature */)
11
+ //
12
+ // That assumption holds for exactly two targets. `ts` and `js` keep feature
13
+ // source at `src/feature/<name>/`; everyone else does something else —
14
+ // `tm/go/feature/retry_feature.go`, `tm/rust/feature/retry.rs`,
15
+ // `tm/py/pkg/feature/retry_feature.py`, `tm/dart/lib/feature/retry/...`,
16
+ // `tm/swift/Sources/ProjectNameSDK/feature/RetryFeature.swift`, and so on.
17
+ // None of those match `src/feature`, so the exclude never saw them and every
18
+ // shipped feature was copied into every project regardless of the model: 272
19
+ // stray source files across 17 targets for a project declaring no features
20
+ // at all. (For those targets `src/feature/<name>/` holds only a `.gitkeep`
21
+ // placeholder — the old gate was gating empty directories.)
22
+ //
23
+ // So instead of encoding one layout, DISCOVER it: walk the template tree,
24
+ // treat any directory named `feature` as a feature container, and map each
25
+ // entry inside it back to a feature name. That covers every layout above,
26
+ // and a target added later gets gated without anyone editing this file.
27
+ //
28
+ // The mapping is deliberately conservative. An entry only counts as feature
29
+ // source when its derived name is one the generator can actually supply
30
+ // (`availableFeatures`, read from `model/feature/*.aontu`). Everything else
31
+ // inside a feature directory — `feature_options.go`, `FeatureOptions.cs`,
32
+ // `mod.rs`, `support.rs`, `options.hpp`, `__init__.py`, `README.md`, and the
33
+ // `harness.ts` under `test/feature/` — derives a name no feature has, so it
34
+ // is left alone.
35
+
36
+ import Path from 'node:path'
37
+
38
+ import { KIT, getModelPath } from '@voxgig/apidef'
39
+
40
+
41
+ // One feature's source within a target template tree.
42
+ type FeatureSource = {
43
+ // Feature name, lowercased ('retry').
44
+ name: string
45
+
46
+ // Path relative to the target template root ('feature/retry_feature.go',
47
+ // 'lib/feature/retry'), always with forward slashes.
48
+ path: string
49
+
50
+ // True when `path` is a directory holding the whole feature.
51
+ folder: boolean
52
+ }
53
+
54
+
55
+ // Directory name that marks a feature container. Kept exact (not a substring
56
+ // match) so `utility/feature_add.go` and `test/feature_test.go` — which are
57
+ // shared machinery, not per-feature source — are never treated as features.
58
+ const FEATURE_DIR = 'feature'
59
+
60
+
61
+ // Derive the feature name an entry inside a feature directory belongs to.
62
+ // Returns the lowercased name, which the caller then checks against the
63
+ // available set.
64
+ //
65
+ // retry_feature.go -> retry (go, py, rb, lua, perl)
66
+ // RetryFeature.cs -> retry (csharp, java, kotlin, scala, swift, php)
67
+ // retry.rs -> retry (rust, c, cpp, zig, elixir)
68
+ // retry/ -> retry (ts, js, dart)
69
+ // feature_options.go -> feature_options (not a feature; `_feature` is a
70
+ // prefix here, not a suffix)
71
+ // FeatureOptions.cs -> featureoptions (ditto)
72
+ function featureOf(entry: string, folder: boolean): string {
73
+ if (folder) {
74
+ return entry.toLowerCase()
75
+ }
76
+
77
+ // Only the final extension goes; `feature.test.ts` style names keep the
78
+ // rest so they cannot collide with a bare feature name.
79
+ const stem = entry.replace(/\.[^.]+$/, '')
80
+
81
+ return stem
82
+ .replace(/_feature$/i, '')
83
+ .replace(/Feature$/, '')
84
+ .toLowerCase()
85
+ }
86
+
87
+
88
+ // Feature names this generator can supply, read from the scaffold's
89
+ // `model/feature/*.aontu`. This is the authoritative catalogue: a name not in
90
+ // it is not a feature, so nothing outside it is ever excluded.
91
+ function availableFeatures(fs: any, sdkfolder: string): string[] {
92
+ const dir = Path.join(sdkfolder, 'model', 'feature')
93
+
94
+ if (!fs.existsSync(dir)) {
95
+ return []
96
+ }
97
+
98
+ return fs.readdirSync(dir)
99
+ .filter((n: string) => n.endsWith('.aontu') && 'feature-index.aontu' !== n)
100
+ .map((n: string) => n.replace(/\.aontu$/, '').toLowerCase())
101
+ .sort()
102
+ }
103
+
104
+
105
+ // Walk a target's template tree and return every per-feature source entry.
106
+ // `tmfolder` is the target template root (`<sdk>/tm/<lang>`).
107
+ function findFeatureSources(fs: any, tmfolder: string, available: string[]): FeatureSource[] {
108
+ const known = new Set(available)
109
+ const found: FeatureSource[] = []
110
+
111
+ if (!fs.existsSync(tmfolder)) {
112
+ return found
113
+ }
114
+
115
+ // `rel` is relative to tmfolder, '' at the root.
116
+ const walk = (rel: string) => {
117
+ const abs = '' === rel ? tmfolder : Path.join(tmfolder, rel)
118
+ const entries = fs.readdirSync(abs).sort()
119
+
120
+ for (const entry of entries) {
121
+ const entryrel = '' === rel ? entry : rel + '/' + entry
122
+ const folder = fs.statSync(Path.join(tmfolder, entryrel)).isDirectory()
123
+
124
+ // Inside a feature container every entry is a candidate, and a
125
+ // candidate directory is the whole feature — do not descend into it
126
+ // looking for more.
127
+ if (FEATURE_DIR === Path.basename(rel)) {
128
+ const name = featureOf(entry, folder)
129
+ if (known.has(name)) {
130
+ found.push({ name, path: entryrel, folder })
131
+ continue
132
+ }
133
+ }
134
+
135
+ if (folder) {
136
+ walk(entryrel)
137
+ }
138
+ }
139
+ }
140
+
141
+ walk('')
142
+
143
+ return found
144
+ }
145
+
146
+
147
+ // Turn discovered sources into path patterns for a jostraca `Copy` exclude.
148
+ //
149
+ // jostraca tests each candidate against the path built up during its walk,
150
+ // which carries the enclosing node path as a prefix — so anchor on a
151
+ // segment boundary at both ends rather than on the whole string. A folder
152
+ // source matches everything beneath it; a file source matches only itself.
153
+ function featureExcludes(sources: FeatureSource[]): RegExp[] {
154
+ return sources.map((s) => new RegExp(
155
+ '(^|/)' + s.path.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + (s.folder ? '/' : '$')
156
+ ))
157
+ }
158
+
159
+
160
+ // Path patterns for templates that only compile with the COMPLETE feature
161
+ // set — see `feature.fullset` in each target's model. These are the
162
+ // cross-feature test suites: one file per target that constructs every
163
+ // shipped feature type by name (`feature.NewRetryFeature`,
164
+ // `RUSTCRATE::feature::retry::RetryFeature`, ...). Trimming the feature set
165
+ // without dropping them leaves a project that will not compile.
166
+ function fullsetExcludes(paths: string[]): RegExp[] {
167
+ return (paths || []).map((p) => new RegExp(
168
+ '(^|/)' + String(p).replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '$'
169
+ ))
170
+ }
171
+
172
+
173
+ // Generate-time guard for the `src/feature/<name>/` layout (ts, js).
174
+ //
175
+ // Root renders one Feature component per ACTIVE feature, but Main then
176
+ // copies the whole `tm/<lang>` tree — which puts a deactivated feature's
177
+ // source straight back, silently undoing the filter. `target add` keeps
178
+ // deactivated features out of `tm` in the first place; this covers the case
179
+ // where a feature is switched off AFTER it was added.
180
+ //
181
+ // Only declared-but-inactive features are excluded. `base` and anything else
182
+ // the model never mentions is left alone.
183
+ function srcFeatureExcludes(model: any): RegExp[] {
184
+ const all = getModelPath(model, `main.${KIT}.feature`,
185
+ { required: false, only_active: false }) || {}
186
+ const active = getModelPath(model, `main.${KIT}.feature`,
187
+ { required: false }) || {}
188
+
189
+ return Object.keys(all)
190
+ .filter((name: string) => null == active[name])
191
+ .map((name: string) => new RegExp(
192
+ '(^|/)src/feature/' + name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '/'
193
+ ))
194
+ }
195
+
196
+
197
+ export type {
198
+ FeatureSource,
199
+ }
200
+
201
+ export {
202
+ featureOf,
203
+ availableFeatures,
204
+ findFeatureSources,
205
+ featureExcludes,
206
+ fullsetExcludes,
207
+ srcFeatureExcludes,
208
+ }
@@ -209,16 +209,85 @@ function safeVarName(name: string, lang: string): string {
209
209
  }
210
210
 
211
211
 
212
+ // Members the generated PHP SDK class already declares (see the php target's
213
+ // fragment/Main.fragment.php). An entity accessor or backing field reusing one
214
+ // is a FATAL redeclare — PHP will not parse the file, so the SDK yields zero
215
+ // working tests rather than a degraded one.
216
+ //
217
+ // PHP method names are CASE-INSENSITIVE at declaration time, hence the
218
+ // lowercased comparison: an entity `graph_ql` derives the accessor `GraphQl()`,
219
+ // the same declaration as the SDK's own `graphql()`.
220
+ //
221
+ // This lives here, not in the php component, because the ACCESSOR NAME has to
222
+ // agree across the SDK class and every doc/example component that calls it.
223
+ // It did not: MainEntity_php emitted `Test_()` for an entity named `test`
224
+ // while eight readme components emitted `Test()`, so the generated examples
225
+ // called the static test-mode constructor and died with
226
+ // "Call to undefined method <Name>SDK::load()".
227
+ const PHP_SDK_METHODS = new Set([
228
+ 'construct', '__construct', 'direct', 'get_root_ctx', 'get_utility',
229
+ 'graphql', 'op_allowed', 'op_denied', 'options_map', 'prepare',
230
+ 'raw_request', 'test',
231
+ ])
232
+
233
+ // Backing fields the generated SDK object already holds, in EVERY target that
234
+ // caches its entity accessors in `_<name>`. php spells it `$this->_utility`
235
+ // and lua `self._utility`, but it is one hazard: the accessor's cache slot
236
+ // silently aliases the SDK's own field, so `client:Utility()` hands back the
237
+ // internal utility object and every entity method on it is nil.
238
+ const SDK_FIELDS = new Set(['rootctx', 'utility', 'client', 'entctx'])
239
+
240
+
241
+ /** The PHP accessor method for an entity: `$client-><Name>()`. */
242
+ function phpEntityAccessor(Name: string): string {
243
+ return PHP_SDK_METHODS.has(String(Name).toLowerCase()) ? Name + '_' : Name
244
+ }
245
+
246
+
247
+ /**
248
+ * The backing field for an entity accessor's cache slot (`$this->_<name>`,
249
+ * `self._<name>`). Target-neutral: the colliding names are the SDK's own
250
+ * fields, which the targets share.
251
+ */
252
+ function entityCacheField(name: string): string {
253
+ return SDK_FIELDS.has(String(name).toLowerCase()) ? name + '_' : name
254
+ }
255
+
256
+
257
+ // Symbols a doc example CALLS, which a same-named example variable would
258
+ // shadow. The variable is syntactically fine; the example then fails at
259
+ // RUNTIME, which is far harder to read than a compile error:
260
+ //
261
+ // const consoles = await client.Console().list()
262
+ // for (const console of consoles) { console.log(console) }
263
+ // -> "console.log is not a function" (nexarda, an API with a Console entity)
264
+ //
265
+ // Only languages where a plain variable can capture the symbol are listed.
266
+ // php is absent on purpose: its variables carry a `$` sigil, so `$echo` can
267
+ // never shadow `echo`.
268
+ const EXAMPLE_GLOBALS: Record<string, string[]> = {
269
+ ts: ['console', 'process', 'globalThis'],
270
+ js: ['console', 'process', 'globalThis'],
271
+ py: ['print'],
272
+ rb: ['puts'],
273
+ lua: ['print'],
274
+ go: ['fmt'],
275
+ }
276
+
277
+
212
278
  // A variable name for a doc EXAMPLE entity. Doc examples bind the SDK instance
213
279
  // to `client` (e.g. `const client = ...SDK.test()`), so an entity whose
214
280
  // lowercased name is also `client` — an API with a `Client` entity — would
215
281
  // shadow it: `const client = client.Client()...` is self-referential (TS2448/
216
282
  // TS7022) and breaks the readme_examples type-check. Append `_` to keep the
217
- // example variable distinct from the SDK instance. Also applies the normal
283
+ // example variable distinct from the SDK instance. The same applies to any
284
+ // symbol the example itself calls (EXAMPLE_GLOBALS). Also applies the normal
218
285
  // language-reserved-word guard.
219
286
  function exampleVarName(name: string, lang: string): string {
220
287
  const v = safeVarName(name, lang)
221
- return 'client' === v ? v + '_' : v
288
+ if ('client' === v) return v + '_'
289
+ if ((EXAMPLE_GLOBALS[lang] || []).includes(v)) return v + '_'
290
+ return v
222
291
  }
223
292
 
224
293
 
@@ -256,6 +325,8 @@ export {
256
325
  isReservedName,
257
326
  safeVarName,
258
327
  exampleVarName,
328
+ phpEntityAccessor,
329
+ entityCacheField,
259
330
  isRbCoreConstant,
260
331
  rbSafeTypeName,
261
332
  isSwiftSdkType,
@@ -20,6 +20,8 @@ import { each } from 'jostraca'
20
20
  import { canonKey } from './canonType'
21
21
  import { opRequestShape, entityIdField } from './opShape'
22
22
 
23
+ import { phpEntityAccessor } from './naming'
24
+
23
25
 
24
26
  type ExampleLang = 'ts' | 'js' | 'py' | 'php' | 'rb' | 'lua' | 'go'
25
27
 
@@ -35,7 +37,19 @@ function litFor(lang: ExampleLang, type: any): string {
35
37
  if ('INTEGER' === k || 'NUMBER' === k) return '1'
36
38
  if ('BOOLEAN' === k) return 'py' === lang ? 'True' : ('rb' === lang ? 'true' : 'true')
37
39
  if ('ARRAY' === k) return ('lua' === lang) ? '{}' : ('go' === lang ? '[]any{}' : '[]')
38
- if ('OBJECT' === k) return ('go' === lang) ? 'map[string]any{}' : '{}'
40
+ // PHP has no `{}` literal `["data" => {}]` is a parse error, which took
41
+ // the whole generated README down for any entity with an object-typed
42
+ // writable field (dymo-api-introduction, html-creator). Arrays serve as both
43
+ // list and map, so `[]` is the empty object too. Ruby and Lua likewise want
44
+ // their own empty-hash/table spelling rather than JS's.
45
+ if ('OBJECT' === k) {
46
+ if ('go' === lang) return 'map[string]any{}'
47
+ if ('php' === lang) return '[]'
48
+ if ('rb' === lang) return '{}'
49
+ if ('lua' === lang) return '{}'
50
+ if ('py' === lang) return '{}'
51
+ return '{}'
52
+ }
39
53
  return '"example"'
40
54
  }
41
55
 
@@ -154,7 +168,10 @@ function primaryOpCall(
154
168
  if ('go' === lang) { factory = `client.${eName}(nil)`; sep = '.' }
155
169
  else if ('lua' === lang) { factory = `client:${eName}()`; sep = ':' }
156
170
  else if ('rb' === lang) { factory = `client.${eName}`; sep = '.' }
157
- else if ('php' === lang) { factory = `$client->${eName}()`; sep = '->' }
171
+ // php mangles an accessor that would collide with an SDK class member
172
+ // (see phpEntityAccessor); the example has to call the name that is
173
+ // actually declared, or it invokes the SDK's own method instead.
174
+ else if ('php' === lang) { factory = `$client->${phpEntityAccessor(eName)}()`; sep = '->' }
158
175
  else { factory = `client.${eName}()`; sep = '.' }
159
176
 
160
177
  // Argument string per op + language.
@@ -127,6 +127,68 @@ type OpShapeItem = {
127
127
  // list-by-parent-id call failing because sibling routes' ids are demanded —
128
128
  // and steers callers into passing keys that flip runtime point dispatch to
129
129
  // the wrong route.)
130
+ // The action names an op multiplexes, from its points' `select.$action`.
131
+ //
132
+ // A custom POST route like `/api/planet/{id}/terraform` is folded into the
133
+ // `create` op as an alternative point, discriminated at call time by
134
+ // `$action` in the data argument. The mechanism worked and was documented
135
+ // NOWHERE — not in the README, not in the reference — so for an API with two
136
+ // such routes, two of its six endpoints were unreachable by anyone using the
137
+ // documented interface. Generated docs list them via this helper.
138
+ function opActions(op: any): { action: string, path: string }[] {
139
+ const points: any[] = op && op.points ? each(op.points) : []
140
+
141
+ return points
142
+ .filter((pt: any) => null != (pt && pt.select && pt.select['$action']))
143
+ .map((pt: any) => ({
144
+ action: String(pt.select['$action']),
145
+ path: String(pt.orig || ''),
146
+ }))
147
+ .sort((a, b) => a.action < b.action ? -1 : a.action > b.action ? 1 : 0)
148
+ }
149
+
150
+
151
+ // True when any of the entity's ops multiplexes a custom action.
152
+ function entityActions(entity: any): { op: string, action: string, path: string }[] {
153
+ const out: { op: string, action: string, path: string }[] = []
154
+
155
+ each(entity && entity.op).forEach((op: any) => {
156
+ opActions(op).forEach((a) => out.push({ op: op.name, ...a }))
157
+ })
158
+
159
+ return out
160
+ }
161
+
162
+
163
+ // The entity's own API path — the route a reader should recognise it by.
164
+ //
165
+ // NOT `points[0]` across every op flattened. Ops iterate in sorted-key order,
166
+ // so `create` came first, and an entity whose create op folds in a custom
167
+ // action (`/api/planet/{id}/forbid`) advertised THAT as its path. The
168
+ // canonical route is the collection or record route, and never an action.
169
+ function entityPath(entity: any): string {
170
+ const ops: any = (entity && entity.op) || {}
171
+
172
+ for (const opname of ['list', 'load', 'create', 'update', 'remove']) {
173
+ const op = ops[opname]
174
+ if (null == op) {
175
+ continue
176
+ }
177
+
178
+ const points: any[] = op.points ? each(op.points) : []
179
+ const canonical = points.filter((pt: any) =>
180
+ null == (pt && pt.select && pt.select['$action']))
181
+
182
+ const pick = (0 < canonical.length ? canonical : points)[0]
183
+ if (null != pick && null != pick.orig && '' !== pick.orig) {
184
+ return String(pick.orig)
185
+ }
186
+ }
187
+
188
+ return ''
189
+ }
190
+
191
+
130
192
  function opParams(op: any): any[] {
131
193
  let points: any[] = op && op.points ? each(op.points) : []
132
194
 
@@ -533,6 +595,9 @@ export {
533
595
  entityCollection,
534
596
  opTypeName,
535
597
  opParams,
598
+ opActions,
599
+ entityActions,
600
+ entityPath,
536
601
  opRequestShape,
537
602
  entityIdField,
538
603
  entityDataIdField,