@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.
- package/bin/voxgig-sdkgen +1 -1
- package/dist/action/action.js.map +1 -1
- package/dist/action/feature.js.map +1 -1
- package/dist/action/target.js.map +1 -1
- package/dist/cmp/AgentGuide.js.map +1 -1
- package/dist/cmp/AgentGuideContent.js.map +1 -1
- package/dist/cmp/AgentGuideFeature.js.map +1 -1
- package/dist/cmp/AgentGuideTop.js.map +1 -1
- package/dist/cmp/Changelog.js.map +1 -1
- package/dist/cmp/Deploy.js.map +1 -1
- package/dist/cmp/Entity.js.map +1 -1
- package/dist/cmp/Feature.js.map +1 -1
- package/dist/cmp/FeatureHook.js.map +1 -1
- package/dist/cmp/License.js.map +1 -1
- package/dist/cmp/Main.js.map +1 -1
- package/dist/cmp/Readme.js.map +1 -1
- package/dist/cmp/ReadmeEntity.js.map +1 -1
- package/dist/cmp/ReadmeErrors.js +1 -1
- package/dist/cmp/ReadmeErrors.js.map +1 -1
- package/dist/cmp/ReadmeExplanation.js +2 -2
- package/dist/cmp/ReadmeExplanation.js.map +1 -1
- package/dist/cmp/ReadmeHowto.js.map +1 -1
- package/dist/cmp/ReadmeInstall.js.map +1 -1
- package/dist/cmp/ReadmeIntro.js.map +1 -1
- package/dist/cmp/ReadmeModel.js.map +1 -1
- package/dist/cmp/ReadmeOptions.js.map +1 -1
- package/dist/cmp/ReadmeQuick.js.map +1 -1
- package/dist/cmp/ReadmeRef.js.map +1 -1
- package/dist/cmp/ReadmeTop.js +1 -1
- package/dist/cmp/ReadmeTop.js.map +1 -1
- package/dist/cmp/Security.js.map +1 -1
- package/dist/cmp/Test.js.map +1 -1
- package/dist/helpers/buildIdNames.js.map +1 -1
- package/dist/helpers/canonType.d.ts +3 -2
- package/dist/helpers/canonType.js +107 -24
- package/dist/helpers/canonType.js.map +1 -1
- package/dist/helpers/collectDeps.js.map +1 -1
- package/dist/helpers/getMatchEntries.js.map +1 -1
- package/dist/helpers/naming.d.ts +5 -1
- package/dist/helpers/naming.js +37 -0
- package/dist/helpers/naming.js.map +1 -1
- package/dist/helpers/opExample.d.ts +1 -1
- package/dist/helpers/opExample.js +37 -20
- package/dist/helpers/opExample.js.map +1 -1
- package/dist/helpers/opShape.d.ts +3 -1
- package/dist/helpers/opShape.js +91 -3
- package/dist/helpers/opShape.js.map +1 -1
- package/dist/helpers/packageMeta.js.map +1 -1
- package/dist/sdkgen.d.ts +3 -3
- package/dist/sdkgen.js +7 -1
- package/dist/sdkgen.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utility.js.map +1 -1
- package/package.json +7 -6
- package/project/.sdk/model/target/haskell.aontu +6 -3
- package/project/.sdk/model/target/zig.aontu +12 -2
- package/project/.sdk/src/cmp/c/Config_c.ts +16 -4
- package/project/.sdk/src/cmp/c/EntityTypes_c.ts +168 -0
- package/project/.sdk/src/cmp/c/Main_c.ts +4 -0
- package/project/.sdk/src/cmp/c/ReadmeEntity_c.ts +192 -0
- package/project/.sdk/src/cmp/c/ReadmeExamplesTest_c.ts +152 -0
- package/project/.sdk/src/cmp/c/ReadmeExplanation_c.ts +55 -0
- package/project/.sdk/src/cmp/c/ReadmeHowto_c.ts +168 -0
- package/project/.sdk/src/cmp/c/ReadmeInstall_c.ts +52 -0
- package/project/.sdk/src/cmp/c/ReadmeIntro_c.ts +67 -0
- package/project/.sdk/src/cmp/c/ReadmeModel_c.ts +151 -0
- package/project/.sdk/src/cmp/c/ReadmeOptions_c.ts +65 -0
- package/project/.sdk/src/cmp/c/ReadmeQuick_c.ts +225 -0
- package/project/.sdk/src/cmp/c/ReadmeRef_c.ts +398 -0
- package/project/.sdk/src/cmp/c/ReadmeTopHowto_c.ts +24 -0
- package/project/.sdk/src/cmp/c/ReadmeTopQuick_c.ts +104 -0
- package/project/.sdk/src/cmp/c/ReadmeTopTest_c.ts +86 -0
- package/project/.sdk/src/cmp/c/TestEntity_c.ts +10 -0
- package/project/.sdk/src/cmp/c/Test_c.ts +4 -0
- package/project/.sdk/src/cmp/c/utility_c.ts +8 -2
- package/project/.sdk/src/cmp/clojure/ReadmeEntity_clojure.ts +182 -0
- package/project/.sdk/src/cmp/clojure/ReadmeExamplesTest_clojure.ts +54 -0
- package/project/.sdk/src/cmp/clojure/ReadmeExplanation_clojure.ts +44 -0
- package/project/.sdk/src/cmp/clojure/ReadmeHowto_clojure.ts +144 -0
- package/project/.sdk/src/cmp/clojure/ReadmeInstall_clojure.ts +51 -0
- package/project/.sdk/src/cmp/clojure/ReadmeIntro_clojure.ts +66 -0
- package/project/.sdk/src/cmp/clojure/ReadmeModel_clojure.ts +156 -0
- package/project/.sdk/src/cmp/clojure/ReadmeOptions_clojure.ts +61 -0
- package/project/.sdk/src/cmp/clojure/ReadmeQuick_clojure.ts +210 -0
- package/project/.sdk/src/cmp/clojure/ReadmeRef_clojure.ts +409 -0
- package/project/.sdk/src/cmp/clojure/ReadmeTopHowto_clojure.ts +24 -0
- package/project/.sdk/src/cmp/clojure/ReadmeTopQuick_clojure.ts +98 -0
- package/project/.sdk/src/cmp/clojure/ReadmeTopTest_clojure.ts +78 -0
- package/project/.sdk/src/cmp/clojure/TestDirect_clojure.ts +58 -0
- package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +79 -0
- package/project/.sdk/src/cmp/clojure/Test_clojure.ts +21 -65
- package/project/.sdk/src/cmp/cpp/EntityTypes_cpp.ts +174 -0
- package/project/.sdk/src/cmp/cpp/Main_cpp.ts +5 -0
- package/project/.sdk/src/cmp/cpp/ReadmeEntity_cpp.ts +170 -0
- package/project/.sdk/src/cmp/cpp/ReadmeExplanation_cpp.ts +45 -0
- package/project/.sdk/src/cmp/cpp/ReadmeHowto_cpp.ts +139 -0
- package/project/.sdk/src/cmp/cpp/ReadmeInstall_cpp.ts +42 -0
- package/project/.sdk/src/cmp/cpp/ReadmeIntro_cpp.ts +69 -0
- package/project/.sdk/src/cmp/cpp/ReadmeModel_cpp.ts +155 -0
- package/project/.sdk/src/cmp/cpp/ReadmeOptions_cpp.ts +62 -0
- package/project/.sdk/src/cmp/cpp/ReadmeQuick_cpp.ts +234 -0
- package/project/.sdk/src/cmp/cpp/ReadmeRef_cpp.ts +387 -0
- package/project/.sdk/src/cmp/cpp/ReadmeTopHowto_cpp.ts +24 -0
- package/project/.sdk/src/cmp/cpp/ReadmeTopQuick_cpp.ts +95 -0
- package/project/.sdk/src/cmp/cpp/ReadmeTopTest_cpp.ts +70 -0
- package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +5 -1
- package/project/.sdk/src/cmp/csharp/EntityTypes_csharp.ts +196 -0
- package/project/.sdk/src/cmp/csharp/Main_csharp.ts +6 -0
- package/project/.sdk/src/cmp/csharp/ReadmeEntity_csharp.ts +174 -0
- package/project/.sdk/src/cmp/csharp/ReadmeExamplesTest_csharp.ts +198 -0
- package/project/.sdk/src/cmp/csharp/ReadmeExplanation_csharp.ts +42 -0
- package/project/.sdk/src/cmp/csharp/ReadmeHowto_csharp.ts +168 -0
- package/project/.sdk/src/cmp/csharp/ReadmeInstall_csharp.ts +41 -0
- package/project/.sdk/src/cmp/csharp/ReadmeIntro_csharp.ts +65 -0
- package/project/.sdk/src/cmp/csharp/ReadmeModel_csharp.ts +148 -0
- package/project/.sdk/src/cmp/csharp/ReadmeOptions_csharp.ts +60 -0
- package/project/.sdk/src/cmp/csharp/ReadmeQuick_csharp.ts +219 -0
- package/project/.sdk/src/cmp/csharp/ReadmeRef_csharp.ts +390 -0
- package/project/.sdk/src/cmp/csharp/ReadmeTopHowto_csharp.ts +25 -0
- package/project/.sdk/src/cmp/csharp/ReadmeTopQuick_csharp.ts +92 -0
- package/project/.sdk/src/cmp/csharp/ReadmeTopTest_csharp.ts +77 -0
- package/project/.sdk/src/cmp/csharp/Test_csharp.ts +4 -0
- package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +43 -29
- package/project/.sdk/src/cmp/dart/Entity_dart.ts +8 -0
- package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +166 -0
- package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +238 -0
- package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +53 -0
- package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +151 -0
- package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +59 -0
- package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +65 -0
- package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +151 -0
- package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +63 -0
- package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +214 -0
- package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +381 -0
- package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +24 -0
- package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +95 -0
- package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +78 -0
- package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +52 -0
- package/project/.sdk/src/cmp/dart/Test_dart.ts +6 -0
- package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +1 -3
- package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +1 -40
- package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +3 -3
- package/project/.sdk/src/cmp/elixir/EntityTypes_elixir.ts +165 -0
- package/project/.sdk/src/cmp/elixir/Main_elixir.ts +4 -0
- package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
- package/project/.sdk/src/cmp/elixir/ReadmeEntity_elixir.ts +163 -0
- package/project/.sdk/src/cmp/elixir/ReadmeExamplesTest_elixir.ts +126 -0
- package/project/.sdk/src/cmp/elixir/ReadmeExplanation_elixir.ts +55 -0
- package/project/.sdk/src/cmp/elixir/ReadmeHowto_elixir.ts +149 -0
- package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +67 -0
- package/project/.sdk/src/cmp/elixir/ReadmeIntro_elixir.ts +66 -0
- package/project/.sdk/src/cmp/elixir/ReadmeModel_elixir.ts +150 -0
- package/project/.sdk/src/cmp/elixir/ReadmeOptions_elixir.ts +62 -0
- package/project/.sdk/src/cmp/elixir/ReadmeQuick_elixir.ts +198 -0
- package/project/.sdk/src/cmp/elixir/ReadmeRef_elixir.ts +333 -0
- package/project/.sdk/src/cmp/elixir/ReadmeTopHowto_elixir.ts +26 -0
- package/project/.sdk/src/cmp/elixir/ReadmeTopQuick_elixir.ts +79 -0
- package/project/.sdk/src/cmp/elixir/ReadmeTopTest_elixir.ts +68 -0
- package/project/.sdk/src/cmp/elixir/Test_elixir.ts +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/utility_elixir.ts +32 -0
- package/project/.sdk/src/cmp/go/EntityTypes_go.ts +12 -3
- package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +6 -1
- package/project/.sdk/src/cmp/go/TestEntity_go.ts +10 -3
- package/project/.sdk/src/cmp/go/utility_go.ts +3 -2
- package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +240 -43
- package/project/.sdk/src/cmp/go-cli/fragment/main.fragment.go +27 -5
- package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +191 -30
- package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +181 -0
- package/project/.sdk/src/cmp/haskell/ReadmeExamplesTest_haskell.ts +125 -0
- package/project/.sdk/src/cmp/haskell/ReadmeExplanation_haskell.ts +48 -0
- package/project/.sdk/src/cmp/haskell/ReadmeHowto_haskell.ts +168 -0
- package/project/.sdk/src/cmp/haskell/ReadmeInstall_haskell.ts +51 -0
- package/project/.sdk/src/cmp/haskell/ReadmeIntro_haskell.ts +67 -0
- package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +160 -0
- package/project/.sdk/src/cmp/haskell/ReadmeOptions_haskell.ts +74 -0
- package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +237 -0
- package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +405 -0
- package/project/.sdk/src/cmp/haskell/ReadmeTopHowto_haskell.ts +31 -0
- package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +104 -0
- package/project/.sdk/src/cmp/haskell/ReadmeTopTest_haskell.ts +80 -0
- package/project/.sdk/src/cmp/haskell/Test_haskell.ts +27 -2
- package/project/.sdk/src/cmp/java/EntityTypes_java.ts +207 -0
- package/project/.sdk/src/cmp/java/Main_java.ts +6 -0
- package/project/.sdk/src/cmp/java/ReadmeEntity_java.ts +175 -0
- package/project/.sdk/src/cmp/java/ReadmeExamplesTest_java.ts +186 -0
- package/project/.sdk/src/cmp/java/ReadmeExplanation_java.ts +46 -0
- package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +156 -0
- package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +52 -0
- package/project/.sdk/src/cmp/java/ReadmeIntro_java.ts +66 -0
- package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +150 -0
- package/project/.sdk/src/cmp/java/ReadmeOptions_java.ts +61 -0
- package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +230 -0
- package/project/.sdk/src/cmp/java/ReadmeRef_java.ts +388 -0
- package/project/.sdk/src/cmp/java/ReadmeTopHowto_java.ts +23 -0
- package/project/.sdk/src/cmp/java/ReadmeTopQuick_java.ts +103 -0
- package/project/.sdk/src/cmp/java/ReadmeTopTest_java.ts +77 -0
- package/project/.sdk/src/cmp/java/Test_java.ts +4 -0
- package/project/.sdk/src/cmp/js/EntityTypes_js.ts +25 -8
- package/project/.sdk/src/cmp/js/MainEntity_js.ts +4 -2
- package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +4 -4
- package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +13 -4
- package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +4 -4
- package/project/.sdk/src/cmp/js/ReadmeRef_js.ts +5 -5
- package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +4 -4
- package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +4 -4
- package/project/.sdk/src/cmp/js/TestDirect_js.ts +6 -5
- package/project/.sdk/src/cmp/js/TestEntity_js.ts +7 -2
- package/project/.sdk/src/cmp/js/fragment/Entity.test.fragment.js +0 -31
- package/project/.sdk/src/cmp/kotlin/EntityTypes_kotlin.ts +201 -0
- package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +6 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeEntity_kotlin.ts +175 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeExamplesTest_kotlin.ts +173 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeExplanation_kotlin.ts +47 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +154 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +50 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeIntro_kotlin.ts +66 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +150 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeOptions_kotlin.ts +61 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +230 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeRef_kotlin.ts +387 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeTopHowto_kotlin.ts +23 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeTopQuick_kotlin.ts +104 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeTopTest_kotlin.ts +77 -0
- package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +4 -0
- package/project/.sdk/src/cmp/lua/Config_lua.ts +1 -1
- package/project/.sdk/src/cmp/lua/EntityTypes_lua.ts +19 -5
- package/project/.sdk/src/cmp/lua/Main_lua.ts +14 -2
- package/project/.sdk/src/cmp/lua/ReadmeEntity_lua.ts +2 -2
- package/project/.sdk/src/cmp/lua/ReadmeHowto_lua.ts +6 -1
- package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +3 -3
- package/project/.sdk/src/cmp/lua/ReadmeRef_lua.ts +2 -2
- package/project/.sdk/src/cmp/lua/ReadmeTopQuick_lua.ts +2 -2
- package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +7 -2
- package/project/.sdk/src/cmp/lua/Test_lua.ts +1 -1
- package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +2 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +180 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeExamplesTest_ocaml.ts +111 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeExplanation_ocaml.ts +46 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +147 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeInstall_ocaml.ts +44 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeIntro_ocaml.ts +68 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +155 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeOptions_ocaml.ts +59 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +205 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +402 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeTopHowto_ocaml.ts +25 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +86 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +79 -0
- package/project/.sdk/src/cmp/ocaml/Test_ocaml.ts +4 -0
- package/project/.sdk/src/cmp/perl/ReadmeEntity_perl.ts +181 -0
- package/project/.sdk/src/cmp/perl/ReadmeExamplesTest_perl.ts +354 -0
- package/project/.sdk/src/cmp/perl/ReadmeExplanation_perl.ts +43 -0
- package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +149 -0
- package/project/.sdk/src/cmp/perl/ReadmeInstall_perl.ts +47 -0
- package/project/.sdk/src/cmp/perl/ReadmeIntro_perl.ts +66 -0
- package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +150 -0
- package/project/.sdk/src/cmp/perl/ReadmeOptions_perl.ts +59 -0
- package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +216 -0
- package/project/.sdk/src/cmp/perl/ReadmeRef_perl.ts +399 -0
- package/project/.sdk/src/cmp/perl/ReadmeTopHowto_perl.ts +24 -0
- package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +91 -0
- package/project/.sdk/src/cmp/perl/ReadmeTopTest_perl.ts +83 -0
- package/project/.sdk/src/cmp/perl/Test_perl.ts +4 -0
- package/project/.sdk/src/cmp/php/EntityTypes_php.ts +23 -6
- package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +6 -1
- package/project/.sdk/src/cmp/php/TestEntity_php.ts +7 -2
- package/project/.sdk/src/cmp/py/EntityTypes_py.ts +32 -7
- package/project/.sdk/src/cmp/py/Entity_py.ts +2 -10
- package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +2 -2
- package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +8 -3
- package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +3 -3
- package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +2 -2
- package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +2 -2
- package/project/.sdk/src/cmp/py/ReadmeTopTest_py.ts +2 -2
- package/project/.sdk/src/cmp/py/TestEntity_py.ts +7 -2
- package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +19 -5
- package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +8 -3
- package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +3 -3
- package/project/.sdk/src/cmp/rb/ReadmeRef_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/ReadmeTopTest_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +7 -2
- package/project/.sdk/src/cmp/rust/EntityBase_rust.ts +4 -0
- package/project/.sdk/src/cmp/rust/EntityTypes_rust.ts +152 -0
- package/project/.sdk/src/cmp/rust/Entity_rust.ts +1 -1
- package/project/.sdk/src/cmp/rust/Main_rust.ts +5 -0
- package/project/.sdk/src/cmp/rust/ReadmeEntity_rust.ts +163 -0
- package/project/.sdk/src/cmp/rust/ReadmeExamplesTest_rust.ts +132 -0
- package/project/.sdk/src/cmp/rust/ReadmeExplanation_rust.ts +44 -0
- package/project/.sdk/src/cmp/rust/ReadmeHowto_rust.ts +142 -0
- package/project/.sdk/src/cmp/rust/ReadmeInstall_rust.ts +49 -0
- package/project/.sdk/src/cmp/rust/ReadmeIntro_rust.ts +66 -0
- package/project/.sdk/src/cmp/rust/ReadmeModel_rust.ts +153 -0
- package/project/.sdk/src/cmp/rust/ReadmeOptions_rust.ts +60 -0
- package/project/.sdk/src/cmp/rust/ReadmeQuick_rust.ts +212 -0
- package/project/.sdk/src/cmp/rust/ReadmeRef_rust.ts +384 -0
- package/project/.sdk/src/cmp/rust/ReadmeTopHowto_rust.ts +24 -0
- package/project/.sdk/src/cmp/rust/ReadmeTopQuick_rust.ts +95 -0
- package/project/.sdk/src/cmp/rust/ReadmeTopTest_rust.ts +81 -0
- package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +10 -0
- package/project/.sdk/src/cmp/rust/Test_rust.ts +4 -0
- package/project/.sdk/src/cmp/scala/EntityTypes_scala.ts +202 -0
- package/project/.sdk/src/cmp/scala/Main_scala.ts +6 -0
- package/project/.sdk/src/cmp/scala/ReadmeEntity_scala.ts +175 -0
- package/project/.sdk/src/cmp/scala/ReadmeExamplesTest_scala.ts +163 -0
- package/project/.sdk/src/cmp/scala/ReadmeExplanation_scala.ts +49 -0
- package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +155 -0
- package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +58 -0
- package/project/.sdk/src/cmp/scala/ReadmeIntro_scala.ts +66 -0
- package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +150 -0
- package/project/.sdk/src/cmp/scala/ReadmeOptions_scala.ts +61 -0
- package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +230 -0
- package/project/.sdk/src/cmp/scala/ReadmeRef_scala.ts +388 -0
- package/project/.sdk/src/cmp/scala/ReadmeTopHowto_scala.ts +23 -0
- package/project/.sdk/src/cmp/scala/ReadmeTopQuick_scala.ts +104 -0
- package/project/.sdk/src/cmp/scala/ReadmeTopTest_scala.ts +77 -0
- package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +38 -10
- package/project/.sdk/src/cmp/scala/Test_scala.ts +8 -0
- package/project/.sdk/src/cmp/swift/EntityTypes_swift.ts +152 -0
- package/project/.sdk/src/cmp/swift/Main_swift.ts +5 -0
- package/project/.sdk/src/cmp/swift/ReadmeEntity_swift.ts +176 -0
- package/project/.sdk/src/cmp/swift/ReadmeExamplesTest_swift.ts +170 -0
- package/project/.sdk/src/cmp/swift/ReadmeExplanation_swift.ts +49 -0
- package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +159 -0
- package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +58 -0
- package/project/.sdk/src/cmp/swift/ReadmeIntro_swift.ts +64 -0
- package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +149 -0
- package/project/.sdk/src/cmp/swift/ReadmeOptions_swift.ts +62 -0
- package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +232 -0
- package/project/.sdk/src/cmp/swift/ReadmeRef_swift.ts +387 -0
- package/project/.sdk/src/cmp/swift/ReadmeTopHowto_swift.ts +24 -0
- package/project/.sdk/src/cmp/swift/ReadmeTopQuick_swift.ts +105 -0
- package/project/.sdk/src/cmp/swift/ReadmeTopTest_swift.ts +77 -0
- package/project/.sdk/src/cmp/swift/Test_swift.ts +4 -0
- package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +19 -5
- package/project/.sdk/src/cmp/ts/MainEntity_ts.ts +4 -2
- package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +4 -4
- package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +14 -4
- package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +29 -11
- package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +5 -5
- package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +4 -4
- package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +4 -4
- package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +13 -11
- package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +18 -2
- package/project/.sdk/src/cmp/zig/Config_zig.ts +22 -4
- package/project/.sdk/src/cmp/zig/Entity_zig.ts +1 -1
- package/project/.sdk/src/cmp/zig/Main_zig.ts +10 -4
- package/project/.sdk/src/cmp/zig/Package_zig.ts +53 -0
- package/project/.sdk/src/cmp/zig/ReadmeEntity_zig.ts +188 -0
- package/project/.sdk/src/cmp/zig/ReadmeExamplesTest_zig.ts +58 -0
- package/project/.sdk/src/cmp/zig/ReadmeExplanation_zig.ts +45 -0
- package/project/.sdk/src/cmp/zig/ReadmeHowto_zig.ts +143 -0
- package/project/.sdk/src/cmp/zig/ReadmeInstall_zig.ts +54 -0
- package/project/.sdk/src/cmp/zig/ReadmeIntro_zig.ts +66 -0
- package/project/.sdk/src/cmp/zig/ReadmeModel_zig.ts +152 -0
- package/project/.sdk/src/cmp/zig/ReadmeOptions_zig.ts +60 -0
- package/project/.sdk/src/cmp/zig/ReadmeQuick_zig.ts +211 -0
- package/project/.sdk/src/cmp/zig/ReadmeRef_zig.ts +400 -0
- package/project/.sdk/src/cmp/zig/ReadmeTopHowto_zig.ts +24 -0
- package/project/.sdk/src/cmp/zig/ReadmeTopQuick_zig.ts +96 -0
- package/project/.sdk/src/cmp/zig/ReadmeTopTest_zig.ts +82 -0
- package/project/.sdk/src/cmp/zig/TestDirect_zig.ts +66 -0
- package/project/.sdk/src/cmp/zig/TestEntity_zig.ts +79 -0
- package/project/.sdk/src/cmp/zig/Test_zig.ts +17 -61
- package/project/.sdk/tm/clojure/src/voxgig/struct.clj +1 -1
- package/project/.sdk/tm/cpp/test/feature_test.cpp +19 -0
- package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +4 -1
- package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +7 -1
- package/project/.sdk/tm/elixir/lib/utility/struct/voxgig_struct.ex +1 -1
- package/project/.sdk/tm/elixir/test/primary_utility_test.exs +7 -1
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +3 -1
- package/project/.sdk/tm/haskell/test/Harness.hs +8 -3
- package/project/.sdk/tm/js/Makefile +1 -1
- package/project/.sdk/tm/js/jsconfig.json +12 -0
- package/project/.sdk/tm/ocaml/Makefile +5 -1
- package/project/.sdk/tm/php/utility/struct/Struct.php +1 -1
- package/project/.sdk/tm/py/utility/voxgig_struct/voxgig_struct.py +1 -1
- package/project/.sdk/tm/rb/utility/struct/voxgig_struct.rb +1 -1
- package/project/.sdk/tm/scala/sdktest/SdkTestMain.scala +8 -59
- package/project/.sdk/tm/ts/Makefile +1 -1
- package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +1 -1
- package/src/cmp/ReadmeErrors.ts +2 -2
- package/src/cmp/ReadmeExplanation.ts +3 -3
- package/src/cmp/ReadmeTop.ts +2 -2
- package/src/helpers/canonType.ts +116 -25
- package/src/helpers/naming.ts +47 -0
- package/src/helpers/opExample.ts +43 -20
- package/src/helpers/opShape.ts +102 -3
- package/src/sdkgen.ts +8 -2
- package/src/tsconfig.json +2 -0
- 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
|
+
}
|