cabloy 5.1.61 → 5.1.62

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.
Files changed (201) hide show
  1. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +2 -0
  2. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -1
  3. package/.claude/skills/cabloy-domain-planning/SKILL.md +212 -0
  4. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +2 -0
  5. package/CHANGELOG.md +42 -0
  6. package/CLAUDE.md +1 -0
  7. package/cabloy-docs/.vitepress/config.mjs +158 -12
  8. package/cabloy-docs/ai/docs-skills-rules-mapping.md +8 -0
  9. package/cabloy-docs/ai/future-skill-roadmap.md +2 -0
  10. package/cabloy-docs/ai/skills.md +1 -0
  11. package/cabloy-docs/backend/backend-contract-emission-output-inspection.md +189 -0
  12. package/cabloy-docs/backend/backend-contract-emission-source-reading-map.md +160 -0
  13. package/cabloy-docs/backend/backend-contract-emission-specimen.md +170 -0
  14. package/cabloy-docs/backend/backend-resource-module-contract-chain.md +323 -0
  15. package/cabloy-docs/backend/backend-source-reading-debug-checklist.md +173 -0
  16. package/cabloy-docs/backend/backend-source-reading-roadmap.md +129 -0
  17. package/cabloy-docs/backend/backend-source-reading-verify-playbook.md +166 -0
  18. package/cabloy-docs/backend/bean-scene-authoring.md +4 -4
  19. package/cabloy-docs/backend/broadcast-guide.md +3 -3
  20. package/cabloy-docs/backend/cli.md +20 -11
  21. package/cabloy-docs/backend/config-guide.md +4 -4
  22. package/cabloy-docs/backend/controller-aop-guide.md +10 -10
  23. package/cabloy-docs/backend/controller-guide.md +12 -2
  24. package/cabloy-docs/backend/crud-workflow.md +7 -3
  25. package/cabloy-docs/backend/dto-guide.md +12 -2
  26. package/cabloy-docs/backend/dto-infer-generation.md +201 -25
  27. package/cabloy-docs/backend/election-guide.md +2 -2
  28. package/cabloy-docs/backend/entity-guide.md +12 -3
  29. package/cabloy-docs/backend/error-guide.md +3 -3
  30. package/cabloy-docs/backend/event-guide.md +4 -4
  31. package/cabloy-docs/backend/external-aop-guide.md +2 -2
  32. package/cabloy-docs/backend/field-indexes.md +9 -3
  33. package/cabloy-docs/backend/foundation.md +8 -8
  34. package/cabloy-docs/backend/i18n-guide.md +6 -6
  35. package/cabloy-docs/backend/internal-aop-guide.md +2 -2
  36. package/cabloy-docs/backend/introduction.md +13 -0
  37. package/cabloy-docs/backend/migration-and-changes.md +3 -3
  38. package/cabloy-docs/backend/model-guide.md +16 -6
  39. package/cabloy-docs/backend/openapi-guide.md +3 -0
  40. package/cabloy-docs/backend/queue-guide.md +3 -3
  41. package/cabloy-docs/backend/redlock-guide.md +2 -2
  42. package/cabloy-docs/backend/schedule-guide.md +2 -2
  43. package/cabloy-docs/backend/scripts.md +8 -0
  44. package/cabloy-docs/backend/serialization-guide.md +2 -2
  45. package/cabloy-docs/backend/service-guide.md +18 -9
  46. package/cabloy-docs/backend/startup-guide.md +5 -5
  47. package/cabloy-docs/backend/status-guide.md +7 -7
  48. package/cabloy-docs/backend/unit-testing.md +3 -3
  49. package/cabloy-docs/backend/vona-source-reading-map.md +157 -0
  50. package/cabloy-docs/backend/websocket-protocol-guide.md +5 -5
  51. package/cabloy-docs/backend/websocket-usage-guide.md +15 -8
  52. package/cabloy-docs/frontend/a-model-under-the-hood.md +281 -0
  53. package/cabloy-docs/frontend/a-openapi-under-the-hood.md +248 -0
  54. package/cabloy-docs/frontend/a-router-guide.md +307 -0
  55. package/cabloy-docs/frontend/api-guide.md +4 -4
  56. package/cabloy-docs/frontend/api-schema-guide.md +1 -0
  57. package/cabloy-docs/frontend/app-startup-guide.md +7 -4
  58. package/cabloy-docs/frontend/bean-scene-authoring.md +1 -1
  59. package/cabloy-docs/frontend/behavior-guide.md +16 -16
  60. package/cabloy-docs/frontend/cli.md +5 -5
  61. package/cabloy-docs/frontend/command-scene-authoring.md +17 -8
  62. package/cabloy-docs/frontend/component-guide.md +5 -5
  63. package/cabloy-docs/frontend/component-props-guide.md +1 -1
  64. package/cabloy-docs/frontend/component-v-model-guide.md +2 -2
  65. package/cabloy-docs/frontend/filter-query-select-data-flow-guide.md +260 -0
  66. package/cabloy-docs/frontend/form-guide.md +19 -28
  67. package/cabloy-docs/frontend/form-scene-to-page-meta-guide.md +303 -0
  68. package/cabloy-docs/frontend/foundation.md +10 -6
  69. package/cabloy-docs/frontend/frontend-source-reading-roadmap.md +249 -0
  70. package/cabloy-docs/frontend/generated-contract-consumption-debug-checklist.md +190 -0
  71. package/cabloy-docs/frontend/generated-contract-consumption-entry-branch.md +205 -0
  72. package/cabloy-docs/frontend/generated-contract-consumption-list-branch.md +157 -0
  73. package/cabloy-docs/frontend/generated-contract-consumption-specimen.md +203 -0
  74. package/cabloy-docs/frontend/generated-contract-consumption-verify-playbook.md +189 -0
  75. package/cabloy-docs/frontend/generic-component-guide.md +1 -1
  76. package/cabloy-docs/frontend/introduction.md +29 -7
  77. package/cabloy-docs/frontend/model-architecture.md +38 -2
  78. package/cabloy-docs/frontend/model-resource-cookbook.md +11 -8
  79. package/cabloy-docs/frontend/model-resource-internals-deep-dive.md +238 -0
  80. package/cabloy-docs/frontend/model-resource-owner-pattern.md +22 -2
  81. package/cabloy-docs/frontend/model-resource-usage-guide.md +22 -6
  82. package/cabloy-docs/frontend/model-state-guide.md +12 -9
  83. package/cabloy-docs/frontend/module-scope.md +8 -8
  84. package/cabloy-docs/frontend/modules-and-suites.md +2 -1
  85. package/cabloy-docs/frontend/navigation-guards-guide.md +7 -0
  86. package/cabloy-docs/frontend/openapi-sdk-guide.md +12 -4
  87. package/cabloy-docs/frontend/page-guide.md +9 -9
  88. package/cabloy-docs/frontend/page-meta-guide.md +466 -0
  89. package/cabloy-docs/frontend/page-params-guide.md +3 -3
  90. package/cabloy-docs/frontend/page-query-guide.md +2 -2
  91. package/cabloy-docs/frontend/page-route-guide.md +6 -0
  92. package/cabloy-docs/frontend/permission-formscene-action-visibility-guide.md +263 -0
  93. package/cabloy-docs/frontend/quickstart.md +14 -2
  94. package/cabloy-docs/frontend/resource-entry-page-deep-dive.md +271 -0
  95. package/cabloy-docs/frontend/resource-list-page-deep-dive.md +279 -0
  96. package/cabloy-docs/frontend/rest-resource-source-reading-map.md +522 -0
  97. package/cabloy-docs/frontend/rest-resource-under-the-hood.md +622 -0
  98. package/cabloy-docs/frontend/root-behaviors-guide.md +282 -0
  99. package/cabloy-docs/frontend/route-alias-guide.md +6 -0
  100. package/cabloy-docs/frontend/router-stack-guide.md +229 -0
  101. package/cabloy-docs/frontend/router-tabs-introduction.md +26 -3
  102. package/cabloy-docs/frontend/router-tabs-layout-integration.md +367 -0
  103. package/cabloy-docs/frontend/router-tabs-mechanism.md +6 -0
  104. package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +7 -0
  105. package/cabloy-docs/frontend/router-tabs-vs-stack.md +167 -0
  106. package/cabloy-docs/frontend/router-view-hosts-guide.md +450 -0
  107. package/cabloy-docs/frontend/server-data.md +2 -1
  108. package/cabloy-docs/frontend/system-startup-guide.md +2 -2
  109. package/cabloy-docs/frontend/table-action-visibility-permission-flow-guide.md +263 -0
  110. package/cabloy-docs/frontend/table-cell-cookbook.md +568 -0
  111. package/cabloy-docs/frontend/table-guide.md +373 -0
  112. package/cabloy-docs/frontend/table-resource-crud-cookbook.md +496 -0
  113. package/cabloy-docs/frontend/zova-app-guide.md +251 -0
  114. package/cabloy-docs/frontend/zova-form-source-reading-map.md +7 -9
  115. package/cabloy-docs/frontend/zova-form-under-the-hood.md +5 -0
  116. package/cabloy-docs/frontend/zova-router-under-the-hood.md +561 -0
  117. package/cabloy-docs/frontend/zova-source-reading-map.md +101 -7
  118. package/cabloy-docs/frontend/zova-table-controller-render-supplement.md +225 -0
  119. package/cabloy-docs/frontend/zova-table-source-reading-map.md +317 -0
  120. package/cabloy-docs/frontend/zova-table-under-the-hood.md +532 -0
  121. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-debug-checklist.md +245 -0
  122. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map.md +139 -0
  123. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-verify-playbook.md +248 -0
  124. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions.md +511 -0
  125. package/cabloy-docs/fullstack/contract-loop-playbook.md +8 -2
  126. package/cabloy-docs/fullstack/edition-collaboration-differences.md +6 -0
  127. package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +181 -48
  128. package/cabloy-docs/fullstack/introduction.md +3 -0
  129. package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -2
  130. package/cabloy-docs/fullstack/suites-and-modules.md +333 -0
  131. package/cabloy-docs/fullstack/tutorial-1-first-module.md +3 -0
  132. package/cabloy-docs/fullstack/tutorial-2-first-crud.md +4 -0
  133. package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +4 -0
  134. package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +31 -19
  135. package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +5 -0
  136. package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +4 -0
  137. package/cabloy-docs/fullstack/tutorials-overview.md +1 -1
  138. package/cabloy-docs/reference/bean-scene-boilerplates.md +13 -13
  139. package/cabloy-docs/reference/package-map.md +4 -3
  140. package/package.json +1 -1
  141. package/vona/pnpm-lock.yaml +22 -258
  142. package/vona/src/suite/a-training/modules/training-student/package.json +53 -0
  143. package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +400 -0
  144. package/vona/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +18 -0
  145. package/vona/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  146. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.index.ts +12 -0
  147. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.version.ts +21 -0
  148. package/vona/src/suite/a-training/modules/training-student/src/bean/ssrMenu.student.ts +29 -0
  149. package/vona/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +15 -0
  150. package/vona/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +15 -0
  151. package/vona/src/suite/a-training/modules/training-student/src/controller/student.ts +74 -0
  152. package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +28 -0
  153. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectReq.tsx +44 -0
  154. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectRes.tsx +11 -0
  155. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx +45 -0
  156. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +42 -0
  157. package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +28 -0
  158. package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +25 -0
  159. package/vona/src/suite/a-training/modules/training-student/src/entity/student.tsx +84 -0
  160. package/vona/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  161. package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +10 -0
  162. package/vona/src/suite/a-training/modules/training-student/src/service/student.ts +57 -0
  163. package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +173 -0
  164. package/vona/src/suite/a-training/modules/training-student/tsconfig.build.json +11 -0
  165. package/vona/src/suite/a-training/modules/training-student/tsconfig.json +7 -0
  166. package/vona/src/suite/a-training/package.json +12 -0
  167. package/vona/src/suite/a-training/tsconfig.base.json +4 -0
  168. package/vona/src/suite/a-training/tsconfig.json +10 -0
  169. package/zova/packages-zova/zova/package.json +2 -2
  170. package/zova/pnpm-lock.yaml +406 -680
  171. package/zova/src/suite/a-training/modules/training-student/cli/openapi.config.ts +9 -0
  172. package/zova/src/suite/a-training/modules/training-student/package.json +52 -0
  173. package/zova/src/suite/a-training/modules/training-student/src/.metadata/component/formFieldLevel.ts +31 -0
  174. package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +258 -0
  175. package/zova/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +7 -0
  176. package/zova/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  177. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/baseURL.ts +5 -0
  178. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/index.ts +3 -0
  179. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +196 -0
  180. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +4146 -0
  181. package/zova/src/suite/a-training/modules/training-student/src/api/trainingStudent.ts +151 -0
  182. package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +43 -0
  183. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +51 -0
  184. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +56 -0
  185. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.level.tsx +63 -0
  186. package/zova/src/suite/a-training/modules/training-student/src/component/formFieldLevel/controller.tsx +117 -0
  187. package/zova/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +9 -0
  188. package/zova/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +9 -0
  189. package/zova/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  190. package/zova/src/suite/a-training/modules/training-student/src/model/student.ts +42 -0
  191. package/zova/src/suite/a-training/modules/training-student/tsconfig.build.json +13 -0
  192. package/zova/src/suite/a-training/modules/training-student/tsconfig.json +5 -0
  193. package/zova/src/suite/a-training/package.json +12 -0
  194. package/zova/src/suite/a-training/tsconfig.base.json +4 -0
  195. package/zova/src/suite/a-training/tsconfig.json +4 -0
  196. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +29 -7
  197. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +34 -11
  198. package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
  199. package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +3 -3
  200. package/zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts +1 -1
  201. 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.