cabloy 5.1.136 → 5.1.138
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cabloy-version +1 -1
- package/.claude/skills/cabloy-backend-scaffold/SKILL.md +13 -0
- package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +11 -0
- package/.claude/skills/cabloy-contract-loop/SKILL.md +17 -0
- package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +35 -0
- package/.claude/skills/cabloy-frontend-scaffold/evals/evals.json +1 -1
- package/.claude/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +4 -0
- package/.claude/skills/cabloy-zova-source-reading/SKILL.md +21 -0
- package/.claude/skills/cabloy-zova-source-reading/references/core-reading-paths.md +26 -0
- package/CHANGELOG.md +31 -0
- package/CLAUDE.md +5 -1
- package/cabloy-docs/.vitepress/config.mjs +1 -0
- package/cabloy-docs/.vitepress/theme/custom.css +124 -0
- package/cabloy-docs/backend/auth-guide.md +8 -0
- package/cabloy-docs/backend/config-guide.md +2 -0
- package/cabloy-docs/backend/controller-aop-guide.md +8 -0
- package/cabloy-docs/backend/controller-guide.md +33 -0
- package/cabloy-docs/backend/event-guide.md +3 -3
- package/cabloy-docs/backend/mail-guide.md +1 -1
- package/cabloy-docs/backend/markdown-guide.md +1 -1
- package/cabloy-docs/backend/runtime-and-flavors.md +29 -0
- package/cabloy-docs/backend/user-access-guide.md +2 -2
- package/cabloy-docs/blogs/ai-react-nextjs-enterprise-architecture-cabloy/cover-en-v1.png +0 -0
- package/cabloy-docs/blogs/ai-react-nextjs-enterprise-architecture-cabloy/index.md +177 -0
- package/cabloy-docs/blogs/cabloy-fullstack-resource-addressing/cover-en-v1.png +0 -0
- package/cabloy-docs/blogs/cabloy-fullstack-resource-addressing/index.md +430 -0
- package/cabloy-docs/blogs/index.md +69 -0
- package/cabloy-docs/blogs/nextjs-integrated-fullstack-cabloy-contract-loop/cover-en-v1.png +0 -0
- package/cabloy-docs/blogs/nextjs-integrated-fullstack-cabloy-contract-loop/index.md +195 -0
- package/cabloy-docs/blogs/vue-object-oriented-zova-beginner-mental-model/cover-en-v1.png +0 -0
- package/cabloy-docs/blogs/vue-object-oriented-zova-beginner-mental-model/index.md +483 -0
- package/cabloy-docs/frontend/a-openapi-under-the-hood.md +13 -0
- package/cabloy-docs/frontend/api-schema-guide.md +79 -0
- package/cabloy-docs/frontend/environment-config-guide.md +2 -0
- package/cabloy-docs/frontend/form-guide.md +37 -0
- package/cabloy-docs/frontend/markdown-guide.md +3 -0
- package/cabloy-docs/frontend/model-resource-owner-pattern.md +26 -1
- package/cabloy-docs/frontend/module-scope.md +24 -0
- package/cabloy-docs/frontend/modules-and-suites.md +23 -1
- package/cabloy-docs/frontend/navigation-guards-guide.md +2 -0
- package/cabloy-docs/frontend/page-params-guide.md +2 -0
- package/cabloy-docs/frontend/page-route-guide.md +10 -3
- package/cabloy-docs/frontend/route-alias-guide.md +12 -6
- package/cabloy-docs/frontend/ssr-env.md +15 -6
- package/cabloy-docs/frontend/ssr-overview.md +10 -0
- package/cabloy-docs/frontend/ssr-review-checklist.md +1 -0
- package/cabloy-docs/frontend/zova-form-under-the-hood.md +6 -0
- package/cabloy-docs/frontend/zova-router-under-the-hood.md +4 -5
- package/cabloy-docs/fullstack/a-pay-payment-suite.md +1 -1
- package/cabloy-docs/fullstack/deploy-cloudflare-docker.md +14 -8
- package/e2e/specs/a-commerce/commerce.spec.ts +17 -2
- package/e2e/specs/cabloy-basic/account.spec.ts +519 -0
- package/e2e/specs/cabloy-basic/basic.spec.ts +15 -3
- package/package.json +1 -1
- package/vona/env/.env +2 -0
- package/vona/packages-cli/cli/package.json +1 -1
- package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/boilerplate/src/controller/{{resourceName}}.ts_ +14 -11
- package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/snippets/3-en-us.ts +11 -1
- package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/snippets/4-zh-cn.ts +11 -1
- package/vona/packages-cli/cli-set-api/package.json +1 -1
- package/vona/packages-cli/cli-set-api/src/lib/bean/cli.tools.metadata.ts +1 -0
- package/vona/packages-cli/cli-set-api/src/lib/bean/toolsMetadata/generateOnions.ts +4 -3
- package/vona/packages-vona/vona/package.json +1 -1
- package/vona/pnpm-lock.yaml +237 -66
- package/vona/pnpm-workspace.yaml +1 -1
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +33 -37
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectResItem.tsx +3 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuView.tsx +3 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/sku.tsx +17 -2
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/sku.ts +12 -2
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuPresentation.test.ts +52 -4
- package/vona/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +34 -36
- package/vona/src/suite/a-commerce/modules/commerce-payment/src/.metadata/index.ts +29 -33
- package/vona/src/suite/a-commerce/modules/commerce-promotion/src/.metadata/index.ts +34 -37
- package/vona/src/suite/a-commerce/modules/commerce-seed/src/.metadata/index.ts +8 -9
- package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/index.ts +33 -35
- package/vona/src/suite/a-commerce/modules/commerce-siteweb/src/.metadata/index.ts +11 -11
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +45 -42
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectResItem.tsx +4 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditView.tsx +6 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectResItem.tsx +4 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceView.tsx +6 -1
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockSkuRef.tsx +16 -0
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockAudit.tsx +17 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockBalance.tsx +17 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockAudit.ts +31 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockBalance.ts +31 -2
- package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockPresentation.test.ts +116 -4
- package/vona/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +11 -11
- package/vona/src/suite/a-home/modules/home-base/src/.metadata/index.ts +0 -3
- package/vona/src/suite/a-home/modules/home-index/src/.metadata/index.ts +12 -13
- package/vona/src/suite/a-home/modules/home-user/package.json +9 -1
- package/vona/src/suite/a-home/modules/home-user/src/.metadata/index.ts +333 -78
- package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.activation.ts +21 -0
- package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.activationCurrent.ts +15 -0
- package/vona/src/{suite-vendor/a-vona/modules/a-mailconfirm → suite/a-home/modules/home-user}/src/bean/cacheRedis.passwordReset.ts +6 -2
- package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordResetCurrent.ts +15 -0
- package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordResetRecipient.ts +13 -0
- package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordSet.ts +22 -0
- package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordSetCurrent.ts +15 -0
- package/vona/src/suite/a-home/modules/home-user/src/bean/imageScene.homeUserAvatar.ts +18 -0
- package/vona/src/suite/a-home/modules/home-user/src/bean/meta.redlock.ts +18 -0
- package/vona/src/suite/a-home/modules/home-user/src/bean/meta.version.ts +0 -1
- package/vona/src/suite/a-home/modules/home-user/src/bean/zodRefine.passwordConfirm.ts +8 -4
- package/vona/src/suite/a-home/modules/home-user/src/config/config.ts +10 -1
- package/vona/src/suite/a-home/modules/home-user/src/config/locale/en-us.ts +35 -3
- package/vona/src/suite/a-home/modules/home-user/src/config/locale/zh-cn.ts +35 -3
- package/vona/src/suite/a-home/modules/home-user/src/controller/account.ts +147 -0
- package/vona/src/suite/a-home/modules/home-user/src/controller/passport.ts +27 -7
- package/vona/src/suite/a-home/modules/home-user/src/dto/accountActivation.ts +12 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/accountCurrent.ts +31 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordChange.ts +41 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordReset.ts +35 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordResetRequest.ts +20 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordResetRequestResult.ts +13 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordSet.ts +35 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordSetIssue.ts +15 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/accountProfileUpdate.ts +53 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/accountRelogin.ts +12 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/passport.ts +2 -2
- package/vona/src/suite/a-home/modules/home-user/src/dto/passportUser.ts +43 -0
- package/vona/src/suite/a-home/modules/home-user/src/dto/register.ts +40 -5
- package/vona/src/suite/a-home/modules/home-user/src/service/account.ts +693 -0
- package/vona/src/suite/a-home/modules/home-user/test/account.test.ts +249 -0
- package/vona/src/suite/a-home/modules/home-user/test/accountActivation.test.ts +344 -0
- package/vona/src/suite/a-home/modules/home-user/test/accountOpenapi.test.ts +158 -0
- package/vona/src/suite/a-home/modules/home-user/test/accountPasswordReset.test.ts +724 -0
- package/vona/src/suite/a-home/modules/home-user/test/accountPasswordSet.test.ts +799 -0
- package/vona/src/suite/a-training/modules/training-record/src/.metadata/index.ts +73 -65
- package/vona/src/suite/a-training/modules/training-recordsubject/src/.metadata/index.ts +26 -17
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +47 -39
- package/vona/src/suite/cabloy-basic/modules/basic-metrics/src/.metadata/index.ts +22 -23
- package/vona/src/suite/cabloy-basic/modules/basic-siteadmin/src/.metadata/index.ts +15 -15
- package/vona/src/suite/cabloy-basic/modules/basic-siteweb/src/.metadata/index.ts +11 -11
- package/vona/src/suite-vendor/a-auth/modules/a-auth/package.json +1 -1
- package/vona/src/suite-vendor/a-auth/modules/a-auth/src/.metadata/index.ts +55 -41
- package/vona/src/suite-vendor/a-auth/modules/auth-oauth/package.json +1 -1
- package/vona/src/suite-vendor/a-auth/modules/auth-oauth/src/.metadata/index.ts +8 -8
- package/vona/src/suite-vendor/a-auth/modules/auth-simple/package.json +4 -2
- package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/.metadata/index.ts +51 -27
- package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/bean/meta.redlock.ts +11 -0
- package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/service/authSimple.ts +53 -2
- package/vona/src/suite-vendor/a-auth/modules/auth-simple/test/authSimple.test.ts +56 -0
- package/vona/src/suite-vendor/a-auth/package.json +2 -2
- package/vona/src/suite-vendor/a-cabloy/modules/a-cabloy/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-cabloy/src/.metadata/index.ts +4 -4
- package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/src/.metadata/index.ts +23 -24
- package/vona/src/suite-vendor/a-cabloy/modules/a-datasource/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-datasource/src/.metadata/index.ts +31 -22
- package/vona/src/suite-vendor/{a-vona/modules/a-mailconfirm → a-cabloy/modules/a-rbac}/package.json +13 -5
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/index.ts +147 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/this.ts +2 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/bean.rbacCatalog.ts +95 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/bean.rbacScope.ts +218 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/event.policyInvalidated.ts +17 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/event.resolvePolicy.ts +13 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/guard.rbac.ts +102 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/index.ts +5 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/config/config.ts +10 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/index.ts +3 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/lib/index.ts +1 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/lib/rbac.ts +46 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/types/index.ts +2 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/types/rbac.ts +46 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/types/scope.ts +27 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/test/rbacCatalogGuard.test.ts +445 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/test/rbacScopeCurrent.test.ts +172 -0
- package/vona/src/suite-vendor/a-cabloy/modules/a-socket/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-socket/src/.metadata/index.ts +27 -31
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/.metadata/index.ts +37 -45
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssrhmr/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssrhmr/src/.metadata/index.ts +12 -12
- package/vona/src/suite-vendor/a-cabloy/modules/a-status/package.json +1 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-status/src/.metadata/index.ts +27 -19
- package/vona/src/suite-vendor/a-cabloy/package.json +2 -1
- package/vona/src/suite-vendor/a-cabloy/tsconfig.json +3 -0
- package/vona/src/suite-vendor/a-captcha/modules/a-captcha/package.json +1 -1
- package/vona/src/suite-vendor/a-captcha/modules/a-captcha/src/.metadata/index.ts +27 -29
- package/vona/src/suite-vendor/a-captcha/modules/captcha-simple/package.json +1 -1
- package/vona/src/suite-vendor/a-captcha/modules/captcha-simple/src/.metadata/index.ts +16 -17
- package/vona/src/suite-vendor/a-captcha/package.json +1 -1
- package/vona/src/suite-vendor/a-file/modules/a-file/package.json +1 -1
- package/vona/src/suite-vendor/a-file/modules/a-file/src/.metadata/index.ts +56 -38
- package/vona/src/suite-vendor/a-file/modules/file-cloudflare/package.json +1 -1
- package/vona/src/suite-vendor/a-file/modules/file-cloudflare/src/.metadata/index.ts +12 -13
- package/vona/src/suite-vendor/a-file/modules/file-native/package.json +1 -1
- package/vona/src/suite-vendor/a-file/modules/file-native/src/.metadata/index.ts +11 -12
- package/vona/src/suite-vendor/a-file/package.json +4 -4
- package/vona/src/suite-vendor/a-image/modules/a-image/package.json +1 -1
- package/vona/src/suite-vendor/a-image/modules/a-image/src/.metadata/index.ts +56 -38
- package/vona/src/suite-vendor/a-image/modules/image-cloudflare/package.json +1 -1
- package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/.metadata/index.ts +12 -13
- package/vona/src/suite-vendor/a-image/modules/image-native/package.json +1 -1
- package/vona/src/suite-vendor/a-image/modules/image-native/src/.metadata/index.ts +11 -12
- package/vona/src/suite-vendor/a-image/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/a-pay/src/.metadata/index.ts +0 -8
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/.metadata/index.ts +21 -22
- package/vona/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-paypal/src/.metadata/index.ts +8 -8
- package/vona/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
- package/vona/src/suite-vendor/a-pay/modules/pay-stripe/src/.metadata/index.ts +8 -8
- package/vona/src/suite-vendor/a-pay/package.json +5 -5
- package/vona/src/suite-vendor/a-paypal/modules/a-paypal/package.json +1 -1
- package/vona/src/suite-vendor/a-paypal/modules/a-paypal/src/.metadata/index.ts +46 -40
- package/vona/src/suite-vendor/a-paypal/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-aspect/cli/guard/boilerplate/{{sceneName}}.{{beanName}}.ts_ +6 -8
- package/vona/src/suite-vendor/a-vona/modules/a-aspect/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/.metadata/index.ts +8 -16
- package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/lib/utils/guardBase.ts +22 -0
- package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/lib/utils/index.ts +1 -0
- package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/types/guard.ts +4 -1
- package/vona/src/suite-vendor/a-vona/modules/a-aspectutils/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-aspectutils/src/.metadata/index.ts +8 -10
- package/vona/src/suite-vendor/a-vona/modules/a-bean/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-bean/src/.metadata/index.ts +4 -4
- package/vona/src/suite-vendor/a-vona/modules/a-beanmutate/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-beanmutate/src/.metadata/index.ts +17 -19
- package/vona/src/suite-vendor/a-vona/modules/a-body/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-body/src/.metadata/index.ts +12 -12
- package/vona/src/suite-vendor/a-vona/modules/a-body/src/bean/interceptor.bodyReq.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-body/src/types/bodyParser.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-broadcast/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-broadcast/src/.metadata/index.ts +8 -9
- package/vona/src/suite-vendor/a-vona/modules/a-cache/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-cache/src/.metadata/index.ts +14 -14
- package/vona/src/suite-vendor/a-vona/modules/a-caching/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-caching/src/.metadata/index.ts +8 -8
- package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-core/src/.metadata/index.ts +20 -22
- package/vona/src/suite-vendor/a-vona/modules/a-election/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-election/src/.metadata/index.ts +15 -16
- package/vona/src/suite-vendor/a-vona/modules/a-error/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-error/src/.metadata/index.ts +19 -21
- package/vona/src/suite-vendor/a-vona/modules/a-event/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-event/src/.metadata/index.ts +16 -18
- package/vona/src/suite-vendor/a-vona/modules/a-executor/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-executor/src/.metadata/index.ts +12 -13
- package/vona/src/suite-vendor/a-vona/modules/a-hmr/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-hmr/src/.metadata/index.ts +24 -28
- package/vona/src/suite-vendor/a-vona/modules/a-hmrbase/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-hmrbase/src/.metadata/index.ts +4 -4
- package/vona/src/suite-vendor/a-vona/modules/a-index/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-index/src/.metadata/index.ts +11 -13
- package/vona/src/suite-vendor/a-vona/modules/a-instance/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-instance/src/.metadata/index.ts +42 -35
- package/vona/src/suite-vendor/a-vona/modules/a-jwt/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-jwt/src/.metadata/index.ts +15 -17
- package/vona/src/suite-vendor/a-vona/modules/a-locale/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-locale/src/.metadata/index.ts +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-locale/src/main.ts +4 -1
- package/vona/src/suite-vendor/a-vona/modules/a-logger/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-logger/src/.metadata/index.ts +20 -20
- package/vona/src/suite-vendor/a-vona/modules/a-mail/package.json +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-mail/src/.metadata/index.ts +38 -30
- package/vona/src/suite-vendor/a-vona/modules/a-mail/src/types/config.ts +1 -0
- package/vona/src/suite-vendor/a-vona/modules/a-menu/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-menu/src/.metadata/index.ts +8 -8
- package/vona/src/suite-vendor/a-vona/modules/a-meta/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-meta/src/.metadata/index.ts +4 -4
- package/vona/src/suite-vendor/a-vona/modules/a-metrics/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-metrics/src/.metadata/index.ts +15 -18
- package/vona/src/suite-vendor/a-vona/modules/a-onion/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-onion/src/.metadata/index.ts +11 -11
- package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/.metadata/index.ts +15 -16
- package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/decorator.ts +2 -1
- package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/permissions.ts +24 -1
- package/vona/src/suite-vendor/a-vona/modules/a-openapischema/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-openapischema/src/.metadata/index.ts +17 -17
- package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/src/.metadata/index.ts +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/.metadata/index.ts +34 -39
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_view.ts +10 -6
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/columns_.ts +1 -2
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/databaseDialectBase_.ts +37 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transactionFiber_.ts +8 -2
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transaction_.ts +5 -8
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/columns.ts +1 -0
- package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/.metadata/index.ts +8 -8
- package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.mysql.ts +28 -0
- package/vona/src/suite-vendor/a-vona/modules/a-ormutils/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-ormutils/src/.metadata/index.ts +4 -4
- package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +4 -1
- package/vona/src/suite-vendor/a-vona/modules/a-permission/src/.metadata/index.ts +35 -22
- package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/bean.permission.ts +61 -8
- package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/event.retrievePermissionAction.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/summerCache.permissionActionByUser.ts +24 -0
- package/vona/src/suite-vendor/a-vona/modules/a-permission/src/dto/permissions.tsx +18 -1
- package/vona/src/suite-vendor/a-vona/modules/a-permission/test/permission.test.ts +340 -0
- package/vona/src/suite-vendor/a-vona/modules/a-play/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-play/src/.metadata/index.ts +13 -13
- package/vona/src/suite-vendor/a-vona/modules/a-printtip/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-printtip/src/.metadata/index.ts +11 -12
- package/vona/src/suite-vendor/a-vona/modules/a-queue/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-queue/src/.metadata/index.ts +15 -17
- package/vona/src/suite-vendor/a-vona/modules/a-ratelimit/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-ratelimit/src/.metadata/index.ts +0 -1
- package/vona/src/suite-vendor/a-vona/modules/a-redis/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-redis/src/.metadata/index.ts +12 -13
- package/vona/src/suite-vendor/a-vona/modules/a-redlock/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-redlock/src/.metadata/index.ts +7 -8
- package/vona/src/suite-vendor/a-vona/modules/a-retryable/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-retryable/src/.metadata/index.ts +8 -8
- package/vona/src/suite-vendor/a-vona/modules/a-runtime/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-runtime/src/.metadata/index.ts +12 -13
- package/vona/src/suite-vendor/a-vona/modules/a-schedule/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-schedule/src/.metadata/index.ts +23 -26
- package/vona/src/suite-vendor/a-vona/modules/a-security/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-security/src/.metadata/index.ts +12 -12
- package/vona/src/suite-vendor/a-vona/modules/a-security/src/bean/bean.security.ts +78 -0
- package/vona/src/suite-vendor/a-vona/modules/a-security/src/bean/middlewareSystem.cors.ts +4 -2
- package/vona/src/suite-vendor/a-vona/modules/a-security/src/index.ts +1 -0
- package/vona/src/suite-vendor/a-vona/modules/a-security/src/types/index.ts +7 -0
- package/vona/src/suite-vendor/a-vona/modules/a-security/test/origin.test.ts +178 -0
- package/vona/src/suite-vendor/a-vona/modules/a-serialization/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-serialization/src/.metadata/index.ts +16 -16
- package/vona/src/suite-vendor/a-vona/modules/a-startup/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-startup/src/.metadata/index.ts +19 -22
- package/vona/src/suite-vendor/a-vona/modules/a-static/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-static/src/.metadata/index.ts +13 -14
- package/vona/src/suite-vendor/a-vona/modules/a-summer/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-summer/src/.metadata/index.ts +10 -10
- package/vona/src/suite-vendor/a-vona/modules/a-swagger/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-swagger/src/.metadata/index.ts +16 -17
- package/vona/src/suite-vendor/a-vona/modules/a-telemetry/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-telemetry/src/.metadata/index.ts +15 -16
- package/vona/src/suite-vendor/a-vona/modules/a-upload/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-upload/src/.metadata/index.ts +8 -8
- package/vona/src/suite-vendor/a-vona/modules/a-user/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-user/src/.metadata/index.ts +26 -35
- package/vona/src/suite-vendor/a-vona/modules/a-user/src/bean/guard.passport.ts +4 -2
- package/vona/src/suite-vendor/a-vona/modules/a-user/src/bean/guard.roleName.ts +5 -23
- package/vona/src/suite-vendor/a-vona/modules/a-user/src/lib/passport.ts +17 -2
- package/vona/src/suite-vendor/a-vona/modules/a-validation/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-validation/src/.metadata/index.ts +7 -7
- package/vona/src/suite-vendor/a-vona/modules/a-version/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-version/src/.metadata/index.ts +62 -37
- package/vona/src/suite-vendor/a-vona/modules/a-vona/package.json +1 -2
- package/vona/src/suite-vendor/a-vona/modules/a-vona/src/.metadata/index.ts +4 -4
- package/vona/src/suite-vendor/a-vona/modules/a-web/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-web/src/.metadata/index.ts +27 -30
- package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/decorator/arguments.ts +5 -0
- package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/decorator/pipesArgument.ts +3 -1
- package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/middleware/extractValue.ts +5 -0
- package/vona/src/suite-vendor/a-vona/modules/a-web/src/types/controller.ts +3 -0
- package/vona/src/suite-vendor/a-vona/modules/a-worker/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-worker/src/.metadata/index.ts +15 -15
- package/vona/src/suite-vendor/a-vona/modules/a-zod/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-zod/src/.metadata/index.ts +4 -4
- package/vona/src/suite-vendor/a-vona/package.json +2 -3
- package/vona/src/suite-vendor/a-vona/tsconfig.json +0 -3
- package/zova/env/.env.admin +1 -0
- package/zova/env/.env.ssr.web +0 -1
- package/zova/env/.env.web +1 -0
- package/zova/package.original.json +1 -1
- package/zova/packages-cli/cli/package.json +2 -2
- package/zova/packages-cli/cli-set-front/package.json +1 -1
- package/zova/packages-cli/cli-set-front/src/lib/bean/cli.openapi.generate.ts +15 -4
- package/zova/packages-cli/cli-set-front/src/lib/bean/cli.tools.metadata.ts +1 -0
- package/zova/packages-utils/zova-jsx/package.json +2 -2
- package/zova/packages-zova/zova/package.json +3 -3
- package/zova/packages-zova/zova-core/package.json +1 -1
- package/zova/packages-zova/zova-core/src/core/component/locale.ts +10 -3
- package/zova/packages-zova/zova-core/src/core/sys/util.ts +6 -0
- package/zova/pnpm-lock.yaml +94 -25
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +21 -21
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/schemas.ts +92 -46
- package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/types.ts +834 -499
- package/zova/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +22 -22
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/schemas.ts +104 -50
- package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/types.ts +1202 -667
- package/zova/src/suite/a-commerce/modules/commerce-payment/src/.metadata/index.ts +5 -5
- package/zova/src/suite/a-commerce/modules/commerce-promotion/src/.metadata/index.ts +18 -18
- package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/schemas.ts +136 -62
- package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/types.ts +1564 -874
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/index.ts +24 -24
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/schemas.ts +413 -59
- package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/types.ts +6290 -1946
- package/zova/src/suite/a-commerce/modules/commerce-siteweb/src/.metadata/index.ts +5 -5
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +29 -29
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +112 -58
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +980 -721
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/bean/tableCell.actionRefund.tsx +1 -1
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/bean/tableCell.actionShip.tsx +1 -1
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/payment/controller.tsx +1 -3
- package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +23 -23
- package/zova/src/suite/a-demo/modules/demo-todo/src/.metadata/index.ts +17 -17
- package/zova/src/suite/a-devui/modules/devui-adapter/src/.metadata/index.ts +10 -10
- package/zova/src/suite/a-home/modules/home-api/cli/openapi.config.ts +1 -0
- package/zova/src/suite/a-home/modules/home-api/mock/passport.fake.ts +1 -1
- package/zova/src/suite/a-home/modules/home-api/src/.metadata/index.ts +61 -31
- package/zova/src/suite/a-home/modules/home-api/src/api/homeUserAccount.ts +171 -0
- package/zova/src/suite/a-home/modules/home-api/src/api/openapi/schemas.ts +96 -50
- package/zova/src/suite/a-home/modules/home-api/src/api/openapi/types.ts +857 -504
- package/zova/src/suite/a-home/modules/home-api/src/apiSchema/homeUserAccount.ts +62 -0
- package/zova/src/suite/a-home/modules/home-base/assets/img/avatar_user.png +0 -0
- package/zova/src/suite/a-home/modules/home-base/src/.metadata/index.ts +16 -16
- package/zova/src/suite/a-home/modules/home-base/src/config/config.ts +5 -0
- package/zova/src/suite/a-home/modules/home-base/src/service/routerGuards.ts +1 -8
- package/zova/src/suite/a-home/modules/home-icon/src/.metadata/index.ts +5 -5
- package/zova/src/suite/a-home/modules/home-indexadmin/src/.metadata/index.ts +11 -11
- package/zova/src/suite/a-home/modules/home-indexweb/src/.metadata/index.ts +9 -9
- package/zova/src/suite/a-home/modules/home-layoutadmin/src/.metadata/index.ts +19 -19
- package/zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/render.user.tsx +19 -2
- package/zova/src/suite/a-home/modules/home-layoutadmin/src/config/locale/en-us.ts +1 -0
- package/zova/src/suite/a-home/modules/home-layoutadmin/src/config/locale/zh-cn.ts +1 -0
- package/zova/src/suite/a-home/modules/home-layoutempty/src/.metadata/index.ts +7 -7
- package/zova/src/suite/a-home/modules/home-layoutweb/src/.metadata/component/layoutWeb.ts +1 -0
- package/zova/src/suite/a-home/modules/home-layoutweb/src/.metadata/index.ts +23 -15
- package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.header.tsx +1 -0
- package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.tsx +4 -0
- package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.user.tsx +68 -0
- package/zova/src/suite/a-home/modules/home-layoutweb/src/config/locale/en-us.ts +11 -8
- package/zova/src/suite/a-home/modules/home-layoutweb/src/config/locale/zh-cn.ts +11 -8
- package/zova/src/suite/a-home/modules/home-login/src/.metadata/index.ts +38 -18
- package/zova/src/suite/a-home/modules/home-login/src/.metadata/page/passwordResetRequest.ts +9 -0
- package/zova/src/suite/a-home/modules/home-login/src/.metadata/page/register.ts +5 -0
- package/zova/src/suite/a-home/modules/home-login/src/config/locale/en-us.ts +14 -0
- package/zova/src/suite/a-home/modules/home-login/src/config/locale/zh-cn.ts +12 -0
- package/zova/src/suite/a-home/modules/home-login/src/page/login/controller.tsx +10 -0
- package/zova/src/suite/a-home/modules/home-login/src/page/login/render.tsx +14 -0
- package/zova/src/suite/a-home/modules/home-login/src/page/passwordResetRequest/controller.tsx +130 -0
- package/zova/src/suite/a-home/modules/home-login/src/page/register/controller.tsx +124 -0
- package/zova/src/suite/a-home/modules/home-login/src/routes.ts +20 -0
- package/zova/src/suite/a-home/modules/home-passport/src/.metadata/index.ts +8 -8
- package/zova/src/suite/a-home/modules/home-passport/src/lib/permissionActionMatcher.ts +37 -0
- package/zova/src/suite/a-home/modules/home-passport/src/model/passport.ts +32 -12
- package/zova/src/suite/a-home/modules/home-passport/test/lib/permissionActionMatcher.test.ts +80 -0
- package/zova/src/suite/a-home/modules/home-theme/src/.metadata/index.ts +13 -13
- package/zova/src/suite/a-home/modules/home-user/package.json +60 -0
- package/zova/src/suite/a-home/modules/home-user/src/.metadata/index.ts +168 -0
- package/zova/src/suite/a-home/modules/home-user/src/.metadata/locales.ts +7 -0
- package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/account.ts +5 -0
- package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/activation.ts +16 -0
- package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/passwordReset.ts +16 -0
- package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/passwordSet.ts +16 -0
- package/zova/src/suite/a-home/modules/home-user/src/.metadata/this.ts +2 -0
- package/zova/src/suite/a-home/modules/home-user/src/config/locale/en-us.ts +52 -0
- package/zova/src/suite/a-home/modules/home-user/src/config/locale/zh-cn.ts +49 -0
- package/zova/src/suite/a-home/modules/home-user/src/index.ts +2 -0
- package/zova/src/suite/a-home/modules/home-user/src/model/account.ts +126 -0
- package/zova/src/suite/a-home/modules/home-user/src/page/account/controller.tsx +357 -0
- package/zova/src/suite/a-home/modules/home-user/src/page/activation/controller.tsx +83 -0
- package/zova/src/suite/a-home/modules/home-user/src/page/passwordReset/controller.tsx +138 -0
- package/zova/src/suite/a-home/modules/home-user/src/page/passwordSet/controller.tsx +138 -0
- package/zova/src/suite/a-home/modules/home-user/src/routes.ts +44 -0
- package/zova/src/suite/a-home/modules/home-user/tsconfig.build.json +13 -0
- package/zova/src/suite/a-home/modules/home-user/tsconfig.json +5 -0
- package/zova/src/suite/a-home/package.json +2 -1
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +25 -25
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +136 -62
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +1601 -884
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +1 -1
- package/zova/src/suite/cabloy-basic/modules/basic-adapter/src/.metadata/index.ts +4 -4
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/index.ts +12 -12
- package/zova/src/suite/cabloy-basic/modules/basic-captcha/src/.metadata/index.ts +8 -8
- package/zova/src/suite/cabloy-basic/modules/basic-commands/src/.metadata/index.ts +9 -9
- package/zova/src/suite/cabloy-basic/modules/basic-commandssync/src/.metadata/index.ts +9 -9
- package/zova/src/suite/cabloy-basic/modules/basic-currency/src/.metadata/index.ts +13 -13
- package/zova/src/suite/cabloy-basic/modules/basic-date/src/.metadata/index.ts +13 -13
- package/zova/src/suite/cabloy-basic/modules/basic-details/src/.metadata/index.ts +21 -21
- package/zova/src/suite/cabloy-basic/modules/basic-file/src/.metadata/index.ts +26 -26
- package/zova/src/suite/cabloy-basic/modules/basic-file/src/api/openapi/schemas.ts +417 -59
- package/zova/src/suite/cabloy-basic/modules/basic-file/src/api/openapi/types.ts +6316 -1926
- package/zova/src/suite/cabloy-basic/modules/basic-form/src/.metadata/index.ts +12 -12
- package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/component/imageUploader.ts +31 -0
- package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/index.ts +39 -26
- package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/schemas.ts +417 -59
- package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/types.ts +6316 -1926
- package/zova/src/suite/cabloy-basic/modules/basic-image/src/component/formFieldImage/controller.tsx +194 -514
- package/zova/src/suite/cabloy-basic/modules/basic-image/src/component/imageUploader/controller.tsx +386 -0
- package/zova/src/suite/cabloy-basic/modules/basic-image/src/config/locale/en-us.ts +1 -0
- package/zova/src/suite/cabloy-basic/modules/basic-image/src/config/locale/zh-cn.ts +1 -0
- package/zova/src/suite/cabloy-basic/modules/basic-image/src/lib/imageTransform.tsx +296 -0
- package/zova/src/suite/cabloy-basic/modules/basic-image/src/lib/index.ts +1 -0
- package/zova/src/suite/cabloy-basic/modules/basic-input/src/.metadata/index.ts +9 -9
- package/zova/src/suite/cabloy-basic/modules/basic-metrics/src/.metadata/index.ts +19 -19
- package/zova/src/suite/cabloy-basic/modules/basic-page/src/.metadata/index.ts +8 -8
- package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/.metadata/index.ts +8 -8
- package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx +9 -2
- package/zova/src/suite/cabloy-basic/modules/basic-resource/src/.metadata/index.ts +13 -13
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/.metadata/index.ts +13 -13
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/bean/tableCell.select.tsx +2 -3
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +2 -3
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +7 -7
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/lib/utils.ts +5 -0
- package/zova/src/suite/cabloy-basic/modules/basic-select/test/lib/utils.test.ts +28 -0
- package/zova/src/suite/cabloy-basic/modules/basic-table/src/.metadata/index.ts +16 -16
- package/zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx +3 -1
- package/zova/src/suite/cabloy-basic/modules/basic-text/src/.metadata/index.ts +13 -13
- package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/package.json +52 -0
- package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/index.ts +26 -0
- package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/this.ts +2 -0
- package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/src/index.ts +1 -0
- package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/tsconfig.build.json +13 -0
- package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/tsconfig.json +5 -0
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/package.json +1 -1
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/index.ts +15 -15
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/lib/deleteRequest.ts +12 -0
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts +12 -6
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/test/lib/deleteRequest.test.ts +37 -0
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/test/model/resource.types.ts +24 -0
- package/zova/src/suite-vendor/a-cabloy/package.json +3 -2
- package/zova/src/suite-vendor/a-pay/modules/a-pay/cli/openapi.config.ts +1 -1
- package/zova/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
- package/zova/src/suite-vendor/a-pay/modules/a-pay/src/.metadata/index.ts +43 -43
- package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/openapi/schemas.ts +120 -58
- package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/openapi/types.ts +1408 -938
- package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/payPaymentSession.ts +74 -0
- package/zova/src/suite-vendor/a-pay/modules/a-pay/src/apiSchema/payPaymentSession.ts +25 -0
- package/zova/src/suite-vendor/a-pay/modules/a-pay/src/model/paymentSession.ts +3 -3
- package/zova/src/suite-vendor/a-pay/modules/pay-mock/cli/openapi.config.ts +1 -1
- package/zova/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
- package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/.metadata/index.ts +34 -34
- package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/openapi/schemas.ts +140 -66
- package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/openapi/types.ts +1621 -891
- package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/payMockMockPayment.ts +34 -0
- package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/apiSchema/payMockMockPayment.ts +13 -0
- package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/model/payMockPayment.ts +3 -3
- package/zova/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
- package/zova/src/suite-vendor/a-pay/modules/pay-paypal/src/.metadata/index.ts +4 -4
- package/zova/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
- package/zova/src/suite-vendor/a-pay/modules/pay-stripe/src/.metadata/index.ts +4 -4
- package/zova/src/suite-vendor/a-pay/package.json +5 -5
- package/zova/src/suite-vendor/a-zova/modules/a-api/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-api/src/.metadata/index.ts +7 -7
- package/zova/src/suite-vendor/a-zova/modules/a-app/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-app/src/.metadata/index.ts +8 -8
- package/zova/src/suite-vendor/a-zova/modules/a-bean/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-bean/src/.metadata/index.ts +15 -15
- package/zova/src/suite-vendor/a-zova/modules/a-behavior/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-behavior/src/.metadata/index.ts +25 -25
- package/zova/src/suite-vendor/a-zova/modules/a-behaviors/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-behaviors/src/.metadata/index.ts +9 -9
- package/zova/src/suite-vendor/a-zova/modules/a-boundary/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-boundary/src/.metadata/index.ts +5 -5
- package/zova/src/suite-vendor/a-zova/modules/a-command/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-command/src/.metadata/index.ts +5 -5
- package/zova/src/suite-vendor/a-zova/modules/a-fetch/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-fetch/src/.metadata/index.ts +14 -14
- package/zova/src/suite-vendor/a-zova/modules/a-form/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-form/src/.metadata/index.ts +12 -12
- package/zova/src/suite-vendor/a-zova/modules/a-icon/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-icon/src/.metadata/index.ts +18 -18
- package/zova/src/suite-vendor/a-zova/modules/a-interceptor/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-interceptor/src/.metadata/index.ts +8 -8
- package/zova/src/suite-vendor/a-zova/modules/a-logger/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-logger/src/.metadata/index.ts +9 -9
- package/zova/src/suite-vendor/a-zova/modules/a-meta/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-meta/src/.metadata/index.ts +5 -5
- package/zova/src/suite-vendor/a-zova/modules/a-model/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-model/src/.metadata/index.ts +12 -12
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +3 -2
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/.metadata/index.ts +13 -13
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/monkey.ts +16 -27
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts +18 -1
- package/zova/src/suite-vendor/a-zova/modules/a-router/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/.metadata/index.ts +27 -27
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkey.ts +9 -6
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkeySys.ts +15 -5
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/router.ts +2 -2
- package/zova/src/suite-vendor/a-zova/modules/a-routerstack/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-routerstack/src/.metadata/index.ts +13 -13
- package/zova/src/suite-vendor/a-zova/modules/a-routertabs/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-routertabs/src/.metadata/index.ts +13 -13
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/.metadata/index.ts +9 -9
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssr.ts +15 -4
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrNavigation.ts +40 -0
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrProfile.ts +6 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/monkey.ts +20 -6
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/test/lib/ssrNavigation.test.ts +69 -0
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/test/lib/ssrProfile.test.ts +25 -6
- package/zova/src/suite-vendor/a-zova/modules/a-ssrhmr/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssrhmr/src/.metadata/index.ts +4 -4
- package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/src/.metadata/index.ts +10 -10
- package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/src/service/ssrHandler.ts +1 -2
- package/zova/src/suite-vendor/a-zova/modules/a-style/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-style/src/.metadata/index.ts +9 -9
- package/zova/src/suite-vendor/a-zova/modules/a-style/src/bean/bean.theme.ts +2 -2
- package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-table/src/.metadata/index.ts +12 -12
- package/zova/src/suite-vendor/a-zova/modules/a-zod/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-zod/src/.metadata/index.ts +9 -9
- package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/modules/a-zova/src/.metadata/index.ts +5 -5
- package/zova/src/suite-vendor/a-zova/package.json +26 -26
- package/vona/src/suite/a-home/modules/home-user/src/bean/eventListener.emailConfirmCallback.ts +0 -32
- package/vona/src/suite/a-home/modules/home-user/src/bean/eventListener.passwordResetCallback.ts +0 -30
- package/vona/src/suite/a-home/modules/home-user/src/bean/eventListener.register.ts +0 -27
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/index.ts +0 -207
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/locales.ts +0 -18
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/this.ts +0 -2
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/bean.mailConfirm.ts +0 -63
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/cacheRedis.emailConfirm.ts +0 -17
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/event.emailConfirmCallback.ts +0 -13
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/event.passwordResetCallback.ts +0 -13
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/en-us.ts +0 -13
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/mail/en-us.ts +0 -29
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/mail/zh-cn.ts +0 -29
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/zh-cn.ts +0 -13
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/controller/mail.ts +0 -34
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/index.ts +0 -2
- package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/paymentSession.ts +0 -74
- package/zova/src/suite-vendor/a-pay/modules/a-pay/src/apiSchema/paymentSession.ts +0 -25
- package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/payMockPayment.ts +0 -34
- package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/apiSchema/payMockPayment.ts +0 -13
- /package/vona/patches/{zova-core@5.1.84.patch → zova-core@5.1.85.patch} +0 -0
- /package/vona/src/suite-vendor/{a-vona/modules/a-mailconfirm → a-cabloy/modules/a-rbac}/tsconfig.build.json +0 -0
- /package/vona/src/suite-vendor/{a-vona/modules/a-mailconfirm → a-cabloy/modules/a-rbac}/tsconfig.json +0 -0
package/.cabloy-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
5.1.
|
|
1
|
+
5.1.138
|
|
@@ -141,6 +141,19 @@ Check whether the feature needs:
|
|
|
141
141
|
- OpenAPI metadata
|
|
142
142
|
- inferred DTO generation
|
|
143
143
|
|
|
144
|
+
### Conditional RBAC metadata
|
|
145
|
+
|
|
146
|
+
When the active edition and installed modules provide `@Passport.rbac(...)` and the task adds or changes a decorated action:
|
|
147
|
+
|
|
148
|
+
- verify the decorator, RBAC catalog, and any policy-catalog/editor consumer in the active source before making availability claims
|
|
149
|
+
- provide locale-aware `summary` metadata at both the controller and action levels; these scopes are independent and must be authored explicitly
|
|
150
|
+
- add locale-aware `description` metadata only when the business or administrative experience needs explanatory text
|
|
151
|
+
- keep action keys, controller bean names, action names, routes, and other authorization/integration identifiers stable and nonlocalized
|
|
152
|
+
- treat summary/description as presentation metadata, not authorization identity or enforcement
|
|
153
|
+
- verify the explicit server-side catalog/editor projection; do not assume OpenAPI metadata is automatically displayed by a policy editor
|
|
154
|
+
|
|
155
|
+
For the authoring example and metadata boundary, read [Controller Guide](../../../cabloy-docs/backend/controller-guide.md#rbac-presentation-metadata) and [Controller AOP Guide](../../../cabloy-docs/backend/controller-aop-guide.md#rbac-presentation-metadata).
|
|
156
|
+
|
|
144
157
|
### Persistence and schema lifecycle
|
|
145
158
|
|
|
146
159
|
Check whether the feature needs:
|
|
@@ -26,6 +26,17 @@ After generating or extending a backend thread, check which follow-up layers app
|
|
|
26
26
|
- treat `v.object(...)`, `v.array(...)`, `v.optional()`, `v.nullable()`, `v.default(...)`, and preprocess/transform wrappers as structure-shaping rather than metadata-only
|
|
27
27
|
- after touching structure-shaping schemaLike, verify the emitted schema/OpenAPI result explicitly
|
|
28
28
|
|
|
29
|
+
### Conditional RBAC metadata follow-up
|
|
30
|
+
|
|
31
|
+
When the active edition and installed modules provide `@Passport.rbac(...)` and a task adds or changes a decorated action:
|
|
32
|
+
|
|
33
|
+
- verify the decorator, RBAC catalog, and any policy-catalog/editor consumer in the active source before making availability claims
|
|
34
|
+
- provide locale-aware `summary` metadata at both the controller and action levels; these scopes are independent and must be authored explicitly
|
|
35
|
+
- add locale-aware `description` metadata only when the business or administrative experience needs explanatory text
|
|
36
|
+
- keep action keys, controller bean names, action names, routes, and other authorization/integration identifiers stable and nonlocalized
|
|
37
|
+
- treat summary/description as presentation metadata, not authorization identity or enforcement
|
|
38
|
+
- verify the explicit server-side catalog/editor projection; do not assume OpenAPI metadata is automatically displayed by a policy editor
|
|
39
|
+
|
|
29
40
|
## Persistence follow-up
|
|
30
41
|
|
|
31
42
|
- migration/version changes
|
|
@@ -226,6 +226,23 @@ Important Cabloy Basic reverse-sync rule:
|
|
|
226
226
|
|
|
227
227
|
For Cabloy Start, verify the exact Start-specific flavor names, paths, SSR site baselines, and project assets in the licensed Start repo.
|
|
228
228
|
|
|
229
|
+
### Schema-driven UI decision branch
|
|
230
|
+
|
|
231
|
+
When the regenerated contract feeds a form or another metadata-driven UI, decide the ownership path before adding frontend field definitions:
|
|
232
|
+
|
|
233
|
+
1. Put reusable field meaning, validation, titles, ordering, and renderer metadata on the backend entity or inferred contract when those semantics are shared; put operation-specific projection or composition in the DTO.
|
|
234
|
+
2. Identify the frontend consumer surface:
|
|
235
|
+
- generated `$api` for executing an operation;
|
|
236
|
+
- generated `$apiSchema` for a named schema facade;
|
|
237
|
+
- `$sdk` or `ModelResource` for dynamic schema/resource access;
|
|
238
|
+
- a direct page form for a local, non-resource workflow.
|
|
239
|
+
3. Prefer automatic `ZForm` rendering when the resolved schema already carries the field metadata. A `ZForm` with `schema` and no default body slot iterates schema properties automatically; use `slotFooter` or other structural slots for page-specific actions without replacing the automatic body. A default body slot is an intentional manual/mixed-composition boundary and must render the required fields deliberately.
|
|
240
|
+
4. Treat localized schemas as locale-scoped runtime state. Do not retain a `createApiSchemas(...)` facade, its `requestBody`, or an `omit`/`pick`/other transformed snapshot across a locale change. Reacquire the current schema through a getter, `$computed`, or the owning `ModelResource`; perform page-specific schema transformations inside that reactive derivation and ensure the current facade's SDK query is ready. `staleTime: Infinity` is cache behavior within a selected runtime, not cross-locale schema validity.
|
|
241
|
+
5. Keep reusable query, cache, mutation, invalidation, and resource state in `ModelResource` or a model. A page-specific action may call generated `$api` directly when it has no shared state or cache ownership; do not add an infrequently used operation to a shared model only for API indirection.
|
|
242
|
+
6. If the page needs a custom renderer, layout, or behavior, determine whether that resource is frontend-owned and referenced by backend metadata. If so, follow the reverse-chain flavor build and `deps:vona` handoff rather than treating the change as frontend-only.
|
|
243
|
+
|
|
244
|
+
Read the [API Schema Guide](../../../cabloy-docs/frontend/api-schema-guide.md), [Form Guide](../../../cabloy-docs/frontend/form-guide.md), [A-OpenAPI Under the Hood](../../../cabloy-docs/frontend/a-openapi-under-the-hood.md), and [Model Resource Owner Pattern](../../../cabloy-docs/frontend/model-resource-owner-pattern.md) for the ownership and runtime details. Use `references/contract-loop-map.md` and `references/verification-checklist.md` for the contract-loop proof steps.
|
|
245
|
+
|
|
229
246
|
### Path C: Downstream frontend alignment
|
|
230
247
|
|
|
231
248
|
After generation, inspect whether the frontend still needs follow-up in:
|
|
@@ -122,16 +122,50 @@ Typical frontend thread pieces may include:
|
|
|
122
122
|
|
|
123
123
|
Do not throw away the generated structure and rewrite it from scratch unless the generator clearly does not match the task.
|
|
124
124
|
|
|
125
|
+
### Relative import suffix follow-up
|
|
126
|
+
|
|
127
|
+
For Zova application modules under `zova/src/module/**`, `zova/src/module-vendor/**`,
|
|
128
|
+
`zova/src/suite/**/modules/**`, and `zova/src/suite-vendor/**/modules/**`, relative
|
|
129
|
+
imports and exports name the emitted ESM file:
|
|
130
|
+
|
|
131
|
+
- a `.ts` target uses `.js`
|
|
132
|
+
- a `.tsx` target uses `.jsx`
|
|
133
|
+
|
|
134
|
+
Apply this to ordinary and type-only imports, relative re-exports, and module tests.
|
|
135
|
+
Keep the generated `.js`/`.jsx` specifiers as the baseline after CLI generation or
|
|
136
|
+
metadata refresh; manual follow-up imports must use the same emitted suffix.
|
|
137
|
+
|
|
138
|
+
Do not apply this rule globally. Preserve deliberate `.ts`/`.tsx` imports in
|
|
139
|
+
`zova/packages-utils/**` and `zova/packages-zova/**`; do not normalize Vona, CLI or
|
|
140
|
+
template source, dependencies, generated output, or build artifacts. Never use a
|
|
141
|
+
repository-wide suffix replacement: inspect only the affected module thread.
|
|
142
|
+
|
|
125
143
|
## Step 5: Apply frontend follow-up logic deliberately
|
|
126
144
|
|
|
127
145
|
Frontend scaffolding is rarely complete after generation alone. Treat this follow-up review as mandatory.
|
|
128
146
|
|
|
129
147
|
### Route and metadata follow-up
|
|
130
148
|
|
|
149
|
+
Before finalizing every new or changed route, resolve the effective route defaults rather than relying on an unexamined omission:
|
|
150
|
+
|
|
151
|
+
- **layout** — omitted `meta.layout` inherits the logical default layout;
|
|
152
|
+
- **authentication** — omitted `requiresAuth` remains protected by the current guard, and only `requiresAuth: false` opts out;
|
|
153
|
+
- **SSR profile** — omitted `meta.ssrProfile` inherits the active flavor's `SSR_PROFILE`, while route metadata overrides it.
|
|
154
|
+
|
|
155
|
+
For Zova page routes, also apply these authoring defaults:
|
|
156
|
+
|
|
157
|
+
- routes with dynamic params require `route.name`; static routes should omit `route.name` unless a documented named-route requirement exists;
|
|
158
|
+
- ordinary business routes without `locale` params should omit app-config aliases unless a documented system, compatibility, or user-facing URL exception requires one;
|
|
159
|
+
- choose `ssrProfile` from the route's rendering contract: Web remains `public` by default, while `session` is explicit for cookie-backed state, protected admission, personalized first paint, or private SSR data; a missing `locale` parameter alone does not determine the profile; anonymous admission remains an explicit `requiresAuth: false` decision.
|
|
160
|
+
|
|
161
|
+
Verify the active edition and flavor before applying concrete SSR defaults, and do not add all three fields redundantly when intentional inheritance is the desired behavior.
|
|
162
|
+
|
|
131
163
|
Check whether the feature needs:
|
|
132
164
|
|
|
133
165
|
- page route review
|
|
134
166
|
- params/query schema alignment
|
|
167
|
+
- effective layout, authentication, and SSR-profile default resolution
|
|
168
|
+
- static-name and ordinary-alias exception review
|
|
135
169
|
- alias or guard review
|
|
136
170
|
- metadata regeneration
|
|
137
171
|
|
|
@@ -175,6 +209,7 @@ Check whether the feature needs:
|
|
|
175
209
|
- typecheck
|
|
176
210
|
- build
|
|
177
211
|
- metadata regeneration verification
|
|
212
|
+
- scoped relative-import verification: check the affected Zova module tree for accidental `.ts`/`.tsx` relative specifiers, while excluding intentional package source under `zova/packages-utils/**` and `zova/packages-zova/**`
|
|
178
213
|
- SSR or route-path verification
|
|
179
214
|
- hydration-time initial-render equivalence when SSR, private state, browser-only state, or async model state changes
|
|
180
215
|
- edition-specific flavor, SSR site baseline, and project-asset verification
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
{
|
|
17
17
|
"id": 3,
|
|
18
18
|
"prompt": "I changed a route and component structure in Cabloy Basic and now I am not sure what else I should update. What should Claude check before saying the frontend work is done?",
|
|
19
|
-
"expected_output": "
|
|
19
|
+
"expected_output": "Resolves the effective layout, authentication, and SSR-profile choices for each changed route; confirms static-name and ordinary-alias decisions, params/name implications, metadata regeneration, page/component/API/model or SSR impact, and route/SSR verification commands.",
|
|
20
20
|
"files": []
|
|
21
21
|
},
|
|
22
22
|
{
|
|
@@ -8,6 +8,9 @@ After generating or extending a frontend thread, check which follow-up layers ap
|
|
|
8
8
|
- component wrapper usage
|
|
9
9
|
- route record implications
|
|
10
10
|
- params/query schema alignment
|
|
11
|
+
- [ ] resolve the route-default triad: effective `layout`, `requiresAuth`, and `ssrProfile`; confirm every omitted field intentionally inherits the active default
|
|
12
|
+
- [ ] static routes omit `route.name` unless a documented named-route requirement exists; ordinary business routes without `locale` params omit app-config aliases unless an explicit exception applies
|
|
13
|
+
- [ ] choose `ssrProfile` from the route's rendering contract (Web remains `public` by default; `session` is explicit for cookie-backed state, protected admission, personalized first paint, or private SSR data); a missing `locale` parameter alone does not determine it, and anonymous access is chosen independently with explicit `requiresAuth: false`
|
|
11
14
|
|
|
12
15
|
## Data and contract follow-up
|
|
13
16
|
|
|
@@ -35,6 +38,7 @@ After generating or extending a frontend thread, check which follow-up layers ap
|
|
|
35
38
|
- `:tools:metadata`
|
|
36
39
|
- route/component/icon regeneration-sensitive changes
|
|
37
40
|
- edition-specific generated output review
|
|
41
|
+
- for a `this.scope.locale` missing-key or type error: inspect `src/config/locale/`; if it is absent, run `npm run zova :init:locale <module>` (which refreshes metadata in its normal path), add the key to all required locale files, and run `npm run zova :tools:metadata <module>` if generated typing remains stale; do not cast around the error or add a local locale compatibility helper
|
|
38
42
|
|
|
39
43
|
## Verification follow-up
|
|
40
44
|
|
|
@@ -91,6 +91,13 @@ For compact procedural summaries inside the skill bundle, also use:
|
|
|
91
91
|
- `references/analysis-modes.md`
|
|
92
92
|
- `references/core-reading-paths.md`
|
|
93
93
|
|
|
94
|
+
For locale-sensitive schema/form questions, also read:
|
|
95
|
+
|
|
96
|
+
- `cabloy-docs/frontend/api-schema-guide.md`
|
|
97
|
+
- `cabloy-docs/frontend/a-openapi-under-the-hood.md`
|
|
98
|
+
- `cabloy-docs/frontend/form-guide.md`
|
|
99
|
+
- `cabloy-docs/frontend/zova-form-under-the-hood.md`
|
|
100
|
+
|
|
94
101
|
### Core architecture surfaces
|
|
95
102
|
|
|
96
103
|
Use these when the question needs broader architectural context:
|
|
@@ -117,6 +124,20 @@ Use these bundled references to keep the workflow compact:
|
|
|
117
124
|
|
|
118
125
|
Use the public `cabloy-docs/frontend/zova-source-reading-map.md` as the fuller explanation layer, but use the bundled references first when they are enough for the current task.
|
|
119
126
|
|
|
127
|
+
### Locale-sensitive schema and form path
|
|
128
|
+
|
|
129
|
+
When a translated schema title, renderer, or validation surface remains stale after a locale change, read in this order:
|
|
130
|
+
|
|
131
|
+
1. the public API Schema Guide and A-OpenAPI Under the Hood guide;
|
|
132
|
+
2. the public Form Guide and Zova Form Under the Hood guide when a `ZForm` consumes the schema;
|
|
133
|
+
3. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/monkey.ts` to verify that the active locale replaces the selected `ModelSdk`;
|
|
134
|
+
4. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/model/sdk.ts` to inspect selector-scoped schema queries and `createApiSchemas(...)` facade lifetime;
|
|
135
|
+
5. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/bean/sys.sdk.ts` to verify locale headers and schema caches;
|
|
136
|
+
6. the generated API-schema bean and the actual page/model consumer that stores or derives the facade;
|
|
137
|
+
7. `zova/src/suite-vendor/a-zova/modules/a-form/` only after confirming which schema the form owner supplies, and whether automatic body iteration was replaced by a default body slot.
|
|
138
|
+
|
|
139
|
+
The key distinction is between a genuinely stale generated contract and a valid schema facade captured from an earlier locale. `$computed` is only locale-safe when its dependency path reacquires the current schema source; wrapping an old facade or transformed snapshot does not make it current.
|
|
140
|
+
|
|
120
141
|
## Step 5: Explain Zova-native meaning first
|
|
121
142
|
|
|
122
143
|
When answering, explain the Zova role first, then add Vue analogies only if they help.
|
|
@@ -99,6 +99,32 @@ Use when the question is about:
|
|
|
99
99
|
- layout shell implications
|
|
100
100
|
- route-aware controller state
|
|
101
101
|
|
|
102
|
+
## Locale-sensitive OpenAPI schema and ZForm path
|
|
103
|
+
|
|
104
|
+
Read in this order:
|
|
105
|
+
|
|
106
|
+
1. `cabloy-docs/frontend/api-schema-guide.md`
|
|
107
|
+
2. `cabloy-docs/frontend/a-openapi-under-the-hood.md`
|
|
108
|
+
3. `cabloy-docs/frontend/form-guide.md` and `cabloy-docs/frontend/zova-form-under-the-hood.md` when a form consumes the schema
|
|
109
|
+
4. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/monkey.ts`
|
|
110
|
+
5. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/model/sdk.ts`
|
|
111
|
+
6. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/bean/sys.sdk.ts`
|
|
112
|
+
7. the generated API-schema bean for the operation
|
|
113
|
+
8. the consumer controller/model and, only then, `a-form` controller/render sources
|
|
114
|
+
|
|
115
|
+
Use when the question is about:
|
|
116
|
+
|
|
117
|
+
- translated form titles, descriptions, validation, or renderer metadata that remain stale after a locale switch
|
|
118
|
+
- whether an `$apiSchema` facade, `requestBody`, or transformed schema may be stored across locale changes
|
|
119
|
+
- whether a stale result is generated-contract drift or consumer-side capture
|
|
120
|
+
- whether automatic `ZForm` rendering remains active or a default body slot intentionally replaced it
|
|
121
|
+
|
|
122
|
+
Expected conclusion:
|
|
123
|
+
|
|
124
|
+
- `a-openapi` selects a locale-scoped runtime, so `createApiSchemas(...)` facades created before a locale change can retain an earlier schema query
|
|
125
|
+
- the consumer must reacquire the schema through a live getter/computed owner and apply schema transforms in that same derivation
|
|
126
|
+
- `ZForm` resolves properties from the supplied schema; it does not refresh a stale caller-owned facade
|
|
127
|
+
|
|
102
128
|
## Model/state ownership path
|
|
103
129
|
|
|
104
130
|
Read in this order:
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.1.138
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Add a role-based access control (RBAC) system with permission and scope support.
|
|
8
|
+
- Add user home pages, avatar support, and activation handling.
|
|
9
|
+
- Add return-to redirect support for login flows.
|
|
10
|
+
- Add mail capabilities and a base authentication guard.
|
|
11
|
+
- Add basic image and select field support, including boolean field values.
|
|
12
|
+
- Add SKU product and identifier support.
|
|
13
|
+
- Add API and model resource deletion capabilities.
|
|
14
|
+
- Add SSR profile metadata localization, public session handling, and local loading support.
|
|
15
|
+
|
|
16
|
+
### Bug Fixes
|
|
17
|
+
|
|
18
|
+
- Fix transaction handling.
|
|
19
|
+
- Fix locale handling.
|
|
20
|
+
- Fix internal SSR disposal method casting.
|
|
21
|
+
|
|
22
|
+
### Improvements
|
|
23
|
+
|
|
24
|
+
- Enhance deletion behavior.
|
|
25
|
+
- Update database dialect, controller, authentication guard, locale, and application initialization components.
|
|
26
|
+
|
|
27
|
+
## 5.1.137
|
|
28
|
+
|
|
29
|
+
### Improvements
|
|
30
|
+
|
|
31
|
+
- Refresh the Zova lockfile after compensation rerun preparation.
|
|
32
|
+
- Refresh the Vona Zova Core patch for v5.1.85.
|
|
33
|
+
|
|
3
34
|
## 5.1.136
|
|
4
35
|
|
|
5
36
|
### Features
|
package/CLAUDE.md
CHANGED
|
@@ -46,6 +46,9 @@ Before inventing a custom implementation path:
|
|
|
46
46
|
- Treat contract-loop work as one of four branches: forward chain, reverse chain, consumer drift, or local dependency drift.
|
|
47
47
|
- For the forward chain, change backend contract truth first and regenerate frontend consumers rather than hand-patching them.
|
|
48
48
|
- After forward regeneration, keep frontend follow-up thin: prefer semantic model facades and reuse the existing resource-owner when the custom API still belongs to the same resource.
|
|
49
|
+
- For schema-driven UI, treat backend entity/DTO/OpenAPI metadata as contract truth; prefer `$apiSchema` or the owning `ModelResource` with automatic `ZForm` rendering, regenerate generated consumers, and never duplicate schema metadata or hand-edit generated consumers.
|
|
50
|
+
- Treat localized `$apiSchema` and `ModelResource` schemas as locale-scoped reactive state: do not retain a schema facade or derived snapshot created before a locale change; reacquire it through the current runtime and reactive owner.
|
|
51
|
+
- Keep reusable query, cache, mutation, and resource state in models or `ModelResource`; a page-specific, low-reuse action may call the generated `$api` directly when no shared state or cache ownership is required.
|
|
49
52
|
- When one persisted business resource serves both Admin Resource and Web self-service consumers, keep one domain and persistence boundary; where audience authority or experience differs, split API/DTO contracts, server-side scope, frontend state ownership, and page architecture—reuse the generic Resource owner for Admin and use dedicated state/pages for a genuinely distinct Web self-service contract.
|
|
50
53
|
- For the reverse chain, always run the relevant Zova build first, then run `npm run deps:vona`: use `npm run build:zova:admin` for Admin changes, and also run `npm run build:zova:web` when the Web flavor is affected. Do not treat `build:rest:*` alone as sufficient, because the SSR bundle and rest output must move together.
|
|
51
54
|
- If the generated `.zova-rest` artifacts already contain the expected changes but Vona consumers still see stale types after `npm run deps:vona`, treat it as local dependency drift: delete `vona/node_modules` and reinstall dependencies before further debugging or hand-patching dependency links.
|
|
@@ -54,7 +57,8 @@ Before inventing a custom implementation path:
|
|
|
54
57
|
- For frontend work, assume Cabloy Basic and Cabloy Start share a frontend engineering layer but may diverge in UI layer, frontend flavors, suite/module availability, SSR site baselines, project assets, and generated outputs.
|
|
55
58
|
- For Zova frontend analysis, do not default to generic Vue reinterpretation first. Read the code through Zova’s controller / bean / IoC architecture before mapping it to Vue concepts.
|
|
56
59
|
- For Zova source-reading or Vue-vs-Zova explanation tasks, start from the frontend reading guides and source-reading map in `cabloy-docs/frontend/` before doing framework-neutral reinterpretation.
|
|
57
|
-
- In Zova
|
|
60
|
+
- In Zova application modules under `zova/src/module/**`, `zova/src/module-vendor/**`, `zova/src/suite/**/modules/**`, and `zova/src/suite-vendor/**/modules/**`, use emitted runtime suffixes for relative imports and exports: `.js` for `.ts` targets and `.jsx` for `.tsx` targets, including type-only imports and module tests. Preserve the deliberate `.ts`/`.tsx` convention in `zova/packages-utils/**` and `zova/packages-zova/**`; do not generalize this rule to Vona, CLI/templates, dependencies, generated output, or build artifacts.
|
|
61
|
+
- In Zova page routes, any route with dynamic `params` must define `route.name`; do not rely on unnamed path-keyed routes for typed `$params`. Static routes should omit `route.name` unless a documented named-route requirement exists; use `$router.getPagePath(...)` for canonical static URL generation rather than adding a name or alias for convenience. Ordinary business routes without `locale` params should omit app-config aliases unless a documented system, compatibility, or user-facing URL exception requires one. Choose `ssrProfile` from the page's rendering contract: Web remains `public` by default, while `session` is an explicit choice for cookie-backed state, protected admission, personalized first paint, or private SSR data; the absence of a locale parameter alone does not select a profile. `requiresAuth` is independent, so anonymous routes must explicitly use `requiresAuth: false`. Regenerate page metadata after route changes.
|
|
58
62
|
- For frontend async state that affects rendering or interaction across consumers, prefer model-owned `$useStateData(...)` over controller-managed fetch/cache state.
|
|
59
63
|
- Default to establishing such query state during render. Use `disableSuspenseOnInit: true` only for relatively stable query-backed state when you want to skip the init-time `query.suspense()` kick; it does not prevent query creation, fetches, or hydration-time rendering. If strict readiness is needed later, wait explicitly at the interaction boundary.
|
|
60
64
|
- In SSR, keep server HTML and the client's hydration-time initial render equivalent. When server rendering intentionally omits private, cookie-unavailable, or browser-only state, keep the same neutral shell or placeholder through hydration and defer its query/load/render branch to an explicit post-hydration, admission, mounted, or interaction boundary.
|
|
@@ -188,6 +188,7 @@ export default defineConfig({
|
|
|
188
188
|
themeConfig: {
|
|
189
189
|
nav: [
|
|
190
190
|
{ text: 'Home', link: '/' },
|
|
191
|
+
{ text: 'Blogs', link: '/blogs/', activeMatch: '^/blogs/' },
|
|
191
192
|
{ text: 'Fullstack', link: '/fullstack/introduction', activeMatch: '^/fullstack/' },
|
|
192
193
|
{ text: 'Backend (Vona)', link: '/backend/introduction', activeMatch: '^/backend/' },
|
|
193
194
|
{ text: 'Frontend (Zova)', link: '/frontend/introduction', activeMatch: '^/frontend/' },
|
|
@@ -62,3 +62,127 @@
|
|
|
62
62
|
background: #431407;
|
|
63
63
|
color: #fdba74;
|
|
64
64
|
}
|
|
65
|
+
|
|
66
|
+
.cabloy-blog-grid {
|
|
67
|
+
display: grid;
|
|
68
|
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
69
|
+
gap: 1.5rem;
|
|
70
|
+
margin-top: 2rem;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.cabloy-blog-card {
|
|
74
|
+
display: flex;
|
|
75
|
+
flex-direction: column;
|
|
76
|
+
overflow: hidden;
|
|
77
|
+
border: 1px solid var(--vp-c-divider);
|
|
78
|
+
border-radius: 12px;
|
|
79
|
+
background: var(--vp-c-bg-soft);
|
|
80
|
+
transition:
|
|
81
|
+
border-color 0.2s ease,
|
|
82
|
+
box-shadow 0.2s ease,
|
|
83
|
+
transform 0.2s ease;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.cabloy-blog-card:hover {
|
|
87
|
+
border-color: var(--vp-c-brand-1);
|
|
88
|
+
box-shadow: 0 12px 28px color-mix(in srgb, var(--vp-c-text-1) 12%, transparent);
|
|
89
|
+
transform: translateY(-2px);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.cabloy-blog-card__cover {
|
|
93
|
+
display: block;
|
|
94
|
+
aspect-ratio: 16 / 9;
|
|
95
|
+
overflow: hidden;
|
|
96
|
+
background: var(--vp-c-bg-alt);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.cabloy-blog-card__cover:focus-visible,
|
|
100
|
+
.cabloy-blog-card h2 a:focus-visible,
|
|
101
|
+
.cabloy-blog-card__read:focus-visible {
|
|
102
|
+
outline: 2px solid var(--vp-c-brand-1);
|
|
103
|
+
outline-offset: 3px;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.cabloy-blog-card__cover img {
|
|
107
|
+
width: 100%;
|
|
108
|
+
height: 100%;
|
|
109
|
+
object-fit: cover;
|
|
110
|
+
transition: transform 0.2s ease;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.cabloy-blog-card:hover .cabloy-blog-card__cover img {
|
|
114
|
+
transform: scale(1.025);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.cabloy-blog-card__content {
|
|
118
|
+
display: flex;
|
|
119
|
+
flex: 1;
|
|
120
|
+
flex-direction: column;
|
|
121
|
+
padding: 1.25rem;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.cabloy-blog-card__date {
|
|
125
|
+
margin: 0;
|
|
126
|
+
color: var(--vp-c-text-2);
|
|
127
|
+
font-size: 0.875rem;
|
|
128
|
+
font-weight: 600;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.cabloy-blog-card h2 {
|
|
132
|
+
margin: 0.5rem 0 0;
|
|
133
|
+
border: 0;
|
|
134
|
+
font-size: 1.25rem;
|
|
135
|
+
line-height: 1.4;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.cabloy-blog-card h2 a {
|
|
139
|
+
color: var(--vp-c-text-1);
|
|
140
|
+
text-decoration: none;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.cabloy-blog-card h2 a:hover {
|
|
144
|
+
color: var(--vp-c-brand-1);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.cabloy-blog-card__content > p:not(.cabloy-blog-card__date) {
|
|
148
|
+
margin: 0.75rem 0;
|
|
149
|
+
color: var(--vp-c-text-2);
|
|
150
|
+
font-size: 0.9375rem;
|
|
151
|
+
line-height: 1.6;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.cabloy-blog-card__tags {
|
|
155
|
+
display: flex;
|
|
156
|
+
flex-wrap: wrap;
|
|
157
|
+
gap: 0.375rem;
|
|
158
|
+
margin-top: auto;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.cabloy-blog-card__tags span {
|
|
162
|
+
border-radius: 999px;
|
|
163
|
+
padding: 0.1875rem 0.625rem;
|
|
164
|
+
background: color-mix(in srgb, var(--vp-c-brand-1) 12%, var(--vp-c-bg));
|
|
165
|
+
color: var(--vp-c-brand-3);
|
|
166
|
+
font-size: 0.75rem;
|
|
167
|
+
font-weight: 600;
|
|
168
|
+
line-height: 1.25rem;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.cabloy-blog-card__read {
|
|
172
|
+
align-self: flex-start;
|
|
173
|
+
margin-top: 1rem;
|
|
174
|
+
color: var(--vp-c-brand-1);
|
|
175
|
+
font-size: 0.9375rem;
|
|
176
|
+
font-weight: 600;
|
|
177
|
+
text-decoration: none;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.cabloy-blog-card__read:hover {
|
|
181
|
+
color: var(--vp-c-brand-2);
|
|
182
|
+
text-decoration: underline;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.dark .cabloy-blog-card__tags span {
|
|
186
|
+
background: color-mix(in srgb, var(--vp-c-brand-1) 22%, var(--vp-c-bg));
|
|
187
|
+
color: #bfdbfe;
|
|
188
|
+
}
|
|
@@ -131,6 +131,14 @@ The `home-user` module exposes out-of-the-box Passport APIs for common account f
|
|
|
131
131
|
|
|
132
132
|
In the current repo implementation, these flows live in `home-user/src/controller/passport.ts`, where register/login call `bean.auth.authenticate(...)`, OAuth login uses provider/module path parameters, and token-oriented follow-up endpoints stay concentrated in one controller surface.
|
|
133
133
|
|
|
134
|
+
## Registration and password recovery in Cabloy Basic
|
|
135
|
+
|
|
136
|
+
The Home Login experience uses the Passport registration flow for new users. Registration collects the standard username, email, password, confirmation, and CAPTCHA fields, then continues through the ordinary signed-in navigation flow after it succeeds.
|
|
137
|
+
|
|
138
|
+
If a user has lost an existing local password, the Login page also provides **Forgot password?**. The request form asks for an email address and CAPTCHA. After valid CAPTCHA verification, it always shows the same generic confirmation, whether or not a reset email can be sent. This protects account privacy and avoids exposing account eligibility through the interface.
|
|
139
|
+
|
|
140
|
+
When a reset email is available, its link opens a public page where the user chooses a new local password. Completing the reset signs the user out of existing server-side sessions, so they must sign in again with the new password. Password reset replaces an existing local password; it is not a way for an OAuth-only account to add its first local password. That journey remains the authenticated **Set password** account-security action.
|
|
141
|
+
|
|
134
142
|
This guide focuses on the framework-level auth model. For the user/passport side, see [User Access Guide](/backend/user-access-guide).
|
|
135
143
|
|
|
136
144
|
## Relationship to controller AOP
|
|
@@ -218,6 +218,8 @@ A useful backend mental model is:
|
|
|
218
218
|
|
|
219
219
|
This layered model is the safest way to reason about config changes in Cabloy.
|
|
220
220
|
|
|
221
|
+
`CORS_WHITE_LIST` is an example of a deployable environment value consumed directly by a framework middleware default. Configure deployment-specific browser origins in the active env layer; it is not a `config.modules[...]` field or instance-specific config. Use explicit `a-security:cors` configuration only when the application needs middleware behavior beyond the environment-provided origin list. See [Runtime and Flavors](/backend/runtime-and-flavors#configure-browser-cors-origins) for its format, browser-origin behavior, and env-file precedence.
|
|
222
|
+
|
|
221
223
|
## Relationship to startup, model, and datasource behavior
|
|
222
224
|
|
|
223
225
|
Config does not live in isolation. In many backend tasks, config interacts directly with:
|
|
@@ -125,6 +125,14 @@ The CRUD generator applies `@Passport.systemAdmin()` to each generated CRUD acti
|
|
|
125
125
|
|
|
126
126
|
For the underlying auth, passport, and user-access model, see [Auth Guide](/backend/auth-guide) and [User Access Guide](/backend/user-access-guide).
|
|
127
127
|
|
|
128
|
+
### RBAC presentation metadata
|
|
129
|
+
|
|
130
|
+
Some Cabloy editions or module sets provide `@Passport.rbac(...)` for dynamic RBAC actions. Verify the active edition and installed modules first; this decorator is not a Basic baseline assumption.
|
|
131
|
+
|
|
132
|
+
When an action uses `@Passport.rbac(...)`, provide a locale-aware `summary` on both the controller metadata and the action's `@Web.*` metadata. These scopes are independent, so the controller summary does not supply the action summary. Add locale-aware `description` values only when the business or administrative experience needs explanatory text.
|
|
133
|
+
|
|
134
|
+
These fields are for human-facing documentation and optional policy-catalog or policy-editor presentation. They are not authorization identity or enforcement inputs. Keep action keys and other machine identifiers stable and nonlocalized, and verify that the active server explicitly projects summary/description into a policy catalog before expecting an editor to display them. See [Controller Guide](/backend/controller-guide#rbac-presentation-metadata) for the authoring example.
|
|
135
|
+
|
|
128
136
|
## Interceptor
|
|
129
137
|
|
|
130
138
|
Interceptors provide onion-style around-execution behavior for controller actions.
|
|
@@ -341,6 +341,8 @@ Representative pattern:
|
|
|
341
341
|
|
|
342
342
|
```typescript
|
|
343
343
|
@Controller('student', {
|
|
344
|
+
description: 'Student controller',
|
|
345
|
+
summary: 'Student API',
|
|
344
346
|
exclude: false,
|
|
345
347
|
tags: ['Student'],
|
|
346
348
|
})
|
|
@@ -349,14 +351,45 @@ class ControllerStudent {}
|
|
|
349
351
|
|
|
350
352
|
Representative controller-option areas include:
|
|
351
353
|
|
|
354
|
+
- `description`
|
|
355
|
+
- `summary`
|
|
352
356
|
- `exclude`
|
|
353
357
|
- `tags`
|
|
354
358
|
- `actions`
|
|
355
359
|
- `enable`
|
|
356
360
|
- `meta`
|
|
357
361
|
|
|
362
|
+
`description` and `summary` at the controller level are controller metadata. They are independent from the operation metadata supplied to `@Web.*`: controller values do not become defaults for an action's OpenAPI `description` or `summary`. Set those fields on the action when documenting a specific operation.
|
|
363
|
+
|
|
358
364
|
This is especially important because the controller surface can also be tuned from app config through onion/config override patterns.
|
|
359
365
|
|
|
366
|
+
## RBAC presentation metadata
|
|
367
|
+
|
|
368
|
+
Some Cabloy editions or module sets provide `@Passport.rbac(...)` for dynamic RBAC actions. Verify that the active edition and installed modules provide this decorator before applying the following convention.
|
|
369
|
+
|
|
370
|
+
For every action decorated with `@Passport.rbac(...)`, provide a locale-aware `summary` at both the controller and action levels:
|
|
371
|
+
|
|
372
|
+
```typescript
|
|
373
|
+
@Controller('student', {
|
|
374
|
+
summary: $locale('StudentControllerSummary'),
|
|
375
|
+
})
|
|
376
|
+
class ControllerStudent extends BeanBase {
|
|
377
|
+
@Web.get(':id', {
|
|
378
|
+
summary: $locale('StudentViewSummary'),
|
|
379
|
+
})
|
|
380
|
+
@Passport.rbac({ dataScope: true })
|
|
381
|
+
async view(@Arg.param('id') id: number) {
|
|
382
|
+
// ...
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
Controller and action `summary` values are independent metadata. A controller summary does not automatically become the action's OpenAPI summary, so define both explicitly. Add locale-aware `description` metadata at either level when the business or administrative experience needs additional explanation; descriptions are optional.
|
|
388
|
+
|
|
389
|
+
A policy catalog or editor may project these fields as localized display labels, but only through an explicit server-side projection. `summary` and `description` are presentation metadata: they do not define the RBAC action key, select a policy, change a route or `operationId`, or grant authorization. Keep action keys, controller bean names, action names, routes, and other integration identifiers stable and nonlocalized. Do not assume that OpenAPI metadata is automatically included in a policy catalog; inspect the active implementation.
|
|
390
|
+
|
|
391
|
+
See [Controller AOP Guide](/backend/controller-aop-guide) for the guard boundary and edition-aware RBAC notes.
|
|
392
|
+
|
|
360
393
|
## Relationship to the backend contract loop
|
|
361
394
|
|
|
362
395
|
Read this guide together with:
|
|
@@ -150,10 +150,10 @@ Representative examples include:
|
|
|
150
150
|
|
|
151
151
|
- registration events
|
|
152
152
|
- activation events
|
|
153
|
-
- post-registration follow-up such as
|
|
153
|
+
- post-registration follow-up such as account activation-link issuance
|
|
154
154
|
- role-assignment follow-up logic
|
|
155
155
|
|
|
156
|
-
Mail delivery is a common downstream effect in these flows; see [Mail Guide](/backend/mail-guide).
|
|
156
|
+
Mail delivery is a common downstream effect in these flows; see [Mail Guide](/backend/mail-guide). Account activation-link issuance may be owned by the account service rather than an event listener.
|
|
157
157
|
|
|
158
158
|
Read this together with [User Access Guide](/backend/user-access-guide) when the event flow is tied to identity lifecycle behavior.
|
|
159
159
|
|
|
@@ -169,7 +169,7 @@ Use direct calls when:
|
|
|
169
169
|
|
|
170
170
|
- the behavior is tightly bound to the core logic and should not be extensible as a chain
|
|
171
171
|
|
|
172
|
-
A practical example from the user-access layer is
|
|
172
|
+
A practical example from the user-access layer is activation: the core user flow can stay small, while follow-up concerns such as role assignment move into listeners. Account-specific activation-link issuance remains owned by the home-user account service.
|
|
173
173
|
|
|
174
174
|
## Implementation checks for event-driven backend changes
|
|
175
175
|
|
|
@@ -165,7 +165,7 @@ Read this guide together with:
|
|
|
165
165
|
|
|
166
166
|
Those guides explain the flows where mail often becomes a downstream effect rather than the initiating business action.
|
|
167
167
|
|
|
168
|
-
In the current repo, the `
|
|
168
|
+
In the current repo, the `home-user` activation flow is a representative example: its account service issues a purpose-bound activation link and delegates delivery through `bean.mail.send(...)`, keeping transport details out of the user workflow.
|
|
169
169
|
|
|
170
170
|
## When to use a dedicated mail client
|
|
171
171
|
|
|
@@ -181,7 +181,7 @@ Use this checklist when adding Markdown-backed content:
|
|
|
181
181
|
3. Call `this.bean.markdown.renderHtml(...)` on every authoritative write path.
|
|
182
182
|
4. Define a business policy for blank Markdown; do not assume `renderHtml('')` deletes records.
|
|
183
183
|
5. Expose the source and projection separately according to the consumer's authority.
|
|
184
|
-
6. Use `basic-markdown:formFieldMarkdown`
|
|
184
|
+
6. Use the edition-specific Markdown form field: `basic-markdown:formFieldMarkdown` in Cabloy Basic or `start-markdown:formFieldMarkdown` in Cabloy Start.
|
|
185
185
|
7. Use `ZMarkdownHtml` only for HTML produced by the trusted server rendering path.
|
|
186
186
|
8. Add tests for blank values, invalid URL schemes, task-list output, derived HTML consistency, and forged output fields.
|
|
187
187
|
9. Treat external-image policy, CSP, authorization, and content lifecycle cleanup as application concerns beyond this renderer.
|
|
@@ -120,12 +120,41 @@ The current repo uses many env variables, but these are the most important ones
|
|
|
120
120
|
| Runtime meta | `META_MODE`, `META_FLAVOR`, `NODE_ENV` | chooses the active runtime and flavor shape |
|
|
121
121
|
| Worker/runtime process | `SERVER_WORKERS` | controls worker count and is normalized by the CLI/bootstrap path |
|
|
122
122
|
| HTTP server | `SERVER_LISTEN_HOSTNAME`, `SERVER_LISTEN_PORT`, `SERVER_LISTEN_DISABLE`, `SERVER_SERVE_PROTOCOL`, `SERVER_SERVE_HOST`, `SERVER_GLOBALPREFIX` | controls listen/serve behavior and URL shaping |
|
|
123
|
+
| CORS | `CORS_WHITE_LIST` | supplies the default allowed-origin whitelist for the `a-security:cors` middleware |
|
|
123
124
|
| Database | `DATABASE_DEFAULT_CLIENT`, `DATABASE_CLIENT_SQLITE3_FILENAME`, `DATABASE_CLIENT_PG_*`, `DATABASE_CLIENT_MYSQL_*` | controls datasource defaults and concrete client connection settings |
|
|
124
125
|
| Redis | `REDIS_DEFAULT_HOST`, `REDIS_DEFAULT_PORT`, `REDIS_DEFAULT_DB` | controls the backend Redis baseline used by queue, cache, broadcast, and related capabilities |
|
|
125
126
|
| Logger | `LOGGER_DIR`, `LOGGER_ROTATE_*` | controls log path and rotation behavior |
|
|
126
127
|
|
|
127
128
|
Use this page as the runtime-facing overview, then inspect the current app config when you need to see how those values are translated into backend config.
|
|
128
129
|
|
|
130
|
+
## Public server origin
|
|
131
|
+
|
|
132
|
+
`SERVER_LISTEN_HOSTNAME` and `SERVER_LISTEN_PORT` control where the Vona process binds. They do not define the public URL that Vona emits.
|
|
133
|
+
|
|
134
|
+
When configured, `SERVER_SERVE_PROTOCOL` and `SERVER_SERVE_HOST` define Vona's canonical public origin for backend APIs and backend-hosted SSR sites. If either serve value is not configured, Vona resolves the effective protocol and host from the current proxy-aware request context; background work that needs a stable backend public origin should configure both serve values explicitly.
|
|
135
|
+
|
|
136
|
+
A browser consumer can be deployed on a different origin and pathname. Account password-set and password-reset delivery therefore does not derive its destination from `SERVER_SERVE_*`, SSR Site metadata, `publicPath`, `siteId`, `Referer`, or browser-selected mount data: Zova supplies the complete token-free absolute public page URL, and Vona validates only HTTP(S), absence of userinfo/query/fragment, and an exact trusted origin. `checkOriginExact` permits the exact current origin when protocol, host, and effective port all match; request or proxy Host values are not a general cross-origin allowlist and cannot authorize lookalike, suffix, alternate-scheme, or alternate-port destinations. Other production consumer origins must exactly match an explicit `a-security:cors` `whiteList` entry. In `dev/test`, exact credential-link authorization additionally accepts different ports only when both API and consumer hostnames are loopback (`localhost`, `127.0.0.1`, or `::1`). Vona preserves the frontend pathname and alone adds the raw token as the `token` URL query parameter. Query transport reaches the initial request; Referrer-Policy and Vona, edge, or APM query-log redaction are intentionally outside this flow's current scope. Normal CORS defaults to an empty `whiteList`; configure `CORS_WHITE_LIST` with the permitted browser origins, or explicitly configure `a-security:cors`. In `dev/test`, loopback requests may cross ports; elsewhere, cross-origin CORS requires an allowed entry. Normal CORS wildcard and suffix matching remain available when configured but are not credential-link authorization.
|
|
137
|
+
|
|
138
|
+
## Configure browser CORS origins
|
|
139
|
+
|
|
140
|
+
`CORS_WHITE_LIST` supplies the default `whiteList` for the app-wide `a-security:cors` middleware. It controls normal HTTP CORS and the built-in WebSocket origin check; it does not authenticate or authorize requests.
|
|
141
|
+
|
|
142
|
+
Set it to a comma-separated list of allowed browser origins. Use complete origins, including the scheme and a non-default port when applicable:
|
|
143
|
+
|
|
144
|
+
```dotenv
|
|
145
|
+
CORS_WHITE_LIST=https://app.example.com,https://admin.example.com
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
```dotenv
|
|
149
|
+
CORS_WHITE_LIST=https://app.example.com,http://localhost:5173
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
When `CORS_WHITE_LIST` is absent or empty, Vona retains the closed empty-whitelist default. The existing `dev/test` loopback exception remains available for local development, so ordinary loopback clients on different ports do not require this setting.
|
|
153
|
+
|
|
154
|
+
Set deployment-specific origins in the active `vona/env/.env*` layer or inject them through the deployment environment. See [Env-file resolution and precedence](#env-file-resolution-and-precedence) for the active-file chain and precedence rules. Applications that need middleware behavior beyond this default origin list can configure `a-security:cors` explicitly.
|
|
155
|
+
|
|
156
|
+
Normal CORS may use its configured wildcard or suffix matching behavior. Do not use that behavior to authorize account credential links: `checkOriginExact(...)` accepts only an exact normalized HTTP(S) origin and rejects wildcard and suffix entries.
|
|
157
|
+
|
|
129
158
|
## How to determine runtime metadata in code
|
|
130
159
|
|
|
131
160
|
### Via environment variables
|
|
@@ -123,7 +123,7 @@ Representative flows include:
|
|
|
123
123
|
- registration
|
|
124
124
|
- activation
|
|
125
125
|
- assigning default roles
|
|
126
|
-
-
|
|
126
|
+
- issuing account activation links or other follow-up logic
|
|
127
127
|
|
|
128
128
|
Those follow-up email behaviors often connect directly to queue-backed mail delivery; see [Mail Guide](/backend/mail-guide).
|
|
129
129
|
|
|
@@ -131,7 +131,7 @@ The framework-level user APIs stay stable while project-specific modules can cus
|
|
|
131
131
|
|
|
132
132
|
The legacy user docs showed this especially clearly:
|
|
133
133
|
|
|
134
|
-
- registration can
|
|
134
|
+
- registration can issue an account activation link through the account service
|
|
135
135
|
- activation can assign default roles such as `admin`
|
|
136
136
|
- `autoActivate` can suppress the extra activation step when the business flow allows it
|
|
137
137
|
|