cabloy 5.1.49 → 5.1.51

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 (276) hide show
  1. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +207 -0
  2. package/.claude/skills/cabloy-backend-scaffold/evals/evals.json +29 -0
  3. package/.claude/skills/cabloy-backend-scaffold/references/backend-thread-map.md +52 -0
  4. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +39 -0
  5. package/.claude/skills/cabloy-contract-loop/SKILL.md +201 -0
  6. package/.claude/skills/cabloy-contract-loop/evals/evals.json +29 -0
  7. package/.claude/skills/cabloy-contract-loop/references/contract-loop-map.md +47 -0
  8. package/.claude/skills/cabloy-contract-loop/references/verification-checklist.md +32 -0
  9. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +230 -0
  10. package/.claude/skills/cabloy-frontend-scaffold/evals/evals.json +35 -0
  11. package/.claude/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +41 -0
  12. package/.claude/skills/cabloy-frontend-scaffold/references/frontend-thread-map.md +54 -0
  13. package/.claude/skills/cabloy-workflow/SKILL.md +288 -0
  14. package/.claude/skills/cabloy-workflow/evals/evals.json +35 -0
  15. package/.claude/skills/cabloy-workflow/references/cli-strategy.md +39 -0
  16. package/.claude/skills/cabloy-workflow/references/edition-detection.md +29 -0
  17. package/.github/workflows/docs-pages.yml +54 -0
  18. package/.gitignore +1 -0
  19. package/CHANGELOG.md +46 -0
  20. package/CLAUDE.md +59 -0
  21. package/README.md +137 -0
  22. package/cabloy-docs/.vitepress/config.mjs +222 -0
  23. package/cabloy-docs/.vitepress/public/CNAME +1 -0
  24. package/cabloy-docs/.vitepress/theme/custom.css +64 -0
  25. package/cabloy-docs/.vitepress/theme/edition-badges.md +5 -0
  26. package/cabloy-docs/.vitepress/theme/index.js +5 -0
  27. package/cabloy-docs/ai/class-placement-rule.md +138 -0
  28. package/cabloy-docs/ai/cli-for-agents.md +56 -0
  29. package/cabloy-docs/ai/cli-to-skill-map.md +165 -0
  30. package/cabloy-docs/ai/docs-skills-rules-mapping.md +167 -0
  31. package/cabloy-docs/ai/edition-detection.md +30 -0
  32. package/cabloy-docs/ai/future-skill-roadmap.md +135 -0
  33. package/cabloy-docs/ai/global-bean-lookup.md +157 -0
  34. package/cabloy-docs/ai/introduction.md +62 -0
  35. package/cabloy-docs/ai/playbook-backend-module.md +111 -0
  36. package/cabloy-docs/ai/playbook-contract-regeneration.md +100 -0
  37. package/cabloy-docs/ai/playbook-frontend-page.md +99 -0
  38. package/cabloy-docs/ai/playbook-metadata-refresh.md +67 -0
  39. package/cabloy-docs/ai/repo-guidance.md +58 -0
  40. package/cabloy-docs/ai/rules-and-config.md +29 -0
  41. package/cabloy-docs/ai/skills.md +35 -0
  42. package/cabloy-docs/ai/verification.md +30 -0
  43. package/cabloy-docs/backend/aop-overview.md +128 -0
  44. package/cabloy-docs/backend/auth-guide.md +151 -0
  45. package/cabloy-docs/backend/backend-essentials.md +128 -0
  46. package/cabloy-docs/backend/broadcast-guide.md +138 -0
  47. package/cabloy-docs/backend/cache-guide.md +70 -0
  48. package/cabloy-docs/backend/captcha-guide.md +162 -0
  49. package/cabloy-docs/backend/cli.md +173 -0
  50. package/cabloy-docs/backend/config-guide.md +249 -0
  51. package/cabloy-docs/backend/controller-aop-guide.md +270 -0
  52. package/cabloy-docs/backend/controller-guide.md +347 -0
  53. package/cabloy-docs/backend/crud-workflow.md +118 -0
  54. package/cabloy-docs/backend/dto-guide.md +161 -0
  55. package/cabloy-docs/backend/dto-infer-generation.md +153 -0
  56. package/cabloy-docs/backend/dynamic-datasource-guide.md +70 -0
  57. package/cabloy-docs/backend/election-guide.md +141 -0
  58. package/cabloy-docs/backend/entity-guide.md +150 -0
  59. package/cabloy-docs/backend/error-guide.md +108 -0
  60. package/cabloy-docs/backend/event-guide.md +183 -0
  61. package/cabloy-docs/backend/external-aop-guide.md +149 -0
  62. package/cabloy-docs/backend/field-indexes.md +79 -0
  63. package/cabloy-docs/backend/foundation.md +281 -0
  64. package/cabloy-docs/backend/i18n-guide.md +211 -0
  65. package/cabloy-docs/backend/internal-aop-guide.md +181 -0
  66. package/cabloy-docs/backend/introduction.md +95 -0
  67. package/cabloy-docs/backend/jwt-guide.md +276 -0
  68. package/cabloy-docs/backend/logger-guide.md +223 -0
  69. package/cabloy-docs/backend/mail-guide.md +189 -0
  70. package/cabloy-docs/backend/menu-guide.md +80 -0
  71. package/cabloy-docs/backend/migration-and-changes.md +192 -0
  72. package/cabloy-docs/backend/model-guide.md +274 -0
  73. package/cabloy-docs/backend/multi-database-datasource.md +171 -0
  74. package/cabloy-docs/backend/multi-instance-and-instance-resolution.md +196 -0
  75. package/cabloy-docs/backend/openapi-guide.md +118 -0
  76. package/cabloy-docs/backend/orm-aggregate-group-guide.md +210 -0
  77. package/cabloy-docs/backend/orm-configuration-guide.md +165 -0
  78. package/cabloy-docs/backend/orm-guide.md +109 -0
  79. package/cabloy-docs/backend/orm-mutation-guide.md +195 -0
  80. package/cabloy-docs/backend/orm-select-guide.md +243 -0
  81. package/cabloy-docs/backend/queue-guide.md +271 -0
  82. package/cabloy-docs/backend/quickstart.md +141 -0
  83. package/cabloy-docs/backend/redis-guide.md +70 -0
  84. package/cabloy-docs/backend/redlock-guide.md +60 -0
  85. package/cabloy-docs/backend/relations-guide.md +250 -0
  86. package/cabloy-docs/backend/runtime-and-flavors.md +304 -0
  87. package/cabloy-docs/backend/schedule-guide.md +81 -0
  88. package/cabloy-docs/backend/scripts.md +116 -0
  89. package/cabloy-docs/backend/serialization-guide.md +192 -0
  90. package/cabloy-docs/backend/service-guide.md +166 -0
  91. package/cabloy-docs/backend/sharding-guide.md +49 -0
  92. package/cabloy-docs/backend/startup-guide.md +326 -0
  93. package/cabloy-docs/backend/transaction-guide.md +82 -0
  94. package/cabloy-docs/backend/unit-testing.md +209 -0
  95. package/cabloy-docs/backend/upload-guide.md +160 -0
  96. package/cabloy-docs/backend/user-access-guide.md +157 -0
  97. package/cabloy-docs/backend/validation-guide.md +80 -0
  98. package/cabloy-docs/backend/worker-guide.md +59 -0
  99. package/cabloy-docs/editions/cabloy-basic.md +25 -0
  100. package/cabloy-docs/editions/cabloy-start.md +24 -0
  101. package/cabloy-docs/editions/detection.md +31 -0
  102. package/cabloy-docs/editions/overview.md +44 -0
  103. package/cabloy-docs/frontend/api-guide.md +93 -0
  104. package/cabloy-docs/frontend/api-schema-guide.md +43 -0
  105. package/cabloy-docs/frontend/app-startup-guide.md +185 -0
  106. package/cabloy-docs/frontend/cli.md +78 -0
  107. package/cabloy-docs/frontend/component-guide.md +105 -0
  108. package/cabloy-docs/frontend/component-props-guide.md +97 -0
  109. package/cabloy-docs/frontend/component-v-model-guide.md +110 -0
  110. package/cabloy-docs/frontend/css-in-js-guide.md +151 -0
  111. package/cabloy-docs/frontend/design-principles.md +55 -0
  112. package/cabloy-docs/frontend/environment-config-guide.md +250 -0
  113. package/cabloy-docs/frontend/foundation.md +57 -0
  114. package/cabloy-docs/frontend/generic-component-guide.md +35 -0
  115. package/cabloy-docs/frontend/icon-engine-guide.md +88 -0
  116. package/cabloy-docs/frontend/introduction.md +32 -0
  117. package/cabloy-docs/frontend/ioc-and-beans.md +211 -0
  118. package/cabloy-docs/frontend/mock-guide.md +109 -0
  119. package/cabloy-docs/frontend/model-architecture.md +87 -0
  120. package/cabloy-docs/frontend/model-state-guide.md +70 -0
  121. package/cabloy-docs/frontend/module-scope.md +168 -0
  122. package/cabloy-docs/frontend/modules-and-suites.md +179 -0
  123. package/cabloy-docs/frontend/navigation-guards-guide.md +68 -0
  124. package/cabloy-docs/frontend/openapi-sdk-guide.md +102 -0
  125. package/cabloy-docs/frontend/page-guide.md +223 -0
  126. package/cabloy-docs/frontend/page-params-guide.md +87 -0
  127. package/cabloy-docs/frontend/page-query-guide.md +96 -0
  128. package/cabloy-docs/frontend/page-route-guide.md +147 -0
  129. package/cabloy-docs/frontend/quickstart.md +201 -0
  130. package/cabloy-docs/frontend/route-alias-guide.md +61 -0
  131. package/cabloy-docs/frontend/scripts.md +86 -0
  132. package/cabloy-docs/frontend/sdk-guide.md +45 -0
  133. package/cabloy-docs/frontend/server-data.md +74 -0
  134. package/cabloy-docs/frontend/ssr-client-only.md +40 -0
  135. package/cabloy-docs/frontend/ssr-env.md +51 -0
  136. package/cabloy-docs/frontend/ssr-init-data.md +46 -0
  137. package/cabloy-docs/frontend/ssr-overview.md +48 -0
  138. package/cabloy-docs/frontend/ssr-seo-meta.md +52 -0
  139. package/cabloy-docs/frontend/system-startup-guide.md +186 -0
  140. package/cabloy-docs/frontend/theme-guide.md +154 -0
  141. package/cabloy-docs/frontend/zod-guide.md +161 -0
  142. package/cabloy-docs/fullstack/edition-collaboration-differences.md +61 -0
  143. package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +64 -0
  144. package/cabloy-docs/fullstack/introduction.md +69 -0
  145. package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -0
  146. package/cabloy-docs/fullstack/quickstart.md +86 -0
  147. package/cabloy-docs/fullstack/vona-zova-integration.md +86 -0
  148. package/cabloy-docs/index.md +73 -0
  149. package/cabloy-docs/package.json +16 -0
  150. package/cabloy-docs/pnpm-lock.yaml +1607 -0
  151. package/cabloy-docs/reference/backend-directory-structure.md +88 -0
  152. package/cabloy-docs/reference/cli-reference.md +49 -0
  153. package/cabloy-docs/reference/glossary.md +38 -0
  154. package/cabloy-docs/reference/package-map.md +105 -0
  155. package/cabloy-docs/reference/repo-scripts.md +36 -0
  156. package/package.json +4 -1
  157. package/scripts/init.ts +12 -0
  158. package/scripts/upgrade.ts +31 -3
  159. package/vona/README.md +3 -3
  160. package/vona/README.zh-CN.md +4 -4
  161. package/vona/packages-vona/vona/package.json +1 -1
  162. package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/package.json +1 -1
  163. package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/src/bean/summerCache.datasourceWrite.ts +2 -2
  164. package/vona/src/suite-vendor/a-cabloy/package.json +1 -1
  165. package/vona/src/suite-vendor/a-captcha/modules/a-captcha/package.json +1 -1
  166. package/vona/src/suite-vendor/a-captcha/modules/a-captcha/src/bean/cacheRedis.captcha.ts +2 -2
  167. package/vona/src/suite-vendor/a-captcha/package.json +1 -1
  168. package/vona/src/suite-vendor/a-vona/modules/a-bean/cli/bean/metadata/generate.ts +5 -6
  169. package/vona/src/suite-vendor/a-vona/modules/a-bean/package.json +1 -1
  170. package/vona/src/suite-vendor/a-vona/modules/a-cache/cli/cacheMem/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
  171. package/vona/src/suite-vendor/a-vona/modules/a-cache/cli/cacheRedis/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
  172. package/vona/src/suite-vendor/a-vona/modules/a-cache/package.json +1 -1
  173. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/.metadata/index.ts +13 -2
  174. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/bean/bean.cache.ts +6 -7
  175. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/{bean/bean.cacheMemBase.ts → service/cacheMemBase_.ts} +3 -3
  176. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/{bean/bean.cacheRedisBase.ts → service/cacheRedisBase_.ts} +3 -3
  177. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/package.json +1 -1
  178. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/cacheRedis.emailConfirm.ts +2 -2
  179. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/cacheRedis.passwordReset.ts +2 -2
  180. package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
  181. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/bean/summerCache.json.ts +2 -2
  182. package/vona/src/suite-vendor/a-vona/modules/a-orm/cli/databaseDialect/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
  183. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  184. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/.metadata/index.ts +4 -3
  185. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/bean/bean.database.ts +3 -3
  186. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/bean/bean.model.ts +1 -1
  187. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/bean/schedule.softDeletionPrune.ts +1 -1
  188. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/common/utils.ts +1 -1
  189. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/index.ts +1 -1
  190. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_cache.ts +1 -1
  191. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_meta.ts +1 -1
  192. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.modelBase.ts +0 -5
  193. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoAggregate.ts +1 -1
  194. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoCreate.ts +1 -1
  195. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoGet.ts +1 -1
  196. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoGroup.ts +1 -1
  197. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoMutate.ts +1 -1
  198. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoSelectAndCount.ts +1 -1
  199. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoUpdate.ts +1 -1
  200. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/index.ts +1 -0
  201. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/modelCacheBase.ts +3 -3
  202. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relations.ts +1 -1
  203. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relationsDynamic.ts +1 -1
  204. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relationsMutate.ts +1 -1
  205. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relationsStatic.ts +1 -1
  206. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/cacheEntity_.ts +1 -1
  207. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/cacheQuery_.ts +1 -1
  208. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/database.ts +2 -2
  209. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean/bean.databaseDialectBase.ts → service/databaseDialectBase_.ts} +38 -41
  210. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/db_.ts +2 -2
  211. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/relations_.ts +3 -3
  212. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/database.ts +0 -5
  213. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/dto/dtoGet.ts +1 -1
  214. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/dto/dtoMutate.ts +1 -1
  215. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/dto/dtoSelectAndCount.ts +1 -1
  216. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/model.ts +1 -1
  217. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelAggr.ts +1 -1
  218. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelCount.ts +1 -1
  219. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelGeneral.ts +1 -1
  220. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelGroup.ts +1 -1
  221. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelIncrement.ts +1 -1
  222. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relations.ts +1 -1
  223. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsColumns.ts +1 -1
  224. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsDef.ts +1 -1
  225. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsDefDynamic.ts +1 -1
  226. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsDefMutate.ts +1 -1
  227. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsMutate.ts +1 -1
  228. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsTables.ts +1 -1
  229. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/package.json +1 -1
  230. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.betterSqlite3.ts +2 -2
  231. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.mysql.ts +2 -2
  232. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.pg.ts +2 -2
  233. package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
  234. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/bean.permission.ts +109 -40
  235. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/summerCache.permission.ts +2 -2
  236. package/vona/src/suite-vendor/a-vona/modules/a-startup/package.json +1 -1
  237. package/vona/src/suite-vendor/a-vona/modules/a-startup/src/bean/cacheRedis.startupDebounce.ts +2 -2
  238. package/vona/src/suite-vendor/a-vona/modules/a-summer/cli/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
  239. package/vona/src/suite-vendor/a-vona/modules/a-summer/package.json +1 -1
  240. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/.metadata/index.ts +1 -1
  241. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/bean/bean.summer.ts +3 -3
  242. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/service/localMem_.ts +3 -3
  243. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/service/localRedis_.ts +3 -3
  244. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/{bean/bean.summerCacheBase.ts → service/summerCacheBase_.ts} +3 -3
  245. package/vona/src/suite-vendor/a-vona/modules/a-swagger/package.json +1 -1
  246. package/vona/src/suite-vendor/a-vona/modules/a-swagger/src/bean/summerCache.rapidoc.ts +2 -2
  247. package/vona/src/suite-vendor/a-vona/modules/a-swagger/src/bean/summerCache.swagger.ts +2 -2
  248. package/vona/src/suite-vendor/a-vona/modules/a-user/package.json +1 -1
  249. package/vona/src/suite-vendor/a-vona/modules/a-user/src/bean/cacheRedis.authToken.ts +2 -2
  250. package/vona/src/suite-vendor/a-vona/modules/a-worker/package.json +1 -1
  251. package/vona/src/suite-vendor/a-vona/modules/a-worker/src/bean/cacheRedis.workerAlive.ts +2 -2
  252. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  253. package/zova/README.md +4 -4
  254. package/zova/README.zh-CN.md +4 -4
  255. package/zova/packages-zova/zova/package.json +2 -2
  256. package/zova/src/suite/a-demo/modules/demo-basic/src/page/toolTwo/controller.tsx +0 -2
  257. package/zova/src/suite/a-home/modules/home-base/src/config/locale/en-us.ts +1 -0
  258. package/zova/src/suite/a-home/modules/home-base/src/config/locale/zh-cn.ts +1 -0
  259. package/zova/src/suite/a-home/modules/home-base/src/page/errorNotFound/controller.tsx +8 -2
  260. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/controller.tsx +1 -1
  261. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.header.tsx +1 -1
  262. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.locale.tsx +2 -5
  263. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.tabs.tsx +1 -4
  264. package/zova/src/suite-vendor/a-zova/modules/a-router/package.json +1 -1
  265. package/zova/src/suite-vendor/a-zova/modules/a-router/src/bean/sys.router.ts +28 -6
  266. package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkeySys.ts +15 -3
  267. package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/router.ts +1 -0
  268. package/zova/src/suite-vendor/a-zova/modules/a-routertabs/package.json +1 -1
  269. package/zova/src/suite-vendor/a-zova/modules/a-routertabs/src/model/tabs.ts +4 -0
  270. package/zova/src/suite-vendor/a-zova/package.json +3 -3
  271. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_crud.ts +0 -0
  272. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_crud_inner.ts +0 -0
  273. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_crud_table.ts +0 -0
  274. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_knex.ts +0 -0
  275. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_utils.ts +0 -0
  276. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_view.ts +0 -0
@@ -0,0 +1,110 @@
1
+ # Component v-model Guide
2
+
3
+ This guide explains how component `v-model` works in Zova within the Cabloy monorepo.
4
+
5
+ ## Why Zova `v-model` matters
6
+
7
+ Zova makes it convenient to add two-way binding behavior to a component while keeping the binding logic visible inside the controller model.
8
+
9
+ That is important because the framework treats model binding as part of the controller-oriented component architecture, not just as template sugar.
10
+
11
+ ## Add the basic `modelValue` skeleton
12
+
13
+ Example: add `modelValue` to component `card`.
14
+
15
+ ```bash
16
+ npm run zova :refactor:componentModel card modelValue -- --module=demo-student
17
+ ```
18
+
19
+ ## Representative generated shape
20
+
21
+ ```typescript
22
+ export interface ControllerCardModels {
23
+ vModel?: number;
24
+ }
25
+
26
+ @Controller()
27
+ export class ControllerCard extends BeanControllerBase {
28
+ static $propsDefault = {
29
+ modelValue: 0,
30
+ };
31
+
32
+ modelValue: number;
33
+
34
+ protected async __init__() {
35
+ this.modelValue = this.$useModel('modelValue');
36
+ }
37
+ }
38
+ ```
39
+
40
+ ## Use `v-model` inside the component
41
+
42
+ Representative pattern:
43
+
44
+ ```typescript
45
+ class ControllerCard {
46
+ render() {
47
+ return (
48
+ <div>
49
+ <div>{this.modelValue}</div>
50
+ <button
51
+ onClick={() => {
52
+ this.modelValue++;
53
+ }}
54
+ >
55
+ Change
56
+ </button>
57
+ </div>
58
+ );
59
+ }
60
+ }
61
+ ```
62
+
63
+ The key idea is that changing `this.modelValue` updates the bound parent-side value through the framework binding model.
64
+
65
+ ## Pass `v-model` from the parent
66
+
67
+ Representative pattern:
68
+
69
+ ```typescript
70
+ class ControllerOther {
71
+ count: number;
72
+
73
+ render() {
74
+ return <ZCard vModel={this.count} />;
75
+ }
76
+ }
77
+ ```
78
+
79
+ ## Named `v-model` parameters
80
+
81
+ `modelValue` is only the default binding name. Other binding names can be added, for example `title`.
82
+
83
+ Representative generation command:
84
+
85
+ ```bash
86
+ npm run zova :refactor:componentModel card title -- --module=demo-student
87
+ ```
88
+
89
+ Representative usage pattern:
90
+
91
+ ```typescript
92
+ <ZCard vModel:title={this.title} />
93
+ ```
94
+
95
+ ## Modifiers
96
+
97
+ Zova also supports modifiers through the same broader binding model.
98
+
99
+ One representative example uses a custom `capitalize` modifier, implemented by passing a setter transformation into `$useModel`.
100
+
101
+ That is useful because it shows `v-model` behavior in Zova is programmable and explicit, not just a fixed syntax feature.
102
+
103
+ ## Implementation checks for component binding changes
104
+
105
+ When adding two-way binding to a Zova component:
106
+
107
+ 1. use the Zova refactor command to create the skeleton
108
+ 2. keep the binding visible through `Controller*Models` and `$useModel`
109
+ 3. choose between default and named model parameters deliberately
110
+ 4. use modifiers through the framework pattern instead of inventing parallel custom binding logic
@@ -0,0 +1,151 @@
1
+ # CSS-in-JS Guide
2
+
3
+ This guide explains the role of CSS-in-JS in Zova within the Cabloy monorepo.
4
+
5
+ ## Why CSS-in-JS matters in Zova
6
+
7
+ Zova uses a built-in CSS-in-JS approach so styling can stay close to component and page logic without collapsing into uncontrolled global CSS.
8
+
9
+ This is often explained through TypeStyle, but the main point is not novelty. The goal is a styling system that stays flexible, scoped, and framework-friendly in larger applications.
10
+
11
+ ## Core benefits
12
+
13
+ Several enduring benefits stand out:
14
+
15
+ - scoped styles that reduce conflicts
16
+ - dynamic style generation from reactive state
17
+ - token support independent of UI libraries
18
+ - theme support independent of UI libraries
19
+ - easier debugging through development-friendly class naming
20
+ - built-in template support for multiple UI-library strategies
21
+
22
+ ## Choose the right styling mechanism
23
+
24
+ A practical decision map is:
25
+
26
+ | Use this | When it fits best |
27
+ | ----------------------------------------- | --------------------------------------------------------------------------------------- |
28
+ | `this.$style(...)` | local scoped styles near one controller, render bean, or style bean |
29
+ | dedicated style bean with `BeanStyleBase` | the page or component has enough styling logic to deserve its own file or boundary |
30
+ | `@Css()` and `$cssBase` | shared/global style vocabulary should be reused across many pages or components |
31
+ | `$token` | style values should come from theme-defined design values instead of hardcoded literals |
32
+ | `$theme` | runtime behavior needs to read or switch the active theme or dark-mode state |
33
+
34
+ The important point is that these are not competing styling systems. They are connected surfaces inside one Zova styling architecture.
35
+
36
+ ## Local scoped styles with `this.$style(...)`
37
+
38
+ `this.$style(...)` is the normal entrypoint for local scoped class generation.
39
+
40
+ Use it when the style belongs to one page, component, or style bean and should stay close to the current controller-oriented logic.
41
+
42
+ This is a good default for:
43
+
44
+ - one-off local classes
45
+ - styles driven by local runtime state
46
+ - styles that should remain scoped instead of becoming app-wide vocabulary
47
+
48
+ ## Dedicated style beans with `BeanStyleBase`
49
+
50
+ When styling grows beyond a small local block, split it into a dedicated style bean instead of forcing everything to remain inline.
51
+
52
+ A practical rule is:
53
+
54
+ - use local `this.$style(...)` first when the styling is still small
55
+ - move into a dedicated style bean when the page or component needs a clearer styling boundary
56
+
57
+ This is an organizational split, not a different styling engine. Zova still uses the same CSS-in-JS model; it simply gives larger pages and components a better place to hold their style concerns.
58
+
59
+ ## Shared/global styles with `@Css()` and `$cssBase`
60
+
61
+ Not every style should stay local.
62
+
63
+ Use shared/global styles when the application needs reusable style vocabulary that should be available across multiple pages or components.
64
+
65
+ A practical distinction is:
66
+
67
+ - use local scoped classes when the style belongs to one page or component
68
+ - use `@Css()` and `$cssBase` when the style should be shared as part of broader app-level styling vocabulary
69
+
70
+ That is the practical global-style story in Zova: shared styles still live inside the framework model instead of falling back to uncontrolled ad hoc global CSS.
71
+
72
+ ## How styles consume tokens
73
+
74
+ When a value represents design meaning rather than a one-off literal, prefer `$token` over hardcoded values.
75
+
76
+ That is especially useful for:
77
+
78
+ - colors
79
+ n- spacing or sizing conventions owned by the theme
80
+ - component-surface values that should change with dark mode or brand theme
81
+
82
+ This keeps style logic flexible across themes and editions without changing the underlying styling architecture.
83
+
84
+ ## Style -> token -> theme flow
85
+
86
+ A useful mental model is:
87
+
88
+ 1. `this.$style(...)` generates scoped classes
89
+ 2. those classes can consume `this.$token`
90
+ 3. token values come from the active theme
91
+ 4. theme beans provide the concrete token values
92
+ 5. runtime theme switching changes the active token set
93
+
94
+ That means CSS-in-JS, tokens, and themes are not separate ideas. They are one connected frontend styling flow.
95
+
96
+ For the token and theme lifecycle itself, also see [Theme Guide](/frontend/theme-guide).
97
+
98
+ ## Debugging generated class names
99
+
100
+ CSS-in-JS class names are framework-generated for scoping, but they still remain debuggable during development.
101
+
102
+ A practical rule is:
103
+
104
+ - treat generated class names as framework output rather than as a hand-authored public CSS API
105
+ - use the development-friendly naming help to trace where a style came from when debugging
106
+
107
+ ## Why UI-library independence matters
108
+
109
+ This is especially important in Cabloy because the two editions diverge in frontend stack choices:
110
+
111
+ - **Cabloy Basic** aligns with DaisyUI + TailwindCSS oriented examples
112
+ - **Cabloy Start** aligns with Vuetify-oriented modules
113
+
114
+ A UI-library-independent styling layer makes it easier for the same architectural ideas to survive across both editions.
115
+
116
+ ## Styling in the controller-oriented model
117
+
118
+ In Zova, styling is not an unrelated afterthought. It fits into the same controller-oriented architecture as state and render logic.
119
+
120
+ That is why examples often use style generation directly from a controller or style-oriented bean rather than splitting everything into a separate CSS asset by default.
121
+
122
+ ## What stays shared across editions
123
+
124
+ Across Cabloy Basic and Cabloy Start, the styling architecture itself stays shared:
125
+
126
+ - CSS-in-JS remains the primary styling model
127
+ - local scoped styles still use `$style`
128
+ - larger styling concerns can still move into dedicated style beans
129
+ - shared/global styling can still use `@Css()` and `$cssBase`
130
+ - token and theme behavior still form the same architecture
131
+ - runtime theme switching still belongs to the same `$theme` model
132
+
133
+ What may still vary by edition or UI library is:
134
+
135
+ - token shape details
136
+ - concrete token values
137
+ - theme-handler integration details
138
+ - surrounding utility-class or component-library conventions
139
+
140
+ That means edition differences usually change the surrounding UI stack, not the core styling architecture.
141
+
142
+ ## Implementation checks for frontend styling changes
143
+
144
+ When changing frontend styling in Zova, ask:
145
+
146
+ 1. should this use the built-in CSS-in-JS path instead of ad hoc external CSS?
147
+ 2. does the style depend on reactive or runtime state?
148
+ 3. does the active edition affect only the UI library, while the styling architecture remains shared?
149
+ 4. should token or theme mechanisms be used instead of hardcoded values?
150
+
151
+ That keeps style work aligned with Zova’s actual design.
@@ -0,0 +1,55 @@
1
+ # Frontend Design Principles
2
+
3
+ This guide explains the core design principles behind Zova in the Cabloy monorepo.
4
+
5
+ ## Intuitive reactivity
6
+
7
+ Zova keeps Vue3’s reactive strengths, but aims for a code style that feels closer to native variable usage than traditional `ref/reactive`-heavy code.
8
+
9
+ The practical design goal is not just shorter syntax. It is to keep business code understandable even as the system grows.
10
+
11
+ ## Unified model-based state
12
+
13
+ A major Zova idea is that multiple state categories can be handled through one model-centered mental model instead of unrelated mechanisms.
14
+
15
+ Four common categories help explain this model:
16
+
17
+ - asynchronous server-side data
18
+ - local storage data
19
+ - cookie data
20
+ - in-memory data
21
+
22
+ In Zova, these are intentionally brought under a more unified `Model` abstraction so SSR support, usage patterns, and maintenance expectations stay more consistent.
23
+
24
+ ## IOC as the sharing model
25
+
26
+ State and behavior sharing across several scopes can be expressed through IOC rather than a pile of unrelated patterns.
27
+
28
+ Representative scopes include:
29
+
30
+ - component-internal sharing
31
+ - between-components sharing
32
+ - app-global sharing
33
+ - system-level sharing
34
+
35
+ This is one of the clearest reasons Zova code can look different from conventional Vue code while staying structured for large systems.
36
+
37
+ ## IOC + AOP for extensibility
38
+
39
+ Zova does not treat IOC as only a dependency injection mechanism. It also layers AOP-oriented extensibility on top of IOC so the system can grow without forcing every concern into the same class body.
40
+
41
+ That is especially valuable for:
42
+
43
+ - logging
44
+ - cross-cutting behavior
45
+ - internal and external extension points
46
+ - large-scale maintainability
47
+
48
+ ## Practical implications for implementation
49
+
50
+ These design principles should influence how code is extended in Zova. For the deeper structural model behind these principles, see [IoC and Beans](/frontend/ioc-and-beans), [Modules and Suites](/frontend/modules-and-suites), and [Module Scope](/frontend/module-scope).
51
+
52
+ - do not rewrite Zova code toward generic Vue habits automatically
53
+ - do not assume `ref.value`-style patterns are the desired end state
54
+ - prefer existing model, IOC, and AOP conventions when extending code
55
+ - verify whether an existing Zova abstraction already solves the problem before introducing a framework-neutral pattern
@@ -0,0 +1,250 @@
1
+ # Environment and Config Guide
2
+
3
+ ## Why this guide matters
4
+
5
+ Zova uses a multi-dimensional environment and configuration model so frontend behavior can vary cleanly across runtime scenarios without scattering ad hoc conditionals through the codebase.
6
+
7
+ That matters because SSR, SPA, edition-specific flavors, and deployment-specific variants all need a shared way to select the right settings.
8
+
9
+ ## The three core dimensions
10
+
11
+ Zova’s frontend runtime model is built around three dimensions:
12
+
13
+ - **mode**
14
+ - **appMode**
15
+ - **flavor**
16
+
17
+ Together they determine which env variables, config files, and script paths should be active.
18
+
19
+ ## Runtime mode
20
+
21
+ Runtime mode describes whether the app is running in:
22
+
23
+ - `development`
24
+ - `production`
25
+
26
+ This affects script behavior, environment loading, and tree-shakeable flags such as `DEV` and `PROD`.
27
+
28
+ ## App mode
29
+
30
+ App mode describes the application delivery model, such as:
31
+
32
+ - `ssr`
33
+ - `spa`
34
+
35
+ This matters because SSR and SPA have different runtime assumptions, build paths, and environment-sensitive code behavior.
36
+
37
+ ## Flavor
38
+
39
+ Flavor adds a third dimension so the frontend can support different product or UI variants without flattening everything into only one mode axis.
40
+
41
+ Representative built-in flavors include:
42
+
43
+ - `admin`
44
+ - `web`
45
+ - `cabloyBasicAdmin`
46
+ - `cabloyStartAdmin`
47
+ - `cabloyStartWeb`
48
+
49
+ Flavor is especially important in Cabloy because Basic and Start do not always share the same frontend stack or output assumptions.
50
+
51
+ ## Env-file loading model
52
+
53
+ Zova loads env files from `env/` using the multi-dimensional model.
54
+
55
+ Representative patterns include:
56
+
57
+ - `.env`
58
+ - `.env.[meta]`
59
+ - `.env.local`
60
+ - `.env.[meta].local`
61
+
62
+ This means env loading is layered and conditional rather than single-file only.
63
+
64
+ ## Config-file loading model
65
+
66
+ Zova also loads frontend config files from `src/front/config/config/` using the same multi-dimensional logic.
67
+
68
+ Representative patterns include:
69
+
70
+ - `config.ts`
71
+ - `config.[meta].ts`
72
+ - `config.local.ts`
73
+ - `config.[meta].local.ts`
74
+
75
+ That keeps env variables and frontend config aligned around the same runtime-selection model.
76
+
77
+ ## Resolution principle
78
+
79
+ The practical rule is:
80
+
81
+ - base files always load
82
+ - meta-specific files load when their dimensions match
83
+ - `.local` files override while remaining git-ignored
84
+
85
+ This lets projects combine shared defaults with scenario-specific and local overrides cleanly.
86
+
87
+ A representative SSR admin development stack looks like:
88
+
89
+ ```txt
90
+ .env
91
+ .env.ssr
92
+ .env.ssr.admin
93
+ .env.ssr.admin.development
94
+ .env.local
95
+ .env.ssr.local
96
+ .env.ssr.admin.local
97
+ .env.ssr.admin.development.local
98
+ ```
99
+
100
+ The config side follows the same merge pattern with `config.ts`, `config.[meta].ts`, and `.local` variants.
101
+
102
+ ## Scripts and runtime variants
103
+
104
+ Frontend scripts map directly onto the same runtime dimensions.
105
+
106
+ Representative commands include variants such as:
107
+
108
+ - `dev:ssr:admin`
109
+ - `build:ssr:admin`
110
+ - `preview:ssr:admin`
111
+ - `dev:ssr:web`
112
+ - `build:ssr:web`
113
+ - `dev:spa`
114
+ - `dev:ssr:cabloyBasicAdmin`
115
+ - `build:ssr:cabloyBasicWeb`
116
+
117
+ Representative current-repo script shapes include:
118
+
119
+ ```json
120
+ {
121
+ "dev": "npm run dev:ssr:admin",
122
+ "build": "npm run build:ssr:admin",
123
+ "preview": "npm run preview:ssr:admin",
124
+ "dev:ssr:admin": "npm run prerun && quasar dev --mode ssr --flavor admin",
125
+ "dev:ssr:web": "npm run prerun && quasar dev --mode ssr --flavor web",
126
+ "dev:spa": "npm run prerun && quasar dev --mode spa --flavor admin"
127
+ }
128
+ ```
129
+
130
+ That means scripts are not just convenience aliases. They are the operational surface for selecting mode, appMode, and flavor.
131
+
132
+ For current monorepo usage, also see [Frontend Scripts](/frontend/scripts).
133
+
134
+ ## Tree-shakeable env flags
135
+
136
+ Some environment variables are especially important because they support tree-shaking or compile-time branching.
137
+
138
+ Representative flags include:
139
+
140
+ - `META_MODE`
141
+ - `META_APP_MODE`
142
+ - `META_FLAVOR`
143
+ - `NODE_ENV`
144
+ - `DEV`
145
+ - `PROD`
146
+ - `SSR`
147
+ - `CLIENT`
148
+ - `SERVER`
149
+
150
+ This is one of the most important reasons environment access should be done deliberately rather than by inventing custom runtime checks everywhere.
151
+
152
+ ## `process.env` vs `sys.env` vs `sys.config`
153
+
154
+ Use the right access path for the right kind of value:
155
+
156
+ - `process.env` for tree-shakeable env-based conditions
157
+ - `sys.env` for runtime env values that are not tree-shaken
158
+ - `sys.config` for the merged frontend config model
159
+
160
+ Representative patterns:
161
+
162
+ ```typescript
163
+ if (process.env.DEV) {
164
+ console.log('for development');
165
+ }
166
+
167
+ const publicPath = this.sys.env.APP_PUBLIC_PATH;
168
+ const apiBaseURL = this.sys.config.api.baseURL;
169
+ const flavor = this.sys.config.meta.flavor;
170
+ ```
171
+
172
+ This distinction is central to writing Zova code that behaves correctly across builds and runtime variants.
173
+
174
+ ## Built-in env variables
175
+
176
+ Zova exposes built-in variables covering areas such as:
177
+
178
+ - app identity
179
+ - router mode
180
+ - dev-server settings
181
+ - project-disabled suites/modules
182
+ - build output settings
183
+ - API/proxy configuration
184
+ - SSR-specific values
185
+ - mock configuration
186
+
187
+ That means many common project-level knobs already exist and should be reused before inventing project-specific patterns.
188
+
189
+ ## Custom flavors
190
+
191
+ Projects can define custom flavors when built-in variants are not enough.
192
+
193
+ This usually requires:
194
+
195
+ - adding scripts that pass the new `--flavor` value
196
+ - using `META_FLAVOR` or `sys.config.meta.flavor` in code
197
+ - optionally augmenting type definitions for better autocomplete
198
+
199
+ Representative flavor type extension:
200
+
201
+ ```typescript
202
+ declare module '@cabloy/module-info' {
203
+ export interface ZovaMetaFlavorExtend {
204
+ customA: never;
205
+ }
206
+ }
207
+ ```
208
+
209
+ In the VSCode workflow, the `recordflavor` snippet can generate this augmentation skeleton.
210
+
211
+ ## Async config loading
212
+
213
+ Frontend config files can also load asynchronously when configuration must be derived from a remote or generated source.
214
+
215
+ Representative pattern:
216
+
217
+ ```typescript
218
+ export default async function (_sys: ZovaSys) {
219
+ const config: ZovaConfigOptional = {};
220
+
221
+ // async load remote config
222
+
223
+ return config;
224
+ }
225
+ ```
226
+
227
+ That should be used deliberately, because asynchronous config still participates in the same startup and merge model.
228
+
229
+ ## Relationship to other frontend guides
230
+
231
+ Read this guide together with:
232
+
233
+ - [Frontend Scripts](/frontend/scripts)
234
+ - [SSR Environment Variables](/frontend/ssr-env)
235
+ - [Frontend Quickstart](/frontend/quickstart)
236
+ - [App Startup Guide](/frontend/app-startup-guide)
237
+ - [System Startup Guide](/frontend/system-startup-guide)
238
+
239
+ These guides explain the operational script surface, SSR-specific environment concerns, and the monorepo-first starting path.
240
+
241
+ ## Implementation checks for runtime-sensitive changes
242
+
243
+ When changing frontend runtime-sensitive code, ask:
244
+
245
+ 1. does this behavior depend on mode, appMode, flavor, or more than one of them?
246
+ 2. should this logic read from `process.env`, `sys.env`, or `sys.config`?
247
+ 3. is there already a built-in env/config variable for this concern?
248
+ 4. does the active edition change which flavor or script family is correct?
249
+
250
+ That helps AI keep frontend runtime behavior aligned with Zova’s actual configuration model.
@@ -0,0 +1,57 @@
1
+ # Frontend Foundation
2
+
3
+ This guide explains the core architectural role of Zova in the Cabloy monorepo.
4
+
5
+ ## What Zova is in Cabloy
6
+
7
+ Zova is the frontend half of the Cabloy fullstack architecture.
8
+
9
+ It is an intuitive frontend framework that combines strengths associated with Vue3 reactivity, React-style TSX rendering, and Angular-style IOC.
10
+
11
+ ## Why that matters in practice
12
+
13
+ The point of this combination is not branding. The point is to make large business systems feel more natural to write and maintain.
14
+
15
+ Three enduring ideas define this design:
16
+
17
+ - intuitive reactive code
18
+ - elegant structure for complex systems
19
+ - strong extensibility through IOC and AOP patterns
20
+
21
+ ## UI-library flexibility
22
+
23
+ One point still matters throughout the monorepo docs:
24
+
25
+ Zova is not tied to one UI library.
26
+
27
+ That flexibility matters directly for Cabloy’s edition model:
28
+
29
+ - **Cabloy Basic** currently aligns with DaisyUI + TailwindCSS oriented examples
30
+ - **Cabloy Start** aligns with Vuetify-oriented frontend modules and workflows
31
+
32
+ So docs and skills must separate shared Zova principles from edition-specific UI assumptions.
33
+
34
+ ## Enduring frontend capabilities
35
+
36
+ The highest-value Zova capabilities to preserve in the unified docs are:
37
+
38
+ - SSR support across `SSR`, `SPA`, `Web`, and `Admin` flows
39
+ - dual-layer tabs navigation
40
+ - CRUD-oriented rendering patterns
41
+ - model-based unified state management
42
+ - CSS-in-JS and theme support
43
+ - IOC + AOP extensibility
44
+ - compatibility with multiple UI-library strategies
45
+
46
+ For the deeper architectural concepts behind IoC, module boundaries, and scope-based resources, see [IoC and Beans](/frontend/ioc-and-beans), [Modules and Suites](/frontend/modules-and-suites), and [Module Scope](/frontend/module-scope). For the runtime-variant and startup model, see [Environment and Config Guide](/frontend/environment-config-guide), [App Startup Guide](/frontend/app-startup-guide), and [System Startup Guide](/frontend/system-startup-guide).
47
+
48
+ ## Why this matters for AI development
49
+
50
+ AI systems should not treat Zova as generic Vue with a few utilities.
51
+
52
+ Instead, they should:
53
+
54
+ - preserve Zova’s model, IOC, and AOP conventions
55
+ - detect the active edition before assuming a UI-library workflow
56
+ - prefer the Zova CLI for scaffolding and refactor work
57
+ - verify that the generated or edited code still matches Zova’s actual architecture
@@ -0,0 +1,35 @@
1
+ # Generic Component Guide
2
+
3
+ This guide explains how generic components work in Zova within the Cabloy monorepo.
4
+
5
+ ## Why generic components matter
6
+
7
+ Zova supports generic components so strongly typed reusable components can preserve richer type information across usage sites.
8
+
9
+ This matters in large TypeScript-heavy systems because generic components help keep abstraction reusable without giving up strong typing.
10
+
11
+ ## Convert a component to a generic component
12
+
13
+ Example: convert component `card` into a generic component.
14
+
15
+ ```bash
16
+ npm run zova :refactor:componentGeneric card -- --module=demo-student
17
+ ```
18
+
19
+ ## Why the CLI matters here
20
+
21
+ This topic is intentionally short, but the implication is important: generic-component conversion is not treated as an ad hoc manual rewrite. It is part of the framework’s supported refactor surface.
22
+
23
+ That means the safest default is to let the Zova refactor command establish the skeleton first, then refine the typing and behavior.
24
+
25
+ ## Implementation checks for reusable component design
26
+
27
+ When you see a component that is reused across multiple typed data shapes, ask whether the right answer is a generic component instead of copying the component into several near-duplicate variants.
28
+
29
+ A better default is:
30
+
31
+ 1. inspect whether the component really needs generic typing
32
+ 2. use the Zova generic-component refactor command
33
+ 3. refine the resulting type surface instead of inventing a framework-foreign pattern
34
+
35
+ That keeps generic typing aligned with Zova’s supported refactor workflow.