@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,202 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
// Typed-model generator (Scala target). Port of EntityTypes_java.ts /
|
|
4
|
+
// EntityTypes_py.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.scala,
|
|
8
|
+
// holding an `object <Name>Types` with a nested `final case class` per active
|
|
9
|
+
// entity plus a request/match case class per active op.
|
|
10
|
+
//
|
|
11
|
+
// WHY A CONTAINER OBJECT: keeps the whole reference model in one file whatever
|
|
12
|
+
// the entity count and matches the java target's single-container layout
|
|
13
|
+
// (<Name>Types.java). Scala permits multiple top-level types per file, but a
|
|
14
|
+
// container object mirrors the JVM sibling and keeps the generated core/ dir
|
|
15
|
+
// tidy.
|
|
16
|
+
//
|
|
17
|
+
// TYPE CHOICE: reference `case class` types with BOXED (nullable) component
|
|
18
|
+
// types, NOT the wired runtime type. The generated ops take/return the loose
|
|
19
|
+
// object model (java.util.Map[String, Object] / Object), so these case classes
|
|
20
|
+
// are NOT wired into the op signatures — they are documentation/DX reference
|
|
21
|
+
// shapes a caller may use to describe a payload before converting it to a map.
|
|
22
|
+
// This mirrors the java target's reference records and the JS target's JSDoc
|
|
23
|
+
// typedefs (annotation only, no runtime effect). Emitting unused case classes
|
|
24
|
+
// is harmless — they compile and have no runtime effect.
|
|
25
|
+
//
|
|
26
|
+
// OPTIONAL FIELDS: every component is a boxed reference type, hence inherently
|
|
27
|
+
// nullable, so a `req:false` field/param needs no distinct rendering in Scala.
|
|
28
|
+
//
|
|
29
|
+
// Sentinels map to Scala types via the SHARED canonToType 'scala' column (the
|
|
30
|
+
// single source of truth per language — do not keep a local table here).
|
|
31
|
+
//
|
|
32
|
+
// Keep the SAME type-name scheme as every other language: <Name>,
|
|
33
|
+
// <Name>LoadMatch, <Name>ListMatch, <Name>CreateData, <Name>UpdateData,
|
|
34
|
+
// <Name>RemoveMatch (via the shared opTypeName helper).
|
|
35
|
+
|
|
36
|
+
import {
|
|
37
|
+
cmp, each, names,
|
|
38
|
+
File, Content,
|
|
39
|
+
} from '@voxgig/sdkgen'
|
|
40
|
+
|
|
41
|
+
import { canonToType, opTypeName, opRequestShape, warnEntityTypeCollisions } from '@voxgig/sdkgen'
|
|
42
|
+
|
|
43
|
+
import {
|
|
44
|
+
KIT,
|
|
45
|
+
getModelPath,
|
|
46
|
+
} from '@voxgig/apidef'
|
|
47
|
+
|
|
48
|
+
import { scalaPackage } from './utility_scala'
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
const LANG = 'scala'
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
// Scala reserved words that cannot be a case-class parameter name.
|
|
55
|
+
const SCALA_KEYWORDS = new Set<string>([
|
|
56
|
+
'abstract', 'case', 'catch', 'class', 'def', 'do', 'else', 'enum', 'export',
|
|
57
|
+
'extends', 'false', 'final', 'finally', 'for', 'forSome', 'given', 'if',
|
|
58
|
+
'implicit', 'import', 'lazy', 'match', 'new', 'null', 'object', 'override',
|
|
59
|
+
'package', 'private', 'protected', 'return', 'sealed', 'super', 'then',
|
|
60
|
+
'this', 'throw', 'trait', 'true', 'try', 'type', 'val', 'var', 'while',
|
|
61
|
+
'with', 'yield',
|
|
62
|
+
])
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
// A field/param name that has a safe Scala identifier rendering. Names that are
|
|
66
|
+
// not valid identifiers (hyphens, leading digits) have no clean parameter form
|
|
67
|
+
// and are skipped — they remain reachable via the runtime map.
|
|
68
|
+
function scalaIdent(name: string): boolean {
|
|
69
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(name) && !SCALA_KEYWORDS.has(name)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
// Emit a nested `final case class <typeName>(...)` from {name, type} items. An
|
|
74
|
+
// item whose name is not a legal identifier is skipped (WITH a warning — the
|
|
75
|
+
// key stays reachable via the runtime map, but its absence from the typed
|
|
76
|
+
// model should be visible, not silent); a duplicate component name (after the
|
|
77
|
+
// identifier filter) is dropped. An empty case class is a valid,
|
|
78
|
+
// zero-parameter shape.
|
|
79
|
+
function emitCaseClass(typeName: string, items: any[], log?: any): void {
|
|
80
|
+
const seen = new Set<string>()
|
|
81
|
+
const usable = items.filter((it: any) => {
|
|
82
|
+
if (!it || null == it.name) {
|
|
83
|
+
return false
|
|
84
|
+
}
|
|
85
|
+
if (!scalaIdent(it.name)) {
|
|
86
|
+
if (log && log.warn) {
|
|
87
|
+
log.warn({
|
|
88
|
+
point: 'entity-types-skip-field', typeName, field: it.name,
|
|
89
|
+
note: `scala: field "${it.name}" of ${typeName} has no legal ` +
|
|
90
|
+
`Scala identifier form; omitted from the typed model (still ` +
|
|
91
|
+
`reachable via the runtime map)`,
|
|
92
|
+
})
|
|
93
|
+
}
|
|
94
|
+
return false
|
|
95
|
+
}
|
|
96
|
+
if (seen.has(it.name)) {
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
seen.add(it.name)
|
|
100
|
+
return true
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
if (0 === usable.length) {
|
|
104
|
+
Content(` final case class ${typeName}()
|
|
105
|
+
|
|
106
|
+
`)
|
|
107
|
+
return
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const params = usable
|
|
111
|
+
.map((it: any) => `${it.name}: ${canonToType(it.type, LANG)}`)
|
|
112
|
+
.join(', ')
|
|
113
|
+
Content(` final case class ${typeName}(${params})
|
|
114
|
+
|
|
115
|
+
`)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
const EntityTypes = cmp(function EntityTypes(props: any) {
|
|
120
|
+
const { model, log } = props.ctx$
|
|
121
|
+
const target = props.target || {}
|
|
122
|
+
const ext = target.ext || 'scala'
|
|
123
|
+
|
|
124
|
+
const scalapackage = props.scalapackage || scalaPackage(model)
|
|
125
|
+
|
|
126
|
+
// only_active:false — getModelPath DROPS active:false entries by default,
|
|
127
|
+
// but the consumer scaffold (create-sdkgen Root.ts) iterates the RAW entity
|
|
128
|
+
// collection, so inactive entities still get generated entity code that
|
|
129
|
+
// references these typed names. The typed model must cover them too.
|
|
130
|
+
const entity = getModelPath(model, `main.${KIT}.entity`, { only_active: false, required: false })
|
|
131
|
+
// Emit for EVERY entity that gets generated entity code: the consumer
|
|
132
|
+
// scaffold (create-sdkgen Root.ts) iterates entities WITHOUT an active
|
|
133
|
+
// filter, so inactive entities still get class files referencing these
|
|
134
|
+
// typed names. Filter on `name` (always present), NOT `active` — parity
|
|
135
|
+
// with the go emitter's fix.
|
|
136
|
+
const entityList = each(entity).filter((e: any) => e && null != e.name)
|
|
137
|
+
// Derive the PascalCase Name up-front — it is set LAZILY by names(), so an
|
|
138
|
+
// entity not yet named (e.g. a fieldless placeholder) would otherwise read
|
|
139
|
+
// `Name = undefined` below. Parity with the go/py/java/csharp emitter's fix.
|
|
140
|
+
entityList.forEach((e: any) => { if (null == e.Name) names(e, e.name) })
|
|
141
|
+
|
|
142
|
+
// Surface duplicate generated type names (two entities with the same
|
|
143
|
+
// PascalCase Name) — they would redeclare a type in statically-typed
|
|
144
|
+
// targets. Detection only; renaming is a model-level decision.
|
|
145
|
+
warnEntityTypeCollisions(entity, log, LANG)
|
|
146
|
+
|
|
147
|
+
File({ name: model.const.Name + 'Types.' + ext }, () => {
|
|
148
|
+
|
|
149
|
+
Content(`package ${scalapackage}.core
|
|
150
|
+
|
|
151
|
+
// Typed reference models for the ${model.const.Name} SDK.
|
|
152
|
+
//
|
|
153
|
+
// GENERATED from the API model: main.${KIT}.entity.<e>.fields[] and per-op
|
|
154
|
+
// params (op.<name>.points[].args.params[]). Field/param types come from the
|
|
155
|
+
// canonical type sentinels (source of truth: @voxgig/apidef VALID_CANON). Do
|
|
156
|
+
// not edit by hand.
|
|
157
|
+
//
|
|
158
|
+
// These case classes are documentation/DX reference shapes ONLY. The SDK ops
|
|
159
|
+
// take and return the loose object model (java.util.Map[String, Object] /
|
|
160
|
+
// Object) at runtime, so these types are not wired into the op signatures —
|
|
161
|
+
// use them to describe a payload before converting it to a map. Every
|
|
162
|
+
// component is a boxed (nullable) type, so an optional (req:false) key needs
|
|
163
|
+
// no distinct rendering.
|
|
164
|
+
|
|
165
|
+
object ${model.const.Name}Types {
|
|
166
|
+
|
|
167
|
+
`)
|
|
168
|
+
|
|
169
|
+
entityList.forEach((ent: any) => {
|
|
170
|
+
const Name = ent.Name
|
|
171
|
+
const fields = (ent.fields ? each(ent.fields) : [])
|
|
172
|
+
.filter((f: any) => f.active !== false)
|
|
173
|
+
|
|
174
|
+
// Entity data model: one component per field.
|
|
175
|
+
emitCaseClass(Name, fields.map((f: any) => ({
|
|
176
|
+
name: f.name, type: f.type,
|
|
177
|
+
})), log)
|
|
178
|
+
|
|
179
|
+
// Per active op: a request/match case class. Members come from the shared
|
|
180
|
+
// partiality policy (opRequestShape).
|
|
181
|
+
const ops = ent.op || {}
|
|
182
|
+
;['load', 'list', 'create', 'update', 'remove'].forEach((opname: string) => {
|
|
183
|
+
if (null == ops[opname]) {
|
|
184
|
+
return
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const typeName = opTypeName(Name, opname)
|
|
188
|
+
const { items } = opRequestShape(ent, opname)
|
|
189
|
+
|
|
190
|
+
emitCaseClass(typeName, items, log)
|
|
191
|
+
})
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
Content(`}
|
|
195
|
+
`)
|
|
196
|
+
})
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
export {
|
|
201
|
+
EntityTypes,
|
|
202
|
+
}
|
|
@@ -23,6 +23,7 @@ import { Config } from './Config_scala'
|
|
|
23
23
|
import { Gitignore } from './Gitignore_scala'
|
|
24
24
|
import { MainEntity } from './MainEntity_scala'
|
|
25
25
|
import { EntityBase } from './EntityBase_scala'
|
|
26
|
+
import { EntityTypes } from './EntityTypes_scala'
|
|
26
27
|
import { scalaPackage } from './utility_scala'
|
|
27
28
|
|
|
28
29
|
|
|
@@ -83,6 +84,11 @@ const Main = cmp(async function Main(props: any) {
|
|
|
83
84
|
})
|
|
84
85
|
|
|
85
86
|
Config({ target })
|
|
87
|
+
|
|
88
|
+
// Generate the typed reference-model file (<Name>Types.scala) beside the
|
|
89
|
+
// other generated core files. Documentation/DX shapes only — not wired
|
|
90
|
+
// into the loose-object-model op signatures.
|
|
91
|
+
EntityTypes({ target, scalapackage })
|
|
86
92
|
})
|
|
87
93
|
|
|
88
94
|
})
|
|
@@ -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 { scalaVarName } from './utility_scala'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// Type names come from the shared canonToType 'scala' column (single source of truth).
|
|
13
|
+
|
|
14
|
+
// A type-correct Scala literal for a field's canonical type.
|
|
15
|
+
function scalaLit(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 'java.util.List.of()'
|
|
21
|
+
if ('OBJECT' === k) return 'java.util.Map.of()'
|
|
22
|
+
return `"${placeholder}"`
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
// Operation method spelling for Scala: 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 Scala keyword gets a
|
|
62
|
+
// trailing underscore (scalaVarName) so the snippet compiles.
|
|
63
|
+
const eVar = scalaVarName(entity.name)
|
|
64
|
+
const accessor = scalaVarName(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: \`val ${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
|
+
? `java.util.Map.of(${loadItems.map((it: any) =>
|
|
126
|
+
`"${it.name}", ${scalaLit(it.type,
|
|
127
|
+
it.name === idF ? entity.name + '_id' : it.name)}`).join(', ')})`
|
|
128
|
+
: 'null'
|
|
129
|
+
Content(`#### Example: Load
|
|
130
|
+
|
|
131
|
+
\`\`\`scala
|
|
132
|
+
val ${eVar} = client.${accessor}(null).load(${loadArg}, null)
|
|
133
|
+
\`\`\`
|
|
134
|
+
|
|
135
|
+
`)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (opnames.includes('list')) {
|
|
139
|
+
Content(`#### Example: List
|
|
140
|
+
|
|
141
|
+
\`\`\`scala
|
|
142
|
+
val ${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
|
+
\`\`\`scala
|
|
157
|
+
val ${eVar} = client.${accessor}(null).create(java.util.Map.of(
|
|
158
|
+
`)
|
|
159
|
+
createItems.map((it: any, i: number) => {
|
|
160
|
+
const comma = i < createItems.length - 1 ? ',' : ''
|
|
161
|
+
Content(` "${it.name}", ${scalaLit(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
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, File, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// Emits sdktest/ReadmeExamplesTest.scala — a PRESENCE + STRUCTURE gate over
|
|
6
|
+
// every scala fenced block in the repository ROOT README.md, the per-language
|
|
7
|
+
// scala/README.md, AND the per-language scala/REFERENCE.md. It is a
|
|
8
|
+
// default-package scala-cli object exposing run(rep) and is driven by the
|
|
9
|
+
// generated SdkEntityTestMain aggregator (mirrors the generated per-entity
|
|
10
|
+
// test objects).
|
|
11
|
+
//
|
|
12
|
+
// SCOPE NOTE (deliberate, documented): the Python/TS/Go equivalents EXECUTE and
|
|
13
|
+
// type-check every documented block. That is infeasible here — the generated
|
|
14
|
+
// Scala SDK compiles with scala-cli only (no in-process Scala compiler wired
|
|
15
|
+
// into the test runtime), so a test cannot compile-and-run arbitrary doc
|
|
16
|
+
// snippets at test time. This gate therefore guarantees the weaker-but-real
|
|
17
|
+
// invariant that keeps the docs honest as the generator evolves:
|
|
18
|
+
// 1. every doc exists and contains at least one scala block (nothing was
|
|
19
|
+
// dropped);
|
|
20
|
+
// 2. every scala block is structurally well-formed — its braces, parentheses
|
|
21
|
+
// and brackets balance (catches a truncated or malformed generated
|
|
22
|
+
// snippet).
|
|
23
|
+
// A per-doc summary line makes the coverage visible in the test output.
|
|
24
|
+
//
|
|
25
|
+
// The emitted Scala is written WITHOUT literal backticks (the fence marker is
|
|
26
|
+
// built at runtime as 96.toChar.toString.repeat(3)) so this TS template literal
|
|
27
|
+
// stays clean.
|
|
28
|
+
const ReadmeExamplesTest = cmp(function ReadmeExamplesTest(props: any) {
|
|
29
|
+
const { target, ctx$: { model } } = props
|
|
30
|
+
|
|
31
|
+
const Name = model.const.Name
|
|
32
|
+
|
|
33
|
+
File({ name: 'ReadmeExamplesTest.' + target.ext }, () => {
|
|
34
|
+
Content(`// ${Name} SDK — documentation scala-examples PRESENCE + STRUCTURE gate.
|
|
35
|
+
//
|
|
36
|
+
// GUARANTEE (see ReadmeExamplesTest_scala.ts for why this is a structure gate
|
|
37
|
+
// and not an execute gate): every scala example in the docs is accounted for.
|
|
38
|
+
// A dependency-free scala-cli test object (default package, driven by
|
|
39
|
+
// SdkEntityTestMain) over every scala fenced code block in three documents:
|
|
40
|
+
// - the repository ROOT README.md (one directory above the scala module),
|
|
41
|
+
// - the per-language scala/README.md,
|
|
42
|
+
// - the per-language scala/REFERENCE.md.
|
|
43
|
+
//
|
|
44
|
+
// Checks, PER DOCUMENT:
|
|
45
|
+
// 1. PRESENCE: the doc exists and holds at least one scala block.
|
|
46
|
+
// 2. STRUCTURE: every scala block's braces / parens / brackets balance, so a
|
|
47
|
+
// truncated or malformed generated snippet fails loudly.
|
|
48
|
+
//
|
|
49
|
+
// GENERATED by @voxgig/sdkgen — do not edit by hand.
|
|
50
|
+
|
|
51
|
+
import java.nio.file.{Files, Path, Paths}
|
|
52
|
+
|
|
53
|
+
object ReadmeExamplesTest {
|
|
54
|
+
|
|
55
|
+
// The three documents to scan, resolved relative to the scala module
|
|
56
|
+
// directory (the working directory when scala-cli runs the tests). Each row
|
|
57
|
+
// is {label, relative path}.
|
|
58
|
+
private def docs(): Array[Array[String]] = Array(
|
|
59
|
+
Array("root README", ".." + java.io.File.separator + "README.md"),
|
|
60
|
+
Array("scala README.md", "README.md"),
|
|
61
|
+
Array("scala REFERENCE.md", "REFERENCE.md")
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
// Extract every scala fenced block. Split on the triple-backtick fence:
|
|
65
|
+
// odd-indexed segments are the inside of a fenced block (info string on the
|
|
66
|
+
// first line, then the code). Only blocks whose info string is exactly
|
|
67
|
+
// "scala" are returned.
|
|
68
|
+
private def scalaBlocks(text: String): java.util.List[String] = {
|
|
69
|
+
val fence = 96.toChar.toString.repeat(3)
|
|
70
|
+
val parts = text.split(java.util.regex.Pattern.quote(fence), -1)
|
|
71
|
+
val blocks = new java.util.ArrayList[String]()
|
|
72
|
+
var i = 1
|
|
73
|
+
while (i < parts.length) {
|
|
74
|
+
val seg = parts(i)
|
|
75
|
+
val nl = seg.indexOf('\\n')
|
|
76
|
+
val info = (if (nl < 0) seg else seg.substring(0, nl)).trim()
|
|
77
|
+
if (info == "scala") {
|
|
78
|
+
blocks.add(if (nl < 0) "" else seg.substring(nl + 1))
|
|
79
|
+
}
|
|
80
|
+
i += 2
|
|
81
|
+
}
|
|
82
|
+
blocks
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private def readDoc(path: Path): String =
|
|
86
|
+
new String(Files.readAllBytes(path), "UTF-8")
|
|
87
|
+
|
|
88
|
+
// True when every open/close delimiter balances (ignores the subtlety of
|
|
89
|
+
// delimiters inside string literals — a generated snippet never nests an
|
|
90
|
+
// unbalanced delimiter in a string, and this catches truncation).
|
|
91
|
+
private def balanced(block: String): Boolean = {
|
|
92
|
+
val stack = new java.util.ArrayDeque[Character]()
|
|
93
|
+
var i = 0
|
|
94
|
+
while (i < block.length) {
|
|
95
|
+
val ch = block.charAt(i)
|
|
96
|
+
ch match {
|
|
97
|
+
case '(' => stack.push(')')
|
|
98
|
+
case '[' => stack.push(']')
|
|
99
|
+
case '{' => stack.push('}')
|
|
100
|
+
case ')' | ']' | '}' =>
|
|
101
|
+
if (stack.isEmpty || stack.pop().charValue() != ch) return false
|
|
102
|
+
case _ =>
|
|
103
|
+
}
|
|
104
|
+
i += 1
|
|
105
|
+
}
|
|
106
|
+
stack.isEmpty
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
def run(rep: SdkTestReport): Unit = {
|
|
110
|
+
val ds = docs()
|
|
111
|
+
|
|
112
|
+
// PRESENCE: each doc exists and holds at least one scala block.
|
|
113
|
+
var di = 0
|
|
114
|
+
while (di < ds.length) {
|
|
115
|
+
val label = ds(di)(0)
|
|
116
|
+
val rel = ds(di)(1)
|
|
117
|
+
rep.scope("readme-examples.presence." + label) {
|
|
118
|
+
val path = Paths.get(rel)
|
|
119
|
+
rep.check("readme-examples.presence." + label + ".exists",
|
|
120
|
+
Files.exists(path), label + " not found: " + path)
|
|
121
|
+
if (Files.exists(path)) {
|
|
122
|
+
val blocks = scalaBlocks(readDoc(path))
|
|
123
|
+
rep.check("readme-examples.presence." + label, blocks.size() > 0,
|
|
124
|
+
"expected at least one scala block in " + label)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
di += 1
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// STRUCTURE: every scala block's delimiters balance.
|
|
131
|
+
rep.scope("readme-examples.structure") {
|
|
132
|
+
val failures = new java.util.ArrayList[String]()
|
|
133
|
+
var dj = 0
|
|
134
|
+
while (dj < ds.length) {
|
|
135
|
+
val label = ds(dj)(0)
|
|
136
|
+
val path = Paths.get(ds(dj)(1))
|
|
137
|
+
if (Files.exists(path)) {
|
|
138
|
+
val blocks = scalaBlocks(readDoc(path))
|
|
139
|
+
var balancedCount = 0
|
|
140
|
+
var bi = 0
|
|
141
|
+
while (bi < blocks.size()) {
|
|
142
|
+
if (balanced(blocks.get(bi))) balancedCount += 1
|
|
143
|
+
else failures.add(label + " scala block #" + bi + " has unbalanced delimiters")
|
|
144
|
+
bi += 1
|
|
145
|
+
}
|
|
146
|
+
println("[readme-examples] " + label + " scala blocks: total=" +
|
|
147
|
+
blocks.size() + " balanced=" + balancedCount)
|
|
148
|
+
}
|
|
149
|
+
dj += 1
|
|
150
|
+
}
|
|
151
|
+
rep.check("readme-examples.structure", failures.isEmpty(),
|
|
152
|
+
String.join("; ", failures))
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
`)
|
|
157
|
+
})
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
export {
|
|
162
|
+
ReadmeExamplesTest
|
|
163
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import { scalaPackage } from './utility_scala'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
const ReadmeExplanation = cmp(function ReadmeExplanation(props: any) {
|
|
8
|
+
const { target, ctx$: { model } } = props
|
|
9
|
+
|
|
10
|
+
const pkg = scalaPackage(model)
|
|
11
|
+
|
|
12
|
+
Content(`### Data as maps
|
|
13
|
+
|
|
14
|
+
The Scala SDK uses a loose object model — \`java.util.Map[String, Object]\`
|
|
15
|
+
throughout — rather than a bespoke typed class per endpoint. This mirrors the
|
|
16
|
+
dynamic nature of the API and keeps the SDK flexible: no regeneration is
|
|
17
|
+
needed when the API schema changes.
|
|
18
|
+
|
|
19
|
+
Use \`Helpers.toMapAny(value)\` to safely coerce a value to a
|
|
20
|
+
\`java.util.Map[String, Object]\`. A \`${model.const.Name}Types.scala\` module of
|
|
21
|
+
reference \`case class\` types is also generated for editor documentation.
|
|
22
|
+
|
|
23
|
+
### Project structure
|
|
24
|
+
|
|
25
|
+
\`\`\`
|
|
26
|
+
scala/
|
|
27
|
+
├── project.scala -- scala-cli project config (Scala 3, no deps)
|
|
28
|
+
├── core/ -- Main SDK client, config, entity base, error type
|
|
29
|
+
├── entity/ -- Entity implementations
|
|
30
|
+
├── feature/ -- Built-in features (Base, Test, Log, ...)
|
|
31
|
+
├── utility/ -- Utility functions and the vendored struct library
|
|
32
|
+
└── sdktest/ -- Generated per-entity tests (scala-cli mains)
|
|
33
|
+
\`\`\`
|
|
34
|
+
|
|
35
|
+
The main client class (\`${model.const.Name}SDK\`, package \`${pkg}.core\`)
|
|
36
|
+
exposes the entity accessors. Reference entity or utility types directly only
|
|
37
|
+
when needed. The SDK is a dependency-free scala-cli project: JSON parsing is
|
|
38
|
+
the vendored \`utility/Json.java\`, HTTP transport is the JDK
|
|
39
|
+
\`java.net.http.HttpClient\`, and the struct library is inlined under
|
|
40
|
+
\`utility/struct\`.
|
|
41
|
+
|
|
42
|
+
`)
|
|
43
|
+
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
ReadmeExplanation
|
|
49
|
+
}
|