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
|
@@ -99,12 +99,13 @@ export class ModelResource<
|
|
|
99
99
|
Entity = any,
|
|
100
100
|
EntityCreate = Partial<Entity>,
|
|
101
101
|
EntityUpdate = Partial<Entity>,
|
|
102
|
+
EntityDelete = void,
|
|
102
103
|
> extends BeanModelBase {}
|
|
103
104
|
```
|
|
104
105
|
|
|
105
106
|
That already tells you something important.
|
|
106
107
|
|
|
107
|
-
This model is designed to be reused across many resource types rather than tied to one page.
|
|
108
|
+
This model is designed to be reused across many resource types rather than tied to one page. `EntityDelete` defaults to `void`, so standard Resource deletion remains bodyless. A resource-specific model can supply a DELETE request-body type without changing the other three generic positions.
|
|
108
109
|
|
|
109
110
|
## Why `enableSelector` is essential
|
|
110
111
|
|
|
@@ -247,6 +248,30 @@ Instead, it builds a reusable mutation layer:
|
|
|
247
248
|
|
|
248
249
|
This gives the model one place to enforce mutation-key conventions and invalidation rules.
|
|
249
250
|
|
|
251
|
+
### DELETE request bodies remain an explicit semantic operation
|
|
252
|
+
|
|
253
|
+
The default `delete(id)` mutation has no variable and sends the existing bodyless DELETE request:
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
await modelResource.delete(id).mutateAsync();
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
When the backend DELETE contract declares a request body, declare the fourth generic in a typed resource facade and pass the body to the mutation:
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
type DeleteReason = { reason: string };
|
|
263
|
+
|
|
264
|
+
declare const modelResource: ModelResource<Entity, EntityCreate, EntityUpdate, DeleteReason>;
|
|
265
|
+
|
|
266
|
+
await modelResource.delete(id).mutateAsync({ reason: 'duplicate' });
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
`ModelResource` forwards a supplied variable through Axios `config.data`; `null` remains an intentional body, while an omitted variable preserves the bodyless request shape. For a DELETE body that is optional, use `DeleteReason | void`, not `DeleteReason | undefined`, so `mutateAsync()` remains callable without an argument.
|
|
270
|
+
|
|
271
|
+
The generic Resource table delete command only confirms and executes a bodyless delete. It does not generate a delete form or invent a payload. A resource that needs a required DELETE body must provide a resource-specific action or dialog that collects the value and calls the typed mutation. It should not expose the standard generic delete action for that operation.
|
|
272
|
+
|
|
273
|
+
The owner also exposes `apiSchemasDelete` lazily for a semantic caller that needs DELETE OpenAPI metadata. Loading that metadata or rendering a delete-body form remains the responsibility of that explicit caller.
|
|
274
|
+
|
|
250
275
|
That is an important architectural advantage.
|
|
251
276
|
|
|
252
277
|
Without this model boundary, every page or dialog could invent slightly different invalidation behavior.
|
|
@@ -85,6 +85,30 @@ const message2 = this.scope.locale.HelloWorld.locale('en-us');
|
|
|
85
85
|
|
|
86
86
|
Project-level locale resources can override module-level locale values, which is one of the key reasons scope stays useful even when the final app wants customized wording.
|
|
87
87
|
|
|
88
|
+
### Diagnose locale typing at its source
|
|
89
|
+
|
|
90
|
+
Use `this.scope.locale.SomeKey()` directly. Its type is generated from the module locale source and module metadata; do not add a local type assertion, compatibility helper, or cast merely to silence a missing-key error.
|
|
91
|
+
|
|
92
|
+
When a locale key is missing or incorrectly typed:
|
|
93
|
+
|
|
94
|
+
1. Inspect `src/config/locale/` for the module.
|
|
95
|
+
2. If that directory does not exist, initialize it through the standard command:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npm run zova :init:locale <module>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The normal initializer path also refreshes module metadata.
|
|
102
|
+
|
|
103
|
+
3. Add the key to every required locale source file.
|
|
104
|
+
4. If locale sources are complete but `this.scope.locale` is still stale, run the focused metadata refresh:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm run zova :tools:metadata <module>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Then return to direct `this.scope.locale.SomeKey()` usage. Repairing the locale source and generated metadata preserves the module contract for every consumer.
|
|
111
|
+
|
|
88
112
|
## `error`
|
|
89
113
|
|
|
90
114
|
Module-specific errors are exposed through scope so business code can throw namespaced error definitions without inventing ad hoc exception patterns.
|
|
@@ -107,6 +107,27 @@ project
|
|
|
107
107
|
|
|
108
108
|
A practical convention from the legacy guidance is that `a-demo` can host demo or disposable exploratory code, while suites such as `a-home` act as the normal starting point for real application growth.
|
|
109
109
|
|
|
110
|
+
## Import suffixes in Zova modules
|
|
111
|
+
|
|
112
|
+
Zova application modules are authored in TypeScript and TSX, but their relative ESM
|
|
113
|
+
specifiers name emitted runtime files. In module source, use `.js` for a `.ts` target
|
|
114
|
+
and `.jsx` for a `.tsx` target:
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
import type { ModelStudent } from '../model/student.js';
|
|
118
|
+
import { RenderCard } from './render.card.jsx';
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
This applies to relative imports, type-only imports, re-exports, module tests, and
|
|
122
|
+
module metadata that imports application code. Bare package imports are unchanged.
|
|
123
|
+
|
|
124
|
+
The scope is intentionally limited to module packages under `zova/src/module/**`,
|
|
125
|
+
`zova/src/module-vendor/**`, `zova/src/suite/**/modules/**`, and
|
|
126
|
+
`zova/src/suite-vendor/**/modules/**`. Do not copy this convention into
|
|
127
|
+
`zova/packages-utils/**` or `zova/packages-zova/**`: those package sources have
|
|
128
|
+
intentional `.ts`/`.tsx` imports. Do not use a repository-wide replacement across
|
|
129
|
+
Vona, CLI or template source, dependencies, generated output, or build artifacts.
|
|
130
|
+
|
|
110
131
|
## Module and suite boundaries in practice
|
|
111
132
|
|
|
112
133
|
A practical mental model is:
|
|
@@ -175,6 +196,7 @@ When editing or creates frontend code, ask:
|
|
|
175
196
|
1. does this belong in an existing module or a new one?
|
|
176
197
|
2. is this really one feature unit, or should it become part of a suite?
|
|
177
198
|
3. does the naming follow Zova’s module/suite conventions?
|
|
178
|
-
4.
|
|
199
|
+
4. do relative imports and re-exports use emitted `.js`/`.jsx` suffixes within the affected module, without changing excluded package source?
|
|
200
|
+
5. will the chosen placement preserve the intended architectural and bundle boundaries?
|
|
179
201
|
|
|
180
202
|
That helps AI keep frontend growth aligned with Zova’s modular system instead of falling back to generic folder expansion.
|
|
@@ -49,6 +49,8 @@ class ServiceRouterGuards {
|
|
|
49
49
|
|
|
50
50
|
`$getPagePathLogin(to.fullPath)` preserves the protected destination as `returnTo` without starting navigation. On the Client, returning that path lets Vue Router redirect the current navigation atomically. On the Server, `$redirect(...)` preserves the SSR HTTP redirect flow.
|
|
51
51
|
|
|
52
|
+
`requiresAuth` is independent of `ssrProfile`. A route such as Login or password recovery can use `meta: { requiresAuth: false, ssrProfile: 'public' }` for an anonymous, cache-safe, hydration-equivalent contract, or explicitly use `session` when its SSR contract genuinely needs cookie-backed state. The profile does not authenticate the visitor or bypass API authorization.
|
|
53
|
+
|
|
52
54
|
## Why route meta matters here
|
|
53
55
|
|
|
54
56
|
The example makes a key architectural point: navigation guards are tightly coupled to route metadata such as `requiresAuth`.
|
|
@@ -34,6 +34,8 @@ A page route that declares or consumes dynamic params **must** define `route.nam
|
|
|
34
34
|
|
|
35
35
|
The route name is required because Zova uses the named route identity to generate and resolve the page's typed `params` schema at runtime. This initializes the controller's `$params` surface during SSR and client navigation. A params schema declaration alone does not make `$params` available if the route is unnamed.
|
|
36
36
|
|
|
37
|
+
Conversely, a static route should not add a name merely for typing, canonical URL generation, or alias convenience. Use the path-keyed `$router.getPagePath(...)` helper for a known canonical static path; keep a static name only for a documented named-route requirement.
|
|
38
|
+
|
|
37
39
|
Representative route idea:
|
|
38
40
|
|
|
39
41
|
```typescript
|
|
@@ -44,6 +44,10 @@ This matters because path generation is modular by default.
|
|
|
44
44
|
|
|
45
45
|
A route with dynamic params must define `name`. Typed param-aware routing uses the named route identity to generate and resolve the page's runtime params schema; an unnamed parameterized route does not provide the required `$params` contract.
|
|
46
46
|
|
|
47
|
+
A static route should normally omit `name`. Do not add a name merely for typing, canonical URL generation, or alias convenience: use the path-keyed `$router.getPagePath(...)` helper for a known static path. Keep a static name only when a documented named-route or public-URL contract genuinely requires it.
|
|
48
|
+
|
|
49
|
+
For ordinary business routes without a `locale` path parameter, omit app-config aliases by default. A system entry, compatibility URL, or explicitly designed user-facing URL may still opt into an alias; record that exception in the route design rather than treating aliases as routine.
|
|
50
|
+
|
|
47
51
|
## `component`
|
|
48
52
|
|
|
49
53
|
`component` points to the generated page wrapper such as `ZPageCounter`.
|
|
@@ -64,6 +68,8 @@ The route meta surface includes important behavior such as:
|
|
|
64
68
|
- keepAlive behavior
|
|
65
69
|
- SSR profile and nested `meta.ssrProfileOptions.responseCache` behavior
|
|
66
70
|
|
|
71
|
+
Choose `meta.ssrProfile` from the page's rendering contract. Use `session` when the server needs cookie-backed state, protected admission, personalized first paint, or private SSR data; use `public` for an explicit URL-locale or deliberately locale-neutral, cache-safe, hydration-equivalent public contract. A missing `locale` parameter alone does not determine the profile. This is separate from route admission: use `requiresAuth: false` for an anonymous route, and do not treat either profile as an authentication decision.
|
|
72
|
+
|
|
67
73
|
This is one reason route records matter so much: they are not just URL declarations. They are an application-behavior surface.
|
|
68
74
|
|
|
69
75
|
## Route -> shell -> routed page
|
|
@@ -145,9 +151,10 @@ When editing page routing, do not only change the URL string.
|
|
|
145
151
|
|
|
146
152
|
It should also check whether the route change affects:
|
|
147
153
|
|
|
148
|
-
- params typing and the required `route.name` for dynamic params
|
|
149
|
-
- auth behavior
|
|
154
|
+
- params typing and the required `route.name` for dynamic params, plus static-route name omission
|
|
155
|
+
- auth behavior, including whether anonymous admission explicitly requires `requiresAuth: false`
|
|
150
156
|
- layout behavior
|
|
151
157
|
- whether `meta.locale` should participate in URL-locale behavior
|
|
152
|
-
-
|
|
158
|
+
- whether an alias is an explicit system, compatibility, or user-facing URL exception rather than an ordinary business-route default
|
|
159
|
+
- SSR profile and nested `meta.ssrProfileOptions.responseCache` behavior, selected from the page's rendering and cache contract
|
|
153
160
|
- metadata regeneration
|
|
@@ -13,6 +13,8 @@ A home-page example shows this clearly:
|
|
|
13
13
|
|
|
14
14
|
Route aliases bridge that gap.
|
|
15
15
|
|
|
16
|
+
Aliases are an explicit public-URL contract, not a default convenience layer. Ordinary business routes without `locale` params should keep their canonical module path and omit an app-config alias. Use an alias when the route is a documented system entry, compatibility path, or intentionally designed user-facing URL; locale-aware public routes are another common exception.
|
|
17
|
+
|
|
16
18
|
## Basic routing flow
|
|
17
19
|
|
|
18
20
|
The navigation flow can be described in terms of:
|
|
@@ -45,10 +47,12 @@ config.routes = {
|
|
|
45
47
|
|
|
46
48
|
## `path` vs `name`
|
|
47
49
|
|
|
48
|
-
The distinction matters:
|
|
50
|
+
The distinction matters after an alias has a documented reason:
|
|
51
|
+
|
|
52
|
+
- use `routes.path` for an approved static path-based alias;
|
|
53
|
+
- use `routes.name` when the approved alias depends on params-aware naming.
|
|
49
54
|
|
|
50
|
-
|
|
51
|
-
- use `routes.name` when the route depends on params-aware naming
|
|
55
|
+
Do not introduce a static route name solely to use `routes.name`: a static exception can use `routes.path` instead.
|
|
52
56
|
|
|
53
57
|
## Generate a configured alias path
|
|
54
58
|
|
|
@@ -79,10 +83,12 @@ Use `$router.getPagePath(...)` for a known canonical path template, `$router.get
|
|
|
79
83
|
When changing user-facing routes, ask:
|
|
80
84
|
|
|
81
85
|
1. is this a real route change or just an alias change?
|
|
82
|
-
2. does the alias
|
|
83
|
-
3.
|
|
86
|
+
2. does the alias have an explicit system, compatibility, locale-aware, or user-facing URL reason?
|
|
87
|
+
3. does the alias belong in global config?
|
|
88
|
+
4. is the page params-aware, meaning the name-based alias path is the correct layer?
|
|
89
|
+
5. if the route is static, can `getPagePath(...)` and a path-keyed alias preserve the canonical route without adding a name?
|
|
84
90
|
|
|
85
|
-
That helps avoid breaking modular routing semantics.
|
|
91
|
+
That helps avoid breaking modular routing semantics and keeps ordinary business routes on their canonical paths.
|
|
86
92
|
|
|
87
93
|
## Where to read next
|
|
88
94
|
|
|
@@ -28,22 +28,31 @@ These affect SSR profile selection, theme defaults, server-side API targeting, a
|
|
|
28
28
|
|
|
29
29
|
For Vona-backed SSR, `SSR_PROFILE` supplies the flavor default. After the frontend route is resolved, `route.meta.ssrProfile` can override that default before `serverEntry` runs. The resolved profile controls request-cookie capability and related SSR behavior; locale-aware URL handling remains the existing `route.meta.locale` contract. A profile never grants authentication, site admission, or API authorization; `requiresAuth` and Vona guards remain responsible for those decisions.
|
|
30
30
|
|
|
31
|
+
Route authors should choose the profile from the rendering contract rather than from the presence or absence of a `locale` parameter. Use `session` when SSR genuinely needs cookie-backed state, protected admission, personalized first paint, or private data; use `public` for an explicit URL-locale or deliberately locale-neutral, cache-safe, hydration-equivalent public contract. This is not an authentication requirement: an anonymous route should set `requiresAuth: false`, and `session` still does not grant Passport, Site, role, or API authority.
|
|
32
|
+
|
|
31
33
|
The selected layout owns sidebar restoration. A layout that enables `layout.sidebar.bodyReadyObserver` queues a request-local hidden-body metadata entry during SSR, registers its readiness condition and restoration callback, and then injects the generic browser observer. The observer restores browser-local sidebar state after the relevant layout DOM exists and reveals the body before hydration. Admin enables this path; Web and Empty disable it. Therefore, a Web route using `ssrProfile: 'session'` remains `private, no-store` without gaining the Admin sidebar observer.
|
|
32
34
|
|
|
33
35
|
The selected layout also supplies its own desktop sidebar fallback and responsive breakpoint: the Admin layout defaults to open and the Web layout defaults to closed, and both currently use `1023px` as their independently configured breakpoint. Browser-local sidebar preference can override that fallback. The selected layout passes its breakpoint to the SSR browser handoff; it is not profile-specific. SSR profile selection does not change a layout's sidebar behavior.
|
|
34
36
|
|
|
35
37
|
## SSR response cache control
|
|
36
38
|
|
|
37
|
-
After Zova resolves the route profile, a `session` response immediately receives `Cache-Control: private, no-store`, before router guards or rendering can terminate it. A successfully rendered public route receives the
|
|
39
|
+
After Zova resolves the route profile, a `session` response immediately receives `Cache-Control: private, no-store`, before router guards or rendering can terminate it. A successfully rendered public route receives a response-cache header according to the route's locale metadata and any explicit `meta.ssrProfileOptions.responseCache` policy.
|
|
40
|
+
|
|
41
|
+
For a public route, the default policy is:
|
|
42
|
+
|
|
43
|
+
- `meta.locale: true`: use the configured public profile cache policy;
|
|
44
|
+
- missing or false `meta.locale`: use `expires: 0`, which emits `Cache-Control: no-cache, no-store, must-revalidate`.
|
|
45
|
+
|
|
46
|
+
The second case prevents a CDN from sharing HTML whose hydration-time locale may still come from a browser cookie while the URL does not identify the locale. A route-level `meta.ssrProfileOptions.responseCache` override remains authoritative, including `false`; use an explicit override only when the route's complete SSR HTML is safe to share for that URL.
|
|
38
47
|
|
|
39
48
|
Cabloy Basic uses different flavor defaults:
|
|
40
49
|
|
|
41
|
-
| Flavor | Default profile | SSR response header
|
|
42
|
-
| ------ | --------------- |
|
|
43
|
-
| Web | `public` | `public, max-age=600`
|
|
44
|
-
| Admin | `session` | `private, no-store`
|
|
50
|
+
| Flavor | Default profile | SSR response header |
|
|
51
|
+
| ------ | --------------- | --------------------------------------------- |
|
|
52
|
+
| Web | `public` | locale-aware routes use `public, max-age=600` |
|
|
53
|
+
| Admin | `session` | `private, no-store` |
|
|
45
54
|
|
|
46
|
-
A route can override the flavor profile through `meta.ssrProfile` and can define a public response-cache policy through `meta.ssrProfileOptions.responseCache`.
|
|
55
|
+
A route can override the flavor profile through `meta.ssrProfile` and can define a public response-cache policy through `meta.ssrProfileOptions.responseCache`. For Cloudflare cache-rule alignment that preserves these origin headers, see [Docker + Cloudflare Deployment](/fullstack/deploy-cloudflare-docker).
|
|
47
56
|
|
|
48
57
|
## Theme implications of `SSR_PROFILE`
|
|
49
58
|
|
|
@@ -34,6 +34,16 @@ For browser work that must wait for the initial SSR handoff, register `this.$ssr
|
|
|
34
34
|
|
|
35
35
|
This lifecycle applies only to the initial client hydration of SSR HTML. It is not an SPA-startup or later client-navigation readiness signal. Do not render a client-ready marker into server HTML; add it from an `onHydrated(...)` callback when browser-visible evidence is required.
|
|
36
36
|
|
|
37
|
+
For work that is safe to run immediately in an SPA, but must wait until hydration in an SSR document, use `this.$ssr.handleDirectOrOnHydrated(...)`:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
this.$ssr.handleDirectOrOnHydrated(() => {
|
|
41
|
+
// browser-only work
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The helper is a client-only boundary. It returns without invoking the callback on the server; during the browser's initial SSR hydration it queues the callback through `onHydrated(...)`; and for SPA startup or after hydration it invokes the callback immediately. Callers should not wrap this helper in a second `process.env.CLIENT` guard. Do not put server-required initialization inside the callback; keep server work outside the helper and use the helper only for browser-only work.
|
|
46
|
+
|
|
37
47
|
For a render-time branch, use `this.$ssr.isRuntimeSsrHydrated`. It is reactive and is `false` during server rendering and the browser's initial hydration render, then `true` after that hydration completes. It is also immediately `true` for SPA startup and later client navigation. Use it to retain the same neutral shell before hydration and begin private or browser-only queries and UI afterward. It indicates only SSR-hydration lifecycle readiness, not completed route admission, authentication, or data loading.
|
|
38
48
|
|
|
39
49
|
### SEO meta
|
|
@@ -41,6 +41,7 @@ Use this short checklist for PR review, AI review, or self-review.
|
|
|
41
41
|
- [ ] I verified that the change uses existing SSR abstractions rather than inventing a parallel workaround.
|
|
42
42
|
- [ ] I checked whether the change needs verification in built mode rather than only in dev mode.
|
|
43
43
|
- [ ] I reviewed whether the change depends on edition-specific UI or theme assumptions.
|
|
44
|
+
- [ ] For each new or changed route, I resolved static-versus-dynamic `route.name`, ordinary no-locale alias, the rendering-contract-driven SSR profile, and independent `requiresAuth` decisions.
|
|
44
45
|
|
|
45
46
|
## Layer-by-layer review checklist
|
|
46
47
|
|
|
@@ -233,6 +233,12 @@ A practical reading takeaway is:
|
|
|
233
233
|
- **schema is not only validation truth**
|
|
234
234
|
- **schema also drives ordering, render metadata, and scene-specific field behavior**
|
|
235
235
|
|
|
236
|
+
### The form owner supplies the schema lifetime
|
|
237
|
+
|
|
238
|
+
`ZForm` derives `properties` and `zodSchema` from the schema it receives. Its runtime does not own `$apiSchema` locale selection or refresh a facade retained by the page/controller. If the owner supplies a schema object created under an earlier locale, the form will faithfully render that object's titles and metadata.
|
|
239
|
+
|
|
240
|
+
Automatic rendering also has an explicit composition boundary: when the form has no default body slot, `RenderForm` iterates the resolved schema properties; `slotHeader` and `slotFooter` can add structure without replacing that body. A default body slot replaces automatic iteration, so manual or mixed composition must render the required fields intentionally. See [Form Guide](/frontend/form-guide) and [API Schema Guide](/frontend/api-schema-guide) for the recommended live-schema pattern.
|
|
241
|
+
|
|
236
242
|
## 5. The form controller creates the field render context
|
|
237
243
|
|
|
238
244
|
Still inside `form/controller.tsx`, the form controller prepares the field runtime support used later by every field:
|
|
@@ -96,7 +96,6 @@ export const routes: IModuleRoute[] = [
|
|
|
96
96
|
},
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
|
-
name: 'toolMinimal',
|
|
100
99
|
path: 'toolMinimal',
|
|
101
100
|
component: ZPageToolMinimal,
|
|
102
101
|
meta: {
|
|
@@ -112,7 +111,7 @@ What matters here is not only the route strings.
|
|
|
112
111
|
What matters is that:
|
|
113
112
|
|
|
114
113
|
- the module declares routes relative to the module boundary by default
|
|
115
|
-
-
|
|
114
|
+
- dynamic-parameter routes require `name` for typed params; static routes normally remain path-keyed
|
|
116
115
|
- route `meta` controls shell-facing behavior such as layout and component reuse strategy
|
|
117
116
|
- the route record is only the first layer; config, guards, startup timing, and router-view hosting still cooperate afterward
|
|
118
117
|
|
|
@@ -231,7 +230,7 @@ This is one reason route authoring stays compact while runtime routing stays glo
|
|
|
231
230
|
|
|
232
231
|
Before adding the route, the runtime checks `sys.config.routes.name` or `sys.config.routes.path` and deep-merges the config route on top of the module declaration.
|
|
233
232
|
|
|
234
|
-
That is why alias
|
|
233
|
+
That is why an approved alias or shared route-policy override belongs in config instead of being hand-spread across module route files. An alias is an explicit public-URL contract, not a routine convenience: ordinary business routes without `locale` params keep their canonical module path unless a documented system entry, compatibility path, or designed user-facing URL requires an exception.
|
|
235
234
|
|
|
236
235
|
Representative config source:
|
|
237
236
|
|
|
@@ -263,7 +262,7 @@ This detail is important because:
|
|
|
263
262
|
- the runtime can still preserve named-route identity and params-aware resolution
|
|
264
263
|
- alias handling remains a router concern instead of leaking into page code
|
|
265
264
|
|
|
266
|
-
`$alias:<name>` and `/__alias__` are private runtime machinery. Application code should use `$router.getAliasPath('module:page', { params, query }, absolute?)
|
|
265
|
+
`$alias:<name>` and `/__alias__` are private runtime machinery. Application code should use `$router.getAliasPath('module:page', { params, query }, absolute?)` only when it intentionally needs a configured public alias; the helper accepts the canonical route name and returns that alias path (or `undefined` when no alias is configured). Its optional `absolute` argument uses the same origin and public-path conversion as `getPagePath(...)`. For a known canonical static page path, use path-keyed `$router.getPagePath(...)` instead of adding a route name or alias solely for URL generation.
|
|
267
266
|
|
|
268
267
|
#### Layout wrapping
|
|
269
268
|
|
|
@@ -417,7 +416,7 @@ When `_initControllerRoute(...)` updates a page controller, it resolves the rout
|
|
|
417
416
|
- `pageNameSchemas` for named routes
|
|
418
417
|
- `pagePathSchemas` for path-keyed routes
|
|
419
418
|
|
|
420
|
-
For page routes with dynamic params, define `route.name` and use the named-route metadata path. Do not rely on an unnamed parameterized route: the generated path-keyed record does not establish the typed controller `$params` contract.
|
|
419
|
+
For page routes with dynamic params, define `route.name` and use the named-route metadata path. Do not rely on an unnamed parameterized route: the generated path-keyed record does not establish the typed controller `$params` contract. Conversely, a static route should not acquire a name merely for typing, canonical URL generation, or alias convenience; keep it path-keyed unless a documented named-route contract requires otherwise.
|
|
421
420
|
|
|
422
421
|
Those schema records are generated into module metadata.
|
|
423
422
|
|
|
@@ -261,7 +261,7 @@ provider return or cancel
|
|
|
261
261
|
-> durable order settlement observation
|
|
262
262
|
```
|
|
263
263
|
|
|
264
|
-
The Commerce payment route requires authentication and uses the session SSR profile. Its controller
|
|
264
|
+
The Commerce payment route requires authentication and uses the session SSR profile. Its controller keeps server-required preparation separate from browser-only initialization and passes the latter through `$ssr.handleDirectOrOnHydrated(...)`. This helper returns without invoking its callback on the server, queues it until initial SSR hydration completes, and runs it immediately for SPA startup or later client navigation. The payment-session model avoids creating private server-side query state when cookies are unavailable or the Passport is not authenticated. After hydration and admission, the controller can reconcile, poll, and navigate using customer-authorized reads.
|
|
265
265
|
|
|
266
266
|
The invariant is more important than a particular visual shell: server HTML and the hydration-time initial render must agree about private payment/order data. Do not render customer-owned payment state on the server when the request cannot authorize it, and do not let the provider return itself settle Commerce.
|
|
267
267
|
|
|
@@ -89,8 +89,11 @@ After the origin is reachable with its TLS configuration:
|
|
|
89
89
|
SERVER_SERVE_PROTOCOL=https
|
|
90
90
|
SERVER_SERVE_HOST=example.com
|
|
91
91
|
SERVER_SUBDOMAINOFFSET=2
|
|
92
|
+
CORS_WHITE_LIST=https://app.example.com
|
|
92
93
|
```
|
|
93
94
|
|
|
95
|
+
`SERVER_SERVE_PROTOCOL` and `SERVER_SERVE_HOST` define the backend's canonical public origin; they do not automatically authorize a separately hosted browser frontend. When the frontend or another browser consumer uses a different origin, set `CORS_WHITE_LIST` to explicit comma-separated origins, as shown above. Keep this list limited to the origins that require browser access; do not use a wildcard as the production default. The normal CORS allowlist is also used by the built-in WebSocket origin check, while account credential-link flows require exact normalized HTTP(S) origins.
|
|
96
|
+
|
|
94
97
|
The base hostname resolves to the empty-name/default instance. For example, `acme.example.com` resolves to `acme`; a deeper hostname such as `eu.acme.example.com` resolves to `acme.eu` and requires that explicitly configured instance.
|
|
95
98
|
|
|
96
99
|
For current Cloudflare proxy-record behavior, see [Proxied DNS records](https://developers.cloudflare.com/dns/manage-dns-records/reference/proxied-dns-records/).
|
|
@@ -111,16 +114,19 @@ For current Cache Rule settings, see [Cache Rules settings](https://developers.c
|
|
|
111
114
|
|
|
112
115
|
## SSR cache contract
|
|
113
116
|
|
|
114
|
-
Zova SSR writes the public response-cache contract during rendering from the resolved profile and any public route-level `meta.ssrProfileOptions.responseCache` override. The effective SSR profile is authoritative: a `session` response always sets `Cache-Control: private, no-store` before route or profile response-cache policy is considered.
|
|
117
|
+
Zova SSR writes the public response-cache contract during rendering from the resolved profile, route locale metadata, and any public route-level `meta.ssrProfileOptions.responseCache` override. The effective SSR profile is authoritative: a `session` response always sets `Cache-Control: private, no-store` before route or profile response-cache policy is considered.
|
|
118
|
+
|
|
119
|
+
For a public route, the default response header depends on whether the URL identifies locale:
|
|
115
120
|
|
|
116
|
-
|
|
|
117
|
-
|
|
|
118
|
-
|
|
|
119
|
-
|
|
|
121
|
+
| Route condition | Default SSR response header | Cloudflare result with this rule |
|
|
122
|
+
| ------------------------------ | ------------------------------------------------------------------------ | --------------------------------- |
|
|
123
|
+
| `meta.locale: true` | `Cache-Control: public, max-age=600` using the Basic Web profile default | Eligible to cache for ten minutes |
|
|
124
|
+
| missing or false `meta.locale` | `Cache-Control: no-cache, no-store, must-revalidate` | Not stored |
|
|
125
|
+
| `session` profile | `Cache-Control: private, no-store` | Not stored |
|
|
120
126
|
|
|
121
127
|
For Cabloy Start, verify the effective Web and Admin values in the licensed Start repository before creating the Cloudflare rule. The rule design remains the same: preserve and follow the origin `Cache-Control` response instead of replacing it.
|
|
122
128
|
|
|
123
|
-
A route can override the flavor default through SSR route metadata.
|
|
129
|
+
A route can override the flavor default through SSR route metadata. An explicit public `meta.ssrProfileOptions.responseCache` policy remains authoritative; the Cloudflare rule follows the resulting response contract and does not replace it.
|
|
124
130
|
|
|
125
131
|
For the public Basic environment-variable details, see [SSR Environment Variables](/frontend/ssr-env).
|
|
126
132
|
|
|
@@ -131,6 +137,6 @@ After the origin is running, verify the following before relying on Cloudflare t
|
|
|
131
137
|
1. The base hostname returns the expected default instance.
|
|
132
138
|
2. Each configured subdomain resolves to its expected enabled instance.
|
|
133
139
|
3. Nginx forwards the browser hostname instead of the literal value `localhost`.
|
|
134
|
-
4. Web SSR returns the `Cache-Control` header expected from the active edition and flavor configuration
|
|
140
|
+
4. Web SSR returns the `Cache-Control` header expected from the active edition, route metadata, and flavor configuration: locale-aware public routes use the configured public cache default, while public routes without `meta.locale: true` use `no-cache, no-store, must-revalidate` unless they have an explicit cache override.
|
|
135
141
|
5. Admin SSR returns the `Cache-Control` header expected from the active edition and flavor configuration. In the current Basic baseline, it is `private, no-store`.
|
|
136
|
-
6. After Cloudflare proxying is enabled, responses
|
|
142
|
+
6. After Cloudflare proxying is enabled, only responses whose origin policy permits public caching are cached at the edge; responses marked `no-store` are not stored.
|
|
@@ -115,12 +115,16 @@ async function registerCustomer(
|
|
|
115
115
|
expect(captcha?.id).toEqual(expect.any(String));
|
|
116
116
|
expect(captcha?.token).toEqual(expect.any(String));
|
|
117
117
|
|
|
118
|
+
const baseURL = testInfo.project.use.baseURL;
|
|
119
|
+
if (!baseURL) throw new Error('commerce E2E base URL is unavailable');
|
|
120
|
+
const consumerUrl = new URL('/home/user/activation', baseURL).toString();
|
|
118
121
|
const registerResponse = await request.post('/api/home/user/passport/register', {
|
|
119
122
|
data: {
|
|
120
123
|
username,
|
|
121
124
|
email: `${username}@example.test`,
|
|
122
125
|
password,
|
|
123
126
|
passwordConfirm: password,
|
|
127
|
+
consumerUrl,
|
|
124
128
|
captcha: { id: captcha.id, token: captcha.token },
|
|
125
129
|
},
|
|
126
130
|
});
|
|
@@ -1506,6 +1510,16 @@ test(
|
|
|
1506
1510
|
await expect(childRow.getByText(parentName, { exact: true })).toBeVisible();
|
|
1507
1511
|
await expect(childRow.getByText('Published', { exact: true })).toBeVisible();
|
|
1508
1512
|
|
|
1513
|
+
await adminPage.goto(`${categoryListPath}/${parentId}/edit`, { waitUntil: 'load' });
|
|
1514
|
+
await expect(
|
|
1515
|
+
adminPage.getByRole('group', { name: 'Published' }).getByRole('combobox'),
|
|
1516
|
+
).toHaveValue('false');
|
|
1517
|
+
|
|
1518
|
+
await adminPage.goto(`${categoryListPath}/${childId}/edit`, { waitUntil: 'load' });
|
|
1519
|
+
await expect(
|
|
1520
|
+
adminPage.getByRole('group', { name: 'Published' }).getByRole('combobox'),
|
|
1521
|
+
).toHaveValue('true');
|
|
1522
|
+
|
|
1509
1523
|
await adminPage.goto(`${categoryListPath}/${childId}`, { waitUntil: 'load' });
|
|
1510
1524
|
await expect(
|
|
1511
1525
|
adminPage.getByRole('group', { name: 'Parent category' }).getByRole('textbox'),
|
|
@@ -1928,8 +1942,9 @@ test(
|
|
|
1928
1942
|
await adminPage.goto(skuCreatePath, { waitUntil: 'load' });
|
|
1929
1943
|
const productField = adminPage.getByRole('group', { name: 'Product' });
|
|
1930
1944
|
await expect(productField).toBeVisible();
|
|
1931
|
-
|
|
1932
|
-
await expect(
|
|
1945
|
+
const productPicker = productField.getByRole('combobox');
|
|
1946
|
+
await expect(productPicker).toBeVisible();
|
|
1947
|
+
await expect(productPicker).toHaveValue('');
|
|
1933
1948
|
const lifecycle = adminPage
|
|
1934
1949
|
.getByRole('group', { name: 'SKU lifecycle' })
|
|
1935
1950
|
.getByRole('combobox');
|