cabloy 5.1.50 → 5.1.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/cabloy-backend-scaffold/SKILL.md +207 -0
- package/.claude/skills/cabloy-backend-scaffold/evals/evals.json +29 -0
- package/.claude/skills/cabloy-backend-scaffold/references/backend-thread-map.md +52 -0
- package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +39 -0
- package/.claude/skills/cabloy-contract-loop/SKILL.md +201 -0
- package/.claude/skills/cabloy-contract-loop/evals/evals.json +29 -0
- package/.claude/skills/cabloy-contract-loop/references/contract-loop-map.md +47 -0
- package/.claude/skills/cabloy-contract-loop/references/verification-checklist.md +32 -0
- package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +230 -0
- package/.claude/skills/cabloy-frontend-scaffold/evals/evals.json +35 -0
- package/.claude/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +41 -0
- package/.claude/skills/cabloy-frontend-scaffold/references/frontend-thread-map.md +54 -0
- package/.claude/skills/cabloy-workflow/SKILL.md +292 -0
- package/.claude/skills/cabloy-workflow/evals/evals.json +35 -0
- package/.claude/skills/cabloy-workflow/references/cli-strategy.md +39 -0
- package/.claude/skills/cabloy-workflow/references/edition-detection.md +30 -0
- package/.github/workflows/docs-pages.yml +56 -0
- package/.gitignore +1 -0
- package/CHANGELOG.md +54 -0
- package/CLAUDE.md +59 -0
- package/README.md +152 -0
- package/cabloy-docs/.vitepress/config.mjs +255 -0
- package/cabloy-docs/.vitepress/public/CNAME +1 -0
- package/cabloy-docs/.vitepress/theme/custom.css +64 -0
- package/cabloy-docs/.vitepress/theme/edition-badges.md +5 -0
- package/cabloy-docs/.vitepress/theme/index.js +5 -0
- package/cabloy-docs/ai/class-placement-rule.md +139 -0
- package/cabloy-docs/ai/cli-for-agents.md +56 -0
- package/cabloy-docs/ai/cli-to-skill-map.md +165 -0
- package/cabloy-docs/ai/docs-skills-rules-mapping.md +168 -0
- package/cabloy-docs/ai/edition-consistency-checklist.md +150 -0
- package/cabloy-docs/ai/edition-detection.md +30 -0
- package/cabloy-docs/ai/future-skill-roadmap.md +135 -0
- package/cabloy-docs/ai/global-bean-lookup.md +158 -0
- package/cabloy-docs/ai/introduction.md +62 -0
- package/cabloy-docs/ai/playbook-backend-module.md +111 -0
- package/cabloy-docs/ai/playbook-contract-regeneration.md +100 -0
- package/cabloy-docs/ai/playbook-frontend-page.md +99 -0
- package/cabloy-docs/ai/playbook-metadata-refresh.md +67 -0
- package/cabloy-docs/ai/repo-guidance.md +58 -0
- package/cabloy-docs/ai/rules-and-config.md +29 -0
- package/cabloy-docs/ai/skills.md +37 -0
- package/cabloy-docs/ai/verification.md +31 -0
- package/cabloy-docs/ai/virtual-decorator-guidance.md +206 -0
- package/cabloy-docs/backend/aop-overview.md +128 -0
- package/cabloy-docs/backend/auth-guide.md +151 -0
- package/cabloy-docs/backend/backend-essentials.md +128 -0
- package/cabloy-docs/backend/broadcast-guide.md +138 -0
- package/cabloy-docs/backend/cache-guide.md +70 -0
- package/cabloy-docs/backend/captcha-guide.md +162 -0
- package/cabloy-docs/backend/cli.md +173 -0
- package/cabloy-docs/backend/config-guide.md +249 -0
- package/cabloy-docs/backend/controller-aop-guide.md +270 -0
- package/cabloy-docs/backend/controller-guide.md +347 -0
- package/cabloy-docs/backend/crud-workflow.md +118 -0
- package/cabloy-docs/backend/dto-guide.md +161 -0
- package/cabloy-docs/backend/dto-infer-generation.md +153 -0
- package/cabloy-docs/backend/dynamic-datasource-guide.md +70 -0
- package/cabloy-docs/backend/election-guide.md +141 -0
- package/cabloy-docs/backend/entity-guide.md +150 -0
- package/cabloy-docs/backend/error-guide.md +108 -0
- package/cabloy-docs/backend/event-guide.md +183 -0
- package/cabloy-docs/backend/external-aop-guide.md +149 -0
- package/cabloy-docs/backend/field-indexes.md +79 -0
- package/cabloy-docs/backend/foundation.md +281 -0
- package/cabloy-docs/backend/i18n-guide.md +211 -0
- package/cabloy-docs/backend/internal-aop-guide.md +181 -0
- package/cabloy-docs/backend/introduction.md +95 -0
- package/cabloy-docs/backend/jwt-guide.md +276 -0
- package/cabloy-docs/backend/logger-guide.md +223 -0
- package/cabloy-docs/backend/mail-guide.md +189 -0
- package/cabloy-docs/backend/menu-guide.md +80 -0
- package/cabloy-docs/backend/migration-and-changes.md +192 -0
- package/cabloy-docs/backend/model-guide.md +274 -0
- package/cabloy-docs/backend/multi-database-datasource.md +171 -0
- package/cabloy-docs/backend/multi-instance-and-instance-resolution.md +196 -0
- package/cabloy-docs/backend/openapi-guide.md +118 -0
- package/cabloy-docs/backend/orm-aggregate-group-guide.md +210 -0
- package/cabloy-docs/backend/orm-configuration-guide.md +165 -0
- package/cabloy-docs/backend/orm-guide.md +109 -0
- package/cabloy-docs/backend/orm-mutation-guide.md +195 -0
- package/cabloy-docs/backend/orm-select-guide.md +243 -0
- package/cabloy-docs/backend/queue-guide.md +271 -0
- package/cabloy-docs/backend/quickstart.md +141 -0
- package/cabloy-docs/backend/redis-guide.md +70 -0
- package/cabloy-docs/backend/redlock-guide.md +60 -0
- package/cabloy-docs/backend/relations-guide.md +250 -0
- package/cabloy-docs/backend/runtime-and-flavors.md +304 -0
- package/cabloy-docs/backend/schedule-guide.md +81 -0
- package/cabloy-docs/backend/scripts.md +116 -0
- package/cabloy-docs/backend/serialization-guide.md +192 -0
- package/cabloy-docs/backend/service-guide.md +166 -0
- package/cabloy-docs/backend/sharding-guide.md +49 -0
- package/cabloy-docs/backend/startup-guide.md +326 -0
- package/cabloy-docs/backend/transaction-guide.md +82 -0
- package/cabloy-docs/backend/unit-testing.md +209 -0
- package/cabloy-docs/backend/upload-guide.md +160 -0
- package/cabloy-docs/backend/user-access-guide.md +157 -0
- package/cabloy-docs/backend/validation-guide.md +80 -0
- package/cabloy-docs/backend/worker-guide.md +59 -0
- package/cabloy-docs/editions/cabloy-basic.md +26 -0
- package/cabloy-docs/editions/cabloy-start.md +55 -0
- package/cabloy-docs/editions/choosing-between-basic-and-start.md +84 -0
- package/cabloy-docs/editions/detection.md +31 -0
- package/cabloy-docs/editions/overview.md +107 -0
- package/cabloy-docs/frontend/api-guide.md +93 -0
- package/cabloy-docs/frontend/api-schema-guide.md +43 -0
- package/cabloy-docs/frontend/app-startup-guide.md +185 -0
- package/cabloy-docs/frontend/cli.md +78 -0
- package/cabloy-docs/frontend/component-guide.md +105 -0
- package/cabloy-docs/frontend/component-props-guide.md +97 -0
- package/cabloy-docs/frontend/component-v-model-guide.md +110 -0
- package/cabloy-docs/frontend/css-in-js-guide.md +151 -0
- package/cabloy-docs/frontend/design-principles.md +55 -0
- package/cabloy-docs/frontend/environment-config-guide.md +250 -0
- package/cabloy-docs/frontend/foundation.md +58 -0
- package/cabloy-docs/frontend/generic-component-guide.md +35 -0
- package/cabloy-docs/frontend/icon-engine-guide.md +88 -0
- package/cabloy-docs/frontend/introduction.md +33 -0
- package/cabloy-docs/frontend/ioc-and-beans.md +211 -0
- package/cabloy-docs/frontend/mock-guide.md +109 -0
- package/cabloy-docs/frontend/model-architecture.md +87 -0
- package/cabloy-docs/frontend/model-state-guide.md +70 -0
- package/cabloy-docs/frontend/module-scope.md +168 -0
- package/cabloy-docs/frontend/modules-and-suites.md +179 -0
- package/cabloy-docs/frontend/navigation-guards-guide.md +68 -0
- package/cabloy-docs/frontend/openapi-sdk-guide.md +102 -0
- package/cabloy-docs/frontend/page-guide.md +223 -0
- package/cabloy-docs/frontend/page-params-guide.md +87 -0
- package/cabloy-docs/frontend/page-query-guide.md +96 -0
- package/cabloy-docs/frontend/page-route-guide.md +147 -0
- package/cabloy-docs/frontend/quickstart.md +202 -0
- package/cabloy-docs/frontend/route-alias-guide.md +61 -0
- package/cabloy-docs/frontend/scripts.md +86 -0
- package/cabloy-docs/frontend/sdk-guide.md +45 -0
- package/cabloy-docs/frontend/server-data.md +74 -0
- package/cabloy-docs/frontend/ssr-client-only.md +40 -0
- package/cabloy-docs/frontend/ssr-env.md +51 -0
- package/cabloy-docs/frontend/ssr-init-data.md +46 -0
- package/cabloy-docs/frontend/ssr-overview.md +48 -0
- package/cabloy-docs/frontend/ssr-seo-meta.md +52 -0
- package/cabloy-docs/frontend/system-startup-guide.md +186 -0
- package/cabloy-docs/frontend/theme-guide.md +154 -0
- package/cabloy-docs/frontend/zod-guide.md +161 -0
- package/cabloy-docs/fullstack/cli.md +118 -0
- package/cabloy-docs/fullstack/comparison-with-other-frameworks.md +117 -0
- package/cabloy-docs/fullstack/edition-collaboration-differences.md +62 -0
- package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +64 -0
- package/cabloy-docs/fullstack/introduction.md +81 -0
- package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -0
- package/cabloy-docs/fullstack/quickstart.md +89 -0
- package/cabloy-docs/fullstack/vona-zova-integration.md +86 -0
- package/cabloy-docs/fullstack/vscode-extensions.md +126 -0
- package/cabloy-docs/index.md +72 -0
- package/cabloy-docs/package.json +16 -0
- package/cabloy-docs/pnpm-lock.yaml +1607 -0
- package/cabloy-docs/reference/backend-directory-structure.md +88 -0
- package/cabloy-docs/reference/cli-reference.md +49 -0
- package/cabloy-docs/reference/glossary.md +38 -0
- package/cabloy-docs/reference/package-map.md +105 -0
- package/cabloy-docs/reference/repo-scripts.md +36 -0
- package/package.json +4 -1
- package/scripts/init.ts +12 -0
- package/scripts/upgrade.ts +31 -3
- package/vona/README.md +4 -4
- package/vona/README.zh-CN.md +4 -4
- package/vona/packages-vona/vona/package.json +1 -1
- package/vona/pnpm-lock.yaml +383 -38
- 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/bean/summerCache.datasourceWrite.ts +2 -2
- 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 +49 -1
- package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/controller/memoryDiag.ts +97 -0
- package/vona/src/suite-vendor/a-cabloy/package.json +1 -1
- 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/bean/cacheRedis.captcha.ts +2 -2
- package/vona/src/suite-vendor/a-captcha/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-bean/cli/bean/metadata/generate.ts +5 -6
- package/vona/src/suite-vendor/a-vona/modules/a-bean/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-cache/cli/cacheMem/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-cache/cli/cacheRedis/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
- 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 +13 -2
- package/vona/src/suite-vendor/a-vona/modules/a-cache/src/bean/bean.cache.ts +6 -7
- package/vona/src/suite-vendor/a-vona/modules/a-cache/src/{bean/bean.cacheMemBase.ts → service/cacheMemBase_.ts} +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-cache/src/{bean/bean.cacheRedisBase.ts → service/cacheRedisBase_.ts} +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/cacheRedis.emailConfirm.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/cacheRedis.passwordReset.ts +2 -2
- 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/bean/summerCache.json.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-orm/cli/databaseDialect/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
- 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 +4 -3
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/bean/bean.database.ts +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/bean/bean.model.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/bean/schedule.softDeletionPrune.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/common/utils.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/index.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_cache.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_meta.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.modelBase.ts +0 -5
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoAggregate.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoCreate.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoGet.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoGroup.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoMutate.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoSelectAndCount.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoUpdate.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/index.ts +1 -0
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/modelCacheBase.ts +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relations.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relationsDynamic.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relationsMutate.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/relationsStatic.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/cacheEntity_.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/cacheQuery_.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/database.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean/bean.databaseDialectBase.ts → service/databaseDialectBase_.ts} +38 -41
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/db_.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/relations_.ts +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/database.ts +0 -5
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/dto/dtoGet.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/dto/dtoMutate.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/dto/dtoSelectAndCount.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/model.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelAggr.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelCount.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelGeneral.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelGroup.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/modelIncrement.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relations.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsColumns.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsDef.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsDefDynamic.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsDefMutate.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsMutate.ts +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsTables.ts +1 -1
- 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/bean/databaseDialect.betterSqlite3.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.mysql.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.pg.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/bean.permission.ts +109 -40
- package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/summerCache.permission.ts +2 -2
- 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/bean/cacheRedis.startupDebounce.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-summer/cli/boilerplate/{{sceneName}}.{{beanName}}.ts_ +2 -2
- 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 +1 -1
- package/vona/src/suite-vendor/a-vona/modules/a-summer/src/bean/bean.summer.ts +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-summer/src/service/localMem_.ts +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-summer/src/service/localRedis_.ts +3 -3
- package/vona/src/suite-vendor/a-vona/modules/a-summer/src/{bean/bean.summerCacheBase.ts → service/summerCacheBase_.ts} +3 -3
- 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/bean/summerCache.rapidoc.ts +2 -2
- package/vona/src/suite-vendor/a-vona/modules/a-swagger/src/bean/summerCache.swagger.ts +2 -2
- 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/bean/cacheRedis.authToken.ts +2 -2
- 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/bean/cacheRedis.workerAlive.ts +2 -2
- package/vona/src/suite-vendor/a-vona/package.json +1 -1
- package/zova/README.md +5 -5
- package/zova/README.zh-CN.md +4 -4
- package/zova/package.original.json +4 -4
- package/zova/packages-cli/cli/package.json +2 -2
- package/zova/packages-cli/cli-set-front/package.json +2 -2
- package/zova/packages-utils/zova-jsx/package.json +2 -2
- package/zova/packages-utils/zova-vite/package.json +2 -2
- package/zova/packages-utils/zova-vite/templates/app/controller.tsx_ +3 -3
- package/zova/packages-zova/zova/package.json +3 -3
- package/zova/packages-zova/zova-core/package.json +2 -2
- package/zova/packages-zova/zova-core/src/bean/beanContainer.ts +3 -3
- package/zova/packages-zova/zova-core/src/bean/beanControllerPageBase.ts +1 -0
- package/zova/packages-zova/zova-core/src/core/component/module.ts +16 -16
- package/zova/packages-zova/zova-core/src/core/context/component.ts +35 -3
- package/zova/packages-zova/zova-core/src/core/context/util.ts +15 -11
- package/zova/pnpm-lock.yaml +1596 -1679
- package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +11 -0
- package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/page/toolMinimal.ts +9 -0
- package/zova/src/suite/a-demo/modules/demo-basic/src/page/toolMinimal/controller.tsx +11 -0
- package/zova/src/suite/a-demo/modules/demo-basic/src/routes.ts +10 -0
- 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/service/storage.ts +4 -5
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/monkey.ts +1 -1
- 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/lib/ssr.ts +36 -1
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrMetaStore.ts +7 -2
- package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/monkey.ts +3 -0
- 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/service/ssrHandler.ts +70 -29
- package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/package.json +6 -6
- /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_crud.ts +0 -0
- /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_crud_inner.ts +0 -0
- /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_crud_table.ts +0 -0
- /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_knex.ts +0 -0
- /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_utils.ts +0 -0
- /package/vona/src/suite-vendor/a-vona/modules/a-orm/src/{bean → lib}/bean.model/bean.model_view.ts +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Component Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how components work in Zova within the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## What a component means in Zova
|
|
6
|
+
|
|
7
|
+
A Zova component is not only a reusable render unit. It is also part of the controller-oriented architecture that gives Zova its specific coding style.
|
|
8
|
+
|
|
9
|
+
That means component design is closely tied to:
|
|
10
|
+
|
|
11
|
+
- controller-based logic organization
|
|
12
|
+
- TSX rendering
|
|
13
|
+
- IOC-friendly instance access
|
|
14
|
+
- async-friendly module loading
|
|
15
|
+
- CSS-in-JS styling through the same controller-oriented architecture
|
|
16
|
+
|
|
17
|
+
For the practical styling decision map around local `$style`, dedicated style beans, shared/global styles, and token/theme surfaces, also see [CSS-in-JS Guide](/frontend/css-in-js-guide).
|
|
18
|
+
|
|
19
|
+
## Create a component
|
|
20
|
+
|
|
21
|
+
Example: create a component named `card` in module `demo-student`.
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm run zova :create:component card -- --module=demo-student
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Controller definition
|
|
28
|
+
|
|
29
|
+
Representative component controller shape:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
@Controller()
|
|
33
|
+
class ControllerCard extends BeanControllerBase {
|
|
34
|
+
protected render() {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Component wrapper
|
|
41
|
+
|
|
42
|
+
Zova automatically creates a wrapper component for each component.
|
|
43
|
+
|
|
44
|
+
Representative example:
|
|
45
|
+
|
|
46
|
+
- component: `card`
|
|
47
|
+
- wrapper: `ZCard`
|
|
48
|
+
|
|
49
|
+
The `Z` prefix is useful because it makes framework components easy to identify quickly inside TSX.
|
|
50
|
+
|
|
51
|
+
## Use a component
|
|
52
|
+
|
|
53
|
+
Representative usage pattern:
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { ZCard } from 'zova-module-demo-student';
|
|
57
|
+
|
|
58
|
+
class RenderPageCounter {
|
|
59
|
+
render() {
|
|
60
|
+
return <ZCard />;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Async loading behavior
|
|
66
|
+
|
|
67
|
+
Component wrappers can also participate in asynchronous loading behavior automatically.
|
|
68
|
+
|
|
69
|
+
This matters because the wrapper is not just a naming convenience. It is part of how Zova turns modular code into practical runtime behavior.
|
|
70
|
+
|
|
71
|
+
## Reference the component instance
|
|
72
|
+
|
|
73
|
+
Instead of relying on template refs in the usual Vue style, Zova prefers direct access to the component controller instance.
|
|
74
|
+
|
|
75
|
+
Representative pattern:
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
import type { ControllerCard } from 'zova-module-demo-student';
|
|
79
|
+
import { ZCard } from 'zova-module-demo-student';
|
|
80
|
+
|
|
81
|
+
class RenderPageCounter {
|
|
82
|
+
cardRef: ControllerCard;
|
|
83
|
+
|
|
84
|
+
render() {
|
|
85
|
+
return (
|
|
86
|
+
<ZCard
|
|
87
|
+
controllerRef={ref => {
|
|
88
|
+
this.cardRef = ref;
|
|
89
|
+
}}
|
|
90
|
+
/>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Practical implications for component implementation
|
|
97
|
+
|
|
98
|
+
When working on Zova components, do not automatically fall back to generic Vue component habits.
|
|
99
|
+
|
|
100
|
+
A better default is:
|
|
101
|
+
|
|
102
|
+
1. use the component generator
|
|
103
|
+
2. preserve the wrapper-based usage model
|
|
104
|
+
3. treat controller access as the primary instance-reference pattern
|
|
105
|
+
4. remember that wrapper behavior and async loading are part of the framework design
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Component Props Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how component props work in Zova within the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## Why Zova props feel different
|
|
6
|
+
|
|
7
|
+
In Zova, component design does not force a hard separation between `Props`, `Emits`, and `Slots` in the same way many Vue codebases do.
|
|
8
|
+
|
|
9
|
+
Zova uses a more unified approach centered on component props, which makes the programming model more concise and TypeScript-friendly.
|
|
10
|
+
|
|
11
|
+
## Add props support
|
|
12
|
+
|
|
13
|
+
Example: add props support to component `card`.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm run zova :refactor:componentProps card -- --module=demo-student
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Define props
|
|
20
|
+
|
|
21
|
+
Representative pattern:
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { ISlot } from 'zova';
|
|
25
|
+
|
|
26
|
+
export interface ControllerCardProps {
|
|
27
|
+
content?: string;
|
|
28
|
+
onReset?: () => void;
|
|
29
|
+
slotHeader?: ISlot;
|
|
30
|
+
slotDefault?: (name: string) => VNode;
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This is important because the props contract can describe ordinary values, callbacks, and slot-like behavior in one consistent shape.
|
|
35
|
+
|
|
36
|
+
## Default values
|
|
37
|
+
|
|
38
|
+
Representative pattern:
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
class ControllerCard {
|
|
42
|
+
static $propsDefault = {
|
|
43
|
+
content: 'no content',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Use props in the controller
|
|
49
|
+
|
|
50
|
+
Zova injects `$props` into the controller base class.
|
|
51
|
+
|
|
52
|
+
Representative pattern:
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
class ControllerCard {
|
|
56
|
+
render() {
|
|
57
|
+
return (
|
|
58
|
+
<div>
|
|
59
|
+
<div>{this.$props.slotHeader?.()}</div>
|
|
60
|
+
<div>{this.$slotDefault?.('tom')}</div>
|
|
61
|
+
<div>{this.$props.content}</div>
|
|
62
|
+
<button onClick={() => this.$props.onReset?.()}>Reset</button>
|
|
63
|
+
</div>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Pass props to child components
|
|
70
|
+
|
|
71
|
+
Representative pattern:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
<ZCard
|
|
75
|
+
content="custom content"
|
|
76
|
+
onReset={() => {
|
|
77
|
+
console.log('onReset is invoked');
|
|
78
|
+
}}
|
|
79
|
+
slotHeader={() => {
|
|
80
|
+
return <div>custom header</div>;
|
|
81
|
+
}}
|
|
82
|
+
slotDefault={name => {
|
|
83
|
+
return <div>{name}</div>;
|
|
84
|
+
}}
|
|
85
|
+
/>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Practical implications for component API design
|
|
89
|
+
|
|
90
|
+
When creating or refactoring Zova components, do not automatically impose a generic Vue component API style.
|
|
91
|
+
|
|
92
|
+
A better default is:
|
|
93
|
+
|
|
94
|
+
1. use the Zova refactor command to add the props skeleton
|
|
95
|
+
2. keep the props contract explicit and typed
|
|
96
|
+
3. treat props as the main contract surface for values, callbacks, and slot-like behavior
|
|
97
|
+
4. preserve the controller-oriented way of consuming props inside the component
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Component v-model Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how component `v-model` works in Zova within the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## Why Zova `v-model` matters
|
|
6
|
+
|
|
7
|
+
Zova makes it convenient to add two-way binding behavior to a component while keeping the binding logic visible inside the controller model.
|
|
8
|
+
|
|
9
|
+
That is important because the framework treats model binding as part of the controller-oriented component architecture, not just as template sugar.
|
|
10
|
+
|
|
11
|
+
## Add the basic `modelValue` skeleton
|
|
12
|
+
|
|
13
|
+
Example: add `modelValue` to component `card`.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm run zova :refactor:componentModel card modelValue -- --module=demo-student
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Representative generated shape
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
export interface ControllerCardModels {
|
|
23
|
+
vModel?: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@Controller()
|
|
27
|
+
export class ControllerCard extends BeanControllerBase {
|
|
28
|
+
static $propsDefault = {
|
|
29
|
+
modelValue: 0,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
modelValue: number;
|
|
33
|
+
|
|
34
|
+
protected async __init__() {
|
|
35
|
+
this.modelValue = this.$useModel('modelValue');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Use `v-model` inside the component
|
|
41
|
+
|
|
42
|
+
Representative pattern:
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
class ControllerCard {
|
|
46
|
+
render() {
|
|
47
|
+
return (
|
|
48
|
+
<div>
|
|
49
|
+
<div>{this.modelValue}</div>
|
|
50
|
+
<button
|
|
51
|
+
onClick={() => {
|
|
52
|
+
this.modelValue++;
|
|
53
|
+
}}
|
|
54
|
+
>
|
|
55
|
+
Change
|
|
56
|
+
</button>
|
|
57
|
+
</div>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
The key idea is that changing `this.modelValue` updates the bound parent-side value through the framework binding model.
|
|
64
|
+
|
|
65
|
+
## Pass `v-model` from the parent
|
|
66
|
+
|
|
67
|
+
Representative pattern:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
class ControllerOther {
|
|
71
|
+
count: number;
|
|
72
|
+
|
|
73
|
+
render() {
|
|
74
|
+
return <ZCard vModel={this.count} />;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Named `v-model` parameters
|
|
80
|
+
|
|
81
|
+
`modelValue` is only the default binding name. Other binding names can be added, for example `title`.
|
|
82
|
+
|
|
83
|
+
Representative generation command:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npm run zova :refactor:componentModel card title -- --module=demo-student
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Representative usage pattern:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
<ZCard vModel:title={this.title} />
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Modifiers
|
|
96
|
+
|
|
97
|
+
Zova also supports modifiers through the same broader binding model.
|
|
98
|
+
|
|
99
|
+
One representative example uses a custom `capitalize` modifier, implemented by passing a setter transformation into `$useModel`.
|
|
100
|
+
|
|
101
|
+
That is useful because it shows `v-model` behavior in Zova is programmable and explicit, not just a fixed syntax feature.
|
|
102
|
+
|
|
103
|
+
## Implementation checks for component binding changes
|
|
104
|
+
|
|
105
|
+
When adding two-way binding to a Zova component:
|
|
106
|
+
|
|
107
|
+
1. use the Zova refactor command to create the skeleton
|
|
108
|
+
2. keep the binding visible through `Controller*Models` and `$useModel`
|
|
109
|
+
3. choose between default and named model parameters deliberately
|
|
110
|
+
4. use modifiers through the framework pattern instead of inventing parallel custom binding logic
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# CSS-in-JS Guide
|
|
2
|
+
|
|
3
|
+
This guide explains the role of CSS-in-JS in Zova within the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## Why CSS-in-JS matters in Zova
|
|
6
|
+
|
|
7
|
+
Zova uses a built-in CSS-in-JS approach so styling can stay close to component and page logic without collapsing into uncontrolled global CSS.
|
|
8
|
+
|
|
9
|
+
This is often explained through TypeStyle, but the main point is not novelty. The goal is a styling system that stays flexible, scoped, and framework-friendly in larger applications.
|
|
10
|
+
|
|
11
|
+
## Core benefits
|
|
12
|
+
|
|
13
|
+
Several enduring benefits stand out:
|
|
14
|
+
|
|
15
|
+
- scoped styles that reduce conflicts
|
|
16
|
+
- dynamic style generation from reactive state
|
|
17
|
+
- token support independent of UI libraries
|
|
18
|
+
- theme support independent of UI libraries
|
|
19
|
+
- easier debugging through development-friendly class naming
|
|
20
|
+
- built-in template support for multiple UI-library strategies
|
|
21
|
+
|
|
22
|
+
## Choose the right styling mechanism
|
|
23
|
+
|
|
24
|
+
A practical decision map is:
|
|
25
|
+
|
|
26
|
+
| Use this | When it fits best |
|
|
27
|
+
| ----------------------------------------- | --------------------------------------------------------------------------------------- |
|
|
28
|
+
| `this.$style(...)` | local scoped styles near one controller, render bean, or style bean |
|
|
29
|
+
| dedicated style bean with `BeanStyleBase` | the page or component has enough styling logic to deserve its own file or boundary |
|
|
30
|
+
| `@Css()` and `$cssBase` | shared/global style vocabulary should be reused across many pages or components |
|
|
31
|
+
| `$token` | style values should come from theme-defined design values instead of hardcoded literals |
|
|
32
|
+
| `$theme` | runtime behavior needs to read or switch the active theme or dark-mode state |
|
|
33
|
+
|
|
34
|
+
The important point is that these are not competing styling systems. They are connected surfaces inside one Zova styling architecture.
|
|
35
|
+
|
|
36
|
+
## Local scoped styles with `this.$style(...)`
|
|
37
|
+
|
|
38
|
+
`this.$style(...)` is the normal entrypoint for local scoped class generation.
|
|
39
|
+
|
|
40
|
+
Use it when the style belongs to one page, component, or style bean and should stay close to the current controller-oriented logic.
|
|
41
|
+
|
|
42
|
+
This is a good default for:
|
|
43
|
+
|
|
44
|
+
- one-off local classes
|
|
45
|
+
- styles driven by local runtime state
|
|
46
|
+
- styles that should remain scoped instead of becoming app-wide vocabulary
|
|
47
|
+
|
|
48
|
+
## Dedicated style beans with `BeanStyleBase`
|
|
49
|
+
|
|
50
|
+
When styling grows beyond a small local block, split it into a dedicated style bean instead of forcing everything to remain inline.
|
|
51
|
+
|
|
52
|
+
A practical rule is:
|
|
53
|
+
|
|
54
|
+
- use local `this.$style(...)` first when the styling is still small
|
|
55
|
+
- move into a dedicated style bean when the page or component needs a clearer styling boundary
|
|
56
|
+
|
|
57
|
+
This is an organizational split, not a different styling engine. Zova still uses the same CSS-in-JS model; it simply gives larger pages and components a better place to hold their style concerns.
|
|
58
|
+
|
|
59
|
+
## Shared/global styles with `@Css()` and `$cssBase`
|
|
60
|
+
|
|
61
|
+
Not every style should stay local.
|
|
62
|
+
|
|
63
|
+
Use shared/global styles when the application needs reusable style vocabulary that should be available across multiple pages or components.
|
|
64
|
+
|
|
65
|
+
A practical distinction is:
|
|
66
|
+
|
|
67
|
+
- use local scoped classes when the style belongs to one page or component
|
|
68
|
+
- use `@Css()` and `$cssBase` when the style should be shared as part of broader app-level styling vocabulary
|
|
69
|
+
|
|
70
|
+
That is the practical global-style story in Zova: shared styles still live inside the framework model instead of falling back to uncontrolled ad hoc global CSS.
|
|
71
|
+
|
|
72
|
+
## How styles consume tokens
|
|
73
|
+
|
|
74
|
+
When a value represents design meaning rather than a one-off literal, prefer `$token` over hardcoded values.
|
|
75
|
+
|
|
76
|
+
That is especially useful for:
|
|
77
|
+
|
|
78
|
+
- colors
|
|
79
|
+
n- spacing or sizing conventions owned by the theme
|
|
80
|
+
- component-surface values that should change with dark mode or brand theme
|
|
81
|
+
|
|
82
|
+
This keeps style logic flexible across themes and editions without changing the underlying styling architecture.
|
|
83
|
+
|
|
84
|
+
## Style -> token -> theme flow
|
|
85
|
+
|
|
86
|
+
A useful mental model is:
|
|
87
|
+
|
|
88
|
+
1. `this.$style(...)` generates scoped classes
|
|
89
|
+
2. those classes can consume `this.$token`
|
|
90
|
+
3. token values come from the active theme
|
|
91
|
+
4. theme beans provide the concrete token values
|
|
92
|
+
5. runtime theme switching changes the active token set
|
|
93
|
+
|
|
94
|
+
That means CSS-in-JS, tokens, and themes are not separate ideas. They are one connected frontend styling flow.
|
|
95
|
+
|
|
96
|
+
For the token and theme lifecycle itself, also see [Theme Guide](/frontend/theme-guide).
|
|
97
|
+
|
|
98
|
+
## Debugging generated class names
|
|
99
|
+
|
|
100
|
+
CSS-in-JS class names are framework-generated for scoping, but they still remain debuggable during development.
|
|
101
|
+
|
|
102
|
+
A practical rule is:
|
|
103
|
+
|
|
104
|
+
- treat generated class names as framework output rather than as a hand-authored public CSS API
|
|
105
|
+
- use the development-friendly naming help to trace where a style came from when debugging
|
|
106
|
+
|
|
107
|
+
## Why UI-library independence matters
|
|
108
|
+
|
|
109
|
+
This is especially important in Cabloy because the two editions diverge in frontend stack choices:
|
|
110
|
+
|
|
111
|
+
- **Cabloy Basic** aligns with DaisyUI + TailwindCSS oriented examples
|
|
112
|
+
- **Cabloy Start** aligns with Vuetify-oriented modules
|
|
113
|
+
|
|
114
|
+
A UI-library-independent styling layer makes it easier for the same architectural ideas to survive across both editions.
|
|
115
|
+
|
|
116
|
+
## Styling in the controller-oriented model
|
|
117
|
+
|
|
118
|
+
In Zova, styling is not an unrelated afterthought. It fits into the same controller-oriented architecture as state and render logic.
|
|
119
|
+
|
|
120
|
+
That is why examples often use style generation directly from a controller or style-oriented bean rather than splitting everything into a separate CSS asset by default.
|
|
121
|
+
|
|
122
|
+
## What stays shared across editions
|
|
123
|
+
|
|
124
|
+
Across Cabloy Basic and Cabloy Start, the styling architecture itself stays shared:
|
|
125
|
+
|
|
126
|
+
- CSS-in-JS remains the primary styling model
|
|
127
|
+
- local scoped styles still use `$style`
|
|
128
|
+
- larger styling concerns can still move into dedicated style beans
|
|
129
|
+
- shared/global styling can still use `@Css()` and `$cssBase`
|
|
130
|
+
- token and theme behavior still form the same architecture
|
|
131
|
+
- runtime theme switching still belongs to the same `$theme` model
|
|
132
|
+
|
|
133
|
+
What may still vary by edition or UI library is:
|
|
134
|
+
|
|
135
|
+
- token shape details
|
|
136
|
+
- concrete token values
|
|
137
|
+
- theme-handler integration details
|
|
138
|
+
- surrounding utility-class or component-library conventions
|
|
139
|
+
|
|
140
|
+
That means edition differences usually change the surrounding UI stack, not the core styling architecture.
|
|
141
|
+
|
|
142
|
+
## Implementation checks for frontend styling changes
|
|
143
|
+
|
|
144
|
+
When changing frontend styling in Zova, ask:
|
|
145
|
+
|
|
146
|
+
1. should this use the built-in CSS-in-JS path instead of ad hoc external CSS?
|
|
147
|
+
2. does the style depend on reactive or runtime state?
|
|
148
|
+
3. does the active edition affect only the UI library, while the styling architecture remains shared?
|
|
149
|
+
4. should token or theme mechanisms be used instead of hardcoded values?
|
|
150
|
+
|
|
151
|
+
That keeps style work aligned with Zova’s actual design.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Frontend Design Principles
|
|
2
|
+
|
|
3
|
+
This guide explains the core design principles behind Zova in the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## Intuitive reactivity
|
|
6
|
+
|
|
7
|
+
Zova keeps Vue3’s reactive strengths, but aims for a code style that feels closer to native variable usage than traditional `ref/reactive`-heavy code.
|
|
8
|
+
|
|
9
|
+
The practical design goal is not just shorter syntax. It is to keep business code understandable even as the system grows.
|
|
10
|
+
|
|
11
|
+
## Unified model-based state
|
|
12
|
+
|
|
13
|
+
A major Zova idea is that multiple state categories can be handled through one model-centered mental model instead of unrelated mechanisms.
|
|
14
|
+
|
|
15
|
+
Four common categories help explain this model:
|
|
16
|
+
|
|
17
|
+
- asynchronous server-side data
|
|
18
|
+
- local storage data
|
|
19
|
+
- cookie data
|
|
20
|
+
- in-memory data
|
|
21
|
+
|
|
22
|
+
In Zova, these are intentionally brought under a more unified `Model` abstraction so SSR support, usage patterns, and maintenance expectations stay more consistent.
|
|
23
|
+
|
|
24
|
+
## IOC as the sharing model
|
|
25
|
+
|
|
26
|
+
State and behavior sharing across several scopes can be expressed through IOC rather than a pile of unrelated patterns.
|
|
27
|
+
|
|
28
|
+
Representative scopes include:
|
|
29
|
+
|
|
30
|
+
- component-internal sharing
|
|
31
|
+
- between-components sharing
|
|
32
|
+
- app-global sharing
|
|
33
|
+
- system-level sharing
|
|
34
|
+
|
|
35
|
+
This is one of the clearest reasons Zova code can look different from conventional Vue code while staying structured for large systems.
|
|
36
|
+
|
|
37
|
+
## IOC + AOP for extensibility
|
|
38
|
+
|
|
39
|
+
Zova does not treat IOC as only a dependency injection mechanism. It also layers AOP-oriented extensibility on top of IOC so the system can grow without forcing every concern into the same class body.
|
|
40
|
+
|
|
41
|
+
That is especially valuable for:
|
|
42
|
+
|
|
43
|
+
- logging
|
|
44
|
+
- cross-cutting behavior
|
|
45
|
+
- internal and external extension points
|
|
46
|
+
- large-scale maintainability
|
|
47
|
+
|
|
48
|
+
## Practical implications for implementation
|
|
49
|
+
|
|
50
|
+
These design principles should influence how code is extended in Zova. For the deeper structural model behind these principles, see [IoC and Beans](/frontend/ioc-and-beans), [Modules and Suites](/frontend/modules-and-suites), and [Module Scope](/frontend/module-scope).
|
|
51
|
+
|
|
52
|
+
- do not rewrite Zova code toward generic Vue habits automatically
|
|
53
|
+
- do not assume `ref.value`-style patterns are the desired end state
|
|
54
|
+
- prefer existing model, IOC, and AOP conventions when extending code
|
|
55
|
+
- verify whether an existing Zova abstraction already solves the problem before introducing a framework-neutral pattern
|