@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,111 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, File } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// Emits test/readme_examples_test.ml — a structural gate over every ```ocaml
|
|
6
|
+
// fenced block in the three docs that ship ocaml examples:
|
|
7
|
+
// - the root README.md (top-level, multi-language quick start)
|
|
8
|
+
// - the per-language ocaml/README.md
|
|
9
|
+
// - the per-language ocaml/REFERENCE.md
|
|
10
|
+
//
|
|
11
|
+
// DESIGN NOTE (mirrors ReadmeExamplesTest_rust): the py gate shells out to a
|
|
12
|
+
// python subprocess to COMPILE + EXECUTE every block. A faithful ocaml port
|
|
13
|
+
// would shell out to `ocamlc` against each extracted snippet — a large,
|
|
14
|
+
// environment-sensitive harness that cannot be authored safely without a build
|
|
15
|
+
// to validate it (and the generated SDK ships a dependency-free stock-ocamlc
|
|
16
|
+
// build, no doc-test tooling). This gate instead validates that every
|
|
17
|
+
// documented ocaml block is PRESENT and STRUCTURALLY well-formed (balanced
|
|
18
|
+
// delimiters, non-empty). It is a real, always-passing test that keeps the docs
|
|
19
|
+
// honest about block structure; upgrading it to a true compile gate (a temp
|
|
20
|
+
// project that `ocamlc`s each block against the generated SDK) is a follow-up.
|
|
21
|
+
// Missing docs are tolerated (a run may generate a subset of phases).
|
|
22
|
+
const ReadmeExamplesTest = cmp(function ReadmeExamplesTest(props: any) {
|
|
23
|
+
const { target, ctx$: { model } } = props
|
|
24
|
+
|
|
25
|
+
File({ name: 'readme_examples_test.' + target.ext }, () => {
|
|
26
|
+
Content(`(* Structural gate over every \`\`\`ocaml block in the ${model.const.Name} SDK
|
|
27
|
+
* docs (root README.md, ocaml/README.md, ocaml/REFERENCE.md). Generated by
|
|
28
|
+
* @voxgig/sdkgen — do not edit by hand.
|
|
29
|
+
*
|
|
30
|
+
* Validates that each documented ocaml block is present, non-empty, and has
|
|
31
|
+
* balanced delimiters. Missing docs are tolerated. See ReadmeExamplesTest_ocaml
|
|
32
|
+
* for why this is a structural gate rather than a full compile harness. *)
|
|
33
|
+
|
|
34
|
+
open Testutil
|
|
35
|
+
|
|
36
|
+
let fence = "\`\`\`ocaml"
|
|
37
|
+
let close_fence = "\`\`\`"
|
|
38
|
+
|
|
39
|
+
let trim = String.trim
|
|
40
|
+
|
|
41
|
+
(* Read a whole file, or None when it is absent (a doc not generated). *)
|
|
42
|
+
let read_file (path : string) : string option =
|
|
43
|
+
try Some (In_channel.with_open_text path In_channel.input_all)
|
|
44
|
+
with Sys_error _ -> None
|
|
45
|
+
|
|
46
|
+
let split_lines (s : string) : string list = String.split_on_char '\\n' s
|
|
47
|
+
|
|
48
|
+
(* Extract the body of every \`\`\`ocaml ... \`\`\` fenced block from markdown. *)
|
|
49
|
+
let extract_ocaml_blocks (md : string) : string list =
|
|
50
|
+
let blocks = ref [] in
|
|
51
|
+
let cur = ref [] in
|
|
52
|
+
let in_block = ref false in
|
|
53
|
+
List.iter (fun line ->
|
|
54
|
+
let t = trim line in
|
|
55
|
+
if not !in_block then begin
|
|
56
|
+
if t = fence then begin in_block := true; cur := [] end
|
|
57
|
+
end
|
|
58
|
+
else if t = close_fence then begin
|
|
59
|
+
blocks := String.concat "\\n" (List.rev !cur) :: !blocks;
|
|
60
|
+
in_block := false
|
|
61
|
+
end
|
|
62
|
+
else cur := line :: !cur)
|
|
63
|
+
(split_lines md);
|
|
64
|
+
List.rev !blocks
|
|
65
|
+
|
|
66
|
+
(* Balanced (), [], {} outside of string literals. Naive quote toggle: the
|
|
67
|
+
* generated snippets never embed an escaped quote inside a string. *)
|
|
68
|
+
let is_balanced (block : string) : bool =
|
|
69
|
+
let in_str = ref false in
|
|
70
|
+
let depth = ref 0 in
|
|
71
|
+
let ok = ref true in
|
|
72
|
+
String.iter (fun c ->
|
|
73
|
+
if c = '"' then in_str := not !in_str
|
|
74
|
+
else if not !in_str then
|
|
75
|
+
match c with
|
|
76
|
+
| '(' | '[' | '{' -> incr depth
|
|
77
|
+
| ')' | ']' | '}' -> decr depth; if !depth < 0 then ok := false
|
|
78
|
+
| _ -> ())
|
|
79
|
+
block;
|
|
80
|
+
!ok && !depth = 0 && not !in_str
|
|
81
|
+
|
|
82
|
+
let docs = [
|
|
83
|
+
("root README", "../README.md");
|
|
84
|
+
("ocaml/README", "README.md");
|
|
85
|
+
("ocaml/REFERENCE", "REFERENCE.md");
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
let () =
|
|
89
|
+
test "readme.ocaml_snippets_wellformed" (fun () ->
|
|
90
|
+
let total = ref 0 in
|
|
91
|
+
List.iter (fun (label, path) ->
|
|
92
|
+
match read_file path with
|
|
93
|
+
| None -> () (* doc not generated in this run — tolerate *)
|
|
94
|
+
| Some src ->
|
|
95
|
+
List.iteri (fun i block ->
|
|
96
|
+
check (label ^ " block " ^ string_of_int (i + 1) ^ " non-empty")
|
|
97
|
+
(trim block <> "");
|
|
98
|
+
check (label ^ " block " ^ string_of_int (i + 1) ^ " balanced delimiters")
|
|
99
|
+
(is_balanced block);
|
|
100
|
+
incr total)
|
|
101
|
+
(extract_ocaml_blocks src))
|
|
102
|
+
docs;
|
|
103
|
+
check "at least one ocaml code block across the docs" (!total > 0))
|
|
104
|
+
`)
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
export {
|
|
110
|
+
ReadmeExamplesTest
|
|
111
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
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 \`value\`
|
|
9
|
+
|
|
10
|
+
The OCaml SDK uses a single dynamic \`value\` type throughout rather than a
|
|
11
|
+
typed record per entity. \`value\` is the vendored voxgig struct port (a
|
|
12
|
+
JSON-shaped variant: \`Str\`, \`Num\`, \`Bool\`, \`List\`, \`Map\`, \`Null\`,
|
|
13
|
+
\`Noval\`). This mirrors the dynamic nature of the API and keeps the SDK
|
|
14
|
+
flexible — no code generation is needed when the API schema changes.
|
|
15
|
+
|
|
16
|
+
Build request maps with the \`jo\` / \`ja\` helpers and read fields back with
|
|
17
|
+
\`getp\`; use \`to_map\` to safely coerce a value to a map.
|
|
18
|
+
|
|
19
|
+
### Module structure
|
|
20
|
+
|
|
21
|
+
\`\`\`
|
|
22
|
+
${target.name}/
|
|
23
|
+
├── sdk_client.ml -- Main SDK client (constructors + accessors)
|
|
24
|
+
├── sdk_config.ml -- Embedded API config + feature factory
|
|
25
|
+
├── sdk_error.ml -- Branded error re-exports
|
|
26
|
+
├── sdk_entity_*.ml -- Per-entity implementations (one each)
|
|
27
|
+
├── sdk_types.ml -- Core pipeline types
|
|
28
|
+
├── sdk_helpers.ml -- jo / ja / getp and friends
|
|
29
|
+
├── sdk_runtime.ml -- Operation pipeline runner
|
|
30
|
+
├── sdk_features.ml -- Built-in features (base, test, log)
|
|
31
|
+
├── utility/ -- Vendored voxgig struct port
|
|
32
|
+
└── test/ -- Test suites
|
|
33
|
+
\`\`\`
|
|
34
|
+
|
|
35
|
+
The public surface lives in \`Sdk_client\` (the constructors and per-entity
|
|
36
|
+
accessors); \`Sdk_helpers\` carries the \`jo\` / \`ja\` / \`getp\` value
|
|
37
|
+
helpers. Open the runtime modules directly only when needed.
|
|
38
|
+
|
|
39
|
+
`)
|
|
40
|
+
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
export {
|
|
45
|
+
ReadmeExplanation
|
|
46
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, isAuthActive, envName, canonKey, entityIdField, pickExampleEntity, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
} from '@voxgig/apidef'
|
|
8
|
+
|
|
9
|
+
import { ocamlVarName } from './utility_ocaml'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// A type-correct OCaml `value` literal for a field's canonical type.
|
|
13
|
+
function ocamlLit(type: any): string {
|
|
14
|
+
const k = canonKey(type)
|
|
15
|
+
if ('INTEGER' === k || 'NUMBER' === k) return '(Num 1.)'
|
|
16
|
+
if ('BOOLEAN' === k) return '(Bool true)'
|
|
17
|
+
if ('ARRAY' === k) return '(empty_list ())'
|
|
18
|
+
if ('OBJECT' === k) return '(empty_map ())'
|
|
19
|
+
return '(Str "example")'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
|
|
24
|
+
const { target, ctx$: { model } } = props
|
|
25
|
+
|
|
26
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
27
|
+
// Pick an entity with a real op (prefer a read op) — never fabricate a
|
|
28
|
+
// `load` on an op-less entity. primaryOp is null only when NO entity exposes
|
|
29
|
+
// any op (a direct()-only SDK).
|
|
30
|
+
const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
|
|
31
|
+
const fn = exampleEntity ? ocamlVarName(exampleEntity.name) : 'entity'
|
|
32
|
+
const idF = exampleEntity ? entityIdField(exampleEntity) : null
|
|
33
|
+
const field = primaryOp
|
|
34
|
+
? ('load' === primaryOp ? 'e_load' :
|
|
35
|
+
'list' === primaryOp ? 'e_list' :
|
|
36
|
+
'create' === primaryOp ? 'e_create' :
|
|
37
|
+
'update' === primaryOp ? 'e_update' : 'e_remove')
|
|
38
|
+
: ''
|
|
39
|
+
const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
|
|
40
|
+
let testArg = 'Noval'
|
|
41
|
+
if (exampleEntity && 'list' === primaryOp) {
|
|
42
|
+
testArg = '(empty_map ())'
|
|
43
|
+
} else if (exampleEntity && isMatchOp) {
|
|
44
|
+
testArg = idF ? `(jo [("${idF}", Str "test01")])` : '(empty_map ())'
|
|
45
|
+
} else if (exampleEntity && ('create' === primaryOp || 'update' === primaryOp)) {
|
|
46
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
47
|
+
.filter((it: any) => it.name !== idF && it.name !== 'id')
|
|
48
|
+
const required = items.filter((it: any) => !it.optional)
|
|
49
|
+
const chosen = required.length ? required : items.slice(0, 3)
|
|
50
|
+
testArg = `(jo [${chosen.map((it: any) => `("${it.name}", ${ocamlLit(it.type)})`).join('; ')}])`
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The op-driven test-mode line, shown only when the SDK has an entity op.
|
|
54
|
+
// A direct()-only SDK (no ops anywhere) shows a direct() call instead.
|
|
55
|
+
const testModeExample = primaryOp
|
|
56
|
+
? `(* Entity ops return the bare record and raise on error. *)
|
|
57
|
+
let ${fn} = (Sdk_client.${fn} client Noval).${field} ${testArg} Noval in
|
|
58
|
+
print_endline (stringify ${fn}) (* the mock response record *)`
|
|
59
|
+
: `let result = Sdk_client.direct client (jo [("path", Str "/api/resource"); ("method", Str "GET")]) in
|
|
60
|
+
print_endline (stringify result)`
|
|
61
|
+
|
|
62
|
+
const apikeyEnvLine = isAuthActive(model)
|
|
63
|
+
? `\n${envName(model)}_APIKEY=<your-key>`
|
|
64
|
+
: ''
|
|
65
|
+
|
|
66
|
+
Content(`### Make a direct HTTP request
|
|
67
|
+
|
|
68
|
+
For endpoints not covered by entity methods:
|
|
69
|
+
|
|
70
|
+
\`\`\`ocaml
|
|
71
|
+
let result = Sdk_client.direct client (jo [
|
|
72
|
+
("path", Str "/api/resource/{id}");
|
|
73
|
+
("method", Str "GET");
|
|
74
|
+
("params", jo [("id", Str "example")]);
|
|
75
|
+
]) in
|
|
76
|
+
(match getp result "ok" with
|
|
77
|
+
| Bool true ->
|
|
78
|
+
print_endline (stringify (getp result "status")); (* 200 *)
|
|
79
|
+
print_endline (stringify (getp result "data")) (* response body *)
|
|
80
|
+
| _ ->
|
|
81
|
+
(* A non-2xx response carries status + data (the error body); a transport
|
|
82
|
+
failure carries err instead. Read whichever is present. *)
|
|
83
|
+
print_endline (stringify (getp result "status"));
|
|
84
|
+
print_endline (stringify (getp result "err")))
|
|
85
|
+
\`\`\`
|
|
86
|
+
|
|
87
|
+
### Prepare a request without sending it
|
|
88
|
+
|
|
89
|
+
\`\`\`ocaml
|
|
90
|
+
(* prepare returns the fetch definition and raises on error. *)
|
|
91
|
+
let fetchdef = Sdk_client.prepare client (jo [
|
|
92
|
+
("path", Str "/api/resource/{id}");
|
|
93
|
+
("method", Str "DELETE");
|
|
94
|
+
("params", jo [("id", Str "example")]);
|
|
95
|
+
]) in
|
|
96
|
+
print_endline (stringify (getp fetchdef "url"));
|
|
97
|
+
print_endline (stringify (getp fetchdef "method"));
|
|
98
|
+
print_endline (stringify (getp fetchdef "headers"))
|
|
99
|
+
\`\`\`
|
|
100
|
+
|
|
101
|
+
### Use test mode
|
|
102
|
+
|
|
103
|
+
Create a mock client for unit testing — no server required:
|
|
104
|
+
|
|
105
|
+
\`\`\`ocaml
|
|
106
|
+
let () =
|
|
107
|
+
let client = Sdk_client.test () in
|
|
108
|
+
${testModeExample}
|
|
109
|
+
\`\`\`
|
|
110
|
+
|
|
111
|
+
### Use a custom fetch function
|
|
112
|
+
|
|
113
|
+
Replace the HTTP transport with your own function:
|
|
114
|
+
|
|
115
|
+
\`\`\`ocaml
|
|
116
|
+
let mock_fetch = Func (fun _ _args _ _ ->
|
|
117
|
+
jo [("status", Num 200.); ("statusText", Str "OK"); ("headers", empty_map ());
|
|
118
|
+
("json", json_thunk (jo [("id", Str "mock01")]))]) in
|
|
119
|
+
let client = Sdk_client.make (jo [
|
|
120
|
+
("base", Str "http://localhost:8080");
|
|
121
|
+
("system", jo [("fetch", mock_fetch)]);
|
|
122
|
+
]) in
|
|
123
|
+
ignore client
|
|
124
|
+
\`\`\`
|
|
125
|
+
|
|
126
|
+
### Run live tests
|
|
127
|
+
|
|
128
|
+
Create a \`.env.local\` file at the project root:
|
|
129
|
+
|
|
130
|
+
\`\`\`
|
|
131
|
+
${envName(model)}_TEST_LIVE=TRUE${apikeyEnvLine}
|
|
132
|
+
\`\`\`
|
|
133
|
+
|
|
134
|
+
Then run:
|
|
135
|
+
|
|
136
|
+
\`\`\`bash
|
|
137
|
+
cd ${target.name} && make test
|
|
138
|
+
\`\`\`
|
|
139
|
+
|
|
140
|
+
`)
|
|
141
|
+
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
export {
|
|
146
|
+
ReadmeHowto
|
|
147
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content, installCommand, 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
|
+
if (isPublished(model, target.name)) {
|
|
10
|
+
Content(`\`\`\`bash
|
|
11
|
+
${installCommand(model, target.name)}
|
|
12
|
+
\`\`\`
|
|
13
|
+
|
|
14
|
+
Or build from a source checkout — the SDK is dependency-free and compiles
|
|
15
|
+
with the stock \`ocamlc\` (no opam packages, no dune):
|
|
16
|
+
|
|
17
|
+
\`\`\`bash
|
|
18
|
+
cd ${target.name} && make build
|
|
19
|
+
\`\`\`
|
|
20
|
+
|
|
21
|
+
`)
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Publish pending: not yet on the opam registry. Build from the git release
|
|
26
|
+
// tag or from a local source checkout. The generated library is
|
|
27
|
+
// dependency-free — a plain `make build` (stock `ocamlc`) is all it needs.
|
|
28
|
+
const { releasesUrl } = repoInfo(model)
|
|
29
|
+
Content(`This package is not yet published to the opam registry. Install it from the
|
|
30
|
+
GitHub release tag (\`${target.name}/vX.Y.Z\`, see [Releases](${releasesUrl}))
|
|
31
|
+
or from a source checkout. The SDK is dependency-free and compiles with the
|
|
32
|
+
stock \`ocamlc\` — no opam packages, no dune:
|
|
33
|
+
|
|
34
|
+
\`\`\`bash
|
|
35
|
+
cd ${target.name} && make build
|
|
36
|
+
\`\`\`
|
|
37
|
+
|
|
38
|
+
`)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
ReadmeInstall
|
|
44
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
} from '@voxgig/apidef'
|
|
8
|
+
|
|
9
|
+
import { ocamlVarName } from './utility_ocaml'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
const ReadmeIntro = cmp(function ReadmeIntro(props: any) {
|
|
13
|
+
const { target, ctx$: { model } } = props
|
|
14
|
+
const info = (model.main && model.main.kit && model.main.kit.info) || {}
|
|
15
|
+
const tagline = info.tagline || ''
|
|
16
|
+
|
|
17
|
+
Content(`# ${model.Name} ${target.title} SDK
|
|
18
|
+
|
|
19
|
+
${tagline}
|
|
20
|
+
|
|
21
|
+
The ${target.title} SDK for the ${model.Name} API — an entity-oriented client
|
|
22
|
+
following idiomatic OCaml conventions (a dependency-free library that compiles
|
|
23
|
+
with the stock \`ocamlc\`).
|
|
24
|
+
|
|
25
|
+
`)
|
|
26
|
+
|
|
27
|
+
// Emphasise the entity-oriented design: the SDK surfaces the API as
|
|
28
|
+
// capitalised, semantic Entities with a small, uniform verb set rather
|
|
29
|
+
// than raw URL paths and query strings. The example entity name is
|
|
30
|
+
// derived from the model, never hardcoded.
|
|
31
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
32
|
+
const exampleEntity = Object.values(entity || {})
|
|
33
|
+
.find((e: any) => e.active !== false) as any
|
|
34
|
+
const example = exampleEntity
|
|
35
|
+
? `for example \`Sdk_client.${ocamlVarName(exampleEntity.name)} client Noval\` — each`
|
|
36
|
+
: 'each'
|
|
37
|
+
|
|
38
|
+
// Model-driven op list — only the operations the active entities actually
|
|
39
|
+
// expose (a read-only entity has just list+load); never claim
|
|
40
|
+
// create/update/remove exist when no entity has them.
|
|
41
|
+
const CANON_OPS = ['list', 'load', 'create', 'update', 'remove']
|
|
42
|
+
const opSet = new Set<string>()
|
|
43
|
+
Object.values(entity || {}).forEach((e: any) => {
|
|
44
|
+
if (!e || e.active === false) return
|
|
45
|
+
Object.keys(e.op || {}).forEach((o: string) => {
|
|
46
|
+
if (e.op[o] && e.op[o].active !== false) opSet.add(o)
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
const opNames = CANON_OPS.filter((o) => opSet.has(o))
|
|
50
|
+
.concat([...opSet].filter((o) => !CANON_OPS.includes(o)))
|
|
51
|
+
const opList = (opNames.length ? opNames : ['list', 'load'])
|
|
52
|
+
.map((o) => '`' + o + '`').join(', ')
|
|
53
|
+
|
|
54
|
+
Content(`The SDK exposes the API as capitalised, semantic **Entities** — ${example}
|
|
55
|
+
carrying a small, uniform set of operations (${opList}) instead of raw URL
|
|
56
|
+
paths and query strings. You work with named resources and verbs, which
|
|
57
|
+
keeps the cognitive load low.
|
|
58
|
+
|
|
59
|
+
> Other languages, the CLI, and MCP server live alongside this one — see
|
|
60
|
+
> the [top-level README](../README.md).
|
|
61
|
+
|
|
62
|
+
`)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
export {
|
|
67
|
+
ReadmeIntro
|
|
68
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, each, Content, isAuthActive } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
} from '@voxgig/apidef'
|
|
8
|
+
|
|
9
|
+
import { ocamlVarName } from './utility_ocaml'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
const ReadmeModel = cmp(function ReadmeModel(props: any) {
|
|
13
|
+
const { target, ctx$: { model } } = props
|
|
14
|
+
|
|
15
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
16
|
+
const entityList = each(entity).filter((e: any) => e.active !== false)
|
|
17
|
+
|
|
18
|
+
// Model-driven op rows for the shared entity interface: emit a row only for
|
|
19
|
+
// operations at least one active 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: '| `e_load` | `value -> value -> value` | Load a single entity by match criteria. Raises on error. |',
|
|
25
|
+
list: '| `e_list` | `value -> value -> value` | List entities matching the criteria (returns a List). Raises on error. |',
|
|
26
|
+
create: '| `e_create` | `value -> value -> value` | Create a new entity. Raises on error. |',
|
|
27
|
+
update: '| `e_update` | `value -> value -> value` | Update an existing entity. Raises on error. |',
|
|
28
|
+
remove: '| `e_remove` | `value -> value -> value` | 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` | API key for authentication. |\n'
|
|
35
|
+
: ''
|
|
36
|
+
|
|
37
|
+
Content(`### Sdk_client
|
|
38
|
+
|
|
39
|
+
\`\`\`ocaml
|
|
40
|
+
open Voxgig_struct
|
|
41
|
+
open Sdk_helpers
|
|
42
|
+
|
|
43
|
+
let client = Sdk_client.make options
|
|
44
|
+
\`\`\`
|
|
45
|
+
|
|
46
|
+
Creates a new SDK client from a \`value\` options map. Use \`Sdk_client.make0 ()\`
|
|
47
|
+
for defaults.
|
|
48
|
+
|
|
49
|
+
| Option | Type | Description |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
${apikeyOptionRow}| \`base\` | \`string\` | Base URL of the API server. |
|
|
52
|
+
| \`prefix\` | \`string\` | URL path prefix prepended to all requests. |
|
|
53
|
+
| \`suffix\` | \`string\` | URL path suffix appended to all requests. |
|
|
54
|
+
| \`feature\` | \`map\` | Feature activation flags. |
|
|
55
|
+
| \`extend\` | \`list\` | Additional feature instances to load. |
|
|
56
|
+
| \`system\` | \`map\` | System overrides (e.g. custom \`fetch\` function). |
|
|
57
|
+
|
|
58
|
+
### Sdk_client.test
|
|
59
|
+
|
|
60
|
+
\`\`\`ocaml
|
|
61
|
+
let client = Sdk_client.test_with testopts sdkopts
|
|
62
|
+
\`\`\`
|
|
63
|
+
|
|
64
|
+
Creates a test-mode client with mock transport. Both arguments may be \`Noval\`
|
|
65
|
+
(\`Sdk_client.test ()\` uses defaults).
|
|
66
|
+
|
|
67
|
+
### Sdk_client functions
|
|
68
|
+
|
|
69
|
+
| Function | Signature | Description |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| \`make\` | \`value -> sdk_client\` | Construct a client from options. |
|
|
72
|
+
| \`make0\` | \`unit -> sdk_client\` | Construct a client with defaults. |
|
|
73
|
+
| \`prepare\` | \`sdk_client -> value -> value\` | Build an HTTP request definition without sending. Raises on error. |
|
|
74
|
+
| \`direct\` | \`sdk_client -> value -> value\` | Build and send an HTTP request. Returns a result map (branch on \`ok\`). |
|
|
75
|
+
`)
|
|
76
|
+
|
|
77
|
+
each(entityList, (ent: any) => {
|
|
78
|
+
const fn = ocamlVarName(ent.name)
|
|
79
|
+
const article = /^[aeiou]/i.test(ent.Name) ? 'an' : 'a'
|
|
80
|
+
Content(`| \`${fn}\` | \`sdk_client -> value -> entity_obj\` | ${article.charAt(0).toUpperCase() + article.slice(1)} ${ent.Name} entity accessor. |
|
|
81
|
+
`)
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
Content(`
|
|
85
|
+
### Entity interface
|
|
86
|
+
|
|
87
|
+
All entities are \`entity_obj\` records sharing the same fields.
|
|
88
|
+
|
|
89
|
+
| Field | Signature | Description |
|
|
90
|
+
| --- | --- | --- |
|
|
91
|
+
${opRows}
|
|
92
|
+
| \`e_data_get\` | \`unit -> value\` | Get entity data. |
|
|
93
|
+
| \`e_data_set\` | \`value -> unit\` | Set entity data. |
|
|
94
|
+
| \`e_match_get\` | \`unit -> value\` | Get entity match criteria. |
|
|
95
|
+
| \`e_match_set\` | \`value -> unit\` | Set entity match criteria. |
|
|
96
|
+
| \`e_make\` | \`unit -> entity_obj\` | Create a new instance with the same options. |
|
|
97
|
+
| \`e_name\` | \`string\` | The entity name. |
|
|
98
|
+
|
|
99
|
+
### Result shape
|
|
100
|
+
|
|
101
|
+
Entity operations return the bare result value (a \`Map\` for single-entity
|
|
102
|
+
ops, a \`List\` for \`e_list\`) and raise \`Sdk_error.E\` on error. Wrap calls
|
|
103
|
+
in \`try\`/\`with\` to handle failures.
|
|
104
|
+
|
|
105
|
+
The \`direct\` escape hatch never raises — it returns a result \`value\` map
|
|
106
|
+
you branch on via \`getp result "ok"\`:
|
|
107
|
+
|
|
108
|
+
| Key | Type | Description |
|
|
109
|
+
| --- | --- | --- |
|
|
110
|
+
| \`ok\` | \`Bool\` | \`Bool true\` if the HTTP status is 2xx. |
|
|
111
|
+
| \`status\` | \`Num\` | HTTP status code. |
|
|
112
|
+
| \`headers\` | \`Map\` | Response headers. |
|
|
113
|
+
| \`data\` | \`value\` | Parsed JSON response body. |
|
|
114
|
+
|
|
115
|
+
On error, \`ok\` is \`Bool false\` and \`err\` carries the error value.
|
|
116
|
+
|
|
117
|
+
`)
|
|
118
|
+
|
|
119
|
+
// Entities summary
|
|
120
|
+
Content(`### Entities
|
|
121
|
+
|
|
122
|
+
`)
|
|
123
|
+
each(entityList, (ent: any) => {
|
|
124
|
+
const fields = ent.fields || []
|
|
125
|
+
const opnames = Object.keys(ent.op || {})
|
|
126
|
+
const ops = ent.op || {}
|
|
127
|
+
const points = each(ops).map((op: any) =>
|
|
128
|
+
op.points ? each(op.points) : []
|
|
129
|
+
).flat()
|
|
130
|
+
const path = points.length > 0 ? (points[0] as any).orig || '' : ''
|
|
131
|
+
|
|
132
|
+
Content(`#### ${ent.Name}
|
|
133
|
+
|
|
134
|
+
| Field | Description |
|
|
135
|
+
| --- | --- |
|
|
136
|
+
`)
|
|
137
|
+
each(fields, (field: any) => {
|
|
138
|
+
Content(`| \`${field.name}\` | ${field.short || ''} |
|
|
139
|
+
`)
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
Content(`
|
|
143
|
+
Operations: ${opnames.map((n: string) => n.charAt(0).toUpperCase() + n.slice(1)).join(', ')}.
|
|
144
|
+
|
|
145
|
+
API path: \`${path}\`
|
|
146
|
+
|
|
147
|
+
`)
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
export {
|
|
154
|
+
ReadmeModel
|
|
155
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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 publishedOptions = each(target.options).filter((option: any) =>
|
|
10
|
+
option.publish && ('apikey' !== option.name || isAuthActive(model)))
|
|
11
|
+
if (0 === publishedOptions.length) {
|
|
12
|
+
return
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
Content(`
|
|
16
|
+
|
|
17
|
+
## Options
|
|
18
|
+
|
|
19
|
+
Pass options as a \`value\` map when creating a client:
|
|
20
|
+
|
|
21
|
+
`)
|
|
22
|
+
|
|
23
|
+
Content(`\`\`\`ocaml
|
|
24
|
+
let client = Sdk_client.make (jo [
|
|
25
|
+
`)
|
|
26
|
+
|
|
27
|
+
publishedOptions.map((option: any) => {
|
|
28
|
+
if ('apikey' === option.name) {
|
|
29
|
+
Content(` ("${option.name}", Str (Sys.getenv "${envName(model)}_APIKEY"));
|
|
30
|
+
`)
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
Content(` (* ("${option.name}", ${option.kind === 'string' ? 'Str "..."' : '(* ... *)'}); *)
|
|
34
|
+
`)
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
Content(`])
|
|
39
|
+
\`\`\`
|
|
40
|
+
|
|
41
|
+
`)
|
|
42
|
+
|
|
43
|
+
Content(`| Option | Type | Description |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
`)
|
|
46
|
+
|
|
47
|
+
publishedOptions.map((option: any) => {
|
|
48
|
+
Content(`| \`${option.name}\` | \`${option.kind}\` | ${option.short} |
|
|
49
|
+
`)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
Content(`
|
|
53
|
+
`)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
export {
|
|
58
|
+
ReadmeOptions
|
|
59
|
+
}
|