@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,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 { scalaVarName, scalaPackage } from './utility_scala'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
// A type-correct Scala literal for a param: numeric/boolean/array/object params
|
|
14
|
+
// render a typed literal; strings render the quoted placeholder. The SDK's
|
|
15
|
+
// loose object model means all values live in java.util.Map[String, Object].
|
|
16
|
+
function scalaLit(type: any, placeholder: string = 'example'): string {
|
|
17
|
+
const k = canonKey(type)
|
|
18
|
+
if ('INTEGER' === k) return '1L'
|
|
19
|
+
if ('NUMBER' === k) return '1.0'
|
|
20
|
+
if ('BOOLEAN' === k) return 'true'
|
|
21
|
+
if ('ARRAY' === k) return 'java.util.List.of()'
|
|
22
|
+
if ('OBJECT' === k) return 'java.util.Map.of()'
|
|
23
|
+
return `"${placeholder}"`
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
const ReadmeTopQuick = cmp(function ReadmeTopQuick(props: any) {
|
|
28
|
+
const { target, ctx$: { model } } = props
|
|
29
|
+
|
|
30
|
+
const SDK = model.const.Name + 'SDK'
|
|
31
|
+
|
|
32
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
33
|
+
|
|
34
|
+
const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
|
|
35
|
+
|
|
36
|
+
const authActive = isAuthActive(model)
|
|
37
|
+
|
|
38
|
+
Content(`\`\`\`scala
|
|
39
|
+
import ${scalaPackage(model)}.core.${SDK}
|
|
40
|
+
|
|
41
|
+
`)
|
|
42
|
+
|
|
43
|
+
if (authActive) {
|
|
44
|
+
Content(`val options = new java.util.LinkedHashMap[String, Object]()
|
|
45
|
+
options.put("apikey", System.getenv("${envName(model)}_APIKEY"))
|
|
46
|
+
val client = new ${SDK}(options)
|
|
47
|
+
|
|
48
|
+
`)
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
Content(`val client = new ${SDK}()
|
|
52
|
+
|
|
53
|
+
`)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (exampleEntity) {
|
|
57
|
+
// Sanitise the local variable name — an entity whose camelCased name is a
|
|
58
|
+
// Scala keyword gets a trailing underscore (scalaVarName) so the snippet
|
|
59
|
+
// compiles.
|
|
60
|
+
const eVar = scalaVarName(exampleEntity.name)
|
|
61
|
+
const accessor = scalaVarName(exampleEntity.name)
|
|
62
|
+
const eNameLower = nom(exampleEntity, 'Name').toLowerCase()
|
|
63
|
+
const opnames = Object.keys(exampleEntity.op || {})
|
|
64
|
+
// Model-driven id key: null when the entity has no id-like field, in which
|
|
65
|
+
// case the load example takes an empty match.
|
|
66
|
+
const idF = entityIdField(exampleEntity)
|
|
67
|
+
|
|
68
|
+
if (opnames.includes('list')) {
|
|
69
|
+
Content(`// List all ${eNameLower}s (returns Object, an aggregate list; raises on error)
|
|
70
|
+
val ${eVar}List = client.${accessor}(null).list(null, null)
|
|
71
|
+
println(${eVar}List)
|
|
72
|
+
`)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (opnames.includes('load')) {
|
|
76
|
+
// Every REQUIRED load-match key (id first, then parent path params like
|
|
77
|
+
// page_id) — the same shape the runtime resolves path params from, so
|
|
78
|
+
// the example always works.
|
|
79
|
+
const loadItems = opRequestShape(exampleEntity, 'load').items
|
|
80
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
81
|
+
.sort((a: any, b: any) =>
|
|
82
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
83
|
+
const loadArg = 0 < loadItems.length
|
|
84
|
+
? `java.util.Map.of(${loadItems.map((it: any) =>
|
|
85
|
+
`"${it.name}", ${scalaLit(it.type,
|
|
86
|
+
it.name === idF ? 'example_id' : 'example_' + it.name)}`).join(', ')})`
|
|
87
|
+
: 'null'
|
|
88
|
+
Content(`
|
|
89
|
+
// Load a specific ${eNameLower} (returns the record, raises on error)
|
|
90
|
+
val ${eVar} = client.${accessor}(null).load(${loadArg}, null)
|
|
91
|
+
println(${eVar})
|
|
92
|
+
`)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
Content(`\`\`\`
|
|
97
|
+
`)
|
|
98
|
+
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
export {
|
|
103
|
+
ReadmeTopQuick
|
|
104
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, canonKey, entityIdField, pickExampleEntity, 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
|
+
// A type-correct Scala literal for a field's canonical type.
|
|
13
|
+
function scalaLit(type: any): string {
|
|
14
|
+
const k = canonKey(type)
|
|
15
|
+
if ('INTEGER' === k) return '1L'
|
|
16
|
+
if ('NUMBER' === k) return '1.0'
|
|
17
|
+
if ('BOOLEAN' === k) return 'true'
|
|
18
|
+
if ('ARRAY' === k) return 'java.util.List.of()'
|
|
19
|
+
if ('OBJECT' === k) return 'java.util.Map.of()'
|
|
20
|
+
return '"example"'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
|
|
25
|
+
const { target, ctx$: { model } } = props
|
|
26
|
+
|
|
27
|
+
const SDK = model.const.Name + 'SDK'
|
|
28
|
+
|
|
29
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
30
|
+
|
|
31
|
+
// Pick an entity with a real op (prefer a read op) — never fabricate a
|
|
32
|
+
// `load` on an op-less entity.
|
|
33
|
+
const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
|
|
34
|
+
|
|
35
|
+
Content(`\`\`\`scala
|
|
36
|
+
val client = ${SDK}.testSDK(null, null)
|
|
37
|
+
`)
|
|
38
|
+
|
|
39
|
+
if (exampleEntity && primaryOp) {
|
|
40
|
+
const idF = entityIdField(exampleEntity)
|
|
41
|
+
const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
|
|
42
|
+
let arg = 'null'
|
|
43
|
+
if (isMatchOp) {
|
|
44
|
+
// Every REQUIRED match key (id first) — the same shape that generates
|
|
45
|
+
// the op's request type, so the block stays honest.
|
|
46
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
47
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
48
|
+
.sort((a: any, b: any) =>
|
|
49
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
50
|
+
arg = 0 < items.length
|
|
51
|
+
? `java.util.Map.of(${items.map((it: any) =>
|
|
52
|
+
`"${it.name}", ${it.name === idF ? '"test01"' : scalaLit(it.type)}`).join(', ')})`
|
|
53
|
+
: 'null'
|
|
54
|
+
} else if ('create' === primaryOp || 'update' === primaryOp) {
|
|
55
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
56
|
+
.filter((it: any) => it.name !== idF && it.name !== 'id')
|
|
57
|
+
const required = items.filter((it: any) => !it.optional)
|
|
58
|
+
const chosen = required.length ? required : items.slice(0, 3)
|
|
59
|
+
arg = `java.util.Map.of(${chosen.map((it: any) =>
|
|
60
|
+
`"${it.name}", ${scalaLit(it.type)}`).join(', ')})`
|
|
61
|
+
}
|
|
62
|
+
const eVar = scalaVarName(exampleEntity.name) + ('list' === primaryOp ? 'List' : '')
|
|
63
|
+
const accessor = scalaVarName(exampleEntity.name)
|
|
64
|
+
Content(`val ${eVar} = client.${accessor}(null).${primaryOp}(${arg}, null)
|
|
65
|
+
println(${eVar})
|
|
66
|
+
`)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
Content(`\`\`\`
|
|
70
|
+
`)
|
|
71
|
+
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
export {
|
|
76
|
+
ReadmeTopTest
|
|
77
|
+
}
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
each,
|
|
18
18
|
buildIdNames,
|
|
19
19
|
getMatchEntries,
|
|
20
|
+
entityDataIdField,
|
|
20
21
|
} from '@voxgig/sdkgen'
|
|
21
22
|
|
|
22
23
|
|
|
@@ -119,6 +120,23 @@ object ${EntityName}EntityTest {
|
|
|
119
120
|
Content(` val now = System.currentTimeMillis()
|
|
120
121
|
`)
|
|
121
122
|
|
|
123
|
+
// Preamble bootstrap: a flow with no `create` step (e.g. a read-only
|
|
124
|
+
// load/list entity) has nothing to declare the standard `<ref>_data` var
|
|
125
|
+
// that a later load/update/remove reads its id from. Seed it from the
|
|
126
|
+
// shipped "existing" fixtures here, mirroring the ts generator. Guarded on a
|
|
127
|
+
// DATA id field — an entity that carries no id has no `.get("id")` to read.
|
|
128
|
+
const flowHasCreate = allSteps.some((s: any) => s.op === 'create')
|
|
129
|
+
const needsPreambleData = !flowHasCreate &&
|
|
130
|
+
null != entityDataIdField(entity) &&
|
|
131
|
+
allSteps.some((s: any) => ['load', 'update', 'remove'].includes(s.op))
|
|
132
|
+
if (needsPreambleData) {
|
|
133
|
+
const preambleData = scalaVarName(entity.name + '_ref01_data')
|
|
134
|
+
Content(` val ${preambleData}Raw = Struct.items(Helpers.toMapAny(
|
|
135
|
+
Struct.getpath(entityData, "existing.${ENTLOWER}")))
|
|
136
|
+
val ${preambleData} = Helpers.toMapAny(${preambleData}Raw.get(0).get(1))
|
|
137
|
+
`)
|
|
138
|
+
}
|
|
139
|
+
|
|
122
140
|
// Model-driven step iteration (sorted-key order for byte-stable output).
|
|
123
141
|
each(basicflow.step, (step: any, index: any) => {
|
|
124
142
|
const opgen: OpGen = GENERATE_OP[step.op]
|
|
@@ -166,7 +184,7 @@ const generateCreate: OpGen = (ctx, step, index) => {
|
|
|
166
184
|
${datavar} = Helpers.toMapAny(${datavar}Result)
|
|
167
185
|
rep.check("${ENTLOWER}.create.map", ${datavar} != null, "expected create result to be a map")
|
|
168
186
|
`)
|
|
169
|
-
if (null != entity
|
|
187
|
+
if (null != entityDataIdField(entity)) {
|
|
170
188
|
Content(` rep.check("${ENTLOWER}.create.id", ${datavar} != null && ${datavar}.get("id") != null, "expected created entity to have an id")
|
|
171
189
|
`)
|
|
172
190
|
}
|
|
@@ -199,8 +217,12 @@ const generateList: OpGen = (ctx, step, index) => {
|
|
|
199
217
|
`)
|
|
200
218
|
}
|
|
201
219
|
|
|
220
|
+
// Select-by-id assertions require the DATA type to carry an id field
|
|
221
|
+
// (entityDataIdField); an entity keyed only on a load-MATCH id it does not
|
|
222
|
+
// return as data has no `.get("id")` to compare, so skip them.
|
|
223
|
+
const hasDataId = null != entityDataIdField(entity)
|
|
202
224
|
const allSteps = Object.values(flow.step) as any[]
|
|
203
|
-
const listvarUsed = !!step.valid?.some((v: any) => {
|
|
225
|
+
const listvarUsed = hasDataId && !!step.valid?.some((v: any) => {
|
|
204
226
|
if ('ItemExists' !== v.apply && 'ItemNotExists' !== v.apply) return false
|
|
205
227
|
const validRef = v.def?.ref
|
|
206
228
|
return validRef && allSteps.some((s: any) => 'create' === s.op &&
|
|
@@ -222,12 +244,12 @@ const generateList: OpGen = (ctx, step, index) => {
|
|
|
222
244
|
((s.input.ref ?? entity.name + '_ref01') === validRef))
|
|
223
245
|
const refDataVar = scalaVarName(validRef + '_data')
|
|
224
246
|
|
|
225
|
-
if ('ItemExists' === validator.apply && hasRefData) {
|
|
247
|
+
if ('ItemExists' === validator.apply && hasRefData && hasDataId) {
|
|
226
248
|
Content(` val ${listvar}Found = Struct.select(
|
|
227
249
|
SdkTestSupport.entityListToData(${listvar}), SdkTestSupport.om("id" -> ${refDataVar}.get("id")))
|
|
228
250
|
rep.check("${ENTLOWER}.list.exists", !Struct.isempty(${listvar}Found), "expected to find created entity in list")
|
|
229
251
|
`)
|
|
230
|
-
} else if ('ItemNotExists' === validator.apply && hasRefData) {
|
|
252
|
+
} else if ('ItemNotExists' === validator.apply && hasRefData && hasDataId) {
|
|
231
253
|
Content(` val ${listvar}NotFound = Struct.select(
|
|
232
254
|
SdkTestSupport.entityListToData(${listvar}), SdkTestSupport.om("id" -> ${refDataVar}.get("id")))
|
|
233
255
|
rep.check("${ENTLOWER}.list.notexists", Struct.isempty(${listvar}NotFound), "expected removed entity to not be in list")
|
|
@@ -251,7 +273,7 @@ const generateUpdate: OpGen = (ctx, step, index) => {
|
|
|
251
273
|
const needsEnt = !priorSteps.some((s: any) =>
|
|
252
274
|
['create', 'list', 'load', 'update', 'remove'].includes(s.op))
|
|
253
275
|
|
|
254
|
-
const
|
|
276
|
+
const hasDataId = null != entityDataIdField(entity)
|
|
255
277
|
|
|
256
278
|
Content(` // UPDATE
|
|
257
279
|
`)
|
|
@@ -261,7 +283,7 @@ const generateUpdate: OpGen = (ctx, step, index) => {
|
|
|
261
283
|
}
|
|
262
284
|
Content(` val ${datavar}Up = new LinkedHashMap[String, Object]()
|
|
263
285
|
`)
|
|
264
|
-
if (
|
|
286
|
+
if (hasDataId) {
|
|
265
287
|
Content(` ${datavar}Up.put("id", ${srcdatavar}.get("id"))
|
|
266
288
|
`)
|
|
267
289
|
}
|
|
@@ -293,7 +315,7 @@ const generateUpdate: OpGen = (ctx, step, index) => {
|
|
|
293
315
|
val ${resdatavar} = Helpers.toMapAny(${resdatavar}Result)
|
|
294
316
|
rep.check("${ENTLOWER}.update.map", ${resdatavar} != null, "expected update result to be a map")
|
|
295
317
|
`)
|
|
296
|
-
if (
|
|
318
|
+
if (hasDataId) {
|
|
297
319
|
Content(` rep.eq("${ENTLOWER}.update.id", ${datavar}Up.get("id"), ${resdatavar}.get("id"))
|
|
298
320
|
`)
|
|
299
321
|
}
|
|
@@ -328,7 +350,7 @@ const generateLoad: OpGen = (ctx, step, index) => {
|
|
|
328
350
|
return false
|
|
329
351
|
})
|
|
330
352
|
|
|
331
|
-
const
|
|
353
|
+
const hasDataId = null != entityDataIdField(entity)
|
|
332
354
|
|
|
333
355
|
Content(` // LOAD
|
|
334
356
|
`)
|
|
@@ -336,7 +358,7 @@ const generateLoad: OpGen = (ctx, step, index) => {
|
|
|
336
358
|
Content(` val ${entvar} = client.${accessor}(null)
|
|
337
359
|
`)
|
|
338
360
|
}
|
|
339
|
-
if (!hasSrcData &&
|
|
361
|
+
if (!hasSrcData && hasDataId) {
|
|
340
362
|
Content(` val ${srcdatavar}Raw = Struct.items(Helpers.toMapAny(
|
|
341
363
|
Struct.getpath(entityData, "existing.${ENTLOWER}")))
|
|
342
364
|
val ${srcdatavar} = Helpers.toMapAny(${srcdatavar}Raw.get(0).get(1))
|
|
@@ -344,7 +366,7 @@ const generateLoad: OpGen = (ctx, step, index) => {
|
|
|
344
366
|
}
|
|
345
367
|
Content(` val ${matchvar} = new LinkedHashMap[String, Object]()
|
|
346
368
|
`)
|
|
347
|
-
if (
|
|
369
|
+
if (hasDataId) {
|
|
348
370
|
Content(` ${matchvar}.put("id", ${srcdatavar}.get("id"))
|
|
349
371
|
val ${datavar}Loaded = ${entvar}.load(${matchvar}, null)
|
|
350
372
|
val ${datavar}LoadResult = Helpers.toMapAny(${datavar}Loaded)
|
|
@@ -366,6 +388,12 @@ const generateRemove: OpGen = (ctx, step, index) => {
|
|
|
366
388
|
const matchvar = scalaVarName(step.input.matchvar ?? (ref + '_match' + (step.input.suffix ?? '')))
|
|
367
389
|
const srcdatavar = scalaVarName(step.input.srcdatavar ?? (ref + '_data'))
|
|
368
390
|
|
|
391
|
+
// The remove-by-id match reads ${srcdatavar}.get("id"); skip the whole step
|
|
392
|
+
// when the DATA type has no id field (there is no created id to remove by).
|
|
393
|
+
if (null == entityDataIdField(entity)) {
|
|
394
|
+
return
|
|
395
|
+
}
|
|
396
|
+
|
|
369
397
|
const priorSteps = Object.values(flow.step).slice(0, Number(index)) as any[]
|
|
370
398
|
const needsEnt = !priorSteps.some((s: any) =>
|
|
371
399
|
['create', 'list', 'load', 'update', 'remove'].includes(s.op))
|
|
@@ -14,6 +14,7 @@ import { cmp, each, Folder, File, Content } from '@voxgig/sdkgen'
|
|
|
14
14
|
|
|
15
15
|
import { TestEntity } from './TestEntity_scala'
|
|
16
16
|
import { TestDirect } from './TestDirect_scala'
|
|
17
|
+
import { ReadmeExamplesTest } from './ReadmeExamplesTest_scala'
|
|
17
18
|
import { scalaPackage } from './utility_scala'
|
|
18
19
|
|
|
19
20
|
|
|
@@ -54,6 +55,11 @@ const Test = cmp(function Test(props: any) {
|
|
|
54
55
|
}
|
|
55
56
|
})
|
|
56
57
|
|
|
58
|
+
// Documentation scala-examples presence + structure gate over the root
|
|
59
|
+
// README, scala/README.md and scala/REFERENCE.md. Driven through the same
|
|
60
|
+
// shared report by the SdkEntityTestMain aggregator below.
|
|
61
|
+
ReadmeExamplesTest({ target, scalapackage })
|
|
62
|
+
|
|
57
63
|
// Aggregating main: run every generated per-entity test through one
|
|
58
64
|
// shared report and exit non-zero on any failure.
|
|
59
65
|
File({ name: 'SdkEntityTestMain.' + target.ext }, () => {
|
|
@@ -79,6 +85,8 @@ object SdkEntityTestMain {
|
|
|
79
85
|
}
|
|
80
86
|
}
|
|
81
87
|
Content(`
|
|
88
|
+
ReadmeExamplesTest.run(rep)
|
|
89
|
+
|
|
82
90
|
rep.finish("ENTITY")
|
|
83
91
|
}
|
|
84
92
|
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
|
|
2
|
+
// Typed-model generator (Swift target). Port of EntityTypes_rust.ts /
|
|
3
|
+
// EntityTypes_go.ts.
|
|
4
|
+
//
|
|
5
|
+
// Reads main.<KIT>.entity.<e>.fields[] and per-op params
|
|
6
|
+
// (op.<name>.points[].args.params[]) and emits one file,
|
|
7
|
+
// Sources/ProjectNameSDK/entity/<Name>Types.swift, with a `struct <Name>` per
|
|
8
|
+
// entity plus a request/match struct per active op. Field/param sentinels
|
|
9
|
+
// ($STRING, $INTEGER, ...) map to Swift types via the SHARED canonToType
|
|
10
|
+
// 'swift' column (the single source of truth per language — do not keep a
|
|
11
|
+
// local table here).
|
|
12
|
+
//
|
|
13
|
+
// DESIGN NOTE: the Swift runtime is fully DYNAMIC — every op takes and returns
|
|
14
|
+
// the vendored `Value` enum (throws on error) and the op fragments emit no
|
|
15
|
+
// typed wrappers. These typed models are therefore DOCUMENTARY: they mirror the
|
|
16
|
+
// entity/op shapes for reference and IDE support, but are not wired into the op
|
|
17
|
+
// signatures. They compile as part of the SwiftPM target (every .swift under
|
|
18
|
+
// Sources/ProjectNameSDK is built) so they stay in sync with the model.
|
|
19
|
+
// * Optional (req:false) member -> `T?`.
|
|
20
|
+
// * Unknown/missing sentinel -> the dynamic `Value` (never fails), matching
|
|
21
|
+
// the runtime's open shape.
|
|
22
|
+
|
|
23
|
+
import {
|
|
24
|
+
cmp, each, names,
|
|
25
|
+
File, Content, Folder,
|
|
26
|
+
} from '@voxgig/sdkgen'
|
|
27
|
+
|
|
28
|
+
import { canonToType, opTypeName, opRequestShape, warnEntityTypeCollisions } from '@voxgig/sdkgen'
|
|
29
|
+
|
|
30
|
+
import {
|
|
31
|
+
KIT,
|
|
32
|
+
getModelPath,
|
|
33
|
+
} from '@voxgig/apidef'
|
|
34
|
+
|
|
35
|
+
import { swiftVarName } from './utility_swift'
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
const LANG = 'swift'
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
// One Swift struct property line. `optional` -> `T?`. Property names are
|
|
42
|
+
// keyword-safe + lowerCamelCase via swiftVarName; duplicates are dropped by the
|
|
43
|
+
// caller so a struct never declares the same property twice.
|
|
44
|
+
function propLine(name: string, sentinel: any, optional: boolean): string {
|
|
45
|
+
const st = canonToType(sentinel, LANG)
|
|
46
|
+
const typ = optional ? `${st}?` : st
|
|
47
|
+
return ` public var ${swiftVarName(name)}: ${typ}\n`
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
// Emit a `struct <typeName>` from {name, type, optional} items, dropping
|
|
52
|
+
// duplicate Swift identifiers (two model names can collapse to one ident). An
|
|
53
|
+
// empty struct is a valid, zero-property shape.
|
|
54
|
+
function emitStruct(comment: string, typeName: string, items: any[]): void {
|
|
55
|
+
Content(`${comment}
|
|
56
|
+
public struct ${typeName} {
|
|
57
|
+
`)
|
|
58
|
+
const seen = new Set<string>()
|
|
59
|
+
items.forEach((it: any) => {
|
|
60
|
+
if (null == it || null == it.name) return
|
|
61
|
+
const ident = swiftVarName(it.name)
|
|
62
|
+
if (seen.has(ident)) return
|
|
63
|
+
seen.add(ident)
|
|
64
|
+
Content(propLine(it.name, it.type, !!it.optional))
|
|
65
|
+
})
|
|
66
|
+
Content(`}
|
|
67
|
+
|
|
68
|
+
`)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
const EntityTypes = cmp(function EntityTypes(props: any) {
|
|
73
|
+
const { target } = props
|
|
74
|
+
const { model, log } = props.ctx$
|
|
75
|
+
|
|
76
|
+
// only_active:false — getModelPath DROPS active:false entries by default,
|
|
77
|
+
// but the consumer scaffold (create-sdkgen Root.ts) iterates the RAW entity
|
|
78
|
+
// collection, so inactive entities still get generated entity code that
|
|
79
|
+
// references these typed names. The typed model must cover them too.
|
|
80
|
+
const entity = getModelPath(model, `main.${KIT}.entity`, { only_active: false, required: false })
|
|
81
|
+
// Emit for every entity that gets an entity file (filter on `name`, always
|
|
82
|
+
// present; derive `Name` here so the struct set is deterministic — parity
|
|
83
|
+
// with the rust/go emitter's fix).
|
|
84
|
+
const entityList = each(entity).filter((e: any) => e && null != e.name)
|
|
85
|
+
entityList.forEach((e: any) => { if (null == e.Name) names(e, e.name) })
|
|
86
|
+
|
|
87
|
+
// Surface duplicate generated type names (two entities with the same
|
|
88
|
+
// PascalCase Name) — they would redeclare a type in statically-typed
|
|
89
|
+
// targets. Detection only; renaming is a model-level decision.
|
|
90
|
+
warnEntityTypeCollisions(entity, log, LANG)
|
|
91
|
+
|
|
92
|
+
Folder({ name: 'Sources' }, () => {
|
|
93
|
+
Folder({ name: 'ProjectNameSDK' }, () => {
|
|
94
|
+
Folder({ name: 'entity' }, () => {
|
|
95
|
+
|
|
96
|
+
File({ name: model.const.Name + 'Types.' + target.ext }, () => {
|
|
97
|
+
|
|
98
|
+
Content(`// Typed models for the ${model.const.Name} SDK.
|
|
99
|
+
//
|
|
100
|
+
// GENERATED from the API model: main.${KIT}.entity.<e>.fields[] and per-op
|
|
101
|
+
// params (op.<name>.points[].args.params[]). Field/param types are mapped
|
|
102
|
+
// from the canonical type sentinels. Do not edit by hand.
|
|
103
|
+
//
|
|
104
|
+
// These are DOCUMENTARY: the SDK runtime is dynamic (ops take/return the
|
|
105
|
+
// \`Value\` enum), so nothing consumes these structs yet — they mirror the
|
|
106
|
+
// entity/op shapes for reference and IDE support.
|
|
107
|
+
|
|
108
|
+
import Foundation
|
|
109
|
+
|
|
110
|
+
`)
|
|
111
|
+
|
|
112
|
+
entityList.forEach((ent: any) => {
|
|
113
|
+
const Name = ent.Name
|
|
114
|
+
const fields = (ent.fields ? each(ent.fields) : [])
|
|
115
|
+
.filter((f: any) => f.active !== false)
|
|
116
|
+
|
|
117
|
+
// Entity data model: one property per field. req:false -> optional.
|
|
118
|
+
emitStruct(
|
|
119
|
+
`/// ${Name} is the typed data model for the ${ent.name} entity.`,
|
|
120
|
+
Name,
|
|
121
|
+
fields.map((f: any) => ({ name: f.name, type: f.type, optional: false === f.req }))
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
// Per active op: a request/match struct. Members and their
|
|
125
|
+
// optionality come from the shared partiality policy
|
|
126
|
+
// (opRequestShape).
|
|
127
|
+
const ops = ent.op || {}
|
|
128
|
+
;['load', 'list', 'create', 'update', 'remove'].forEach((opname: string) => {
|
|
129
|
+
if (null == ops[opname]) {
|
|
130
|
+
return
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const typeName = opTypeName(Name, opname)
|
|
134
|
+
const { items } = opRequestShape(ent, opname)
|
|
135
|
+
|
|
136
|
+
emitStruct(
|
|
137
|
+
`/// ${typeName} is the typed request payload for ${Name}.${opname}.`,
|
|
138
|
+
typeName,
|
|
139
|
+
items
|
|
140
|
+
)
|
|
141
|
+
})
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
})
|
|
145
|
+
})
|
|
146
|
+
})
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
export {
|
|
151
|
+
EntityTypes,
|
|
152
|
+
}
|
|
@@ -24,6 +24,7 @@ import { Gitignore } from './Gitignore_swift'
|
|
|
24
24
|
import { MainEntity } from './MainEntity_swift'
|
|
25
25
|
import { SdkError } from './SdkError_swift'
|
|
26
26
|
import { EntityBase } from './EntityBase_swift'
|
|
27
|
+
import { EntityTypes } from './EntityTypes_swift'
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
const Main = cmp(async function Main(props: any) {
|
|
@@ -86,6 +87,10 @@ const Main = cmp(async function Main(props: any) {
|
|
|
86
87
|
})
|
|
87
88
|
})
|
|
88
89
|
})
|
|
90
|
+
|
|
91
|
+
// entity/<Name>Types.swift — documentary typed models (one struct per entity
|
|
92
|
+
// + per op). Compiles with the SwiftPM target; nothing consumes it yet.
|
|
93
|
+
EntityTypes({ target })
|
|
89
94
|
})
|
|
90
95
|
|
|
91
96
|
|
|
@@ -0,0 +1,176 @@
|
|
|
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 { swiftVarName } from './utility_swift'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// Type names come from the shared canonToType 'swift' column (single source of truth).
|
|
13
|
+
|
|
14
|
+
// A type-correct Swift `Value` literal for a field's canonical type.
|
|
15
|
+
function swiftLit(type: any, placeholder: string = 'example'): string {
|
|
16
|
+
const k = canonKey(type)
|
|
17
|
+
if ('INTEGER' === k) return '.int(1)'
|
|
18
|
+
if ('NUMBER' === k) return '.double(1.0)'
|
|
19
|
+
if ('BOOLEAN' === k) return '.bool(true)'
|
|
20
|
+
if ('ARRAY' === k) return '.list([])'
|
|
21
|
+
if ('OBJECT' === k) return '.map(VMap())'
|
|
22
|
+
return `.string("${placeholder}")`
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
// Operation method spelling for Swift: methods over the loose object model,
|
|
27
|
+
// taking optional (reqmatch/reqdata, ctrl) and throwing on error. The op
|
|
28
|
+
// descriptions are language-agnostic.
|
|
29
|
+
const OP_DESC: Record<string, { method: string, desc: string }> = {
|
|
30
|
+
load: { method: 'load(match, nil)', desc: 'Load a single entity by match criteria.' },
|
|
31
|
+
list: { method: 'list(nil, nil)', desc: 'List entities, optionally matching the given criteria.' },
|
|
32
|
+
create: { method: 'create(data, nil)', desc: 'Create a new entity with the given data.' },
|
|
33
|
+
update: { method: 'update(data, nil)', desc: 'Update an existing entity.' },
|
|
34
|
+
remove: { method: 'remove(match, nil)', desc: 'Remove the matching entity.' },
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
const ReadmeEntity = cmp(function ReadmeEntity(props: any) {
|
|
39
|
+
const { target } = props
|
|
40
|
+
const { model } = props.ctx$
|
|
41
|
+
|
|
42
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
43
|
+
|
|
44
|
+
const publishedEntities = each(entity)
|
|
45
|
+
.filter((entity: any) => entity.active !== false)
|
|
46
|
+
|
|
47
|
+
if (0 === publishedEntities.length) {
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
Content(`
|
|
52
|
+
|
|
53
|
+
## Entities
|
|
54
|
+
|
|
55
|
+
`)
|
|
56
|
+
|
|
57
|
+
publishedEntities.map((entity: any) => {
|
|
58
|
+
const opnames = Object.keys(entity.op || {})
|
|
59
|
+
const fields = entity.fields || []
|
|
60
|
+
// Model-driven id key: null when this entity has no id-like field.
|
|
61
|
+
const idF = entityIdField(entity)
|
|
62
|
+
// Sanitise the local variable name — a camelCased Swift keyword gets a
|
|
63
|
+
// trailing underscore (swiftVarName) so the snippet compiles.
|
|
64
|
+
const eVar = swiftVarName(entity.name)
|
|
65
|
+
const accessor = entity.Name
|
|
66
|
+
|
|
67
|
+
Content(`
|
|
68
|
+
### ${entity.Name}
|
|
69
|
+
|
|
70
|
+
`)
|
|
71
|
+
|
|
72
|
+
if (entity.short) {
|
|
73
|
+
Content(`${entity.short}
|
|
74
|
+
|
|
75
|
+
`)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
Content(`Create an instance: \`let ${eVar} = client.${accessor}()\`
|
|
79
|
+
|
|
80
|
+
`)
|
|
81
|
+
|
|
82
|
+
if (opnames.length > 0) {
|
|
83
|
+
Content(`#### Operations
|
|
84
|
+
|
|
85
|
+
| Method | Description |
|
|
86
|
+
| --- | --- |
|
|
87
|
+
`)
|
|
88
|
+
opnames.map((opname: string) => {
|
|
89
|
+
const info = OP_DESC[opname]
|
|
90
|
+
if (info) {
|
|
91
|
+
Content(`| \`${info.method}\` | ${info.desc} |
|
|
92
|
+
`)
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
Content(`
|
|
97
|
+
`)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (fields.length > 0) {
|
|
101
|
+
Content(`#### Fields
|
|
102
|
+
|
|
103
|
+
| Field | Type | Description |
|
|
104
|
+
| --- | --- | --- |
|
|
105
|
+
`)
|
|
106
|
+
|
|
107
|
+
each(fields, (field: any) => {
|
|
108
|
+
const desc = field.short || ''
|
|
109
|
+
Content(`| \`${field.name}\` | \`${canonToType(field.type, target.name)}\` | ${desc} |
|
|
110
|
+
`)
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
Content(`
|
|
114
|
+
`)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (opnames.includes('load')) {
|
|
118
|
+
// The id key plus every REQUIRED match key (parent path params like
|
|
119
|
+
// page_id) — the same shape the runtime resolves path params from, so
|
|
120
|
+
// the example always works.
|
|
121
|
+
const loadItems = opRequestShape(entity, 'load').items
|
|
122
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
123
|
+
.sort((a: any, b: any) =>
|
|
124
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
125
|
+
const loadArg = 0 < loadItems.length
|
|
126
|
+
? `VMap([${loadItems.map((it: any) =>
|
|
127
|
+
`("${it.name}", ${swiftLit(it.type,
|
|
128
|
+
it.name === idF ? entity.name + '_id' : it.name)})`).join(', ')}])`
|
|
129
|
+
: 'nil'
|
|
130
|
+
Content(`#### Example: Load
|
|
131
|
+
|
|
132
|
+
\`\`\`swift
|
|
133
|
+
let ${eVar} = try client.${accessor}().load(${loadArg}, nil)
|
|
134
|
+
\`\`\`
|
|
135
|
+
|
|
136
|
+
`)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (opnames.includes('list')) {
|
|
140
|
+
Content(`#### Example: List
|
|
141
|
+
|
|
142
|
+
\`\`\`swift
|
|
143
|
+
let ${eVar}List = try client.${accessor}().list(nil, nil)
|
|
144
|
+
\`\`\`
|
|
145
|
+
|
|
146
|
+
`)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (opnames.includes('create')) {
|
|
150
|
+
// Members come from the SAME shape the runtime validates
|
|
151
|
+
// (opRequestShape): every required member must appear — including a
|
|
152
|
+
// required id and parent keys like page_id — with a real literal.
|
|
153
|
+
const createItems = opRequestShape(entity, 'create').items
|
|
154
|
+
.filter((it: any) => !it.optional)
|
|
155
|
+
Content(`#### Example: Create
|
|
156
|
+
|
|
157
|
+
\`\`\`swift
|
|
158
|
+
let ${eVar} = try client.${accessor}().create(VMap([
|
|
159
|
+
`)
|
|
160
|
+
createItems.map((it: any, i: number) => {
|
|
161
|
+
const comma = i < createItems.length - 1 ? ',' : ''
|
|
162
|
+
Content(` ("${it.name}", ${swiftLit(it.type, 'example_' + it.name)})${comma} // ${canonToType(it.type, target.name)}
|
|
163
|
+
`)
|
|
164
|
+
})
|
|
165
|
+
Content(`]), nil)
|
|
166
|
+
\`\`\`
|
|
167
|
+
|
|
168
|
+
`)
|
|
169
|
+
}
|
|
170
|
+
})
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
export {
|
|
175
|
+
ReadmeEntity
|
|
176
|
+
}
|