@voxgig/sdkgen 2.0.2 → 3.1.0
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 +22 -2
- package/dist/action/doctor.d.ts +14 -0
- package/dist/action/doctor.js +351 -0
- package/dist/action/doctor.js.map +1 -0
- package/dist/action/feature.js +48 -9
- package/dist/action/feature.js.map +1 -1
- package/dist/action/target.d.ts +6 -1
- package/dist/action/target.js +134 -22
- package/dist/action/target.js.map +1 -1
- package/dist/cmp/Entity.js +5 -0
- package/dist/cmp/Entity.js.map +1 -1
- package/dist/cmp/ExternalTarget.d.ts +2 -0
- package/dist/cmp/ExternalTarget.js +104 -0
- package/dist/cmp/ExternalTarget.js.map +1 -0
- package/dist/cmp/Feature.js +2 -1
- package/dist/cmp/Feature.js.map +1 -1
- package/dist/cmp/Main.js +5 -1
- package/dist/cmp/Main.js.map +1 -1
- package/dist/cmp/ReadmeExplanation.js +1 -1
- package/dist/cmp/ReadmeExplanation.js.map +1 -1
- package/dist/cmp/ReadmeTop.js +16 -6
- package/dist/cmp/ReadmeTop.js.map +1 -1
- package/dist/cmp/Registered.d.ts +7 -0
- package/dist/cmp/Registered.js +70 -0
- package/dist/cmp/Registered.js.map +1 -0
- package/dist/cmp/Test.js +3 -1
- package/dist/cmp/Test.js.map +1 -1
- package/dist/helpers/dryrun.d.ts +10 -0
- package/dist/helpers/dryrun.js +35 -0
- package/dist/helpers/dryrun.js.map +1 -0
- package/dist/helpers/featureSource.d.ts +13 -0
- package/dist/helpers/featureSource.js +156 -0
- package/dist/helpers/featureSource.js.map +1 -0
- package/dist/helpers/naming.d.ts +9 -1
- package/dist/helpers/naming.js +66 -2
- package/dist/helpers/naming.js.map +1 -1
- package/dist/helpers/opExample.js +23 -3
- package/dist/helpers/opExample.js.map +1 -1
- package/dist/helpers/opShape.d.ts +11 -1
- package/dist/helpers/opShape.js +51 -0
- package/dist/helpers/opShape.js.map +1 -1
- package/dist/helpers/packageMeta.d.ts +16 -1
- package/dist/helpers/packageMeta.js +181 -10
- package/dist/helpers/packageMeta.js.map +1 -1
- package/dist/helpers/stdrep.d.ts +3 -0
- package/dist/helpers/stdrep.js +47 -0
- package/dist/helpers/stdrep.js.map +1 -0
- package/dist/helpers/testPolicy.d.ts +2 -0
- package/dist/helpers/testPolicy.js +46 -0
- package/dist/helpers/testPolicy.js.map +1 -0
- package/dist/sdkgen.d.ts +15 -6
- package/dist/sdkgen.js +273 -5
- package/dist/sdkgen.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/utility.js +10 -1
- package/dist/utility.js.map +1 -1
- package/model/sdkgen.aontu +245 -0
- package/package.json +5 -3
- package/project/.sdk/model/target/c.aontu +28 -3
- package/project/.sdk/model/target/clojure.aontu +24 -3
- package/project/.sdk/model/target/cpp.aontu +25 -3
- package/project/.sdk/model/target/csharp.aontu +25 -3
- package/project/.sdk/model/target/dart.aontu +15 -3
- package/project/.sdk/model/target/elixir.aontu +15 -3
- package/project/.sdk/model/target/go-cli.aontu +16 -1
- package/project/.sdk/model/target/go-mcp.aontu +16 -1
- package/project/.sdk/model/target/go.aontu +14 -4
- package/project/.sdk/model/target/haskell.aontu +24 -3
- package/project/.sdk/model/target/java.aontu +25 -3
- package/project/.sdk/model/target/js.aontu +15 -3
- package/project/.sdk/model/target/kotlin.aontu +25 -3
- package/project/.sdk/model/target/lean.aontu +24 -3
- package/project/.sdk/model/target/lua.aontu +15 -3
- package/project/.sdk/model/target/ocaml.aontu +24 -3
- package/project/.sdk/model/target/perl.aontu +15 -3
- package/project/.sdk/model/target/php.aontu +15 -3
- package/project/.sdk/model/target/py-data.aontu +15 -3
- package/project/.sdk/model/target/py.aontu +15 -3
- package/project/.sdk/model/target/rb.aontu +15 -3
- package/project/.sdk/model/target/rust.aontu +25 -3
- package/project/.sdk/model/target/scala.aontu +24 -3
- package/project/.sdk/model/target/seneca-provider.aontu +118 -0
- package/project/.sdk/model/target/swift.aontu +25 -3
- package/project/.sdk/model/target/ts.aontu +15 -3
- package/project/.sdk/model/target/zig.aontu +25 -3
- package/project/.sdk/src/cmp/c/Config_c.ts +10 -11
- package/project/.sdk/src/cmp/c/Entity_c.ts +5 -1
- package/project/.sdk/src/cmp/c/fragment/Entity.fragment.c +23 -5
- package/project/.sdk/src/cmp/c/fragment/EntityCreateOp.fragment.c +9 -2
- package/project/.sdk/src/cmp/c/fragment/EntityListOp.fragment.c +19 -2
- package/project/.sdk/src/cmp/c/fragment/EntityLoadOp.fragment.c +9 -2
- package/project/.sdk/src/cmp/c/fragment/EntityRemoveOp.fragment.c +12 -2
- package/project/.sdk/src/cmp/c/fragment/EntityUpdateOp.fragment.c +9 -2
- package/project/.sdk/src/cmp/c/fragment/Main.fragment.c +1 -0
- package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +6 -3
- package/project/.sdk/src/cmp/clojure/fragment/Entity.fragment.clj +18 -1
- package/project/.sdk/src/cmp/clojure/fragment/EntityCreateOp.fragment.clj +2 -2
- package/project/.sdk/src/cmp/clojure/fragment/EntityLoadOp.fragment.clj +2 -2
- package/project/.sdk/src/cmp/clojure/fragment/EntityRemoveOp.fragment.clj +12 -8
- package/project/.sdk/src/cmp/clojure/fragment/EntityUpdateOp.fragment.clj +2 -2
- package/project/.sdk/src/cmp/cpp/Entity_cpp.ts +5 -1
- package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +12 -9
- package/project/.sdk/src/cmp/cpp/fragment/EntityCreateOp.fragment.cpp +8 -2
- package/project/.sdk/src/cmp/cpp/fragment/EntityListOp.fragment.cpp +18 -2
- package/project/.sdk/src/cmp/cpp/fragment/EntityLoadOp.fragment.cpp +8 -2
- package/project/.sdk/src/cmp/cpp/fragment/EntityRemoveOp.fragment.cpp +11 -2
- package/project/.sdk/src/cmp/cpp/fragment/EntityUpdateOp.fragment.cpp +8 -2
- package/project/.sdk/src/cmp/csharp/Package_csharp.ts +2 -1
- package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +3 -3
- package/project/.sdk/src/cmp/csharp/TestEntity_csharp.ts +6 -6
- package/project/.sdk/src/cmp/csharp/fragment/EntityBase.fragment.cs +38 -1
- package/project/.sdk/src/cmp/csharp/fragment/Main.fragment.cs +42 -33
- package/project/.sdk/src/cmp/dart/Package_dart.ts +2 -1
- package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +13 -2
- package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +2 -1
- package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +3 -3
- package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +1 -1
- package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +17 -6
- package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +13 -2
- package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +13 -2
- package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +3 -3
- package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +8 -8
- package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +18 -1
- package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +9 -1
- package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +9 -1
- package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +15 -1
- package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +9 -1
- package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +8 -0
- package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
- package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +2 -2
- package/project/.sdk/src/cmp/elixir/TestEntity_elixir.ts +11 -2
- package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +2 -1
- package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +1 -0
- package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +2 -1
- package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -1
- package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +2 -1
- package/project/.sdk/src/cmp/go/EntityTypes_go.ts +38 -8
- package/project/.sdk/src/cmp/go/Entity_go.ts +2 -2
- package/project/.sdk/src/cmp/go/Main_go.ts +4 -5
- package/project/.sdk/src/cmp/go/Package_go.ts +8 -5
- package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +2 -2
- package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +2 -2
- package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +4 -2
- package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +2 -2
- package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +2 -2
- package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +2 -2
- package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +2 -2
- package/project/.sdk/src/cmp/go/TestDirect_go.ts +21 -15
- package/project/.sdk/src/cmp/go/TestEntity_go.ts +9 -9
- package/project/.sdk/src/cmp/go/Test_go.ts +2 -2
- package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +42 -1
- package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +4 -4
- package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +4 -4
- package/project/.sdk/src/cmp/haskell/Package_haskell.ts +2 -1
- package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +10 -5
- package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +10 -8
- package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +14 -10
- package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +21 -18
- package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +4 -4
- package/project/.sdk/src/cmp/haskell/Test_haskell.ts +23 -11
- package/project/.sdk/src/cmp/java/Package_java.ts +2 -1
- package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +2 -1
- package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +2 -2
- package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +1 -1
- package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +3 -3
- package/project/.sdk/src/cmp/java/TestDirect_java.ts +3 -3
- package/project/.sdk/src/cmp/java/TestEntity_java.ts +6 -6
- package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +34 -1
- package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +12 -0
- package/project/.sdk/src/cmp/js/Main_js.ts +4 -1
- package/project/.sdk/src/cmp/js/Package_js.ts +7 -1
- package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -2
- package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +2 -1
- package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +13 -2
- package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +13 -2
- package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +2 -1
- package/project/.sdk/src/cmp/js/TestDirect_js.ts +3 -3
- package/project/.sdk/src/cmp/js/TestEntity_js.ts +8 -8
- package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +22 -1
- package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +9 -1
- package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +9 -1
- package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +15 -1
- package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +9 -1
- package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +13 -0
- package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +2 -1
- package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +2 -1
- package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +2 -2
- package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +1 -1
- package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +3 -3
- package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +3 -3
- package/project/.sdk/src/cmp/kotlin/TestEntity_kotlin.ts +6 -6
- package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +32 -1
- package/project/.sdk/src/cmp/lean/Package_lean.ts +3 -1
- package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +9 -4
- package/project/.sdk/src/cmp/lua/Package_lua.ts +4 -3
- package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +11 -3
- package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +1 -1
- package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +3 -3
- package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +9 -9
- package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +37 -1
- package/project/.sdk/src/cmp/lua/fragment/SdkError.fragment.lua +12 -0
- package/project/.sdk/src/cmp/ocaml/EntityOperation_ocaml.ts +30 -3
- package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +11 -5
- package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +3 -1
- package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +10 -5
- package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +6 -2
- package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +10 -8
- package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +14 -13
- package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +20 -18
- package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +4 -4
- package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +8 -2
- package/project/.sdk/src/cmp/ocaml/TestEntity_ocaml.ts +8 -5
- package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +2 -1
- package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +1 -1
- package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +3 -3
- package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +1 -1
- package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +3 -3
- package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +6 -6
- package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +36 -1
- package/project/.sdk/src/cmp/php/MainEntity_php.ts +21 -16
- package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
- package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +6 -6
- package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +4 -3
- package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +2 -2
- package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +1 -1
- package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +12 -12
- package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +6 -6
- package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +4 -4
- package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +2 -2
- package/project/.sdk/src/cmp/php/TestDirect_php.ts +3 -3
- package/project/.sdk/src/cmp/php/TestEntity_php.ts +17 -15
- package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +20 -1
- package/project/.sdk/src/cmp/php/fragment/SdkError.fragment.php +11 -0
- package/project/.sdk/src/cmp/py/Package_py.ts +4 -3
- package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +13 -2
- package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +2 -1
- package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +1 -1
- package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +17 -6
- package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +14 -3
- package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +13 -2
- package/project/.sdk/src/cmp/py/TestDirect_py.ts +3 -3
- package/project/.sdk/src/cmp/py/TestEntity_py.ts +9 -9
- package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +29 -1
- package/project/.sdk/src/cmp/py/fragment/SdkError.fragment.py +11 -0
- package/project/.sdk/src/cmp/py-data/Main_py-data.ts +2 -1
- package/project/.sdk/src/cmp/rb/Package_rb.ts +4 -3
- package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +1 -1
- package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +2 -1
- package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +5 -5
- package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +1 -1
- package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +3 -3
- package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +9 -9
- package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +31 -1
- package/project/.sdk/src/cmp/rb/fragment/SdkError.fragment.rb +10 -1
- package/project/.sdk/src/cmp/rust/Entity_rust.ts +5 -1
- package/project/.sdk/src/cmp/rust/Main_rust.ts +21 -0
- package/project/.sdk/src/cmp/rust/Package_rust.ts +2 -1
- package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +3 -3
- package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +12 -12
- package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +18 -0
- package/project/.sdk/src/cmp/rust/fragment/EntityCreateOp.fragment.rs +8 -2
- package/project/.sdk/src/cmp/rust/fragment/EntityListOp.fragment.rs +20 -3
- package/project/.sdk/src/cmp/rust/fragment/EntityLoadOp.fragment.rs +8 -2
- package/project/.sdk/src/cmp/rust/fragment/EntityRemoveOp.fragment.rs +10 -2
- package/project/.sdk/src/cmp/rust/fragment/EntityUpdateOp.fragment.rs +8 -2
- package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +10 -0
- package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +2 -1
- package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +3 -3
- package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +1 -1
- package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +3 -3
- package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +3 -3
- package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +27 -1
- package/project/.sdk/src/cmp/seneca-provider/Extras_seneca-provider.ts +3915 -0
- package/project/.sdk/src/cmp/seneca-provider/Main_seneca-provider.ts +960 -0
- package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +2 -1
- package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +3 -3
- package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +1 -1
- package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +3 -3
- package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +34 -1
- package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +9 -1
- package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +18 -1
- package/project/.sdk/src/cmp/ts/Gitignore_ts.ts +5 -2
- package/project/.sdk/src/cmp/ts/Main_ts.ts +4 -1
- package/project/.sdk/src/cmp/ts/Package_ts.ts +10 -1
- package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -2
- package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +2 -1
- package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +21 -6
- package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +52 -2
- package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +14 -3
- package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +34 -2
- package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +64 -43
- package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +8 -8
- package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +2 -2
- package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +2 -2
- package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +25 -1
- package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +10 -2
- package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +1 -1
- package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +10 -2
- package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +27 -3
- package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +10 -2
- package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +15 -0
- package/project/.sdk/src/cmp/zig/Entity_zig.ts +5 -1
- package/project/.sdk/src/cmp/zig/Package_zig.ts +3 -1
- package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +39 -0
- package/project/.sdk/src/cmp/zig/fragment/EntityCreateOp.fragment.zig +2 -2
- package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +21 -2
- package/project/.sdk/src/cmp/zig/fragment/EntityLoadOp.fragment.zig +2 -2
- package/project/.sdk/src/cmp/zig/fragment/EntityRemoveOp.fragment.zig +5 -2
- package/project/.sdk/src/cmp/zig/fragment/EntityUpdateOp.fragment.zig +2 -2
- package/project/.sdk/tm/c/VERSION +1 -1
- package/project/.sdk/tm/c/core/helpers.c +1 -0
- package/project/.sdk/tm/c/core/sdk.h +22 -6
- package/project/.sdk/tm/c/tests/feature_harness.h +1 -0
- package/project/.sdk/tm/c/tests/primary_utility_test.c +4 -1
- package/project/.sdk/tm/c/utility/make_url.c +1 -0
- package/project/.sdk/tm/c/utility/param.c +1 -0
- package/project/.sdk/tm/clojure/VERSION +1 -1
- package/project/.sdk/tm/cpp/VERSION +1 -1
- package/project/.sdk/tm/cpp/core/types.hpp +33 -8
- package/project/.sdk/tm/cpp/test/pipeline_test.cpp +5 -0
- package/project/.sdk/tm/cpp/test/runner_support.hpp +4 -4
- package/project/.sdk/tm/csharp/VERSION +1 -1
- package/project/.sdk/tm/csharp/core/Types.cs +6 -0
- package/project/.sdk/tm/csharp/test/FeatureHarness.cs +396 -0
- package/project/.sdk/tm/csharp/test/FeatureTest.cs +7 -385
- package/project/.sdk/tm/csharp/test/Runner.cs +4 -4
- package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +4 -0
- package/project/.sdk/tm/dart/test/utility.dart +4 -4
- package/project/.sdk/tm/elixir/VERSION +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +26 -0
- package/project/.sdk/tm/go/VERSION +1 -1
- package/project/.sdk/tm/go/core/types.go +6 -0
- package/project/.sdk/tm/go/test/feature_harness_test.go +361 -0
- package/project/.sdk/tm/go/test/feature_test.go +7 -350
- package/project/.sdk/tm/go/test/pipeline_test.go +6 -0
- package/project/.sdk/tm/go/test/runner_test.go +16 -4
- package/project/.sdk/tm/haskell/VERSION +1 -1
- package/project/.sdk/tm/haskell/src/SdkFeatures.hs +28 -5
- package/project/.sdk/tm/haskell/src/SdkTypes.hs +14 -5
- package/project/.sdk/tm/java/VERSION +1 -1
- package/project/.sdk/tm/java/test/RunnerSupport.java +4 -4
- package/project/.sdk/tm/java/utility/MakeError.java +4 -0
- package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +4 -0
- package/project/.sdk/tm/js/test/utility.js +3 -3
- package/project/.sdk/tm/kotlin/VERSION +1 -1
- package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +3 -3
- package/project/.sdk/tm/lean/VERSION +1 -1
- package/project/.sdk/tm/lean/test/TFeature.lean +27 -14
- package/project/.sdk/tm/lua/test/runner.lua +4 -4
- package/project/.sdk/tm/lua/utility/make_error.lua +4 -0
- package/project/.sdk/tm/ocaml/VERSION +1 -1
- package/project/.sdk/tm/ocaml/sdk_types.ml +14 -5
- package/project/.sdk/tm/ocaml/test/t_pipeline.ml +5 -2
- package/project/.sdk/tm/perl/t/runner.pm +4 -4
- package/project/.sdk/tm/php/VERSION +1 -1
- package/project/.sdk/tm/php/test/Runner.php +4 -4
- package/project/.sdk/tm/php/utility/MakeError.php +5 -0
- package/project/.sdk/tm/py/pkg/utility/make_error.py +4 -0
- package/project/.sdk/tm/py/test/runner.py +19 -4
- package/project/.sdk/tm/rb/test/runner.rb +4 -4
- package/project/.sdk/tm/rb/utility/make_error.rb +4 -0
- package/project/.sdk/tm/rust/VERSION +1 -1
- package/project/.sdk/tm/rust/core/types.rs +22 -6
- package/project/.sdk/tm/rust/tests/common/mod.rs +6 -6
- package/project/.sdk/tm/rust/tests/pipeline_test.rs +6 -0
- package/project/.sdk/tm/rust/utility/make_error.rs +4 -0
- package/project/.sdk/tm/scala/VERSION +1 -1
- package/project/.sdk/tm/seneca-provider/CODE_OF_CONDUCT.md +132 -0
- package/project/.sdk/tm/seneca-provider/LICENSE +21 -0
- package/project/.sdk/tm/seneca-provider/Makefile +15 -0
- package/project/.sdk/tm/seneca-provider/src/tsconfig.json +18 -0
- package/project/.sdk/tm/seneca-provider/test/tsconfig.json +16 -0
- package/project/.sdk/tm/seneca-provider/tsfmt.json +3 -0
- package/project/.sdk/tm/swift/VERSION +1 -1
- package/project/.sdk/tm/ts/src/tsconfig.json +1 -0
- package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +4 -0
- package/project/.sdk/tm/ts/test/tsconfig.json +1 -0
- package/project/.sdk/tm/ts/test/utility.ts +3 -3
- package/project/.sdk/tm/zig/VERSION +1 -1
- package/src/action/doctor.ts +475 -0
- package/src/action/feature.ts +54 -16
- package/src/action/target.ts +174 -25
- package/src/cmp/Entity.ts +7 -0
- package/src/cmp/ExternalTarget.ts +125 -0
- package/src/cmp/Feature.ts +3 -1
- package/src/cmp/Main.ts +7 -1
- package/src/cmp/ReadmeExplanation.ts +2 -2
- package/src/cmp/ReadmeTop.ts +22 -9
- package/src/cmp/Registered.ts +100 -0
- package/src/cmp/Test.ts +4 -1
- package/src/helpers/dryrun.ts +57 -0
- package/src/helpers/featureSource.ts +208 -0
- package/src/helpers/naming.ts +73 -2
- package/src/helpers/opExample.ts +19 -2
- package/src/helpers/opShape.ts +65 -0
- package/src/helpers/packageMeta.ts +211 -10
- package/src/helpers/stdrep.ts +56 -0
- package/src/helpers/testPolicy.ts +52 -0
- package/src/sdkgen.ts +350 -5
- package/src/types.ts +24 -1
- package/src/utility.ts +10 -1
- package/project/.sdk/tm/rust/feature/mod.rs +0 -24
|
@@ -51,7 +51,8 @@ const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
|
|
|
51
51
|
// The op-driven test-mode line, shown only when the SDK has an entity op.
|
|
52
52
|
// A direct()-only SDK (no ops anywhere) shows a direct() call instead.
|
|
53
53
|
const testModeExample = primaryOp
|
|
54
|
-
? `// Entity ops return the
|
|
54
|
+
? `// Entity ops return the ENTITY and throws on error;
|
|
55
|
+
// call data() for the record.
|
|
55
56
|
let ${eVar} = try client.${eName}().${primaryOp}(${testArg}, nil)
|
|
56
57
|
// ${eVar} holds the mock response record
|
|
57
58
|
print(${eVar})`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { cmp, Content, isPublished, repoInfo } from '@voxgig/sdkgen'
|
|
2
|
+
import { cmp, Content, isPublished, repoInfo, packageVersion } from '@voxgig/sdkgen'
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
const ReadmeInstall = cmp(function ReadmeInstall(props: any) {
|
|
@@ -11,7 +11,7 @@ const ReadmeInstall = cmp(function ReadmeInstall(props: any) {
|
|
|
11
11
|
|
|
12
12
|
\`\`\`swift
|
|
13
13
|
dependencies: [
|
|
14
|
-
.package(url: "<repo-url>", from: "
|
|
14
|
+
.package(url: "<repo-url>", from: "${packageVersion(model, target.name)}"),
|
|
15
15
|
],
|
|
16
16
|
\`\`\`
|
|
17
17
|
|
|
@@ -39,7 +39,7 @@ your \`Package.swift\`:
|
|
|
39
39
|
\`\`\`swift
|
|
40
40
|
dependencies: [
|
|
41
41
|
// From the git release tag:
|
|
42
|
-
.package(url: "<repo-url>", exact: "
|
|
42
|
+
.package(url: "<repo-url>", exact: "${packageVersion(model, target.name)}"),
|
|
43
43
|
],
|
|
44
44
|
\`\`\`
|
|
45
45
|
|
|
@@ -92,7 +92,7 @@ ${opRows}
|
|
|
92
92
|
|
|
93
93
|
### Result shape
|
|
94
94
|
|
|
95
|
-
Entity operations return the
|
|
95
|
+
Entity operations return the ENTITY (call data() for the record) (a \`Value\` map for
|
|
96
96
|
single-entity ops, a \`Value\` list for \`list\`) and throw on error. Wrap
|
|
97
97
|
calls in \`do\`/\`catch\` to handle failures.
|
|
98
98
|
|
|
@@ -125,7 +125,7 @@ catch {
|
|
|
125
125
|
Content(`### 3. Load ${neArticle} ${neName.toLowerCase()}
|
|
126
126
|
|
|
127
127
|
${neName} is nested under ${parentName}, so provide the \`${parentParam}\`.
|
|
128
|
-
\`load()\` returns the
|
|
128
|
+
\`load()\` returns the ENTITY — call data() for the record — and throws on error.
|
|
129
129
|
|
|
130
130
|
\`\`\`swift
|
|
131
131
|
do {
|
|
@@ -153,7 +153,7 @@ catch {
|
|
|
153
153
|
|
|
154
154
|
Content(`### 3. Load ${article} ${eName.toLowerCase()}
|
|
155
155
|
|
|
156
|
-
\`load()\` returns the
|
|
156
|
+
\`load()\` returns the ENTITY — call data() for the record — and throws on error.
|
|
157
157
|
|
|
158
158
|
\`\`\`swift
|
|
159
159
|
do {
|
|
@@ -193,7 +193,7 @@ catch {
|
|
|
193
193
|
\`\`\`swift
|
|
194
194
|
`)
|
|
195
195
|
if (opnames.includes('create')) {
|
|
196
|
-
Content(`// Create — returns the
|
|
196
|
+
Content(`// Create — returns the ENTITY (call data() for the record)
|
|
197
197
|
let created = try client.${accessor}().create(VMap([${examplePairs('create').join(', ')}]), nil)
|
|
198
198
|
|
|
199
199
|
`)
|
|
@@ -84,6 +84,20 @@ open class ProjectNameEntityBase: Entity {
|
|
|
84
84
|
throw unsupportedOp("remove", name)
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
// Every operation resolves to the entity; `remove` additionally marks
|
|
88
|
+
// it. The instance KEEPS the data it held — a caller can still read
|
|
89
|
+
// what was deleted — but it is no longer a live record. See AGENTS.md.
|
|
90
|
+
private var deletedFlag: Bool = false
|
|
91
|
+
|
|
92
|
+
public func markDeleted() {
|
|
93
|
+
self.deletedFlag = true
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public func deleted() -> Bool {
|
|
97
|
+
return self.deletedFlag
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
|
|
87
101
|
func runOp(_ ctx: Context, _ postDone: () -> Void) throws -> Value {
|
|
88
102
|
// #PrePoint-Hook
|
|
89
103
|
|
|
@@ -134,7 +148,26 @@ open class ProjectNameEntityBase: Entity {
|
|
|
134
148
|
|
|
135
149
|
postDone()
|
|
136
150
|
|
|
137
|
-
|
|
151
|
+
let out = try utility.done(ctx)
|
|
152
|
+
|
|
153
|
+
// An operation resolves to the ENTITY, not the raw data. Entities are
|
|
154
|
+
// stateful: postDone has just absorbed resdata/resmatch into this
|
|
155
|
+
// instance, and the caller reaches the record through data(). Two
|
|
156
|
+
// structural exceptions: `list` resolves to the ARRAY of entity
|
|
157
|
+
// instances makeResult built, and a failed op with throwing disabled
|
|
158
|
+
// hands back the error payload unchanged. `remove` additionally marks
|
|
159
|
+
// the entity deleted; it KEEPS its data, so a caller can still read
|
|
160
|
+
// what was removed. See AGENTS.md "Entity operations return ENTITIES".
|
|
161
|
+
let opname = ctx.op?.name
|
|
162
|
+
|
|
163
|
+
if let result = ctx.result, result.ok, "list" != opname {
|
|
164
|
+
if "remove" == opname {
|
|
165
|
+
self.markDeleted()
|
|
166
|
+
}
|
|
167
|
+
return .native(NativeRef(self))
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return out
|
|
138
171
|
}
|
|
139
172
|
|
|
140
173
|
// Streaming operations. Runs `action` through the full pipeline and returns
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
import {
|
|
3
3
|
cmp, camelify,
|
|
4
|
-
Content, Fragment
|
|
4
|
+
Content, Fragment,
|
|
5
|
+
entityClassName, entityCollection,
|
|
5
6
|
} from '@voxgig/sdkgen'
|
|
6
7
|
|
|
7
8
|
|
|
@@ -32,6 +33,13 @@ const EntityOperation = cmp(function Operation(props: any) {
|
|
|
32
33
|
SdkName: model.const.Name,
|
|
33
34
|
EntityName: entity.Name,
|
|
34
35
|
entityname: entity.name,
|
|
36
|
+
|
|
37
|
+
// The CLASS token. Operations resolve to the entity instance, so their
|
|
38
|
+
// declared return type must name the class — `Promise<PlanetEntity>`,
|
|
39
|
+
// not `Promise<Planet>` (the data interface). A signature that says
|
|
40
|
+
// the data type while the call resolves to an entity is a lie the
|
|
41
|
+
// compiler cannot catch; see AGENTS.md.
|
|
42
|
+
EntyClass: entityClassName(entity, entityCollection(model)),
|
|
35
43
|
"['POINTS']": formatJson(entop.points, { margin: 6 }).trim(),
|
|
36
44
|
'#Feature-Hook': ({ name, indent }: any) =>
|
|
37
45
|
Content({ indent }, `
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
File, Content,
|
|
22
22
|
} from '@voxgig/sdkgen'
|
|
23
23
|
|
|
24
|
-
import { canonToType, opTypeName, opRequestShape, warnEntityTypeCollisions , deriveEntityNames } from '@voxgig/sdkgen'
|
|
24
|
+
import { canonToType, opTypeName, opRequestShape, warnEntityTypeCollisions , deriveEntityNames, opActions } from '@voxgig/sdkgen'
|
|
25
25
|
|
|
26
26
|
import {
|
|
27
27
|
KIT,
|
|
@@ -108,6 +108,23 @@ const EntityTypes = cmp(function EntityTypes(props: any) {
|
|
|
108
108
|
Content(` ${propKey(it.name)}${opt}: ${canonToType(it.type, LANG)}
|
|
109
109
|
`)
|
|
110
110
|
})
|
|
111
|
+
|
|
112
|
+
// Custom actions are selected with `$action` in the call's argument
|
|
113
|
+
// (see the Actions section of REFERENCE.md). Without it in the type,
|
|
114
|
+
// the ONLY documented way to reach those endpoints does not compile,
|
|
115
|
+
// and a TypeScript caller has to cast — which is how two of one API's
|
|
116
|
+
// six endpoints came to be unreachable from the typed interface.
|
|
117
|
+
const actions = opActions(ops[opname])
|
|
118
|
+
if (0 < actions.length) {
|
|
119
|
+
Content(`
|
|
120
|
+
// Selects a custom action instead of the plain ${opname}:
|
|
121
|
+
// ${actions.map((a: any) => `'` + a.action + `'`).join(' | ')}
|
|
122
|
+
// The remaining keys are that action's own payload.
|
|
123
|
+
$action?: string
|
|
124
|
+
[action: string]: any
|
|
125
|
+
`)
|
|
126
|
+
}
|
|
127
|
+
|
|
111
128
|
Content(`}
|
|
112
129
|
|
|
113
130
|
`)
|
|
@@ -12,8 +12,11 @@ const Gitignore = cmp(async function Gitignore(_props: any) {
|
|
|
12
12
|
node_modules/
|
|
13
13
|
|
|
14
14
|
# Build output
|
|
15
|
-
|
|
16
|
-
dist-test/
|
|
15
|
+
#
|
|
16
|
+
# dist/ and dist-test/ are COMMITTED, not ignored: the compiled SDK and the
|
|
17
|
+
# compiled test suite are part of the published repo, so a consumer can read
|
|
18
|
+
# and run them straight from a clone without a build step. Only the
|
|
19
|
+
# incremental-build bookkeeping is ignored.
|
|
17
20
|
*.tsbuildinfo
|
|
18
21
|
|
|
19
22
|
# Coverage
|
|
@@ -4,7 +4,7 @@ import * as Path from 'node:path'
|
|
|
4
4
|
import {
|
|
5
5
|
cmp, each, names, cmap,
|
|
6
6
|
List, File, Content, Copy, Folder, Fragment, Line, FeatureHook,
|
|
7
|
-
entityClassName, entityCollection,
|
|
7
|
+
entityClassName, entityCollection, srcFeatureExcludes,
|
|
8
8
|
} from '@voxgig/sdkgen'
|
|
9
9
|
|
|
10
10
|
|
|
@@ -43,6 +43,9 @@ const Main = cmp(async function Main(props: any) {
|
|
|
43
43
|
|
|
44
44
|
Copy({
|
|
45
45
|
from: 'tm/' + target.name,
|
|
46
|
+
// Root copies src/feature/<name>/ per ACTIVE feature; keep this blanket
|
|
47
|
+
// copy from restoring one that was switched off after `target add`.
|
|
48
|
+
exclude: srcFeatureExcludes(model),
|
|
46
49
|
replace: {
|
|
47
50
|
...props.ctx$.stdrep,
|
|
48
51
|
}
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
repoInfo,
|
|
12
12
|
PUBLISHER,
|
|
13
13
|
PUBLISHER_URL,
|
|
14
|
+
packageVersion,
|
|
14
15
|
} from '@voxgig/sdkgen'
|
|
15
16
|
|
|
16
17
|
|
|
@@ -54,7 +55,7 @@ const Package = cmp(async function Package(props: any) {
|
|
|
54
55
|
|
|
55
56
|
const pkg = {
|
|
56
57
|
name: packageName(model, 'npm'),
|
|
57
|
-
version:
|
|
58
|
+
version: packageVersion(model, target.name),
|
|
58
59
|
description: pkgDescription(model, target.name),
|
|
59
60
|
keywords: keywords(model),
|
|
60
61
|
homepage: `${repoUrl}#readme`,
|
|
@@ -63,6 +64,14 @@ const Package = cmp(async function Package(props: any) {
|
|
|
63
64
|
main: `dist/${SdkName}SDK.js`,
|
|
64
65
|
type: 'commonjs',
|
|
65
66
|
types: `dist/${SdkName}SDK.d.ts`,
|
|
67
|
+
|
|
68
|
+
// What actually ships. Without `files`, `npm publish` packs everything
|
|
69
|
+
// not gitignored — the test suite, dist-test/, the Makefile, the agent
|
|
70
|
+
// guides — into the published tarball. `src` IS included: the emitted
|
|
71
|
+
// .js.map files point back at it, so shipping it is what makes stack
|
|
72
|
+
// traces in a consumer resolve to SDK source. README/LICENSE/package.json
|
|
73
|
+
// are always included by npm and need no entry.
|
|
74
|
+
files: ['dist', 'src'],
|
|
66
75
|
scripts: {
|
|
67
76
|
// `test` and `test-coverage` run the COMPILED suite in dist-test/, which
|
|
68
77
|
// a fresh clone does not have — the glob then matches nothing and the
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { cmp, each, Content, canonToType, entityIdField, opRequestShape, safeVarName, exampleVarName, jsKey } from '@voxgig/sdkgen'
|
|
2
|
+
import { cmp, each, Content, canonToType, entityIdField, opRequestShape, safeVarName, exampleVarName, jsKey, matchArg, idLiteral } from '@voxgig/sdkgen'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
KIT,
|
|
@@ -12,6 +12,17 @@ import { exampleValue } from './utility_ts'
|
|
|
12
12
|
// Operation method spelling differs between Go and other languages — Go
|
|
13
13
|
// uses PascalCase methods with explicit ctrl arg, others use lowercase
|
|
14
14
|
// methods with optional ctrl. The op descriptions are language-agnostic.
|
|
15
|
+
// A `list()` on a NESTED entity needs its parent path params. The
|
|
16
|
+
// quickstart used to emit `client.Moon().list()` for an entity at
|
|
17
|
+
// `/planet/{planet_id}/moon`, which 404s against a live server from a
|
|
18
|
+
// half-built URL — indistinguishable from "no such record". The model
|
|
19
|
+
// already marks those params `reqd: true`; matchArg renders exactly them.
|
|
20
|
+
function listMatchArg(ent: any): string {
|
|
21
|
+
const idF = entityIdField(ent)
|
|
22
|
+
return matchArg('ts', ent, 'list', idF, idLiteral(ent, 'list', idF))
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
15
26
|
const OP_DESC: Record<string, { method: string, desc: string }> = {
|
|
16
27
|
load: { method: 'load(match)', desc: 'Load a single entity by match criteria.' },
|
|
17
28
|
list: { method: 'list(match)', desc: 'List entities matching the criteria.' },
|
|
@@ -124,7 +135,7 @@ const ${eVar} = await client.${entity.Name}().load(${loadArg})
|
|
|
124
135
|
Content(`#### Example: List
|
|
125
136
|
|
|
126
137
|
\`\`\`ts
|
|
127
|
-
const ${eVar}s = await client.${entity.Name}().list()
|
|
138
|
+
const ${eVar}s = await client.${entity.Name}().list(${listMatchArg(entity)})
|
|
128
139
|
\`\`\`
|
|
129
140
|
|
|
130
141
|
`)
|
|
@@ -67,7 +67,8 @@ const ReadmeHowto = cmp(function ReadmeHowto(props: any) {
|
|
|
67
67
|
// A direct()-only SDK (no ops anywhere) shows a direct() test call instead.
|
|
68
68
|
const testModeExample = primaryOp
|
|
69
69
|
? `const ${eVar} = await client.${eName}().${primaryOp}(${testCallArg})
|
|
70
|
-
// ${eVar} is
|
|
70
|
+
// ${eVar} is the entity, populated with mock response data
|
|
71
|
+
// — call ${eVar}.data() for the record itself
|
|
71
72
|
console.log(${eVar})`
|
|
72
73
|
: `const result = await client.direct({ path: '/api/resource', method: 'GET' })
|
|
73
74
|
console.log(result)`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { cmp, each, Content, isAuthActive, packageName, envName, opRequestShape, entityIdField, entityDataIdField, entityOps, safeVarName, exampleVarName, jsKey } from '@voxgig/sdkgen'
|
|
2
|
+
import { cmp, each, Content, isAuthActive, packageName, envName, opRequestShape, entityIdField, entityDataIdField, entityOps, safeVarName, exampleVarName, jsKey, matchArg, idLiteral } from '@voxgig/sdkgen'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
KIT,
|
|
@@ -10,6 +10,17 @@ import {
|
|
|
10
10
|
import { exampleValue } from './utility_ts'
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
// A `list()` on a NESTED entity needs its parent path params. The
|
|
14
|
+
// quickstart used to emit `client.Moon().list()` for an entity at
|
|
15
|
+
// `/planet/{planet_id}/moon`, which 404s against a live server from a
|
|
16
|
+
// half-built URL — indistinguishable from "no such record". The model
|
|
17
|
+
// already marks those params `reqd: true`; matchArg renders exactly them.
|
|
18
|
+
function listMatchArg(ent: any): string {
|
|
19
|
+
const idF = entityIdField(ent)
|
|
20
|
+
return matchArg('ts', ent, 'list', idF, idLiteral(ent, 'list', idF))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
13
24
|
const ReadmeQuick = cmp(function ReadmeQuick(props: any) {
|
|
14
25
|
const { target, ctx$: { model } } = props
|
|
15
26
|
|
|
@@ -63,10 +74,12 @@ const client = ${ctor}
|
|
|
63
74
|
if (opnames.includes('list')) {
|
|
64
75
|
Content(`### 2. List ${eName.toLowerCase()} records
|
|
65
76
|
|
|
66
|
-
\`list()\` resolves to an array of ${eName}
|
|
77
|
+
\`list()\` resolves to an array of ${eName} ENTITIES — every operation
|
|
78
|
+
resolves to entities, not raw records. Iterate them directly, and call
|
|
79
|
+
\`.data()\` on one for the record it holds:
|
|
67
80
|
|
|
68
81
|
\`\`\`ts
|
|
69
|
-
const ${eVar}s = await client.${eName}().list()
|
|
82
|
+
const ${eVar}s = await client.${eName}().list(${listMatchArg(exampleEntity)})
|
|
70
83
|
|
|
71
84
|
for (const ${eVar} of ${eVar}s) {
|
|
72
85
|
console.log(${eVar})
|
|
@@ -195,8 +208,10 @@ try {
|
|
|
195
208
|
const matchType = matchItem ? matchItem.type : null
|
|
196
209
|
return null == matchType || null == dataIdType || matchType === dataIdType
|
|
197
210
|
}
|
|
211
|
+
// `create` resolves to the ENTITY, so the id is reached through
|
|
212
|
+
// `.data()` — `created.id` is a TS2339 on the entity class.
|
|
198
213
|
const idValueFor = (opname: string): string => usesCreatedId(opname)
|
|
199
|
-
? `created.${dataIdF}!`
|
|
214
|
+
? `created.data().${dataIdF}!`
|
|
200
215
|
: exampleValue(exampleEntity, exampleEntity.op[opname], idF as string, 'example_id')
|
|
201
216
|
|
|
202
217
|
Content(`### 4. Create, update, and remove
|
|
@@ -206,7 +221,7 @@ try {
|
|
|
206
221
|
if (opnames.includes('create')) {
|
|
207
222
|
const createLines = exampleFields('create')
|
|
208
223
|
const createBody = createLines.length ? '\n' + createLines.join('\n') + '\n' : ''
|
|
209
|
-
Content(`// Create — returns the created ${eName}
|
|
224
|
+
Content(`// Create — returns the created ${eName} ENTITY (.data() for the record)
|
|
210
225
|
const created = await client.${eName}().create({${createBody}})
|
|
211
226
|
|
|
212
227
|
`)
|
|
@@ -216,7 +231,7 @@ const created = await client.${eName}().create({${createBody}})
|
|
|
216
231
|
// type carries one, else a literal), plus a couple of patch fields.
|
|
217
232
|
const updateLines = (idF ? [` ${idF}: ${idValueFor('update')},`] : []).concat(exampleFields('update'))
|
|
218
233
|
const updateBody = updateLines.length ? '\n' + updateLines.join('\n') + '\n' : ''
|
|
219
|
-
Content(`// Update${usesCreatedId('update') ? ' — the id comes
|
|
234
|
+
Content(`// Update${usesCreatedId('update') ? ' — the id comes off the returned entity\'s data()' : ''}
|
|
220
235
|
const updated = await client.${eName}().update({${updateBody}})
|
|
221
236
|
|
|
222
237
|
`)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { cmp, each, Content, canonToType, File, isAuthActive, entityIdField, opRequestShape, safeVarName, exampleVarName, jsKey } from '@voxgig/sdkgen'
|
|
2
|
+
import { cmp, each, Content, canonToType, File, isAuthActive, entityIdField, entityActions, opRequestShape, safeVarName, exampleVarName, jsKey, matchArg, idLiteral } from '@voxgig/sdkgen'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
KIT,
|
|
@@ -9,6 +9,17 @@ import {
|
|
|
9
9
|
import { exampleValue } from './utility_ts'
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
// A `list()` on a NESTED entity needs its parent path params. The
|
|
13
|
+
// quickstart used to emit `client.Moon().list()` for an entity at
|
|
14
|
+
// `/planet/{planet_id}/moon`, which 404s against a live server from a
|
|
15
|
+
// half-built URL — indistinguishable from "no such record". The model
|
|
16
|
+
// already marks those params `reqd: true`; matchArg renders exactly them.
|
|
17
|
+
function listMatchArg(ent: any): string {
|
|
18
|
+
const idF = entityIdField(ent)
|
|
19
|
+
return matchArg('ts', ent, 'list', idF, idLiteral(ent, 'list', idF))
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
12
23
|
const OP_SIGNATURES: Record<string, { sig: string, returns: string, desc: string }> = {
|
|
13
24
|
load: {
|
|
14
25
|
sig: 'load(match: object, ctrl?: object)',
|
|
@@ -254,6 +265,45 @@ const ${eVar} = client.${ent.Name}()
|
|
|
254
265
|
}
|
|
255
266
|
|
|
256
267
|
|
|
268
|
+
// Custom actions.
|
|
269
|
+
//
|
|
270
|
+
// A POST route like `/api/planet/{id}/terraform` is folded into the
|
|
271
|
+
// `create` op as an alternative point, selected at call time by
|
|
272
|
+
// `$action`. The mechanism was implemented and documented NOWHERE — so
|
|
273
|
+
// for an API with two such routes, two of its six endpoints were
|
|
274
|
+
// unreachable by anyone reading the docs. A user who wanted `terraform`
|
|
275
|
+
// had to fall back to `direct()` and rebuild the URL by hand, which is
|
|
276
|
+
// exactly what the entity model exists to spare them.
|
|
277
|
+
const actions = entityActions(ent)
|
|
278
|
+
if (0 < actions.length) {
|
|
279
|
+
Content(`### Actions
|
|
280
|
+
|
|
281
|
+
This entity exposes custom API actions in addition to the standard
|
|
282
|
+
operations. Select one with \`$action\` in the call's argument; the
|
|
283
|
+
remaining keys are sent as that action's payload.
|
|
284
|
+
|
|
285
|
+
| Action | Route | Call |
|
|
286
|
+
| --- | --- | --- |
|
|
287
|
+
`)
|
|
288
|
+
actions.forEach((a: any) => {
|
|
289
|
+
Content(`| \`${a.action}\` | \`${a.path}\` | \`client.${ent.Name}().${a.op}({ $action: '${a.action}', ... })\` |
|
|
290
|
+
`)
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
Content(`
|
|
294
|
+
An action returns that action's OWN response, which is not necessarily a
|
|
295
|
+
${ent.Name} record — check the API definition for its shape.
|
|
296
|
+
|
|
297
|
+
\`\`\`ts
|
|
298
|
+
const result = await client.${ent.Name}().${actions[0].op}({
|
|
299
|
+
$action: '${actions[0].action}',
|
|
300
|
+
/* ...the action's own arguments */
|
|
301
|
+
})
|
|
302
|
+
\`\`\`
|
|
303
|
+
|
|
304
|
+
`)
|
|
305
|
+
}
|
|
306
|
+
|
|
257
307
|
// Operation details
|
|
258
308
|
if (opnames.length > 0) {
|
|
259
309
|
Content(`### Operations
|
|
@@ -292,7 +342,7 @@ const result = await client.${ent.Name}().${opname}(${arg})
|
|
|
292
342
|
}
|
|
293
343
|
else if ('list' === opname) {
|
|
294
344
|
Content(`\`\`\`ts
|
|
295
|
-
const results = await client.${ent.Name}().${opname}()
|
|
345
|
+
const results = await client.${ent.Name}().${opname}(${listMatchArg(ent)})
|
|
296
346
|
\`\`\`
|
|
297
347
|
|
|
298
348
|
`)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { cmp, Content, isAuthActive, packageName, envName, entityIdField, entityOps, opRequestShape, safeVarName, exampleVarName, jsKey } from '@voxgig/sdkgen'
|
|
2
|
+
import { cmp, Content, isAuthActive, packageName, envName, entityIdField, entityOps, opRequestShape, safeVarName, exampleVarName, jsKey, matchArg, idLiteral } from '@voxgig/sdkgen'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
KIT,
|
|
@@ -10,6 +10,17 @@ import {
|
|
|
10
10
|
import { exampleValue } from './utility_ts'
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
// A `list()` on a NESTED entity needs its parent path params. The
|
|
14
|
+
// quickstart used to emit `client.Moon().list()` for an entity at
|
|
15
|
+
// `/planet/{planet_id}/moon`, which 404s against a live server from a
|
|
16
|
+
// half-built URL — indistinguishable from "no such record". The model
|
|
17
|
+
// already marks those params `reqd: true`; matchArg renders exactly them.
|
|
18
|
+
function listMatchArg(ent: any): string {
|
|
19
|
+
const idF = entityIdField(ent)
|
|
20
|
+
return matchArg('ts', ent, 'list', idF, idLiteral(ent, 'list', idF))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
13
24
|
const ReadmeTopQuick = cmp(function ReadmeTopQuick(props: any) {
|
|
14
25
|
const { target, ctx$: { model } } = props
|
|
15
26
|
|
|
@@ -36,8 +47,8 @@ const client = ${ctor}
|
|
|
36
47
|
let hasCall = false
|
|
37
48
|
|
|
38
49
|
if (opnames.includes('list')) {
|
|
39
|
-
Content(`// List all ${eName.toLowerCase()}s (returns ${eName}[])
|
|
40
|
-
const ${eVar}s = await client.${eName}().list()
|
|
50
|
+
Content(`// List all ${eName.toLowerCase()}s (returns ${eName}Entity[] — .data() for the record)
|
|
51
|
+
const ${eVar}s = await client.${eName}().list(${listMatchArg(exampleEntity)})
|
|
41
52
|
for (const ${eVar} of ${eVar}s) {
|
|
42
53
|
console.log(${eVar})
|
|
43
54
|
}
|
|
@@ -18,8 +18,39 @@ const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
|
|
|
18
18
|
// `load` on an op-less entity like Cloudsmith's `Abort`.
|
|
19
19
|
const { entity: exampleEntity, primaryOp } = pickExampleEntity(entity)
|
|
20
20
|
|
|
21
|
+
// The mock SEEDS NOTHING on its own.
|
|
22
|
+
//
|
|
23
|
+
// `SDK.test()` with no argument used to be shown alongside "populated with
|
|
24
|
+
// mock data" — and returned an empty array. The seed shape
|
|
25
|
+
// (`{ entity: { <name>: { <id>: {...} } } }`) was documented nowhere; the
|
|
26
|
+
// only way to find it was to read TestFeature.ts. Offline test mode is a
|
|
27
|
+
// headline feature of these SDKs, so its one worked example has to run.
|
|
28
|
+
const seedEntity = exampleEntity ? nom(exampleEntity, 'name') : ''
|
|
29
|
+
const seedFields = exampleEntity ?
|
|
30
|
+
opRequestShape(exampleEntity, 'create').items
|
|
31
|
+
.filter((it: any) => !it.optional)
|
|
32
|
+
.slice(0, 3) : []
|
|
33
|
+
|
|
34
|
+
const seedId = 'test01'
|
|
35
|
+
const seedBody = [
|
|
36
|
+
`${jsKey('id')}: '${seedId}'`,
|
|
37
|
+
...seedFields
|
|
38
|
+
.filter((it: any) => 'id' !== it.name)
|
|
39
|
+
.map((it: any) => `${jsKey(it.name)}: ${exampleValue(
|
|
40
|
+
exampleEntity, exampleEntity.op && exampleEntity.op.create, it.name,
|
|
41
|
+
'example_' + it.name)}`),
|
|
42
|
+
].join(', ')
|
|
43
|
+
|
|
21
44
|
Content(`\`\`\`ts
|
|
22
|
-
|
|
45
|
+
// The offline mock starts EMPTY — seed it with the records the test needs.
|
|
46
|
+
// Shape: { entity: { <entity-name>: { <id>: <record> } } }
|
|
47
|
+
const client = ${model.const.Name}SDK.test({
|
|
48
|
+
entity: {
|
|
49
|
+
${seedEntity}: {
|
|
50
|
+
${seedId}: { ${seedBody} },
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
})
|
|
23
54
|
`)
|
|
24
55
|
|
|
25
56
|
if (exampleEntity && primaryOp) {
|
|
@@ -51,7 +82,8 @@ const client = ${model.const.Name}SDK.test()
|
|
|
51
82
|
`${jsKey(it.name)}: ${exampleValue(exampleEntity, primaryOpDef, it.name, 'example_' + it.name)}`).join(', ')} }`
|
|
52
83
|
}
|
|
53
84
|
Content(`const ${eVar} = await client.${eName}().${primaryOp}(${arg})
|
|
54
|
-
// ${eVar} is ${'list' === primaryOp ? `an array of
|
|
85
|
+
// ${eVar} is ${'list' === primaryOp ? `an array of ${eName} entities` : `the ${eName} entity`}, populated with mock data
|
|
86
|
+
// — call ${eVar}${'list' === primaryOp ? '[0]' : ''}.data() for the record itself
|
|
55
87
|
console.log(${eVar})
|
|
56
88
|
`)
|
|
57
89
|
}
|