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.
- 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 +42 -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 +19 -28
- 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 +568 -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 +406 -680
- 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 +52 -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 +51 -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-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-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,189 @@
|
|
|
1
|
+
# Backend Contract Emission Output Inspection
|
|
2
|
+
|
|
3
|
+
This page is a practical inspection companion for one narrow backend question:
|
|
4
|
+
|
|
5
|
+
> after I understand the controller/DTO/entity inputs, how do I inspect the emitted Swagger/OpenAPI output for one backend contract slice?
|
|
6
|
+
|
|
7
|
+
It uses one concrete emitted thread as the specimen:
|
|
8
|
+
|
|
9
|
+
- `GET /training/student/summary/:id`
|
|
10
|
+
|
|
11
|
+
Use this page together with:
|
|
12
|
+
|
|
13
|
+
- [OpenAPI Guide](/backend/openapi-guide)
|
|
14
|
+
- [Backend Contract Emission Specimen](/backend/backend-contract-emission-specimen)
|
|
15
|
+
- [Backend Contract Emission Source Reading Map](/backend/backend-contract-emission-source-reading-map)
|
|
16
|
+
- [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk)
|
|
17
|
+
|
|
18
|
+
> [!TIP]
|
|
19
|
+
> **Backend emission inspection path**
|
|
20
|
+
>
|
|
21
|
+
> 1. **[OpenAPI Guide](/backend/openapi-guide)** — understand backend emission conceptually
|
|
22
|
+
> 2. **[Backend Contract Emission Specimen](/backend/backend-contract-emission-specimen)** — inspect one concrete emitted action thread
|
|
23
|
+
> 3. **[Backend Contract Emission Source Reading Map](/backend/backend-contract-emission-source-reading-map)** — trace the broader input-side file order
|
|
24
|
+
> 4. **[Backend Contract Emission Output Inspection](/backend/backend-contract-emission-output-inspection)** — inspect the emitted output surfaces themselves
|
|
25
|
+
>
|
|
26
|
+
> **You are here:** step 4.
|
|
27
|
+
> **Previous recommended pages:** [OpenAPI Guide](/backend/openapi-guide), [Backend Contract Emission Specimen](/backend/backend-contract-emission-specimen), and [Backend Contract Emission Source Reading Map](/backend/backend-contract-emission-source-reading-map).
|
|
28
|
+
|
|
29
|
+
## Why this page exists
|
|
30
|
+
|
|
31
|
+
The current backend docs already explain three useful layers of the emission story:
|
|
32
|
+
|
|
33
|
+
- why OpenAPI matters
|
|
34
|
+
- how one concrete emitted action thread is authored
|
|
35
|
+
- which files to read in source order for the broader emission branch
|
|
36
|
+
|
|
37
|
+
What was still missing was one page that starts from the **emitted output surfaces themselves**.
|
|
38
|
+
|
|
39
|
+
This page fills that gap.
|
|
40
|
+
|
|
41
|
+
It is not another broad OpenAPI concept page and not another source-reading map. It is the companion page for inspecting the emitted artifact directly.
|
|
42
|
+
|
|
43
|
+
## The shortest accurate mental model
|
|
44
|
+
|
|
45
|
+
For this specimen, there are three things you should compare:
|
|
46
|
+
|
|
47
|
+
1. the authored controller/DTO inputs
|
|
48
|
+
2. the generated module-level metadata records
|
|
49
|
+
3. the emitted OpenAPI output surfaces
|
|
50
|
+
|
|
51
|
+
If those three surfaces agree, the emitted backend contract slice is usually correct enough to hand off into the forward-chain frontend generation step.
|
|
52
|
+
|
|
53
|
+
## Which emitted surfaces to inspect
|
|
54
|
+
|
|
55
|
+
The current backend docs already name the main inspection surfaces:
|
|
56
|
+
|
|
57
|
+
- Swagger UI
|
|
58
|
+
- OpenAPI JSON output
|
|
59
|
+
- versioned OpenAPI JSON output
|
|
60
|
+
- RapiDoc
|
|
61
|
+
|
|
62
|
+
For local emitted JSON inspection, the current public repo docs already use this example endpoint:
|
|
63
|
+
|
|
64
|
+
- `http://localhost:7102/swagger/json?version=V31`
|
|
65
|
+
|
|
66
|
+
That is the most practical raw inspection surface when you want to confirm the emitted machine-readable contract itself.
|
|
67
|
+
|
|
68
|
+
## The specimen to keep in mind
|
|
69
|
+
|
|
70
|
+
Keep one small emitted path in mind while inspecting output:
|
|
71
|
+
|
|
72
|
+
- `GET /training/student/summary/:id`
|
|
73
|
+
|
|
74
|
+
The authored/backend anchors for that path are:
|
|
75
|
+
|
|
76
|
+
- `vona/src/suite/a-training/modules/training-student/src/controller/student.ts`
|
|
77
|
+
- `vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx`
|
|
78
|
+
- `vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts`
|
|
79
|
+
|
|
80
|
+
This page is not re-walking those files in depth. It uses them as the comparison baseline for the emitted output.
|
|
81
|
+
|
|
82
|
+
## What to confirm in emitted output
|
|
83
|
+
|
|
84
|
+
### 1. Confirm the route path exists
|
|
85
|
+
|
|
86
|
+
Start by confirming that the emitted OpenAPI output includes the expected route path for the specimen.
|
|
87
|
+
|
|
88
|
+
For this page, the check is simple:
|
|
89
|
+
|
|
90
|
+
- the emitted output should expose the summary action path for the Student resource
|
|
91
|
+
|
|
92
|
+
Compare that against:
|
|
93
|
+
|
|
94
|
+
- `@Web.get('summary/:id')` in `controller/student.ts`
|
|
95
|
+
- the generated path registration in `.metadata/index.ts`
|
|
96
|
+
|
|
97
|
+
A practical reading takeaway is:
|
|
98
|
+
|
|
99
|
+
> the controller action and the emitted path should agree before you think about frontend SDK generation.
|
|
100
|
+
|
|
101
|
+
### 2. Confirm the emitted response shape matches the DTO contract
|
|
102
|
+
|
|
103
|
+
Next, inspect the response schema for the summary action.
|
|
104
|
+
|
|
105
|
+
The source truth for the named response shape is:
|
|
106
|
+
|
|
107
|
+
- `DtoStudentSummary`
|
|
108
|
+
|
|
109
|
+
Representative fields in that DTO include:
|
|
110
|
+
|
|
111
|
+
- `id`
|
|
112
|
+
- `name`
|
|
113
|
+
- `mobile`
|
|
114
|
+
- `level`
|
|
115
|
+
- `levelTitle`
|
|
116
|
+
- `description`
|
|
117
|
+
- `descriptionLength`
|
|
118
|
+
- `summaryText`
|
|
119
|
+
|
|
120
|
+
When you inspect the emitted OpenAPI output, the important question is:
|
|
121
|
+
|
|
122
|
+
- does the response schema still reflect the intended named DTO shape?
|
|
123
|
+
|
|
124
|
+
A practical reading takeaway is:
|
|
125
|
+
|
|
126
|
+
> for this specimen, `DtoStudentSummary` is the response-shape baseline that the emitted output should mirror.
|
|
127
|
+
|
|
128
|
+
### 3. Confirm the generated registry agrees with the emitted slice
|
|
129
|
+
|
|
130
|
+
The generated module surface in:
|
|
131
|
+
|
|
132
|
+
- `vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts`
|
|
133
|
+
|
|
134
|
+
should still agree with what you see in emitted output.
|
|
135
|
+
|
|
136
|
+
The two most useful checks are:
|
|
137
|
+
|
|
138
|
+
- the DTO registry includes `training-student:studentSummary`
|
|
139
|
+
- the generated API path records include the summary route
|
|
140
|
+
|
|
141
|
+
That gives you a compact consistency triangle:
|
|
142
|
+
|
|
143
|
+
- controller action
|
|
144
|
+
- DTO registration
|
|
145
|
+
- emitted OpenAPI path/schema output
|
|
146
|
+
|
|
147
|
+
## A practical inspection order
|
|
148
|
+
|
|
149
|
+
When checking one emitted backend contract slice, use this order:
|
|
150
|
+
|
|
151
|
+
1. confirm the authored controller action is still the intended source truth
|
|
152
|
+
2. confirm the named DTO is still the intended response-shape truth
|
|
153
|
+
3. confirm `.metadata/index.ts` still exposes the expected path and DTO registration
|
|
154
|
+
4. inspect versioned OpenAPI JSON output
|
|
155
|
+
5. only then hand off to frontend generation or bridge diagnostics
|
|
156
|
+
|
|
157
|
+
That order keeps the inspection process narrow and avoids drifting too early into downstream layers.
|
|
158
|
+
|
|
159
|
+
## What this page does not re-explain
|
|
160
|
+
|
|
161
|
+
This page deliberately does **not** re-teach:
|
|
162
|
+
|
|
163
|
+
- broad OpenAPI concepts -> see [OpenAPI Guide](/backend/openapi-guide)
|
|
164
|
+
- the full emitted action specimen narrative -> see [Backend Contract Emission Specimen](/backend/backend-contract-emission-specimen)
|
|
165
|
+
- the file-order path into controller/DTO/entity inputs -> see [Backend Contract Emission Source Reading Map](/backend/backend-contract-emission-source-reading-map)
|
|
166
|
+
- how emitted backend contract becomes generated frontend consumers -> see [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk)
|
|
167
|
+
|
|
168
|
+
Its job is only to help you inspect the emitted backend output itself.
|
|
169
|
+
|
|
170
|
+
## Where to read next
|
|
171
|
+
|
|
172
|
+
- If you need the broader conceptual emission page, continue with [OpenAPI Guide](/backend/openapi-guide).
|
|
173
|
+
- If you want a backend-side proof or diagnosis companion after checking emitted output, continue with [Backend Source Reading Verify Playbook](/backend/backend-source-reading-verify-playbook) and [Backend Source Reading Debug Checklist](/backend/backend-source-reading-debug-checklist).
|
|
174
|
+
- If you need the concrete authored action thread again, continue with [Backend Contract Emission Specimen](/backend/backend-contract-emission-specimen).
|
|
175
|
+
- If you need the broader input-side file-order path, continue with [Backend Contract Emission Source Reading Map](/backend/backend-contract-emission-source-reading-map).
|
|
176
|
+
- If the emitted backend output now looks correct and you want the next bridge step, continue with [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk).
|
|
177
|
+
|
|
178
|
+
## Final takeaway
|
|
179
|
+
|
|
180
|
+
The cleanest way to inspect one emitted backend contract slice is not to stay only in conceptual OpenAPI docs and not to jump immediately into frontend generation.
|
|
181
|
+
|
|
182
|
+
For the `summary/:id` specimen, compare:
|
|
183
|
+
|
|
184
|
+
- the controller action
|
|
185
|
+
- the named DTO shape
|
|
186
|
+
- the generated module registry
|
|
187
|
+
- the emitted OpenAPI output surface
|
|
188
|
+
|
|
189
|
+
If those surfaces agree, the backend contract slice is usually ready for the forward-chain handoff.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Backend Contract Emission Source Reading Map
|
|
2
|
+
|
|
3
|
+
This page is a practical source-reading companion for one narrow backend question:
|
|
4
|
+
|
|
5
|
+
> if my question is no longer “how one module is wired” but “how controller, entity, and DTO metadata become emitted OpenAPI contract,” which files should I read first, and in what order?
|
|
6
|
+
|
|
7
|
+
Use this page together with:
|
|
8
|
+
|
|
9
|
+
- [OpenAPI Guide](/backend/openapi-guide)
|
|
10
|
+
- [DTO Infer and Generation](/backend/dto-infer-generation)
|
|
11
|
+
- [Backend Resource/Module Contract Chain](/backend/backend-resource-module-contract-chain)
|
|
12
|
+
- [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk)
|
|
13
|
+
|
|
14
|
+
> [!TIP]
|
|
15
|
+
> **Backend emission reading path**
|
|
16
|
+
>
|
|
17
|
+
> 1. **[Backend Resource/Module Contract Chain](/backend/backend-resource-module-contract-chain)** — understand how one real module is wired
|
|
18
|
+
> 2. **[DTO Infer and Generation](/backend/dto-infer-generation)** — understand how DTO shapes are chosen and wrapped
|
|
19
|
+
> 3. **[Backend Contract Emission Source Reading Map](/backend/backend-contract-emission-source-reading-map)** — trace how those surfaces become emitted OpenAPI contract
|
|
20
|
+
>
|
|
21
|
+
> **You are here:** step 3.
|
|
22
|
+
> **Previous recommended pages:** [Backend Resource/Module Contract Chain](/backend/backend-resource-module-contract-chain) and [DTO Infer and Generation](/backend/dto-infer-generation).
|
|
23
|
+
|
|
24
|
+
## Why this page exists
|
|
25
|
+
|
|
26
|
+
The current backend docs already explain:
|
|
27
|
+
|
|
28
|
+
- how one backend module is wired
|
|
29
|
+
- how DTO helpers and generated metadata work
|
|
30
|
+
- why OpenAPI matters as a backend contract bridge
|
|
31
|
+
|
|
32
|
+
What was still missing was one source-order page that isolates the emission branch itself.
|
|
33
|
+
|
|
34
|
+
This page fills that gap.
|
|
35
|
+
|
|
36
|
+
It is a file-order map for contract emission, not another broad OpenAPI concept page.
|
|
37
|
+
|
|
38
|
+
## How to use this page
|
|
39
|
+
|
|
40
|
+
Use this rule of thumb:
|
|
41
|
+
|
|
42
|
+
1. start with the conceptual pages first
|
|
43
|
+
2. read the first source file to identify the contract input surface
|
|
44
|
+
3. follow the emission path only until you understand where the emitted backend contract comes from
|
|
45
|
+
4. stop and hand off to the fullstack forward bridge once the question becomes frontend generation or consumption
|
|
46
|
+
|
|
47
|
+
## The shortest accurate mental model
|
|
48
|
+
|
|
49
|
+
A practical backend emission path looks like this:
|
|
50
|
+
|
|
51
|
+
1. controllers define route/action request and response contracts
|
|
52
|
+
2. DTOs and entities define named and shared field/metadata surfaces
|
|
53
|
+
3. validation and `v` helpers refine the emitted shape
|
|
54
|
+
4. OpenAPI generation reads those combined surfaces into machine-readable contract output
|
|
55
|
+
5. that emitted contract then hands off to the forward-chain fullstack bridge
|
|
56
|
+
|
|
57
|
+
That means the emission branch is not the same as the module wiring branch.
|
|
58
|
+
|
|
59
|
+
It starts from the authored contract surfaces, then stops when the emitted backend contract is ready for downstream consumers.
|
|
60
|
+
|
|
61
|
+
## Source-confirmed reading path
|
|
62
|
+
|
|
63
|
+
Use this order:
|
|
64
|
+
|
|
65
|
+
1. `vona/src/suite/a-training/modules/training-student/src/controller/student.ts`
|
|
66
|
+
2. `vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx`
|
|
67
|
+
3. `vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx`
|
|
68
|
+
4. `vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx`
|
|
69
|
+
5. `vona/src/suite/a-training/modules/training-student/src/dto/studentSelectReq.tsx`
|
|
70
|
+
6. `vona/src/suite/a-training/modules/training-student/src/dto/studentSelectRes.tsx`
|
|
71
|
+
7. `vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx`
|
|
72
|
+
8. `vona/src/suite/a-training/modules/training-student/src/entity/student.tsx`
|
|
73
|
+
9. `vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts`
|
|
74
|
+
10. then return to the conceptual emission surface in [OpenAPI Guide](/backend/openapi-guide)
|
|
75
|
+
|
|
76
|
+
That order starts from the route/action contract surface, descends through the DTO and entity metadata that shape the emitted contract, and then returns to the OpenAPI-specific conceptual layer once the inputs are clear.
|
|
77
|
+
|
|
78
|
+
## What each source surface clarifies
|
|
79
|
+
|
|
80
|
+
### `controller/student.ts`
|
|
81
|
+
|
|
82
|
+
This file shows the route/action contract entry layer:
|
|
83
|
+
|
|
84
|
+
- `@Web.*` action declarations
|
|
85
|
+
- `@Arg.*` request extraction
|
|
86
|
+
- `@Api.body(...)` response contract surfaces
|
|
87
|
+
- action-level request/response DTO references
|
|
88
|
+
|
|
89
|
+
Read this file first when the question is:
|
|
90
|
+
|
|
91
|
+
- which action contracts are even supposed to emit into OpenAPI?
|
|
92
|
+
|
|
93
|
+
### `dto/*.tsx`
|
|
94
|
+
|
|
95
|
+
These files show the named request/response contract artifacts that OpenAPI can emit.
|
|
96
|
+
|
|
97
|
+
Representative distinctions to keep in mind:
|
|
98
|
+
|
|
99
|
+
- create/update/view DTOs are operation-facing named artifacts
|
|
100
|
+
- select request DTOs may also carry filter-specific shaping and transform logic
|
|
101
|
+
- list/count DTOs may wrap row-item DTOs into emitted list contracts
|
|
102
|
+
|
|
103
|
+
Read these files when the question is:
|
|
104
|
+
|
|
105
|
+
- which DTO shape is part of the emitted backend contract?
|
|
106
|
+
|
|
107
|
+
### `entity/student.tsx`
|
|
108
|
+
|
|
109
|
+
This file shows the shared field contract surface:
|
|
110
|
+
|
|
111
|
+
- `@Api.field(...)`
|
|
112
|
+
- validation-oriented field rules
|
|
113
|
+
- OpenAPI-facing titles and metadata
|
|
114
|
+
- field-level render metadata that still belongs to the broader contract story
|
|
115
|
+
|
|
116
|
+
Read this file when the question is:
|
|
117
|
+
|
|
118
|
+
- which parts of the emitted contract are shared field truth rather than DTO-local additions?
|
|
119
|
+
|
|
120
|
+
### `.metadata/index.ts`
|
|
121
|
+
|
|
122
|
+
This file is not the main emission engine, but it still matters as a generated registry surface.
|
|
123
|
+
|
|
124
|
+
Read it when the question is:
|
|
125
|
+
|
|
126
|
+
- how do the DTO/controller/entity contract artifacts become visible as a coherent module-level generated surface?
|
|
127
|
+
|
|
128
|
+
Its value here is limited and specific:
|
|
129
|
+
|
|
130
|
+
- it confirms the DTO/controller/entity registrations exist together
|
|
131
|
+
- it shows those artifacts are not isolated local files only
|
|
132
|
+
|
|
133
|
+
Then stop and move back to the OpenAPI emission docs instead of re-reading the whole module chain.
|
|
134
|
+
|
|
135
|
+
## What this page does not re-explain
|
|
136
|
+
|
|
137
|
+
This page deliberately does **not** re-teach:
|
|
138
|
+
|
|
139
|
+
- full module wiring and generated registration inventory -> see [Backend Resource/Module Contract Chain](/backend/backend-resource-module-contract-chain)
|
|
140
|
+
- explicit vs inferred DTO strategy -> see [DTO Infer and Generation](/backend/dto-infer-generation)
|
|
141
|
+
- frontend SDK generation and consumption -> see [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk)
|
|
142
|
+
- general OpenAPI concepts -> see [OpenAPI Guide](/backend/openapi-guide)
|
|
143
|
+
|
|
144
|
+
Its job is only to show the shortest file-order path through the backend contract-emission inputs.
|
|
145
|
+
|
|
146
|
+
## Where to read next
|
|
147
|
+
|
|
148
|
+
- If you need the broader conceptual emission page, continue with [OpenAPI Guide](/backend/openapi-guide).
|
|
149
|
+
- If you want one concrete emitted action thread before widening back out, continue with [Backend Contract Emission Specimen](/backend/backend-contract-emission-specimen).
|
|
150
|
+
- If you want a backend-side proof or diagnosis companion for the source-reading path itself, continue with [Backend Source Reading Verify Playbook](/backend/backend-source-reading-verify-playbook) and [Backend Source Reading Debug Checklist](/backend/backend-source-reading-debug-checklist).
|
|
151
|
+
- If you want to inspect the emitted output surfaces themselves after the source-order path, continue with [Backend Contract Emission Output Inspection](/backend/backend-contract-emission-output-inspection).
|
|
152
|
+
- If your next question is still about DTO helper and wrapping mechanics, return to [DTO Infer and Generation](/backend/dto-infer-generation).
|
|
153
|
+
- If your next question is about how one real module is wired before emission, return to [Backend Resource/Module Contract Chain](/backend/backend-resource-module-contract-chain).
|
|
154
|
+
- If your next question is about how the emitted backend contract becomes generated frontend consumers, continue with [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk).
|
|
155
|
+
|
|
156
|
+
## Final takeaway
|
|
157
|
+
|
|
158
|
+
The cleanest way to read backend contract emission is not to stay only in conceptual OpenAPI docs and not to reread the whole module chain every time.
|
|
159
|
+
|
|
160
|
+
Start from controller + DTO + entity contract inputs, confirm how those surfaces shape the emitted contract, then hand off to the forward-chain bridge once the emitted backend truth is clear.
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Backend Contract Emission Specimen
|
|
2
|
+
|
|
3
|
+
This page is a concrete backend specimen for one narrow question:
|
|
4
|
+
|
|
5
|
+
> how does one real controller action become one emitted backend contract slice?
|
|
6
|
+
|
|
7
|
+
It uses one emitted path only:
|
|
8
|
+
|
|
9
|
+
- `GET /training/student/summary/:id`
|
|
10
|
+
|
|
11
|
+
Use this page together with:
|
|
12
|
+
|
|
13
|
+
- [OpenAPI Guide](/backend/openapi-guide)
|
|
14
|
+
- [Backend Contract Emission Source Reading Map](/backend/backend-contract-emission-source-reading-map)
|
|
15
|
+
- [Backend Resource/Module Contract Chain](/backend/backend-resource-module-contract-chain)
|
|
16
|
+
- [DTO Infer and Generation](/backend/dto-infer-generation)
|
|
17
|
+
- [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk)
|
|
18
|
+
|
|
19
|
+
> [!TIP]
|
|
20
|
+
> **Backend emission reading path**
|
|
21
|
+
>
|
|
22
|
+
> 1. **[OpenAPI Guide](/backend/openapi-guide)** — understand backend contract emission conceptually
|
|
23
|
+
> 2. **[Backend Contract Emission Specimen](/backend/backend-contract-emission-specimen)** — inspect one real emitted controller-action thread
|
|
24
|
+
> 3. **[Backend Contract Emission Source Reading Map](/backend/backend-contract-emission-source-reading-map)** — widen back out to the broader file-order emission path
|
|
25
|
+
>
|
|
26
|
+
> **You are here:** step 2.
|
|
27
|
+
> **Previous recommended page:** [OpenAPI Guide](/backend/openapi-guide).
|
|
28
|
+
|
|
29
|
+
## Why this specimen exists
|
|
30
|
+
|
|
31
|
+
The current backend docs already explain several adjacent parts of the story:
|
|
32
|
+
|
|
33
|
+
- `OpenAPI Guide` explains why OpenAPI matters conceptually
|
|
34
|
+
- `Backend Resource/Module Contract Chain` explains how one module is wired
|
|
35
|
+
- `DTO Infer and Generation` explains how DTO shapes are chosen and wrapped
|
|
36
|
+
- `Backend Contract Emission Source Reading Map` explains the broader file-order path for emission inputs
|
|
37
|
+
|
|
38
|
+
What was still missing was one compact specimen that stays on a single emitted thread.
|
|
39
|
+
|
|
40
|
+
This page fills that gap.
|
|
41
|
+
|
|
42
|
+
It is not another broad OpenAPI guide and not another full module walkthrough. It is a specimen page for one emitted backend contract slice.
|
|
43
|
+
|
|
44
|
+
## The shortest accurate mental model
|
|
45
|
+
|
|
46
|
+
For this specimen, the emitted backend contract comes from three main authored surfaces:
|
|
47
|
+
|
|
48
|
+
1. the controller action declares the route and response contract entry
|
|
49
|
+
2. the DTO class declares the named response body shape
|
|
50
|
+
3. the module’s generated metadata surface exposes the registered route and DTO presence together
|
|
51
|
+
|
|
52
|
+
That is enough to answer the practical question:
|
|
53
|
+
|
|
54
|
+
- which action is being emitted?
|
|
55
|
+
- which DTO shape is part of that emitted contract?
|
|
56
|
+
- where can I confirm the route path and DTO registration in the generated module surface?
|
|
57
|
+
|
|
58
|
+
## Source-confirmed reading path
|
|
59
|
+
|
|
60
|
+
Use this order:
|
|
61
|
+
|
|
62
|
+
1. `vona/src/suite/a-training/modules/training-student/src/controller/student.ts`
|
|
63
|
+
2. `vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx`
|
|
64
|
+
3. `vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts`
|
|
65
|
+
|
|
66
|
+
That order is intentionally small.
|
|
67
|
+
|
|
68
|
+
It starts at the emitted action contract entry, moves into the DTO response shape, then ends at the generated module-level registration surface.
|
|
69
|
+
|
|
70
|
+
## 1. Controller action: the emitted route and response entry
|
|
71
|
+
|
|
72
|
+
The first source to read is:
|
|
73
|
+
|
|
74
|
+
- `vona/src/suite/a-training/modules/training-student/src/controller/student.ts`
|
|
75
|
+
|
|
76
|
+
Representative source facts:
|
|
77
|
+
|
|
78
|
+
- `@Web.get('summary/:id')`
|
|
79
|
+
- `@Api.body(v.optional(), v.object(DtoStudentSummary))`
|
|
80
|
+
- action method `summary(...)`
|
|
81
|
+
|
|
82
|
+
This file answers the first emission question:
|
|
83
|
+
|
|
84
|
+
- which route/action contract is supposed to be emitted?
|
|
85
|
+
|
|
86
|
+
For this specimen, the answer is clear:
|
|
87
|
+
|
|
88
|
+
- the route is `summary/:id`
|
|
89
|
+
- the response contract is declared through `DtoStudentSummary`
|
|
90
|
+
|
|
91
|
+
A practical reading takeaway is:
|
|
92
|
+
|
|
93
|
+
> the controller action is the contract entry point for the emitted backend slice.
|
|
94
|
+
|
|
95
|
+
## 2. DTO surface: the named emitted response shape
|
|
96
|
+
|
|
97
|
+
The next source to read is:
|
|
98
|
+
|
|
99
|
+
- `vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx`
|
|
100
|
+
|
|
101
|
+
Representative source facts:
|
|
102
|
+
|
|
103
|
+
- `@Dto<IDtoOptionsStudentSummary>()`
|
|
104
|
+
- fields such as `id`, `name`, `mobile`, `level`, `levelTitle`, `description`, `descriptionLength`, and `summaryText`
|
|
105
|
+
- `@Api.field(...)` metadata on each field
|
|
106
|
+
|
|
107
|
+
This file answers the second emission question:
|
|
108
|
+
|
|
109
|
+
- which named response body shape is part of the emitted contract?
|
|
110
|
+
|
|
111
|
+
It is also a useful boundary reminder.
|
|
112
|
+
|
|
113
|
+
This page is not about infer-vs-explicit DTO strategy in general. It is only showing that this concrete action emits a concrete named DTO artifact.
|
|
114
|
+
|
|
115
|
+
A practical reading takeaway is:
|
|
116
|
+
|
|
117
|
+
> for this emitted slice, `DtoStudentSummary` is the clearest response-shape truth to inspect.
|
|
118
|
+
|
|
119
|
+
## 3. Generated module surface: route path and DTO registration together
|
|
120
|
+
|
|
121
|
+
The final source to read is:
|
|
122
|
+
|
|
123
|
+
- `vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts`
|
|
124
|
+
|
|
125
|
+
Representative source facts for this specimen:
|
|
126
|
+
|
|
127
|
+
- the DTO registry includes `training-student:studentSummary`
|
|
128
|
+
- the generated API path record includes `'/training/student/summary/:id'`
|
|
129
|
+
|
|
130
|
+
This file is not the emission engine itself, but it is still useful because it confirms that the action and DTO are visible together in the generated module-level surface.
|
|
131
|
+
|
|
132
|
+
For this specimen, it answers the third emission question:
|
|
133
|
+
|
|
134
|
+
- where can I confirm the summary route path and DTO presence together without re-reading the whole controller and DTO directories?
|
|
135
|
+
|
|
136
|
+
A practical reading takeaway is:
|
|
137
|
+
|
|
138
|
+
> `.metadata/index.ts` is the compact generated confirmation surface after you already know which action and DTO you are tracing.
|
|
139
|
+
|
|
140
|
+
## What this specimen does not cover
|
|
141
|
+
|
|
142
|
+
This page deliberately does **not** re-teach:
|
|
143
|
+
|
|
144
|
+
- the whole backend module wiring chain -> see [Backend Resource/Module Contract Chain](/backend/backend-resource-module-contract-chain)
|
|
145
|
+
- explicit vs inferred DTO mechanics -> see [DTO Infer and Generation](/backend/dto-infer-generation)
|
|
146
|
+
- general OpenAPI concepts and `bean.openapi` capabilities -> see [OpenAPI Guide](/backend/openapi-guide)
|
|
147
|
+
- frontend generation and consumption after emission -> see [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk)
|
|
148
|
+
|
|
149
|
+
Its job is only to keep one emitted action thread small and concrete.
|
|
150
|
+
|
|
151
|
+
## Where to read next
|
|
152
|
+
|
|
153
|
+
- If you want the broader conceptual emission page, continue with [OpenAPI Guide](/backend/openapi-guide).
|
|
154
|
+
- If you want a backend-side proof or diagnosis companion for this emitted-thread path, continue with [Backend Source Reading Verify Playbook](/backend/backend-source-reading-verify-playbook) and [Backend Source Reading Debug Checklist](/backend/backend-source-reading-debug-checklist).
|
|
155
|
+
- If you want to inspect the emitted output itself after this authored specimen, continue with [Backend Contract Emission Output Inspection](/backend/backend-contract-emission-output-inspection).
|
|
156
|
+
- If you want the broader file-order path through emission inputs, continue with [Backend Contract Emission Source Reading Map](/backend/backend-contract-emission-source-reading-map).
|
|
157
|
+
- If you want the full module wiring specimen around this action, continue with [Backend Resource/Module Contract Chain](/backend/backend-resource-module-contract-chain).
|
|
158
|
+
- If you want to follow this emitted backend contract into generated frontend consumers, continue with [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk).
|
|
159
|
+
|
|
160
|
+
## Final takeaway
|
|
161
|
+
|
|
162
|
+
The cleanest way to understand one emitted backend contract slice is not to reread the entire module or stay only in broad OpenAPI concepts.
|
|
163
|
+
|
|
164
|
+
For the `summary/:id` specimen, read:
|
|
165
|
+
|
|
166
|
+
- the controller action for the emitted route/response entry
|
|
167
|
+
- the DTO for the emitted response body shape
|
|
168
|
+
- the generated module surface for route and DTO confirmation
|
|
169
|
+
|
|
170
|
+
That keeps the backend emission story concrete without flattening it into a much larger module walkthrough.
|