@voxgig/sdkgen 1.3.14 → 1.3.17

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 (398) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/action/action.js.map +1 -1
  3. package/dist/action/feature.js.map +1 -1
  4. package/dist/action/target.js.map +1 -1
  5. package/dist/cmp/AgentGuide.js.map +1 -1
  6. package/dist/cmp/AgentGuideContent.js.map +1 -1
  7. package/dist/cmp/AgentGuideFeature.js.map +1 -1
  8. package/dist/cmp/AgentGuideTop.js.map +1 -1
  9. package/dist/cmp/Changelog.js.map +1 -1
  10. package/dist/cmp/Deploy.js.map +1 -1
  11. package/dist/cmp/Entity.js.map +1 -1
  12. package/dist/cmp/Feature.js.map +1 -1
  13. package/dist/cmp/FeatureHook.js.map +1 -1
  14. package/dist/cmp/License.js.map +1 -1
  15. package/dist/cmp/Main.js.map +1 -1
  16. package/dist/cmp/Readme.js.map +1 -1
  17. package/dist/cmp/ReadmeEntity.js.map +1 -1
  18. package/dist/cmp/ReadmeErrors.js +1 -1
  19. package/dist/cmp/ReadmeErrors.js.map +1 -1
  20. package/dist/cmp/ReadmeExplanation.js +2 -2
  21. package/dist/cmp/ReadmeExplanation.js.map +1 -1
  22. package/dist/cmp/ReadmeHowto.js.map +1 -1
  23. package/dist/cmp/ReadmeInstall.js.map +1 -1
  24. package/dist/cmp/ReadmeIntro.js.map +1 -1
  25. package/dist/cmp/ReadmeModel.js.map +1 -1
  26. package/dist/cmp/ReadmeOptions.js.map +1 -1
  27. package/dist/cmp/ReadmeQuick.js.map +1 -1
  28. package/dist/cmp/ReadmeRef.js.map +1 -1
  29. package/dist/cmp/ReadmeTop.js +1 -1
  30. package/dist/cmp/ReadmeTop.js.map +1 -1
  31. package/dist/cmp/Security.js.map +1 -1
  32. package/dist/cmp/Test.js.map +1 -1
  33. package/dist/helpers/buildIdNames.js.map +1 -1
  34. package/dist/helpers/canonType.d.ts +3 -2
  35. package/dist/helpers/canonType.js +107 -24
  36. package/dist/helpers/canonType.js.map +1 -1
  37. package/dist/helpers/collectDeps.js.map +1 -1
  38. package/dist/helpers/getMatchEntries.js.map +1 -1
  39. package/dist/helpers/naming.d.ts +5 -1
  40. package/dist/helpers/naming.js +37 -0
  41. package/dist/helpers/naming.js.map +1 -1
  42. package/dist/helpers/opExample.d.ts +1 -1
  43. package/dist/helpers/opExample.js +37 -20
  44. package/dist/helpers/opExample.js.map +1 -1
  45. package/dist/helpers/opShape.d.ts +3 -1
  46. package/dist/helpers/opShape.js +91 -3
  47. package/dist/helpers/opShape.js.map +1 -1
  48. package/dist/helpers/packageMeta.js.map +1 -1
  49. package/dist/sdkgen.d.ts +3 -3
  50. package/dist/sdkgen.js +7 -1
  51. package/dist/sdkgen.js.map +1 -1
  52. package/dist/tsconfig.tsbuildinfo +1 -1
  53. package/dist/types.js.map +1 -1
  54. package/dist/utility.js.map +1 -1
  55. package/package.json +7 -6
  56. package/project/.sdk/model/target/haskell.aontu +6 -3
  57. package/project/.sdk/model/target/zig.aontu +12 -2
  58. package/project/.sdk/src/cmp/c/Config_c.ts +16 -4
  59. package/project/.sdk/src/cmp/c/EntityTypes_c.ts +168 -0
  60. package/project/.sdk/src/cmp/c/Main_c.ts +4 -0
  61. package/project/.sdk/src/cmp/c/ReadmeEntity_c.ts +192 -0
  62. package/project/.sdk/src/cmp/c/ReadmeExamplesTest_c.ts +152 -0
  63. package/project/.sdk/src/cmp/c/ReadmeExplanation_c.ts +55 -0
  64. package/project/.sdk/src/cmp/c/ReadmeHowto_c.ts +168 -0
  65. package/project/.sdk/src/cmp/c/ReadmeInstall_c.ts +52 -0
  66. package/project/.sdk/src/cmp/c/ReadmeIntro_c.ts +67 -0
  67. package/project/.sdk/src/cmp/c/ReadmeModel_c.ts +151 -0
  68. package/project/.sdk/src/cmp/c/ReadmeOptions_c.ts +65 -0
  69. package/project/.sdk/src/cmp/c/ReadmeQuick_c.ts +225 -0
  70. package/project/.sdk/src/cmp/c/ReadmeRef_c.ts +398 -0
  71. package/project/.sdk/src/cmp/c/ReadmeTopHowto_c.ts +24 -0
  72. package/project/.sdk/src/cmp/c/ReadmeTopQuick_c.ts +104 -0
  73. package/project/.sdk/src/cmp/c/ReadmeTopTest_c.ts +86 -0
  74. package/project/.sdk/src/cmp/c/TestEntity_c.ts +10 -0
  75. package/project/.sdk/src/cmp/c/Test_c.ts +4 -0
  76. package/project/.sdk/src/cmp/c/utility_c.ts +8 -2
  77. package/project/.sdk/src/cmp/clojure/ReadmeEntity_clojure.ts +182 -0
  78. package/project/.sdk/src/cmp/clojure/ReadmeExamplesTest_clojure.ts +54 -0
  79. package/project/.sdk/src/cmp/clojure/ReadmeExplanation_clojure.ts +44 -0
  80. package/project/.sdk/src/cmp/clojure/ReadmeHowto_clojure.ts +144 -0
  81. package/project/.sdk/src/cmp/clojure/ReadmeInstall_clojure.ts +51 -0
  82. package/project/.sdk/src/cmp/clojure/ReadmeIntro_clojure.ts +66 -0
  83. package/project/.sdk/src/cmp/clojure/ReadmeModel_clojure.ts +156 -0
  84. package/project/.sdk/src/cmp/clojure/ReadmeOptions_clojure.ts +61 -0
  85. package/project/.sdk/src/cmp/clojure/ReadmeQuick_clojure.ts +210 -0
  86. package/project/.sdk/src/cmp/clojure/ReadmeRef_clojure.ts +409 -0
  87. package/project/.sdk/src/cmp/clojure/ReadmeTopHowto_clojure.ts +24 -0
  88. package/project/.sdk/src/cmp/clojure/ReadmeTopQuick_clojure.ts +98 -0
  89. package/project/.sdk/src/cmp/clojure/ReadmeTopTest_clojure.ts +78 -0
  90. package/project/.sdk/src/cmp/clojure/TestDirect_clojure.ts +58 -0
  91. package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +79 -0
  92. package/project/.sdk/src/cmp/clojure/Test_clojure.ts +21 -65
  93. package/project/.sdk/src/cmp/cpp/EntityTypes_cpp.ts +174 -0
  94. package/project/.sdk/src/cmp/cpp/Main_cpp.ts +5 -0
  95. package/project/.sdk/src/cmp/cpp/ReadmeEntity_cpp.ts +170 -0
  96. package/project/.sdk/src/cmp/cpp/ReadmeExplanation_cpp.ts +45 -0
  97. package/project/.sdk/src/cmp/cpp/ReadmeHowto_cpp.ts +139 -0
  98. package/project/.sdk/src/cmp/cpp/ReadmeInstall_cpp.ts +42 -0
  99. package/project/.sdk/src/cmp/cpp/ReadmeIntro_cpp.ts +69 -0
  100. package/project/.sdk/src/cmp/cpp/ReadmeModel_cpp.ts +155 -0
  101. package/project/.sdk/src/cmp/cpp/ReadmeOptions_cpp.ts +62 -0
  102. package/project/.sdk/src/cmp/cpp/ReadmeQuick_cpp.ts +234 -0
  103. package/project/.sdk/src/cmp/cpp/ReadmeRef_cpp.ts +387 -0
  104. package/project/.sdk/src/cmp/cpp/ReadmeTopHowto_cpp.ts +24 -0
  105. package/project/.sdk/src/cmp/cpp/ReadmeTopQuick_cpp.ts +95 -0
  106. package/project/.sdk/src/cmp/cpp/ReadmeTopTest_cpp.ts +70 -0
  107. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +5 -1
  108. package/project/.sdk/src/cmp/csharp/EntityTypes_csharp.ts +196 -0
  109. package/project/.sdk/src/cmp/csharp/Main_csharp.ts +6 -0
  110. package/project/.sdk/src/cmp/csharp/ReadmeEntity_csharp.ts +174 -0
  111. package/project/.sdk/src/cmp/csharp/ReadmeExamplesTest_csharp.ts +198 -0
  112. package/project/.sdk/src/cmp/csharp/ReadmeExplanation_csharp.ts +42 -0
  113. package/project/.sdk/src/cmp/csharp/ReadmeHowto_csharp.ts +168 -0
  114. package/project/.sdk/src/cmp/csharp/ReadmeInstall_csharp.ts +41 -0
  115. package/project/.sdk/src/cmp/csharp/ReadmeIntro_csharp.ts +65 -0
  116. package/project/.sdk/src/cmp/csharp/ReadmeModel_csharp.ts +148 -0
  117. package/project/.sdk/src/cmp/csharp/ReadmeOptions_csharp.ts +60 -0
  118. package/project/.sdk/src/cmp/csharp/ReadmeQuick_csharp.ts +219 -0
  119. package/project/.sdk/src/cmp/csharp/ReadmeRef_csharp.ts +390 -0
  120. package/project/.sdk/src/cmp/csharp/ReadmeTopHowto_csharp.ts +25 -0
  121. package/project/.sdk/src/cmp/csharp/ReadmeTopQuick_csharp.ts +92 -0
  122. package/project/.sdk/src/cmp/csharp/ReadmeTopTest_csharp.ts +77 -0
  123. package/project/.sdk/src/cmp/csharp/Test_csharp.ts +4 -0
  124. package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +43 -29
  125. package/project/.sdk/src/cmp/dart/Entity_dart.ts +8 -0
  126. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +166 -0
  127. package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +238 -0
  128. package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +53 -0
  129. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +151 -0
  130. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +59 -0
  131. package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +65 -0
  132. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +151 -0
  133. package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +63 -0
  134. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +214 -0
  135. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +381 -0
  136. package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +24 -0
  137. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +95 -0
  138. package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +78 -0
  139. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +52 -0
  140. package/project/.sdk/src/cmp/dart/Test_dart.ts +6 -0
  141. package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +1 -3
  142. package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +1 -40
  143. package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +3 -3
  144. package/project/.sdk/src/cmp/elixir/EntityTypes_elixir.ts +165 -0
  145. package/project/.sdk/src/cmp/elixir/Main_elixir.ts +4 -0
  146. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
  147. package/project/.sdk/src/cmp/elixir/ReadmeEntity_elixir.ts +163 -0
  148. package/project/.sdk/src/cmp/elixir/ReadmeExamplesTest_elixir.ts +126 -0
  149. package/project/.sdk/src/cmp/elixir/ReadmeExplanation_elixir.ts +55 -0
  150. package/project/.sdk/src/cmp/elixir/ReadmeHowto_elixir.ts +149 -0
  151. package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +67 -0
  152. package/project/.sdk/src/cmp/elixir/ReadmeIntro_elixir.ts +66 -0
  153. package/project/.sdk/src/cmp/elixir/ReadmeModel_elixir.ts +150 -0
  154. package/project/.sdk/src/cmp/elixir/ReadmeOptions_elixir.ts +62 -0
  155. package/project/.sdk/src/cmp/elixir/ReadmeQuick_elixir.ts +198 -0
  156. package/project/.sdk/src/cmp/elixir/ReadmeRef_elixir.ts +333 -0
  157. package/project/.sdk/src/cmp/elixir/ReadmeTopHowto_elixir.ts +26 -0
  158. package/project/.sdk/src/cmp/elixir/ReadmeTopQuick_elixir.ts +79 -0
  159. package/project/.sdk/src/cmp/elixir/ReadmeTopTest_elixir.ts +68 -0
  160. package/project/.sdk/src/cmp/elixir/Test_elixir.ts +4 -0
  161. package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +4 -0
  162. package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +4 -0
  163. package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +4 -0
  164. package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -0
  165. package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +4 -0
  166. package/project/.sdk/src/cmp/elixir/utility_elixir.ts +32 -0
  167. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +12 -3
  168. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +6 -1
  169. package/project/.sdk/src/cmp/go/TestEntity_go.ts +10 -3
  170. package/project/.sdk/src/cmp/go/utility_go.ts +3 -2
  171. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +240 -43
  172. package/project/.sdk/src/cmp/go-cli/fragment/main.fragment.go +27 -5
  173. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +191 -30
  174. package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +181 -0
  175. package/project/.sdk/src/cmp/haskell/ReadmeExamplesTest_haskell.ts +125 -0
  176. package/project/.sdk/src/cmp/haskell/ReadmeExplanation_haskell.ts +48 -0
  177. package/project/.sdk/src/cmp/haskell/ReadmeHowto_haskell.ts +168 -0
  178. package/project/.sdk/src/cmp/haskell/ReadmeInstall_haskell.ts +51 -0
  179. package/project/.sdk/src/cmp/haskell/ReadmeIntro_haskell.ts +67 -0
  180. package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +160 -0
  181. package/project/.sdk/src/cmp/haskell/ReadmeOptions_haskell.ts +74 -0
  182. package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +237 -0
  183. package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +405 -0
  184. package/project/.sdk/src/cmp/haskell/ReadmeTopHowto_haskell.ts +31 -0
  185. package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +104 -0
  186. package/project/.sdk/src/cmp/haskell/ReadmeTopTest_haskell.ts +80 -0
  187. package/project/.sdk/src/cmp/haskell/Test_haskell.ts +27 -2
  188. package/project/.sdk/src/cmp/java/EntityTypes_java.ts +207 -0
  189. package/project/.sdk/src/cmp/java/Main_java.ts +6 -0
  190. package/project/.sdk/src/cmp/java/ReadmeEntity_java.ts +175 -0
  191. package/project/.sdk/src/cmp/java/ReadmeExamplesTest_java.ts +186 -0
  192. package/project/.sdk/src/cmp/java/ReadmeExplanation_java.ts +46 -0
  193. package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +156 -0
  194. package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +52 -0
  195. package/project/.sdk/src/cmp/java/ReadmeIntro_java.ts +66 -0
  196. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +150 -0
  197. package/project/.sdk/src/cmp/java/ReadmeOptions_java.ts +61 -0
  198. package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +230 -0
  199. package/project/.sdk/src/cmp/java/ReadmeRef_java.ts +388 -0
  200. package/project/.sdk/src/cmp/java/ReadmeTopHowto_java.ts +23 -0
  201. package/project/.sdk/src/cmp/java/ReadmeTopQuick_java.ts +103 -0
  202. package/project/.sdk/src/cmp/java/ReadmeTopTest_java.ts +77 -0
  203. package/project/.sdk/src/cmp/java/Test_java.ts +4 -0
  204. package/project/.sdk/src/cmp/js/EntityTypes_js.ts +25 -8
  205. package/project/.sdk/src/cmp/js/MainEntity_js.ts +4 -2
  206. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +4 -4
  207. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +13 -4
  208. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +4 -4
  209. package/project/.sdk/src/cmp/js/ReadmeRef_js.ts +5 -5
  210. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +4 -4
  211. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +4 -4
  212. package/project/.sdk/src/cmp/js/TestDirect_js.ts +6 -5
  213. package/project/.sdk/src/cmp/js/TestEntity_js.ts +7 -2
  214. package/project/.sdk/src/cmp/js/fragment/Entity.test.fragment.js +0 -31
  215. package/project/.sdk/src/cmp/kotlin/EntityTypes_kotlin.ts +201 -0
  216. package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +6 -0
  217. package/project/.sdk/src/cmp/kotlin/ReadmeEntity_kotlin.ts +175 -0
  218. package/project/.sdk/src/cmp/kotlin/ReadmeExamplesTest_kotlin.ts +173 -0
  219. package/project/.sdk/src/cmp/kotlin/ReadmeExplanation_kotlin.ts +47 -0
  220. package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +154 -0
  221. package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +50 -0
  222. package/project/.sdk/src/cmp/kotlin/ReadmeIntro_kotlin.ts +66 -0
  223. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +150 -0
  224. package/project/.sdk/src/cmp/kotlin/ReadmeOptions_kotlin.ts +61 -0
  225. package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +230 -0
  226. package/project/.sdk/src/cmp/kotlin/ReadmeRef_kotlin.ts +387 -0
  227. package/project/.sdk/src/cmp/kotlin/ReadmeTopHowto_kotlin.ts +23 -0
  228. package/project/.sdk/src/cmp/kotlin/ReadmeTopQuick_kotlin.ts +104 -0
  229. package/project/.sdk/src/cmp/kotlin/ReadmeTopTest_kotlin.ts +77 -0
  230. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +4 -0
  231. package/project/.sdk/src/cmp/lua/Config_lua.ts +1 -1
  232. package/project/.sdk/src/cmp/lua/EntityTypes_lua.ts +19 -5
  233. package/project/.sdk/src/cmp/lua/Main_lua.ts +14 -2
  234. package/project/.sdk/src/cmp/lua/ReadmeEntity_lua.ts +2 -2
  235. package/project/.sdk/src/cmp/lua/ReadmeHowto_lua.ts +6 -1
  236. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +3 -3
  237. package/project/.sdk/src/cmp/lua/ReadmeRef_lua.ts +2 -2
  238. package/project/.sdk/src/cmp/lua/ReadmeTopQuick_lua.ts +2 -2
  239. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +7 -2
  240. package/project/.sdk/src/cmp/lua/Test_lua.ts +1 -1
  241. package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +2 -0
  242. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +180 -0
  243. package/project/.sdk/src/cmp/ocaml/ReadmeExamplesTest_ocaml.ts +111 -0
  244. package/project/.sdk/src/cmp/ocaml/ReadmeExplanation_ocaml.ts +46 -0
  245. package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +147 -0
  246. package/project/.sdk/src/cmp/ocaml/ReadmeInstall_ocaml.ts +44 -0
  247. package/project/.sdk/src/cmp/ocaml/ReadmeIntro_ocaml.ts +68 -0
  248. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +155 -0
  249. package/project/.sdk/src/cmp/ocaml/ReadmeOptions_ocaml.ts +59 -0
  250. package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +205 -0
  251. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +402 -0
  252. package/project/.sdk/src/cmp/ocaml/ReadmeTopHowto_ocaml.ts +25 -0
  253. package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +86 -0
  254. package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +79 -0
  255. package/project/.sdk/src/cmp/ocaml/Test_ocaml.ts +4 -0
  256. package/project/.sdk/src/cmp/perl/ReadmeEntity_perl.ts +181 -0
  257. package/project/.sdk/src/cmp/perl/ReadmeExamplesTest_perl.ts +354 -0
  258. package/project/.sdk/src/cmp/perl/ReadmeExplanation_perl.ts +43 -0
  259. package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +149 -0
  260. package/project/.sdk/src/cmp/perl/ReadmeInstall_perl.ts +47 -0
  261. package/project/.sdk/src/cmp/perl/ReadmeIntro_perl.ts +66 -0
  262. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +150 -0
  263. package/project/.sdk/src/cmp/perl/ReadmeOptions_perl.ts +59 -0
  264. package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +216 -0
  265. package/project/.sdk/src/cmp/perl/ReadmeRef_perl.ts +399 -0
  266. package/project/.sdk/src/cmp/perl/ReadmeTopHowto_perl.ts +24 -0
  267. package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +91 -0
  268. package/project/.sdk/src/cmp/perl/ReadmeTopTest_perl.ts +83 -0
  269. package/project/.sdk/src/cmp/perl/Test_perl.ts +4 -0
  270. package/project/.sdk/src/cmp/php/EntityTypes_php.ts +23 -6
  271. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +6 -1
  272. package/project/.sdk/src/cmp/php/TestEntity_php.ts +7 -2
  273. package/project/.sdk/src/cmp/py/EntityTypes_py.ts +32 -7
  274. package/project/.sdk/src/cmp/py/Entity_py.ts +2 -10
  275. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +2 -2
  276. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +8 -3
  277. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +3 -3
  278. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +2 -2
  279. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +2 -2
  280. package/project/.sdk/src/cmp/py/ReadmeTopTest_py.ts +2 -2
  281. package/project/.sdk/src/cmp/py/TestEntity_py.ts +7 -2
  282. package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +19 -5
  283. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +2 -2
  284. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +8 -3
  285. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +3 -3
  286. package/project/.sdk/src/cmp/rb/ReadmeRef_rb.ts +2 -2
  287. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +2 -2
  288. package/project/.sdk/src/cmp/rb/ReadmeTopTest_rb.ts +2 -2
  289. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +7 -2
  290. package/project/.sdk/src/cmp/rust/EntityBase_rust.ts +4 -0
  291. package/project/.sdk/src/cmp/rust/EntityTypes_rust.ts +152 -0
  292. package/project/.sdk/src/cmp/rust/Entity_rust.ts +1 -1
  293. package/project/.sdk/src/cmp/rust/Main_rust.ts +5 -0
  294. package/project/.sdk/src/cmp/rust/ReadmeEntity_rust.ts +163 -0
  295. package/project/.sdk/src/cmp/rust/ReadmeExamplesTest_rust.ts +132 -0
  296. package/project/.sdk/src/cmp/rust/ReadmeExplanation_rust.ts +44 -0
  297. package/project/.sdk/src/cmp/rust/ReadmeHowto_rust.ts +142 -0
  298. package/project/.sdk/src/cmp/rust/ReadmeInstall_rust.ts +49 -0
  299. package/project/.sdk/src/cmp/rust/ReadmeIntro_rust.ts +66 -0
  300. package/project/.sdk/src/cmp/rust/ReadmeModel_rust.ts +153 -0
  301. package/project/.sdk/src/cmp/rust/ReadmeOptions_rust.ts +60 -0
  302. package/project/.sdk/src/cmp/rust/ReadmeQuick_rust.ts +212 -0
  303. package/project/.sdk/src/cmp/rust/ReadmeRef_rust.ts +384 -0
  304. package/project/.sdk/src/cmp/rust/ReadmeTopHowto_rust.ts +24 -0
  305. package/project/.sdk/src/cmp/rust/ReadmeTopQuick_rust.ts +95 -0
  306. package/project/.sdk/src/cmp/rust/ReadmeTopTest_rust.ts +81 -0
  307. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +10 -0
  308. package/project/.sdk/src/cmp/rust/Test_rust.ts +4 -0
  309. package/project/.sdk/src/cmp/scala/EntityTypes_scala.ts +202 -0
  310. package/project/.sdk/src/cmp/scala/Main_scala.ts +6 -0
  311. package/project/.sdk/src/cmp/scala/ReadmeEntity_scala.ts +175 -0
  312. package/project/.sdk/src/cmp/scala/ReadmeExamplesTest_scala.ts +163 -0
  313. package/project/.sdk/src/cmp/scala/ReadmeExplanation_scala.ts +49 -0
  314. package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +155 -0
  315. package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +58 -0
  316. package/project/.sdk/src/cmp/scala/ReadmeIntro_scala.ts +66 -0
  317. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +150 -0
  318. package/project/.sdk/src/cmp/scala/ReadmeOptions_scala.ts +61 -0
  319. package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +230 -0
  320. package/project/.sdk/src/cmp/scala/ReadmeRef_scala.ts +388 -0
  321. package/project/.sdk/src/cmp/scala/ReadmeTopHowto_scala.ts +23 -0
  322. package/project/.sdk/src/cmp/scala/ReadmeTopQuick_scala.ts +104 -0
  323. package/project/.sdk/src/cmp/scala/ReadmeTopTest_scala.ts +77 -0
  324. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +38 -10
  325. package/project/.sdk/src/cmp/scala/Test_scala.ts +8 -0
  326. package/project/.sdk/src/cmp/swift/EntityTypes_swift.ts +152 -0
  327. package/project/.sdk/src/cmp/swift/Main_swift.ts +5 -0
  328. package/project/.sdk/src/cmp/swift/ReadmeEntity_swift.ts +176 -0
  329. package/project/.sdk/src/cmp/swift/ReadmeExamplesTest_swift.ts +170 -0
  330. package/project/.sdk/src/cmp/swift/ReadmeExplanation_swift.ts +49 -0
  331. package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +159 -0
  332. package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +58 -0
  333. package/project/.sdk/src/cmp/swift/ReadmeIntro_swift.ts +64 -0
  334. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +149 -0
  335. package/project/.sdk/src/cmp/swift/ReadmeOptions_swift.ts +62 -0
  336. package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +232 -0
  337. package/project/.sdk/src/cmp/swift/ReadmeRef_swift.ts +387 -0
  338. package/project/.sdk/src/cmp/swift/ReadmeTopHowto_swift.ts +24 -0
  339. package/project/.sdk/src/cmp/swift/ReadmeTopQuick_swift.ts +105 -0
  340. package/project/.sdk/src/cmp/swift/ReadmeTopTest_swift.ts +77 -0
  341. package/project/.sdk/src/cmp/swift/Test_swift.ts +4 -0
  342. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +19 -5
  343. package/project/.sdk/src/cmp/ts/MainEntity_ts.ts +4 -2
  344. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +4 -4
  345. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +14 -4
  346. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +29 -11
  347. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +5 -5
  348. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +4 -4
  349. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +4 -4
  350. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +13 -11
  351. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +18 -2
  352. package/project/.sdk/src/cmp/zig/Config_zig.ts +22 -4
  353. package/project/.sdk/src/cmp/zig/Entity_zig.ts +1 -1
  354. package/project/.sdk/src/cmp/zig/Main_zig.ts +10 -4
  355. package/project/.sdk/src/cmp/zig/Package_zig.ts +53 -0
  356. package/project/.sdk/src/cmp/zig/ReadmeEntity_zig.ts +188 -0
  357. package/project/.sdk/src/cmp/zig/ReadmeExamplesTest_zig.ts +58 -0
  358. package/project/.sdk/src/cmp/zig/ReadmeExplanation_zig.ts +45 -0
  359. package/project/.sdk/src/cmp/zig/ReadmeHowto_zig.ts +143 -0
  360. package/project/.sdk/src/cmp/zig/ReadmeInstall_zig.ts +54 -0
  361. package/project/.sdk/src/cmp/zig/ReadmeIntro_zig.ts +66 -0
  362. package/project/.sdk/src/cmp/zig/ReadmeModel_zig.ts +152 -0
  363. package/project/.sdk/src/cmp/zig/ReadmeOptions_zig.ts +60 -0
  364. package/project/.sdk/src/cmp/zig/ReadmeQuick_zig.ts +211 -0
  365. package/project/.sdk/src/cmp/zig/ReadmeRef_zig.ts +400 -0
  366. package/project/.sdk/src/cmp/zig/ReadmeTopHowto_zig.ts +24 -0
  367. package/project/.sdk/src/cmp/zig/ReadmeTopQuick_zig.ts +96 -0
  368. package/project/.sdk/src/cmp/zig/ReadmeTopTest_zig.ts +82 -0
  369. package/project/.sdk/src/cmp/zig/TestDirect_zig.ts +66 -0
  370. package/project/.sdk/src/cmp/zig/TestEntity_zig.ts +79 -0
  371. package/project/.sdk/src/cmp/zig/Test_zig.ts +17 -61
  372. package/project/.sdk/tm/clojure/src/voxgig/struct.clj +1 -1
  373. package/project/.sdk/tm/cpp/test/feature_test.cpp +19 -0
  374. package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +4 -1
  375. package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +7 -1
  376. package/project/.sdk/tm/elixir/lib/utility/struct/voxgig_struct.ex +1 -1
  377. package/project/.sdk/tm/elixir/test/primary_utility_test.exs +7 -1
  378. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +3 -1
  379. package/project/.sdk/tm/haskell/test/Harness.hs +8 -3
  380. package/project/.sdk/tm/js/Makefile +1 -1
  381. package/project/.sdk/tm/js/jsconfig.json +12 -0
  382. package/project/.sdk/tm/ocaml/Makefile +5 -1
  383. package/project/.sdk/tm/php/utility/struct/Struct.php +1 -1
  384. package/project/.sdk/tm/py/utility/voxgig_struct/voxgig_struct.py +1 -1
  385. package/project/.sdk/tm/rb/utility/struct/voxgig_struct.rb +1 -1
  386. package/project/.sdk/tm/scala/sdktest/SdkTestMain.scala +8 -59
  387. package/project/.sdk/tm/ts/Makefile +1 -1
  388. package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +1 -1
  389. package/src/cmp/ReadmeErrors.ts +2 -2
  390. package/src/cmp/ReadmeExplanation.ts +3 -3
  391. package/src/cmp/ReadmeTop.ts +2 -2
  392. package/src/helpers/canonType.ts +116 -25
  393. package/src/helpers/naming.ts +47 -0
  394. package/src/helpers/opExample.ts +43 -20
  395. package/src/helpers/opShape.ts +102 -3
  396. package/src/sdkgen.ts +8 -2
  397. package/src/tsconfig.json +2 -0
  398. package/project/.sdk/tm/zig/build.zig.zon +0 -11
@@ -0,0 +1,354 @@
1
+
2
+ import { cmp, each, File, Content } from '@voxgig/sdkgen'
3
+
4
+ import {
5
+ KIT,
6
+ getModelPath,
7
+ nom,
8
+ } from '@voxgig/apidef'
9
+
10
+
11
+ // Emits t/readme_examples.t — a Test::More COMPLETENESS GATE that guarantees
12
+ // every fenced `perl` code example across the package docs is unit-tested. It
13
+ // reads ALL THREE docs — the root (multi-language) ../README.md, the
14
+ // Perl-specific ../README.md, and ../REFERENCE.md — extracts every fenced perl
15
+ // block (tagged by source doc + index) and enforces:
16
+ //
17
+ // 1. SYNTAX — `perl -c` on every block (with the SDK lib on @INC, so a
18
+ // construction block's `use <Name>SDK` is actually compiled/loaded).
19
+ // 2. RUN — every RUNNABLE block (one that constructs the SDK, drives
20
+ // `$client`, or performs an entity op) is EXECUTED offline in seeded
21
+ // test mode against the real SDK. The captured stdout+stderr is scanned
22
+ // for FATAL perl-level programming-error markers REGARDLESS of exit code,
23
+ // so a bug an example's own eval swallows and prints is still caught.
24
+ // A domain not-found / 404 error never matches FATAL, so it is tolerated.
25
+ // 3. COMPLETENESS — every block is partitioned into exactly one of
26
+ // {executed, syntaxchecked-nonrunnable, illustration}; the counts must
27
+ // sum to the total. A runnable-looking block that was not executed lands
28
+ // in neither bucket and FAILS the gate.
29
+ //
30
+ // A runnable block is rewritten so its client is a test-mode client
31
+ // (<Name>SDK->test) seeded with an in-memory fixture for every entity it
32
+ // references; any real ->new/->test constructor is rewritten. A block that
33
+ // only uses `$client` (constructed in an earlier fenced block) gets a test
34
+ // client prepended.
35
+ //
36
+ // The emitted Perl builds the ``` fence via chr(96) so this generator string
37
+ // contains no backticks of its own.
38
+ const ReadmeExamplesTest = cmp(function ReadmeExamplesTest(props: any) {
39
+ const { target, ctx$: { model } } = props
40
+
41
+ const Name = model.const.Name
42
+ const sdkClass = Name + 'SDK'
43
+
44
+ // Entity accessor ($client->Name) => lowercase fixture storage key.
45
+ const entities = each(getModelPath(model, `main.${KIT}.entity`))
46
+ .filter((e: any) => e && e.active !== false)
47
+ const entityLines = entities
48
+ .map((e: any) => ` '${nom(e, 'Name')}' => '${e.name}',`)
49
+ .join('\n')
50
+
51
+ // Perl test files use the `.t` extension (run by `prove`), not target.ext
52
+ // (`pl`); this component is invoked inside the `t/` folder by Test_perl.
53
+ File({ name: 'readme_examples.t' }, () => {
54
+
55
+ Content(`#!perl
56
+ # ${Name} SDK - documentation example COMPLETENESS gate.
57
+ #
58
+ # Guarantees every fenced perl code example across ALL THREE package docs is
59
+ # unit-tested. Reads the root ../README.md, the Perl ../README.md, and
60
+ # ../REFERENCE.md, extracts every fenced perl block (tagged by source doc +
61
+ # index) and enforces:
62
+ #
63
+ # 1. SYNTAX - 'perl -c' on every block (SDK lib on \@INC).
64
+ # 2. RUN - every RUNNABLE block (constructs the SDK, drives \$client, or
65
+ # performs an entity op) is EXECUTED offline in seeded test mode
66
+ # (${sdkClass}->test) against the real SDK. Captured output is scanned for
67
+ # a real perl-level error (undefined subroutine, no such method, ...)
68
+ # REGARDLESS of exit code, so a bug an example's own eval swallows and
69
+ # prints cannot slip through. Expected not-found domain errors are
70
+ # tolerated.
71
+ # 3. COMPLETENESS - every block is partitioned into exactly one of
72
+ # {executed, syntaxchecked-nonrunnable, illustration}; the counts must sum
73
+ # to the total. A runnable-looking block that was not executed belongs to
74
+ # no bucket and FAILS the gate.
75
+ #
76
+ # Perl is dynamically typed, so syntax + actually running every example is the
77
+ # strongest check available without a live server.
78
+
79
+ use strict;
80
+ use warnings;
81
+ use Test::More;
82
+ use File::Temp ();
83
+ use File::Basename ();
84
+ use File::Spec ();
85
+ use Cwd ();
86
+
87
+ my $TEST_DIR = File::Basename::dirname(Cwd::abs_path(__FILE__));
88
+ my $PKG_ROOT = Cwd::abs_path(File::Spec->catdir($TEST_DIR, '..'));
89
+ my $LIB = File::Spec->catdir($PKG_ROOT, 'lib');
90
+
91
+ # The three documentation sources this gate covers.
92
+ my %DOCS = (
93
+ 'root README' => File::Spec->catfile($PKG_ROOT, '..', 'README.md'),
94
+ 'perl README' => File::Spec->catfile($PKG_ROOT, 'README.md'),
95
+ 'perl REFERENCE' => File::Spec->catfile($PKG_ROOT, 'REFERENCE.md'),
96
+ );
97
+
98
+ my $SDK_CLASS = '${sdkClass}';
99
+
100
+ # Entity accessor (\$client->Name) => fixture storage key (lowercase name).
101
+ my %ENTITIES = (
102
+ ${entityLines}
103
+ );
104
+
105
+ # Documented SDK method names - used only to recognise the NARROW
106
+ # signature/method-table "illustration" class.
107
+ my @METHODS = qw(options_map get_utility prepare direct data_get data_set match_get match_set make get_name);
108
+
109
+ # Perl-level errors that indicate a real bug in a documented example (as
110
+ # opposed to an expected not-found / domain error, which is tolerated).
111
+ my $FATAL = qr/Can't locate object method|Can't locate \\S+ in \\@INC|Undefined subroutine|Not a HASH reference|Not an ARRAY reference|Not a CODE reference|Not a SCALAR reference|Can't use string \\(.*?\\) as a? \\w+ ref|Can't use an undefined value as a? \\w+ reference|Can't call method .* on (?:an undefined value|unblessed reference)|Global symbol .* requires explicit package|Bareword .* not allowed|syntax error|Modification of a read-only value/;
112
+
113
+ my $FENCE = chr(96) x 3;
114
+
115
+ my @TMPFILES;
116
+ END { unlink @TMPFILES if @TMPFILES }
117
+
118
+
119
+ sub read_doc {
120
+ my ($path) = @_;
121
+ return undef unless -e $path;
122
+ open my $fh, '<:encoding(UTF-8)', $path or return undef;
123
+ local $/;
124
+ my $c = <$fh>;
125
+ close $fh;
126
+ return $c;
127
+ }
128
+
129
+
130
+ # Extract every fenced perl block from a document. Split on the fence: odd
131
+ # segments are the inside of a fenced block (info string on the first line,
132
+ # then code). Only blocks whose info string is exactly "perl" are returned, so
133
+ # other-language and plain fences are skipped.
134
+ sub blocks_in {
135
+ my ($text) = @_;
136
+ my @blocks;
137
+ my @parts = split /\\Q$FENCE\\E/, $text, -1;
138
+ for (my $i = 1; $i < @parts; $i += 2) {
139
+ my @lines = split /\\n/, $parts[$i], -1;
140
+ my $info = defined $lines[0] ? $lines[0] : '';
141
+ $info =~ s/^\\s+|\\s+$//g;
142
+ if ('perl' eq $info) {
143
+ shift @lines;
144
+ push @blocks, join("\\n", @lines);
145
+ }
146
+ }
147
+ return @blocks;
148
+ }
149
+
150
+
151
+ sub all_blocks {
152
+ my @all;
153
+ for my $label (sort keys %DOCS) {
154
+ my $text = read_doc($DOCS{$label});
155
+ next unless defined $text;
156
+ my $i = 0;
157
+ for my $code (blocks_in($text)) {
158
+ push @all, { doc => $label, n => $i, code => $code };
159
+ $i++;
160
+ }
161
+ }
162
+ return @all;
163
+ }
164
+
165
+
166
+ # --- classification --------------------------------------------------------
167
+
168
+ # A block is RUNNABLE when it constructs the SDK, drives \$client, or performs
169
+ # an entity operation. Every runnable block MUST be executed.
170
+ sub runnable {
171
+ my ($b) = @_;
172
+ return 1 if $b =~ /\\Q$SDK_CLASS\\E->(?:new|test)\\b/;
173
+ return 1 if $b =~ /\\\$client\\b/;
174
+ return 1 if $b =~ /->(?:load|list|create|update|remove)\\b/;
175
+ return 0;
176
+ }
177
+
178
+
179
+ # A block "mentions the SDK" when it references \$client, the SDK class, an
180
+ # entity accessor, or an entity operation.
181
+ sub looks_sdk {
182
+ my ($b) = @_;
183
+ return 1 if $b =~ /\\\$client\\b/;
184
+ return 1 if $b =~ /\\b\\Q$SDK_CLASS\\E\\b/;
185
+ return 1 if $b =~ /->(?:load|list|create|update|remove)\\b/;
186
+ for my $name (keys %ENTITIES) {
187
+ return 1 if $b =~ /->\\Q$name\\E\\b/;
188
+ }
189
+ return 0;
190
+ }
191
+
192
+
193
+ # NARROW illustration class: a non-runnable block that references the SDK class
194
+ # or a documented method NAME as a signature, and never uses \$client.
195
+ sub illustration {
196
+ my ($b) = @_;
197
+ return 0 if runnable($b);
198
+ return 0 if $b =~ /\\\$client\\b/;
199
+ return 1 if $b =~ /\\b\\Q$SDK_CLASS\\E\\b/;
200
+ for my $m (@METHODS) {
201
+ return 1 if $b =~ /\\b\\Q$m\\E\\s*\\(/;
202
+ }
203
+ return 0;
204
+ }
205
+
206
+
207
+ sub classify {
208
+ my ($b) = @_;
209
+ return 'executed' if runnable($b);
210
+ return 'illustration' if illustration($b);
211
+ return 'syntaxchecked_nonrunnable' unless looks_sdk($b);
212
+ return 'unclassified';
213
+ }
214
+
215
+
216
+ # --- execution -------------------------------------------------------------
217
+
218
+ # Build the SDK 'entity' fixture option (as Perl source) for the entities a
219
+ # block references, falling back to seeding all entities when none are named.
220
+ sub fixtures_literal {
221
+ my ($block) = @_;
222
+ my %refs;
223
+ for my $name (sort keys %ENTITIES) {
224
+ $refs{$name} = $ENTITIES{$name} if $block =~ /->\\Q$name\\E\\b/;
225
+ }
226
+ %refs = %ENTITIES unless %refs;
227
+ my @pairs;
228
+ for my $name (sort keys %refs) {
229
+ push @pairs, "'" . $refs{$name} . "' => { 'test01' => { 'id' => 'test01' } }";
230
+ }
231
+ return "{ 'entity' => { " . join(', ', @pairs) . " } }";
232
+ }
233
+
234
+
235
+ # Rewrite a runnable block into an executable offline test-mode program: the
236
+ # SDK lib is put on \@INC by absolute path; any real ->new/->test constructor
237
+ # becomes ${sdkClass}->test(<fixtures>); a block that only uses \$client gets
238
+ # such a constructor prepended. The constructor arg match is deliberately
239
+ # shallow (no nested parens) - runnable op blocks never build a client inline
240
+ # with a paren-bearing argument.
241
+ sub to_runner {
242
+ my ($block) = @_;
243
+ my $fixtures = fixtures_literal($block);
244
+ my $body;
245
+ if ($block =~ /\\Q$SDK_CLASS\\E->(?:new|test)\\b/) {
246
+ ($body = $block) =~ s/\\Q$SDK_CLASS\\E->(?:new|test)(?:\\s*\\([^()]*\\))?/$SDK_CLASS->test($fixtures)/g;
247
+ }
248
+ else {
249
+ $body = "my \\\$client = $SDK_CLASS->test($fixtures);\\n" . $block;
250
+ }
251
+ return "use lib '$LIB';\\nuse $SDK_CLASS;\\n" . $body;
252
+ }
253
+
254
+
255
+ sub write_temp {
256
+ my ($source) = @_;
257
+ my ($fh, $path) = File::Temp::tempfile(
258
+ 'readme_XXXXXX', SUFFIX => '.pl', DIR => File::Spec->tmpdir, UNLINK => 0);
259
+ binmode($fh, ':encoding(UTF-8)');
260
+ print $fh $source;
261
+ close $fh;
262
+ push @TMPFILES, $path;
263
+ return $path;
264
+ }
265
+
266
+
267
+ # --- tests -----------------------------------------------------------------
268
+
269
+ my @BLOCKS = all_blocks();
270
+
271
+ ok(scalar(@BLOCKS) > 0, 'docs contain perl examples');
272
+
273
+
274
+ # 1. SYNTAX gate: every documented perl block must compile.
275
+ {
276
+ my @failures;
277
+ for my $blk (@BLOCKS) {
278
+ my $path = write_temp($blk->{code});
279
+ my $out = qx{"$^X" -I"$LIB" -c "$path" 2>&1};
280
+ if (0 != $?) {
281
+ push @failures, "$blk->{doc} #$blk->{n}:\\n$out\\n$blk->{code}";
282
+ }
283
+ }
284
+ is(scalar(@failures), 0, 'all perl doc blocks have valid syntax')
285
+ or diag(join("\\n\\n", @failures));
286
+ }
287
+
288
+
289
+ # 2. RUN gate: every runnable perl block executes offline without a FATAL
290
+ # perl-level error (even one an example's eval swallows and prints).
291
+ {
292
+ my $ran = 0;
293
+ my @failures;
294
+ for my $blk (@BLOCKS) {
295
+ next unless runnable($blk->{code});
296
+ $ran++;
297
+ my $path = write_temp(to_runner($blk->{code}));
298
+ my $out = qx{"$^X" -I"$LIB" "$path" 2>&1};
299
+ if ($out =~ $FATAL) {
300
+ push @failures, "$blk->{doc} #$blk->{n} (exit @{[ $? >> 8 ]}):\\n$out\\n$blk->{code}";
301
+ }
302
+ }
303
+ ok($ran > 0, 'at least one runnable perl example executed');
304
+ is(scalar(@failures), 0, 'perl doc examples run offline without programming errors')
305
+ or diag(join("\\n\\n", @failures));
306
+ }
307
+
308
+
309
+ # 3. COMPLETENESS gate: every block is executed, syntaxchecked-nonrunnable, or
310
+ # a narrow illustration - nothing is silently dropped.
311
+ {
312
+ my %buckets = (
313
+ executed => [], syntaxchecked_nonrunnable => [], illustration => [], unclassified => []);
314
+ my %per_doc;
315
+ for my $blk (@BLOCKS) {
316
+ my $cls = classify($blk->{code});
317
+ push @{ $buckets{$cls} }, $blk;
318
+ $per_doc{$blk->{doc}} ||= { total => 0, executed => 0, syntaxchecked_nonrunnable => 0, illustration => 0, unclassified => 0 };
319
+ $per_doc{$blk->{doc}}{total}++;
320
+ $per_doc{$blk->{doc}}{$cls}++;
321
+ }
322
+
323
+ for my $doc (sort keys %per_doc) {
324
+ my $c = $per_doc{$doc};
325
+ note(sprintf('%-16s total=%d executed=%d syntaxchecked=%d illustration=%d%s',
326
+ $doc, $c->{total}, $c->{executed}, $c->{syntaxchecked_nonrunnable}, $c->{illustration},
327
+ $c->{unclassified} ? ' UNCLASSIFIED=' . $c->{unclassified} : ''));
328
+ }
329
+
330
+ my @unclassified = map { "$_->{doc} #$_->{n}:\\n$_->{code}" } @{ $buckets{unclassified} };
331
+ is(scalar(@unclassified), 0,
332
+ 'no runnable-looking perl block was left unexecuted')
333
+ or diag(join("\\n\\n", @unclassified));
334
+
335
+ my $total = scalar(@BLOCKS);
336
+ my $sum = scalar(@{ $buckets{executed} })
337
+ + scalar(@{ $buckets{syntaxchecked_nonrunnable} })
338
+ + scalar(@{ $buckets{illustration} });
339
+ is($sum, $total,
340
+ 'every perl block is executed, syntaxchecked-nonrunnable, or illustration');
341
+
342
+ ok(scalar(@{ $buckets{executed} }) > 0, 'at least one executed perl example');
343
+ }
344
+
345
+
346
+ done_testing();
347
+ `)
348
+ })
349
+ })
350
+
351
+
352
+ export {
353
+ ReadmeExamplesTest
354
+ }
@@ -0,0 +1,43 @@
1
+
2
+ import { cmp, Content } from '@voxgig/sdkgen'
3
+
4
+
5
+ const ReadmeExplanation = cmp(function ReadmeExplanation(props: any) {
6
+ const { target, ctx$: { model } } = props
7
+
8
+ Content(`### Data as hashrefs
9
+
10
+ The Perl SDK uses plain hashrefs and arrayrefs throughout rather than typed
11
+ objects. This mirrors the dynamic nature of the API and keeps the SDK
12
+ flexible — no code generation is needed when the API schema changes.
13
+
14
+ Use \`${model.const.Name}Helpers::to_map()\` to safely validate that a value
15
+ is a hashref.
16
+
17
+ ### Module structure
18
+
19
+ \`\`\`
20
+ ${target.name}/
21
+ ├── lib/${model.const.Name}SDK.pm -- Main SDK module (package ${model.const.Name}SDK)
22
+ ├── config.pm -- Configuration
23
+ ├── features.pm -- Feature factory
24
+ ├── core/ -- Core types and context
25
+ ├── entity/ -- Entity implementations
26
+ ├── feature/ -- Built-in features (base, test, log)
27
+ ├── utility/ -- Utility functions
28
+ ├── lib/Voxgig/Struct.pm -- Vendored struct library
29
+ └── t/ -- Test suites
30
+ \`\`\`
31
+
32
+ Load the main module with \`use lib 'lib'; use ${model.const.Name}SDK;\` — it
33
+ pulls in the config, features, and core modules for you. Require entity or
34
+ utility modules directly only when needed.
35
+
36
+ `)
37
+
38
+ })
39
+
40
+
41
+ export {
42
+ ReadmeExplanation
43
+ }
@@ -0,0 +1,149 @@
1
+
2
+ import { cmp, Content, isAuthActive, envName, canonKey, entityIdField, pickExampleEntity, opRequestShape } from '@voxgig/sdkgen'
3
+
4
+ import {
5
+ KIT,
6
+ getModelPath,
7
+ nom,
8
+ } from '@voxgig/apidef'
9
+
10
+
11
+ // A type-correct Perl literal for a field's canonical type.
12
+ function perlLit(type: any): string {
13
+ const k = canonKey(type)
14
+ if ('INTEGER' === k || 'NUMBER' === k) return '1'
15
+ if ('BOOLEAN' === k) return '1'
16
+ if ('ARRAY' === k) return '[]'
17
+ if ('OBJECT' === k) return '{}'
18
+ return "'example'"
19
+ }
20
+
21
+
22
+ const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
23
+ const { target, ctx$: { model } } = props
24
+
25
+ const entity = getModelPath(model, `main.${KIT}.entity`)
26
+ // Pick an entity with a real op (prefer a read op). primaryOp is null only
27
+ // when NO entity exposes any op (a direct()-only SDK).
28
+ const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
29
+ const eName = exampleEntity ? nom(exampleEntity, 'Name') : 'Entity'
30
+ const eVar = eName.toLowerCase()
31
+ // Model-driven id key: null when the entity has no id-like field, so a
32
+ // match op takes no argument.
33
+ const idF = exampleEntity ? entityIdField(exampleEntity) : null
34
+ const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
35
+ let testArg = ''
36
+ if (exampleEntity && isMatchOp) {
37
+ testArg = idF ? `{ '${idF}' => 'test01' }` : ''
38
+ } else if (exampleEntity && ('create' === primaryOp || 'update' === primaryOp)) {
39
+ const items = opRequestShape(exampleEntity, primaryOp).items
40
+ .filter((it: any) => it.name !== idF && it.name !== 'id')
41
+ const required = items.filter((it: any) => !it.optional)
42
+ const chosen = required.length ? required : items.slice(0, 3)
43
+ testArg = `{ ${chosen.map((it: any) => `'${it.name}' => ${perlLit(it.type)}`).join(', ')} }`
44
+ }
45
+
46
+ // The op-driven test-mode line, shown only when the SDK has an entity op.
47
+ // A direct()-only SDK (no ops anywhere) shows a direct() call instead.
48
+ const testModeExample = primaryOp
49
+ ? `# Entity ops return the bare record and die on error.
50
+ my $${eVar} = $client->${eName}->${primaryOp}(${testArg});
51
+ # $${eVar} contains the mock response record`
52
+ : `my $result = $client->direct({ 'path' => '/api/resource', 'method' => 'GET' });
53
+ print $result->{ok}, "\\n";`
54
+
55
+ const apikeyEnvLine = isAuthActive(model)
56
+ ? `\n${envName(model)}_APIKEY=<your-key>`
57
+ : ''
58
+
59
+ Content(`### Make a direct HTTP request
60
+
61
+ For endpoints not covered by entity methods:
62
+
63
+ \`\`\`perl
64
+ my $result = $client->direct({
65
+ 'path' => '/api/resource/{id}',
66
+ 'method' => 'GET',
67
+ 'params' => { 'id' => 'example' },
68
+ });
69
+
70
+ if ($result->{ok}) {
71
+ print $result->{status}, "\\n"; # 200
72
+ print $result->{data}, "\\n"; # response body
73
+ }
74
+ else {
75
+ # A non-2xx response carries status + data (the error body); a
76
+ # transport-level failure carries err instead. Only one is present, so
77
+ # read whichever is defined.
78
+ print $result->{status}, ' ', ($result->{err} // ''), "\\n";
79
+ }
80
+ \`\`\`
81
+
82
+ ### Prepare a request without sending it
83
+
84
+ \`\`\`perl
85
+ # prepare() returns the fetch definition and dies on error.
86
+ my $fetchdef = $client->prepare({
87
+ 'path' => '/api/resource/{id}',
88
+ 'method' => 'DELETE',
89
+ 'params' => { 'id' => 'example' },
90
+ });
91
+
92
+ print $fetchdef->{url}, "\\n";
93
+ print $fetchdef->{method}, "\\n";
94
+ print $fetchdef->{headers}, "\\n";
95
+ \`\`\`
96
+
97
+ ### Use test mode
98
+
99
+ Create a mock client for unit testing — no server required:
100
+
101
+ \`\`\`perl
102
+ my $client = ${model.const.Name}SDK->test(undef, undef);
103
+
104
+ ${testModeExample}
105
+ \`\`\`
106
+
107
+ ### Use a custom fetch function
108
+
109
+ Replace the HTTP transport with your own coderef:
110
+
111
+ \`\`\`perl
112
+ my $mock_fetch = sub {
113
+ my ($url, $init) = @_;
114
+ return ({
115
+ 'status' => 200,
116
+ 'statusText' => 'OK',
117
+ 'headers' => {},
118
+ 'json' => sub { { 'id' => 'mock01' } },
119
+ }, undef);
120
+ };
121
+
122
+ my $client = ${model.const.Name}SDK->new({
123
+ 'base' => 'http://localhost:8080',
124
+ 'system' => { 'fetch' => $mock_fetch },
125
+ });
126
+ \`\`\`
127
+
128
+ ### Run live tests
129
+
130
+ Create a \`.env.local\` file at the project root:
131
+
132
+ \`\`\`
133
+ ${envName(model)}_TEST_LIVE=TRUE${apikeyEnvLine}
134
+ \`\`\`
135
+
136
+ Then run:
137
+
138
+ \`\`\`bash
139
+ cd ${target.name} && prove -Ilib t/
140
+ \`\`\`
141
+
142
+ `)
143
+
144
+ })
145
+
146
+
147
+ export {
148
+ ReadmeHowto
149
+ }
@@ -0,0 +1,47 @@
1
+
2
+ import { cmp, Content, installCommand, isPublished, repoInfo } from '@voxgig/sdkgen'
3
+
4
+
5
+ const ReadmeInstall = cmp(function ReadmeInstall(props: any) {
6
+ const { target, ctx$ } = props
7
+ const { model } = ctx$
8
+
9
+ if (isPublished(model, target.name)) {
10
+ Content(`\`\`\`bash
11
+ ${installCommand(model, target.name)}
12
+ \`\`\`
13
+
14
+ Or install the \`${model.const.Name}SDK\` distribution from a source
15
+ checkout with cpanminus:
16
+
17
+ \`\`\`bash
18
+ cpanm .
19
+ \`\`\`
20
+
21
+ `)
22
+ return
23
+ }
24
+
25
+ // Publish pending: not yet on CPAN. This is a pure-Perl SDK with zero
26
+ // non-core runtime deps, so the simplest install is to add the SDK's
27
+ // \`lib\` directory to Perl's module search path (\`@INC\`).
28
+ const { releasesUrl } = repoInfo(model)
29
+ Content(`This package is not yet published to CPAN. Install it from the GitHub
30
+ release tag (\`${target.name}/vX.Y.Z\`, see [Releases](${releasesUrl})) or
31
+ from a source checkout.
32
+
33
+ The SDK is pure Perl with zero non-core runtime dependencies, so no build
34
+ step is required — just put its \`lib\` directory on \`@INC\`:
35
+
36
+ \`\`\`perl
37
+ use lib 'lib';
38
+ use ${model.const.Name}SDK;
39
+ \`\`\`
40
+
41
+ `)
42
+ })
43
+
44
+
45
+ export {
46
+ ReadmeInstall
47
+ }
@@ -0,0 +1,66 @@
1
+
2
+ import { cmp, Content } from '@voxgig/sdkgen'
3
+
4
+ import {
5
+ KIT,
6
+ getModelPath,
7
+ nom,
8
+ } from '@voxgig/apidef'
9
+
10
+
11
+ const ReadmeIntro = cmp(function ReadmeIntro(props: any) {
12
+ const { target, ctx$: { model } } = props
13
+ const info = (model.main && model.main.kit && model.main.kit.info) || {}
14
+ const tagline = info.tagline || ''
15
+
16
+ Content(`# ${model.Name} ${target.title} SDK
17
+
18
+ ${tagline}
19
+
20
+ The ${target.title} SDK for the ${model.Name} API — an entity-oriented client
21
+ following idiomatic Perl conventions.
22
+
23
+ `)
24
+
25
+ // Emphasise the entity-oriented design: the SDK surfaces the API as
26
+ // capitalised, semantic Entities with a small, uniform verb set rather
27
+ // than raw URL paths and query strings. The example entity name is
28
+ // derived from the model, never hardcoded.
29
+ const entity = getModelPath(model, `main.${KIT}.entity`)
30
+ const exampleEntity = Object.values(entity || {})
31
+ .find((e: any) => e.active !== false) as any
32
+ const example = exampleEntity
33
+ ? `for example \`$client->${nom(exampleEntity, 'Name')}\` — each`
34
+ : 'each'
35
+
36
+ // Model-driven op list — only the operations the active entities actually
37
+ // expose (a read-only entity has just list+load); never claim
38
+ // create/update/remove exist when no entity has them.
39
+ const CANON_OPS = ['list', 'load', 'create', 'update', 'remove']
40
+ const opSet = new Set<string>()
41
+ Object.values(entity || {}).forEach((e: any) => {
42
+ if (!e || e.active === false) return
43
+ Object.keys(e.op || {}).forEach((o: string) => {
44
+ if (e.op[o] && e.op[o].active !== false) opSet.add(o)
45
+ })
46
+ })
47
+ const opNames = CANON_OPS.filter((o) => opSet.has(o))
48
+ .concat([...opSet].filter((o) => !CANON_OPS.includes(o)))
49
+ const opList = (opNames.length ? opNames : ['list', 'load'])
50
+ .map((o) => '`' + o + '`').join(', ')
51
+
52
+ Content(`The SDK exposes the API as capitalised, semantic **Entities** — ${example}
53
+ carrying a small, uniform set of operations (${opList}) instead of raw URL
54
+ paths and query strings. You work with named resources and verbs, which
55
+ keeps the cognitive load low.
56
+
57
+ > Other languages, the CLI, and MCP server live alongside this one — see
58
+ > the [top-level README](../README.md).
59
+
60
+ `)
61
+ })
62
+
63
+
64
+ export {
65
+ ReadmeIntro
66
+ }