@voxgig/sdkgen 1.3.13 → 1.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/voxgig-sdkgen +1 -1
- package/dist/action/action.js.map +1 -1
- package/dist/action/feature.js.map +1 -1
- package/dist/action/target.js.map +1 -1
- package/dist/cmp/AgentGuide.js.map +1 -1
- package/dist/cmp/AgentGuideContent.js.map +1 -1
- package/dist/cmp/AgentGuideFeature.js.map +1 -1
- package/dist/cmp/AgentGuideTop.js.map +1 -1
- package/dist/cmp/Changelog.js.map +1 -1
- package/dist/cmp/Deploy.js.map +1 -1
- package/dist/cmp/Entity.js.map +1 -1
- package/dist/cmp/Feature.js.map +1 -1
- package/dist/cmp/FeatureHook.js.map +1 -1
- package/dist/cmp/License.js.map +1 -1
- package/dist/cmp/Main.js.map +1 -1
- package/dist/cmp/Readme.js.map +1 -1
- package/dist/cmp/ReadmeEntity.js.map +1 -1
- package/dist/cmp/ReadmeErrors.js +1 -1
- package/dist/cmp/ReadmeErrors.js.map +1 -1
- package/dist/cmp/ReadmeExplanation.js +2 -2
- package/dist/cmp/ReadmeExplanation.js.map +1 -1
- package/dist/cmp/ReadmeHowto.js.map +1 -1
- package/dist/cmp/ReadmeInstall.js.map +1 -1
- package/dist/cmp/ReadmeIntro.js.map +1 -1
- package/dist/cmp/ReadmeModel.js.map +1 -1
- package/dist/cmp/ReadmeOptions.js.map +1 -1
- package/dist/cmp/ReadmeQuick.js.map +1 -1
- package/dist/cmp/ReadmeRef.js.map +1 -1
- package/dist/cmp/ReadmeTop.js +1 -1
- package/dist/cmp/ReadmeTop.js.map +1 -1
- package/dist/cmp/Security.js.map +1 -1
- package/dist/cmp/Test.js.map +1 -1
- package/dist/helpers/buildIdNames.js.map +1 -1
- package/dist/helpers/canonType.d.ts +3 -2
- package/dist/helpers/canonType.js +107 -24
- package/dist/helpers/canonType.js.map +1 -1
- package/dist/helpers/collectDeps.js.map +1 -1
- package/dist/helpers/getMatchEntries.js.map +1 -1
- package/dist/helpers/naming.d.ts +5 -1
- package/dist/helpers/naming.js +37 -0
- package/dist/helpers/naming.js.map +1 -1
- package/dist/helpers/opExample.d.ts +1 -1
- package/dist/helpers/opExample.js +37 -20
- package/dist/helpers/opExample.js.map +1 -1
- package/dist/helpers/opShape.d.ts +3 -1
- package/dist/helpers/opShape.js +91 -3
- package/dist/helpers/opShape.js.map +1 -1
- package/dist/helpers/packageMeta.js.map +1 -1
- package/dist/sdkgen.d.ts +3 -3
- package/dist/sdkgen.js +11 -1
- package/dist/sdkgen.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utility.js.map +1 -1
- package/package.json +7 -6
- package/project/.sdk/model/target/haskell.aontu +6 -3
- package/project/.sdk/model/target/zig.aontu +12 -2
- package/project/.sdk/src/cmp/c/Config_c.ts +16 -4
- package/project/.sdk/src/cmp/c/EntityTypes_c.ts +168 -0
- package/project/.sdk/src/cmp/c/Main_c.ts +4 -0
- package/project/.sdk/src/cmp/c/ReadmeEntity_c.ts +192 -0
- package/project/.sdk/src/cmp/c/ReadmeExamplesTest_c.ts +152 -0
- package/project/.sdk/src/cmp/c/ReadmeExplanation_c.ts +55 -0
- package/project/.sdk/src/cmp/c/ReadmeHowto_c.ts +168 -0
- package/project/.sdk/src/cmp/c/ReadmeInstall_c.ts +52 -0
- package/project/.sdk/src/cmp/c/ReadmeIntro_c.ts +67 -0
- package/project/.sdk/src/cmp/c/ReadmeModel_c.ts +151 -0
- package/project/.sdk/src/cmp/c/ReadmeOptions_c.ts +65 -0
- package/project/.sdk/src/cmp/c/ReadmeQuick_c.ts +225 -0
- package/project/.sdk/src/cmp/c/ReadmeRef_c.ts +398 -0
- package/project/.sdk/src/cmp/c/ReadmeTopHowto_c.ts +24 -0
- package/project/.sdk/src/cmp/c/ReadmeTopQuick_c.ts +104 -0
- package/project/.sdk/src/cmp/c/ReadmeTopTest_c.ts +86 -0
- package/project/.sdk/src/cmp/c/TestEntity_c.ts +10 -0
- package/project/.sdk/src/cmp/c/Test_c.ts +4 -0
- package/project/.sdk/src/cmp/c/utility_c.ts +8 -2
- package/project/.sdk/src/cmp/clojure/ReadmeEntity_clojure.ts +182 -0
- package/project/.sdk/src/cmp/clojure/ReadmeExamplesTest_clojure.ts +54 -0
- package/project/.sdk/src/cmp/clojure/ReadmeExplanation_clojure.ts +44 -0
- package/project/.sdk/src/cmp/clojure/ReadmeHowto_clojure.ts +144 -0
- package/project/.sdk/src/cmp/clojure/ReadmeInstall_clojure.ts +51 -0
- package/project/.sdk/src/cmp/clojure/ReadmeIntro_clojure.ts +66 -0
- package/project/.sdk/src/cmp/clojure/ReadmeModel_clojure.ts +156 -0
- package/project/.sdk/src/cmp/clojure/ReadmeOptions_clojure.ts +61 -0
- package/project/.sdk/src/cmp/clojure/ReadmeQuick_clojure.ts +210 -0
- package/project/.sdk/src/cmp/clojure/ReadmeRef_clojure.ts +409 -0
- package/project/.sdk/src/cmp/clojure/ReadmeTopHowto_clojure.ts +24 -0
- package/project/.sdk/src/cmp/clojure/ReadmeTopQuick_clojure.ts +98 -0
- package/project/.sdk/src/cmp/clojure/ReadmeTopTest_clojure.ts +78 -0
- package/project/.sdk/src/cmp/clojure/TestDirect_clojure.ts +58 -0
- package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +79 -0
- package/project/.sdk/src/cmp/clojure/Test_clojure.ts +21 -65
- package/project/.sdk/src/cmp/cpp/EntityTypes_cpp.ts +174 -0
- package/project/.sdk/src/cmp/cpp/Main_cpp.ts +5 -0
- package/project/.sdk/src/cmp/cpp/ReadmeEntity_cpp.ts +170 -0
- package/project/.sdk/src/cmp/cpp/ReadmeExplanation_cpp.ts +45 -0
- package/project/.sdk/src/cmp/cpp/ReadmeHowto_cpp.ts +139 -0
- package/project/.sdk/src/cmp/cpp/ReadmeInstall_cpp.ts +42 -0
- package/project/.sdk/src/cmp/cpp/ReadmeIntro_cpp.ts +69 -0
- package/project/.sdk/src/cmp/cpp/ReadmeModel_cpp.ts +155 -0
- package/project/.sdk/src/cmp/cpp/ReadmeOptions_cpp.ts +62 -0
- package/project/.sdk/src/cmp/cpp/ReadmeQuick_cpp.ts +234 -0
- package/project/.sdk/src/cmp/cpp/ReadmeRef_cpp.ts +387 -0
- package/project/.sdk/src/cmp/cpp/ReadmeTopHowto_cpp.ts +24 -0
- package/project/.sdk/src/cmp/cpp/ReadmeTopQuick_cpp.ts +95 -0
- package/project/.sdk/src/cmp/cpp/ReadmeTopTest_cpp.ts +70 -0
- package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +5 -1
- package/project/.sdk/src/cmp/csharp/EntityTypes_csharp.ts +196 -0
- package/project/.sdk/src/cmp/csharp/Main_csharp.ts +6 -0
- package/project/.sdk/src/cmp/csharp/ReadmeEntity_csharp.ts +174 -0
- package/project/.sdk/src/cmp/csharp/ReadmeExamplesTest_csharp.ts +198 -0
- package/project/.sdk/src/cmp/csharp/ReadmeExplanation_csharp.ts +42 -0
- package/project/.sdk/src/cmp/csharp/ReadmeHowto_csharp.ts +168 -0
- package/project/.sdk/src/cmp/csharp/ReadmeInstall_csharp.ts +41 -0
- package/project/.sdk/src/cmp/csharp/ReadmeIntro_csharp.ts +65 -0
- package/project/.sdk/src/cmp/csharp/ReadmeModel_csharp.ts +148 -0
- package/project/.sdk/src/cmp/csharp/ReadmeOptions_csharp.ts +60 -0
- package/project/.sdk/src/cmp/csharp/ReadmeQuick_csharp.ts +219 -0
- package/project/.sdk/src/cmp/csharp/ReadmeRef_csharp.ts +390 -0
- package/project/.sdk/src/cmp/csharp/ReadmeTopHowto_csharp.ts +25 -0
- package/project/.sdk/src/cmp/csharp/ReadmeTopQuick_csharp.ts +92 -0
- package/project/.sdk/src/cmp/csharp/ReadmeTopTest_csharp.ts +77 -0
- package/project/.sdk/src/cmp/csharp/Test_csharp.ts +4 -0
- package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +43 -29
- package/project/.sdk/src/cmp/dart/Entity_dart.ts +8 -0
- package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +166 -0
- package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +238 -0
- package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +53 -0
- package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +151 -0
- package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +59 -0
- package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +65 -0
- package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +151 -0
- package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +63 -0
- package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +214 -0
- package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +381 -0
- package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +24 -0
- package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +95 -0
- package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +78 -0
- package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +52 -0
- package/project/.sdk/src/cmp/dart/Test_dart.ts +6 -0
- package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +1 -3
- package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +1 -40
- package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +3 -3
- package/project/.sdk/src/cmp/elixir/EntityTypes_elixir.ts +165 -0
- package/project/.sdk/src/cmp/elixir/Main_elixir.ts +4 -0
- package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
- package/project/.sdk/src/cmp/elixir/ReadmeEntity_elixir.ts +163 -0
- package/project/.sdk/src/cmp/elixir/ReadmeExamplesTest_elixir.ts +126 -0
- package/project/.sdk/src/cmp/elixir/ReadmeExplanation_elixir.ts +55 -0
- package/project/.sdk/src/cmp/elixir/ReadmeHowto_elixir.ts +149 -0
- package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +67 -0
- package/project/.sdk/src/cmp/elixir/ReadmeIntro_elixir.ts +66 -0
- package/project/.sdk/src/cmp/elixir/ReadmeModel_elixir.ts +150 -0
- package/project/.sdk/src/cmp/elixir/ReadmeOptions_elixir.ts +62 -0
- package/project/.sdk/src/cmp/elixir/ReadmeQuick_elixir.ts +198 -0
- package/project/.sdk/src/cmp/elixir/ReadmeRef_elixir.ts +333 -0
- package/project/.sdk/src/cmp/elixir/ReadmeTopHowto_elixir.ts +26 -0
- package/project/.sdk/src/cmp/elixir/ReadmeTopQuick_elixir.ts +79 -0
- package/project/.sdk/src/cmp/elixir/ReadmeTopTest_elixir.ts +68 -0
- package/project/.sdk/src/cmp/elixir/Test_elixir.ts +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +4 -0
- package/project/.sdk/src/cmp/elixir/utility_elixir.ts +32 -0
- package/project/.sdk/src/cmp/go/EntityTypes_go.ts +12 -3
- package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +6 -1
- package/project/.sdk/src/cmp/go/TestEntity_go.ts +10 -3
- package/project/.sdk/src/cmp/go/utility_go.ts +3 -2
- package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +240 -43
- package/project/.sdk/src/cmp/go-cli/fragment/main.fragment.go +27 -5
- package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +191 -30
- package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +181 -0
- package/project/.sdk/src/cmp/haskell/ReadmeExamplesTest_haskell.ts +125 -0
- package/project/.sdk/src/cmp/haskell/ReadmeExplanation_haskell.ts +48 -0
- package/project/.sdk/src/cmp/haskell/ReadmeHowto_haskell.ts +168 -0
- package/project/.sdk/src/cmp/haskell/ReadmeInstall_haskell.ts +51 -0
- package/project/.sdk/src/cmp/haskell/ReadmeIntro_haskell.ts +67 -0
- package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +160 -0
- package/project/.sdk/src/cmp/haskell/ReadmeOptions_haskell.ts +74 -0
- package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +237 -0
- package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +405 -0
- package/project/.sdk/src/cmp/haskell/ReadmeTopHowto_haskell.ts +31 -0
- package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +104 -0
- package/project/.sdk/src/cmp/haskell/ReadmeTopTest_haskell.ts +80 -0
- package/project/.sdk/src/cmp/haskell/Test_haskell.ts +27 -2
- package/project/.sdk/src/cmp/java/EntityTypes_java.ts +207 -0
- package/project/.sdk/src/cmp/java/Main_java.ts +6 -0
- package/project/.sdk/src/cmp/java/ReadmeEntity_java.ts +175 -0
- package/project/.sdk/src/cmp/java/ReadmeExamplesTest_java.ts +186 -0
- package/project/.sdk/src/cmp/java/ReadmeExplanation_java.ts +46 -0
- package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +156 -0
- package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +52 -0
- package/project/.sdk/src/cmp/java/ReadmeIntro_java.ts +66 -0
- package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +150 -0
- package/project/.sdk/src/cmp/java/ReadmeOptions_java.ts +61 -0
- package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +230 -0
- package/project/.sdk/src/cmp/java/ReadmeRef_java.ts +388 -0
- package/project/.sdk/src/cmp/java/ReadmeTopHowto_java.ts +23 -0
- package/project/.sdk/src/cmp/java/ReadmeTopQuick_java.ts +103 -0
- package/project/.sdk/src/cmp/java/ReadmeTopTest_java.ts +77 -0
- package/project/.sdk/src/cmp/java/Test_java.ts +4 -0
- package/project/.sdk/src/cmp/js/EntityTypes_js.ts +25 -8
- package/project/.sdk/src/cmp/js/MainEntity_js.ts +4 -2
- package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +4 -4
- package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +13 -4
- package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +4 -4
- package/project/.sdk/src/cmp/js/ReadmeRef_js.ts +5 -5
- package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +4 -4
- package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +4 -4
- package/project/.sdk/src/cmp/js/TestDirect_js.ts +6 -5
- package/project/.sdk/src/cmp/js/TestEntity_js.ts +7 -2
- package/project/.sdk/src/cmp/js/fragment/Entity.test.fragment.js +0 -31
- package/project/.sdk/src/cmp/kotlin/EntityTypes_kotlin.ts +201 -0
- package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +6 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeEntity_kotlin.ts +175 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeExamplesTest_kotlin.ts +173 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeExplanation_kotlin.ts +47 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +154 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +50 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeIntro_kotlin.ts +66 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +150 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeOptions_kotlin.ts +61 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +230 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeRef_kotlin.ts +387 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeTopHowto_kotlin.ts +23 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeTopQuick_kotlin.ts +104 -0
- package/project/.sdk/src/cmp/kotlin/ReadmeTopTest_kotlin.ts +77 -0
- package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +4 -0
- package/project/.sdk/src/cmp/lua/Config_lua.ts +1 -1
- package/project/.sdk/src/cmp/lua/EntityTypes_lua.ts +19 -5
- package/project/.sdk/src/cmp/lua/Main_lua.ts +14 -2
- package/project/.sdk/src/cmp/lua/ReadmeEntity_lua.ts +2 -2
- package/project/.sdk/src/cmp/lua/ReadmeHowto_lua.ts +6 -1
- package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +3 -3
- package/project/.sdk/src/cmp/lua/ReadmeRef_lua.ts +2 -2
- package/project/.sdk/src/cmp/lua/ReadmeTopQuick_lua.ts +2 -2
- package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +7 -2
- package/project/.sdk/src/cmp/lua/Test_lua.ts +1 -1
- package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +2 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +180 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeExamplesTest_ocaml.ts +111 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeExplanation_ocaml.ts +46 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +147 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeInstall_ocaml.ts +44 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeIntro_ocaml.ts +68 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +155 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeOptions_ocaml.ts +59 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +205 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +402 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeTopHowto_ocaml.ts +25 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +86 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +79 -0
- package/project/.sdk/src/cmp/ocaml/Test_ocaml.ts +4 -0
- package/project/.sdk/src/cmp/perl/ReadmeEntity_perl.ts +181 -0
- package/project/.sdk/src/cmp/perl/ReadmeExamplesTest_perl.ts +354 -0
- package/project/.sdk/src/cmp/perl/ReadmeExplanation_perl.ts +43 -0
- package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +149 -0
- package/project/.sdk/src/cmp/perl/ReadmeInstall_perl.ts +47 -0
- package/project/.sdk/src/cmp/perl/ReadmeIntro_perl.ts +66 -0
- package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +150 -0
- package/project/.sdk/src/cmp/perl/ReadmeOptions_perl.ts +59 -0
- package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +216 -0
- package/project/.sdk/src/cmp/perl/ReadmeRef_perl.ts +399 -0
- package/project/.sdk/src/cmp/perl/ReadmeTopHowto_perl.ts +24 -0
- package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +91 -0
- package/project/.sdk/src/cmp/perl/ReadmeTopTest_perl.ts +83 -0
- package/project/.sdk/src/cmp/perl/Test_perl.ts +4 -0
- package/project/.sdk/src/cmp/php/EntityTypes_php.ts +23 -6
- package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +6 -1
- package/project/.sdk/src/cmp/php/TestEntity_php.ts +7 -2
- package/project/.sdk/src/cmp/py/EntityTypes_py.ts +32 -7
- package/project/.sdk/src/cmp/py/Entity_py.ts +2 -10
- package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +2 -2
- package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +8 -3
- package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +3 -3
- package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +2 -2
- package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +2 -2
- package/project/.sdk/src/cmp/py/ReadmeTopTest_py.ts +2 -2
- package/project/.sdk/src/cmp/py/TestEntity_py.ts +7 -2
- package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +19 -5
- package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +8 -3
- package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +3 -3
- package/project/.sdk/src/cmp/rb/ReadmeRef_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/ReadmeTopTest_rb.ts +2 -2
- package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +7 -2
- package/project/.sdk/src/cmp/rust/EntityBase_rust.ts +4 -0
- package/project/.sdk/src/cmp/rust/EntityTypes_rust.ts +152 -0
- package/project/.sdk/src/cmp/rust/Entity_rust.ts +1 -1
- package/project/.sdk/src/cmp/rust/Main_rust.ts +5 -0
- package/project/.sdk/src/cmp/rust/ReadmeEntity_rust.ts +163 -0
- package/project/.sdk/src/cmp/rust/ReadmeExamplesTest_rust.ts +132 -0
- package/project/.sdk/src/cmp/rust/ReadmeExplanation_rust.ts +44 -0
- package/project/.sdk/src/cmp/rust/ReadmeHowto_rust.ts +142 -0
- package/project/.sdk/src/cmp/rust/ReadmeInstall_rust.ts +49 -0
- package/project/.sdk/src/cmp/rust/ReadmeIntro_rust.ts +66 -0
- package/project/.sdk/src/cmp/rust/ReadmeModel_rust.ts +153 -0
- package/project/.sdk/src/cmp/rust/ReadmeOptions_rust.ts +60 -0
- package/project/.sdk/src/cmp/rust/ReadmeQuick_rust.ts +212 -0
- package/project/.sdk/src/cmp/rust/ReadmeRef_rust.ts +384 -0
- package/project/.sdk/src/cmp/rust/ReadmeTopHowto_rust.ts +24 -0
- package/project/.sdk/src/cmp/rust/ReadmeTopQuick_rust.ts +95 -0
- package/project/.sdk/src/cmp/rust/ReadmeTopTest_rust.ts +81 -0
- package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +10 -0
- package/project/.sdk/src/cmp/rust/Test_rust.ts +4 -0
- package/project/.sdk/src/cmp/scala/EntityTypes_scala.ts +202 -0
- package/project/.sdk/src/cmp/scala/Main_scala.ts +6 -0
- package/project/.sdk/src/cmp/scala/ReadmeEntity_scala.ts +175 -0
- package/project/.sdk/src/cmp/scala/ReadmeExamplesTest_scala.ts +163 -0
- package/project/.sdk/src/cmp/scala/ReadmeExplanation_scala.ts +49 -0
- package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +155 -0
- package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +58 -0
- package/project/.sdk/src/cmp/scala/ReadmeIntro_scala.ts +66 -0
- package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +150 -0
- package/project/.sdk/src/cmp/scala/ReadmeOptions_scala.ts +61 -0
- package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +230 -0
- package/project/.sdk/src/cmp/scala/ReadmeRef_scala.ts +388 -0
- package/project/.sdk/src/cmp/scala/ReadmeTopHowto_scala.ts +23 -0
- package/project/.sdk/src/cmp/scala/ReadmeTopQuick_scala.ts +104 -0
- package/project/.sdk/src/cmp/scala/ReadmeTopTest_scala.ts +77 -0
- package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +38 -10
- package/project/.sdk/src/cmp/scala/Test_scala.ts +8 -0
- package/project/.sdk/src/cmp/swift/EntityTypes_swift.ts +152 -0
- package/project/.sdk/src/cmp/swift/Main_swift.ts +5 -0
- package/project/.sdk/src/cmp/swift/ReadmeEntity_swift.ts +176 -0
- package/project/.sdk/src/cmp/swift/ReadmeExamplesTest_swift.ts +170 -0
- package/project/.sdk/src/cmp/swift/ReadmeExplanation_swift.ts +49 -0
- package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +159 -0
- package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +58 -0
- package/project/.sdk/src/cmp/swift/ReadmeIntro_swift.ts +64 -0
- package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +149 -0
- package/project/.sdk/src/cmp/swift/ReadmeOptions_swift.ts +62 -0
- package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +232 -0
- package/project/.sdk/src/cmp/swift/ReadmeRef_swift.ts +387 -0
- package/project/.sdk/src/cmp/swift/ReadmeTopHowto_swift.ts +24 -0
- package/project/.sdk/src/cmp/swift/ReadmeTopQuick_swift.ts +105 -0
- package/project/.sdk/src/cmp/swift/ReadmeTopTest_swift.ts +77 -0
- package/project/.sdk/src/cmp/swift/Test_swift.ts +4 -0
- package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +19 -5
- package/project/.sdk/src/cmp/ts/MainEntity_ts.ts +4 -2
- package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +4 -4
- package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +14 -4
- package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +29 -11
- package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +5 -5
- package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +4 -4
- package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +4 -4
- package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +13 -11
- package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +18 -2
- package/project/.sdk/src/cmp/zig/Config_zig.ts +22 -4
- package/project/.sdk/src/cmp/zig/Entity_zig.ts +1 -1
- package/project/.sdk/src/cmp/zig/Main_zig.ts +10 -4
- package/project/.sdk/src/cmp/zig/Package_zig.ts +53 -0
- package/project/.sdk/src/cmp/zig/ReadmeEntity_zig.ts +188 -0
- package/project/.sdk/src/cmp/zig/ReadmeExamplesTest_zig.ts +58 -0
- package/project/.sdk/src/cmp/zig/ReadmeExplanation_zig.ts +45 -0
- package/project/.sdk/src/cmp/zig/ReadmeHowto_zig.ts +143 -0
- package/project/.sdk/src/cmp/zig/ReadmeInstall_zig.ts +54 -0
- package/project/.sdk/src/cmp/zig/ReadmeIntro_zig.ts +66 -0
- package/project/.sdk/src/cmp/zig/ReadmeModel_zig.ts +152 -0
- package/project/.sdk/src/cmp/zig/ReadmeOptions_zig.ts +60 -0
- package/project/.sdk/src/cmp/zig/ReadmeQuick_zig.ts +211 -0
- package/project/.sdk/src/cmp/zig/ReadmeRef_zig.ts +400 -0
- package/project/.sdk/src/cmp/zig/ReadmeTopHowto_zig.ts +24 -0
- package/project/.sdk/src/cmp/zig/ReadmeTopQuick_zig.ts +96 -0
- package/project/.sdk/src/cmp/zig/ReadmeTopTest_zig.ts +82 -0
- package/project/.sdk/src/cmp/zig/TestDirect_zig.ts +66 -0
- package/project/.sdk/src/cmp/zig/TestEntity_zig.ts +79 -0
- package/project/.sdk/src/cmp/zig/Test_zig.ts +17 -61
- package/project/.sdk/tm/clojure/src/voxgig/struct.clj +1 -1
- package/project/.sdk/tm/cpp/test/feature_test.cpp +19 -0
- package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +4 -1
- package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +7 -1
- package/project/.sdk/tm/elixir/lib/utility/struct/voxgig_struct.ex +1 -1
- package/project/.sdk/tm/elixir/test/primary_utility_test.exs +7 -1
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +3 -1
- package/project/.sdk/tm/haskell/test/Harness.hs +8 -3
- package/project/.sdk/tm/js/Makefile +1 -1
- package/project/.sdk/tm/js/jsconfig.json +12 -0
- package/project/.sdk/tm/ocaml/Makefile +5 -1
- package/project/.sdk/tm/php/utility/struct/Struct.php +1 -1
- package/project/.sdk/tm/py/utility/voxgig_struct/voxgig_struct.py +1 -1
- package/project/.sdk/tm/rb/utility/struct/voxgig_struct.rb +1 -1
- package/project/.sdk/tm/scala/sdktest/SdkTestMain.scala +8 -59
- package/project/.sdk/tm/ts/Makefile +1 -1
- package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +1 -1
- package/src/cmp/ReadmeErrors.ts +2 -2
- package/src/cmp/ReadmeExplanation.ts +3 -3
- package/src/cmp/ReadmeTop.ts +2 -2
- package/src/helpers/canonType.ts +116 -25
- package/src/helpers/naming.ts +47 -0
- package/src/helpers/opExample.ts +43 -20
- package/src/helpers/opShape.ts +102 -3
- package/src/sdkgen.ts +12 -2
- package/src/tsconfig.json +2 -0
- package/project/.sdk/tm/zig/build.zig.zon +0 -11
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, isAuthActive, envName, canonKey, entityIdField, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
nom,
|
|
8
|
+
} from '@voxgig/apidef'
|
|
9
|
+
|
|
10
|
+
import { cIdent, cVarName } from './utility_c'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
// A type-correct C expression constructing a voxgig struct Value for a param.
|
|
14
|
+
// Strings render the quoted placeholder; numeric/boolean/array/object render a
|
|
15
|
+
// typed builder call.
|
|
16
|
+
function cLit(type: any, placeholder: string = 'example'): string {
|
|
17
|
+
const k = canonKey(type)
|
|
18
|
+
if ('INTEGER' === k || 'NUMBER' === k) return 'v_num(1)'
|
|
19
|
+
if ('BOOLEAN' === k) return 'v_bool(true)'
|
|
20
|
+
if ('ARRAY' === k) return 'v_list()'
|
|
21
|
+
if ('OBJECT' === k) return 'v_map()'
|
|
22
|
+
return `v_str("${placeholder}")`
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
// cmap(...) for a set of `"key", <lit>` pairs, or NULL when empty (ops accept
|
|
27
|
+
// a NULL match/data argument).
|
|
28
|
+
function cmapExpr(pairs: string[]): string {
|
|
29
|
+
return pairs.length ? `cmap(${pairs.length}, ${pairs.join(', ')})` : 'NULL'
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
const ReadmeTopQuick = cmp(function ReadmeTopQuick(props: any) {
|
|
34
|
+
const { target, ctx$: { model } } = props
|
|
35
|
+
|
|
36
|
+
const ident = cIdent(model)
|
|
37
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
38
|
+
|
|
39
|
+
const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
|
|
40
|
+
|
|
41
|
+
const authActive = isAuthActive(model)
|
|
42
|
+
const ctor = authActive
|
|
43
|
+
? `${ident}_sdk_new(cmap(1,\n "apikey", v_str(getenv("${envName(model)}_APIKEY"))))`
|
|
44
|
+
: `${ident}_sdk_new(NULL)`
|
|
45
|
+
|
|
46
|
+
Content(`\`\`\`c
|
|
47
|
+
#include "core/api.h"
|
|
48
|
+
|
|
49
|
+
${model.const.Name}SDK* client = ${ctor};
|
|
50
|
+
PNError* err = NULL;
|
|
51
|
+
|
|
52
|
+
`)
|
|
53
|
+
|
|
54
|
+
if (exampleEntity) {
|
|
55
|
+
const eName = nom(exampleEntity, 'Name')
|
|
56
|
+
const evar = cVarName(exampleEntity.name)
|
|
57
|
+
const acc = `${ident}_${evar}`
|
|
58
|
+
const opnames = Object.keys(exampleEntity.op || {})
|
|
59
|
+
// Model-driven id key: null when the entity has no id-like field, in which
|
|
60
|
+
// case the load example takes no match argument.
|
|
61
|
+
const idF = entityIdField(exampleEntity)
|
|
62
|
+
|
|
63
|
+
if (opnames.includes('list')) {
|
|
64
|
+
Content(`Entity* ${evar} = ${acc}(client, NULL);
|
|
65
|
+
|
|
66
|
+
// List all ${eName.toLowerCase()}s (returns a List, sets *err on failure)
|
|
67
|
+
voxgig_value* ${evar}s = ${evar}->vt->list(${evar}, NULL, NULL, &err);
|
|
68
|
+
for (size_t i = 0; i < (size_t)voxgig_size(${evar}s); i++) {
|
|
69
|
+
printf("%s\\n", voxgig_to_json(voxgig_getelem(${evar}s, v_int(i), NULL)));
|
|
70
|
+
}
|
|
71
|
+
`)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (opnames.includes('load')) {
|
|
75
|
+
// Every REQUIRED load-match key (id first, then parent path params like
|
|
76
|
+
// page_id) — the same shape the runtime resolves path params from, so
|
|
77
|
+
// the example always works.
|
|
78
|
+
const loadItems = opRequestShape(exampleEntity, 'load').items
|
|
79
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
80
|
+
.sort((a: any, b: any) =>
|
|
81
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
82
|
+
const loadArg = cmapExpr(loadItems.map((it: any) =>
|
|
83
|
+
`"${it.name}", ${cLit(it.type,
|
|
84
|
+
it.name === idF ? 'example_id' : 'example_' + it.name)}`))
|
|
85
|
+
const acquire = opnames.includes('list')
|
|
86
|
+
? ''
|
|
87
|
+
: `Entity* ${evar} = ${acc}(client, NULL);\n`
|
|
88
|
+
Content(`
|
|
89
|
+
${acquire}// Load a specific ${eName.toLowerCase()} (returns the record, sets *err on failure)
|
|
90
|
+
voxgig_value* ${evar}_rec = ${evar}->vt->load(${evar}, ${loadArg}, NULL, &err);
|
|
91
|
+
printf("%s\\n", voxgig_to_json(${evar}_rec));
|
|
92
|
+
`)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
Content(`\`\`\`
|
|
97
|
+
`)
|
|
98
|
+
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
export {
|
|
103
|
+
ReadmeTopQuick
|
|
104
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, canonKey, entityIdField, pickExampleEntity, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
nom,
|
|
8
|
+
} from '@voxgig/apidef'
|
|
9
|
+
|
|
10
|
+
import { cIdent, cVarName } from './utility_c'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
// A type-correct C expression constructing a voxgig struct Value for a field's
|
|
14
|
+
// canonical type.
|
|
15
|
+
function cLit(type: any): string {
|
|
16
|
+
const k = canonKey(type)
|
|
17
|
+
if ('INTEGER' === k || 'NUMBER' === k) return 'v_num(1)'
|
|
18
|
+
if ('BOOLEAN' === k) return 'v_bool(true)'
|
|
19
|
+
if ('ARRAY' === k) return 'v_list()'
|
|
20
|
+
if ('OBJECT' === k) return 'v_map()'
|
|
21
|
+
return 'v_str("example")'
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
// cmap(...) for a set of pairs, or NULL when empty.
|
|
26
|
+
function cmapExpr(pairs: string[]): string {
|
|
27
|
+
return pairs.length ? `cmap(${pairs.length}, ${pairs.join(', ')})` : 'NULL'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
|
|
32
|
+
const { target, ctx$: { model } } = props
|
|
33
|
+
|
|
34
|
+
const ident = cIdent(model)
|
|
35
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
36
|
+
|
|
37
|
+
// Pick an entity with a real op (prefer a read op) — never fabricate a
|
|
38
|
+
// `load` on an op-less entity.
|
|
39
|
+
const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
|
|
40
|
+
|
|
41
|
+
Content(`\`\`\`c
|
|
42
|
+
#include "core/api.h"
|
|
43
|
+
|
|
44
|
+
${model.const.Name}SDK* client = test_sdk(NULL, NULL);
|
|
45
|
+
PNError* err = NULL;
|
|
46
|
+
`)
|
|
47
|
+
|
|
48
|
+
if (exampleEntity && primaryOp) {
|
|
49
|
+
const eName = nom(exampleEntity, 'Name')
|
|
50
|
+
const evar = cVarName(exampleEntity.name)
|
|
51
|
+
const acc = `${ident}_${evar}`
|
|
52
|
+
const idF = entityIdField(exampleEntity)
|
|
53
|
+
const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
|
|
54
|
+
let arg = 'NULL'
|
|
55
|
+
if (isMatchOp) {
|
|
56
|
+
// Every REQUIRED match key (id first) — the same shape that generates
|
|
57
|
+
// the op's request match.
|
|
58
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
59
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
60
|
+
.sort((a: any, b: any) =>
|
|
61
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
62
|
+
arg = cmapExpr(items.map((it: any) =>
|
|
63
|
+
`"${it.name}", ${it.name === idF ? 'v_str("test01")' : cLit(it.type)}`))
|
|
64
|
+
} else if ('create' === primaryOp || 'update' === primaryOp) {
|
|
65
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
66
|
+
.filter((it: any) => it.name !== idF && it.name !== 'id')
|
|
67
|
+
const required = items.filter((it: any) => !it.optional)
|
|
68
|
+
const chosen = required.length ? required : items.slice(0, 3)
|
|
69
|
+
arg = cmapExpr(chosen.map((it: any) => `"${it.name}", ${cLit(it.type)}`))
|
|
70
|
+
}
|
|
71
|
+
const resVar = cVarName(exampleEntity.name) + ('list' === primaryOp ? 's' : '_rec')
|
|
72
|
+
Content(`Entity* ${evar} = ${acc}(client, NULL);
|
|
73
|
+
voxgig_value* ${resVar} = ${evar}->vt->${primaryOp}(${evar}, ${arg}, NULL, &err);
|
|
74
|
+
printf("%s\\n", voxgig_to_json(${resVar}));
|
|
75
|
+
`)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
Content(`\`\`\`
|
|
79
|
+
`)
|
|
80
|
+
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
export {
|
|
85
|
+
ReadmeTopTest
|
|
86
|
+
}
|
|
@@ -39,7 +39,14 @@ int main(void) {
|
|
|
39
39
|
Entity* e = ${ident}_${evar}(sdk, NULL);
|
|
40
40
|
CHECK(e != NULL, "entity instance");
|
|
41
41
|
CHECK_STR_EQ(e->vt->get_name(e), "${entity.name}", "entity get_name");
|
|
42
|
+
`)
|
|
42
43
|
|
|
44
|
+
// The stream test drives the list op; only emit it when the entity has a
|
|
45
|
+
// list op — a create/load-only entity has no list endpoint, so
|
|
46
|
+
// stream("list") would error.
|
|
47
|
+
const hasList = null != (entity.op && (entity.op as any).list)
|
|
48
|
+
if (hasList) {
|
|
49
|
+
Content(`
|
|
43
50
|
// stream(): runs the list op through the full pipeline and returns a List
|
|
44
51
|
// of items. Seed two entities via test mode; with the streaming feature
|
|
45
52
|
// active it yields the feature's incremental items, else it falls back to
|
|
@@ -69,7 +76,10 @@ int main(void) {
|
|
|
69
76
|
CHECK(perr == NULL, "stream fallback: no error");
|
|
70
77
|
CHECK_INT_EQ((int64_t)voxgig_as_list(pitems)->len, 2, "stream fallback: yields both items");
|
|
71
78
|
}
|
|
79
|
+
`)
|
|
80
|
+
}
|
|
72
81
|
|
|
82
|
+
Content(`
|
|
73
83
|
TEST_SUMMARY("${evar}_entity");
|
|
74
84
|
}
|
|
75
85
|
`)
|
|
@@ -13,6 +13,7 @@ import { cmp, each, Folder, File, Content } from '@voxgig/sdkgen'
|
|
|
13
13
|
|
|
14
14
|
import { TestEntity } from './TestEntity_c'
|
|
15
15
|
import { TestDirect } from './TestDirect_c'
|
|
16
|
+
import { ReadmeExamplesTest } from './ReadmeExamplesTest_c'
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
const Test = cmp(function Test(props: any) {
|
|
@@ -42,6 +43,9 @@ int main(void) {
|
|
|
42
43
|
TestEntity({ target, entity })
|
|
43
44
|
TestDirect({ target, entity })
|
|
44
45
|
})
|
|
46
|
+
|
|
47
|
+
// Validate the documented C examples in the READMEs are well-formed.
|
|
48
|
+
ReadmeExamplesTest({ target })
|
|
45
49
|
})
|
|
46
50
|
})
|
|
47
51
|
|
|
@@ -23,9 +23,15 @@ function cVarName(name: string): string {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
// The C project identifier used as a function-name prefix, e.g. solar.
|
|
26
|
+
// The C project identifier used as a function-name prefix, e.g. solar. Must
|
|
27
|
+
// match the SQUASHED `projectname` token that the umbrella header/fragment use
|
|
28
|
+
// for the constructor (`<ident>_sdk_new`): a hyphenated slug
|
|
29
|
+
// (bluefin-decryptx-p2pe) squashes to `bluefindecryptxp2pe`, so drop every
|
|
30
|
+
// non-alphanumeric char rather than mapping them to `_` (which produced
|
|
31
|
+
// `bluefin_decryptx_p2pe_sdk_new` callers that never linked against the
|
|
32
|
+
// squashed definition). No-op for single-word names.
|
|
27
33
|
function cIdent(model: any): string {
|
|
28
|
-
return String(model.name).toLowerCase().replace(/[^a-z0-
|
|
34
|
+
return String(model.name).toLowerCase().replace(/[^a-z0-9]/g, '')
|
|
29
35
|
}
|
|
30
36
|
|
|
31
37
|
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, each, Content, canonKey, entityIdField, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
} from '@voxgig/apidef'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
// A type-correct Clojure literal for a field's canonical type. The create
|
|
11
|
+
// example builds a real struct map, so array/object render as (vs/jt)/(vs/jm).
|
|
12
|
+
function cljLit(type: any, placeholder: string = 'example'): string {
|
|
13
|
+
const k = canonKey(type)
|
|
14
|
+
if ('INTEGER' === k || 'NUMBER' === k) return '1'
|
|
15
|
+
if ('BOOLEAN' === k) return 'true'
|
|
16
|
+
if ('ARRAY' === k) return '(vs/jt)'
|
|
17
|
+
if ('OBJECT' === k) return '(vs/jm)'
|
|
18
|
+
return `"${placeholder}"`
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
// A descriptive Clojure-ish type name for a field's canonical type. Clojure is
|
|
23
|
+
// dynamically typed, so these are documentation hints, not static types.
|
|
24
|
+
function cljType(type: any): string {
|
|
25
|
+
const k = canonKey(type)
|
|
26
|
+
if ('STRING' === k) return 'string'
|
|
27
|
+
if ('INTEGER' === k) return 'long'
|
|
28
|
+
if ('NUMBER' === k) return 'double'
|
|
29
|
+
if ('BOOLEAN' === k) return 'boolean'
|
|
30
|
+
if ('ARRAY' === k) return 'vector'
|
|
31
|
+
if ('OBJECT' === k) return 'map'
|
|
32
|
+
return 'any'
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
// Operation descriptions are language-agnostic; the method spelling matches
|
|
37
|
+
// the generated Clojure entity fns: (op ent arg ctrl).
|
|
38
|
+
const OP_DESC: Record<string, { method: string, desc: string }> = {
|
|
39
|
+
load: { method: '(load ent match ctrl)', desc: 'Load a single entity by match criteria.' },
|
|
40
|
+
list: { method: '(list ent match ctrl)', desc: 'List entities, optionally matching the given criteria.' },
|
|
41
|
+
create: { method: '(create ent data ctrl)', desc: 'Create a new entity with the given data.' },
|
|
42
|
+
update: { method: '(update ent data ctrl)', desc: 'Update an existing entity.' },
|
|
43
|
+
remove: { method: '(remove ent match ctrl)', desc: 'Remove the matching entity.' },
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
const ReadmeEntity = cmp(function ReadmeEntity(props: any) {
|
|
48
|
+
const { target } = props
|
|
49
|
+
const { model } = props.ctx$
|
|
50
|
+
|
|
51
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
52
|
+
|
|
53
|
+
const publishedEntities = each(entity)
|
|
54
|
+
.filter((entity: any) => entity.active !== false)
|
|
55
|
+
|
|
56
|
+
if (0 === publishedEntities.length) {
|
|
57
|
+
return
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
Content(`
|
|
61
|
+
|
|
62
|
+
## Entities
|
|
63
|
+
|
|
64
|
+
`)
|
|
65
|
+
|
|
66
|
+
publishedEntities.map((entity: any) => {
|
|
67
|
+
const opnames = Object.keys(entity.op || {})
|
|
68
|
+
const fields = entity.fields || []
|
|
69
|
+
// Model-driven id key: null when this entity has no id-like field.
|
|
70
|
+
const idF = entityIdField(entity)
|
|
71
|
+
const eLow = entity.name
|
|
72
|
+
|
|
73
|
+
Content(`
|
|
74
|
+
### ${entity.Name}
|
|
75
|
+
|
|
76
|
+
`)
|
|
77
|
+
|
|
78
|
+
if (entity.short) {
|
|
79
|
+
Content(`${entity.short}
|
|
80
|
+
|
|
81
|
+
`)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
Content(`Create an instance: \`(def ${eLow} (api/${eLow} client nil))\`
|
|
85
|
+
|
|
86
|
+
`)
|
|
87
|
+
|
|
88
|
+
if (opnames.length > 0) {
|
|
89
|
+
Content(`#### Operations
|
|
90
|
+
|
|
91
|
+
| Method | Description |
|
|
92
|
+
| --- | --- |
|
|
93
|
+
`)
|
|
94
|
+
opnames.map((opname: string) => {
|
|
95
|
+
const info = OP_DESC[opname]
|
|
96
|
+
if (info) {
|
|
97
|
+
Content(`| \`${info.method}\` | ${info.desc} |
|
|
98
|
+
`)
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
Content(`
|
|
103
|
+
`)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (fields.length > 0) {
|
|
107
|
+
Content(`#### Fields
|
|
108
|
+
|
|
109
|
+
| Field | Type | Description |
|
|
110
|
+
| --- | --- | --- |
|
|
111
|
+
`)
|
|
112
|
+
|
|
113
|
+
each(fields, (field: any) => {
|
|
114
|
+
const desc = field.short || ''
|
|
115
|
+
Content(`| \`${field.name}\` | \`${cljType(field.type)}\` | ${desc} |
|
|
116
|
+
`)
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
Content(`
|
|
120
|
+
`)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (opnames.includes('load')) {
|
|
124
|
+
// The id key plus every REQUIRED match key (parent path params like
|
|
125
|
+
// page_id) — the same shape the runtime resolves path params from.
|
|
126
|
+
const loadItems = opRequestShape(entity, 'load').items
|
|
127
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
128
|
+
.sort((a: any, b: any) =>
|
|
129
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
130
|
+
const loadArg = 0 < loadItems.length
|
|
131
|
+
? `(vs/jm ${loadItems.map((it: any) =>
|
|
132
|
+
`"${it.name}" ${cljLit(it.type,
|
|
133
|
+
it.name === idF ? entity.name + '_id' : it.name)}`).join(' ')})`
|
|
134
|
+
: 'nil'
|
|
135
|
+
Content(`#### Example: Load
|
|
136
|
+
|
|
137
|
+
\`\`\`clojure
|
|
138
|
+
(def ${eLow} (e-${eLow}/load (api/${eLow} client nil) ${loadArg} nil))
|
|
139
|
+
\`\`\`
|
|
140
|
+
|
|
141
|
+
`)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (opnames.includes('list')) {
|
|
145
|
+
Content(`#### Example: List
|
|
146
|
+
|
|
147
|
+
\`\`\`clojure
|
|
148
|
+
(def ${eLow}s (e-${eLow}/list (api/${eLow} client nil) nil nil))
|
|
149
|
+
\`\`\`
|
|
150
|
+
|
|
151
|
+
`)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (opnames.includes('create')) {
|
|
155
|
+
// Members come from the SAME shape the runtime validates
|
|
156
|
+
// (opRequestShape): every required member must appear.
|
|
157
|
+
const createItems = opRequestShape(entity, 'create').items
|
|
158
|
+
.filter((it: any) => !it.optional)
|
|
159
|
+
Content(`#### Example: Create
|
|
160
|
+
|
|
161
|
+
\`\`\`clojure
|
|
162
|
+
(def ${eLow}
|
|
163
|
+
(e-${eLow}/create (api/${eLow} client nil)
|
|
164
|
+
(vs/jm
|
|
165
|
+
`)
|
|
166
|
+
createItems.map((it: any) => {
|
|
167
|
+
Content(` "${it.name}" ${cljLit(it.type, 'example_' + it.name)} ;; ${cljType(it.type)}
|
|
168
|
+
`)
|
|
169
|
+
})
|
|
170
|
+
Content(` )
|
|
171
|
+
nil))
|
|
172
|
+
\`\`\`
|
|
173
|
+
|
|
174
|
+
`)
|
|
175
|
+
}
|
|
176
|
+
})
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
export {
|
|
181
|
+
ReadmeEntity
|
|
182
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// Emit a documentation clojure-examples SYNTAX gate INTO the shared gentest run
|
|
6
|
+
// body (the clojure test runner drives a single sdk.gentest/run). For each doc
|
|
7
|
+
// that ships clojure examples — the repository ROOT README.md, the per-language
|
|
8
|
+
// README.md, and REFERENCE.md — every ```clojure fenced block is extracted and
|
|
9
|
+
// PARSED with read-string (all forms wrapped in a vector), catching a malformed
|
|
10
|
+
// documented example (an unbalanced paren, a bad token, an unclosed string).
|
|
11
|
+
//
|
|
12
|
+
// SCOPE NOTE: like the elixir gate, this stops at the syntax check rather than
|
|
13
|
+
// EXECUTING each block. Running a README fragment against the generated
|
|
14
|
+
// namespaces would need the SDK loaded and the narrative requires resolved for
|
|
15
|
+
// every block; the syntax gate is a real, useful guard that keeps documented
|
|
16
|
+
// examples parseable as the generator evolves. A doc that is absent at test
|
|
17
|
+
// time is skipped (passes), so the gate never hard-fails on a missing file.
|
|
18
|
+
//
|
|
19
|
+
// The emitted clojure builds the triple-backtick fence from (char 96) so this
|
|
20
|
+
// TS template literal needs no embedded backticks.
|
|
21
|
+
const ReadmeExamplesTest = cmp(function ReadmeExamplesTest(_props: any) {
|
|
22
|
+
|
|
23
|
+
Content(` (letfn [(clj-blocks [text]
|
|
24
|
+
(let [fence (apply str (repeat 3 (char 96)))
|
|
25
|
+
parts (clojure.string/split text (re-pattern fence))]
|
|
26
|
+
(->> parts
|
|
27
|
+
(map-indexed vector)
|
|
28
|
+
(filter (fn [[i _]] (odd? i)))
|
|
29
|
+
(map (fn [[_ seg]] seg))
|
|
30
|
+
(filter (fn [seg]
|
|
31
|
+
(= "clojure"
|
|
32
|
+
(clojure.string/trim (first (clojure.string/split-lines seg))))))
|
|
33
|
+
(map (fn [seg]
|
|
34
|
+
(clojure.string/join "\\n"
|
|
35
|
+
(rest (clojure.string/split-lines seg))))))))]
|
|
36
|
+
(doseq [[label path] [["root-README" "../README.md"]
|
|
37
|
+
["README" "README.md"]
|
|
38
|
+
["REFERENCE" "REFERENCE.md"]]]
|
|
39
|
+
(t/run-check rec (str "gen-readme-examples-" label)
|
|
40
|
+
(fn []
|
|
41
|
+
(if-not (.exists (java.io.File. ^String path))
|
|
42
|
+
(t/is-true true (str label " absent (skipped)"))
|
|
43
|
+
(let [blocks (clj-blocks (slurp path))]
|
|
44
|
+
(doseq [b blocks]
|
|
45
|
+
(binding [*read-eval* false]
|
|
46
|
+
(read-string (str "[\\n" b "\\n]"))))
|
|
47
|
+
(t/is-true true (str label " clojure blocks parse cleanly"))))))))
|
|
48
|
+
`)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
ReadmeExamplesTest
|
|
54
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
const ReadmeExplanation = cmp(function ReadmeExplanation(props: any) {
|
|
6
|
+
const { target, ctx$: { model } } = props
|
|
7
|
+
|
|
8
|
+
Content(`### Data as struct value maps
|
|
9
|
+
|
|
10
|
+
The Clojure SDK represents API data with the vendored \`voxgig.struct\`
|
|
11
|
+
value model (ordered, Java-backed maps and lists) rather than typed
|
|
12
|
+
records. This mirrors the dynamic nature of the API and keeps the SDK
|
|
13
|
+
flexible — no code generation is needed when the API schema changes.
|
|
14
|
+
|
|
15
|
+
Build request maps with \`(vs/jm "k" v ...)\` and lists with
|
|
16
|
+
\`(vs/jt v ...)\`; read values with \`(vs/getprop m "k")\`. Use
|
|
17
|
+
\`(vs/ismap x)\` to safely check that a value is a map.
|
|
18
|
+
|
|
19
|
+
### Namespace structure
|
|
20
|
+
|
|
21
|
+
\`\`\`
|
|
22
|
+
${target.name}/
|
|
23
|
+
├── src/sdk/api.clj -- public API namespace (entity accessors)
|
|
24
|
+
├── src/sdk/client.clj -- client constructors (make-sdk, test-sdk)
|
|
25
|
+
├── src/sdk/config.clj -- generated configuration
|
|
26
|
+
├── src/sdk/core.clj -- core types, context and pipeline
|
|
27
|
+
├── src/sdk/features.clj -- feature factory
|
|
28
|
+
├── src/sdk/entity/ -- entity namespaces (one per entity)
|
|
29
|
+
├── src/voxgig/struct.clj -- vendored struct value library
|
|
30
|
+
└── test/ -- test suites
|
|
31
|
+
\`\`\`
|
|
32
|
+
|
|
33
|
+
Require \`[sdk.api :as api]\` for the public surface, and an entity
|
|
34
|
+
namespace (e.g. \`[sdk.entity.${model.const.Name.toLowerCase()} :as e-${model.const.Name.toLowerCase()}]\`)
|
|
35
|
+
only when you call its operations directly.
|
|
36
|
+
|
|
37
|
+
`)
|
|
38
|
+
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
ReadmeExplanation
|
|
44
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
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
|
+
|
|
10
|
+
// A type-correct Clojure literal for a field's canonical type.
|
|
11
|
+
function cljLit(type: any): string {
|
|
12
|
+
const k = canonKey(type)
|
|
13
|
+
if ('INTEGER' === k || 'NUMBER' === k) return '1'
|
|
14
|
+
if ('BOOLEAN' === k) return 'true'
|
|
15
|
+
if ('ARRAY' === k) return '(vs/jt)'
|
|
16
|
+
if ('OBJECT' === k) return '(vs/jm)'
|
|
17
|
+
return '"example"'
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
|
|
22
|
+
const { target, ctx$: { model } } = props
|
|
23
|
+
|
|
24
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
25
|
+
// Pick an entity with a real op (prefer a read op). primaryOp is null only
|
|
26
|
+
// when NO entity exposes any op (a direct()-only SDK).
|
|
27
|
+
const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
|
|
28
|
+
const eLow = exampleEntity ? exampleEntity.name : 'entity'
|
|
29
|
+
// Model-driven id key: null when the entity has no id-like field.
|
|
30
|
+
const idF = exampleEntity ? entityIdField(exampleEntity) : null
|
|
31
|
+
const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
|
|
32
|
+
let testArg = 'nil'
|
|
33
|
+
if (exampleEntity && isMatchOp) {
|
|
34
|
+
testArg = idF ? `(vs/jm "${idF}" "test01")` : 'nil'
|
|
35
|
+
} else if (exampleEntity && ('create' === primaryOp || 'update' === primaryOp)) {
|
|
36
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
37
|
+
.filter((it: any) => it.name !== idF && it.name !== 'id')
|
|
38
|
+
const required = items.filter((it: any) => !it.optional)
|
|
39
|
+
const chosen = required.length ? required : items.slice(0, 3)
|
|
40
|
+
testArg = `(vs/jm ${chosen.map((it: any) => `"${it.name}" ${cljLit(it.type)}`).join(' ')})`
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The op-driven test-mode line, shown only when the SDK has an entity op.
|
|
44
|
+
const testModeExample = primaryOp
|
|
45
|
+
? `;; Entity ops return the bare record and raise on error.
|
|
46
|
+
(def ${eLow} (e-${eLow}/${primaryOp} (api/${eLow} client nil) ${testArg} nil))
|
|
47
|
+
;; ${eLow} contains the mock response record
|
|
48
|
+
(println ${eLow})`
|
|
49
|
+
: `(def result (api/direct client (vs/jm "path" "/api/resource" "method" "GET")))
|
|
50
|
+
(println result)`
|
|
51
|
+
|
|
52
|
+
const testModeRequire = primaryOp
|
|
53
|
+
? `\n '[sdk.entity.${eLow} :as e-${eLow}]`
|
|
54
|
+
: ''
|
|
55
|
+
|
|
56
|
+
Content(`### Make a direct HTTP request
|
|
57
|
+
|
|
58
|
+
For endpoints not covered by entity operations:
|
|
59
|
+
|
|
60
|
+
\`\`\`clojure
|
|
61
|
+
(def result
|
|
62
|
+
(api/direct client
|
|
63
|
+
(vs/jm "path" "/api/resource/{id}"
|
|
64
|
+
"method" "GET"
|
|
65
|
+
"params" (vs/jm "id" "example"))))
|
|
66
|
+
|
|
67
|
+
(if (vs/getprop result "ok")
|
|
68
|
+
(do
|
|
69
|
+
(println (vs/getprop result "status")) ;; 200
|
|
70
|
+
(println (vs/getprop result "data"))) ;; response body
|
|
71
|
+
;; A non-2xx response carries status + data (the error body); a
|
|
72
|
+
;; transport-level failure carries err instead. Only one is present.
|
|
73
|
+
(println (vs/getprop result "status") (vs/getprop result "err")))
|
|
74
|
+
\`\`\`
|
|
75
|
+
|
|
76
|
+
### Prepare a request without sending it
|
|
77
|
+
|
|
78
|
+
\`\`\`clojure
|
|
79
|
+
;; prepare returns the fetch definition and raises on error.
|
|
80
|
+
(def fetchdef
|
|
81
|
+
(api/prepare client
|
|
82
|
+
(vs/jm "path" "/api/resource/{id}"
|
|
83
|
+
"method" "DELETE"
|
|
84
|
+
"params" (vs/jm "id" "example"))))
|
|
85
|
+
|
|
86
|
+
(println (vs/getprop fetchdef "url"))
|
|
87
|
+
(println (vs/getprop fetchdef "method"))
|
|
88
|
+
(println (vs/getprop fetchdef "headers"))
|
|
89
|
+
\`\`\`
|
|
90
|
+
|
|
91
|
+
### Use test mode
|
|
92
|
+
|
|
93
|
+
Create a mock client for unit testing — no server required:
|
|
94
|
+
|
|
95
|
+
\`\`\`clojure
|
|
96
|
+
(require '[sdk.api :as api]${testModeRequire}
|
|
97
|
+
'[voxgig.struct :as vs])
|
|
98
|
+
|
|
99
|
+
(def client (api/test-sdk nil nil))
|
|
100
|
+
|
|
101
|
+
${testModeExample}
|
|
102
|
+
\`\`\`
|
|
103
|
+
|
|
104
|
+
### Use a custom fetch function
|
|
105
|
+
|
|
106
|
+
Replace the HTTP transport with your own function. A fetch fn takes the
|
|
107
|
+
URL and fetch definition and returns a \`[response err]\` pair; \`response\`
|
|
108
|
+
is a struct map carrying \`status\`, \`headers\`, and a \`json\` thunk:
|
|
109
|
+
|
|
110
|
+
\`\`\`clojure
|
|
111
|
+
(defn mock-fetch [url fetchdef]
|
|
112
|
+
[(vs/jm "status" 200
|
|
113
|
+
"statusText" "OK"
|
|
114
|
+
"headers" (vs/jm)
|
|
115
|
+
"json" (fn [] (vs/jm "id" "mock01")))
|
|
116
|
+
nil])
|
|
117
|
+
|
|
118
|
+
(def client
|
|
119
|
+
(api/make-sdk
|
|
120
|
+
(vs/jm "base" "http://localhost:8080"
|
|
121
|
+
"system" (vs/jm "fetch" mock-fetch))))
|
|
122
|
+
\`\`\`
|
|
123
|
+
|
|
124
|
+
### Run the test suite
|
|
125
|
+
|
|
126
|
+
The generated suite (pipeline, features, netsim, primary utility and the
|
|
127
|
+
vendored struct corpus) runs offline through a single \`tools.deps\` entry
|
|
128
|
+
point:
|
|
129
|
+
|
|
130
|
+
\`\`\`bash
|
|
131
|
+
cd ${target.name} && make test
|
|
132
|
+
\`\`\`
|
|
133
|
+
|
|
134
|
+
To exercise the SDK against the live API, construct a client with real
|
|
135
|
+
credentials and call its operations directly.
|
|
136
|
+
|
|
137
|
+
`)
|
|
138
|
+
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
export {
|
|
143
|
+
ReadmeHowto
|
|
144
|
+
}
|