@voxgig/sdkgen 1.3.13 → 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 +11 -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 +12 -2
- package/src/tsconfig.json +2 -0
- package/project/.sdk/tm/zig/build.zig.zon +0 -11
|
@@ -0,0 +1,104 @@
|
|
|
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
|
+
import { hsVarName } from './utility_haskell'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
// A type-correct Haskell `Value` literal for a param.
|
|
14
|
+
function hsLit(type: any, placeholder: string = 'example'): string {
|
|
15
|
+
const k = canonKey(type)
|
|
16
|
+
if ('INTEGER' === k || 'NUMBER' === k) return 'VNum 1'
|
|
17
|
+
if ('BOOLEAN' === k) return 'VBool True'
|
|
18
|
+
if ('ARRAY' === k || 'OBJECT' === k) return 'VNoval'
|
|
19
|
+
return `VStr "${placeholder}"`
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
const ReadmeTopQuick = cmp(function ReadmeTopQuick(props: any) {
|
|
24
|
+
const { target, ctx$: { model } } = props
|
|
25
|
+
|
|
26
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
27
|
+
|
|
28
|
+
const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
|
|
29
|
+
|
|
30
|
+
const authActive = isAuthActive(model)
|
|
31
|
+
|
|
32
|
+
Content(`\`\`\`haskell
|
|
33
|
+
`)
|
|
34
|
+
if (authActive) {
|
|
35
|
+
Content(`import System.Environment (lookupEnv)
|
|
36
|
+
import qualified SdkClient as Sdk
|
|
37
|
+
import VoxgigStruct (Value (..), emptyMap)
|
|
38
|
+
import SdkHelpers (jo)
|
|
39
|
+
|
|
40
|
+
main :: IO ()
|
|
41
|
+
main = do
|
|
42
|
+
mkey <- lookupEnv "${envName(model)}_APIKEY"
|
|
43
|
+
opts <- jo [("apikey", maybe VNoval VStr mkey)]
|
|
44
|
+
sdk <- Sdk.newSdk opts
|
|
45
|
+
`)
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
Content(`import qualified SdkClient as Sdk
|
|
49
|
+
import VoxgigStruct (Value (..), emptyMap)
|
|
50
|
+
import SdkHelpers (jo)
|
|
51
|
+
|
|
52
|
+
main :: IO ()
|
|
53
|
+
main = do
|
|
54
|
+
sdk <- Sdk.newSdk0
|
|
55
|
+
`)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (exampleEntity) {
|
|
59
|
+
const eName = nom(exampleEntity, 'Name')
|
|
60
|
+
const eFn = hsVarName(exampleEntity.name)
|
|
61
|
+
const opnames = Object.keys(exampleEntity.op || {})
|
|
62
|
+
const idF = entityIdField(exampleEntity)
|
|
63
|
+
|
|
64
|
+
if (opnames.includes('list')) {
|
|
65
|
+
Content(`
|
|
66
|
+
-- List all ${eName.toLowerCase()}s (returns a list Value, raises on error)
|
|
67
|
+
ent <- Sdk.${eFn} sdk VNoval
|
|
68
|
+
match <- emptyMap
|
|
69
|
+
ctrl <- emptyMap
|
|
70
|
+
${eFn}s <- Sdk.eList ent match ctrl
|
|
71
|
+
print ${eFn}s
|
|
72
|
+
`)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (opnames.includes('load')) {
|
|
76
|
+
const loadItems = opRequestShape(exampleEntity, 'load').items
|
|
77
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
78
|
+
.sort((a: any, b: any) =>
|
|
79
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
80
|
+
const loadArg = 0 < loadItems.length
|
|
81
|
+
? `[${loadItems.map((it: any) =>
|
|
82
|
+
`("${it.name}", ${hsLit(it.type,
|
|
83
|
+
it.name === idF ? 'example_id' : 'example_' + it.name)})`).join(', ')}]`
|
|
84
|
+
: '[]'
|
|
85
|
+
Content(`
|
|
86
|
+
-- Load a specific ${eName.toLowerCase()} (returns the record, raises on error)
|
|
87
|
+
ent2 <- Sdk.${eFn} sdk VNoval
|
|
88
|
+
m <- jo ${loadArg}
|
|
89
|
+
ctrl2 <- emptyMap
|
|
90
|
+
${eFn} <- Sdk.eLoad ent2 m ctrl2
|
|
91
|
+
print ${eFn}
|
|
92
|
+
`)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
Content(`\`\`\`
|
|
97
|
+
`)
|
|
98
|
+
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
export {
|
|
103
|
+
ReadmeTopQuick
|
|
104
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
import { hsVarName } from './utility_haskell'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
// A type-correct Haskell `Value` literal for a field's canonical type.
|
|
14
|
+
function hsLit(type: any): string {
|
|
15
|
+
const k = canonKey(type)
|
|
16
|
+
if ('INTEGER' === k || 'NUMBER' === k) return 'VNum 1'
|
|
17
|
+
if ('BOOLEAN' === k) return 'VBool True'
|
|
18
|
+
if ('ARRAY' === k || 'OBJECT' === k) return 'VNoval'
|
|
19
|
+
return 'VStr "example"'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
|
|
24
|
+
const { target, ctx$: { model } } = props
|
|
25
|
+
|
|
26
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
27
|
+
|
|
28
|
+
const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
|
|
29
|
+
|
|
30
|
+
Content(`\`\`\`haskell
|
|
31
|
+
import qualified SdkClient as Sdk
|
|
32
|
+
import VoxgigStruct (Value (..), emptyMap)
|
|
33
|
+
import SdkHelpers (jo)
|
|
34
|
+
|
|
35
|
+
main :: IO ()
|
|
36
|
+
main = do
|
|
37
|
+
sdk <- Sdk.testSdk0
|
|
38
|
+
`)
|
|
39
|
+
|
|
40
|
+
if (exampleEntity && primaryOp) {
|
|
41
|
+
const eName = nom(exampleEntity, 'Name')
|
|
42
|
+
const eFn = hsVarName(exampleEntity.name)
|
|
43
|
+
const idF = entityIdField(exampleEntity)
|
|
44
|
+
const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
|
|
45
|
+
let argExpr = 'emptyMap'
|
|
46
|
+
if (isMatchOp) {
|
|
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
|
+
argExpr = 0 < items.length
|
|
52
|
+
? `jo [${items.map((it: any) =>
|
|
53
|
+
`("${it.name}", ${it.name === idF ? 'VStr "test01"' : hsLit(it.type)})`).join(', ')}]`
|
|
54
|
+
: 'emptyMap'
|
|
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
|
+
argExpr = `jo [${chosen.map((it: any) => `("${it.name}", ${hsLit(it.type)})`).join(', ')}]`
|
|
61
|
+
}
|
|
62
|
+
const opCap = 'e' + primaryOp.charAt(0).toUpperCase() + primaryOp.slice(1)
|
|
63
|
+
const resVar = hsVarName(exampleEntity.name) + ('list' === primaryOp ? 's' : '')
|
|
64
|
+
Content(` ent <- Sdk.${eFn} sdk VNoval
|
|
65
|
+
arg <- ${argExpr}
|
|
66
|
+
ctrl <- emptyMap
|
|
67
|
+
${resVar} <- Sdk.${opCap} ent arg ctrl
|
|
68
|
+
print ${resVar}
|
|
69
|
+
`)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
Content(`\`\`\`
|
|
73
|
+
`)
|
|
74
|
+
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
export {
|
|
79
|
+
ReadmeTopTest
|
|
80
|
+
}
|
|
@@ -10,6 +10,7 @@ import type {
|
|
|
10
10
|
import { cmp, each, Folder, File, Content } from '@voxgig/sdkgen'
|
|
11
11
|
|
|
12
12
|
import { hsVarName } from './utility_haskell'
|
|
13
|
+
import { ReadmeExamplesTest } from './ReadmeExamplesTest_haskell'
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
// test/SdkGenTests.hs — model-driven per-entity tests: an instance test, a
|
|
@@ -23,6 +24,12 @@ const Test = cmp(function Test(props: any) {
|
|
|
23
24
|
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
24
25
|
|
|
25
26
|
Folder({ name: 'test' }, () => {
|
|
27
|
+
|
|
28
|
+
// Structural gate over the documented Haskell examples (emits
|
|
29
|
+
// test/TReadmeExamples.hs); wired into genTests below so it runs in the
|
|
30
|
+
// standard Runner.
|
|
31
|
+
ReadmeExamplesTest({ target })
|
|
32
|
+
|
|
26
33
|
File({ name: 'SdkGenTests.' + target.ext }, () => {
|
|
27
34
|
|
|
28
35
|
let calls = ''
|
|
@@ -131,6 +138,12 @@ ${basicFn} c = do
|
|
|
131
138
|
pure True
|
|
132
139
|
`
|
|
133
140
|
}
|
|
141
|
+
// An op-less entity (no list/load/create — e.g. a bare path entity)
|
|
142
|
+
// appends no runTest, leaving the do-block ending on `opts <- jo [...]`
|
|
143
|
+
// (a bind), which is illegal as the final statement. Terminate it.
|
|
144
|
+
if (!hasList && !hasLoad && !hasCreate) {
|
|
145
|
+
defs += ` pure ()\n`
|
|
146
|
+
}
|
|
134
147
|
|
|
135
148
|
// Direct call test (via injected system.fetch mock).
|
|
136
149
|
defs += `
|
|
@@ -230,16 +243,27 @@ import SdkTypes
|
|
|
230
243
|
import SdkHelpers
|
|
231
244
|
import qualified SdkFeatures as F
|
|
232
245
|
import qualified SdkClient as C
|
|
246
|
+
import qualified TReadmeExamples
|
|
233
247
|
import Testutil
|
|
234
248
|
import TestJson (jsonRead)
|
|
235
249
|
|
|
236
250
|
-- Load an entity fixture (../.sdk/test/entity/<name>/<Name>TestData.json).
|
|
237
251
|
loadFixture :: String -> IO Value
|
|
238
252
|
loadFixture entName = do
|
|
239
|
-
|
|
253
|
+
-- The fixture DIRECTORY is the snake_case entity name (create_result), so a
|
|
254
|
+
-- plain lowercase of the CamelCase entName (createresult) misses the
|
|
255
|
+
-- underscores for multi-word entities. Convert CamelCase -> snake_case.
|
|
256
|
+
let lname = camelToSnake entName
|
|
240
257
|
raw <- readFile ("../.sdk/test/entity/" ++ lname ++ "/" ++ entName ++ "TestData.json")
|
|
241
258
|
jsonRead raw
|
|
242
|
-
where
|
|
259
|
+
where
|
|
260
|
+
toLowerCh ch = if ch >= 'A' && ch <= 'Z' then toEnum (fromEnum ch + 32) else ch
|
|
261
|
+
camelToSnake [] = []
|
|
262
|
+
camelToSnake (c0 : rest) = toLowerCh c0 : go rest
|
|
263
|
+
go [] = []
|
|
264
|
+
go (c : cs)
|
|
265
|
+
| c >= 'A' && c <= 'Z' = '_' : toLowerCh c : go cs
|
|
266
|
+
| otherwise = c : go cs
|
|
243
267
|
|
|
244
268
|
-- The first new-ref data map for an entity (fixture.new.<entity>.<ref0>).
|
|
245
269
|
newRefData :: Value -> String -> IO Value
|
|
@@ -252,6 +276,7 @@ newRefData fixture entName = do
|
|
|
252
276
|
|
|
253
277
|
genTests :: Counters -> IO ()
|
|
254
278
|
genTests c = do
|
|
279
|
+
TReadmeExamples.tests c
|
|
255
280
|
${calls}${defs}`)
|
|
256
281
|
})
|
|
257
282
|
})
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
// Typed-model generator (Java target). Port of EntityTypes_py.ts /
|
|
4
|
+
// EntityTypes_csharp.ts.
|
|
5
|
+
//
|
|
6
|
+
// Reads main.<KIT>.entity.<e>.fields[] and per-op params
|
|
7
|
+
// (op.<name>.points[].args.params[]) and emits ONE file, core/<Name>Types.java,
|
|
8
|
+
// holding a container class with a nested `public record` per active entity
|
|
9
|
+
// plus a request/match record per active op.
|
|
10
|
+
//
|
|
11
|
+
// WHY A CONTAINER CLASS: Java permits only ONE public top-level type per file
|
|
12
|
+
// (the file name must match it), so — unlike C# which emits many top-level
|
|
13
|
+
// records — every generated record is a nested (implicitly static) member of a
|
|
14
|
+
// single `public final class <Name>Types`. This keeps the whole reference model
|
|
15
|
+
// in one file whatever the entity count.
|
|
16
|
+
//
|
|
17
|
+
// TYPE CHOICE: reference `record` types with BOXED (nullable) component types,
|
|
18
|
+
// NOT the wired runtime type. The generated ops take/return the loose object
|
|
19
|
+
// model (`Map<String, Object>` / `Object`), so these records are NOT wired into
|
|
20
|
+
// the op signatures — they are documentation/DX reference shapes a caller may
|
|
21
|
+
// use to describe a payload before converting it to a map. This mirrors the JS
|
|
22
|
+
// target's JSDoc typedefs (annotation only, no runtime effect). Emitting unused
|
|
23
|
+
// records is harmless — they compile and have no runtime effect.
|
|
24
|
+
//
|
|
25
|
+
// OPTIONAL FIELDS: every component is a boxed reference type, hence inherently
|
|
26
|
+
// nullable, so a `req:false` field/param needs no distinct rendering in Java.
|
|
27
|
+
//
|
|
28
|
+
// Sentinels map to Java types via the SHARED canonToType 'java' column (the
|
|
29
|
+
// single source of truth per language — do not keep a local table here).
|
|
30
|
+
//
|
|
31
|
+
// Keep the SAME type-name scheme as every other language: <Name>,
|
|
32
|
+
// <Name>LoadMatch, <Name>ListMatch, <Name>CreateData, <Name>UpdateData,
|
|
33
|
+
// <Name>RemoveMatch (via the shared opTypeName helper).
|
|
34
|
+
|
|
35
|
+
import {
|
|
36
|
+
cmp, each, names,
|
|
37
|
+
File, Content,
|
|
38
|
+
} from '@voxgig/sdkgen'
|
|
39
|
+
|
|
40
|
+
import { canonToType, opTypeName, opRequestShape, warnEntityTypeCollisions } from '@voxgig/sdkgen'
|
|
41
|
+
|
|
42
|
+
import {
|
|
43
|
+
KIT,
|
|
44
|
+
getModelPath,
|
|
45
|
+
} from '@voxgig/apidef'
|
|
46
|
+
|
|
47
|
+
import { javaPackage } from './utility_java'
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
// Java keywords + reserved literals that cannot be a record component name.
|
|
51
|
+
const JAVA_KEYWORDS = new Set<string>([
|
|
52
|
+
'abstract', 'assert', 'boolean', 'break', 'byte', 'case', 'catch', 'char',
|
|
53
|
+
'class', 'const', 'continue', 'default', 'do', 'double', 'else', 'enum',
|
|
54
|
+
'extends', 'final', 'finally', 'float', 'for', 'goto', 'if', 'implements',
|
|
55
|
+
'import', 'instanceof', 'int', 'interface', 'long', 'native', 'new',
|
|
56
|
+
'package', 'private', 'protected', 'public', 'return', 'short', 'static',
|
|
57
|
+
'strictfp', 'super', 'switch', 'synchronized', 'this', 'throw', 'throws',
|
|
58
|
+
'transient', 'try', 'void', 'volatile', 'while',
|
|
59
|
+
'true', 'false', 'null', 'var', 'record', 'yield',
|
|
60
|
+
])
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
// A field/param name that has a safe Java identifier rendering. Names that are
|
|
64
|
+
// not valid identifiers (hyphens, leading digits) have no clean component form
|
|
65
|
+
// and are skipped — they remain reachable via the runtime map.
|
|
66
|
+
function javaIdent(name: string): boolean {
|
|
67
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name) && !JAVA_KEYWORDS.has(name)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
const LANG = 'java'
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
// Emit a nested `public record <typeName>(...)` from {name, type} items. An
|
|
75
|
+
// item whose name is not a legal identifier is skipped (WITH a warning — the
|
|
76
|
+
// key stays reachable via the runtime map, but its absence from the typed
|
|
77
|
+
// model should be visible, not silent); a duplicate component name (after the
|
|
78
|
+
// identifier filter) is dropped. An empty record is a valid, zero-component
|
|
79
|
+
// shape.
|
|
80
|
+
function emitRecord(typeName: string, items: any[], log?: any): void {
|
|
81
|
+
const seen = new Set<string>()
|
|
82
|
+
const usable = items.filter((it: any) => {
|
|
83
|
+
if (!it || null == it.name) {
|
|
84
|
+
return false
|
|
85
|
+
}
|
|
86
|
+
if (!javaIdent(it.name)) {
|
|
87
|
+
if (log && log.warn) {
|
|
88
|
+
log.warn({
|
|
89
|
+
point: 'entity-types-skip-field', typeName, field: it.name,
|
|
90
|
+
note: `java: field "${it.name}" of ${typeName} has no legal Java ` +
|
|
91
|
+
`identifier form; omitted from the typed model (still reachable ` +
|
|
92
|
+
`via the runtime map)`,
|
|
93
|
+
})
|
|
94
|
+
}
|
|
95
|
+
return false
|
|
96
|
+
}
|
|
97
|
+
if (seen.has(it.name)) {
|
|
98
|
+
return false
|
|
99
|
+
}
|
|
100
|
+
seen.add(it.name)
|
|
101
|
+
return true
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
if (0 === usable.length) {
|
|
105
|
+
Content(` public record ${typeName}() {}
|
|
106
|
+
|
|
107
|
+
`)
|
|
108
|
+
return
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const params = usable
|
|
112
|
+
.map((it: any) => `${canonToType(it.type, LANG)} ${it.name}`)
|
|
113
|
+
.join(', ')
|
|
114
|
+
Content(` public record ${typeName}(${params}) {}
|
|
115
|
+
|
|
116
|
+
`)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
const EntityTypes = cmp(function EntityTypes(props: any) {
|
|
121
|
+
const { model, log } = props.ctx$
|
|
122
|
+
const target = props.target || {}
|
|
123
|
+
const ext = target.ext || 'java'
|
|
124
|
+
|
|
125
|
+
const javapackage = props.javapackage || javaPackage(model)
|
|
126
|
+
|
|
127
|
+
// only_active:false — getModelPath DROPS active:false entries by default,
|
|
128
|
+
// but the consumer scaffold (create-sdkgen Root.ts) iterates the RAW entity
|
|
129
|
+
// collection, so inactive entities still get generated entity code that
|
|
130
|
+
// references these typed names. The typed model must cover them too.
|
|
131
|
+
const entity = getModelPath(model, `main.${KIT}.entity`, { only_active: false, required: false })
|
|
132
|
+
// Emit for EVERY entity that gets generated entity code: the consumer
|
|
133
|
+
// scaffold (create-sdkgen Root.ts) iterates entities WITHOUT an active
|
|
134
|
+
// filter, so inactive entities still get class files referencing these
|
|
135
|
+
// typed names. Filter on `name` (always present), NOT `active` — parity
|
|
136
|
+
// with the go emitter's fix.
|
|
137
|
+
const entityList = each(entity).filter((e: any) => e && null != e.name)
|
|
138
|
+
// Derive the PascalCase Name up-front — it is set LAZILY by names(), so an
|
|
139
|
+
// entity not yet named (e.g. a fieldless placeholder) would otherwise read
|
|
140
|
+
// `Name = undefined` below. Parity with the go/py/csharp emitter's fix.
|
|
141
|
+
entityList.forEach((e: any) => { if (null == e.Name) names(e, e.name) })
|
|
142
|
+
|
|
143
|
+
// Surface duplicate generated type names (two entities with the same
|
|
144
|
+
// PascalCase Name) — they would redeclare a type in statically-typed
|
|
145
|
+
// targets. Detection only; renaming is a model-level decision.
|
|
146
|
+
warnEntityTypeCollisions(entity, log, LANG)
|
|
147
|
+
|
|
148
|
+
File({ name: model.const.Name + 'Types.' + ext }, () => {
|
|
149
|
+
|
|
150
|
+
Content(`package ${javapackage}.core;
|
|
151
|
+
|
|
152
|
+
// Typed reference models for the ${model.const.Name} SDK.
|
|
153
|
+
//
|
|
154
|
+
// GENERATED from the API model: main.${KIT}.entity.<e>.fields[] and per-op
|
|
155
|
+
// params (op.<name>.points[].args.params[]). Field/param types come from the
|
|
156
|
+
// canonical type sentinels (source of truth: @voxgig/apidef VALID_CANON). Do
|
|
157
|
+
// not edit by hand.
|
|
158
|
+
//
|
|
159
|
+
// These records are documentation/DX reference shapes ONLY. The SDK ops take
|
|
160
|
+
// and return the loose object model (Map<String, Object> / Object) at runtime,
|
|
161
|
+
// so these types are not wired into the op signatures — use them to describe a
|
|
162
|
+
// payload before converting it to a map. Every component is a boxed (nullable)
|
|
163
|
+
// type, so an optional (req:false) key needs no distinct rendering.
|
|
164
|
+
|
|
165
|
+
import java.util.List;
|
|
166
|
+
import java.util.Map;
|
|
167
|
+
|
|
168
|
+
public final class ${model.const.Name}Types {
|
|
169
|
+
|
|
170
|
+
private ${model.const.Name}Types() {}
|
|
171
|
+
|
|
172
|
+
`)
|
|
173
|
+
|
|
174
|
+
entityList.forEach((ent: any) => {
|
|
175
|
+
const Name = ent.Name
|
|
176
|
+
const fields = (ent.fields ? each(ent.fields) : [])
|
|
177
|
+
.filter((f: any) => f.active !== false)
|
|
178
|
+
|
|
179
|
+
// Entity data model: one component per field.
|
|
180
|
+
emitRecord(Name, fields.map((f: any) => ({
|
|
181
|
+
name: f.name, type: f.type,
|
|
182
|
+
})), log)
|
|
183
|
+
|
|
184
|
+
// Per active op: a request/match record. Members come from the shared
|
|
185
|
+
// partiality policy (opRequestShape).
|
|
186
|
+
const ops = ent.op || {}
|
|
187
|
+
;['load', 'list', 'create', 'update', 'remove'].forEach((opname: string) => {
|
|
188
|
+
if (null == ops[opname]) {
|
|
189
|
+
return
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const typeName = opTypeName(Name, opname)
|
|
193
|
+
const { items } = opRequestShape(ent, opname)
|
|
194
|
+
|
|
195
|
+
emitRecord(typeName, items, log)
|
|
196
|
+
})
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
Content(`}
|
|
200
|
+
`)
|
|
201
|
+
})
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
export {
|
|
206
|
+
EntityTypes,
|
|
207
|
+
}
|
|
@@ -23,6 +23,7 @@ import { Config } from './Config_java'
|
|
|
23
23
|
import { Gitignore } from './Gitignore_java'
|
|
24
24
|
import { MainEntity } from './MainEntity_java'
|
|
25
25
|
import { EntityBase } from './EntityBase_java'
|
|
26
|
+
import { EntityTypes } from './EntityTypes_java'
|
|
26
27
|
import { SdkError } from './SdkError_java'
|
|
27
28
|
import { javaPackage } from './utility_java'
|
|
28
29
|
|
|
@@ -90,6 +91,11 @@ this.utility.featureHook.apply(this.rootctx, "${name}");
|
|
|
90
91
|
})
|
|
91
92
|
|
|
92
93
|
Config({ target })
|
|
94
|
+
|
|
95
|
+
// Generate the typed reference-model file (<Name>Types.java) beside the
|
|
96
|
+
// other generated core files. Documentation/DX shapes only — not wired
|
|
97
|
+
// into the loose-object-model op signatures.
|
|
98
|
+
EntityTypes({ target, javapackage })
|
|
93
99
|
})
|
|
94
100
|
|
|
95
101
|
})
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, each, Content, canonToType, canonKey, entityIdField, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
} from '@voxgig/apidef'
|
|
8
|
+
|
|
9
|
+
import { javaVarName } from './utility_java'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// Type names come from the shared canonToType 'java' column (single source of truth).
|
|
13
|
+
|
|
14
|
+
// A type-correct, JSON-serialisable Java literal for a field's canonical type.
|
|
15
|
+
function javaLit(type: any, placeholder: string = 'example'): string {
|
|
16
|
+
const k = canonKey(type)
|
|
17
|
+
if ('INTEGER' === k) return '1L'
|
|
18
|
+
if ('NUMBER' === k) return '1.0'
|
|
19
|
+
if ('BOOLEAN' === k) return 'true'
|
|
20
|
+
if ('ARRAY' === k) return 'List.of()'
|
|
21
|
+
if ('OBJECT' === k) return 'Map.of()'
|
|
22
|
+
return `"${placeholder}"`
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
// Operation method spelling for Java: camelCase methods over the loose object
|
|
27
|
+
// model. The op descriptions are language-agnostic.
|
|
28
|
+
const OP_DESC: Record<string, { method: string, desc: string }> = {
|
|
29
|
+
load: { method: 'load(match, null)', desc: 'Load a single entity by match criteria.' },
|
|
30
|
+
list: { method: 'list(null, null)', desc: 'List entities, optionally matching the given criteria.' },
|
|
31
|
+
create: { method: 'create(data, null)', desc: 'Create a new entity with the given data.' },
|
|
32
|
+
update: { method: 'update(data, null)', desc: 'Update an existing entity.' },
|
|
33
|
+
remove: { method: 'remove(match, null)', desc: 'Remove the matching entity.' },
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
const ReadmeEntity = cmp(function ReadmeEntity(props: any) {
|
|
38
|
+
const { target } = props
|
|
39
|
+
const { model } = props.ctx$
|
|
40
|
+
|
|
41
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
42
|
+
|
|
43
|
+
const publishedEntities = each(entity)
|
|
44
|
+
.filter((entity: any) => entity.active !== false)
|
|
45
|
+
|
|
46
|
+
if (0 === publishedEntities.length) {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
Content(`
|
|
51
|
+
|
|
52
|
+
## Entities
|
|
53
|
+
|
|
54
|
+
`)
|
|
55
|
+
|
|
56
|
+
publishedEntities.map((entity: any) => {
|
|
57
|
+
const opnames = Object.keys(entity.op || {})
|
|
58
|
+
const fields = entity.fields || []
|
|
59
|
+
// Model-driven id key: null when this entity has no id-like field.
|
|
60
|
+
const idF = entityIdField(entity)
|
|
61
|
+
// Sanitise the local variable name — a camelCased Java keyword gets a
|
|
62
|
+
// trailing underscore (javaVarName) so the snippet compiles.
|
|
63
|
+
const eVar = javaVarName(entity.name)
|
|
64
|
+
const accessor = javaVarName(entity.name)
|
|
65
|
+
|
|
66
|
+
Content(`
|
|
67
|
+
### ${entity.Name}
|
|
68
|
+
|
|
69
|
+
`)
|
|
70
|
+
|
|
71
|
+
if (entity.short) {
|
|
72
|
+
Content(`${entity.short}
|
|
73
|
+
|
|
74
|
+
`)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
Content(`Create an instance: \`SdkEntity ${eVar} = client.${accessor}(null);\`
|
|
78
|
+
|
|
79
|
+
`)
|
|
80
|
+
|
|
81
|
+
if (opnames.length > 0) {
|
|
82
|
+
Content(`#### Operations
|
|
83
|
+
|
|
84
|
+
| Method | Description |
|
|
85
|
+
| --- | --- |
|
|
86
|
+
`)
|
|
87
|
+
opnames.map((opname: string) => {
|
|
88
|
+
const info = OP_DESC[opname]
|
|
89
|
+
if (info) {
|
|
90
|
+
Content(`| \`${info.method}\` | ${info.desc} |
|
|
91
|
+
`)
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
Content(`
|
|
96
|
+
`)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (fields.length > 0) {
|
|
100
|
+
Content(`#### Fields
|
|
101
|
+
|
|
102
|
+
| Field | Type | Description |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
`)
|
|
105
|
+
|
|
106
|
+
each(fields, (field: any) => {
|
|
107
|
+
const desc = field.short || ''
|
|
108
|
+
Content(`| \`${field.name}\` | \`${canonToType(field.type, target.name)}\` | ${desc} |
|
|
109
|
+
`)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
Content(`
|
|
113
|
+
`)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (opnames.includes('load')) {
|
|
117
|
+
// The id key plus every REQUIRED match key (parent path params like
|
|
118
|
+
// page_id) — the same shape the runtime resolves path params from, so
|
|
119
|
+
// the example always works.
|
|
120
|
+
const loadItems = opRequestShape(entity, 'load').items
|
|
121
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
122
|
+
.sort((a: any, b: any) =>
|
|
123
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
124
|
+
const loadArg = 0 < loadItems.length
|
|
125
|
+
? `Map.of(${loadItems.map((it: any) =>
|
|
126
|
+
`"${it.name}", ${javaLit(it.type,
|
|
127
|
+
it.name === idF ? entity.name + '_id' : it.name)}`).join(', ')})`
|
|
128
|
+
: 'null'
|
|
129
|
+
Content(`#### Example: Load
|
|
130
|
+
|
|
131
|
+
\`\`\`java
|
|
132
|
+
Object ${eVar} = client.${accessor}(null).load(${loadArg}, null);
|
|
133
|
+
\`\`\`
|
|
134
|
+
|
|
135
|
+
`)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (opnames.includes('list')) {
|
|
139
|
+
Content(`#### Example: List
|
|
140
|
+
|
|
141
|
+
\`\`\`java
|
|
142
|
+
Object ${eVar}List = client.${accessor}(null).list(null, null);
|
|
143
|
+
\`\`\`
|
|
144
|
+
|
|
145
|
+
`)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (opnames.includes('create')) {
|
|
149
|
+
// Members come from the SAME shape the runtime validates
|
|
150
|
+
// (opRequestShape): every required member must appear — including a
|
|
151
|
+
// required id and parent keys like page_id — with a real literal.
|
|
152
|
+
const createItems = opRequestShape(entity, 'create').items
|
|
153
|
+
.filter((it: any) => !it.optional)
|
|
154
|
+
Content(`#### Example: Create
|
|
155
|
+
|
|
156
|
+
\`\`\`java
|
|
157
|
+
Object ${eVar} = client.${accessor}(null).create(Map.of(
|
|
158
|
+
`)
|
|
159
|
+
createItems.map((it: any, i: number) => {
|
|
160
|
+
const comma = i < createItems.length - 1 ? ',' : ''
|
|
161
|
+
Content(` "${it.name}", ${javaLit(it.type, 'example_' + it.name)}${comma} // ${canonToType(it.type, target.name)}
|
|
162
|
+
`)
|
|
163
|
+
})
|
|
164
|
+
Content(`), null);
|
|
165
|
+
\`\`\`
|
|
166
|
+
|
|
167
|
+
`)
|
|
168
|
+
}
|
|
169
|
+
})
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
export {
|
|
174
|
+
ReadmeEntity
|
|
175
|
+
}
|