@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,170 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, File, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// Emits Tests/ProjectNameSDKTests/ReadmeExamplesTest.swift — a PRESENCE +
|
|
6
|
+
// STRUCTURE gate over every swift fenced block in the repository ROOT
|
|
7
|
+
// README.md, the per-language swift/README.md, AND swift/REFERENCE.md. It is a
|
|
8
|
+
// plain XCTestCase (no @testable import — it only reads the doc files off
|
|
9
|
+
// disk), resolved relative to the test file via #filePath.
|
|
10
|
+
//
|
|
11
|
+
// SCOPE NOTE (deliberate, documented): the Python/TS/Go equivalents EXECUTE and
|
|
12
|
+
// type-check every documented block. That is infeasible here — the generated
|
|
13
|
+
// Swift SDK compiles with SwiftPM only (no in-process Swift compiler wired into
|
|
14
|
+
// the test runtime), so a test cannot compile-and-run arbitrary doc snippets at
|
|
15
|
+
// test time. This gate therefore guarantees the weaker-but-real invariant that
|
|
16
|
+
// keeps the docs honest as the generator evolves:
|
|
17
|
+
// 1. PRESENCE: every scanned doc that exists holds at least one swift block
|
|
18
|
+
// (nothing was dropped);
|
|
19
|
+
// 2. STRUCTURE: every swift block's braces / parens / brackets balance
|
|
20
|
+
// (ignoring string literals and line comments), catching a truncated or
|
|
21
|
+
// malformed generated snippet.
|
|
22
|
+
//
|
|
23
|
+
// The emitted Swift is written WITHOUT literal backticks (the fence marker is
|
|
24
|
+
// built at runtime as String(repeating: "\u{60}", count: 3)) so this TS
|
|
25
|
+
// template literal stays clean, and uses string concatenation instead of Swift
|
|
26
|
+
// interpolation to keep backslash-escaping in this template minimal.
|
|
27
|
+
const ReadmeExamplesTest = cmp(function ReadmeExamplesTest(props: any) {
|
|
28
|
+
const { ctx$: { model } } = props
|
|
29
|
+
|
|
30
|
+
const Name = model.const.Name
|
|
31
|
+
|
|
32
|
+
File({ name: 'ReadmeExamplesTest.swift' }, () => {
|
|
33
|
+
Content(`// ${Name} SDK — documentation swift-examples PRESENCE + STRUCTURE gate.
|
|
34
|
+
//
|
|
35
|
+
// GUARANTEE (see ReadmeExamplesTest_swift.ts for why this is a structure gate
|
|
36
|
+
// and not an execute gate): every swift example in the docs is accounted for.
|
|
37
|
+
// A dependency-free XCTestCase over every swift fenced code block in three
|
|
38
|
+
// documents:
|
|
39
|
+
// - the repository ROOT README.md (one directory above the swift module),
|
|
40
|
+
// - the per-language swift/README.md,
|
|
41
|
+
// - the per-language swift/REFERENCE.md.
|
|
42
|
+
//
|
|
43
|
+
// Checks, PER DOCUMENT that exists:
|
|
44
|
+
// 1. PRESENCE: the doc holds at least one swift block.
|
|
45
|
+
// 2. STRUCTURE: every swift block's braces / parens / brackets balance, so a
|
|
46
|
+
// truncated or malformed generated snippet fails loudly.
|
|
47
|
+
//
|
|
48
|
+
// GENERATED by @voxgig/sdkgen — do not edit by hand.
|
|
49
|
+
|
|
50
|
+
import XCTest
|
|
51
|
+
import Foundation
|
|
52
|
+
|
|
53
|
+
final class ReadmeExamplesTest: XCTestCase {
|
|
54
|
+
private struct Doc { let label: String; let path: String }
|
|
55
|
+
|
|
56
|
+
private let NL: Character = "\\n"
|
|
57
|
+
|
|
58
|
+
// The triple-backtick fence, built at runtime so this source carries no
|
|
59
|
+
// literal backticks.
|
|
60
|
+
private var fence: String { String(repeating: "\\u{60}", count: 3) }
|
|
61
|
+
|
|
62
|
+
// The three documents to scan, resolved relative to this test file.
|
|
63
|
+
private func docs() -> [Doc] {
|
|
64
|
+
let here = URL(fileURLWithPath: #filePath)
|
|
65
|
+
.deletingLastPathComponent() // ProjectNameSDKTests
|
|
66
|
+
.deletingLastPathComponent() // Tests
|
|
67
|
+
.deletingLastPathComponent() // swift (module dir)
|
|
68
|
+
let project = here.deletingLastPathComponent() // project (holds root README)
|
|
69
|
+
return [
|
|
70
|
+
Doc(label: "root README", path: project.appendingPathComponent("README.md").path),
|
|
71
|
+
Doc(label: "swift README.md", path: here.appendingPathComponent("README.md").path),
|
|
72
|
+
Doc(label: "swift REFERENCE.md", path: here.appendingPathComponent("REFERENCE.md").path),
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Extract every swift fenced block. Split on the triple-backtick fence:
|
|
77
|
+
// odd-indexed segments are the inside of a fenced block (info string on the
|
|
78
|
+
// first line, then the code). Only blocks whose info string is exactly
|
|
79
|
+
// "swift" are returned.
|
|
80
|
+
private func swiftBlocks(_ text: String) -> [String] {
|
|
81
|
+
let parts = text.components(separatedBy: fence)
|
|
82
|
+
var blocks: [String] = []
|
|
83
|
+
var i = 1
|
|
84
|
+
while i < parts.count {
|
|
85
|
+
let seg = parts[i]
|
|
86
|
+
let split = seg.split(separator: NL, maxSplits: 1, omittingEmptySubsequences: false)
|
|
87
|
+
let first = split.first.map { String($0) } ?? ""
|
|
88
|
+
let info = first.trimmingCharacters(in: .whitespaces)
|
|
89
|
+
if info == "swift" {
|
|
90
|
+
blocks.append(split.count > 1 ? String(split[1]) : "")
|
|
91
|
+
}
|
|
92
|
+
i += 2
|
|
93
|
+
}
|
|
94
|
+
return blocks
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// True when every open/close delimiter balances, ignoring characters inside
|
|
98
|
+
// string literals and line comments (a generated snippet never nests an
|
|
99
|
+
// unbalanced delimiter outside those, and this catches truncation).
|
|
100
|
+
private func balanced(_ block: String) -> Bool {
|
|
101
|
+
var stack: [Character] = []
|
|
102
|
+
var inString = false
|
|
103
|
+
var escaped = false
|
|
104
|
+
let chars = Array(block)
|
|
105
|
+
var i = 0
|
|
106
|
+
while i < chars.count {
|
|
107
|
+
let ch = chars[i]
|
|
108
|
+
if inString {
|
|
109
|
+
if escaped { escaped = false }
|
|
110
|
+
else if ch == "\\\\" { escaped = true }
|
|
111
|
+
else if ch == "\\"" { inString = false }
|
|
112
|
+
i += 1
|
|
113
|
+
continue
|
|
114
|
+
}
|
|
115
|
+
if ch == "\\"" { inString = true; i += 1; continue }
|
|
116
|
+
if ch == "/" && i + 1 < chars.count && chars[i + 1] == "/" {
|
|
117
|
+
while i < chars.count && chars[i] != NL { i += 1 }
|
|
118
|
+
continue
|
|
119
|
+
}
|
|
120
|
+
switch ch {
|
|
121
|
+
case "(": stack.append(")")
|
|
122
|
+
case "[": stack.append("]")
|
|
123
|
+
case "{": stack.append("}")
|
|
124
|
+
case ")", "]", "}":
|
|
125
|
+
if stack.isEmpty || stack.removeLast() != ch { return false }
|
|
126
|
+
default: break
|
|
127
|
+
}
|
|
128
|
+
i += 1
|
|
129
|
+
}
|
|
130
|
+
return stack.isEmpty && !inString
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private func read(_ path: String) -> String? {
|
|
134
|
+
return try? String(contentsOfFile: path, encoding: .utf8)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// PRESENCE: each doc that exists holds at least one swift block.
|
|
138
|
+
func testDocExamplesPresent() {
|
|
139
|
+
for doc in docs() {
|
|
140
|
+
guard let text = read(doc.path) else { continue }
|
|
141
|
+
let blocks = swiftBlocks(text)
|
|
142
|
+
XCTAssertGreaterThan(blocks.count, 0,
|
|
143
|
+
"expected at least one swift block in " + doc.label)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// STRUCTURE: every swift block's delimiters balance.
|
|
148
|
+
func testDocExamplesWellFormed() {
|
|
149
|
+
var failures: [String] = []
|
|
150
|
+
for doc in docs() {
|
|
151
|
+
guard let text = read(doc.path) else { continue }
|
|
152
|
+
let blocks = swiftBlocks(text)
|
|
153
|
+
var balancedCount = 0
|
|
154
|
+
for (i, b) in blocks.enumerated() {
|
|
155
|
+
if balanced(b) { balancedCount += 1 }
|
|
156
|
+
else { failures.append(doc.label + " swift block #" + String(i) + " has unbalanced delimiters") }
|
|
157
|
+
}
|
|
158
|
+
print("[readme-examples] " + doc.label + " swift blocks: total=" + String(blocks.count) + " balanced=" + String(balancedCount))
|
|
159
|
+
}
|
|
160
|
+
XCTAssertTrue(failures.isEmpty, failures.joined(separator: "; "))
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
`)
|
|
164
|
+
})
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
export {
|
|
169
|
+
ReadmeExamplesTest
|
|
170
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
const SDK = model.const.Name + 'SDK'
|
|
9
|
+
|
|
10
|
+
Content(`### Data as loose values
|
|
11
|
+
|
|
12
|
+
The Swift SDK uses a loose object model — the vendored \`Value\` enum
|
|
13
|
+
(with \`VMap\` / \`VList\` wrappers) throughout — rather than a bespoke typed
|
|
14
|
+
struct per endpoint. This mirrors the dynamic nature of the API and keeps the
|
|
15
|
+
SDK flexible: no regeneration is needed when the API schema changes.
|
|
16
|
+
|
|
17
|
+
Use the \`.asMap\` / \`.asList\` / \`.asString\` accessors to safely coerce a
|
|
18
|
+
\`Value\` to a concrete Swift type (each returns \`nil\` on a type mismatch).
|
|
19
|
+
A \`${model.const.Name}Types.swift\` file of reference \`struct\` types is also
|
|
20
|
+
generated for editor documentation.
|
|
21
|
+
|
|
22
|
+
### Project structure
|
|
23
|
+
|
|
24
|
+
\`\`\`
|
|
25
|
+
swift/
|
|
26
|
+
├── Package.swift -- SwiftPM manifest (zero runtime deps)
|
|
27
|
+
├── Sources/ProjectNameSDK/
|
|
28
|
+
│ ├── core/ -- Main client, config, entity base, error type
|
|
29
|
+
│ ├── entity/ -- Generated entity clients
|
|
30
|
+
│ ├── feature/ -- Built-in features (Base, Test, Log, ...)
|
|
31
|
+
│ ├── utility/ -- Utility functions
|
|
32
|
+
│ └── Struct/ -- Vendored Voxgig Struct port
|
|
33
|
+
└── Tests/ProjectNameSDKTests/ -- Test suites (XCTest)
|
|
34
|
+
\`\`\`
|
|
35
|
+
|
|
36
|
+
The main client class (\`${SDK}\`, under \`Sources/ProjectNameSDK/core\`)
|
|
37
|
+
exposes the entity accessors. Reference entity or utility types directly only
|
|
38
|
+
when needed. The SDK is dependency-free: JSON parsing is the vendored
|
|
39
|
+
\`Struct/JSON.swift\`, HTTP transport is Foundation's \`URLSession\`, and the
|
|
40
|
+
struct library is inlined under \`Struct/\`.
|
|
41
|
+
|
|
42
|
+
`)
|
|
43
|
+
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
ReadmeExplanation
|
|
49
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
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 { swiftVarName } from './utility_swift'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// A type-correct Swift `Value` literal for a field's canonical type.
|
|
13
|
+
function swiftLit(type: any): string {
|
|
14
|
+
const k = canonKey(type)
|
|
15
|
+
if ('INTEGER' === k) return '.int(1)'
|
|
16
|
+
if ('NUMBER' === k) return '.double(1.0)'
|
|
17
|
+
if ('BOOLEAN' === k) return '.bool(true)'
|
|
18
|
+
if ('ARRAY' === k) return '.list([])'
|
|
19
|
+
if ('OBJECT' === k) return '.map(VMap())'
|
|
20
|
+
return '.string("example")'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
|
|
25
|
+
const { target, ctx$: { model } } = props
|
|
26
|
+
|
|
27
|
+
const SDK = model.const.Name + 'SDK'
|
|
28
|
+
|
|
29
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
30
|
+
// Pick an entity with a real op (prefer a read op). primaryOp is null only
|
|
31
|
+
// when NO entity exposes any op (a direct()-only SDK).
|
|
32
|
+
const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
|
|
33
|
+
const eName = exampleEntity ? exampleEntity.Name : 'Entity'
|
|
34
|
+
const eVar = exampleEntity ? swiftVarName(exampleEntity.name) : 'entity'
|
|
35
|
+
// Model-driven id key: null when the entity has no id-like field, so a
|
|
36
|
+
// match op takes an empty match.
|
|
37
|
+
const idF = exampleEntity ? entityIdField(exampleEntity) : null
|
|
38
|
+
const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
|
|
39
|
+
let testArg = 'nil'
|
|
40
|
+
if (exampleEntity && isMatchOp) {
|
|
41
|
+
testArg = idF ? `VMap([("${idF}", .string("test01"))])` : 'nil'
|
|
42
|
+
} else if (exampleEntity && ('create' === primaryOp || 'update' === primaryOp)) {
|
|
43
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
44
|
+
.filter((it: any) => it.name !== idF && it.name !== 'id')
|
|
45
|
+
const required = items.filter((it: any) => !it.optional)
|
|
46
|
+
const chosen = required.length ? required : items.slice(0, 3)
|
|
47
|
+
testArg = `VMap([${chosen.map((it: any) =>
|
|
48
|
+
`("${it.name}", ${swiftLit(it.type)})`).join(', ')}])`
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// The op-driven test-mode line, shown only when the SDK has an entity op.
|
|
52
|
+
// A direct()-only SDK (no ops anywhere) shows a direct() call instead.
|
|
53
|
+
const testModeExample = primaryOp
|
|
54
|
+
? `// Entity ops return the bare record and throw on error.
|
|
55
|
+
let ${eVar} = try client.${eName}().${primaryOp}(${testArg}, nil)
|
|
56
|
+
// ${eVar} holds the mock response record
|
|
57
|
+
print(${eVar})`
|
|
58
|
+
: `let result = client.direct(VMap([
|
|
59
|
+
("path", .string("/api/resource")),
|
|
60
|
+
("method", .string("GET")),
|
|
61
|
+
]))
|
|
62
|
+
print(result)`
|
|
63
|
+
|
|
64
|
+
const apikeyEnvLine = isAuthActive(model)
|
|
65
|
+
? `\n${envName(model)}_APIKEY=<your-key>`
|
|
66
|
+
: ''
|
|
67
|
+
|
|
68
|
+
Content(`### Make a direct HTTP request
|
|
69
|
+
|
|
70
|
+
For endpoints not covered by entity methods:
|
|
71
|
+
|
|
72
|
+
\`\`\`swift
|
|
73
|
+
let result = client.direct(VMap([
|
|
74
|
+
("path", .string("/api/resource/{id}")),
|
|
75
|
+
("method", .string("GET")),
|
|
76
|
+
("params", .map([("id", .string("example"))])),
|
|
77
|
+
]))
|
|
78
|
+
|
|
79
|
+
if result.entries["ok"] == .bool(true) {
|
|
80
|
+
print(result.entries["status"] ?? .noval) // 200
|
|
81
|
+
print(result.entries["data"] ?? .noval) // response body
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// A non-2xx response carries status + data (the error body); a
|
|
85
|
+
// transport-level failure carries err instead. Only one is present, so
|
|
86
|
+
// an absent key simply reads as .noval.
|
|
87
|
+
print(result.entries["status"] ?? .noval, result.entries["err"] ?? .noval)
|
|
88
|
+
}
|
|
89
|
+
\`\`\`
|
|
90
|
+
|
|
91
|
+
### Prepare a request without sending it
|
|
92
|
+
|
|
93
|
+
\`\`\`swift
|
|
94
|
+
// prepare() returns the fetch definition and throws on error.
|
|
95
|
+
let fetchdef = try client.prepare(VMap([
|
|
96
|
+
("path", .string("/api/resource/{id}")),
|
|
97
|
+
("method", .string("DELETE")),
|
|
98
|
+
("params", .map([("id", .string("example"))])),
|
|
99
|
+
]))
|
|
100
|
+
|
|
101
|
+
print(fetchdef.entries["url"] ?? .noval)
|
|
102
|
+
print(fetchdef.entries["method"] ?? .noval)
|
|
103
|
+
print(fetchdef.entries["headers"] ?? .noval)
|
|
104
|
+
\`\`\`
|
|
105
|
+
|
|
106
|
+
### Use test mode
|
|
107
|
+
|
|
108
|
+
Create a mock client for unit testing — no server required:
|
|
109
|
+
|
|
110
|
+
\`\`\`swift
|
|
111
|
+
let client = ${SDK}.testSDK(nil, nil)
|
|
112
|
+
|
|
113
|
+
${testModeExample}
|
|
114
|
+
\`\`\`
|
|
115
|
+
|
|
116
|
+
### Use a custom fetch function
|
|
117
|
+
|
|
118
|
+
Replace the HTTP transport with your own \`SystemFetch\` closure:
|
|
119
|
+
|
|
120
|
+
\`\`\`swift
|
|
121
|
+
let fetch: SystemFetch = { url, _ in
|
|
122
|
+
let m = VMap()
|
|
123
|
+
m.entries["status"] = .int(200)
|
|
124
|
+
m.entries["statusText"] = .string("OK")
|
|
125
|
+
m.entries["headers"] = .map(VMap())
|
|
126
|
+
m.entries["json"] = .nat({ () -> Value in .map(VMap([("id", .string("mock01"))])) } as NativeCall0)
|
|
127
|
+
return .map(m)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let system = VMap()
|
|
131
|
+
system.entries["fetch"] = .nat(fetch)
|
|
132
|
+
let options = VMap()
|
|
133
|
+
options.entries["base"] = .string("http://localhost:8080")
|
|
134
|
+
options.entries["system"] = .map(system)
|
|
135
|
+
let client = ${SDK}(options)
|
|
136
|
+
\`\`\`
|
|
137
|
+
|
|
138
|
+
### Run live tests
|
|
139
|
+
|
|
140
|
+
Create a \`.env.local\` file at the project root:
|
|
141
|
+
|
|
142
|
+
\`\`\`
|
|
143
|
+
${envName(model)}_TEST_LIVE=TRUE${apikeyEnvLine}
|
|
144
|
+
\`\`\`
|
|
145
|
+
|
|
146
|
+
Then run:
|
|
147
|
+
|
|
148
|
+
\`\`\`bash
|
|
149
|
+
cd swift && make test
|
|
150
|
+
\`\`\`
|
|
151
|
+
|
|
152
|
+
`)
|
|
153
|
+
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
export {
|
|
158
|
+
ReadmeHowto
|
|
159
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
if (isPublished(model, target.name)) {
|
|
10
|
+
Content(`Add the package as a dependency in your \`Package.swift\`:
|
|
11
|
+
|
|
12
|
+
\`\`\`swift
|
|
13
|
+
dependencies: [
|
|
14
|
+
.package(url: "<repo-url>", from: "0.0.1"),
|
|
15
|
+
],
|
|
16
|
+
\`\`\`
|
|
17
|
+
|
|
18
|
+
Or build from a source checkout — the SDK is a plain SwiftPM package:
|
|
19
|
+
|
|
20
|
+
\`\`\`bash
|
|
21
|
+
cd swift && swift build
|
|
22
|
+
\`\`\`
|
|
23
|
+
|
|
24
|
+
`)
|
|
25
|
+
return
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Publish pending: not yet on the SwiftPM registry (git-tag only). The
|
|
29
|
+
// generated SDK is a dependency-free SwiftPM package (Foundation + the
|
|
30
|
+
// vendored Voxgig Struct port), so install it from the git release tag or a
|
|
31
|
+
// local source checkout and build with SwiftPM.
|
|
32
|
+
const { releasesUrl } = repoInfo(model)
|
|
33
|
+
Content(`This package is not yet published to a SwiftPM registry. The generated SDK
|
|
34
|
+
is a dependency-free SwiftPM package (Foundation only, plus the vendored
|
|
35
|
+
Voxgig Struct port). Depend on it from the GitHub release tag
|
|
36
|
+
(\`${target.name}/vX.Y.Z\`, see [Releases](${releasesUrl})) by adding it to
|
|
37
|
+
your \`Package.swift\`:
|
|
38
|
+
|
|
39
|
+
\`\`\`swift
|
|
40
|
+
dependencies: [
|
|
41
|
+
// From the git release tag:
|
|
42
|
+
.package(url: "<repo-url>", exact: "0.0.1"),
|
|
43
|
+
],
|
|
44
|
+
\`\`\`
|
|
45
|
+
|
|
46
|
+
Or build from a source checkout with SwiftPM:
|
|
47
|
+
|
|
48
|
+
\`\`\`bash
|
|
49
|
+
cd swift && swift build
|
|
50
|
+
\`\`\`
|
|
51
|
+
|
|
52
|
+
`)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
export {
|
|
57
|
+
ReadmeInstall
|
|
58
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
} from '@voxgig/apidef'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
const ReadmeIntro = cmp(function ReadmeIntro(props: any) {
|
|
11
|
+
const { target, ctx$: { model } } = props
|
|
12
|
+
const info = (model.main && model.main.kit && model.main.kit.info) || {}
|
|
13
|
+
const tagline = info.tagline || ''
|
|
14
|
+
|
|
15
|
+
Content(`# ${model.Name} ${target.title} SDK
|
|
16
|
+
|
|
17
|
+
${tagline}
|
|
18
|
+
|
|
19
|
+
The ${target.title} SDK for the ${model.Name} API — an entity-oriented client following idiomatic Swift conventions.
|
|
20
|
+
|
|
21
|
+
`)
|
|
22
|
+
|
|
23
|
+
// Emphasise the entity-oriented design: the SDK surfaces the API as
|
|
24
|
+
// capitalised, semantic Entities with a small, uniform verb set rather
|
|
25
|
+
// than raw URL paths and query strings. The example entity name is
|
|
26
|
+
// derived from the model, never hardcoded.
|
|
27
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
28
|
+
const exampleEntity = Object.values(entity || {})
|
|
29
|
+
.find((e: any) => e.active !== false) as any
|
|
30
|
+
const example = exampleEntity
|
|
31
|
+
? `for example \`client.${exampleEntity.Name}()\` — each`
|
|
32
|
+
: 'each'
|
|
33
|
+
|
|
34
|
+
// Model-driven op list — only the operations the active entities actually
|
|
35
|
+
// expose (a read-only entity has just list+load); never claim
|
|
36
|
+
// create/update/remove exist when no entity has them.
|
|
37
|
+
const CANON_OPS = ['list', 'load', 'create', 'update', 'remove']
|
|
38
|
+
const opSet = new Set<string>()
|
|
39
|
+
Object.values(entity || {}).forEach((e: any) => {
|
|
40
|
+
if (!e || e.active === false) return
|
|
41
|
+
Object.keys(e.op || {}).forEach((o: string) => {
|
|
42
|
+
if (e.op[o] && e.op[o].active !== false) opSet.add(o)
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
const opNames = CANON_OPS.filter((o) => opSet.has(o))
|
|
46
|
+
.concat([...opSet].filter((o) => !CANON_OPS.includes(o)))
|
|
47
|
+
const opList = (opNames.length ? opNames : ['list', 'load'])
|
|
48
|
+
.map((o) => '`' + o + '`').join(', ')
|
|
49
|
+
|
|
50
|
+
Content(`The SDK exposes the API as capitalised, semantic **Entities** — ${example}
|
|
51
|
+
carrying a small, uniform set of operations (${opList}) instead of raw URL
|
|
52
|
+
paths and query strings. You work with named resources and verbs, which
|
|
53
|
+
keeps the cognitive load low.
|
|
54
|
+
|
|
55
|
+
> Other languages, the CLI, and MCP server live alongside this one — see
|
|
56
|
+
> the [top-level README](../README.md).
|
|
57
|
+
|
|
58
|
+
`)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
export {
|
|
63
|
+
ReadmeIntro
|
|
64
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
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 { target, ctx$: { model } } = props
|
|
12
|
+
|
|
13
|
+
const SDK = model.const.Name + 'SDK'
|
|
14
|
+
const EntityBase = model.const.Name + 'EntityBase'
|
|
15
|
+
|
|
16
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
17
|
+
const entityList = each(entity).filter((e: any) => e.active !== false)
|
|
18
|
+
|
|
19
|
+
// Model-driven op rows for the shared entity interface: emit a
|
|
20
|
+
// load/list/create/update/remove row only for operations at least one active
|
|
21
|
+
// entity actually exposes — never document an operation no entity has.
|
|
22
|
+
const opUnion = new Set<string>()
|
|
23
|
+
entityList.forEach((e: any) => Object.keys(e.op || {})
|
|
24
|
+
.forEach((o: string) => { if (e.op[o] && e.op[o].active !== false) opUnion.add(o) }))
|
|
25
|
+
const opRowDefs: Record<string, string> = {
|
|
26
|
+
load: '| `load` | `(reqmatch, ctrl) throws -> Value` | Load a single entity by match criteria. Throws on error. |',
|
|
27
|
+
list: '| `list` | `(reqmatch, ctrl) throws -> Value` | List entities matching the criteria (a Value list). Throws on error. |',
|
|
28
|
+
create: '| `create` | `(reqdata, ctrl) throws -> Value` | Create a new entity. Throws on error. |',
|
|
29
|
+
update: '| `update` | `(reqdata, ctrl) throws -> Value` | Update an existing entity. Throws on error. |',
|
|
30
|
+
remove: '| `remove` | `(reqmatch, ctrl) throws -> Value` | Remove an entity. Throws on error. |',
|
|
31
|
+
}
|
|
32
|
+
const opRows = ['load', 'list', 'create', 'update', 'remove']
|
|
33
|
+
.filter((o) => opUnion.has(o)).map((o) => opRowDefs[o]).join('\n')
|
|
34
|
+
|
|
35
|
+
const apikeyOptionRow = isAuthActive(model)
|
|
36
|
+
? '| `apikey` | `String` | API key for authentication. |\n'
|
|
37
|
+
: ''
|
|
38
|
+
|
|
39
|
+
Content(`### ${SDK}
|
|
40
|
+
|
|
41
|
+
\`\`\`swift
|
|
42
|
+
let client = ${SDK}(options)
|
|
43
|
+
\`\`\`
|
|
44
|
+
|
|
45
|
+
Creates a new SDK client. \`options\` is a \`VMap\` of \`Value\`.
|
|
46
|
+
|
|
47
|
+
| Option | Type | Description |
|
|
48
|
+
| --- | --- | --- |
|
|
49
|
+
${apikeyOptionRow}| \`base\` | \`String\` | Base URL of the API server. |
|
|
50
|
+
| \`prefix\` | \`String\` | URL path prefix prepended to all requests. |
|
|
51
|
+
| \`suffix\` | \`String\` | URL path suffix appended to all requests. |
|
|
52
|
+
| \`feature\` | \`VMap\` | Feature activation flags. |
|
|
53
|
+
| \`extend\` | \`VList\` | Additional Feature instances to load. |
|
|
54
|
+
| \`system\` | \`VMap\` | System overrides (e.g. custom \`fetch\` function). |
|
|
55
|
+
|
|
56
|
+
### testSDK
|
|
57
|
+
|
|
58
|
+
\`\`\`swift
|
|
59
|
+
let client = ${SDK}.testSDK(testopts, sdkopts)
|
|
60
|
+
\`\`\`
|
|
61
|
+
|
|
62
|
+
Creates a test-mode client with mock transport. Both arguments may be \`nil\`.
|
|
63
|
+
|
|
64
|
+
### ${SDK} methods
|
|
65
|
+
|
|
66
|
+
| Method | Signature | Description |
|
|
67
|
+
| --- | --- | --- |
|
|
68
|
+
| \`optionsMap\` | \`() -> VMap\` | Deep copy of current SDK options. |
|
|
69
|
+
| \`getUtility\` | \`() -> Utility\` | Copy of the SDK utility object. |
|
|
70
|
+
| \`prepare\` | \`(fetchargs) throws -> VMap\` | Build an HTTP request definition without sending. Throws on error. |
|
|
71
|
+
| \`direct\` | \`(fetchargs) -> VMap\` | Build and send an HTTP request. Returns a result map (branch on \`ok\`). |
|
|
72
|
+
`)
|
|
73
|
+
|
|
74
|
+
each(entityList, (ent: any) => {
|
|
75
|
+
const article = /^[aeiou]/i.test(ent.Name) ? 'an' : 'a'
|
|
76
|
+
Content(`| \`${ent.Name}\` | \`(entopts) -> ${EntityBase}\` | Create ${article} ${ent.Name} entity instance. |
|
|
77
|
+
`)
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
Content(`
|
|
81
|
+
### Entity interface
|
|
82
|
+
|
|
83
|
+
All entities share the same interface.
|
|
84
|
+
|
|
85
|
+
| Method | Signature | Description |
|
|
86
|
+
| --- | --- | --- |
|
|
87
|
+
${opRows}
|
|
88
|
+
| \`data\` | \`(newdata?) -> Value\` | Get or set entity data. |
|
|
89
|
+
| \`matchv\` | \`(newmatch?) -> Value\` | Get or set entity match criteria. |
|
|
90
|
+
| \`make\` | \`() -> Entity\` | Create a new instance with the same options. |
|
|
91
|
+
| \`getName\` | \`() -> String\` | Return the entity name. |
|
|
92
|
+
|
|
93
|
+
### Result shape
|
|
94
|
+
|
|
95
|
+
Entity operations return the bare result data (a \`Value\` map for
|
|
96
|
+
single-entity ops, a \`Value\` list for \`list\`) and throw on error. Wrap
|
|
97
|
+
calls in \`do\`/\`catch\` to handle failures.
|
|
98
|
+
|
|
99
|
+
The \`direct()\` escape hatch never throws — it returns a result \`VMap\` you
|
|
100
|
+
branch on via \`result.entries["ok"]\`:
|
|
101
|
+
|
|
102
|
+
| Key | Type | Description |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
| \`ok\` | \`Bool\` | \`true\` if the HTTP status is 2xx. |
|
|
105
|
+
| \`status\` | \`Int\` | HTTP status code. |
|
|
106
|
+
| \`headers\` | \`VMap\` | Response headers. |
|
|
107
|
+
| \`data\` | \`Value\` | Parsed JSON response body. |
|
|
108
|
+
|
|
109
|
+
On error, \`ok\` is \`false\` and \`err\` contains the error value.
|
|
110
|
+
|
|
111
|
+
`)
|
|
112
|
+
|
|
113
|
+
// Entities summary
|
|
114
|
+
Content(`### Entities
|
|
115
|
+
|
|
116
|
+
`)
|
|
117
|
+
each(entityList, (ent: any) => {
|
|
118
|
+
const fields = ent.fields || []
|
|
119
|
+
const opnames = Object.keys(ent.op || {})
|
|
120
|
+
const ops = ent.op || {}
|
|
121
|
+
const points = each(ops).map((op: any) =>
|
|
122
|
+
op.points ? each(op.points) : []
|
|
123
|
+
).flat()
|
|
124
|
+
const path = points.length > 0 ? (points[0] as any).orig || '' : ''
|
|
125
|
+
|
|
126
|
+
Content(`#### ${ent.Name}
|
|
127
|
+
|
|
128
|
+
| Field | Description |
|
|
129
|
+
| --- | --- |
|
|
130
|
+
`)
|
|
131
|
+
each(fields, (field: any) => {
|
|
132
|
+
Content(`| \`${field.name}\` | ${field.short || ''} |
|
|
133
|
+
`)
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
Content(`
|
|
137
|
+
Operations: ${opnames.map((n: string) => n.charAt(0).toUpperCase() + n.slice(1)).join(', ')}.
|
|
138
|
+
|
|
139
|
+
API path: \`${path}\`
|
|
140
|
+
|
|
141
|
+
`)
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
export {
|
|
148
|
+
ReadmeModel
|
|
149
|
+
}
|