@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
package/src/helpers/canonType.ts
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
// Canonical type-sentinel -> language primitive type mapper.
|
|
2
2
|
//
|
|
3
|
-
// SOURCE OF TRUTH for the sentinel set: @voxgig/apidef
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
3
|
+
// SOURCE OF TRUTH for the sentinel set: @voxgig/apidef (`VALID_CANON` +
|
|
4
|
+
// `CANON_ONE`, exported from the package). VALID_CANON maps an OpenAPI type
|
|
5
|
+
// NAME -> a `$SENTINEL` string (e.g. 'string' -> `$STRING`). The model stores
|
|
6
|
+
// those sentinels on every `fields[].type` and op `points[].args.params[].type`.
|
|
7
|
+
// A multi-type (OpenAPI `type: [a, b]`) is stored as the ARRAY-shaped union
|
|
8
|
+
// sentinel `['`$ONE`', [member, ...]]` (see canonToType below).
|
|
8
9
|
//
|
|
9
10
|
// This table maps the SENTINEL the other way -> a concrete primitive type in
|
|
10
11
|
// each target language, so the typed-model generators (EntityTypes_<lang>.ts)
|
|
11
|
-
//
|
|
12
|
+
// and the README type columns (ReadmeRef_<lang>.ts / ReadmeEntity_<lang>.ts)
|
|
13
|
+
// can turn the model's field/param sentinels into real language types. It is
|
|
14
|
+
// the SINGLE mapping per language: components must not keep local copies.
|
|
12
15
|
//
|
|
13
|
-
// Kept as a small
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// languages) and keep the two in sync.
|
|
16
|
+
// Kept as a small mirror here (rather than importing VALID_CANON at runtime)
|
|
17
|
+
// because apidef is a peer dependency and the table is the INVERSE direction;
|
|
18
|
+
// `ts/test/canontype.test.ts` asserts this table covers apidef's exported
|
|
19
|
+
// sentinel vocabulary whenever apidef is installed, so drift fails the suite.
|
|
18
20
|
//
|
|
19
21
|
// KNOWN GAPS (papered over sanely, documented for the port):
|
|
20
22
|
// - Unknown / missing sentinel -> the language's "any" (never throws).
|
|
@@ -25,30 +27,99 @@
|
|
|
25
27
|
// language's open record/map type.
|
|
26
28
|
// - No enum/format/nullability beyond the `req` flag.
|
|
27
29
|
|
|
28
|
-
// Target languages sdkgen supports (go-cli / go-mcp reuse 'go').
|
|
29
|
-
|
|
30
|
+
// Target languages sdkgen supports (go-cli / go-mcp reuse 'go'). The targets
|
|
31
|
+
// with a fully dynamic value model (clojure, haskell, ocaml, perl, zig) have
|
|
32
|
+
// no column: they emit no typed models and document types via the language's
|
|
33
|
+
// dynamic Value/map vocabulary.
|
|
34
|
+
type CanonLang =
|
|
35
|
+
| 'ts' | 'js' | 'py' | 'php' | 'rb' | 'lua' | 'go'
|
|
36
|
+
| 'csharp' | 'java' | 'kotlin' | 'scala' | 'swift' | 'dart'
|
|
37
|
+
| 'rust' | 'c' | 'cpp' | 'elixir'
|
|
30
38
|
|
|
31
39
|
// Bare sentinel key (backticks + leading `$` stripped, upper-cased)
|
|
32
40
|
// -> per-language primitive type name.
|
|
33
41
|
//
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
//
|
|
42
|
+
// Column notes:
|
|
43
|
+
// - kotlin: every type is nullable (`?`) — the kotlin emitter drops
|
|
44
|
+
// per-member optionality because the column is already-nullable.
|
|
45
|
+
// - java/scala: boxed JVM types (nullable), so optionality needs no marker.
|
|
46
|
+
// - rust/c/cpp/swift: `Value`/`voxgig_value*`/`VMap` are the vendored
|
|
47
|
+
// dynamic value types those runtimes ship.
|
|
37
48
|
const CANON_TYPE: Record<string, Record<CanonLang, string>> = {
|
|
38
|
-
STRING: {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
STRING: {
|
|
50
|
+
ts: 'string', js: 'string', py: 'str', php: 'string', rb: 'String',
|
|
51
|
+
lua: 'string', go: 'string', csharp: 'string', java: 'String',
|
|
52
|
+
kotlin: 'String?', scala: 'String', swift: 'String', dart: 'String',
|
|
53
|
+
rust: 'String', c: 'char*', cpp: 'std::string', elixir: 'String.t()',
|
|
54
|
+
},
|
|
55
|
+
INTEGER: {
|
|
56
|
+
ts: 'number', js: 'number', py: 'int', php: 'int', rb: 'Integer',
|
|
57
|
+
lua: 'number', go: 'int', csharp: 'long', java: 'Long',
|
|
58
|
+
kotlin: 'Long?', scala: 'java.lang.Long', swift: 'Int', dart: 'int',
|
|
59
|
+
rust: 'i64', c: 'int64_t', cpp: 'int64_t', elixir: 'integer()',
|
|
60
|
+
},
|
|
61
|
+
NUMBER: {
|
|
62
|
+
ts: 'number', js: 'number', py: 'float', php: 'float', rb: 'Float',
|
|
63
|
+
lua: 'number', go: 'float64', csharp: 'double', java: 'Double',
|
|
64
|
+
kotlin: 'Double?', scala: 'java.lang.Double', swift: 'Double', dart: 'num',
|
|
65
|
+
rust: 'f64', c: 'double', cpp: 'double', elixir: 'float()',
|
|
66
|
+
},
|
|
67
|
+
BOOLEAN: {
|
|
68
|
+
ts: 'boolean', js: 'boolean', py: 'bool', php: 'bool', rb: 'Boolean',
|
|
69
|
+
lua: 'boolean', go: 'bool', csharp: 'bool', java: 'Boolean',
|
|
70
|
+
kotlin: 'Boolean?', scala: 'java.lang.Boolean', swift: 'Bool', dart: 'bool',
|
|
71
|
+
rust: 'bool', c: 'bool', cpp: 'bool', elixir: 'boolean()',
|
|
72
|
+
},
|
|
73
|
+
NULL: {
|
|
74
|
+
ts: 'null', js: 'null', py: 'None', php: 'null', rb: 'NilClass',
|
|
75
|
+
lua: 'nil', go: 'any', csharp: 'object?', java: 'Object',
|
|
76
|
+
kotlin: 'Any?', scala: 'Object', swift: 'Value', dart: 'Object',
|
|
77
|
+
rust: 'Value', c: 'voxgig_value*', cpp: 'Value', elixir: 'nil',
|
|
78
|
+
},
|
|
79
|
+
ARRAY: {
|
|
80
|
+
ts: 'any[]', js: 'Array', py: 'list', php: 'array', rb: 'Array',
|
|
81
|
+
lua: 'table', go: '[]any', csharp: 'List<object?>', java: 'List<Object>',
|
|
82
|
+
kotlin: 'List<Any?>?', scala: 'java.util.List[Object]', swift: '[Value]',
|
|
83
|
+
dart: 'List<dynamic>', rust: 'Vec<Value>', c: 'voxgig_value*',
|
|
84
|
+
cpp: 'std::vector<Value>', elixir: 'list()',
|
|
85
|
+
},
|
|
86
|
+
OBJECT: {
|
|
87
|
+
ts: 'Record<string, any>', js: 'Object', py: 'dict', php: 'array',
|
|
88
|
+
rb: 'Hash', lua: 'table', go: 'map[string]any',
|
|
89
|
+
csharp: 'Dictionary<string, object?>', java: 'Map<String, Object>',
|
|
90
|
+
kotlin: 'Map<String, Any?>?', scala: 'java.util.Map[String, Object]',
|
|
91
|
+
swift: 'VMap', dart: 'Map<String, dynamic>',
|
|
92
|
+
rust: 'std::collections::HashMap<String, Value>', c: 'voxgig_value*',
|
|
93
|
+
cpp: 'std::map<std::string, Value>', elixir: 'map()',
|
|
94
|
+
},
|
|
95
|
+
ANY: {
|
|
96
|
+
ts: 'any', js: '*', py: 'Any', php: 'mixed', rb: 'Object',
|
|
97
|
+
lua: 'any', go: 'any', csharp: 'object?', java: 'Object',
|
|
98
|
+
kotlin: 'Any?', scala: 'Object', swift: 'Value', dart: 'dynamic',
|
|
99
|
+
rust: 'Value', c: 'voxgig_value*', cpp: 'Value', elixir: 'any()',
|
|
100
|
+
},
|
|
46
101
|
}
|
|
47
102
|
|
|
48
103
|
// Per-language fallback for unknown / missing sentinels.
|
|
49
104
|
// js uses JSDoc's `*` (any type); lua uses `any` (LuaLS).
|
|
50
105
|
const CANON_ANY: Record<CanonLang, string> = {
|
|
51
|
-
ts: 'any', js: '*', py: 'Any', php: 'mixed', rb: 'Object',
|
|
106
|
+
ts: 'any', js: '*', py: 'Any', php: 'mixed', rb: 'Object',
|
|
107
|
+
lua: 'any', go: 'any', csharp: 'object?', java: 'Object',
|
|
108
|
+
kotlin: 'Any?', scala: 'Object', swift: 'Value', dart: 'dynamic',
|
|
109
|
+
rust: 'Value', c: 'voxgig_value*', cpp: 'Value', elixir: 'any()',
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Union ($ONE) member separator for languages with a native union/sum type
|
|
113
|
+
// syntax. Languages absent here have no way to express an anonymous union in
|
|
114
|
+
// a type position, so a $ONE sentinel degrades to that language's "any".
|
|
115
|
+
// (php 8 unions exist but cannot combine with the `?` optional prefix the
|
|
116
|
+
// emitters use, so php deliberately degrades to `mixed`.)
|
|
117
|
+
const CANON_UNION_JOIN: Partial<Record<CanonLang, string>> = {
|
|
118
|
+
ts: ' | ',
|
|
119
|
+
js: '|',
|
|
120
|
+
py: ' | ',
|
|
121
|
+
lua: '|',
|
|
122
|
+
elixir: ' | ',
|
|
52
123
|
}
|
|
53
124
|
|
|
54
125
|
|
|
@@ -64,10 +135,29 @@ function canonKey(sentinel: unknown): string {
|
|
|
64
135
|
|
|
65
136
|
// Map a field/param type sentinel to a target-language primitive type.
|
|
66
137
|
// Unknown or missing sentinel -> that language's "any" (never throws).
|
|
138
|
+
//
|
|
139
|
+
// The union sentinel `['`$ONE`', [member, ...]]` (apidef CANON_ONE, produced
|
|
140
|
+
// for OpenAPI multi-types) renders as a joined member union in languages with
|
|
141
|
+
// union syntax (see CANON_UNION_JOIN); elsewhere it degrades to "any".
|
|
142
|
+
// Members may themselves be unions (handled recursively) or the literal
|
|
143
|
+
// 'Any' apidef emits for an unknown member name (canonKey maps it to ANY).
|
|
67
144
|
function canonToType(sentinel: unknown, lang: string): string {
|
|
68
145
|
const l = lang as CanonLang
|
|
69
146
|
const fallback = CANON_ANY[l] ?? 'any'
|
|
70
147
|
|
|
148
|
+
if (Array.isArray(sentinel)) {
|
|
149
|
+
if ('ONE' === canonKey(sentinel[0]) && Array.isArray(sentinel[1])) {
|
|
150
|
+
const join = CANON_UNION_JOIN[l]
|
|
151
|
+
if (null == join) {
|
|
152
|
+
return fallback
|
|
153
|
+
}
|
|
154
|
+
const members = sentinel[1].map((m: unknown) => canonToType(m, l))
|
|
155
|
+
const uniq = members.filter((m: string, i: number) => members.indexOf(m) === i)
|
|
156
|
+
return 0 === uniq.length ? fallback : uniq.join(join)
|
|
157
|
+
}
|
|
158
|
+
return fallback
|
|
159
|
+
}
|
|
160
|
+
|
|
71
161
|
const row = CANON_TYPE[canonKey(sentinel)]
|
|
72
162
|
if (null == row) {
|
|
73
163
|
return fallback
|
|
@@ -82,6 +172,7 @@ export {
|
|
|
82
172
|
canonKey,
|
|
83
173
|
CANON_TYPE,
|
|
84
174
|
CANON_ANY,
|
|
175
|
+
CANON_UNION_JOIN,
|
|
85
176
|
}
|
|
86
177
|
|
|
87
178
|
export type {
|
package/src/helpers/naming.ts
CHANGED
|
@@ -83,7 +83,54 @@ function safeVarName(name: string, lang: string): string {
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
|
|
86
|
+
// A variable name for a doc EXAMPLE entity. Doc examples bind the SDK instance
|
|
87
|
+
// to `client` (e.g. `const client = ...SDK.test()`), so an entity whose
|
|
88
|
+
// lowercased name is also `client` — an API with a `Client` entity — would
|
|
89
|
+
// shadow it: `const client = client.Client()...` is self-referential (TS2448/
|
|
90
|
+
// TS7022) and breaks the readme_examples type-check. Append `_` to keep the
|
|
91
|
+
// example variable distinct from the SDK instance. Also applies the normal
|
|
92
|
+
// language-reserved-word guard.
|
|
93
|
+
function exampleVarName(name: string, lang: string): string {
|
|
94
|
+
const v = safeVarName(name, lang)
|
|
95
|
+
return 'client' === v ? v + '_' : v
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
// A valid ECMAScript identifier — the only shape `obj.name` can express.
|
|
100
|
+
const JS_IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
// A safe JS/TS property-access expression for a SPEC-DERIVED key: dot
|
|
104
|
+
// notation when the key is a valid identifier, bracket notation otherwise.
|
|
105
|
+
// OpenAPI path/query parameter names are not constrained to identifiers —
|
|
106
|
+
// e.g. Evervault's `/payments/3ds-sessions/{3ds_session_id}` yields
|
|
107
|
+
// `3ds_session_id`, and `params.3ds_session_id` is a syntax error (TS1434).
|
|
108
|
+
// The other language targets already quote these keys (`params["..."]`);
|
|
109
|
+
// this keeps ts/js in parity.
|
|
110
|
+
function jsProp(obj: string, name: string): string {
|
|
111
|
+
return JS_IDENT.test(name) ? `${obj}.${name}` : `${obj}[${JSON.stringify(name)}]`
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
// A safe JS/TS OBJECT-LITERAL key for a spec-derived field name: bare when
|
|
116
|
+
// the name is a valid identifier, single-quoted otherwise. `{ 3ds_session_id:
|
|
117
|
+
// 1 }` is a syntax error (TS1351) — doc examples must quote such keys.
|
|
118
|
+
function jsKey(name: string): string {
|
|
119
|
+
return JS_IDENT.test(name) ? name : `'${name}'`
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
// As `jsProp`, but optional-chained: `obj?.name` / `obj?.["3ds_session_id"]`.
|
|
124
|
+
function jsOptProp(obj: string, name: string): string {
|
|
125
|
+
return JS_IDENT.test(name) ? `${obj}?.${name}` : `${obj}?.[${JSON.stringify(name)}]`
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
86
129
|
export {
|
|
87
130
|
isReservedName,
|
|
88
131
|
safeVarName,
|
|
132
|
+
exampleVarName,
|
|
133
|
+
jsProp,
|
|
134
|
+
jsOptProp,
|
|
135
|
+
jsKey,
|
|
89
136
|
}
|
package/src/helpers/opExample.ts
CHANGED
|
@@ -52,15 +52,48 @@ function idLiteral(ent: any, op: string, idF: string | null): string {
|
|
|
52
52
|
|
|
53
53
|
// Render a match object `{ idF: idLit }` (or empty when the entity has no id
|
|
54
54
|
// key) in the target language's object syntax.
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
// Spec-derived field names are NOT constrained to be identifiers — e.g.
|
|
56
|
+
// Evervault's `/payments/3ds-sessions/{3ds_session_id}` yields the match key
|
|
57
|
+
// `3ds_session_id`. py/php/rb/go quote every literal key already, but ts/js
|
|
58
|
+
// (`{ key: v }`) and lua (`{ key = v }`) write them bare, and a leading digit
|
|
59
|
+
// or a `-` makes that a syntax error (TS1351 / Lua "'}' expected"). Quote
|
|
60
|
+
// exactly those, leaving ordinary keys in the idiomatic bare form.
|
|
61
|
+
const JS_IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/
|
|
62
|
+
const LUA_IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/
|
|
63
|
+
|
|
64
|
+
// A `key<sep>value` literal pair in the target language's object syntax.
|
|
65
|
+
function litPair(lang: ExampleLang, name: string, value: string): string {
|
|
57
66
|
switch (lang) {
|
|
58
|
-
case 'py': return `
|
|
59
|
-
case 'php': return `
|
|
60
|
-
case 'rb': return `
|
|
61
|
-
case '
|
|
62
|
-
case '
|
|
63
|
-
|
|
67
|
+
case 'py': return `"${name}": ${value}`
|
|
68
|
+
case 'php': return `"${name}" => ${value}`
|
|
69
|
+
case 'rb': return `"${name}" => ${value}`
|
|
70
|
+
case 'go': return `"${name}": ${value}`
|
|
71
|
+
case 'lua': return LUA_IDENT.test(name) ?
|
|
72
|
+
`${name} = ${value}` : `["${name}"] = ${value}`
|
|
73
|
+
default: return JS_IDENT.test(name) ?
|
|
74
|
+
`${name}: ${value}` : `'${name}': ${value}`
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
// The match argument for a load/remove — ALL required match params, not just
|
|
80
|
+
// the primary id. A composite-match entity (e.g. Umbrella's FlatPermission,
|
|
81
|
+
// `/public/database/{id}/permission/{msisdn}`) has two required path params
|
|
82
|
+
// (database_id + id); emitting only `{ id }` fails the typed <Name>LoadMatch.
|
|
83
|
+
// The idF field takes the specific id literal; other required fields take a
|
|
84
|
+
// type-correct example value (mirrors dataArg).
|
|
85
|
+
function matchArg(
|
|
86
|
+
lang: ExampleLang, ent: any, op: string, idF: string | null, idLit: string
|
|
87
|
+
): string {
|
|
88
|
+
const items = opRequestShape(ent, op).items.filter((it: any) => !it.optional)
|
|
89
|
+
if (0 === items.length) return 'go' === lang ? 'nil' : ''
|
|
90
|
+
const pairs = items.map((it: any) =>
|
|
91
|
+
litPair(lang, it.name, it.name === idF ? idLit : litFor(lang, it.type)))
|
|
92
|
+
switch (lang) {
|
|
93
|
+
case 'py': return `{${pairs.join(', ')}}`
|
|
94
|
+
case 'php': return `[${pairs.join(', ')}]`
|
|
95
|
+
case 'go': return `map[string]any{${pairs.join(', ')}}`
|
|
96
|
+
default: return `{ ${pairs.join(', ')} }`
|
|
64
97
|
}
|
|
65
98
|
}
|
|
66
99
|
|
|
@@ -75,17 +108,7 @@ function dataArg(lang: ExampleLang, ent: any, op: string, idF: string | null): s
|
|
|
75
108
|
// ALL required fields must appear (a typed CreateData rejects a partial); cap
|
|
76
109
|
// only the optional fallback used when the op declares no required field.
|
|
77
110
|
const chosen = required.length ? required : items.slice(0, 3)
|
|
78
|
-
const pairs = chosen.map((it: any) =>
|
|
79
|
-
const v = litFor(lang, it.type)
|
|
80
|
-
switch (lang) {
|
|
81
|
-
case 'py': return `"${it.name}": ${v}`
|
|
82
|
-
case 'php': return `"${it.name}" => ${v}`
|
|
83
|
-
case 'rb': return `"${it.name}" => ${v}`
|
|
84
|
-
case 'lua': return `${it.name} = ${v}`
|
|
85
|
-
case 'go': return `"${it.name}": ${v}`
|
|
86
|
-
default: return `${it.name}: ${v}`
|
|
87
|
-
}
|
|
88
|
-
})
|
|
111
|
+
const pairs = chosen.map((it: any) => litPair(lang, it.name, litFor(lang, it.type)))
|
|
89
112
|
switch (lang) {
|
|
90
113
|
case 'php': return `[${pairs.join(', ')}]`
|
|
91
114
|
case 'lua': return `{ ${pairs.join(', ')} }`
|
|
@@ -139,7 +162,7 @@ function primaryOpCall(
|
|
|
139
162
|
if (isList) {
|
|
140
163
|
arg = 'go' === lang ? 'nil' : ''
|
|
141
164
|
} else if (isMatch) {
|
|
142
|
-
arg = matchArg(lang, idF, idLit)
|
|
165
|
+
arg = matchArg(lang, ent, op, idF, idLit)
|
|
143
166
|
} else if (isData) {
|
|
144
167
|
arg = dataArg(lang, ent, op, idF)
|
|
145
168
|
} else {
|
package/src/helpers/opShape.ts
CHANGED
|
@@ -305,6 +305,64 @@ function entityClassName(ent: any, entityColl: any): string {
|
|
|
305
305
|
}
|
|
306
306
|
|
|
307
307
|
|
|
308
|
+
// Cross-entity TYPE-name collision detection. entityClassNames keeps CLASS
|
|
309
|
+
// names collision-free, but the DATA/op type names are the raw `<Name>` /
|
|
310
|
+
// opTypeName(...) — two entities whose PascalCase Name coincides (e.g.
|
|
311
|
+
// `foo-bar` vs `foo_bar`), or a data-type name equal to another entity's
|
|
312
|
+
// op-type name, emit DUPLICATE top-level type declarations: a redeclaration
|
|
313
|
+
// compile error in go/rust/c/cpp/csharp and the JVM containers, silent
|
|
314
|
+
// merging in ts. The names cannot be auto-renamed here — the generated
|
|
315
|
+
// entity classes and op fragments reference them by token — so the guard
|
|
316
|
+
// surfaces the collision loudly instead. Returns the sorted duplicate names
|
|
317
|
+
// (empty when clean). Callers must have derived `Name` on each entity
|
|
318
|
+
// (every EntityTypes emitter does).
|
|
319
|
+
//
|
|
320
|
+
// Memoised per entity-collection object, like entityClassNames.
|
|
321
|
+
const _typeCollisionCache = new WeakMap<object, string[]>()
|
|
322
|
+
|
|
323
|
+
function entityTypeCollisions(entityColl: any): string[] {
|
|
324
|
+
const cached = _typeCollisionCache.get(entityColl)
|
|
325
|
+
if (null != cached) {
|
|
326
|
+
return cached
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const counts: Record<string, number> = {}
|
|
330
|
+
const bump = (n: string) => { counts[n] = (counts[n] || 0) + 1 }
|
|
331
|
+
|
|
332
|
+
each(entityColl)
|
|
333
|
+
.filter((e: any) => e && null != e.name && null != e.Name)
|
|
334
|
+
.forEach((e: any) => {
|
|
335
|
+
bump(e.Name)
|
|
336
|
+
for (const op of ['load', 'list', 'create', 'update', 'remove']) {
|
|
337
|
+
if (e.op && e.op[op]) {
|
|
338
|
+
bump(opTypeName(e.Name, op))
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
})
|
|
342
|
+
|
|
343
|
+
const out = Object.keys(counts).filter((n) => 1 < counts[n]).sort()
|
|
344
|
+
_typeCollisionCache.set(entityColl, out)
|
|
345
|
+
return out
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
// Emitter convenience: warn (once per collection per target run) when the
|
|
350
|
+
// generated typed model would contain duplicate top-level type names.
|
|
351
|
+
function warnEntityTypeCollisions(entityColl: any, log: any, lang: string): string[] {
|
|
352
|
+
const dups = entityTypeCollisions(entityColl)
|
|
353
|
+
if (0 < dups.length && log && log.warn) {
|
|
354
|
+
log.warn({
|
|
355
|
+
point: 'entity-types-name-collision', lang, names: dups,
|
|
356
|
+
note: `${lang}: duplicate generated type name(s) ${dups.join(', ')} — ` +
|
|
357
|
+
`two entities produce the same PascalCase type name; rename one ` +
|
|
358
|
+
`entity (or alias it) in the model or the generated typed model ` +
|
|
359
|
+
`will not compile in statically-typed targets`,
|
|
360
|
+
})
|
|
361
|
+
}
|
|
362
|
+
return dups
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
|
|
308
366
|
// Pick a representative entity for a single illustrative snippet (e.g. the
|
|
309
367
|
// README's test-mode example): the first ACTIVE entity that exposes a read
|
|
310
368
|
// op (list/load) so the snippet is meaningful, else the first with ANY
|
|
@@ -315,16 +373,55 @@ function entityClassName(ent: any, entityColl: any): string {
|
|
|
315
373
|
// for deterministic output.
|
|
316
374
|
function pickExampleEntity(entity: any): { entity: any, primaryOp: string | null } {
|
|
317
375
|
const actives = each(entity).filter((e: any) => e && e.active !== false)
|
|
318
|
-
const readable = actives.
|
|
376
|
+
const readable = actives.filter((e: any) => {
|
|
319
377
|
const op = entityPrimaryOp(e)
|
|
320
378
|
return 'list' === op || 'load' === op
|
|
321
379
|
})
|
|
322
|
-
const withOp = actives.
|
|
323
|
-
|
|
380
|
+
const withOp = actives.filter((e: any) => null != entityPrimaryOp(e))
|
|
381
|
+
// Prefer a readable entity, then any entity with an op, then anything at all.
|
|
382
|
+
// WITHIN the chosen tier pick an entity of MEDIAN "size" — median name length
|
|
383
|
+
// and median field count — so the generated README/examples showcase a
|
|
384
|
+
// representative entity, not the alphabetically-first one (often a degenerate
|
|
385
|
+
// stub with a terse name and no fields) nor an atypically sprawling one.
|
|
386
|
+
const pool = readable.length ? readable : (withOp.length ? withOp : actives)
|
|
387
|
+
const chosen = pickMedianEntity(pool)
|
|
324
388
|
return { entity: chosen, primaryOp: null == chosen ? null : entityPrimaryOp(chosen) }
|
|
325
389
|
}
|
|
326
390
|
|
|
327
391
|
|
|
392
|
+
// The pool entity closest to the median on both axes (name length, field
|
|
393
|
+
// count). Distance on each axis is normalised by that axis's own median so the
|
|
394
|
+
// two are comparable, then summed. Ties keep the pool's existing key-sorted
|
|
395
|
+
// order (each() is byte-stable), so the pick is deterministic.
|
|
396
|
+
function pickMedianEntity(pool: any[]): any {
|
|
397
|
+
if (0 === pool.length) return null
|
|
398
|
+
if (1 === pool.length) return pool[0]
|
|
399
|
+
const fieldCount = (e: any): number => (e && e.fields ? each(e.fields).length : 0)
|
|
400
|
+
const nameLen = (e: any): number => (e && e.name ? String(e.name).length : 0)
|
|
401
|
+
const medName = medianOf(pool.map(nameLen))
|
|
402
|
+
const medField = medianOf(pool.map(fieldCount))
|
|
403
|
+
let best = pool[0]
|
|
404
|
+
let bestScore = Infinity
|
|
405
|
+
for (const e of pool) {
|
|
406
|
+
const score =
|
|
407
|
+
Math.abs(nameLen(e) - medName) / (medName || 1) +
|
|
408
|
+
Math.abs(fieldCount(e) - medField) / (medField || 1)
|
|
409
|
+
if (score < bestScore) {
|
|
410
|
+
bestScore = score
|
|
411
|
+
best = e
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return best
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
function medianOf(xs: number[]): number {
|
|
419
|
+
const s = xs.slice().sort((a, b) => a - b)
|
|
420
|
+
const m = Math.floor(s.length / 2)
|
|
421
|
+
return 0 === s.length ? 0 : (s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2)
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
|
|
328
425
|
// The id field on the entity's DATA type (its fields[]), or null. DISTINCT from
|
|
329
426
|
// entityIdField (the load-MATCH key): an API can model a load match that carries
|
|
330
427
|
// an `id` param while the response entity itself has no `id` field, so `.id`
|
|
@@ -356,6 +453,8 @@ export {
|
|
|
356
453
|
entityPrimaryOp,
|
|
357
454
|
pickExampleEntity,
|
|
358
455
|
entityClassName,
|
|
456
|
+
entityTypeCollisions,
|
|
457
|
+
warnEntityTypeCollisions,
|
|
359
458
|
}
|
|
360
459
|
|
|
361
460
|
export type {
|
package/src/sdkgen.ts
CHANGED
|
@@ -51,8 +51,8 @@ import { getMatchEntries } from './helpers/getMatchEntries'
|
|
|
51
51
|
import { collectDeps } from './helpers/collectDeps'
|
|
52
52
|
import type { DepEntry } from './helpers/collectDeps'
|
|
53
53
|
import { canonToType, canonKey } from './helpers/canonType'
|
|
54
|
-
import { OP_SUFFIX, opTypeName, opParams, opRequestShape, entityIdField, entityDataIdField, entityOps, entityPrimaryOp, pickExampleEntity, entityClassName } from './helpers/opShape'
|
|
55
|
-
import { isReservedName, safeVarName } from './helpers/naming'
|
|
54
|
+
import { OP_SUFFIX, opTypeName, opParams, opRequestShape, entityIdField, entityDataIdField, entityOps, entityPrimaryOp, pickExampleEntity, entityClassName, entityTypeCollisions, warnEntityTypeCollisions } from './helpers/opShape'
|
|
55
|
+
import { isReservedName, safeVarName, exampleVarName, jsProp, jsOptProp, jsKey } from './helpers/naming'
|
|
56
56
|
import {
|
|
57
57
|
packageName,
|
|
58
58
|
installCommand,
|
|
@@ -471,8 +471,14 @@ export {
|
|
|
471
471
|
entityPrimaryOp,
|
|
472
472
|
pickExampleEntity,
|
|
473
473
|
entityClassName,
|
|
474
|
+
entityTypeCollisions,
|
|
475
|
+
warnEntityTypeCollisions,
|
|
474
476
|
isReservedName,
|
|
475
477
|
safeVarName,
|
|
478
|
+
exampleVarName,
|
|
479
|
+
jsProp,
|
|
480
|
+
jsOptProp,
|
|
481
|
+
jsKey,
|
|
476
482
|
|
|
477
483
|
packageName,
|
|
478
484
|
installCommand,
|
package/src/tsconfig.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
"esModuleInterop": true,
|
|
4
|
+
"composite": true,
|
|
4
5
|
"module": "nodenext",
|
|
5
6
|
"noEmitOnError": true,
|
|
6
7
|
"skipLibCheck": true,
|
|
@@ -10,6 +11,7 @@
|
|
|
10
11
|
"sourceMap": true,
|
|
11
12
|
"strict": true,
|
|
12
13
|
"target": "es2021",
|
|
14
|
+
"types": ["node"],
|
|
13
15
|
"declaration": true,
|
|
14
16
|
"declarationDir": "../dist"
|
|
15
17
|
}
|