@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,149 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, isAuthActive, envName, entityIdField, pickExampleEntity, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
nom,
|
|
8
|
+
} from '@voxgig/apidef'
|
|
9
|
+
|
|
10
|
+
import { elixirLit } from './utility_elixir'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
|
|
14
|
+
const { target, ctx$: { model } } = props
|
|
15
|
+
|
|
16
|
+
const Name = model.const.Name
|
|
17
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
18
|
+
|
|
19
|
+
// Pick an entity with a real op (prefer a read op). primaryOp is null only
|
|
20
|
+
// when NO entity exposes any op (a direct()-only SDK).
|
|
21
|
+
const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
|
|
22
|
+
const eName = exampleEntity ? nom(exampleEntity, 'Name') : 'Entity'
|
|
23
|
+
const eVar = exampleEntity ? exampleEntity.name : 'entity'
|
|
24
|
+
const idF = exampleEntity ? entityIdField(exampleEntity) : null
|
|
25
|
+
const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
|
|
26
|
+
let testArg = 'H.deep(%{})'
|
|
27
|
+
if (exampleEntity && isMatchOp) {
|
|
28
|
+
testArg = idF ? `H.deep(%{"${idF}" => "test01"})` : 'H.deep(%{})'
|
|
29
|
+
} else if (exampleEntity && ('create' === primaryOp || 'update' === primaryOp)) {
|
|
30
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
31
|
+
.filter((it: any) => it.name !== idF && it.name !== 'id')
|
|
32
|
+
const required = items.filter((it: any) => !it.optional)
|
|
33
|
+
const chosen = required.length ? required : items.slice(0, 3)
|
|
34
|
+
testArg = `H.deep(%{${chosen.map((it: any) => `"${it.name}" => ${elixirLit(it.type)}`).join(', ')}})`
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const resVar = 'list' === primaryOp ? 'records' : 'record'
|
|
38
|
+
const testModeExample = primaryOp
|
|
39
|
+
? `# Entity ops return the bare record (raise on error).
|
|
40
|
+
${eVar} = ${Name}.${eVar}(sdk)
|
|
41
|
+
${resVar} = ${Name}.Entity.${eName}.${primaryOp}(${eVar}, ${testArg})
|
|
42
|
+
IO.inspect(${resVar})`
|
|
43
|
+
: `result = ${Name}.direct(sdk, H.deep(%{"path" => "/api/resource", "method" => "GET"}))
|
|
44
|
+
IO.inspect(result)`
|
|
45
|
+
|
|
46
|
+
const apikeyEnvLine = isAuthActive(model)
|
|
47
|
+
? `\n${envName(model)}_APIKEY=<your-key>`
|
|
48
|
+
: ''
|
|
49
|
+
|
|
50
|
+
Content(`### Make a direct HTTP request
|
|
51
|
+
|
|
52
|
+
For endpoints not covered by entity operations. \`direct/2\` never raises —
|
|
53
|
+
it returns a result node you branch on with \`Voxgig.Struct.getprop/2\`:
|
|
54
|
+
|
|
55
|
+
\`\`\`elixir
|
|
56
|
+
alias Voxgig.Struct, as: S
|
|
57
|
+
alias ${Name}.Helpers, as: H
|
|
58
|
+
|
|
59
|
+
result = ${Name}.direct(sdk, H.deep(%{
|
|
60
|
+
"path" => "/api/resource/{id}",
|
|
61
|
+
"method" => "GET",
|
|
62
|
+
"params" => %{"id" => "example"}
|
|
63
|
+
}))
|
|
64
|
+
|
|
65
|
+
if S.getprop(result, "ok") do
|
|
66
|
+
IO.inspect(S.getprop(result, "status")) # 200
|
|
67
|
+
IO.inspect(S.getprop(result, "data")) # response body
|
|
68
|
+
else
|
|
69
|
+
# A non-2xx response carries status + data (the error body); a
|
|
70
|
+
# transport-level failure carries err instead.
|
|
71
|
+
IO.inspect(S.getprop(result, "err"))
|
|
72
|
+
end
|
|
73
|
+
\`\`\`
|
|
74
|
+
|
|
75
|
+
### Prepare a request without sending it
|
|
76
|
+
|
|
77
|
+
\`\`\`elixir
|
|
78
|
+
alias ${Name}.Helpers, as: H
|
|
79
|
+
|
|
80
|
+
# prepare/2 returns the fetch definition and raises on error.
|
|
81
|
+
fetchdef = ${Name}.prepare(sdk, H.deep(%{
|
|
82
|
+
"path" => "/api/resource/{id}",
|
|
83
|
+
"method" => "DELETE",
|
|
84
|
+
"params" => %{"id" => "example"}
|
|
85
|
+
}))
|
|
86
|
+
|
|
87
|
+
IO.inspect(Voxgig.Struct.getprop(fetchdef, "url"))
|
|
88
|
+
IO.inspect(Voxgig.Struct.getprop(fetchdef, "method"))
|
|
89
|
+
\`\`\`
|
|
90
|
+
|
|
91
|
+
### Use test mode
|
|
92
|
+
|
|
93
|
+
Create a mock client for unit testing — no server required:
|
|
94
|
+
|
|
95
|
+
\`\`\`elixir
|
|
96
|
+
alias ${Name}.Helpers, as: H
|
|
97
|
+
|
|
98
|
+
sdk = ${Name}.test()
|
|
99
|
+
|
|
100
|
+
${testModeExample}
|
|
101
|
+
\`\`\`
|
|
102
|
+
|
|
103
|
+
### Use a custom fetch function
|
|
104
|
+
|
|
105
|
+
Replace the HTTP transport with your own function. It receives \`(url,
|
|
106
|
+
fetchdef)\` and returns a \`{response, error}\` tuple:
|
|
107
|
+
|
|
108
|
+
\`\`\`elixir
|
|
109
|
+
alias Voxgig.Struct, as: S
|
|
110
|
+
alias ${Name}.Helpers, as: H
|
|
111
|
+
|
|
112
|
+
mock_fetch = fn _url, _fetchdef ->
|
|
113
|
+
response = H.deep(%{
|
|
114
|
+
"status" => 200,
|
|
115
|
+
"statusText" => "OK",
|
|
116
|
+
"headers" => %{},
|
|
117
|
+
"json" => fn -> %{"id" => "mock01"} end
|
|
118
|
+
})
|
|
119
|
+
{response, nil}
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
sdk = ${Name}.new(H.deep(%{
|
|
123
|
+
"base" => "http://localhost:8080",
|
|
124
|
+
"system" => %{"fetch" => mock_fetch}
|
|
125
|
+
}))
|
|
126
|
+
\`\`\`
|
|
127
|
+
|
|
128
|
+
### Run live tests
|
|
129
|
+
|
|
130
|
+
Create a \`.env.local\` file at the project root:
|
|
131
|
+
|
|
132
|
+
\`\`\`
|
|
133
|
+
${envName(model)}_TEST_LIVE=TRUE${apikeyEnvLine}
|
|
134
|
+
\`\`\`
|
|
135
|
+
|
|
136
|
+
Then run:
|
|
137
|
+
|
|
138
|
+
\`\`\`bash
|
|
139
|
+
cd ${target.name} && mix test
|
|
140
|
+
\`\`\`
|
|
141
|
+
|
|
142
|
+
`)
|
|
143
|
+
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
export {
|
|
148
|
+
ReadmeHowto
|
|
149
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, isPublished, repoInfo } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
const ReadmeInstall = cmp(function ReadmeInstall(props: any) {
|
|
6
|
+
const { target, ctx$ } = props
|
|
7
|
+
const { model } = ctx$
|
|
8
|
+
|
|
9
|
+
// Match the app atom in mix.exs: snake_case, since `:a-b` is not a valid atom.
|
|
10
|
+
const app = model.const.name.toLowerCase().replace(/-/g, '_')
|
|
11
|
+
|
|
12
|
+
if (isPublished(model, target.name)) {
|
|
13
|
+
// Live on Hex: add the dependency to mix.exs deps/0.
|
|
14
|
+
Content(`Add \`${app}\` to your \`mix.exs\` dependencies:
|
|
15
|
+
|
|
16
|
+
\`\`\`elixir
|
|
17
|
+
def deps do
|
|
18
|
+
[
|
|
19
|
+
{:${app}, "~> 0.0.1"}
|
|
20
|
+
]
|
|
21
|
+
end
|
|
22
|
+
\`\`\`
|
|
23
|
+
|
|
24
|
+
Then fetch it:
|
|
25
|
+
|
|
26
|
+
\`\`\`bash
|
|
27
|
+
mix deps.get
|
|
28
|
+
\`\`\`
|
|
29
|
+
|
|
30
|
+
`)
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Publish pending: not yet on Hex. Install from the git release tag or a
|
|
35
|
+
// local path checkout.
|
|
36
|
+
const { repoUrl, releasesUrl } = repoInfo(model)
|
|
37
|
+
Content(`This package is not yet published to [Hex](https://hex.pm). Install it from
|
|
38
|
+
the GitHub release tag (\`${target.name}/vX.Y.Z\`, see [Releases](${releasesUrl}))
|
|
39
|
+
by adding a git dependency to your \`mix.exs\`:
|
|
40
|
+
|
|
41
|
+
\`\`\`elixir
|
|
42
|
+
def deps do
|
|
43
|
+
[
|
|
44
|
+
{:${app}, git: "${repoUrl}.git", tag: "${target.name}/vX.Y.Z"}
|
|
45
|
+
]
|
|
46
|
+
end
|
|
47
|
+
\`\`\`
|
|
48
|
+
|
|
49
|
+
Or from a local source checkout:
|
|
50
|
+
|
|
51
|
+
\`\`\`elixir
|
|
52
|
+
def deps do
|
|
53
|
+
[
|
|
54
|
+
{:${app}, path: "../${model.const.name.toLowerCase()}-sdk/${target.name}"}
|
|
55
|
+
]
|
|
56
|
+
end
|
|
57
|
+
\`\`\`
|
|
58
|
+
|
|
59
|
+
Then run \`mix deps.get\`.
|
|
60
|
+
|
|
61
|
+
`)
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
export {
|
|
66
|
+
ReadmeInstall
|
|
67
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
nom,
|
|
8
|
+
} from '@voxgig/apidef'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
const ReadmeIntro = cmp(function ReadmeIntro(props: any) {
|
|
12
|
+
const { target, ctx$: { model } } = props
|
|
13
|
+
const info = (model.main && model.main.kit && model.main.kit.info) || {}
|
|
14
|
+
const tagline = info.tagline || ''
|
|
15
|
+
|
|
16
|
+
Content(`# ${model.Name} ${target.title} SDK
|
|
17
|
+
|
|
18
|
+
${tagline}
|
|
19
|
+
|
|
20
|
+
The ${target.title} SDK for the ${model.Name} API — an entity-oriented client
|
|
21
|
+
following idiomatic, functional Elixir conventions.
|
|
22
|
+
|
|
23
|
+
`)
|
|
24
|
+
|
|
25
|
+
// Emphasise the entity-oriented design: the SDK surfaces the API as
|
|
26
|
+
// capitalised, semantic Entities with a small, uniform verb set rather
|
|
27
|
+
// than raw URL paths and query strings. The example entity name is
|
|
28
|
+
// derived from the model, never hardcoded.
|
|
29
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
30
|
+
const exampleEntity = Object.values(entity || {})
|
|
31
|
+
.find((e: any) => e.active !== false) as any
|
|
32
|
+
const example = exampleEntity
|
|
33
|
+
? `for example \`${model.const.Name}.${exampleEntity.name}(sdk)\` — each`
|
|
34
|
+
: 'each'
|
|
35
|
+
|
|
36
|
+
// Model-driven op list — only the operations the active entities actually
|
|
37
|
+
// expose (a read-only entity has just list+load); never claim
|
|
38
|
+
// create/update/remove exist when no entity has them.
|
|
39
|
+
const CANON_OPS = ['list', 'load', 'create', 'update', 'remove']
|
|
40
|
+
const opSet = new Set<string>()
|
|
41
|
+
Object.values(entity || {}).forEach((e: any) => {
|
|
42
|
+
if (!e || e.active === false) return
|
|
43
|
+
Object.keys(e.op || {}).forEach((o: string) => {
|
|
44
|
+
if (e.op[o] && e.op[o].active !== false) opSet.add(o)
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
const opNames = CANON_OPS.filter((o) => opSet.has(o))
|
|
48
|
+
.concat([...opSet].filter((o) => !CANON_OPS.includes(o)))
|
|
49
|
+
const opList = (opNames.length ? opNames : ['list', 'load'])
|
|
50
|
+
.map((o) => '`' + o + '`').join(', ')
|
|
51
|
+
|
|
52
|
+
Content(`The SDK exposes the API as capitalised, semantic **Entities** — ${example}
|
|
53
|
+
carrying a small, uniform set of operations (${opList}) instead of raw URL
|
|
54
|
+
paths and query strings. You work with named resources and verbs, which
|
|
55
|
+
keeps the cognitive load low.
|
|
56
|
+
|
|
57
|
+
> Other languages, the CLI, and MCP server live alongside this one — see
|
|
58
|
+
> the [top-level README](../README.md).
|
|
59
|
+
|
|
60
|
+
`)
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
export {
|
|
65
|
+
ReadmeIntro
|
|
66
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, each, Content, isAuthActive } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
} from '@voxgig/apidef'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
const ReadmeModel = cmp(function ReadmeModel(props: any) {
|
|
11
|
+
const { ctx$: { model } } = props
|
|
12
|
+
|
|
13
|
+
const Name = model.const.Name
|
|
14
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
15
|
+
const entityList = each(entity).filter((e: any) => e.active !== false)
|
|
16
|
+
|
|
17
|
+
// Model-driven op rows for the shared entity interface: emit a
|
|
18
|
+
// load/list/create/update/remove row only for operations at least one active
|
|
19
|
+
// entity actually exposes.
|
|
20
|
+
const opUnion = new Set<string>()
|
|
21
|
+
entityList.forEach((e: any) => Object.keys(e.op || {})
|
|
22
|
+
.forEach((o: string) => { if (e.op[o] && e.op[o].active !== false) opUnion.add(o) }))
|
|
23
|
+
const opRowDefs: Record<string, string> = {
|
|
24
|
+
load: '| `load` | `(entity, reqmatch, ctrl \\\\ nil) :: map()` | Load a single entity by match criteria. Raises on error. |',
|
|
25
|
+
list: '| `list` | `(entity, reqmatch \\\\ nil, ctrl \\\\ nil) :: list()` | List entities matching the criteria. Raises on error. |',
|
|
26
|
+
create: '| `create` | `(entity, reqdata, ctrl \\\\ nil) :: map()` | Create a new entity. Raises on error. |',
|
|
27
|
+
update: '| `update` | `(entity, reqdata, ctrl \\\\ nil) :: map()` | Update an existing entity. Raises on error. |',
|
|
28
|
+
remove: '| `remove` | `(entity, reqmatch \\\\ nil, ctrl \\\\ nil) :: map()` | Remove an entity. Raises on error. |',
|
|
29
|
+
}
|
|
30
|
+
const opRows = ['load', 'list', 'create', 'update', 'remove']
|
|
31
|
+
.filter((o) => opUnion.has(o)).map((o) => opRowDefs[o]).join('\n')
|
|
32
|
+
|
|
33
|
+
const apikeyOptionRow = isAuthActive(model)
|
|
34
|
+
? '| `apikey` | `String.t()` | API key for authentication. |\n'
|
|
35
|
+
: ''
|
|
36
|
+
|
|
37
|
+
Content(`### ${Name}
|
|
38
|
+
|
|
39
|
+
\`\`\`elixir
|
|
40
|
+
sdk = ${Name}.new(options)
|
|
41
|
+
\`\`\`
|
|
42
|
+
|
|
43
|
+
Creates a new SDK client. \`options\` is a struct value node — build one from a
|
|
44
|
+
native map with \`${Name}.Helpers.deep/1\`.
|
|
45
|
+
|
|
46
|
+
| Option | Type | Description |
|
|
47
|
+
| --- | --- | --- |
|
|
48
|
+
${apikeyOptionRow}| \`base\` | \`String.t()\` | Base URL of the API server. |
|
|
49
|
+
| \`prefix\` | \`String.t()\` | URL path prefix prepended to all requests. |
|
|
50
|
+
| \`suffix\` | \`String.t()\` | URL path suffix appended to all requests. |
|
|
51
|
+
| \`feature\` | \`map()\` | Feature activation flags. |
|
|
52
|
+
| \`extend\` | \`list()\` | Additional feature instances to load. |
|
|
53
|
+
| \`system\` | \`map()\` | System overrides (e.g. custom \`fetch\` function). |
|
|
54
|
+
|
|
55
|
+
### test
|
|
56
|
+
|
|
57
|
+
\`\`\`elixir
|
|
58
|
+
sdk = ${Name}.test(testopts, sdkopts)
|
|
59
|
+
\`\`\`
|
|
60
|
+
|
|
61
|
+
Creates a test-mode client with mock transport. Both arguments may be \`nil\`.
|
|
62
|
+
|
|
63
|
+
### ${Name} functions
|
|
64
|
+
|
|
65
|
+
| Function | Signature | Description |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| \`options_map\` | \`(client) :: map()\` | Deep copy of current SDK options. |
|
|
68
|
+
| \`get_utility\` | \`(client) :: map()\` | The SDK utility node. |
|
|
69
|
+
| \`prepare\` | \`(client, fetchargs) :: map()\` | Build an HTTP request definition without sending. Raises on error. |
|
|
70
|
+
| \`direct\` | \`(client, fetchargs) :: map()\` | Build and send an HTTP request. Returns a result node (branch on \`ok\`). |
|
|
71
|
+
`)
|
|
72
|
+
|
|
73
|
+
each(entityList, (ent: any) => {
|
|
74
|
+
const article = /^[aeiou]/i.test(ent.Name) ? 'an' : 'a'
|
|
75
|
+
Content(`| \`${ent.name}\` | \`(client, entopts \\\\ nil) :: entity\` | Create ${article} ${ent.Name} entity handle. |
|
|
76
|
+
`)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
Content(`
|
|
80
|
+
### Entity interface
|
|
81
|
+
|
|
82
|
+
Every entity's \`${Name}.Entity.<Name>\` module shares the same interface.
|
|
83
|
+
|
|
84
|
+
| Function | Signature | Description |
|
|
85
|
+
| --- | --- | --- |
|
|
86
|
+
${opRows}
|
|
87
|
+
| \`data_get\` | \`(entity) :: map()\` | Get entity data. |
|
|
88
|
+
| \`data_set\` | \`(entity, data)\` | Set entity data. |
|
|
89
|
+
| \`match_get\` | \`(entity) :: map()\` | Get entity match criteria. |
|
|
90
|
+
| \`match_set\` | \`(entity, match)\` | Set entity match criteria. |
|
|
91
|
+
| \`make\` | \`(entity) :: entity\` | Create a new handle with the same options. |
|
|
92
|
+
| \`get_name\` | \`(entity) :: String.t()\` | Return the entity name. |
|
|
93
|
+
|
|
94
|
+
### Result shape
|
|
95
|
+
|
|
96
|
+
Entity operations return the bare result data (a value node — a map for
|
|
97
|
+
single-entity ops, a list for \`list\`) and raise a \`${Name}.Error\` on
|
|
98
|
+
failure. Wrap calls in \`try\`/\`rescue\` to handle errors.
|
|
99
|
+
|
|
100
|
+
The \`direct/2\` escape hatch never raises — it returns a result node you
|
|
101
|
+
branch on via \`Voxgig.Struct.getprop(result, "ok")\`:
|
|
102
|
+
|
|
103
|
+
| Key | Type | Description |
|
|
104
|
+
| --- | --- | --- |
|
|
105
|
+
| \`ok\` | \`boolean()\` | \`true\` if the HTTP status is 2xx. |
|
|
106
|
+
| \`status\` | \`integer()\` | HTTP status code. |
|
|
107
|
+
| \`headers\` | \`map()\` | Response headers. |
|
|
108
|
+
| \`data\` | \`any()\` | Parsed JSON response body. |
|
|
109
|
+
|
|
110
|
+
On error, \`ok\` is \`false\` and \`err\` carries the error value.
|
|
111
|
+
|
|
112
|
+
`)
|
|
113
|
+
|
|
114
|
+
// Entities summary
|
|
115
|
+
Content(`### Entities
|
|
116
|
+
|
|
117
|
+
`)
|
|
118
|
+
each(entityList, (ent: any) => {
|
|
119
|
+
const fields = ent.fields || []
|
|
120
|
+
const opnames = Object.keys(ent.op || {})
|
|
121
|
+
const ops = ent.op || {}
|
|
122
|
+
const points = each(ops).map((op: any) =>
|
|
123
|
+
op.points ? each(op.points) : []
|
|
124
|
+
).flat()
|
|
125
|
+
const path = points.length > 0 ? (points[0] as any).orig || '' : ''
|
|
126
|
+
|
|
127
|
+
Content(`#### ${ent.Name}
|
|
128
|
+
|
|
129
|
+
| Field | Description |
|
|
130
|
+
| --- | --- |
|
|
131
|
+
`)
|
|
132
|
+
each(fields, (field: any) => {
|
|
133
|
+
Content(`| \`${field.name}\` | ${field.short || ''} |
|
|
134
|
+
`)
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
Content(`
|
|
138
|
+
Operations: ${opnames.map((n: string) => n.charAt(0).toUpperCase() + n.slice(1)).join(', ')}.
|
|
139
|
+
|
|
140
|
+
API path: \`${path}\`
|
|
141
|
+
|
|
142
|
+
`)
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
export {
|
|
149
|
+
ReadmeModel
|
|
150
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, each, Content, envName, isAuthActive } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
const ReadmeOptions = cmp(function ReadmeOptions(props: any) {
|
|
6
|
+
const { target } = props
|
|
7
|
+
const { model } = props.ctx$
|
|
8
|
+
|
|
9
|
+
const Name = model.const.Name
|
|
10
|
+
|
|
11
|
+
const publishedOptions = each(target.options).filter((option: any) =>
|
|
12
|
+
option.publish && ('apikey' !== option.name || isAuthActive(model)))
|
|
13
|
+
if (0 === publishedOptions.length) {
|
|
14
|
+
return
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
Content(`
|
|
18
|
+
|
|
19
|
+
## Options
|
|
20
|
+
|
|
21
|
+
Pass options when creating a client. Native maps are lifted into the SDK's
|
|
22
|
+
value model by \`${Name}.Helpers.deep/1\`:
|
|
23
|
+
|
|
24
|
+
`)
|
|
25
|
+
|
|
26
|
+
Content(`\`\`\`elixir
|
|
27
|
+
sdk = ${Name}.new(${Name}.Helpers.deep(%{
|
|
28
|
+
`)
|
|
29
|
+
|
|
30
|
+
publishedOptions.map((option: any) => {
|
|
31
|
+
if ('apikey' === option.name) {
|
|
32
|
+
Content(` "${option.name}" => System.get_env("${envName(model)}_APIKEY"),
|
|
33
|
+
`)
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
Content(` # "${option.name}" => ${option.kind === 'string' ? "\"...\"" : '...'},
|
|
37
|
+
`)
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
Content(`}))
|
|
42
|
+
\`\`\`
|
|
43
|
+
|
|
44
|
+
`)
|
|
45
|
+
|
|
46
|
+
Content(`| Option | Type | Description |
|
|
47
|
+
| --- | --- | --- |
|
|
48
|
+
`)
|
|
49
|
+
|
|
50
|
+
publishedOptions.map((option: any) => {
|
|
51
|
+
Content(`| \`${option.name}\` | \`${option.kind}\` | ${option.short} |
|
|
52
|
+
`)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
Content(`
|
|
56
|
+
`)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
export {
|
|
61
|
+
ReadmeOptions
|
|
62
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, isAuthActive, envName, opRequestShape, entityIdField, entityDataIdField, entityOps } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
nom,
|
|
8
|
+
} from '@voxgig/apidef'
|
|
9
|
+
|
|
10
|
+
import { elixirLit } from './utility_elixir'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
const ReadmeQuick = cmp(function ReadmeQuick(props: any) {
|
|
14
|
+
const { ctx$: { model } } = props
|
|
15
|
+
|
|
16
|
+
const Name = model.const.Name
|
|
17
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
18
|
+
|
|
19
|
+
const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
|
|
20
|
+
|
|
21
|
+
// Find a nested entity if available: one with a parent chain, an active
|
|
22
|
+
// load op, and a required non-id load param to demonstrate (the parent key).
|
|
23
|
+
const nestedEntity = Object.values(entity).find((e: any) =>
|
|
24
|
+
e.active !== false &&
|
|
25
|
+
e.relations && e.relations.ancestors && 0 < e.relations.ancestors.length &&
|
|
26
|
+
entityOps(e).includes('load') &&
|
|
27
|
+
opRequestShape(e, 'load').items.some((it: any) =>
|
|
28
|
+
!it.optional && it.name !== entityIdField(e))
|
|
29
|
+
) as any
|
|
30
|
+
|
|
31
|
+
const authActive = isAuthActive(model)
|
|
32
|
+
const ctor = authActive
|
|
33
|
+
? `${Name}.new(H.deep(%{"apikey" => System.get_env("${envName(model)}_APIKEY")}))`
|
|
34
|
+
: `${Name}.new()`
|
|
35
|
+
|
|
36
|
+
Content(`### 1. Create a client
|
|
37
|
+
|
|
38
|
+
\`\`\`elixir
|
|
39
|
+
alias ${Name}.Helpers, as: H
|
|
40
|
+
|
|
41
|
+
sdk = ${ctor}
|
|
42
|
+
\`\`\`
|
|
43
|
+
|
|
44
|
+
`)
|
|
45
|
+
|
|
46
|
+
if (exampleEntity) {
|
|
47
|
+
const eName = nom(exampleEntity, 'Name')
|
|
48
|
+
const article = /^[aeiou]/i.test(eName) ? 'an' : 'a'
|
|
49
|
+
const eVar = exampleEntity.name
|
|
50
|
+
const opnames = entityOps(exampleEntity)
|
|
51
|
+
const idF = entityIdField(exampleEntity)
|
|
52
|
+
const dataIdF = entityDataIdField(exampleEntity)
|
|
53
|
+
|
|
54
|
+
if (opnames.includes('list')) {
|
|
55
|
+
Content(`### 2. List ${eName.toLowerCase()} records
|
|
56
|
+
|
|
57
|
+
\`list/2\` returns a list value node and raises on error.
|
|
58
|
+
|
|
59
|
+
\`\`\`elixir
|
|
60
|
+
try do
|
|
61
|
+
${eVar} = ${Name}.${eVar}(sdk)
|
|
62
|
+
records = ${Name}.Entity.${eName}.list(${eVar})
|
|
63
|
+
IO.inspect(records)
|
|
64
|
+
rescue
|
|
65
|
+
err -> IO.puts("list failed: " <> inspect(err))
|
|
66
|
+
end
|
|
67
|
+
\`\`\`
|
|
68
|
+
|
|
69
|
+
`)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (nestedEntity) {
|
|
73
|
+
const neName = nom(nestedEntity, 'Name')
|
|
74
|
+
const neArticle = /^[aeiou]/i.test(neName) ? 'an' : 'a'
|
|
75
|
+
const neVar = nestedEntity.name
|
|
76
|
+
|
|
77
|
+
const neIdF = entityIdField(nestedEntity)
|
|
78
|
+
const neRequired = opRequestShape(nestedEntity, 'load').items
|
|
79
|
+
.filter((it: any) => !it.optional)
|
|
80
|
+
.sort((a: any, b: any) =>
|
|
81
|
+
(a.name === neIdF ? 1 : 0) - (b.name === neIdF ? 1 : 0))
|
|
82
|
+
const parentItem = neRequired.find((it: any) => it.name !== neIdF) as any
|
|
83
|
+
const parentParam = parentItem && parentItem.name
|
|
84
|
+
const parentName = parentParam ? parentParam.replace(/_id$/, '') : 'its parent'
|
|
85
|
+
const neMatch = neRequired.map((it: any) =>
|
|
86
|
+
`"${it.name}" => ${elixirLit(it.type,
|
|
87
|
+
it.name === neIdF ? 'example_id' : 'example_' + it.name)}`)
|
|
88
|
+
|
|
89
|
+
Content(`### 3. Load ${neArticle} ${neName.toLowerCase()}
|
|
90
|
+
|
|
91
|
+
${neName} is nested under ${parentName}, so provide the \`${parentParam}\`.
|
|
92
|
+
\`load/2\` returns the bare record and raises on error.
|
|
93
|
+
|
|
94
|
+
\`\`\`elixir
|
|
95
|
+
try do
|
|
96
|
+
${neVar} = ${Name}.${neVar}(sdk)
|
|
97
|
+
record = ${Name}.Entity.${neName}.load(${neVar}, H.deep(%{${neMatch.join(', ')}}))
|
|
98
|
+
IO.inspect(record)
|
|
99
|
+
rescue
|
|
100
|
+
err -> IO.puts("load failed: " <> inspect(err))
|
|
101
|
+
end
|
|
102
|
+
\`\`\`
|
|
103
|
+
|
|
104
|
+
`)
|
|
105
|
+
}
|
|
106
|
+
else if (opnames.includes('load')) {
|
|
107
|
+
const loadRequired = opRequestShape(exampleEntity, 'load').items
|
|
108
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
109
|
+
.sort((a: any, b: any) =>
|
|
110
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
111
|
+
const loadArg = 0 < loadRequired.length
|
|
112
|
+
? `H.deep(%{${loadRequired.map((it: any) =>
|
|
113
|
+
`"${it.name}" => ${elixirLit(it.type,
|
|
114
|
+
it.name === idF ? 'example_id' : 'example_' + it.name)}`).join(', ')}})`
|
|
115
|
+
: 'H.deep(%{})'
|
|
116
|
+
|
|
117
|
+
Content(`### 3. Load ${article} ${eName.toLowerCase()}
|
|
118
|
+
|
|
119
|
+
\`load/2\` returns the bare record and raises on error.
|
|
120
|
+
|
|
121
|
+
\`\`\`elixir
|
|
122
|
+
try do
|
|
123
|
+
${eVar} = ${Name}.${eVar}(sdk)
|
|
124
|
+
record = ${Name}.Entity.${eName}.load(${eVar}, ${loadArg})
|
|
125
|
+
IO.inspect(record)
|
|
126
|
+
rescue
|
|
127
|
+
err -> IO.puts("load failed: " <> inspect(err))
|
|
128
|
+
end
|
|
129
|
+
\`\`\`
|
|
130
|
+
|
|
131
|
+
`)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Model-driven example fields: derive the create/update body from the op
|
|
135
|
+
// shape so the docs reference REAL writable fields.
|
|
136
|
+
const examplePairs = (opname: string): string[] => {
|
|
137
|
+
const items = opRequestShape(exampleEntity, opname).items
|
|
138
|
+
.filter((it: any) => (it.name !== idF && it.name !== 'id') ||
|
|
139
|
+
('create' === opname && !it.optional))
|
|
140
|
+
const required = items.filter((it: any) => !it.optional)
|
|
141
|
+
const optional = items.filter((it: any) => it.optional)
|
|
142
|
+
const chosen = 'create' === opname
|
|
143
|
+
? (required.length ? required : items.slice(0, 2))
|
|
144
|
+
: required.concat(optional).slice(0, Math.max(2, required.length))
|
|
145
|
+
return chosen.map((it: any) => `"${it.name}" => ${elixirLit(it.type, 'example_' + it.name)}`)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const idParamType = (opname: string): any => {
|
|
149
|
+
const it = opRequestShape(exampleEntity, opname).items.find((x: any) => x.name === idF)
|
|
150
|
+
return it && it.type
|
|
151
|
+
}
|
|
152
|
+
const idValueFor = (opname: string): string => (null != dataIdF && opnames.includes('create'))
|
|
153
|
+
? `Voxgig.Struct.getprop(created, "${dataIdF}")`
|
|
154
|
+
: elixirLit(idParamType(opname), 'example_id')
|
|
155
|
+
|
|
156
|
+
if (opnames.includes('create') || opnames.includes('update') || opnames.includes('remove')) {
|
|
157
|
+
Content(`### 4. Create, update, and remove
|
|
158
|
+
|
|
159
|
+
\`\`\`elixir
|
|
160
|
+
${eVar} = ${Name}.${eVar}(sdk)
|
|
161
|
+
|
|
162
|
+
`)
|
|
163
|
+
if (opnames.includes('create')) {
|
|
164
|
+
Content(`# Create — returns the bare created record
|
|
165
|
+
created = ${Name}.Entity.${eName}.create(${eVar}, H.deep(%{${examplePairs('create').join(', ')}}))
|
|
166
|
+
|
|
167
|
+
`)
|
|
168
|
+
}
|
|
169
|
+
if (opnames.includes('update')) {
|
|
170
|
+
const updatePairs = (idF ? [`"${idF}" => ${idValueFor('update')}`] : []).concat(examplePairs('update'))
|
|
171
|
+
Content(`# Update
|
|
172
|
+
${Name}.Entity.${eName}.update(${eVar}, H.deep(%{${updatePairs.join(', ')}}))
|
|
173
|
+
|
|
174
|
+
`)
|
|
175
|
+
}
|
|
176
|
+
if (opnames.includes('remove')) {
|
|
177
|
+
const removePairs = opRequestShape(exampleEntity, 'remove').items
|
|
178
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
179
|
+
.sort((a: any, b: any) =>
|
|
180
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
181
|
+
.map((it: any) => it.name === idF
|
|
182
|
+
? `"${it.name}" => ${idValueFor('remove')}`
|
|
183
|
+
: `"${it.name}" => ${elixirLit(it.type, 'example_' + it.name)}`)
|
|
184
|
+
Content(`# Remove
|
|
185
|
+
${Name}.Entity.${eName}.remove(${eVar}${removePairs.length ? `, H.deep(%{${removePairs.join(', ')}})` : ''})
|
|
186
|
+
`)
|
|
187
|
+
}
|
|
188
|
+
Content(`\`\`\`
|
|
189
|
+
|
|
190
|
+
`)
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
export {
|
|
197
|
+
ReadmeQuick
|
|
198
|
+
}
|