cabloy 5.1.50 → 5.1.52

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 (300) 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 +292 -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 +30 -0
  17. package/.github/workflows/docs-pages.yml +56 -0
  18. package/.gitignore +1 -0
  19. package/CHANGELOG.md +54 -0
  20. package/CLAUDE.md +59 -0
  21. package/README.md +152 -0
  22. package/cabloy-docs/.vitepress/config.mjs +255 -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 +139 -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 +168 -0
  31. package/cabloy-docs/ai/edition-consistency-checklist.md +150 -0
  32. package/cabloy-docs/ai/edition-detection.md +30 -0
  33. package/cabloy-docs/ai/future-skill-roadmap.md +135 -0
  34. package/cabloy-docs/ai/global-bean-lookup.md +158 -0
  35. package/cabloy-docs/ai/introduction.md +62 -0
  36. package/cabloy-docs/ai/playbook-backend-module.md +111 -0
  37. package/cabloy-docs/ai/playbook-contract-regeneration.md +100 -0
  38. package/cabloy-docs/ai/playbook-frontend-page.md +99 -0
  39. package/cabloy-docs/ai/playbook-metadata-refresh.md +67 -0
  40. package/cabloy-docs/ai/repo-guidance.md +58 -0
  41. package/cabloy-docs/ai/rules-and-config.md +29 -0
  42. package/cabloy-docs/ai/skills.md +37 -0
  43. package/cabloy-docs/ai/verification.md +31 -0
  44. package/cabloy-docs/ai/virtual-decorator-guidance.md +206 -0
  45. package/cabloy-docs/backend/aop-overview.md +128 -0
  46. package/cabloy-docs/backend/auth-guide.md +151 -0
  47. package/cabloy-docs/backend/backend-essentials.md +128 -0
  48. package/cabloy-docs/backend/broadcast-guide.md +138 -0
  49. package/cabloy-docs/backend/cache-guide.md +70 -0
  50. package/cabloy-docs/backend/captcha-guide.md +162 -0
  51. package/cabloy-docs/backend/cli.md +173 -0
  52. package/cabloy-docs/backend/config-guide.md +249 -0
  53. package/cabloy-docs/backend/controller-aop-guide.md +270 -0
  54. package/cabloy-docs/backend/controller-guide.md +347 -0
  55. package/cabloy-docs/backend/crud-workflow.md +118 -0
  56. package/cabloy-docs/backend/dto-guide.md +161 -0
  57. package/cabloy-docs/backend/dto-infer-generation.md +153 -0
  58. package/cabloy-docs/backend/dynamic-datasource-guide.md +70 -0
  59. package/cabloy-docs/backend/election-guide.md +141 -0
  60. package/cabloy-docs/backend/entity-guide.md +150 -0
  61. package/cabloy-docs/backend/error-guide.md +108 -0
  62. package/cabloy-docs/backend/event-guide.md +183 -0
  63. package/cabloy-docs/backend/external-aop-guide.md +149 -0
  64. package/cabloy-docs/backend/field-indexes.md +79 -0
  65. package/cabloy-docs/backend/foundation.md +281 -0
  66. package/cabloy-docs/backend/i18n-guide.md +211 -0
  67. package/cabloy-docs/backend/internal-aop-guide.md +181 -0
  68. package/cabloy-docs/backend/introduction.md +95 -0
  69. package/cabloy-docs/backend/jwt-guide.md +276 -0
  70. package/cabloy-docs/backend/logger-guide.md +223 -0
  71. package/cabloy-docs/backend/mail-guide.md +189 -0
  72. package/cabloy-docs/backend/menu-guide.md +80 -0
  73. package/cabloy-docs/backend/migration-and-changes.md +192 -0
  74. package/cabloy-docs/backend/model-guide.md +274 -0
  75. package/cabloy-docs/backend/multi-database-datasource.md +171 -0
  76. package/cabloy-docs/backend/multi-instance-and-instance-resolution.md +196 -0
  77. package/cabloy-docs/backend/openapi-guide.md +118 -0
  78. package/cabloy-docs/backend/orm-aggregate-group-guide.md +210 -0
  79. package/cabloy-docs/backend/orm-configuration-guide.md +165 -0
  80. package/cabloy-docs/backend/orm-guide.md +109 -0
  81. package/cabloy-docs/backend/orm-mutation-guide.md +195 -0
  82. package/cabloy-docs/backend/orm-select-guide.md +243 -0
  83. package/cabloy-docs/backend/queue-guide.md +271 -0
  84. package/cabloy-docs/backend/quickstart.md +141 -0
  85. package/cabloy-docs/backend/redis-guide.md +70 -0
  86. package/cabloy-docs/backend/redlock-guide.md +60 -0
  87. package/cabloy-docs/backend/relations-guide.md +250 -0
  88. package/cabloy-docs/backend/runtime-and-flavors.md +304 -0
  89. package/cabloy-docs/backend/schedule-guide.md +81 -0
  90. package/cabloy-docs/backend/scripts.md +116 -0
  91. package/cabloy-docs/backend/serialization-guide.md +192 -0
  92. package/cabloy-docs/backend/service-guide.md +166 -0
  93. package/cabloy-docs/backend/sharding-guide.md +49 -0
  94. package/cabloy-docs/backend/startup-guide.md +326 -0
  95. package/cabloy-docs/backend/transaction-guide.md +82 -0
  96. package/cabloy-docs/backend/unit-testing.md +209 -0
  97. package/cabloy-docs/backend/upload-guide.md +160 -0
  98. package/cabloy-docs/backend/user-access-guide.md +157 -0
  99. package/cabloy-docs/backend/validation-guide.md +80 -0
  100. package/cabloy-docs/backend/worker-guide.md +59 -0
  101. package/cabloy-docs/editions/cabloy-basic.md +26 -0
  102. package/cabloy-docs/editions/cabloy-start.md +55 -0
  103. package/cabloy-docs/editions/choosing-between-basic-and-start.md +84 -0
  104. package/cabloy-docs/editions/detection.md +31 -0
  105. package/cabloy-docs/editions/overview.md +107 -0
  106. package/cabloy-docs/frontend/api-guide.md +93 -0
  107. package/cabloy-docs/frontend/api-schema-guide.md +43 -0
  108. package/cabloy-docs/frontend/app-startup-guide.md +185 -0
  109. package/cabloy-docs/frontend/cli.md +78 -0
  110. package/cabloy-docs/frontend/component-guide.md +105 -0
  111. package/cabloy-docs/frontend/component-props-guide.md +97 -0
  112. package/cabloy-docs/frontend/component-v-model-guide.md +110 -0
  113. package/cabloy-docs/frontend/css-in-js-guide.md +151 -0
  114. package/cabloy-docs/frontend/design-principles.md +55 -0
  115. package/cabloy-docs/frontend/environment-config-guide.md +250 -0
  116. package/cabloy-docs/frontend/foundation.md +58 -0
  117. package/cabloy-docs/frontend/generic-component-guide.md +35 -0
  118. package/cabloy-docs/frontend/icon-engine-guide.md +88 -0
  119. package/cabloy-docs/frontend/introduction.md +33 -0
  120. package/cabloy-docs/frontend/ioc-and-beans.md +211 -0
  121. package/cabloy-docs/frontend/mock-guide.md +109 -0
  122. package/cabloy-docs/frontend/model-architecture.md +87 -0
  123. package/cabloy-docs/frontend/model-state-guide.md +70 -0
  124. package/cabloy-docs/frontend/module-scope.md +168 -0
  125. package/cabloy-docs/frontend/modules-and-suites.md +179 -0
  126. package/cabloy-docs/frontend/navigation-guards-guide.md +68 -0
  127. package/cabloy-docs/frontend/openapi-sdk-guide.md +102 -0
  128. package/cabloy-docs/frontend/page-guide.md +223 -0
  129. package/cabloy-docs/frontend/page-params-guide.md +87 -0
  130. package/cabloy-docs/frontend/page-query-guide.md +96 -0
  131. package/cabloy-docs/frontend/page-route-guide.md +147 -0
  132. package/cabloy-docs/frontend/quickstart.md +202 -0
  133. package/cabloy-docs/frontend/route-alias-guide.md +61 -0
  134. package/cabloy-docs/frontend/scripts.md +86 -0
  135. package/cabloy-docs/frontend/sdk-guide.md +45 -0
  136. package/cabloy-docs/frontend/server-data.md +74 -0
  137. package/cabloy-docs/frontend/ssr-client-only.md +40 -0
  138. package/cabloy-docs/frontend/ssr-env.md +51 -0
  139. package/cabloy-docs/frontend/ssr-init-data.md +46 -0
  140. package/cabloy-docs/frontend/ssr-overview.md +48 -0
  141. package/cabloy-docs/frontend/ssr-seo-meta.md +52 -0
  142. package/cabloy-docs/frontend/system-startup-guide.md +186 -0
  143. package/cabloy-docs/frontend/theme-guide.md +154 -0
  144. package/cabloy-docs/frontend/zod-guide.md +161 -0
  145. package/cabloy-docs/fullstack/cli.md +118 -0
  146. package/cabloy-docs/fullstack/comparison-with-other-frameworks.md +117 -0
  147. package/cabloy-docs/fullstack/edition-collaboration-differences.md +62 -0
  148. package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +64 -0
  149. package/cabloy-docs/fullstack/introduction.md +81 -0
  150. package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -0
  151. package/cabloy-docs/fullstack/quickstart.md +89 -0
  152. package/cabloy-docs/fullstack/vona-zova-integration.md +86 -0
  153. package/cabloy-docs/fullstack/vscode-extensions.md +126 -0
  154. package/cabloy-docs/index.md +72 -0
  155. package/cabloy-docs/package.json +16 -0
  156. package/cabloy-docs/pnpm-lock.yaml +1607 -0
  157. package/cabloy-docs/reference/backend-directory-structure.md +88 -0
  158. package/cabloy-docs/reference/cli-reference.md +49 -0
  159. package/cabloy-docs/reference/glossary.md +38 -0
  160. package/cabloy-docs/reference/package-map.md +105 -0
  161. package/cabloy-docs/reference/repo-scripts.md +36 -0
  162. package/package.json +4 -1
  163. package/scripts/init.ts +12 -0
  164. package/scripts/upgrade.ts +31 -3
  165. package/vona/README.md +4 -4
  166. package/vona/README.zh-CN.md +4 -4
  167. package/vona/packages-vona/vona/package.json +1 -1
  168. package/vona/pnpm-lock.yaml +383 -38
  169. package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/package.json +1 -1
  170. package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/src/bean/summerCache.datasourceWrite.ts +2 -2
  171. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
  172. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/.metadata/index.ts +49 -1
  173. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/controller/memoryDiag.ts +97 -0
  174. package/vona/src/suite-vendor/a-cabloy/package.json +1 -1
  175. package/vona/src/suite-vendor/a-captcha/modules/a-captcha/package.json +1 -1
  176. package/vona/src/suite-vendor/a-captcha/modules/a-captcha/src/bean/cacheRedis.captcha.ts +2 -2
  177. package/vona/src/suite-vendor/a-captcha/package.json +1 -1
  178. package/vona/src/suite-vendor/a-vona/modules/a-bean/cli/bean/metadata/generate.ts +5 -6
  179. package/vona/src/suite-vendor/a-vona/modules/a-bean/package.json +1 -1
  180. package/vona/src/suite-vendor/a-vona/modules/a-cache/cli/cacheMem/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
  181. package/vona/src/suite-vendor/a-vona/modules/a-cache/cli/cacheRedis/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
  182. package/vona/src/suite-vendor/a-vona/modules/a-cache/package.json +1 -1
  183. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/.metadata/index.ts +13 -2
  184. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/bean/bean.cache.ts +6 -7
  185. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/{bean/bean.cacheMemBase.ts → service/cacheMemBase_.ts} +3 -3
  186. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/{bean/bean.cacheRedisBase.ts → service/cacheRedisBase_.ts} +3 -3
  187. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/package.json +1 -1
  188. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/cacheRedis.emailConfirm.ts +2 -2
  189. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/cacheRedis.passwordReset.ts +2 -2
  190. package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
  191. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/bean/summerCache.json.ts +2 -2
  192. package/vona/src/suite-vendor/a-vona/modules/a-orm/cli/databaseDialect/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
  193. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  194. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/.metadata/index.ts +4 -3
  195. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/bean/bean.database.ts +3 -3
  196. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/bean/bean.model.ts +1 -1
  197. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/bean/schedule.softDeletionPrune.ts +1 -1
  198. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/common/utils.ts +1 -1
  199. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/index.ts +1 -1
  200. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_cache.ts +1 -1
  201. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_meta.ts +1 -1
  202. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.modelBase.ts +0 -5
  203. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoAggregate.ts +1 -1
  204. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoCreate.ts +1 -1
  205. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoGet.ts +1 -1
  206. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoGroup.ts +1 -1
  207. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoMutate.ts +1 -1
  208. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoSelectAndCount.ts +1 -1
  209. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoUpdate.ts +1 -1
  210. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/index.ts +1 -0
  211. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/modelCacheBase.ts +3 -3
  212. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relations.ts +1 -1
  213. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relationsDynamic.ts +1 -1
  214. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relationsMutate.ts +1 -1
  215. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relationsStatic.ts +1 -1
  216. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/cacheEntity_.ts +1 -1
  217. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/cacheQuery_.ts +1 -1
  218. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/database.ts +2 -2
  219. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean/bean.databaseDialectBase.ts → service/databaseDialectBase_.ts} +38 -41
  220. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/db_.ts +2 -2
  221. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/relations_.ts +3 -3
  222. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/database.ts +0 -5
  223. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/dto/dtoGet.ts +1 -1
  224. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/dto/dtoMutate.ts +1 -1
  225. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/dto/dtoSelectAndCount.ts +1 -1
  226. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/model.ts +1 -1
  227. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelAggr.ts +1 -1
  228. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelCount.ts +1 -1
  229. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelGeneral.ts +1 -1
  230. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelGroup.ts +1 -1
  231. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelIncrement.ts +1 -1
  232. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relations.ts +1 -1
  233. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsColumns.ts +1 -1
  234. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsDef.ts +1 -1
  235. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsDefDynamic.ts +1 -1
  236. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsDefMutate.ts +1 -1
  237. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsMutate.ts +1 -1
  238. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsTables.ts +1 -1
  239. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/package.json +1 -1
  240. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.betterSqlite3.ts +2 -2
  241. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.mysql.ts +2 -2
  242. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.pg.ts +2 -2
  243. package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
  244. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/bean.permission.ts +109 -40
  245. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/summerCache.permission.ts +2 -2
  246. package/vona/src/suite-vendor/a-vona/modules/a-startup/package.json +1 -1
  247. package/vona/src/suite-vendor/a-vona/modules/a-startup/src/bean/cacheRedis.startupDebounce.ts +2 -2
  248. package/vona/src/suite-vendor/a-vona/modules/a-summer/cli/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
  249. package/vona/src/suite-vendor/a-vona/modules/a-summer/package.json +1 -1
  250. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/.metadata/index.ts +1 -1
  251. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/bean/bean.summer.ts +3 -3
  252. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/service/localMem_.ts +3 -3
  253. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/service/localRedis_.ts +3 -3
  254. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/{bean/bean.summerCacheBase.ts → service/summerCacheBase_.ts} +3 -3
  255. package/vona/src/suite-vendor/a-vona/modules/a-swagger/package.json +1 -1
  256. package/vona/src/suite-vendor/a-vona/modules/a-swagger/src/bean/summerCache.rapidoc.ts +2 -2
  257. package/vona/src/suite-vendor/a-vona/modules/a-swagger/src/bean/summerCache.swagger.ts +2 -2
  258. package/vona/src/suite-vendor/a-vona/modules/a-user/package.json +1 -1
  259. package/vona/src/suite-vendor/a-vona/modules/a-user/src/bean/cacheRedis.authToken.ts +2 -2
  260. package/vona/src/suite-vendor/a-vona/modules/a-worker/package.json +1 -1
  261. package/vona/src/suite-vendor/a-vona/modules/a-worker/src/bean/cacheRedis.workerAlive.ts +2 -2
  262. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  263. package/zova/README.md +5 -5
  264. package/zova/README.zh-CN.md +4 -4
  265. package/zova/package.original.json +4 -4
  266. package/zova/packages-cli/cli/package.json +2 -2
  267. package/zova/packages-cli/cli-set-front/package.json +2 -2
  268. package/zova/packages-utils/zova-jsx/package.json +2 -2
  269. package/zova/packages-utils/zova-vite/package.json +2 -2
  270. package/zova/packages-utils/zova-vite/templates/app/controller.tsx_ +3 -3
  271. package/zova/packages-zova/zova/package.json +3 -3
  272. package/zova/packages-zova/zova-core/package.json +2 -2
  273. package/zova/packages-zova/zova-core/src/bean/beanContainer.ts +3 -3
  274. package/zova/packages-zova/zova-core/src/bean/beanControllerPageBase.ts +1 -0
  275. package/zova/packages-zova/zova-core/src/core/component/module.ts +16 -16
  276. package/zova/packages-zova/zova-core/src/core/context/component.ts +35 -3
  277. package/zova/packages-zova/zova-core/src/core/context/util.ts +15 -11
  278. package/zova/pnpm-lock.yaml +1596 -1679
  279. package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +11 -0
  280. package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/page/toolMinimal.ts +9 -0
  281. package/zova/src/suite/a-demo/modules/demo-basic/src/page/toolMinimal/controller.tsx +11 -0
  282. package/zova/src/suite/a-demo/modules/demo-basic/src/routes.ts +10 -0
  283. package/zova/src/suite-vendor/a-zova/modules/a-model/package.json +1 -1
  284. package/zova/src/suite-vendor/a-zova/modules/a-model/src/service/storage.ts +4 -5
  285. package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
  286. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/monkey.ts +1 -1
  287. package/zova/src/suite-vendor/a-zova/modules/a-ssr/package.json +1 -1
  288. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssr.ts +36 -1
  289. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrMetaStore.ts +7 -2
  290. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/monkey.ts +3 -0
  291. package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/package.json +1 -1
  292. package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/src/service/ssrHandler.ts +70 -29
  293. package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
  294. package/zova/src/suite-vendor/a-zova/package.json +6 -6
  295. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_crud.ts +0 -0
  296. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_crud_inner.ts +0 -0
  297. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_crud_table.ts +0 -0
  298. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_knex.ts +0 -0
  299. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_utils.ts +0 -0
  300. /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_view.ts +0 -0
@@ -4,87 +4,156 @@ import type {
4
4
  IOpenapiPermissions,
5
5
  IResourceRecord,
6
6
  } from 'vona-module-a-openapi';
7
- import type {
8
- ContextRoute,
9
- ContextRouteBase,
10
- ContextRouteMetadata,
11
- IRecordResourceNameToRoutePathItem,
12
- } from 'vona-module-a-web';
7
+ import type { IGuardOptionsPassport, IGuardOptionsRoleName } from 'vona-module-a-user';
8
+ import type { ContextRouteMetadata, IRecordResourceNameToRoutePathItem } from 'vona-module-a-web';
13
9
 
14
- import { catchError } from '@cabloy/utils';
15
10
  import { appMetadata, appResource, BeanBase, beanFullNameFromOnionName } from 'vona';
16
11
  import { Bean } from 'vona-module-a-bean';
17
12
  import { Caching } from 'vona-module-a-caching';
18
13
  import { SymbolUseOnionOptionsRouteReal } from 'vona-module-a-onion';
19
- import { composeGuards, recordResourceNameToRoutePath } from 'vona-module-a-web';
14
+ import { recordResourceNameToRoutePath } from 'vona-module-a-web';
15
+
16
+ const BeanFullNameGuardPassport = beanFullNameFromOnionName('a-user:passport', 'guard');
17
+ const BeanFullNameGuardRoleName = beanFullNameFromOnionName('a-user:roleName', 'guard');
18
+ const BeanFullNameGuardUserName = beanFullNameFromOnionName('a-user:userName', 'guard');
19
+ const BeanFullNamesGuardSupported = new Set<string>([
20
+ BeanFullNameGuardPassport,
21
+ BeanFullNameGuardRoleName,
22
+ BeanFullNameGuardUserName,
23
+ ]);
24
+ const GuardOptionsPassportDefault: IGuardOptionsPassport = {
25
+ public: false,
26
+ activated: true,
27
+ checkAuthToken: true,
28
+ };
29
+
30
+ type TGuardMeta = Record<string, unknown>;
20
31
 
21
32
  @Bean()
22
33
  export class BeanPermission extends BeanBase {
23
- public async clearAllCaches() {
24
- const cacheOpenapiSchema = this.bean.summer.cache(
34
+ public async clearAllCaches(): Promise<void> {
35
+ const cachePermission = this.bean.summer.cache(
25
36
  beanFullNameFromOnionName('a-permission:permission', 'summerCache'),
26
37
  );
27
- await cacheOpenapiSchema.clear();
38
+ await cachePermission.clear();
28
39
  }
29
40
 
30
- protected retrievePermissionsCacheKey(info: ICachingActionKeyInfo) {
41
+ protected retrievePermissionsCacheKey(info: ICachingActionKeyInfo): string {
31
42
  const resource = info.args[0];
32
43
  const userId = this.ctx.passport.user?.id;
33
- return `${resource}_${userId}`;
44
+ return `user:${resource}_${userId}`;
45
+ }
46
+
47
+ protected retrievePermissionsDefaultCacheKey(info: ICachingActionKeyInfo): string {
48
+ return `default:${this._buildPermissionProfileKey(info.args[0])}`;
34
49
  }
35
50
 
36
51
  @Caching.get({ cacheName: 'a-permission:permission', cacheKeyFn: 'retrievePermissionsCacheKey' })
37
52
  async retrievePermissions(resource: keyof IResourceRecord): Promise<IOpenapiPermissions> {
38
53
  return await this.scope.event.retrievePermissions.emit({ resource }, async () => {
39
- return await this.getPermissionsDefault(resource);
54
+ return await this.retrievePermissionsDefault(resource);
40
55
  });
41
56
  }
42
57
 
58
+ @Caching.get({
59
+ cacheName: 'a-permission:permission',
60
+ cacheKeyFn: 'retrievePermissionsDefaultCacheKey',
61
+ })
62
+ protected async retrievePermissionsDefault(
63
+ resource: keyof IResourceRecord,
64
+ ): Promise<IOpenapiPermissions> {
65
+ return await this.getPermissionsDefault(resource);
66
+ }
67
+
43
68
  async getPermissionsDefault(resource: keyof IResourceRecord): Promise<IOpenapiPermissions> {
44
69
  const routePathInfo: IRecordResourceNameToRoutePathItem =
45
70
  recordResourceNameToRoutePath[resource];
46
71
  if (!routePathInfo) throw new Error(`not found routePath of resource: ${resource}`);
47
- // controller options
48
72
  const controller = routePathInfo.controller;
49
- // controller options
50
- const beanOptions = appResource.getBean(controller);
51
- if (!beanOptions) throw new Error('invalid controller');
52
- const controllerBeanFullName = beanOptions.beanFullName;
53
- // descs
73
+ if (!appResource.getBean(controller)) throw new Error('invalid controller');
54
74
  const descs = Object.getOwnPropertyDescriptors(controller.prototype);
55
75
  const actionsIgnore = this.scope.config.permission.actionsIgnore;
56
76
  const actionKeys = Object.keys(descs).filter(
57
- actionKey => !['constructor'].includes(actionKey) && !actionsIgnore.includes(actionKey),
77
+ actionKey => actionKey !== 'constructor' && !actionsIgnore.includes(actionKey),
58
78
  );
59
- // actions
60
79
  const permissionsActions: IOpenapiPermissionModeActionActions = {};
61
80
  for (const actionKey of actionKeys) {
62
81
  const desc = descs[actionKey];
63
82
  if (!desc.value || typeof desc.value !== 'function') continue;
64
- const routeReal: ContextRouteMetadata = appMetadata.getMetadata(
83
+ const routeReal: ContextRouteMetadata | undefined = appMetadata.getMetadata(
65
84
  SymbolUseOnionOptionsRouteReal,
66
85
  controller.prototype,
67
86
  actionKey,
68
- )!;
69
- const route: Partial<ContextRoute> = {
70
- controller,
71
- controllerBeanFullName,
72
- action: actionKey,
73
- route: routeReal,
74
- };
75
- permissionsActions[actionKey] = await this._getPermissionOfAction(route);
87
+ );
88
+ permissionsActions[actionKey] = this._getPermissionOfActionByMetadata(routeReal);
76
89
  }
77
90
  return { actions: permissionsActions };
78
91
  }
79
92
 
80
- private async _getPermissionOfAction(route: Partial<ContextRoute>) {
81
- const routePrev = this.ctx.route;
82
- this.ctx.route = route as ContextRoute;
83
- const composer = composeGuards(this.app, route as ContextRouteBase);
84
- const [_, error] = await catchError(() => {
85
- return composer(this.ctx);
86
- });
87
- this.ctx.route = routePrev;
88
- return !error;
93
+ private _buildPermissionProfileKey(resource: keyof IResourceRecord): string {
94
+ if (!this.bean.passport.isAuthenticated) return `${resource}__anon`;
95
+ const activated = this.bean.passport.isActivated ? 1 : 0;
96
+ const roleNames = this._extractCurrentRoleNames();
97
+ return `${resource}__auth__act:${activated}__roles:${roleNames.join(',')}`;
98
+ }
99
+
100
+ private _extractCurrentRoleNames(): string[] {
101
+ const roleNames = this.bean.passport.currentRoles?.map(item => item.name) ?? [];
102
+ return Array.from(new Set(roleNames)).sort();
103
+ }
104
+
105
+ private _getPermissionOfActionByMetadata(routeReal: ContextRouteMetadata | undefined): boolean {
106
+ if (!routeReal?.meta) return false;
107
+ return this._evaluatePassportGuardsStatically(routeReal.meta);
108
+ }
109
+
110
+ private _evaluatePassportGuardsStatically(meta: TGuardMeta): boolean {
111
+ if (this._hasUnknownGuard(meta)) return false;
112
+ if (this._hasDynamicUserNameGuard(meta)) return false;
113
+ const passportOptions = this._getPassportOptions(meta);
114
+ if (!this._matchPassportOptions(passportOptions)) return false;
115
+ const roleNameOptions = meta[BeanFullNameGuardRoleName] as
116
+ | Partial<IGuardOptionsRoleName>
117
+ | undefined;
118
+ if (!this._matchRoleNameOptions(roleNameOptions)) return false;
119
+ return true;
120
+ }
121
+
122
+ private _hasUnknownGuard(meta: TGuardMeta): boolean {
123
+ return Object.keys(meta).some(
124
+ key => key.includes('.guard.') && !BeanFullNamesGuardSupported.has(key),
125
+ );
126
+ }
127
+
128
+ private _hasDynamicUserNameGuard(meta: TGuardMeta): boolean {
129
+ return BeanFullNameGuardUserName in meta;
130
+ }
131
+
132
+ private _getPassportOptions(meta: TGuardMeta): IGuardOptionsPassport {
133
+ return {
134
+ ...GuardOptionsPassportDefault,
135
+ ...(meta[BeanFullNameGuardPassport] as Partial<IGuardOptionsPassport> | undefined),
136
+ };
137
+ }
138
+
139
+ private _matchPassportOptions(
140
+ options: Pick<IGuardOptionsPassport, 'public' | 'activated'>,
141
+ ): boolean {
142
+ const isAuthenticated = this.bean.passport.isAuthenticated;
143
+ if (!options.public && !isAuthenticated) return false;
144
+ if (!isAuthenticated) return true;
145
+ if (options.activated === true && !this.bean.passport.isActivated) return false;
146
+ if (options.activated === false && this.bean.passport.isActivated) return false;
147
+ return true;
148
+ }
149
+
150
+ private _matchRoleNameOptions(options: Partial<IGuardOptionsRoleName> | undefined): boolean {
151
+ if (!options) return true;
152
+ if (!options.name) return false;
153
+ if (options.passWhenMatched === false) return false;
154
+ if (options.rejectWhenDismatched === false) return false;
155
+ const roleNamesCurrent = this._extractCurrentRoleNames();
156
+ const roleNamesRequired = Array.isArray(options.name) ? options.name : [options.name];
157
+ return roleNamesCurrent.some(roleName => roleNamesRequired.includes(roleName as any));
89
158
  }
90
159
  }
@@ -1,13 +1,13 @@
1
1
  import type { ISummerCacheGet, TSummerCacheActionOptions } from 'vona-module-a-summer';
2
2
 
3
- import { BeanSummerCacheBase, SummerCache } from 'vona-module-a-summer';
3
+ import { ServiceSummerCacheBase, SummerCache } from 'vona-module-a-summer';
4
4
 
5
5
  export type TSummerCachePermissionKey = any;
6
6
  export type TSummerCachePermissionData = any;
7
7
 
8
8
  @SummerCache({ preset: 'mem' })
9
9
  export class SummerCachePermission
10
- extends BeanSummerCacheBase<TSummerCachePermissionKey, TSummerCachePermissionData>
10
+ extends ServiceSummerCacheBase<TSummerCachePermissionKey, TSummerCachePermissionData>
11
11
  implements ISummerCacheGet<TSummerCachePermissionKey, TSummerCachePermissionData>
12
12
  {
13
13
  async getNative(
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-startup",
3
- "version": "5.1.6",
3
+ "version": "5.1.7",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -1,4 +1,4 @@
1
- import { BeanCacheRedisBase, CacheRedis } from 'vona-module-a-cache';
1
+ import { ServiceCacheRedisBase, CacheRedis } from 'vona-module-a-cache';
2
2
 
3
3
  export type TCacheRedisStartupDebounceKey = `startupDebounce:${string}`;
4
4
  export type TCacheRedisStartupDebounceData = boolean;
@@ -8,7 +8,7 @@ export type TCacheRedisStartupDebounceData = boolean;
8
8
  disableTransactionCompensate: true,
9
9
  client: 'worker',
10
10
  })
11
- export class CacheRedisStartupDebounce extends BeanCacheRedisBase<
11
+ export class CacheRedisStartupDebounce extends ServiceCacheRedisBase<
12
12
  TCacheRedisStartupDebounceKey,
13
13
  TCacheRedisStartupDebounceData
14
14
  > {}
@@ -1,12 +1,12 @@
1
1
  import type { ISummerCacheGet, TSummerCacheActionOptions } from 'vona-module-a-summer';
2
- import { BeanSummerCacheBase, SummerCache } from 'vona-module-a-summer';
2
+ import { ServiceSummerCacheBase, SummerCache } from 'vona-module-a-summer';
3
3
 
4
4
  export type TSummerCache<%=argv.beanNameCapitalize%>Key = any;
5
5
  export type TSummerCache<%=argv.beanNameCapitalize%>Data = any;
6
6
 
7
7
  @SummerCache()
8
8
  export class SummerCache<%=argv.beanNameCapitalize%>
9
- extends BeanSummerCacheBase<TSummerCache<%=argv.beanNameCapitalize%>Key, TSummerCache<%=argv.beanNameCapitalize%>Data>
9
+ extends ServiceSummerCacheBase<TSummerCache<%=argv.beanNameCapitalize%>Key, TSummerCache<%=argv.beanNameCapitalize%>Data>
10
10
  implements ISummerCacheGet<TSummerCache<%=argv.beanNameCapitalize%>Key, TSummerCache<%=argv.beanNameCapitalize%>Data> {
11
11
  async getNative(
12
12
  _key?: TSummerCache<%=argv.beanNameCapitalize%>Key,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-summer",
3
- "version": "5.1.6",
3
+ "version": "5.1.7",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "Layered Cache",
6
6
  "keywords": [
@@ -1,7 +1,6 @@
1
1
  // eslint-disable
2
2
  /** bean: begin */
3
3
  export * from '../bean/bean.summer.ts';
4
- export * from '../bean/bean.summerCacheBase.ts';
5
4
 
6
5
  import 'vona';
7
6
  declare module 'vona' {
@@ -29,6 +28,7 @@ declare module 'vona' {
29
28
  export * from '../service/localFetch_.ts';
30
29
  export * from '../service/localMem_.ts';
31
30
  export * from '../service/localRedis_.ts';
31
+ export * from '../service/summerCacheBase_.ts';
32
32
 
33
33
  import 'vona-module-a-bean';
34
34
  declare module 'vona-module-a-bean' {
@@ -3,17 +3,17 @@ import { Bean } from 'vona-module-a-bean';
3
3
 
4
4
  import type { IDecoratorSummerCacheOptions } from '../types/summerCache.ts';
5
5
 
6
- import { BeanSummerCacheBase } from './bean.summerCacheBase.ts';
6
+ import { ServiceSummerCacheBase } from '../service/summerCacheBase_.ts';
7
7
 
8
8
  @Bean()
9
9
  export class BeanSummer extends BeanBase {
10
10
  cache<KEY, DATA>(
11
11
  cacheName: string,
12
12
  cacheOptions?: IDecoratorSummerCacheOptions,
13
- ): BeanSummerCacheBase<KEY, DATA> {
13
+ ): ServiceSummerCacheBase<KEY, DATA> {
14
14
  if (cacheName.includes('.summerCache.')) {
15
15
  return this.app.bean._getBeanSelector(cacheName as any, undefined, cacheOptions);
16
16
  }
17
- return this.app.bean._getBeanSelector(BeanSummerCacheBase, cacheName, cacheOptions);
17
+ return this.app.bean._getBeanSelector(ServiceSummerCacheBase, cacheName, cacheOptions);
18
18
  }
19
19
  }
@@ -1,4 +1,4 @@
1
- import type { BeanCacheMemBase } from 'vona-module-a-cache';
1
+ import type { ServiceCacheMemBase } from 'vona-module-a-cache';
2
2
 
3
3
  import { Service } from 'vona-module-a-bean';
4
4
 
@@ -12,7 +12,7 @@ export class ServiceLocalMem<KEY = any, DATA = any>
12
12
  extends CacheBase<KEY, DATA>
13
13
  implements ICacheLayeredBase<KEY, DATA>
14
14
  {
15
- private _cacheMemInstance: BeanCacheMemBase<KEY, DATA> | undefined;
15
+ private _cacheMemInstance: ServiceCacheMemBase<KEY, DATA> | undefined;
16
16
 
17
17
  protected async __dispose__() {
18
18
  if (this._cacheMemInstance) {
@@ -21,7 +21,7 @@ export class ServiceLocalMem<KEY = any, DATA = any>
21
21
  }
22
22
  }
23
23
 
24
- get cacheMem(): BeanCacheMemBase<KEY, DATA> {
24
+ get cacheMem(): ServiceCacheMemBase<KEY, DATA> {
25
25
  if (!this._cacheMemInstance) {
26
26
  this._cacheMemInstance = this.app.bean.cache.mem(this._cacheName, this._cacheOptions.mem);
27
27
  }
@@ -1,4 +1,4 @@
1
- import type { BeanCacheRedisBase } from 'vona-module-a-cache';
1
+ import type { ServiceCacheRedisBase } from 'vona-module-a-cache';
2
2
 
3
3
  import { Service } from 'vona-module-a-bean';
4
4
 
@@ -12,7 +12,7 @@ export class ServiceLocalRedis<KEY = any, DATA = any>
12
12
  extends CacheBase<KEY, DATA>
13
13
  implements ICacheLayeredBase<KEY, DATA>
14
14
  {
15
- private _cacheRedisInstance: BeanCacheRedisBase<KEY, DATA> | undefined;
15
+ private _cacheRedisInstance: ServiceCacheRedisBase<KEY, DATA> | undefined;
16
16
 
17
17
  protected async __dispose__() {
18
18
  if (this._cacheRedisInstance) {
@@ -21,7 +21,7 @@ export class ServiceLocalRedis<KEY = any, DATA = any>
21
21
  }
22
22
  }
23
23
 
24
- get cacheRedis(): BeanCacheRedisBase<KEY, DATA> {
24
+ get cacheRedis(): ServiceCacheRedisBase<KEY, DATA> {
25
25
  if (!this._cacheRedisInstance) {
26
26
  this._cacheRedisInstance = this.app.bean.cache.redis(
27
27
  this._cacheName,
@@ -1,5 +1,5 @@
1
1
  import { deepExtend, Virtual } from 'vona';
2
- import { Bean } from 'vona-module-a-bean';
2
+ import { Service } from 'vona-module-a-bean';
3
3
 
4
4
  import type {
5
5
  IDecoratorSummerCacheOptions,
@@ -8,9 +8,9 @@ import type {
8
8
 
9
9
  import { CacheBase } from '../common/cacheBase.ts';
10
10
 
11
- @Bean()
11
+ @Service()
12
12
  @Virtual()
13
- export class BeanSummerCacheBase<KEY = any, DATA = any> extends CacheBase<KEY, DATA> {
13
+ export class ServiceSummerCacheBase<KEY = any, DATA = any> extends CacheBase<KEY, DATA> {
14
14
  protected __init__(cacheName?: string, cacheOptions?: IDecoratorSummerCacheOptions) {
15
15
  let _cacheName: string;
16
16
  let _cacheOptions: IDecoratorSummerCacheOptions;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-swagger",
3
- "version": "5.1.5",
3
+ "version": "5.1.6",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -1,13 +1,13 @@
1
1
  import type { ISummerCacheGet, TSummerCacheActionOptions } from 'vona-module-a-summer';
2
2
 
3
- import { BeanSummerCacheBase, SummerCache } from 'vona-module-a-summer';
3
+ import { ServiceSummerCacheBase, SummerCache } from 'vona-module-a-summer';
4
4
 
5
5
  export type TSummerCacheRapidocKey = any;
6
6
  export type TSummerCacheRapidocData = any;
7
7
 
8
8
  @SummerCache({ preset: 'mem' })
9
9
  export class SummerCacheRapidoc
10
- extends BeanSummerCacheBase<TSummerCacheRapidocKey, TSummerCacheRapidocData>
10
+ extends ServiceSummerCacheBase<TSummerCacheRapidocKey, TSummerCacheRapidocData>
11
11
  implements ISummerCacheGet<TSummerCacheRapidocKey, TSummerCacheRapidocData>
12
12
  {
13
13
  async getNative(
@@ -1,13 +1,13 @@
1
1
  import type { ISummerCacheGet, TSummerCacheActionOptions } from 'vona-module-a-summer';
2
2
 
3
- import { BeanSummerCacheBase, SummerCache } from 'vona-module-a-summer';
3
+ import { ServiceSummerCacheBase, SummerCache } from 'vona-module-a-summer';
4
4
 
5
5
  export type TSummerCacheSwaggerKey = any;
6
6
  export type TSummerCacheSwaggerData = any;
7
7
 
8
8
  @SummerCache({ preset: 'mem' })
9
9
  export class SummerCacheSwagger
10
- extends BeanSummerCacheBase<TSummerCacheSwaggerKey, TSummerCacheSwaggerData>
10
+ extends ServiceSummerCacheBase<TSummerCacheSwaggerKey, TSummerCacheSwaggerData>
11
11
  implements ISummerCacheGet<TSummerCacheSwaggerKey, TSummerCacheSwaggerData>
12
12
  {
13
13
  async getNative(
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-user",
3
- "version": "5.1.10",
3
+ "version": "5.1.11",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -1,4 +1,4 @@
1
- import { BeanCacheRedisBase, CacheRedis } from 'vona-module-a-cache';
1
+ import { ServiceCacheRedisBase, CacheRedis } from 'vona-module-a-cache';
2
2
 
3
3
  export type TCacheRedisAuthTokenKey = string;
4
4
  export type TCacheRedisAuthTokenData = string;
@@ -7,7 +7,7 @@ export type TCacheRedisAuthTokenData = string;
7
7
  ttl: 30 * 24 * 60 * 60 * 1000,
8
8
  disableTransactionCompensate: true,
9
9
  })
10
- export class CacheRedisAuthToken extends BeanCacheRedisBase<
10
+ export class CacheRedisAuthToken extends ServiceCacheRedisBase<
11
11
  TCacheRedisAuthTokenKey,
12
12
  TCacheRedisAuthTokenData
13
13
  > {}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-worker",
3
- "version": "5.1.5",
3
+ "version": "5.1.6",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -1,4 +1,4 @@
1
- import { BeanCacheRedisBase, CacheRedis } from 'vona-module-a-cache';
1
+ import { ServiceCacheRedisBase, CacheRedis } from 'vona-module-a-cache';
2
2
 
3
3
  export type TCacheRedisWorkerAliveKey = string;
4
4
  export type TCacheRedisWorkerAliveData = boolean;
@@ -8,7 +8,7 @@ export type TCacheRedisWorkerAliveData = boolean;
8
8
  disableTransactionCompensate: true,
9
9
  client: 'worker',
10
10
  })
11
- export class CacheRedisWorkerAlive extends BeanCacheRedisBase<
11
+ export class CacheRedisWorkerAlive extends ServiceCacheRedisBase<
12
12
  TCacheRedisWorkerAliveKey,
13
13
  TCacheRedisWorkerAliveData
14
14
  > {}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-suite-a-vona",
3
- "version": "5.1.33",
3
+ "version": "5.1.34",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "author": "",
package/zova/README.md CHANGED
@@ -1,10 +1,10 @@
1
- English | [简体中文](./README.zh-CN.md)
1
+ English | [Simplified Chinese](./README.zh-CN.md)
2
2
 
3
3
  # Zova
4
4
 
5
5
  Zova: The Intuitive Frontend Framework = Vue3 Reactive + React TSX + Angular IOC
6
6
 
7
- - Built-in out-of-the-box SSR solution, building `SSR/SPA/Website/Admin-Dashboard` in one codebase
7
+ - Built-in out-of-the-box SSR solution, building `SSR/SPA/Web/Admin` in one codebase
8
8
  - Supports dual-layer tabs navigation, enabling efficient page switching while maintaining page state
9
9
  - Dynamically render CRUD list pages, entry pages, and search forms, while demonstrating best practices for Tanstack Table, Tanstack Form, and Tanstack Query
10
10
 
@@ -39,10 +39,10 @@ Zova can be used with any UI library and comes with built-in project templates f
39
39
 
40
40
  ## Demo Online 2
41
41
 
42
- The Website and Admin-Dashboard of Cabloy Store are built by one codebase
42
+ The Web and Admin of Cabloy Store are built by one codebase
43
43
 
44
- - Website: [https://cabloy.com](https://cabloy.com)
45
- - Admin-Dashboard: [https://cabloy.com/admin](https://cabloy.com/admin)
44
+ - Web: [https://cabloy.com](https://cabloy.com)
45
+ - Admin: [https://cabloy.com/admin](https://cabloy.com/admin)
46
46
 
47
47
  ## GIF Demo
48
48
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  Zova: 直观的前端框架 = Vue3 响应式 + React TSX + Angular IOC
6
6
 
7
- - 内置开箱即用的 SSR 解决方案,可在同一个代码库中实现`SSR/SPA/Web网站/Admin中后台`
7
+ - 内置开箱即用的 SSR 解决方案,可在同一个代码库中实现`SSR/SPA/Web/Admin`
8
8
  - 支持双层页签导航,实现高效页面切换,并保持页面状态
9
9
  - 可动态渲染 CRUD 的列表页、条目页、搜索表单,并且提供了`Tanstack Table/Tanstack Form/Tanstack Query`的最佳实践
10
10
  - 提供强大的 IOC + AOP 能力,让系统具有无与伦比的可扩展性和可维护性
@@ -40,10 +40,10 @@ Zova 可以搭配任何 UI 库使用,并且内置了几款 UI 库的项目模
40
40
 
41
41
  ## 在线演示2
42
42
 
43
- 使用同一套代码实现 Cabloy Store 的`Web网站`和`Admin中后台`
43
+ 使用同一套代码实现 Cabloy Store 的`Web`和`Admin`
44
44
 
45
- - Web 网站:[https://cabloy.com](https://cabloy.com)
46
- - Admin 中后台:[https://cabloy.com/admin](https://cabloy.com/admin)
45
+ - Web[https://cabloy.com](https://cabloy.com)
46
+ - Admin[https://cabloy.com/admin](https://cabloy.com/admin)
47
47
 
48
48
  ## 动图演示
49
49
 
@@ -67,11 +67,11 @@
67
67
  "devDependencies": {
68
68
  "@cabloy/lint": "^5.1.27",
69
69
  "@cabloy/openapi-typescript": "^7.9.2",
70
- "@quasar/app-vite": "npm:@cabloy/quasar-app-vite@^2.5.9",
70
+ "@quasar/app-vite": "npm:@cabloy/quasar-app-vite@^2.5.10",
71
71
  "@types/node": "^22.19.17",
72
72
  "@vitejs/plugin-vue": "^6.0.7",
73
73
  "concurrently": "^8.2.2",
74
- "quasar-app-extension-zova": "^1.3.0",
74
+ "quasar-app-extension-zova": "^1.3.1",
75
75
  "sass": "^1.99.0",
76
76
  "typescript": "^5.9.3",
77
77
  "vite": "^8.0.14",
@@ -91,10 +91,10 @@
91
91
  },
92
92
  "pnpm": {
93
93
  "overrides": {
94
- "@quasar/app-vite": "npm:@cabloy/quasar-app-vite@^2.5.9",
94
+ "@quasar/app-vite": "npm:@cabloy/quasar-app-vite@^2.5.10",
95
95
  "@vue/babel-plugin-jsx": "npm:@cabloy/vue-babel-plugin-jsx@^2.0.1",
96
96
  "@vue/compiler-sfc": "npm:@cabloy/vue-compiler-sfc@^3.5.14",
97
- "@vue/runtime-core": "npm:@cabloy/vue-runtime-core@^3.5.53",
97
+ "@vue/runtime-core": "npm:@cabloy/vue-runtime-core@^3.5.56",
98
98
  "@vue/runtime-dom": "npm:@cabloy/vue-runtime-dom@^3.5.13",
99
99
  "@vue/reactivity": "npm:@cabloy/vue-reactivity@^3.5.16",
100
100
  "@vue/server-renderer": "npm:@cabloy/vue-server-renderer@^3.5.18",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zova-cli",
3
- "version": "1.2.73",
3
+ "version": "1.2.74",
4
4
  "gitHead": "6f675a8cc46d596142c591c28a40cc4d82fcc6cc",
5
5
  "description": "zova cli",
6
6
  "keywords": [
@@ -44,7 +44,7 @@
44
44
  "@cabloy/process-helper": "^3.0.0",
45
45
  "fs-extra": "^11.3.5",
46
46
  "semver": "^7.6.2",
47
- "zova-cli-set-front": "^1.2.71"
47
+ "zova-cli-set-front": "^1.2.72"
48
48
  },
49
49
  "devDependencies": {
50
50
  "clean-package": "^2.2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zova-cli-set-front",
3
- "version": "1.2.71",
3
+ "version": "1.2.72",
4
4
  "gitHead": "6f675a8cc46d596142c591c28a40cc4d82fcc6cc",
5
5
  "description": "zova cli-set-front",
6
6
  "keywords": [
@@ -70,7 +70,7 @@
70
70
  "vite": "^8.0.14",
71
71
  "yaml": "^2.8.3",
72
72
  "zova-openapi": "^1.1.14",
73
- "zova-vite": "^1.1.33"
73
+ "zova-vite": "^1.1.34"
74
74
  },
75
75
  "devDependencies": {
76
76
  "clean-package": "^2.2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zova-jsx",
3
- "version": "1.1.54",
3
+ "version": "1.1.55",
4
4
  "gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
5
5
  "description": "Zova JSX",
6
6
  "keywords": [
@@ -50,7 +50,7 @@
50
50
  "@cabloy/word-utils": "^2.1.14",
51
51
  "typestyle": "^2.4.0",
52
52
  "vue": "^3.5.32",
53
- "zova-core": "^5.1.48"
53
+ "zova-core": "^5.1.49"
54
54
  },
55
55
  "devDependencies": {
56
56
  "clean-package": "^2.2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zova-vite",
3
- "version": "1.1.33",
3
+ "version": "1.1.34",
4
4
  "gitHead": "09d901d17140a80ee0764211b441cda72fd94663",
5
5
  "description": "zova vite",
6
6
  "keywords": [
@@ -49,7 +49,7 @@
49
49
  "@cabloy/vue-compiler-sfc": "^3.5.14",
50
50
  "@cabloy/vue-reactivity": "^3.5.16",
51
51
  "@cabloy/vue-router": "^4.4.16",
52
- "@cabloy/vue-runtime-core": "^3.5.53",
52
+ "@cabloy/vue-runtime-core": "^3.5.56",
53
53
  "@cabloy/vue-runtime-dom": "^3.5.13",
54
54
  "@cabloy/vue-server-renderer": "^3.5.18",
55
55
  "@faker-js/faker": "^8.4.1",
@@ -7,11 +7,11 @@ export class ControllerPageApp extends BeanControllerPageBase {
7
7
  // app
8
8
  const instance = getCurrentInstance();
9
9
  const app = instance!.appContext.app!;
10
- if (!app.zova) {
11
- await this.initApp(app);
12
- } else {
10
+ if (app.zova) {
13
11
  await this.updateApp(app.zova);
12
+ return;
14
13
  }
14
+ await this.initApp(app);
15
15
  }
16
16
 
17
17
  protected render() {