@voxgig/sdkgen 1.2.0 → 1.3.1
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 +2 -2
- package/dist/action/action.d.ts +2 -1
- package/dist/action/action.js +15 -9
- package/dist/action/action.js.map +1 -1
- package/dist/action/feature.js +6 -3
- package/dist/action/feature.js.map +1 -1
- package/dist/action/target.d.ts +7 -1
- package/dist/action/target.js +13 -6
- package/dist/action/target.js.map +1 -1
- package/dist/cmp/Changelog.d.ts +2 -0
- package/dist/cmp/Changelog.js +30 -0
- package/dist/cmp/Changelog.js.map +1 -0
- package/dist/cmp/Deploy.d.ts +2 -0
- package/dist/cmp/Deploy.js +227 -0
- package/dist/cmp/Deploy.js.map +1 -0
- package/dist/cmp/FeatureHook.js +5 -6
- package/dist/cmp/FeatureHook.js.map +1 -1
- package/dist/cmp/License.d.ts +2 -0
- package/dist/cmp/License.js +44 -0
- package/dist/cmp/License.js.map +1 -0
- package/dist/cmp/Readme.js +2 -0
- package/dist/cmp/Readme.js.map +1 -1
- package/dist/cmp/ReadmeErrors.d.ts +2 -0
- package/dist/cmp/ReadmeErrors.js +210 -0
- package/dist/cmp/ReadmeErrors.js.map +1 -0
- package/dist/cmp/ReadmeExplanation.js +213 -223
- package/dist/cmp/ReadmeExplanation.js.map +1 -1
- package/dist/cmp/ReadmeModel.js +6 -1
- package/dist/cmp/ReadmeModel.js.map +1 -1
- package/dist/cmp/ReadmeTop.js +389 -82
- package/dist/cmp/ReadmeTop.js.map +1 -1
- package/dist/cmp/Security.d.ts +2 -0
- package/dist/cmp/Security.js +36 -0
- package/dist/cmp/Security.js.map +1 -0
- package/dist/helpers/canonType.d.ts +7 -0
- package/dist/helpers/canonType.js +74 -0
- package/dist/helpers/canonType.js.map +1 -0
- package/dist/helpers/collectDeps.d.ts +3 -2
- package/dist/helpers/collectDeps.js.map +1 -1
- package/dist/helpers/naming.d.ts +3 -0
- package/dist/helpers/naming.js +51 -0
- package/dist/helpers/naming.js.map +1 -0
- package/dist/helpers/opExample.d.ts +13 -0
- package/dist/helpers/opExample.js +149 -0
- package/dist/helpers/opExample.js.map +1 -0
- package/dist/helpers/opShape.d.ts +18 -0
- package/dist/helpers/opShape.js +193 -0
- package/dist/helpers/opShape.js.map +1 -0
- package/dist/helpers/packageMeta.d.ts +27 -0
- package/dist/helpers/packageMeta.js +224 -0
- package/dist/helpers/packageMeta.js.map +1 -0
- package/dist/sdkgen.d.ts +11 -1
- package/dist/sdkgen.js +57 -18
- package/dist/sdkgen.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +65 -2
- package/dist/types.js.map +1 -1
- package/dist/utility.js +20 -11
- package/dist/utility.js.map +1 -1
- package/model/sdkgen.aontu +137 -0
- package/package.json +13 -6
- package/project/.sdk/model/target/go-cli.jsonic +47 -0
- package/project/.sdk/model/target/go-mcp.jsonic +41 -0
- package/project/.sdk/model/target/go.jsonic +9 -3
- package/project/.sdk/model/target/js.jsonic +13 -0
- package/project/.sdk/model/target/lua.jsonic +13 -0
- package/project/.sdk/model/target/php.jsonic +13 -0
- package/project/.sdk/model/target/py.jsonic +13 -0
- package/project/.sdk/model/target/rb.jsonic +13 -0
- package/project/.sdk/model/target/ts.jsonic +13 -0
- package/project/.sdk/src/cmp/go/EntityOperation_go.ts +1 -0
- package/project/.sdk/src/cmp/go/EntityTypes_go.ts +197 -0
- package/project/.sdk/src/cmp/go/Entity_go.ts +2 -1
- package/project/.sdk/src/cmp/go/MainEntity_go.ts +6 -0
- package/project/.sdk/src/cmp/go/Main_go.ts +23 -3
- package/project/.sdk/src/cmp/go/Package_go.ts +1 -1
- package/project/.sdk/src/cmp/go/ReadmeEntity_go.ts +18 -6
- package/project/.sdk/src/cmp/go/ReadmeExamplesTest_go.ts +684 -0
- package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +1 -1
- package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +48 -8
- package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +11 -6
- package/project/.sdk/src/cmp/go/ReadmeIntro_go.ts +40 -1
- package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +63 -17
- package/project/.sdk/src/cmp/go/ReadmeOptions_go.ts +4 -3
- package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +124 -115
- package/project/.sdk/src/cmp/go/ReadmeRef_go.ts +28 -15
- package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +33 -9
- package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +35 -5
- package/project/.sdk/src/cmp/go/TestEntity_go.ts +1 -1
- package/project/.sdk/src/cmp/go/Test_go.ts +5 -1
- package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +21 -0
- package/project/.sdk/src/cmp/go/fragment/EntityCreateOp.fragment.go +11 -0
- package/project/.sdk/src/cmp/go/fragment/EntityListOp.fragment.go +11 -0
- package/project/.sdk/src/cmp/go/fragment/EntityLoadOp.fragment.go +11 -0
- package/project/.sdk/src/cmp/go/fragment/EntityRemoveOp.fragment.go +11 -0
- package/project/.sdk/src/cmp/go/fragment/EntityUpdateOp.fragment.go +11 -0
- package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +195 -0
- package/project/.sdk/src/cmp/go-cli/fragment/main.fragment.go +106 -0
- package/project/.sdk/src/cmp/go-cli/fragment/words.fragment.go +132 -0
- package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +184 -0
- package/project/.sdk/src/cmp/go-mcp/fragment/main.fragment.go +68 -0
- package/project/.sdk/src/cmp/go-mcp/fragment/tools.fragment.go +114 -0
- package/project/.sdk/src/cmp/js/EntityTypes_js.ts +111 -0
- package/project/.sdk/src/cmp/js/MainEntity_js.ts +1 -0
- package/project/.sdk/src/cmp/js/Main_js.ts +3 -0
- package/project/.sdk/src/cmp/js/Package_js.ts +16 -7
- package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -7
- package/project/.sdk/src/cmp/js/ReadmeExplanation_js.ts +2 -2
- package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +52 -11
- package/project/.sdk/src/cmp/js/ReadmeIntro_js.ts +39 -1
- package/project/.sdk/src/cmp/js/ReadmeModel_js.ts +50 -18
- package/project/.sdk/src/cmp/js/ReadmeOptions_js.ts +4 -3
- package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +45 -19
- package/project/.sdk/src/cmp/js/ReadmeRef_js.ts +24 -13
- package/project/.sdk/src/cmp/js/ReadmeTopHowto_js.ts +3 -0
- package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +28 -12
- package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +23 -3
- package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +5 -0
- package/project/.sdk/src/cmp/js/fragment/EntityListOp.fragment.js +5 -0
- package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +5 -0
- package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +5 -0
- package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +5 -0
- package/project/.sdk/src/cmp/js/utility_js.ts +57 -0
- package/project/.sdk/src/cmp/lua/EntityTypes_lua.ts +113 -0
- package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +8 -0
- package/project/.sdk/src/cmp/lua/Main_lua.ts +4 -0
- package/project/.sdk/src/cmp/lua/Package_lua.ts +23 -4
- package/project/.sdk/src/cmp/lua/ReadmeEntity_lua.ts +12 -10
- package/project/.sdk/src/cmp/lua/ReadmeExamplesTest_lua.ts +293 -0
- package/project/.sdk/src/cmp/lua/ReadmeHowto_lua.ts +46 -8
- package/project/.sdk/src/cmp/lua/ReadmeInstall_lua.ts +19 -3
- package/project/.sdk/src/cmp/lua/ReadmeIntro_lua.ts +38 -1
- package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +51 -16
- package/project/.sdk/src/cmp/lua/ReadmeOptions_lua.ts +4 -3
- package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +79 -18
- package/project/.sdk/src/cmp/lua/ReadmeRef_lua.ts +25 -20
- package/project/.sdk/src/cmp/lua/ReadmeTopQuick_lua.ts +17 -9
- package/project/.sdk/src/cmp/lua/ReadmeTopTest_lua.ts +32 -5
- package/project/.sdk/src/cmp/lua/Test_lua.ts +4 -0
- package/project/.sdk/src/cmp/lua/fragment/EntityCreateOp.fragment.lua +4 -0
- package/project/.sdk/src/cmp/lua/fragment/EntityListOp.fragment.lua +4 -0
- package/project/.sdk/src/cmp/lua/fragment/EntityLoadOp.fragment.lua +4 -0
- package/project/.sdk/src/cmp/lua/fragment/EntityRemoveOp.fragment.lua +4 -0
- package/project/.sdk/src/cmp/lua/fragment/EntityUpdateOp.fragment.lua +4 -0
- package/project/.sdk/src/cmp/php/EntityTypes_php.ts +142 -0
- package/project/.sdk/src/cmp/php/MainEntity_php.ts +18 -1
- package/project/.sdk/src/cmp/php/Main_php.ts +4 -0
- package/project/.sdk/src/cmp/php/Package_php.ts +18 -7
- package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +15 -11
- package/project/.sdk/src/cmp/php/ReadmeExamplesTest_php.ts +401 -0
- package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +56 -13
- package/project/.sdk/src/cmp/php/ReadmeInstall_php.ts +15 -3
- package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +40 -1
- package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +26 -8
- package/project/.sdk/src/cmp/php/ReadmeOptions_php.ts +4 -3
- package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +80 -22
- package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +51 -42
- package/project/.sdk/src/cmp/php/ReadmeTopHowto_php.ts +1 -1
- package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +19 -11
- package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +41 -11
- package/project/.sdk/src/cmp/php/TestDirect_php.ts +9 -9
- package/project/.sdk/src/cmp/php/TestEntity_php.ts +6 -12
- package/project/.sdk/src/cmp/php/Test_php.ts +4 -0
- package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +13 -1
- package/project/.sdk/src/cmp/php/fragment/EntityCreateOp.fragment.php +10 -1
- package/project/.sdk/src/cmp/php/fragment/EntityListOp.fragment.php +10 -1
- package/project/.sdk/src/cmp/php/fragment/EntityLoadOp.fragment.php +10 -1
- package/project/.sdk/src/cmp/php/fragment/EntityRemoveOp.fragment.php +10 -1
- package/project/.sdk/src/cmp/php/fragment/EntityUpdateOp.fragment.php +10 -1
- package/project/.sdk/src/cmp/php/fragment/Main.fragment.php +22 -14
- package/project/.sdk/src/cmp/py/EntityTypes_py.ts +184 -0
- package/project/.sdk/src/cmp/py/Entity_py.ts +27 -0
- package/project/.sdk/src/cmp/py/MainEntity_py.ts +2 -1
- package/project/.sdk/src/cmp/py/Main_py.ts +35 -0
- package/project/.sdk/src/cmp/py/Package_py.ts +24 -3
- package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +27 -11
- package/project/.sdk/src/cmp/py/ReadmeExamplesTest_py.ts +626 -0
- package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +53 -14
- package/project/.sdk/src/cmp/py/ReadmeInstall_py.ts +19 -3
- package/project/.sdk/src/cmp/py/ReadmeIntro_py.ts +48 -1
- package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +28 -10
- package/project/.sdk/src/cmp/py/ReadmeOptions_py.ts +4 -3
- package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +73 -24
- package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +57 -37
- package/project/.sdk/src/cmp/py/ReadmeTopHowto_py.ts +1 -1
- package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +19 -11
- package/project/.sdk/src/cmp/py/ReadmeTopTest_py.ts +30 -5
- package/project/.sdk/src/cmp/py/TestDirect_py.ts +7 -9
- package/project/.sdk/src/cmp/py/TestEntity_py.ts +6 -14
- package/project/.sdk/src/cmp/py/Test_py.ts +4 -0
- package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +5 -2
- package/project/.sdk/src/cmp/py/fragment/EntityCreateOp.fragment.py +1 -1
- package/project/.sdk/src/cmp/py/fragment/EntityListOp.fragment.py +5 -1
- package/project/.sdk/src/cmp/py/fragment/EntityLoadOp.fragment.py +6 -1
- package/project/.sdk/src/cmp/py/fragment/EntityRemoveOp.fragment.py +6 -1
- package/project/.sdk/src/cmp/py/fragment/EntityUpdateOp.fragment.py +1 -1
- package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +17 -10
- package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +136 -0
- package/project/.sdk/src/cmp/rb/MainEntity_rb.ts +1 -0
- package/project/.sdk/src/cmp/rb/Main_rb.ts +4 -0
- package/project/.sdk/src/cmp/rb/Package_rb.ts +34 -7
- package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +26 -10
- package/project/.sdk/src/cmp/rb/ReadmeExamplesTest_rb.ts +289 -0
- package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +72 -21
- package/project/.sdk/src/cmp/rb/ReadmeInstall_rb.ts +16 -4
- package/project/.sdk/src/cmp/rb/ReadmeIntro_rb.ts +40 -1
- package/project/.sdk/src/cmp/rb/ReadmeModel_rb.ts +29 -12
- package/project/.sdk/src/cmp/rb/ReadmeOptions_rb.ts +4 -3
- package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +85 -22
- package/project/.sdk/src/cmp/rb/ReadmeRef_rb.ts +56 -37
- package/project/.sdk/src/cmp/rb/ReadmeTopHowto_rb.ts +1 -1
- package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +19 -11
- package/project/.sdk/src/cmp/rb/ReadmeTopTest_rb.ts +43 -11
- package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +9 -9
- package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +6 -12
- package/project/.sdk/src/cmp/rb/Test_rb.ts +4 -0
- package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +2 -0
- package/project/.sdk/src/cmp/rb/fragment/EntityCreateOp.fragment.rb +5 -0
- package/project/.sdk/src/cmp/rb/fragment/EntityListOp.fragment.rb +20 -2
- package/project/.sdk/src/cmp/rb/fragment/EntityLoadOp.fragment.rb +8 -1
- package/project/.sdk/src/cmp/rb/fragment/EntityRemoveOp.fragment.rb +6 -1
- package/project/.sdk/src/cmp/rb/fragment/EntityUpdateOp.fragment.rb +5 -0
- package/project/.sdk/src/cmp/rb/fragment/Main.fragment.rb +24 -8
- package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +105 -0
- package/project/.sdk/src/cmp/ts/Entity_ts.ts +17 -1
- package/project/.sdk/src/cmp/ts/MainEntity_ts.ts +1 -0
- package/project/.sdk/src/cmp/ts/Main_ts.ts +6 -0
- package/project/.sdk/src/cmp/ts/Package_ts.ts +14 -7
- package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -7
- package/project/.sdk/src/cmp/ts/ReadmeExampleTest_ts.ts +81 -0
- package/project/.sdk/src/cmp/ts/ReadmeExamplesTest_ts.ts +446 -0
- package/project/.sdk/src/cmp/ts/ReadmeExplanation_ts.ts +2 -2
- package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +57 -11
- package/project/.sdk/src/cmp/ts/ReadmeInstall_ts.ts +19 -6
- package/project/.sdk/src/cmp/ts/ReadmeIntro_ts.ts +39 -1
- package/project/.sdk/src/cmp/ts/ReadmeModel_ts.ts +50 -18
- package/project/.sdk/src/cmp/ts/ReadmeOptions_ts.ts +4 -3
- package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +95 -40
- package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +24 -13
- package/project/.sdk/src/cmp/ts/ReadmeTopHowto_ts.ts +3 -0
- package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +44 -12
- package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +23 -3
- package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +2 -2
- package/project/.sdk/src/cmp/ts/Test_ts.ts +5 -0
- package/project/.sdk/src/cmp/ts/fragment/Entity.fragment.ts +3 -1
- package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +10 -5
- package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +4 -2
- package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +4 -2
- package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +4 -2
- package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +4 -2
- package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +4 -2
- package/project/.sdk/src/cmp/ts/utility_ts.ts +59 -0
- package/project/.sdk/tm/go/LICENSE +1 -1
- package/project/.sdk/tm/go/Makefile +36 -1
- package/project/.sdk/tm/go/VERSION +1 -0
- package/project/.sdk/tm/go/core/context.go +12 -7
- package/project/.sdk/tm/go-cli/src/feature/README.md +6 -0
- package/project/.sdk/tm/go-cli/src/feature/base/.gitkeep +0 -0
- package/project/.sdk/tm/go-cli/src/feature/log/.gitkeep +0 -0
- package/project/.sdk/tm/go-cli/src/feature/test/.gitkeep +0 -0
- package/project/.sdk/tm/go-mcp/src/feature/README.md +6 -0
- package/project/.sdk/tm/go-mcp/src/feature/base/.gitkeep +0 -0
- package/project/.sdk/tm/go-mcp/src/feature/log/.gitkeep +0 -0
- package/project/.sdk/tm/go-mcp/src/feature/test/.gitkeep +0 -0
- package/project/.sdk/tm/js/LICENSE +1 -1
- package/project/.sdk/tm/js/Makefile +41 -0
- package/project/.sdk/tm/lua/LICENSE +1 -1
- package/project/.sdk/tm/lua/Makefile +40 -1
- package/project/.sdk/tm/lua/core/context.lua +13 -8
- package/project/.sdk/tm/php/LICENSE +1 -1
- package/project/.sdk/tm/php/Makefile +31 -1
- package/project/.sdk/tm/php/VERSION +1 -0
- package/project/.sdk/tm/php/core/Context.php +12 -6
- package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +13 -4
- package/project/.sdk/tm/php/utility/Done.php +2 -2
- package/project/.sdk/tm/php/utility/MakeError.php +3 -3
- package/project/.sdk/tm/py/LICENSE +1 -1
- package/project/.sdk/tm/py/Makefile +34 -1
- package/project/.sdk/tm/py/core/context.py +12 -7
- package/project/.sdk/tm/py/test/test_primary_utility.py +15 -4
- package/project/.sdk/tm/py/utility/done.py +3 -1
- package/project/.sdk/tm/py/utility/make_error.py +2 -2
- package/project/.sdk/tm/rb/LICENSE +1 -1
- package/project/.sdk/tm/rb/Makefile +33 -1
- package/project/.sdk/tm/rb/core/context.rb +8 -3
- package/project/.sdk/tm/rb/test/primary_utility_test.rb +2 -2
- package/project/.sdk/tm/rb/utility/done.rb +3 -1
- package/project/.sdk/tm/rb/utility/make_error.rb +5 -2
- package/project/.sdk/tm/ts/LICENSE +1 -1
- package/project/.sdk/tm/ts/Makefile +42 -0
- package/project/.sdk/tm/ts/src/Context.ts +8 -3
- package/src/action/action.ts +17 -10
- package/src/action/feature.ts +8 -6
- package/src/action/target.ts +17 -8
- package/src/cmp/Changelog.ts +34 -0
- package/src/cmp/Deploy.ts +258 -0
- package/src/cmp/FeatureHook.ts +6 -8
- package/src/cmp/License.ts +49 -0
- package/src/cmp/Readme.ts +2 -0
- package/src/cmp/ReadmeErrors.ts +257 -0
- package/src/cmp/ReadmeExplanation.ts +250 -230
- package/src/cmp/ReadmeModel.ts +7 -2
- package/src/cmp/ReadmeTop.ts +411 -95
- package/src/cmp/Security.ts +41 -0
- package/src/helpers/canonType.ts +89 -0
- package/src/helpers/collectDeps.ts +5 -3
- package/src/helpers/naming.ts +59 -0
- package/src/helpers/opExample.ts +170 -0
- package/src/helpers/opShape.ts +236 -0
- package/src/helpers/packageMeta.ts +236 -0
- package/src/sdkgen.ts +87 -20
- package/src/tsconfig.json +1 -0
- package/src/types.ts +85 -2
- package/src/utility.ts +22 -11
- package/README.md +0 -2
- package/dist/action/lang.d.ts +0 -2
- package/dist/action/lang.js +0 -68
- package/dist/action/lang.js.map +0 -1
- package/dist/cmp/Hook.d.ts +0 -2
- package/dist/cmp/Hook.js +0 -10
- package/dist/cmp/Hook.js.map +0 -1
- package/dist/cmp/Top.d.ts +0 -2
- package/dist/cmp/Top.js +0 -23
- package/dist/cmp/Top.js.map +0 -1
- package/dist/prepare-openapi.d.ts +0 -2
- package/dist/prepare-openapi.js +0 -37
- package/dist/prepare-openapi.js.map +0 -1
- package/model/sdkgen.jsonic +0 -74
- package/project/.sdk/tm/go/utility/struct/go.mod +0 -3
|
@@ -13,6 +13,23 @@ const ReadmeModel = cmp(function ReadmeModel(props: any) {
|
|
|
13
13
|
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
14
14
|
const entityList = each(entity).filter((e: any) => e.active !== false)
|
|
15
15
|
|
|
16
|
+
// Model-driven op rows for the shared entity interface: emit a
|
|
17
|
+
// load/list/create/update/remove row only for operations at least one active
|
|
18
|
+
// entity actually exposes (a read-only entity has just list+load) — never
|
|
19
|
+
// document an operation no entity has.
|
|
20
|
+
const opUnion = new Set<string>()
|
|
21
|
+
entityList.forEach((e: any) => Object.keys(e.op || {})
|
|
22
|
+
.forEach((o: string) => { if (e.op[o] && e.op[o].active !== false) opUnion.add(o) }))
|
|
23
|
+
const opRowDefs: Record<string, string> = {
|
|
24
|
+
load: '| `load` | `(reqmatch, ctrl) -> any` | Load a single entity by match criteria. Raises on error. |',
|
|
25
|
+
list: '| `list` | `(reqmatch = nil, ctrl) -> Array` | List entities matching the criteria (call with no argument to list all). Raises on error. |',
|
|
26
|
+
create: '| `create` | `(reqdata, ctrl) -> any` | Create a new entity. Raises on error. |',
|
|
27
|
+
update: '| `update` | `(reqdata, ctrl) -> any` | Update an existing entity. Raises on error. |',
|
|
28
|
+
remove: '| `remove` | `(reqmatch, ctrl) -> any` | Remove an entity. Raises on error. |',
|
|
29
|
+
}
|
|
30
|
+
const opRows = ['load', 'list', 'create', 'update', 'remove']
|
|
31
|
+
.filter((o) => opUnion.has(o)).map((o) => opRowDefs[o]).join('\n')
|
|
32
|
+
|
|
16
33
|
const apikeyOptionRow = isAuthActive(model)
|
|
17
34
|
? '| `apikey` | `String` | API key for authentication. |\n'
|
|
18
35
|
: ''
|
|
@@ -49,12 +66,13 @@ Creates a test-mode client with mock transport. Both arguments may be \`nil\`.
|
|
|
49
66
|
| --- | --- | --- |
|
|
50
67
|
| \`options_map\` | \`() -> Hash\` | Deep copy of current SDK options. |
|
|
51
68
|
| \`get_utility\` | \`() -> Utility\` | Copy of the SDK utility object. |
|
|
52
|
-
| \`prepare\` | \`(fetchargs) ->
|
|
53
|
-
| \`direct\` | \`(fetchargs) ->
|
|
69
|
+
| \`prepare\` | \`(fetchargs) -> Hash\` | Build an HTTP request definition without sending. Raises on error. |
|
|
70
|
+
| \`direct\` | \`(fetchargs) -> Hash\` | Build and send an HTTP request. Returns a result hash (\`result["ok"]\`); does not raise. |
|
|
54
71
|
`)
|
|
55
72
|
|
|
56
73
|
each(entityList, (ent: any) => {
|
|
57
|
-
|
|
74
|
+
const article = /^[aeiou]/i.test(ent.Name) ? 'an' : 'a'
|
|
75
|
+
Content(`| \`${ent.Name}\` | \`(data) -> ${ent.Name}Entity\` | Create ${article} ${ent.Name} entity instance. |
|
|
58
76
|
`)
|
|
59
77
|
})
|
|
60
78
|
|
|
@@ -65,11 +83,7 @@ All entities share the same interface.
|
|
|
65
83
|
|
|
66
84
|
| Method | Signature | Description |
|
|
67
85
|
| --- | --- | --- |
|
|
68
|
-
|
|
69
|
-
| \`list\` | \`(reqmatch, ctrl) -> [any, err]\` | List entities matching the criteria. |
|
|
70
|
-
| \`create\` | \`(reqdata, ctrl) -> [any, err]\` | Create a new entity. |
|
|
71
|
-
| \`update\` | \`(reqdata, ctrl) -> [any, err]\` | Update an existing entity. |
|
|
72
|
-
| \`remove\` | \`(reqmatch, ctrl) -> [any, err]\` | Remove an entity. |
|
|
86
|
+
${opRows}
|
|
73
87
|
| \`data_get\` | \`() -> Hash\` | Get entity data. |
|
|
74
88
|
| \`data_set\` | \`(data)\` | Set entity data. |
|
|
75
89
|
| \`match_get\` | \`() -> Hash\` | Get entity match criteria. |
|
|
@@ -79,8 +93,12 @@ All entities share the same interface.
|
|
|
79
93
|
|
|
80
94
|
### Result shape
|
|
81
95
|
|
|
82
|
-
Entity operations return
|
|
83
|
-
\`
|
|
96
|
+
Entity operations return the result data directly. On failure they
|
|
97
|
+
raise a \`${model.const.Name}Error\` (a \`StandardError\` subclass), so wrap
|
|
98
|
+
calls in \`begin\`/\`rescue\` where you need to handle errors.
|
|
99
|
+
|
|
100
|
+
The \`direct\` escape hatch is the exception: it never raises and instead
|
|
101
|
+
returns a result \`Hash\` with these keys:
|
|
84
102
|
|
|
85
103
|
| Key | Type | Description |
|
|
86
104
|
| --- | --- | --- |
|
|
@@ -88,8 +106,7 @@ Entity operations return \`[any, err]\`. The first value is a
|
|
|
88
106
|
| \`status\` | \`Integer\` | HTTP status code. |
|
|
89
107
|
| \`headers\` | \`Hash\` | Response headers. |
|
|
90
108
|
| \`data\` | \`any\` | Parsed JSON response body. |
|
|
91
|
-
|
|
92
|
-
On error, \`ok\` is \`false\` and \`err\` contains the error value.
|
|
109
|
+
| \`err\` | \`Error\` | Present when \`ok\` is \`false\`. |
|
|
93
110
|
|
|
94
111
|
`)
|
|
95
112
|
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
|
|
2
|
-
import { cmp, each, Content } from '@voxgig/sdkgen'
|
|
2
|
+
import { cmp, each, Content, envName, isAuthActive } from '@voxgig/sdkgen'
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
const ReadmeOptions = cmp(function ReadmeOptions(props: any) {
|
|
6
6
|
const { target } = props
|
|
7
7
|
const { model } = props.ctx$
|
|
8
8
|
|
|
9
|
-
const publishedOptions = each(target.options).filter((option: any) =>
|
|
9
|
+
const publishedOptions = each(target.options).filter((option: any) =>
|
|
10
|
+
option.publish && ('apikey' !== option.name || isAuthActive(model)))
|
|
10
11
|
if (0 === publishedOptions.length) {
|
|
11
12
|
return
|
|
12
13
|
}
|
|
@@ -25,7 +26,7 @@ client = ${model.Name}SDK.new({
|
|
|
25
26
|
|
|
26
27
|
publishedOptions.map((option: any) => {
|
|
27
28
|
if ('apikey' === option.name) {
|
|
28
|
-
Content(` "${option.name}" => ENV["${model
|
|
29
|
+
Content(` "${option.name}" => ENV["${envName(model)}_APIKEY"],
|
|
29
30
|
`)
|
|
30
31
|
}
|
|
31
32
|
else {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { cmp, each, Content, isAuthActive } from '@voxgig/sdkgen'
|
|
2
|
+
import { cmp, each, Content, isAuthActive, envName, canonKey, opRequestShape, entityIdField, entityDataIdField } from '@voxgig/sdkgen'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
KIT,
|
|
@@ -18,36 +18,57 @@ const ReadmeQuick = cmp(function ReadmeQuick(props: any) {
|
|
|
18
18
|
e.active !== false && e.ancestors && e.ancestors.length > 0
|
|
19
19
|
) as any
|
|
20
20
|
|
|
21
|
-
const
|
|
22
|
-
?
|
|
23
|
-
:
|
|
21
|
+
const ctor = isAuthActive(model)
|
|
22
|
+
? `${model.const.Name}SDK.new({\n "apikey" => ENV["${envName(model)}_APIKEY"],\n})`
|
|
23
|
+
: `${model.const.Name}SDK.new`
|
|
24
24
|
|
|
25
25
|
Content(`### 1. Create a client
|
|
26
26
|
|
|
27
27
|
\`\`\`ruby
|
|
28
28
|
require_relative "${model.const.Name}_sdk"
|
|
29
29
|
|
|
30
|
-
client = ${
|
|
30
|
+
client = ${ctor}
|
|
31
31
|
\`\`\`
|
|
32
32
|
|
|
33
33
|
`)
|
|
34
34
|
|
|
35
35
|
if (exampleEntity) {
|
|
36
36
|
const eName = nom(exampleEntity, 'Name')
|
|
37
|
+
const article = /^[aeiou]/i.test(eName) ? "an" : "a"
|
|
37
38
|
const opnames = Object.keys(exampleEntity.op || {})
|
|
39
|
+
// Model-driven id keys: `idF` is the load-MATCH key (null when the entity
|
|
40
|
+
// has no id-like field — a response-wrapped spec); when null, load/remove
|
|
41
|
+
// take no argument. `dataIdF` is the id on the RETURNED record's data type —
|
|
42
|
+
// an entity can key its match on an id it does not carry as data, so both a
|
|
43
|
+
// listed record's id column and a `created["id"]` read must be guarded on
|
|
44
|
+
// this, not the match key.
|
|
45
|
+
const idF = entityIdField(exampleEntity)
|
|
46
|
+
const dataIdF = entityDataIdField(exampleEntity)
|
|
47
|
+
|
|
48
|
+
// Model-driven display field: the entity's first non-id string field
|
|
49
|
+
// (falling back to any non-id field), so the list example prints a real
|
|
50
|
+
// column instead of a hardcoded "name" the entity may not have.
|
|
51
|
+
const fields = exampleEntity.fields || []
|
|
52
|
+
const displayField =
|
|
53
|
+
fields.find((f: any) => f && f.name !== 'id' && f.type === '$STRING') ||
|
|
54
|
+
fields.find((f: any) => f && f.name !== 'id') ||
|
|
55
|
+
null
|
|
56
|
+
const idCol = dataIdF ? `#{item[${JSON.stringify(dataIdF)}]}` : null
|
|
57
|
+
const dispCol = displayField ? `#{item[${JSON.stringify(displayField.name)}]}` : null
|
|
58
|
+
const itemPrint = [idCol, dispCol].filter(Boolean).join(' ') || '#{item}'
|
|
38
59
|
|
|
39
60
|
if (opnames.includes('list')) {
|
|
40
|
-
Content(`### 2. List ${eName.toLowerCase()}
|
|
61
|
+
Content(`### 2. List ${eName.toLowerCase()} records
|
|
41
62
|
|
|
42
63
|
\`\`\`ruby
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
d = item.data_get
|
|
49
|
-
puts "#{d["id"]} #{d["name"]}"
|
|
64
|
+
begin
|
|
65
|
+
# list returns an Array of ${eName} records — iterate directly.
|
|
66
|
+
${eName.toLowerCase()}s = client.${eName}.list
|
|
67
|
+
${eName.toLowerCase()}s.each do |item|
|
|
68
|
+
puts "${itemPrint}"
|
|
50
69
|
end
|
|
70
|
+
rescue => err
|
|
71
|
+
warn "list failed: #{err}"
|
|
51
72
|
end
|
|
52
73
|
\`\`\`
|
|
53
74
|
|
|
@@ -55,37 +76,79 @@ end
|
|
|
55
76
|
}
|
|
56
77
|
|
|
57
78
|
if (opnames.includes('load')) {
|
|
58
|
-
Content(`### 3. Load
|
|
79
|
+
Content(`### 3. Load ${article} ${eName.toLowerCase()}
|
|
59
80
|
|
|
60
81
|
\`\`\`ruby
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
82
|
+
begin
|
|
83
|
+
# load returns the bare ${eName} record (raises on error).
|
|
84
|
+
${eName.toLowerCase()} = client.${eName}.load(${idF ? `{ "${idF}" => "example_id" }` : ''})
|
|
85
|
+
puts ${eName.toLowerCase()}
|
|
86
|
+
rescue => err
|
|
87
|
+
warn "load failed: #{err}"
|
|
88
|
+
end
|
|
64
89
|
\`\`\`
|
|
65
90
|
|
|
66
91
|
`)
|
|
67
92
|
}
|
|
68
93
|
|
|
94
|
+
// Model-driven example fields: derive the create/update body from the op
|
|
95
|
+
// shape (opRequestShape) so the docs reference REAL writable fields, not a
|
|
96
|
+
// hardcoded "name" the entity may not have. Literals are Ruby-typed by the
|
|
97
|
+
// field's canonical type.
|
|
98
|
+
const idField = (exampleEntity.id && exampleEntity.id.field) || 'id'
|
|
99
|
+
const rbLit = (type: any): string => {
|
|
100
|
+
const k = canonKey(type)
|
|
101
|
+
if ('INTEGER' === k || 'NUMBER' === k) return '1'
|
|
102
|
+
if ('BOOLEAN' === k) return 'true'
|
|
103
|
+
if ('ARRAY' === k) return '[]'
|
|
104
|
+
if ('OBJECT' === k) return '{}'
|
|
105
|
+
return '"example"'
|
|
106
|
+
}
|
|
107
|
+
const examplePairs = (opname: string): string[] => {
|
|
108
|
+
const items = opRequestShape(exampleEntity, opname).items
|
|
109
|
+
.filter((it: any) => it.name !== idField && it.name !== 'id')
|
|
110
|
+
const required = items.filter((it: any) => !it.optional)
|
|
111
|
+
// create needs ALL required fields; update is a patch, so a couple suffice.
|
|
112
|
+
const chosen = 'create' === opname
|
|
113
|
+
? (required.length ? required : items.slice(0, 2))
|
|
114
|
+
: items.slice(0, 2)
|
|
115
|
+
return chosen.map((it: any) => `"${it.name}" => ${rbLit(it.type)}`)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// The id VALUE for an update/remove match: off the returned `created`
|
|
119
|
+
// record only when its data type carries the id AND a create ran, else a
|
|
120
|
+
// type-correct literal (so an update-without-create never references an
|
|
121
|
+
// undefined `created`).
|
|
122
|
+
const idParamType = (opname: string): any => {
|
|
123
|
+
const it = opRequestShape(exampleEntity, opname).items.find((x: any) => x.name === idF)
|
|
124
|
+
return it && it.type
|
|
125
|
+
}
|
|
126
|
+
const idValueFor = (opname: string): string => (null != dataIdF && opnames.includes('create'))
|
|
127
|
+
? `created["${dataIdF}"]`
|
|
128
|
+
: rbLit(idParamType(opname))
|
|
129
|
+
|
|
69
130
|
if (opnames.includes('create') || opnames.includes('update') || opnames.includes('remove')) {
|
|
70
131
|
Content(`### 4. Create, update, and remove
|
|
71
132
|
|
|
72
133
|
\`\`\`ruby
|
|
73
134
|
`)
|
|
74
135
|
if (opnames.includes('create')) {
|
|
75
|
-
Content(`#
|
|
76
|
-
created
|
|
136
|
+
Content(`# create returns the bare created ${eName} record.
|
|
137
|
+
created = client.${eName}.create({ ${examplePairs('create').join(', ')} })
|
|
77
138
|
|
|
78
139
|
`)
|
|
79
140
|
}
|
|
80
141
|
if (opnames.includes('update')) {
|
|
81
|
-
|
|
82
|
-
|
|
142
|
+
const updatePairs = (idF ? [`"${idF}" => ${idValueFor('update')}`] : []).concat(examplePairs('update'))
|
|
143
|
+
const fromCreated = null != dataIdF && opnames.includes('create')
|
|
144
|
+
Content(`# Update${fromCreated ? ` — index the bare record directly (created["${dataIdF}"]).` : ''}
|
|
145
|
+
client.${eName}.update({ ${updatePairs.join(', ')} })
|
|
83
146
|
|
|
84
147
|
`)
|
|
85
148
|
}
|
|
86
149
|
if (opnames.includes('remove')) {
|
|
87
150
|
Content(`# Remove
|
|
88
|
-
client.${eName}
|
|
151
|
+
client.${eName}.remove(${idF ? `{ "${idF}" => ${idValueFor('remove')} }` : ''})
|
|
89
152
|
`)
|
|
90
153
|
}
|
|
91
154
|
Content(`\`\`\`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { cmp, each, Content, File, isAuthActive } from '@voxgig/sdkgen'
|
|
2
|
+
import { cmp, each, Content, canonToType, canonKey, File, isAuthActive, entityIdField } from '@voxgig/sdkgen'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
KIT,
|
|
@@ -7,31 +7,43 @@ import {
|
|
|
7
7
|
} from '@voxgig/apidef'
|
|
8
8
|
|
|
9
9
|
|
|
10
|
+
// A type-correct Ruby literal for a field's canonical type — the create body
|
|
11
|
+
// is EXECUTED by the doc test, so it must carry a real value per field.
|
|
12
|
+
function rbLit(type: any): string {
|
|
13
|
+
const k = canonKey(type)
|
|
14
|
+
if ('INTEGER' === k || 'NUMBER' === k) return '1'
|
|
15
|
+
if ('BOOLEAN' === k) return 'true'
|
|
16
|
+
if ('ARRAY' === k) return '[]'
|
|
17
|
+
if ('OBJECT' === k) return '{}'
|
|
18
|
+
return '"example"'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
10
22
|
const OP_SIGNATURES: Record<string, { sig: string, returns: string, desc: string }> = {
|
|
11
23
|
load: {
|
|
12
|
-
sig: 'load(reqmatch, ctrl = nil) -> result
|
|
13
|
-
returns: 'result
|
|
14
|
-
desc: 'Load a single entity matching the given criteria.',
|
|
24
|
+
sig: 'load(reqmatch, ctrl = nil) -> result',
|
|
25
|
+
returns: 'result',
|
|
26
|
+
desc: 'Load a single entity matching the given criteria. Raises on error.',
|
|
15
27
|
},
|
|
16
28
|
list: {
|
|
17
|
-
sig: 'list(reqmatch, ctrl = nil) ->
|
|
18
|
-
returns: '
|
|
19
|
-
desc: 'List entities matching the given criteria. Returns an array.',
|
|
29
|
+
sig: 'list(reqmatch = nil, ctrl = nil) -> Array',
|
|
30
|
+
returns: 'Array',
|
|
31
|
+
desc: 'List entities matching the given criteria (call with no argument to list all). Returns an array. Raises on error.',
|
|
20
32
|
},
|
|
21
33
|
create: {
|
|
22
|
-
sig: 'create(reqdata, ctrl = nil) -> result
|
|
23
|
-
returns: 'result
|
|
24
|
-
desc: 'Create a new entity with the given data.',
|
|
34
|
+
sig: 'create(reqdata, ctrl = nil) -> result',
|
|
35
|
+
returns: 'result',
|
|
36
|
+
desc: 'Create a new entity with the given data. Raises on error.',
|
|
25
37
|
},
|
|
26
38
|
update: {
|
|
27
|
-
sig: 'update(reqdata, ctrl = nil) -> result
|
|
28
|
-
returns: 'result
|
|
29
|
-
desc: 'Update an existing entity. The data must include the entity `id`.',
|
|
39
|
+
sig: 'update(reqdata, ctrl = nil) -> result',
|
|
40
|
+
returns: 'result',
|
|
41
|
+
desc: 'Update an existing entity. The data must include the entity `id`. Raises on error.',
|
|
30
42
|
},
|
|
31
43
|
remove: {
|
|
32
|
-
sig: 'remove(reqmatch, ctrl = nil) -> result
|
|
33
|
-
returns: 'result
|
|
34
|
-
desc: 'Remove the entity matching the given criteria.',
|
|
44
|
+
sig: 'remove(reqmatch, ctrl = nil) -> result',
|
|
45
|
+
returns: 'result',
|
|
46
|
+
desc: 'Remove the entity matching the given criteria. Raises on error.',
|
|
35
47
|
},
|
|
36
48
|
}
|
|
37
49
|
|
|
@@ -60,7 +72,7 @@ Complete API reference for the ${model.Name} ${target.title} SDK.
|
|
|
60
72
|
`)
|
|
61
73
|
|
|
62
74
|
Content(`\`\`\`ruby
|
|
63
|
-
require_relative '${model.
|
|
75
|
+
require_relative '${model.const.Name}_sdk'
|
|
64
76
|
|
|
65
77
|
client = ${model.const.Name}SDK.new(options)
|
|
66
78
|
\`\`\`
|
|
@@ -72,8 +84,7 @@ Create a new SDK client instance.
|
|
|
72
84
|
| Name | Type | Description |
|
|
73
85
|
| --- | --- | --- |
|
|
74
86
|
| \`options\` | \`Hash\` | SDK configuration options. |
|
|
75
|
-
| \`options["apikey"]\` | \`String\` | API key for authentication. |
|
|
76
|
-
| \`options["base"]\` | \`String\` | Base URL for API requests. |
|
|
87
|
+
${isAuthActive(model) ? '| \`options["apikey"]\` | \`String\` | API key for authentication. |\n' : ''}| \`options["base"]\` | \`String\` | Base URL for API requests. |
|
|
77
88
|
| \`options["prefix"]\` | \`String\` | URL prefix appended after base. |
|
|
78
89
|
| \`options["suffix"]\` | \`String\` | URL suffix appended after path. |
|
|
79
90
|
| \`options["headers"]\` | \`Hash\` | Custom headers for all requests. |
|
|
@@ -123,9 +134,11 @@ Return a deep copy of the current SDK options.
|
|
|
123
134
|
|
|
124
135
|
Return a copy of the SDK utility object.
|
|
125
136
|
|
|
126
|
-
#### \`direct(fetchargs = {}) -> Hash
|
|
137
|
+
#### \`direct(fetchargs = {}) -> Hash\`
|
|
127
138
|
|
|
128
|
-
Make a direct HTTP request to any API endpoint.
|
|
139
|
+
Make a direct HTTP request to any API endpoint. Returns a result hash
|
|
140
|
+
(\`{ "ok" => ..., "status" => ..., "data" => ..., "err" => ... }\`); it
|
|
141
|
+
does not raise — inspect \`result["ok"]\`.
|
|
129
142
|
|
|
130
143
|
**Parameters:**
|
|
131
144
|
|
|
@@ -139,14 +152,14 @@ Make a direct HTTP request to any API endpoint.
|
|
|
139
152
|
| \`fetchargs["body"]\` | \`any\` | Request body (hashes are JSON-serialized). |
|
|
140
153
|
| \`fetchargs["ctrl"]\` | \`Hash\` | Control options (e.g. \`{ "explain" => true }\`). |
|
|
141
154
|
|
|
142
|
-
**Returns:** \`Hash
|
|
155
|
+
**Returns:** \`Hash\`
|
|
143
156
|
|
|
144
|
-
#### \`prepare(fetchargs = {}) -> Hash
|
|
157
|
+
#### \`prepare(fetchargs = {}) -> Hash\`
|
|
145
158
|
|
|
146
159
|
Prepare a fetch definition without sending the request. Accepts the
|
|
147
|
-
same parameters as \`direct()\`.
|
|
160
|
+
same parameters as \`direct()\`. Raises on error.
|
|
148
161
|
|
|
149
|
-
**Returns:** \`Hash
|
|
162
|
+
**Returns:** \`Hash\` (the fetch definition; raises on error)
|
|
150
163
|
|
|
151
164
|
`)
|
|
152
165
|
|
|
@@ -155,6 +168,9 @@ same parameters as \`direct()\`.
|
|
|
155
168
|
publishedEntities.map((ent: any) => {
|
|
156
169
|
const opnames = Object.keys(ent.op || {})
|
|
157
170
|
const fields = ent.fields || []
|
|
171
|
+
// Model-driven id key: null when this entity has no id-like field, in
|
|
172
|
+
// which case load/remove match on no argument and update omits the id.
|
|
173
|
+
const idF = entityIdField(ent)
|
|
158
174
|
|
|
159
175
|
Content(`
|
|
160
176
|
---
|
|
@@ -186,7 +202,7 @@ ${ent.name} = client.${ent.Name}
|
|
|
186
202
|
each(fields, (field: any) => {
|
|
187
203
|
const req = field.req ? 'Yes' : 'No'
|
|
188
204
|
const desc = field.short || ''
|
|
189
|
-
Content(`| \`${field.name}\` | \`${field.type
|
|
205
|
+
Content(`| \`${field.name}\` | \`${canonToType(field.type, target.name)}\` | ${req} | ${desc} |
|
|
190
206
|
`)
|
|
191
207
|
})
|
|
192
208
|
|
|
@@ -196,15 +212,18 @@ ${ent.name} = client.${ent.Name}
|
|
|
196
212
|
// Field operations breakdown
|
|
197
213
|
const hasFieldOps = fields.some((f: any) => f.op && Object.keys(f.op).length > 0)
|
|
198
214
|
if (hasFieldOps) {
|
|
215
|
+
// Only emit columns for operations this entity actually exposes —
|
|
216
|
+
// never advertise a create/update/remove column the entity lacks.
|
|
217
|
+
const opcols = ['load', 'list', 'create', 'update', 'remove']
|
|
218
|
+
.filter((op: string) => opnames.includes(op) && ent.op[op]?.active !== false)
|
|
199
219
|
Content(`### Field Usage by Operation
|
|
200
220
|
|
|
201
|
-
| Field |
|
|
202
|
-
| --- |
|
|
221
|
+
| Field | ${opcols.join(' | ')} |
|
|
222
|
+
| --- | ${opcols.map(() => '---').join(' | ')} |
|
|
203
223
|
`)
|
|
204
224
|
each(fields, (field: any) => {
|
|
205
225
|
const fops = field.op || {}
|
|
206
|
-
const cols =
|
|
207
|
-
if (!opnames.includes(op)) return '-'
|
|
226
|
+
const cols = opcols.map((op: string) => {
|
|
208
227
|
const fop = fops[op]
|
|
209
228
|
if (null == fop) return '-'
|
|
210
229
|
if (fop.active === false) return '-'
|
|
@@ -239,25 +258,25 @@ ${info.desc}
|
|
|
239
258
|
// Show example
|
|
240
259
|
if ('load' === opname || 'remove' === opname) {
|
|
241
260
|
Content(`\`\`\`ruby
|
|
242
|
-
result
|
|
261
|
+
result = client.${ent.Name}.${opname}(${idF ? `{ "${idF}" => "${ent.name}_id" }` : ''})
|
|
243
262
|
\`\`\`
|
|
244
263
|
|
|
245
264
|
`)
|
|
246
265
|
}
|
|
247
266
|
else if ('list' === opname) {
|
|
248
267
|
Content(`\`\`\`ruby
|
|
249
|
-
results
|
|
268
|
+
results = client.${ent.Name}.list
|
|
250
269
|
\`\`\`
|
|
251
270
|
|
|
252
271
|
`)
|
|
253
272
|
}
|
|
254
273
|
else if ('create' === opname) {
|
|
255
274
|
Content(`\`\`\`ruby
|
|
256
|
-
result
|
|
275
|
+
result = client.${ent.Name}.create({
|
|
257
276
|
`)
|
|
258
277
|
each(fields, (field: any) => {
|
|
259
278
|
if ('id' !== field.name && field.req) {
|
|
260
|
-
Content(` "${field.name}" => # ${field.type
|
|
279
|
+
Content(` "${field.name}" => ${rbLit(field.type)}, # ${canonToType(field.type, target.name)}
|
|
261
280
|
`)
|
|
262
281
|
}
|
|
263
282
|
})
|
|
@@ -267,10 +286,10 @@ result, err = client.${ent.Name}.create({
|
|
|
267
286
|
`)
|
|
268
287
|
}
|
|
269
288
|
else if ('update' === opname) {
|
|
289
|
+
const updateIdLine = idF ? ` "${idF}" => "${ent.name}_id",\n` : ''
|
|
270
290
|
Content(`\`\`\`ruby
|
|
271
|
-
result
|
|
272
|
-
|
|
273
|
-
# Fields to update
|
|
291
|
+
result = client.${ent.Name}.update({
|
|
292
|
+
${updateIdLine} # Fields to update
|
|
274
293
|
})
|
|
275
294
|
\`\`\`
|
|
276
295
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { cmp, Content, isAuthActive } from '@voxgig/sdkgen'
|
|
2
|
+
import { cmp, Content, isAuthActive, envName, entityIdField } from '@voxgig/sdkgen'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
KIT,
|
|
@@ -15,34 +15,42 @@ const ReadmeTopQuick = cmp(function ReadmeTopQuick(props: any) {
|
|
|
15
15
|
|
|
16
16
|
const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
|
|
17
17
|
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const authActive = isAuthActive(model)
|
|
19
|
+
const ctor = authActive
|
|
20
|
+
? `${model.const.Name}SDK.new({\n "apikey" => ENV["${envName(model)}_APIKEY"],\n})`
|
|
21
|
+
: `${model.const.Name}SDK.new`
|
|
21
22
|
|
|
22
23
|
Content(`\`\`\`ruby
|
|
23
24
|
require_relative "${model.const.Name}_sdk"
|
|
24
25
|
|
|
25
|
-
client = ${
|
|
26
|
+
client = ${ctor}
|
|
26
27
|
|
|
27
28
|
`)
|
|
28
29
|
|
|
29
30
|
if (exampleEntity) {
|
|
30
31
|
const eName = nom(exampleEntity, 'Name')
|
|
31
32
|
const opnames = Object.keys(exampleEntity.op || {})
|
|
33
|
+
// Model-driven id key: null when the entity has no id-like field, in which
|
|
34
|
+
// case the load example takes no match argument.
|
|
35
|
+
const idF = entityIdField(exampleEntity)
|
|
36
|
+
|
|
37
|
+
let hasCall = false
|
|
32
38
|
|
|
33
39
|
if (opnames.includes('list')) {
|
|
34
|
-
Content(`# List all ${eName.toLowerCase()}s
|
|
35
|
-
${eName.toLowerCase()}s
|
|
40
|
+
Content(`# List all ${eName.toLowerCase()}s (returns an Array; raises on error)
|
|
41
|
+
${eName.toLowerCase()}s = client.${eName}.list
|
|
42
|
+
puts ${eName.toLowerCase()}s
|
|
36
43
|
`)
|
|
44
|
+
hasCall = true
|
|
37
45
|
}
|
|
38
46
|
|
|
39
47
|
if (opnames.includes('load')) {
|
|
40
48
|
Content(`
|
|
41
|
-
# Load a specific ${eName.toLowerCase()}
|
|
42
|
-
${eName.toLowerCase()}
|
|
43
|
-
|
|
44
|
-
)
|
|
49
|
+
# Load a specific ${eName.toLowerCase()} (returns the bare record; raises on error)
|
|
50
|
+
${eName.toLowerCase()} = client.${eName}.load(${idF ? `{ "${idF}" => "example_id" }` : ''})
|
|
51
|
+
puts ${eName.toLowerCase()}
|
|
45
52
|
`)
|
|
53
|
+
hasCall = true
|
|
46
54
|
}
|
|
47
55
|
}
|
|
48
56
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { cmp, Content } from '@voxgig/sdkgen'
|
|
2
|
+
import { cmp, Content, canonKey, entityIdField, entityPrimaryOp, opRequestShape } from '@voxgig/sdkgen'
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
KIT,
|
|
@@ -8,6 +8,17 @@ import {
|
|
|
8
8
|
} from '@voxgig/apidef'
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
// A type-correct Ruby literal for a field's canonical type.
|
|
12
|
+
function rbLit(type: any): string {
|
|
13
|
+
const k = canonKey(type)
|
|
14
|
+
if ('INTEGER' === k || 'NUMBER' === k) return '1'
|
|
15
|
+
if ('BOOLEAN' === k) return 'true'
|
|
16
|
+
if ('ARRAY' === k) return '[]'
|
|
17
|
+
if ('OBJECT' === k) return '{}'
|
|
18
|
+
return '"example"'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
11
22
|
const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
|
|
12
23
|
const { target, ctx$: { model } } = props
|
|
13
24
|
|
|
@@ -15,20 +26,41 @@ const ReadmeTopTest = cmp(function ReadmeTopTest(props: any) {
|
|
|
15
26
|
|
|
16
27
|
const exampleEntity = Object.values(entity).find((e: any) => e.active !== false) as any
|
|
17
28
|
|
|
18
|
-
Content(`\`\`\`ruby
|
|
19
|
-
client = ${model.const.Name}SDK.test(nil, nil)
|
|
20
|
-
`)
|
|
21
|
-
|
|
22
29
|
if (exampleEntity) {
|
|
23
30
|
const eName = nom(exampleEntity, 'Name')
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
const ename = eName.toLowerCase()
|
|
32
|
+
// Model-driven id key: null when the entity has no id-like field, so the
|
|
33
|
+
// seeded record carries no id and a match op takes no argument.
|
|
34
|
+
const idF = entityIdField(exampleEntity)
|
|
35
|
+
// Drive the test-mode example off the entity's PRIMARY op — never a
|
|
36
|
+
// hardcoded `load` a create-only entity lacks.
|
|
37
|
+
const primaryOp = entityPrimaryOp(exampleEntity) || 'load'
|
|
38
|
+
const isMatchOp = 'load' === primaryOp || 'remove' === primaryOp
|
|
39
|
+
const recBody = idF ? `{ "${idF}" => "test01" }` : '{}'
|
|
40
|
+
let callArg = ''
|
|
41
|
+
if (isMatchOp) {
|
|
42
|
+
callArg = idF ? `{ "${idF}" => "test01" }` : ''
|
|
43
|
+
} else if ('create' === primaryOp || 'update' === primaryOp) {
|
|
44
|
+
const items = opRequestShape(exampleEntity, primaryOp).items
|
|
45
|
+
.filter((it: any) => it.name !== idF && it.name !== 'id')
|
|
46
|
+
const required = items.filter((it: any) => !it.optional)
|
|
47
|
+
const chosen = required.length ? required : items.slice(0, 3)
|
|
48
|
+
callArg = `{ ${chosen.map((it: any) => `"${it.name}" => ${rbLit(it.type)}`).join(', ')} }`
|
|
49
|
+
}
|
|
50
|
+
Content(`\`\`\`ruby
|
|
51
|
+
# Seed fixture data so offline calls resolve without a live server.
|
|
52
|
+
client = ${model.const.Name}SDK.test({
|
|
53
|
+
"entity" => { "${ename}" => { "test01" => ${recBody} } },
|
|
54
|
+
})
|
|
55
|
+
${ename} = client.${eName}.${primaryOp}(${callArg})
|
|
56
|
+
\`\`\`
|
|
27
57
|
`)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
58
|
+
} else {
|
|
59
|
+
Content(`\`\`\`ruby
|
|
60
|
+
client = ${model.const.Name}SDK.test
|
|
61
|
+
\`\`\`
|
|
31
62
|
`)
|
|
63
|
+
}
|
|
32
64
|
|
|
33
65
|
})
|
|
34
66
|
|