cabloy 5.1.61 → 5.1.63
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/.claude/skills/cabloy-backend-scaffold/SKILL.md +2 -0
- package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -1
- package/.claude/skills/cabloy-domain-planning/SKILL.md +212 -0
- package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +2 -0
- package/CHANGELOG.md +55 -0
- package/CLAUDE.md +1 -0
- package/cabloy-docs/.vitepress/config.mjs +158 -12
- package/cabloy-docs/ai/docs-skills-rules-mapping.md +8 -0
- package/cabloy-docs/ai/future-skill-roadmap.md +2 -0
- package/cabloy-docs/ai/skills.md +1 -0
- package/cabloy-docs/backend/backend-contract-emission-output-inspection.md +189 -0
- package/cabloy-docs/backend/backend-contract-emission-source-reading-map.md +160 -0
- package/cabloy-docs/backend/backend-contract-emission-specimen.md +170 -0
- package/cabloy-docs/backend/backend-resource-module-contract-chain.md +323 -0
- package/cabloy-docs/backend/backend-source-reading-debug-checklist.md +173 -0
- package/cabloy-docs/backend/backend-source-reading-roadmap.md +129 -0
- package/cabloy-docs/backend/backend-source-reading-verify-playbook.md +166 -0
- package/cabloy-docs/backend/bean-scene-authoring.md +4 -4
- package/cabloy-docs/backend/broadcast-guide.md +3 -3
- package/cabloy-docs/backend/cli.md +20 -11
- package/cabloy-docs/backend/config-guide.md +4 -4
- package/cabloy-docs/backend/controller-aop-guide.md +10 -10
- package/cabloy-docs/backend/controller-guide.md +12 -2
- package/cabloy-docs/backend/crud-workflow.md +7 -3
- package/cabloy-docs/backend/dto-guide.md +12 -2
- package/cabloy-docs/backend/dto-infer-generation.md +201 -25
- package/cabloy-docs/backend/election-guide.md +2 -2
- package/cabloy-docs/backend/entity-guide.md +12 -3
- package/cabloy-docs/backend/error-guide.md +3 -3
- package/cabloy-docs/backend/event-guide.md +4 -4
- package/cabloy-docs/backend/external-aop-guide.md +2 -2
- package/cabloy-docs/backend/field-indexes.md +9 -3
- package/cabloy-docs/backend/foundation.md +8 -8
- package/cabloy-docs/backend/i18n-guide.md +6 -6
- package/cabloy-docs/backend/internal-aop-guide.md +2 -2
- package/cabloy-docs/backend/introduction.md +13 -0
- package/cabloy-docs/backend/migration-and-changes.md +3 -3
- package/cabloy-docs/backend/model-guide.md +16 -6
- package/cabloy-docs/backend/openapi-guide.md +3 -0
- package/cabloy-docs/backend/queue-guide.md +3 -3
- package/cabloy-docs/backend/redlock-guide.md +2 -2
- package/cabloy-docs/backend/schedule-guide.md +2 -2
- package/cabloy-docs/backend/scripts.md +8 -0
- package/cabloy-docs/backend/serialization-guide.md +2 -2
- package/cabloy-docs/backend/service-guide.md +18 -9
- package/cabloy-docs/backend/startup-guide.md +5 -5
- package/cabloy-docs/backend/status-guide.md +7 -7
- package/cabloy-docs/backend/unit-testing.md +3 -3
- package/cabloy-docs/backend/vona-source-reading-map.md +157 -0
- package/cabloy-docs/backend/websocket-protocol-guide.md +5 -5
- package/cabloy-docs/backend/websocket-usage-guide.md +15 -8
- package/cabloy-docs/frontend/a-model-under-the-hood.md +281 -0
- package/cabloy-docs/frontend/a-openapi-under-the-hood.md +248 -0
- package/cabloy-docs/frontend/a-router-guide.md +307 -0
- package/cabloy-docs/frontend/api-guide.md +4 -4
- package/cabloy-docs/frontend/api-schema-guide.md +1 -0
- package/cabloy-docs/frontend/app-startup-guide.md +7 -4
- package/cabloy-docs/frontend/bean-scene-authoring.md +1 -1
- package/cabloy-docs/frontend/behavior-guide.md +16 -16
- package/cabloy-docs/frontend/cli.md +5 -5
- package/cabloy-docs/frontend/command-scene-authoring.md +17 -8
- package/cabloy-docs/frontend/component-guide.md +5 -5
- package/cabloy-docs/frontend/component-props-guide.md +1 -1
- package/cabloy-docs/frontend/component-v-model-guide.md +2 -2
- package/cabloy-docs/frontend/filter-query-select-data-flow-guide.md +260 -0
- package/cabloy-docs/frontend/form-guide.md +27 -30
- package/cabloy-docs/frontend/form-scene-to-page-meta-guide.md +303 -0
- package/cabloy-docs/frontend/foundation.md +10 -6
- package/cabloy-docs/frontend/frontend-source-reading-roadmap.md +249 -0
- package/cabloy-docs/frontend/generated-contract-consumption-debug-checklist.md +190 -0
- package/cabloy-docs/frontend/generated-contract-consumption-entry-branch.md +205 -0
- package/cabloy-docs/frontend/generated-contract-consumption-list-branch.md +157 -0
- package/cabloy-docs/frontend/generated-contract-consumption-specimen.md +203 -0
- package/cabloy-docs/frontend/generated-contract-consumption-verify-playbook.md +189 -0
- package/cabloy-docs/frontend/generic-component-guide.md +1 -1
- package/cabloy-docs/frontend/introduction.md +29 -7
- package/cabloy-docs/frontend/model-architecture.md +38 -2
- package/cabloy-docs/frontend/model-resource-cookbook.md +11 -8
- package/cabloy-docs/frontend/model-resource-internals-deep-dive.md +238 -0
- package/cabloy-docs/frontend/model-resource-owner-pattern.md +22 -2
- package/cabloy-docs/frontend/model-resource-usage-guide.md +22 -6
- package/cabloy-docs/frontend/model-state-guide.md +12 -9
- package/cabloy-docs/frontend/module-scope.md +8 -8
- package/cabloy-docs/frontend/modules-and-suites.md +2 -1
- package/cabloy-docs/frontend/navigation-guards-guide.md +7 -0
- package/cabloy-docs/frontend/openapi-sdk-guide.md +12 -4
- package/cabloy-docs/frontend/page-guide.md +9 -9
- package/cabloy-docs/frontend/page-meta-guide.md +466 -0
- package/cabloy-docs/frontend/page-params-guide.md +3 -3
- package/cabloy-docs/frontend/page-query-guide.md +2 -2
- package/cabloy-docs/frontend/page-route-guide.md +6 -0
- package/cabloy-docs/frontend/permission-formscene-action-visibility-guide.md +263 -0
- package/cabloy-docs/frontend/quickstart.md +14 -2
- package/cabloy-docs/frontend/resource-entry-page-deep-dive.md +271 -0
- package/cabloy-docs/frontend/resource-list-page-deep-dive.md +279 -0
- package/cabloy-docs/frontend/rest-resource-source-reading-map.md +522 -0
- package/cabloy-docs/frontend/rest-resource-under-the-hood.md +622 -0
- package/cabloy-docs/frontend/root-behaviors-guide.md +282 -0
- package/cabloy-docs/frontend/route-alias-guide.md +6 -0
- package/cabloy-docs/frontend/router-stack-guide.md +229 -0
- package/cabloy-docs/frontend/router-tabs-introduction.md +26 -3
- package/cabloy-docs/frontend/router-tabs-layout-integration.md +367 -0
- package/cabloy-docs/frontend/router-tabs-mechanism.md +6 -0
- package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +7 -0
- package/cabloy-docs/frontend/router-tabs-vs-stack.md +167 -0
- package/cabloy-docs/frontend/router-view-hosts-guide.md +450 -0
- package/cabloy-docs/frontend/server-data.md +2 -1
- package/cabloy-docs/frontend/system-startup-guide.md +2 -2
- package/cabloy-docs/frontend/table-action-visibility-permission-flow-guide.md +263 -0
- package/cabloy-docs/frontend/table-cell-cookbook.md +571 -0
- package/cabloy-docs/frontend/table-guide.md +373 -0
- package/cabloy-docs/frontend/table-resource-crud-cookbook.md +496 -0
- package/cabloy-docs/frontend/zova-app-guide.md +251 -0
- package/cabloy-docs/frontend/zova-form-source-reading-map.md +7 -9
- package/cabloy-docs/frontend/zova-form-under-the-hood.md +5 -0
- package/cabloy-docs/frontend/zova-router-under-the-hood.md +561 -0
- package/cabloy-docs/frontend/zova-source-reading-map.md +101 -7
- package/cabloy-docs/frontend/zova-table-controller-render-supplement.md +225 -0
- package/cabloy-docs/frontend/zova-table-source-reading-map.md +317 -0
- package/cabloy-docs/frontend/zova-table-under-the-hood.md +532 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-debug-checklist.md +245 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map.md +139 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-verify-playbook.md +248 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions.md +511 -0
- package/cabloy-docs/fullstack/contract-loop-playbook.md +8 -2
- package/cabloy-docs/fullstack/edition-collaboration-differences.md +6 -0
- package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +181 -48
- package/cabloy-docs/fullstack/introduction.md +3 -0
- package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -2
- package/cabloy-docs/fullstack/suites-and-modules.md +333 -0
- package/cabloy-docs/fullstack/tutorial-1-first-module.md +3 -0
- package/cabloy-docs/fullstack/tutorial-2-first-crud.md +4 -0
- package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +4 -0
- package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +31 -19
- package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +5 -0
- package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +4 -0
- package/cabloy-docs/fullstack/tutorials-overview.md +1 -1
- package/cabloy-docs/reference/bean-scene-boilerplates.md +13 -13
- package/cabloy-docs/reference/package-map.md +4 -3
- package/package.json +1 -1
- package/vona/pnpm-lock.yaml +22 -258
- package/vona/src/suite/a-training/modules/training-student/package.json +53 -0
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +400 -0
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +18 -0
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
- package/vona/src/suite/a-training/modules/training-student/src/bean/meta.index.ts +12 -0
- package/vona/src/suite/a-training/modules/training-student/src/bean/meta.version.ts +21 -0
- package/vona/src/suite/a-training/modules/training-student/src/bean/ssrMenu.student.ts +29 -0
- package/vona/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +15 -0
- package/vona/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +15 -0
- package/vona/src/suite/a-training/modules/training-student/src/controller/student.ts +74 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +28 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectReq.tsx +44 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectRes.tsx +11 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx +45 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +42 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +28 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +25 -0
- package/vona/src/suite/a-training/modules/training-student/src/entity/student.tsx +84 -0
- package/vona/src/suite/a-training/modules/training-student/src/index.ts +2 -0
- package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +10 -0
- package/vona/src/suite/a-training/modules/training-student/src/service/student.ts +57 -0
- package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +173 -0
- package/vona/src/suite/a-training/modules/training-student/tsconfig.build.json +11 -0
- package/vona/src/suite/a-training/modules/training-student/tsconfig.json +7 -0
- package/vona/src/suite/a-training/package.json +12 -0
- package/vona/src/suite/a-training/tsconfig.base.json +4 -0
- package/vona/src/suite/a-training/tsconfig.json +10 -0
- package/zova/packages-zova/zova/package.json +2 -2
- package/zova/pnpm-lock.yaml +423 -682
- package/zova/src/suite/a-demo/modules/demo-basic/src/page/toolOne/render.tsx +5 -3
- package/zova/src/suite/a-home/modules/home-login/src/page/login/render.tsx +5 -3
- package/zova/src/suite/a-training/modules/training-student/cli/openapi.config.ts +9 -0
- package/zova/src/suite/a-training/modules/training-student/package.json +57 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/component/formFieldLevel.ts +31 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +258 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +7 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/baseURL.ts +5 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/index.ts +3 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +196 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +4146 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/trainingStudent.ts +151 -0
- package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +43 -0
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +53 -0
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +56 -0
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.level.tsx +63 -0
- package/zova/src/suite/a-training/modules/training-student/src/component/formFieldLevel/controller.tsx +117 -0
- package/zova/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +9 -0
- package/zova/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +9 -0
- package/zova/src/suite/a-training/modules/training-student/src/index.ts +2 -0
- package/zova/src/suite/a-training/modules/training-student/src/model/student.ts +42 -0
- package/zova/src/suite/a-training/modules/training-student/tsconfig.build.json +13 -0
- package/zova/src/suite/a-training/modules/training-student/tsconfig.json +5 -0
- package/zova/src/suite/a-training/package.json +12 -0
- package/zova/src/suite/a-training/tsconfig.base.json +4 -0
- package/zova/src/suite/a-training/tsconfig.json +4 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/package.json +60 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/index.ts +137 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/locales.ts +7 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/this.ts +2 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/bean/behavior.appModal.tsx +260 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/config.ts +39 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/locale/en-us.ts +7 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/locale/zh-cn.ts +7 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/index.ts +4 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/lib/appModalItem.ts +16 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/lib/index.ts +1 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/monkey.ts +38 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/monkeySys.ts +14 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/service/appModal.ts +89 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/types/appModal.ts +52 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/types/index.ts +1 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/tsconfig.build.json +13 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/tsconfig.json +5 -0
- package/zova/src/suite/cabloy-basic/modules/basic-commands/package.json +6 -1
- package/zova/src/suite/cabloy-basic/modules/basic-commands/src/.metadata/index.ts +16 -0
- package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.alert.tsx +8 -14
- package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.confirm.tsx +10 -7
- package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.prompt.tsx +30 -0
- package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockForm/controller.tsx +5 -3
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +29 -7
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +34 -11
- package/zova/src/suite/cabloy-basic/modules/basic-table/package.json +6 -1
- package/zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionDelete.tsx +4 -2
- package/zova/src/suite/cabloy-basic/package.json +1 -0
- package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +3 -3
- package/zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts +1 -1
- package/zova/src/suite-vendor/a-zova/package.json +2 -2
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
# Rest Resource Source Reading Map
|
|
2
|
+
|
|
3
|
+
This page is a practical map for contributors and AI workflows that need to read the `rest-resource` module efficiently.
|
|
4
|
+
|
|
5
|
+
Use this page when the main question is not only what `ModelResource` does in isolation, but how the whole module works at runtime:
|
|
6
|
+
|
|
7
|
+
- which files form the module entry surface?
|
|
8
|
+
- how do routes reach page controllers?
|
|
9
|
+
- why are the page controllers so thin?
|
|
10
|
+
- where do list-page and entry-page blocks actually come from?
|
|
11
|
+
- where does the real query, form, and mutation ownership live?
|
|
12
|
+
|
|
13
|
+
Use this page together with:
|
|
14
|
+
|
|
15
|
+
- [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern)
|
|
16
|
+
- [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood)
|
|
17
|
+
- [Using `ModelResource` in Your Module](/frontend/model-resource-usage-guide)
|
|
18
|
+
- [Table + Resource CRUD Cookbook](/frontend/table-resource-crud-cookbook)
|
|
19
|
+
- [Form Guide](/frontend/form-guide)
|
|
20
|
+
- [Zova Source Reading Map](/frontend/zova-source-reading-map)
|
|
21
|
+
|
|
22
|
+
Use this page after [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood) when your next question is not the runtime model itself, but which files to read first for one specific `rest-resource` question.
|
|
23
|
+
|
|
24
|
+
> [!TIP]
|
|
25
|
+
> **Rest Resource docs paths**
|
|
26
|
+
>
|
|
27
|
+
> - **Architecture path:** [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern) → [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood) → **Rest Resource Source Reading Map**
|
|
28
|
+
> - **Application path:** [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern) → [Using `ModelResource` in Your Module](/frontend/model-resource-usage-guide) → [Resource Model Cookbook](/frontend/model-resource-cookbook)
|
|
29
|
+
>
|
|
30
|
+
> **You are here:** module-level source reading.
|
|
31
|
+
> **Previous page:** [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood).
|
|
32
|
+
|
|
33
|
+
## Why this page exists
|
|
34
|
+
|
|
35
|
+
The existing `ModelResource` pages already explain two important things well:
|
|
36
|
+
|
|
37
|
+
- why `ModelResource` is a resource-owner model
|
|
38
|
+
- how application code should reuse it directly or through a thin facade
|
|
39
|
+
|
|
40
|
+
What those pages do **not** focus on is the module-level runtime path around that model:
|
|
41
|
+
|
|
42
|
+
- route records
|
|
43
|
+
- generated page wrappers
|
|
44
|
+
- page-shell controllers
|
|
45
|
+
- block rendering from schema metadata
|
|
46
|
+
- downstream generic consumers such as `basic-page` and `basic-pageentry`
|
|
47
|
+
|
|
48
|
+
That missing layer matters because `rest-resource` is not only a reusable model bean.
|
|
49
|
+
|
|
50
|
+
It is also a **route-to-page-shell-to-block-to-model bridge** for resource-driven CRUD pages.
|
|
51
|
+
|
|
52
|
+
## The shortest accurate runtime model
|
|
53
|
+
|
|
54
|
+
If you only remember one mental model, remember this one:
|
|
55
|
+
|
|
56
|
+
1. `routes.ts` chooses one of three resource-oriented pages
|
|
57
|
+
2. generated `ZPage*` wrappers bind those route entries to page controllers
|
|
58
|
+
3. the page controllers resolve the current `resource`, `id`, and `formScene`
|
|
59
|
+
4. the page controllers load top-level schema metadata and render `rest.blocks`
|
|
60
|
+
5. those rendered blocks usually enter generic Basic runtimes such as `basic-page:blockPage` or `basic-pageentry:blockPageEntry`
|
|
61
|
+
6. those downstream runtimes resolve the same selector-backed `ModelResource` instance again
|
|
62
|
+
7. `ModelResource` remains the stable owner of resource bootstrap, schema, permissions, queries, mutations, and invalidation
|
|
63
|
+
|
|
64
|
+
A compact relationship map is:
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
routes.ts
|
|
68
|
+
└─ ZPageResource / ZPageEntry / ZPageEntryCreate
|
|
69
|
+
└─ page controller shell
|
|
70
|
+
└─ schema rest.blocks
|
|
71
|
+
└─ generic Basic blocks
|
|
72
|
+
└─ selector-backed ModelResource
|
|
73
|
+
└─ OpenAPI bootstrap / fetch / mutation / invalidation
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
That is why `rest-resource` should not be read as “one page that does CRUD directly”.
|
|
77
|
+
|
|
78
|
+
The Zova-native meaning is:
|
|
79
|
+
|
|
80
|
+
- `rest-resource` provides the **module-level bridge**
|
|
81
|
+
- `ModelResource` provides the **resource-owner boundary**
|
|
82
|
+
- `basic-page` and `basic-pageentry` provide the **deeper list/form runtime**
|
|
83
|
+
|
|
84
|
+
## The core source-reading path
|
|
85
|
+
|
|
86
|
+
When you want the shortest correct reading order, use this sequence:
|
|
87
|
+
|
|
88
|
+
1. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.ts`
|
|
89
|
+
2. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/resource.ts`
|
|
90
|
+
3. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/entry.ts`
|
|
91
|
+
4. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/entryCreate.ts`
|
|
92
|
+
5. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/resource/controller.tsx`
|
|
93
|
+
6. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/entry/controller.tsx`
|
|
94
|
+
7. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/entryCreate/controller.tsx`
|
|
95
|
+
8. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts`
|
|
96
|
+
9. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPage/controller.tsx`
|
|
97
|
+
10. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx`
|
|
98
|
+
11. `zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.delete.tsx`
|
|
99
|
+
12. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/index.ts`
|
|
100
|
+
|
|
101
|
+
A compact role map is:
|
|
102
|
+
|
|
103
|
+
- `routes.ts` shows the public route surface
|
|
104
|
+
- `.metadata/page/*.ts` shows the generated wrapper entry into `createZovaComponentPage(...)`
|
|
105
|
+
- `page/resource/controller.tsx` shows the list-page shell
|
|
106
|
+
- `page/entry/controller.tsx` shows the entry-page shell
|
|
107
|
+
- `page/entryCreate/controller.tsx` shows virtual create-page reuse
|
|
108
|
+
- `model/resource.ts` shows the resource-owner core
|
|
109
|
+
- `basic-page:blockPage` shows the deeper list runtime
|
|
110
|
+
- `basic-pageentry:blockPageEntry` shows the deeper form runtime
|
|
111
|
+
- `command.delete.tsx` shows non-page consumers reusing the same resource owner
|
|
112
|
+
- `.metadata/index.ts` shows the generated typing and bean-registration surface
|
|
113
|
+
|
|
114
|
+
## 1. Route surface and tab identity
|
|
115
|
+
|
|
116
|
+
Start with:
|
|
117
|
+
|
|
118
|
+
- `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.ts`
|
|
119
|
+
|
|
120
|
+
This file declares three routes:
|
|
121
|
+
|
|
122
|
+
- `:resource`
|
|
123
|
+
- `:resource/create`
|
|
124
|
+
- `:resource/:id/:formScene?`
|
|
125
|
+
|
|
126
|
+
That already tells you the module’s public role.
|
|
127
|
+
|
|
128
|
+
It is not tied to one concrete resource such as Student or Product.
|
|
129
|
+
|
|
130
|
+
Instead, it is a generic route module whose runtime identity comes from `route.params.resource`.
|
|
131
|
+
|
|
132
|
+
### Why `tabKey` matters
|
|
133
|
+
|
|
134
|
+
All three routes use the same `tabKey(route)` shape:
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
`/rest/resource/${encodeURIComponent(route.params.resource)}`;
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
This means the tab identity is resource-level rather than row-level.
|
|
141
|
+
|
|
142
|
+
If your next question becomes specifically how the entry route becomes a working page through `basic-pageentry`, continue with [Resource Entry Page Deep Dive](/frontend/resource-entry-page-deep-dive).
|
|
143
|
+
|
|
144
|
+
So these views are grouped under one resource-oriented tab boundary:
|
|
145
|
+
|
|
146
|
+
- resource list
|
|
147
|
+
- create entry
|
|
148
|
+
- view/edit entry
|
|
149
|
+
|
|
150
|
+
That is a small but important architectural clue.
|
|
151
|
+
|
|
152
|
+
If your next question is specifically how filter state becomes `query`, then `ModelResource.select(query)`, and finally list/paged data, continue with [Filter to Query to Select Data Flow Guide](/frontend/filter-query-select-data-flow-guide).
|
|
153
|
+
|
|
154
|
+
If your next question is specifically how the resource owner itself works internally, continue with [ModelResource Internals Deep Dive](/frontend/model-resource-internals-deep-dive).
|
|
155
|
+
|
|
156
|
+
The module is designed around one stable **resource workspace**, not one isolated page per row.
|
|
157
|
+
|
|
158
|
+
## 2. Generated wrapper layer and typed page identity
|
|
159
|
+
|
|
160
|
+
Read next:
|
|
161
|
+
|
|
162
|
+
- `src/.metadata/page/resource.ts`
|
|
163
|
+
- `src/.metadata/page/entry.ts`
|
|
164
|
+
- `src/.metadata/page/entryCreate.ts`
|
|
165
|
+
|
|
166
|
+
These files are thin but important.
|
|
167
|
+
|
|
168
|
+
They show that the route component is not hand-written Vue setup code.
|
|
169
|
+
|
|
170
|
+
Instead, each route enters the normal Zova page-controller path through:
|
|
171
|
+
|
|
172
|
+
- `createZovaComponentPage(ControllerPageResource, ...)`
|
|
173
|
+
- `createZovaComponentPage(ControllerPageEntry, ...)`
|
|
174
|
+
- `createZovaComponentPage(ControllerPageEntryCreate, ...)`
|
|
175
|
+
|
|
176
|
+
These files also expose the typed Zod-based params schema for each page.
|
|
177
|
+
|
|
178
|
+
### What `.metadata/index.ts` adds
|
|
179
|
+
|
|
180
|
+
After the page wrappers, read:
|
|
181
|
+
|
|
182
|
+
- `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/index.ts`
|
|
183
|
+
|
|
184
|
+
This generated file is mostly not “business logic”, but it is still the best summary of the module’s registered surfaces:
|
|
185
|
+
|
|
186
|
+
- `rest-resource.model.resource` → model bean full name
|
|
187
|
+
- `rest-resource.controller.pageResource` / `pageEntry` / `pageEntryCreate` → controller registrations
|
|
188
|
+
- page-path and page-name typing for `/rest/resource/...`
|
|
189
|
+
- module scope typing for `rest-resource`
|
|
190
|
+
|
|
191
|
+
Use this file as the **registry map**, not as the first place to learn the runtime behavior.
|
|
192
|
+
|
|
193
|
+
## 3. Thin page-shell controllers
|
|
194
|
+
|
|
195
|
+
The most important module-level reading insight is this:
|
|
196
|
+
|
|
197
|
+
> the page controllers are thin shells that load top-level schema metadata and render blocks; they are not the whole CRUD runtime by themselves.
|
|
198
|
+
|
|
199
|
+
That becomes clear when you read the two real page controllers.
|
|
200
|
+
|
|
201
|
+
### 3.1 Resource list shell
|
|
202
|
+
|
|
203
|
+
Read:
|
|
204
|
+
|
|
205
|
+
- `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/resource/controller.tsx`
|
|
206
|
+
|
|
207
|
+
This controller does three main things:
|
|
208
|
+
|
|
209
|
+
1. resolves the selector-backed `ModelResource` instance from `this.$params.resource`
|
|
210
|
+
2. autoloads `apiSchemasSelect.sdk`
|
|
211
|
+
3. reads `schemaRow?.rest?.blocks` and renders those blocks through `ZovaJsx`
|
|
212
|
+
|
|
213
|
+
The key point is what it does **not** do.
|
|
214
|
+
|
|
215
|
+
It does not own:
|
|
216
|
+
|
|
217
|
+
- filter state
|
|
218
|
+
- pager state
|
|
219
|
+
- table refresh logic
|
|
220
|
+
- row data fetch orchestration
|
|
221
|
+
|
|
222
|
+
Those deeper concerns usually appear later inside the rendered block chain, especially in `basic-page:blockPage`.
|
|
223
|
+
|
|
224
|
+
So this controller is better understood as a **resource list page shell**.
|
|
225
|
+
|
|
226
|
+
It resolves resource context, loads the schema surface, and lets schema metadata choose which blocks should render.
|
|
227
|
+
|
|
228
|
+
### 3.2 Entry shell
|
|
229
|
+
|
|
230
|
+
Read:
|
|
231
|
+
|
|
232
|
+
- `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/entry/controller.tsx`
|
|
233
|
+
|
|
234
|
+
This controller is the entry-page counterpart.
|
|
235
|
+
|
|
236
|
+
It mainly owns:
|
|
237
|
+
|
|
238
|
+
- parameter interpretation (`resource`, `id`, `formScene`)
|
|
239
|
+
- `formMeta` derivation
|
|
240
|
+
- `formProvider` lookup from `ModelResource`
|
|
241
|
+
- `formSchema` lookup from `ModelResource`
|
|
242
|
+
- autoload of the form API schemas
|
|
243
|
+
- block rendering from `formSchema?.rest?.blocks`
|
|
244
|
+
|
|
245
|
+
Again, the most important insight is what it does **not** fully own.
|
|
246
|
+
|
|
247
|
+
It does not directly become the full form runtime.
|
|
248
|
+
|
|
249
|
+
The actual form-state, form-data, submit, and page-meta orchestration commonly appear deeper in downstream consumers such as `basic-pageentry:blockPageEntry`.
|
|
250
|
+
|
|
251
|
+
So this controller is a **schema-driven entry shell**, not a page-local CRUD implementation.
|
|
252
|
+
|
|
253
|
+
### 3.3 Virtual create shell reuse
|
|
254
|
+
|
|
255
|
+
Read:
|
|
256
|
+
|
|
257
|
+
- `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/entryCreate/controller.tsx`
|
|
258
|
+
|
|
259
|
+
This file is intentionally small.
|
|
260
|
+
|
|
261
|
+
It is a virtual subclass of `ControllerPageEntry`.
|
|
262
|
+
|
|
263
|
+
That tells you the module does not want two separate create/runtime implementations.
|
|
264
|
+
|
|
265
|
+
Instead, the create route reuses the entry shell and lets route params plus form-scene logic select the create behavior.
|
|
266
|
+
|
|
267
|
+
This is a good example of Zova keeping page identity separate from duplicated controller logic.
|
|
268
|
+
|
|
269
|
+
## 4. `ModelResource` is the owner core, not only a helper
|
|
270
|
+
|
|
271
|
+
Read:
|
|
272
|
+
|
|
273
|
+
- `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts`
|
|
274
|
+
|
|
275
|
+
This file is the real owner boundary of the module.
|
|
276
|
+
|
|
277
|
+
The earlier page [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern) already covers this class in depth, so here the focus is narrower:
|
|
278
|
+
|
|
279
|
+
- how it fits into the module-level runtime around it
|
|
280
|
+
- which methods the page-shell and downstream blocks actually depend on
|
|
281
|
+
|
|
282
|
+
### What this model owns for the module
|
|
283
|
+
|
|
284
|
+
At module level, `ModelResource` provides the stable surface for:
|
|
285
|
+
|
|
286
|
+
- selector identity by resource name
|
|
287
|
+
- bootstrap through `$sdk.getBootstrap(this.resource)`
|
|
288
|
+
- resolution of `resourceApi`
|
|
289
|
+
- permissions lookup
|
|
290
|
+
- schema access for select/view/create/update
|
|
291
|
+
- form-provider access
|
|
292
|
+
- list/item query ownership
|
|
293
|
+
- create/update/delete mutation ownership
|
|
294
|
+
- invalidation policy
|
|
295
|
+
- form-facing helpers
|
|
296
|
+
|
|
297
|
+
A practical source-reading takeaway is:
|
|
298
|
+
|
|
299
|
+
> the routes and page shells give the module its shape, but `ModelResource` gives the module its resource truth.
|
|
300
|
+
|
|
301
|
+
### Why selector identity is still essential here
|
|
302
|
+
|
|
303
|
+
Because the module routes are generic, the same page/controller classes must work for many resources.
|
|
304
|
+
|
|
305
|
+
That only works cleanly because `ModelResource` uses selector identity.
|
|
306
|
+
|
|
307
|
+
The selector is the current resource name, so the same generic model class can safely serve:
|
|
308
|
+
|
|
309
|
+
- one Student resource instance
|
|
310
|
+
- one Product resource instance
|
|
311
|
+
- one Article resource instance
|
|
312
|
+
|
|
313
|
+
without cache collisions.
|
|
314
|
+
|
|
315
|
+
## 5. Downstream generic consumers are the next runtime layer
|
|
316
|
+
|
|
317
|
+
To understand the full runtime, do not stop at `rest-resource` itself.
|
|
318
|
+
|
|
319
|
+
Continue into the main downstream consumers.
|
|
320
|
+
|
|
321
|
+
### 5.1 `basic-page:blockPage`
|
|
322
|
+
|
|
323
|
+
Read:
|
|
324
|
+
|
|
325
|
+
- `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPage/controller.tsx`
|
|
326
|
+
|
|
327
|
+
This file shows where the deeper list-page runtime really lives:
|
|
328
|
+
|
|
329
|
+
- selector-based `ModelResource` lookup
|
|
330
|
+
- query filter state
|
|
331
|
+
- paged query state
|
|
332
|
+
- list fetch through `select(this.query)`
|
|
333
|
+
- permission-sensitive table-meta refresh
|
|
334
|
+
- page-scene JSX/CEL scope
|
|
335
|
+
- rendering of filter/table/pager blocks
|
|
336
|
+
|
|
337
|
+
This is the strongest confirmation that `ControllerPageResource` is only the shell, while `basic-page:blockPage` is the richer list runtime.
|
|
338
|
+
|
|
339
|
+
### 5.2 `basic-pageentry:blockPageEntry`
|
|
340
|
+
|
|
341
|
+
Read:
|
|
342
|
+
|
|
343
|
+
- `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx`
|
|
344
|
+
|
|
345
|
+
This file shows the deeper entry runtime:
|
|
346
|
+
|
|
347
|
+
- selector-based `ModelResource` lookup
|
|
348
|
+
- `formMeta`, `formProvider`, `formSchema`, and `formData`
|
|
349
|
+
- view-query loading for existing rows
|
|
350
|
+
- form submit delegation through `getFormMutationSubmit(...)`
|
|
351
|
+
- page-title/page-dirty updates
|
|
352
|
+
- form-scene JSX/CEL scope
|
|
353
|
+
|
|
354
|
+
This is the strongest confirmation that `ControllerPageEntry` is the page shell, while `basic-pageentry:blockPageEntry` is the richer form runtime.
|
|
355
|
+
|
|
356
|
+
### 5.3 Commands can reuse the same owner boundary
|
|
357
|
+
|
|
358
|
+
Read:
|
|
359
|
+
|
|
360
|
+
- `zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.delete.tsx`
|
|
361
|
+
|
|
362
|
+
This file shows an important architectural property:
|
|
363
|
+
|
|
364
|
+
`ModelResource` is not only for page controllers.
|
|
365
|
+
|
|
366
|
+
A command bean can resolve the same selector-backed model and reuse its delete mutation directly.
|
|
367
|
+
|
|
368
|
+
So the owner boundary is reusable across:
|
|
369
|
+
|
|
370
|
+
- pages
|
|
371
|
+
- blocks
|
|
372
|
+
- commands
|
|
373
|
+
- custom business facades
|
|
374
|
+
|
|
375
|
+
## 6. What is runtime logic and what is generated scaffolding?
|
|
376
|
+
|
|
377
|
+
When reading this module, keep this distinction clear.
|
|
378
|
+
|
|
379
|
+
### Runtime logic
|
|
380
|
+
|
|
381
|
+
These are the main runtime logic files:
|
|
382
|
+
|
|
383
|
+
- `src/routes.ts`
|
|
384
|
+
- `src/page/resource/controller.tsx`
|
|
385
|
+
- `src/page/entry/controller.tsx`
|
|
386
|
+
- `src/page/entryCreate/controller.tsx`
|
|
387
|
+
- `src/model/resource.ts`
|
|
388
|
+
|
|
389
|
+
These are where the real behavior decisions live.
|
|
390
|
+
|
|
391
|
+
### Generated or type-oriented scaffolding
|
|
392
|
+
|
|
393
|
+
These are mostly generated/type-facing support files:
|
|
394
|
+
|
|
395
|
+
- `src/.metadata/index.ts`
|
|
396
|
+
- `src/.metadata/page/*.ts`
|
|
397
|
+
- `src/types/resource.ts`
|
|
398
|
+
- `src/types/pageWrapper.ts`
|
|
399
|
+
- `src/types/pageEntryWrapper.ts`
|
|
400
|
+
|
|
401
|
+
They are still useful, but for a different purpose:
|
|
402
|
+
|
|
403
|
+
- bean registration lookup
|
|
404
|
+
- page wrapper identity
|
|
405
|
+
- typed route params
|
|
406
|
+
- render-context augmentation
|
|
407
|
+
- bootstrap shape typing
|
|
408
|
+
|
|
409
|
+
Read them to confirm the public/typed surfaces, not to discover the main runtime flow first.
|
|
410
|
+
|
|
411
|
+
## 7. Question-oriented reading paths
|
|
412
|
+
|
|
413
|
+
Use these shorter paths when you have one specific question.
|
|
414
|
+
|
|
415
|
+
### Question: how does one generic resource route become one page controller?
|
|
416
|
+
|
|
417
|
+
Read:
|
|
418
|
+
|
|
419
|
+
1. `src/routes.ts`
|
|
420
|
+
2. `src/.metadata/page/resource.ts` or `src/.metadata/page/entry.ts`
|
|
421
|
+
3. the corresponding `src/page/*/controller.tsx`
|
|
422
|
+
|
|
423
|
+
### Question: where does resource list-page block composition come from?
|
|
424
|
+
|
|
425
|
+
Read:
|
|
426
|
+
|
|
427
|
+
1. `src/page/resource/controller.tsx`
|
|
428
|
+
2. `src/model/resource.ts` for `schemaRow`
|
|
429
|
+
3. `basic-page/src/component/blockPage/controller.tsx`
|
|
430
|
+
|
|
431
|
+
The important answer is usually:
|
|
432
|
+
|
|
433
|
+
- page shell reads `schemaRow.rest.blocks`
|
|
434
|
+
- generic Basic block runtime owns the deeper list behavior
|
|
435
|
+
|
|
436
|
+
### Question: where does entry create/view/edit behavior come from?
|
|
437
|
+
|
|
438
|
+
Read:
|
|
439
|
+
|
|
440
|
+
1. `src/page/entry/controller.tsx`
|
|
441
|
+
2. `src/page/entryCreate/controller.tsx`
|
|
442
|
+
3. `src/model/resource.ts` for `getFormSchema`, `getFormApiSchemas`, `getFormData`, and `getFormMutationSubmit`
|
|
443
|
+
4. `basic-pageentry/src/component/blockPageEntry/controller.tsx`
|
|
444
|
+
|
|
445
|
+
### Question: where do actual list query and form submit rules live?
|
|
446
|
+
|
|
447
|
+
Read:
|
|
448
|
+
|
|
449
|
+
1. `src/model/resource.ts`
|
|
450
|
+
2. `basic-page:blockPage`
|
|
451
|
+
3. `basic-pageentry:blockPageEntry`
|
|
452
|
+
|
|
453
|
+
This is the path that most clearly shows the separation between page shells and deeper generic runtimes.
|
|
454
|
+
|
|
455
|
+
### Question: how do resource actions such as delete reach the same owner boundary?
|
|
456
|
+
|
|
457
|
+
Read:
|
|
458
|
+
|
|
459
|
+
1. `basic-commands/src/bean/command.delete.tsx`
|
|
460
|
+
2. `src/model/resource.ts`
|
|
461
|
+
|
|
462
|
+
## 8. The Zova-native explanation
|
|
463
|
+
|
|
464
|
+
The most accurate Zova-native description is:
|
|
465
|
+
|
|
466
|
+
- `rest-resource` is a **generic resource page module**
|
|
467
|
+
- the page controllers are **schema-driven shells**
|
|
468
|
+
- `ModelResource` is the **selector-backed resource owner**
|
|
469
|
+
- generic Basic blocks are the **deeper list/form runtime consumers**
|
|
470
|
+
|
|
471
|
+
An approximate Vue-style translation would be:
|
|
472
|
+
|
|
473
|
+
- the module is not “one big page component with local hooks”
|
|
474
|
+
- it is closer to a route-driven controller shell that delegates into reusable runtime layers
|
|
475
|
+
|
|
476
|
+
That translation can help orientation, but the Zova meaning above is the authoritative one.
|
|
477
|
+
|
|
478
|
+
## 9. What to read next after this page
|
|
479
|
+
|
|
480
|
+
Choose the next page by the question you actually have.
|
|
481
|
+
|
|
482
|
+
### If the next question is about the owner model itself
|
|
483
|
+
|
|
484
|
+
Continue with:
|
|
485
|
+
|
|
486
|
+
- [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern)
|
|
487
|
+
|
|
488
|
+
### If the next question is about how to use the owner in your own business module
|
|
489
|
+
|
|
490
|
+
Continue with:
|
|
491
|
+
|
|
492
|
+
- [Using `ModelResource` in Your Module](/frontend/model-resource-usage-guide)
|
|
493
|
+
- [Resource Model Cookbook](/frontend/model-resource-cookbook)
|
|
494
|
+
- [Resource Model Best Practices and Anti-Patterns](/frontend/model-resource-best-practices)
|
|
495
|
+
|
|
496
|
+
### If the next question is about resource list-page blocks and tables
|
|
497
|
+
|
|
498
|
+
Continue with:
|
|
499
|
+
|
|
500
|
+
- [Table + Resource CRUD Cookbook](/frontend/table-resource-crud-cookbook)
|
|
501
|
+
- [Zova Table Under the Hood](/frontend/zova-table-under-the-hood)
|
|
502
|
+
- [Zova Table Source Reading Map](/frontend/zova-table-source-reading-map)
|
|
503
|
+
|
|
504
|
+
### If the next question is about resource entry pages and forms
|
|
505
|
+
|
|
506
|
+
Continue with:
|
|
507
|
+
|
|
508
|
+
- [Form Guide](/frontend/form-guide)
|
|
509
|
+
- [Zova Form Source Reading Map](/frontend/zova-form-source-reading-map)
|
|
510
|
+
|
|
511
|
+
## Final takeaway
|
|
512
|
+
|
|
513
|
+
The fastest accurate way to read `rest-resource` is to stop treating it as only one model file.
|
|
514
|
+
|
|
515
|
+
Read it as four cooperating layers:
|
|
516
|
+
|
|
517
|
+
1. route surface
|
|
518
|
+
2. generated page wrappers
|
|
519
|
+
3. thin page-shell controllers
|
|
520
|
+
4. selector-backed resource owner with downstream Basic block consumers
|
|
521
|
+
|
|
522
|
+
Once you see those layers clearly, the module becomes much easier to extend, debug, and explain without flattening Zova back into ad hoc page-local CRUD code.
|