@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,399 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, each, Content, canonKey, File, isAuthActive, entityIdField, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
} from '@voxgig/apidef'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
// A type-correct, executable Perl literal for a field's canonical type.
|
|
11
|
+
function perlLit(type: any, placeholder: string = 'example'): string {
|
|
12
|
+
const k = canonKey(type)
|
|
13
|
+
if ('INTEGER' === k || 'NUMBER' === k) return '1'
|
|
14
|
+
if ('BOOLEAN' === k) return '1'
|
|
15
|
+
if ('ARRAY' === k) return '[]'
|
|
16
|
+
if ('OBJECT' === k) return '{}'
|
|
17
|
+
return `'${placeholder}'`
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
// Perl has no static types; describe field shapes with idiomatic Perl terms.
|
|
22
|
+
function perlType(type: any): string {
|
|
23
|
+
const k = canonKey(type)
|
|
24
|
+
const m: Record<string, string> = {
|
|
25
|
+
STRING: 'string', INTEGER: 'integer', NUMBER: 'number',
|
|
26
|
+
BOOLEAN: 'boolean', ARRAY: 'arrayref', OBJECT: 'hashref', NULL: 'undef',
|
|
27
|
+
}
|
|
28
|
+
return m[k] || 'scalar'
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
const OP_SIGNATURES: Record<string, { sig: string, returns: string, desc: string }> = {
|
|
33
|
+
load: {
|
|
34
|
+
sig: 'load($reqmatch, $ctrl) -> hashref',
|
|
35
|
+
returns: 'the entity data',
|
|
36
|
+
desc: 'Load a single entity matching the given criteria. Returns the entity data and dies on error.',
|
|
37
|
+
},
|
|
38
|
+
list: {
|
|
39
|
+
sig: 'list($reqmatch, $ctrl) -> arrayref',
|
|
40
|
+
returns: 'an arrayref of entities',
|
|
41
|
+
desc: 'List entities matching the given criteria. The match is optional — call `list` with no argument to list all records. Returns an arrayref and dies on error.',
|
|
42
|
+
},
|
|
43
|
+
create: {
|
|
44
|
+
sig: 'create($reqdata, $ctrl) -> hashref',
|
|
45
|
+
returns: 'the created entity data',
|
|
46
|
+
desc: 'Create a new entity with the given data. Returns the created entity data and dies on error.',
|
|
47
|
+
},
|
|
48
|
+
update: {
|
|
49
|
+
sig: 'update($reqdata, $ctrl) -> hashref',
|
|
50
|
+
returns: 'the updated entity data',
|
|
51
|
+
desc: 'Update an existing entity. The data must include the entity `id`. Returns the updated entity data and dies on error.',
|
|
52
|
+
},
|
|
53
|
+
remove: {
|
|
54
|
+
sig: 'remove($reqmatch, $ctrl) -> hashref',
|
|
55
|
+
returns: 'the removed entity data',
|
|
56
|
+
desc: 'Remove the entity matching the given criteria. Dies on error.',
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
const ReadmeRef = cmp(function ReadmeRef(props: any) {
|
|
62
|
+
const { target } = props
|
|
63
|
+
const { model } = props.ctx$
|
|
64
|
+
|
|
65
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
66
|
+
const feature = getModelPath(model, `main.${KIT}.feature`)
|
|
67
|
+
|
|
68
|
+
const publishedEntities = each(entity).filter((e: any) => e.active !== false)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
File({ name: 'REFERENCE.md' }, () => {
|
|
72
|
+
|
|
73
|
+
Content(`# ${model.Name} ${target.title} SDK Reference
|
|
74
|
+
|
|
75
|
+
Complete API reference for the ${model.Name} ${target.title} SDK.
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
## ${model.Name}SDK
|
|
79
|
+
|
|
80
|
+
### Constructor
|
|
81
|
+
|
|
82
|
+
`)
|
|
83
|
+
|
|
84
|
+
Content(`\`\`\`perl
|
|
85
|
+
use lib 'lib';
|
|
86
|
+
use ${model.const.Name}SDK;
|
|
87
|
+
|
|
88
|
+
my $client = ${model.const.Name}SDK->new($options);
|
|
89
|
+
\`\`\`
|
|
90
|
+
|
|
91
|
+
Create a new SDK client instance.
|
|
92
|
+
|
|
93
|
+
**Parameters:**
|
|
94
|
+
|
|
95
|
+
| Name | Type | Description |
|
|
96
|
+
| --- | --- | --- |
|
|
97
|
+
| \`$options\` | \`hashref\` | SDK configuration options. |
|
|
98
|
+
${isAuthActive(model) ? '| \`$options->{apikey}\` | \`string\` | API key for authentication. |\n' : ''}| \`$options->{base}\` | \`string\` | Base URL for API requests. |
|
|
99
|
+
| \`$options->{prefix}\` | \`string\` | URL prefix appended after base. |
|
|
100
|
+
| \`$options->{suffix}\` | \`string\` | URL suffix appended after path. |
|
|
101
|
+
| \`$options->{headers}\` | \`hashref\` | Custom headers for all requests. |
|
|
102
|
+
| \`$options->{feature}\` | \`hashref\` | Feature configuration. |
|
|
103
|
+
| \`$options->{system}\` | \`hashref\` | System overrides (e.g. custom fetch). |
|
|
104
|
+
|
|
105
|
+
`)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
Content(`
|
|
109
|
+
### Static Methods
|
|
110
|
+
|
|
111
|
+
`)
|
|
112
|
+
|
|
113
|
+
Content(`#### \`${model.const.Name}SDK->test($testopts, $sdkopts)\`
|
|
114
|
+
|
|
115
|
+
Create a test client with mock features active. Both arguments may be \`undef\`.
|
|
116
|
+
|
|
117
|
+
\`\`\`perl
|
|
118
|
+
my $client = ${model.const.Name}SDK->test();
|
|
119
|
+
\`\`\`
|
|
120
|
+
|
|
121
|
+
`)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
Content(`
|
|
125
|
+
### Instance Methods
|
|
126
|
+
|
|
127
|
+
`)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
// Entity factory methods
|
|
131
|
+
publishedEntities.map((ent: any) => {
|
|
132
|
+
Content(`#### \`${ent.Name}($data)\`
|
|
133
|
+
|
|
134
|
+
Create a new \`${ent.Name}\` entity instance. Pass \`undef\` for no initial data.
|
|
135
|
+
|
|
136
|
+
`)
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
Content(`#### \`options_map() -> hashref\`
|
|
141
|
+
|
|
142
|
+
Return a deep copy of the current SDK options.
|
|
143
|
+
|
|
144
|
+
#### \`get_utility() -> utility\`
|
|
145
|
+
|
|
146
|
+
Return a copy of the SDK utility object.
|
|
147
|
+
|
|
148
|
+
#### \`direct($fetchargs) -> hashref\`
|
|
149
|
+
|
|
150
|
+
Make a direct HTTP request to any API endpoint. Returns a result \`hashref\` with \`ok\`, \`status\`, \`headers\`, and \`data\` (or \`err\` on failure). This escape hatch never dies — branch on \`$result->{ok}\`.
|
|
151
|
+
|
|
152
|
+
**Parameters:**
|
|
153
|
+
|
|
154
|
+
| Name | Type | Description |
|
|
155
|
+
| --- | --- | --- |
|
|
156
|
+
| \`$fetchargs->{path}\` | \`string\` | URL path with optional \`{param}\` placeholders. |
|
|
157
|
+
| \`$fetchargs->{method}\` | \`string\` | HTTP method (default: \`'GET'\`). |
|
|
158
|
+
| \`$fetchargs->{params}\` | \`hashref\` | Path parameter values. |
|
|
159
|
+
| \`$fetchargs->{query}\` | \`hashref\` | Query string parameters. |
|
|
160
|
+
| \`$fetchargs->{headers}\` | \`hashref\` | Request headers (merged with defaults). |
|
|
161
|
+
| \`$fetchargs->{body}\` | \`any\` | Request body (hashrefs are JSON-serialized). |
|
|
162
|
+
|
|
163
|
+
**Returns:** \`hashref\`
|
|
164
|
+
|
|
165
|
+
#### \`prepare($fetchargs) -> hashref\`
|
|
166
|
+
|
|
167
|
+
Prepare a fetch definition without sending. Returns the \`fetchdef\` and dies on error.
|
|
168
|
+
|
|
169
|
+
`)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
// Entity reference sections
|
|
173
|
+
publishedEntities.map((ent: any) => {
|
|
174
|
+
const opnames = Object.keys(ent.op || {})
|
|
175
|
+
const fields = ent.fields || []
|
|
176
|
+
// Model-driven id key: null when this entity has no id-like field.
|
|
177
|
+
const idF = entityIdField(ent)
|
|
178
|
+
const eVar = ent.name
|
|
179
|
+
|
|
180
|
+
Content(`
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## ${ent.Name} entity
|
|
184
|
+
|
|
185
|
+
`)
|
|
186
|
+
|
|
187
|
+
if (ent.short) {
|
|
188
|
+
Content(`${ent.short}
|
|
189
|
+
|
|
190
|
+
`)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
Content(`\`\`\`perl
|
|
194
|
+
my $${eVar} = $client->${ent.Name};
|
|
195
|
+
\`\`\`
|
|
196
|
+
|
|
197
|
+
`)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
// Field schema
|
|
201
|
+
if (fields.length > 0) {
|
|
202
|
+
Content(`### Fields
|
|
203
|
+
|
|
204
|
+
| Field | Type | Required | Description |
|
|
205
|
+
| --- | --- | --- | --- |
|
|
206
|
+
`)
|
|
207
|
+
each(fields, (field: any) => {
|
|
208
|
+
const req = field.req ? 'Yes' : 'No'
|
|
209
|
+
const desc = field.short || ''
|
|
210
|
+
Content(`| \`${field.name}\` | \`${perlType(field.type)}\` | ${req} | ${desc} |
|
|
211
|
+
`)
|
|
212
|
+
})
|
|
213
|
+
|
|
214
|
+
Content(`
|
|
215
|
+
`)
|
|
216
|
+
|
|
217
|
+
// Field operations breakdown
|
|
218
|
+
const hasFieldOps = fields.some((f: any) => f.op && Object.keys(f.op).length > 0)
|
|
219
|
+
if (hasFieldOps) {
|
|
220
|
+
const opcols = ['load', 'list', 'create', 'update', 'remove']
|
|
221
|
+
.filter((op: string) => opnames.includes(op) && ent.op[op]?.active !== false)
|
|
222
|
+
Content(`### Field Usage by Operation
|
|
223
|
+
|
|
224
|
+
| Field | ${opcols.join(' | ')} |
|
|
225
|
+
| --- | ${opcols.map(() => '---').join(' | ')} |
|
|
226
|
+
`)
|
|
227
|
+
each(fields, (field: any) => {
|
|
228
|
+
const fops = field.op || {}
|
|
229
|
+
const cols = opcols.map((op: string) => {
|
|
230
|
+
const fop = fops[op]
|
|
231
|
+
if (null == fop) return '-'
|
|
232
|
+
if (fop.active === false) return '-'
|
|
233
|
+
return 'Yes'
|
|
234
|
+
})
|
|
235
|
+
Content(`| \`${field.name}\` | ${cols.join(' | ')} |
|
|
236
|
+
`)
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
Content(`
|
|
240
|
+
`)
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
// Operation details
|
|
246
|
+
if (opnames.length > 0) {
|
|
247
|
+
Content(`### Operations
|
|
248
|
+
|
|
249
|
+
`)
|
|
250
|
+
|
|
251
|
+
opnames.map((opname: string) => {
|
|
252
|
+
const info = OP_SIGNATURES[opname]
|
|
253
|
+
if (!info) return
|
|
254
|
+
|
|
255
|
+
Content(`#### \`${info.sig}\`
|
|
256
|
+
|
|
257
|
+
${info.desc}
|
|
258
|
+
|
|
259
|
+
`)
|
|
260
|
+
|
|
261
|
+
if ('load' === opname || 'remove' === opname) {
|
|
262
|
+
const matchItems = opRequestShape(ent, opname).items
|
|
263
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
264
|
+
.sort((a: any, b: any) =>
|
|
265
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
266
|
+
const arg = 0 < matchItems.length
|
|
267
|
+
? `{ ${matchItems.map((it: any) =>
|
|
268
|
+
`'${it.name}' => ${perlLit(it.type,
|
|
269
|
+
it.name === idF ? ent.name + '_id' : it.name)}`).join(', ')} }`
|
|
270
|
+
: ''
|
|
271
|
+
Content(`\`\`\`perl
|
|
272
|
+
my $result = $client->${ent.Name}->${opname}(${arg});
|
|
273
|
+
\`\`\`
|
|
274
|
+
|
|
275
|
+
`)
|
|
276
|
+
}
|
|
277
|
+
else if ('list' === opname) {
|
|
278
|
+
Content(`\`\`\`perl
|
|
279
|
+
my $results = $client->${ent.Name}->list;
|
|
280
|
+
for my $${eVar} (@$results) {
|
|
281
|
+
print "$${eVar}->{id}\\n";
|
|
282
|
+
}
|
|
283
|
+
\`\`\`
|
|
284
|
+
|
|
285
|
+
`)
|
|
286
|
+
}
|
|
287
|
+
else if ('create' === opname) {
|
|
288
|
+
const createItems = opRequestShape(ent, 'create').items
|
|
289
|
+
.filter((it: any) => !it.optional)
|
|
290
|
+
Content(`\`\`\`perl
|
|
291
|
+
my $result = $client->${ent.Name}->create({
|
|
292
|
+
`)
|
|
293
|
+
createItems.map((it: any) => {
|
|
294
|
+
Content(` '${it.name}' => ${perlLit(it.type, 'example_' + it.name)}, # ${perlType(it.type)}
|
|
295
|
+
`)
|
|
296
|
+
})
|
|
297
|
+
Content(`});
|
|
298
|
+
\`\`\`
|
|
299
|
+
|
|
300
|
+
`)
|
|
301
|
+
}
|
|
302
|
+
else if ('update' === opname) {
|
|
303
|
+
const updateItems = opRequestShape(ent, 'update').items
|
|
304
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
305
|
+
.sort((a: any, b: any) =>
|
|
306
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
307
|
+
const updateLines = updateItems.map((it: any) =>
|
|
308
|
+
` '${it.name}' => ${perlLit(it.type,
|
|
309
|
+
it.name === idF ? ent.name + '_id' : it.name)},\n`).join('')
|
|
310
|
+
Content(`\`\`\`perl
|
|
311
|
+
my $result = $client->${ent.Name}->update({
|
|
312
|
+
${updateLines} # Fields to update
|
|
313
|
+
});
|
|
314
|
+
\`\`\`
|
|
315
|
+
|
|
316
|
+
`)
|
|
317
|
+
}
|
|
318
|
+
})
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
// Common methods
|
|
323
|
+
Content(`### Common Methods
|
|
324
|
+
|
|
325
|
+
#### \`data_get() -> hashref\`
|
|
326
|
+
|
|
327
|
+
Get the entity data.
|
|
328
|
+
|
|
329
|
+
#### \`data_set($data)\`
|
|
330
|
+
|
|
331
|
+
Set the entity data.
|
|
332
|
+
|
|
333
|
+
#### \`match_get() -> hashref\`
|
|
334
|
+
|
|
335
|
+
Get the entity match criteria.
|
|
336
|
+
|
|
337
|
+
#### \`match_set($match)\`
|
|
338
|
+
|
|
339
|
+
Set the entity match criteria.
|
|
340
|
+
|
|
341
|
+
#### \`make() -> entity\`
|
|
342
|
+
|
|
343
|
+
Create a new \`${ent.Name}\` entity instance with the same options.
|
|
344
|
+
|
|
345
|
+
#### \`get_name() -> string\`
|
|
346
|
+
|
|
347
|
+
Return the entity name.
|
|
348
|
+
|
|
349
|
+
`)
|
|
350
|
+
})
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
// Features section
|
|
354
|
+
const activeFeatures = each(feature).filter((f: any) => f.active)
|
|
355
|
+
if (activeFeatures.length > 0) {
|
|
356
|
+
Content(`
|
|
357
|
+
---
|
|
358
|
+
|
|
359
|
+
## Features
|
|
360
|
+
|
|
361
|
+
| Feature | Version | Description |
|
|
362
|
+
| --- | --- | --- |
|
|
363
|
+
`)
|
|
364
|
+
|
|
365
|
+
activeFeatures.map((f: any) => {
|
|
366
|
+
Content(`| \`${f.name}\` | ${f.version || '0.0.1'} | ${f.title || ''} |
|
|
367
|
+
`)
|
|
368
|
+
})
|
|
369
|
+
|
|
370
|
+
Content(`
|
|
371
|
+
|
|
372
|
+
Features are activated via the \`feature\` option:
|
|
373
|
+
|
|
374
|
+
`)
|
|
375
|
+
|
|
376
|
+
Content(`\`\`\`perl
|
|
377
|
+
my $client = ${model.const.Name}SDK->new({
|
|
378
|
+
'feature' => {
|
|
379
|
+
`)
|
|
380
|
+
activeFeatures.map((f: any) => {
|
|
381
|
+
Content(` '${f.name}' => { 'active' => 1 },
|
|
382
|
+
`)
|
|
383
|
+
})
|
|
384
|
+
Content(` },
|
|
385
|
+
});
|
|
386
|
+
\`\`\`
|
|
387
|
+
|
|
388
|
+
`)
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
})
|
|
392
|
+
})
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
export {
|
|
398
|
+
ReadmeRef
|
|
399
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
const ReadmeTopHowto = cmp(function ReadmeTopHowto(props: any) {
|
|
6
|
+
const { target } = props
|
|
7
|
+
|
|
8
|
+
Content(`**Perl:**
|
|
9
|
+
\`\`\`perl
|
|
10
|
+
my $result = $client->direct({
|
|
11
|
+
'path' => '/api/resource/{id}',
|
|
12
|
+
'method' => 'GET',
|
|
13
|
+
'params' => { 'id' => 'example' },
|
|
14
|
+
});
|
|
15
|
+
\`\`\`
|
|
16
|
+
|
|
17
|
+
`)
|
|
18
|
+
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
ReadmeTopHowto
|
|
24
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, isAuthActive, envName, canonKey, entityIdField, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
nom,
|
|
8
|
+
} from '@voxgig/apidef'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
// A type-correct, executable Perl literal for a param: numeric/boolean/
|
|
12
|
+
// array/hash params render a typed literal; strings render the quoted
|
|
13
|
+
// placeholder (the doc test EXECUTES this block, so a comment placeholder
|
|
14
|
+
// would break it).
|
|
15
|
+
function perlLit(type: any, placeholder: string = 'example'): string {
|
|
16
|
+
const k = canonKey(type)
|
|
17
|
+
if ('INTEGER' === k || 'NUMBER' === k) return '1'
|
|
18
|
+
if ('BOOLEAN' === k) return '1'
|
|
19
|
+
if ('ARRAY' === k) return '[]'
|
|
20
|
+
if ('OBJECT' === k) return '{}'
|
|
21
|
+
return `'${placeholder}'`
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
const ReadmeTopQuick = cmp(function ReadmeTopQuick(props: any) {
|
|
26
|
+
const { target, ctx$: { model } } = props
|
|
27
|
+
|
|
28
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
29
|
+
|
|
30
|
+
const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
|
|
31
|
+
|
|
32
|
+
const authActive = isAuthActive(model)
|
|
33
|
+
const ctor = authActive
|
|
34
|
+
? `${model.const.Name}SDK->new({\n 'apikey' => $ENV{'${envName(model)}_APIKEY'},\n})`
|
|
35
|
+
: `${model.const.Name}SDK->new`
|
|
36
|
+
|
|
37
|
+
Content(`\`\`\`perl
|
|
38
|
+
use lib '${target.name}/lib';
|
|
39
|
+
use ${model.const.Name}SDK;
|
|
40
|
+
|
|
41
|
+
my $client = ${ctor};
|
|
42
|
+
|
|
43
|
+
`)
|
|
44
|
+
|
|
45
|
+
if (exampleEntity) {
|
|
46
|
+
const eName = nom(exampleEntity, 'Name')
|
|
47
|
+
const eVar = eName.toLowerCase()
|
|
48
|
+
const opnames = Object.keys(exampleEntity.op || {})
|
|
49
|
+
// Model-driven id key: null when the entity has no id-like field, in which
|
|
50
|
+
// case the load example takes no match argument.
|
|
51
|
+
const idF = entityIdField(exampleEntity)
|
|
52
|
+
|
|
53
|
+
if (opnames.includes('list')) {
|
|
54
|
+
Content(`# List all ${eName.toLowerCase()}s (returns an arrayref; dies on error)
|
|
55
|
+
my $${eVar}s = $client->${eName}->list;
|
|
56
|
+
for my $${eVar} (@$${eVar}s) {
|
|
57
|
+
print "$${eVar}->{id}\\n";
|
|
58
|
+
}
|
|
59
|
+
`)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (opnames.includes('load')) {
|
|
63
|
+
// Every REQUIRED load-match key (id first, then parent path params like
|
|
64
|
+
// page_id) — the same shape the runtime resolves path params from, so
|
|
65
|
+
// the example always works.
|
|
66
|
+
const loadItems = opRequestShape(exampleEntity, 'load').items
|
|
67
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
68
|
+
.sort((a: any, b: any) =>
|
|
69
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
70
|
+
const loadArg = 0 < loadItems.length
|
|
71
|
+
? `{ ${loadItems.map((it: any) =>
|
|
72
|
+
`'${it.name}' => ${perlLit(it.type,
|
|
73
|
+
it.name === idF ? 'example_id' : 'example_' + it.name)}`).join(', ')} }`
|
|
74
|
+
: ''
|
|
75
|
+
Content(`
|
|
76
|
+
# Load a specific ${eName.toLowerCase()} (returns the bare record; dies on error)
|
|
77
|
+
my $${eVar} = $client->${eName}->load(${loadArg});
|
|
78
|
+
print "$${eVar}->{id}\\n";
|
|
79
|
+
`)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
Content(`\`\`\`
|
|
84
|
+
`)
|
|
85
|
+
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
export {
|
|
90
|
+
ReadmeTopQuick
|
|
91
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, 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 ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
|
|
23
|
+
const { target, ctx$: { model } } = props
|
|
24
|
+
|
|
25
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
26
|
+
|
|
27
|
+
// Pick an entity with a real op (prefer a read op) — never fabricate a
|
|
28
|
+
// `load` on an op-less entity.
|
|
29
|
+
const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
|
|
30
|
+
|
|
31
|
+
Content(`\`\`\`perl
|
|
32
|
+
use lib '${target.name}/lib';
|
|
33
|
+
use ${model.const.Name}SDK;
|
|
34
|
+
|
|
35
|
+
my $client = ${model.const.Name}SDK->test(undef, undef);
|
|
36
|
+
`)
|
|
37
|
+
|
|
38
|
+
if (exampleEntity && primaryOp) {
|
|
39
|
+
const eName = nom(exampleEntity, 'Name')
|
|
40
|
+
const idF = entityIdField(exampleEntity)
|
|
41
|
+
const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
|
|
42
|
+
let arg = ''
|
|
43
|
+
if (isMatchOp) {
|
|
44
|
+
// Every REQUIRED match key (id first) — the same shape that generates
|
|
45
|
+
// the op's match resolution, so the block runs offline against a seeded
|
|
46
|
+
// fixture.
|
|
47
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
48
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
49
|
+
.sort((a: any, b: any) =>
|
|
50
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
51
|
+
arg = 0 < items.length
|
|
52
|
+
? `{ ${items.map((it: any) =>
|
|
53
|
+
`'${it.name}' => ${it.name === idF ? "'test01'" : perlLit(it.type)}`).join(', ')} }`
|
|
54
|
+
: ''
|
|
55
|
+
} else if ('create' === primaryOp || 'update' === primaryOp) {
|
|
56
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
57
|
+
.filter((it: any) => it.name !== idF && it.name !== 'id')
|
|
58
|
+
const required = items.filter((it: any) => !it.optional)
|
|
59
|
+
const chosen = required.length ? required : items.slice(0, 3)
|
|
60
|
+
arg = `{ ${chosen.map((it: any) => `'${it.name}' => ${perlLit(it.type)}`).join(', ')} }`
|
|
61
|
+
}
|
|
62
|
+
// A list() result is an arrayref — name the variable accordingly.
|
|
63
|
+
const eVar = eName.toLowerCase() + ('list' === primaryOp ? 's' : '')
|
|
64
|
+
Content(`my $${eVar} = $client->${eName}->${primaryOp}(${arg});
|
|
65
|
+
`)
|
|
66
|
+
if ('list' === primaryOp) {
|
|
67
|
+
Content(`print scalar(@$${eVar}), " records\\n";
|
|
68
|
+
`)
|
|
69
|
+
} else {
|
|
70
|
+
Content(`print "$${eVar}->{id}\\n";
|
|
71
|
+
`)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
Content(`\`\`\`
|
|
76
|
+
`)
|
|
77
|
+
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
export {
|
|
82
|
+
ReadmeTopTest
|
|
83
|
+
}
|
|
@@ -13,6 +13,7 @@ import { cmp, each, Folder, File, Content } from '@voxgig/sdkgen'
|
|
|
13
13
|
|
|
14
14
|
import { TestEntity } from './TestEntity_perl'
|
|
15
15
|
import { TestDirect } from './TestDirect_perl'
|
|
16
|
+
import { ReadmeExamplesTest } from './ReadmeExamplesTest_perl'
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
const Test = cmp(function Test(props: any) {
|
|
@@ -45,6 +46,9 @@ done_testing();
|
|
|
45
46
|
TestEntity({ target, entity })
|
|
46
47
|
TestDirect({ target, entity })
|
|
47
48
|
})
|
|
49
|
+
|
|
50
|
+
// README example snippet gate (syntax + offline test-mode run).
|
|
51
|
+
ReadmeExamplesTest({ target })
|
|
48
52
|
})
|
|
49
53
|
})
|
|
50
54
|
|
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
File, Content, Folder,
|
|
30
30
|
} from '@voxgig/sdkgen'
|
|
31
31
|
|
|
32
|
-
import { canonToType, opTypeName, opRequestShape } from '@voxgig/sdkgen'
|
|
32
|
+
import { canonToType, opTypeName, opRequestShape, warnEntityTypeCollisions } from '@voxgig/sdkgen'
|
|
33
33
|
|
|
34
34
|
import {
|
|
35
35
|
KIT,
|
|
@@ -50,9 +50,12 @@ function validName(name: string): boolean {
|
|
|
50
50
|
// Emit one typed PHP property line. `mixed` is already nullable in PHP and
|
|
51
51
|
// rejects the `?` prefix, so it is special-cased; every other optional field
|
|
52
52
|
// becomes `?type` with a `= null` default so the property is safely optional.
|
|
53
|
+
// A `$NULL`-typed field maps to the 'null' type name, which is not usable as
|
|
54
|
+
// a property type here (`?null` is a fatal, and standalone `null` needs
|
|
55
|
+
// PHP >= 8.2), so it degrades to `mixed` too.
|
|
53
56
|
function propLine(name: string, sentinel: unknown, optional: boolean): string {
|
|
54
57
|
const type = canonToType(sentinel, LANG)
|
|
55
|
-
if ('mixed' === type) {
|
|
58
|
+
if ('mixed' === type || 'null' === type) {
|
|
56
59
|
return optional
|
|
57
60
|
? ` public mixed $${name} = null;\n`
|
|
58
61
|
: ` public mixed $${name};\n`
|
|
@@ -64,15 +67,29 @@ function propLine(name: string, sentinel: unknown, optional: boolean): string {
|
|
|
64
67
|
|
|
65
68
|
|
|
66
69
|
const EntityTypes = cmp(function EntityTypes(props: any) {
|
|
67
|
-
const { model } = props.ctx$
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
const { model, log } = props.ctx$
|
|
71
|
+
|
|
72
|
+
// only_active:false — getModelPath DROPS active:false entries by default,
|
|
73
|
+
// but the consumer scaffold (create-sdkgen Root.ts) iterates the RAW entity
|
|
74
|
+
// collection, so inactive entities still get generated entity code that
|
|
75
|
+
// references these typed names. The typed model must cover them too.
|
|
76
|
+
const entity = getModelPath(model, `main.${KIT}.entity`, { only_active: false, required: false })
|
|
77
|
+
// Emit for EVERY entity that gets generated entity code: the consumer
|
|
78
|
+
// scaffold (create-sdkgen Root.ts) iterates entities WITHOUT an active
|
|
79
|
+
// filter, so inactive entities still get class files referencing these
|
|
80
|
+
// typed names. Filter on `name` (always present), NOT `active` — parity
|
|
81
|
+
// with the go emitter's fix.
|
|
82
|
+
const entityList = each(entity).filter((e: any) => e && null != e.name)
|
|
71
83
|
// Derive the PascalCase Name up-front — it is set LAZILY by names(), so an
|
|
72
84
|
// entity not yet named (e.g. a fieldless placeholder) would otherwise read
|
|
73
85
|
// `Name = undefined` below. Parity with the go emitter's fix.
|
|
74
86
|
entityList.forEach((e: any) => { if (null == e.Name) names(e, e.name) })
|
|
75
87
|
|
|
88
|
+
// Surface duplicate generated type names (two entities with the same
|
|
89
|
+
// PascalCase Name) — they would redeclare a type in statically-typed
|
|
90
|
+
// targets. Detection only; renaming is a model-level decision.
|
|
91
|
+
warnEntityTypeCollisions(entity, log, LANG)
|
|
92
|
+
|
|
76
93
|
Folder({ name: 'types' }, () => {
|
|
77
94
|
|
|
78
95
|
File({ name: model.const.Name + 'Types.' + LANG }, () => {
|
|
@@ -34,7 +34,12 @@ const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
|
|
|
34
34
|
: `${model.const.Name}SDK::test()`
|
|
35
35
|
let testCallArg = ''
|
|
36
36
|
if (exampleEntity && isMatchOp) {
|
|
37
|
-
|
|
37
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
38
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
39
|
+
.sort((a: any, b: any) => (a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
40
|
+
testCallArg = 0 < items.length
|
|
41
|
+
? `[${items.map((it: any) => `"${it.name}" => ${it.name === idF ? '"test01"' : phpLit(it.type)}`).join(', ')}]`
|
|
42
|
+
: ''
|
|
38
43
|
} else if (exampleEntity && ('create' === primaryOp || 'update' === primaryOp)) {
|
|
39
44
|
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
40
45
|
.filter((it: any) => it.name !== idF && it.name !== 'id')
|