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,250 @@
|
|
|
1
|
+
# Environment and Config Guide
|
|
2
|
+
|
|
3
|
+
## Why this guide matters
|
|
4
|
+
|
|
5
|
+
Zova uses a multi-dimensional environment and configuration model so frontend behavior can vary cleanly across runtime scenarios without scattering ad hoc conditionals through the codebase.
|
|
6
|
+
|
|
7
|
+
That matters because SSR, SPA, edition-specific flavors, and deployment-specific variants all need a shared way to select the right settings.
|
|
8
|
+
|
|
9
|
+
## The three core dimensions
|
|
10
|
+
|
|
11
|
+
Zova’s frontend runtime model is built around three dimensions:
|
|
12
|
+
|
|
13
|
+
- **mode**
|
|
14
|
+
- **appMode**
|
|
15
|
+
- **flavor**
|
|
16
|
+
|
|
17
|
+
Together they determine which env variables, config files, and script paths should be active.
|
|
18
|
+
|
|
19
|
+
## Runtime mode
|
|
20
|
+
|
|
21
|
+
Runtime mode describes whether the app is running in:
|
|
22
|
+
|
|
23
|
+
- `development`
|
|
24
|
+
- `production`
|
|
25
|
+
|
|
26
|
+
This affects script behavior, environment loading, and tree-shakeable flags such as `DEV` and `PROD`.
|
|
27
|
+
|
|
28
|
+
## App mode
|
|
29
|
+
|
|
30
|
+
App mode describes the application delivery model, such as:
|
|
31
|
+
|
|
32
|
+
- `ssr`
|
|
33
|
+
- `spa`
|
|
34
|
+
|
|
35
|
+
This matters because SSR and SPA have different runtime assumptions, build paths, and environment-sensitive code behavior.
|
|
36
|
+
|
|
37
|
+
## Flavor
|
|
38
|
+
|
|
39
|
+
Flavor adds a third dimension so the frontend can support different product or UI variants without flattening everything into only one mode axis.
|
|
40
|
+
|
|
41
|
+
Representative built-in flavors include:
|
|
42
|
+
|
|
43
|
+
- `admin`
|
|
44
|
+
- `web`
|
|
45
|
+
- `cabloyBasicAdmin`
|
|
46
|
+
- `cabloyStartAdmin`
|
|
47
|
+
- `cabloyStartWeb`
|
|
48
|
+
|
|
49
|
+
Flavor is especially important in Cabloy because Basic and Start do not always share the same frontend stack or output assumptions.
|
|
50
|
+
|
|
51
|
+
## Env-file loading model
|
|
52
|
+
|
|
53
|
+
Zova loads env files from `env/` using the multi-dimensional model.
|
|
54
|
+
|
|
55
|
+
Representative patterns include:
|
|
56
|
+
|
|
57
|
+
- `.env`
|
|
58
|
+
- `.env.[meta]`
|
|
59
|
+
- `.env.local`
|
|
60
|
+
- `.env.[meta].local`
|
|
61
|
+
|
|
62
|
+
This means env loading is layered and conditional rather than single-file only.
|
|
63
|
+
|
|
64
|
+
## Config-file loading model
|
|
65
|
+
|
|
66
|
+
Zova also loads frontend config files from `src/front/config/config/` using the same multi-dimensional logic.
|
|
67
|
+
|
|
68
|
+
Representative patterns include:
|
|
69
|
+
|
|
70
|
+
- `config.ts`
|
|
71
|
+
- `config.[meta].ts`
|
|
72
|
+
- `config.local.ts`
|
|
73
|
+
- `config.[meta].local.ts`
|
|
74
|
+
|
|
75
|
+
That keeps env variables and frontend config aligned around the same runtime-selection model.
|
|
76
|
+
|
|
77
|
+
## Resolution principle
|
|
78
|
+
|
|
79
|
+
The practical rule is:
|
|
80
|
+
|
|
81
|
+
- base files always load
|
|
82
|
+
- meta-specific files load when their dimensions match
|
|
83
|
+
- `.local` files override while remaining git-ignored
|
|
84
|
+
|
|
85
|
+
This lets projects combine shared defaults with scenario-specific and local overrides cleanly.
|
|
86
|
+
|
|
87
|
+
A representative SSR admin development stack looks like:
|
|
88
|
+
|
|
89
|
+
```txt
|
|
90
|
+
.env
|
|
91
|
+
.env.ssr
|
|
92
|
+
.env.ssr.admin
|
|
93
|
+
.env.ssr.admin.development
|
|
94
|
+
.env.local
|
|
95
|
+
.env.ssr.local
|
|
96
|
+
.env.ssr.admin.local
|
|
97
|
+
.env.ssr.admin.development.local
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The config side follows the same merge pattern with `config.ts`, `config.[meta].ts`, and `.local` variants.
|
|
101
|
+
|
|
102
|
+
## Scripts and runtime variants
|
|
103
|
+
|
|
104
|
+
Frontend scripts map directly onto the same runtime dimensions.
|
|
105
|
+
|
|
106
|
+
Representative commands include variants such as:
|
|
107
|
+
|
|
108
|
+
- `dev:ssr:admin`
|
|
109
|
+
- `build:ssr:admin`
|
|
110
|
+
- `preview:ssr:admin`
|
|
111
|
+
- `dev:ssr:web`
|
|
112
|
+
- `build:ssr:web`
|
|
113
|
+
- `dev:spa`
|
|
114
|
+
- `dev:ssr:cabloyBasicAdmin`
|
|
115
|
+
- `build:ssr:cabloyBasicWeb`
|
|
116
|
+
|
|
117
|
+
Representative current-repo script shapes include:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"dev": "npm run dev:ssr:admin",
|
|
122
|
+
"build": "npm run build:ssr:admin",
|
|
123
|
+
"preview": "npm run preview:ssr:admin",
|
|
124
|
+
"dev:ssr:admin": "npm run prerun && quasar dev --mode ssr --flavor admin",
|
|
125
|
+
"dev:ssr:web": "npm run prerun && quasar dev --mode ssr --flavor web",
|
|
126
|
+
"dev:spa": "npm run prerun && quasar dev --mode spa --flavor admin"
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
That means scripts are not just convenience aliases. They are the operational surface for selecting mode, appMode, and flavor.
|
|
131
|
+
|
|
132
|
+
For current monorepo usage, also see [Frontend Scripts](/frontend/scripts).
|
|
133
|
+
|
|
134
|
+
## Tree-shakeable env flags
|
|
135
|
+
|
|
136
|
+
Some environment variables are especially important because they support tree-shaking or compile-time branching.
|
|
137
|
+
|
|
138
|
+
Representative flags include:
|
|
139
|
+
|
|
140
|
+
- `META_MODE`
|
|
141
|
+
- `META_APP_MODE`
|
|
142
|
+
- `META_FLAVOR`
|
|
143
|
+
- `NODE_ENV`
|
|
144
|
+
- `DEV`
|
|
145
|
+
- `PROD`
|
|
146
|
+
- `SSR`
|
|
147
|
+
- `CLIENT`
|
|
148
|
+
- `SERVER`
|
|
149
|
+
|
|
150
|
+
This is one of the most important reasons environment access should be done deliberately rather than by inventing custom runtime checks everywhere.
|
|
151
|
+
|
|
152
|
+
## `process.env` vs `sys.env` vs `sys.config`
|
|
153
|
+
|
|
154
|
+
Use the right access path for the right kind of value:
|
|
155
|
+
|
|
156
|
+
- `process.env` for tree-shakeable env-based conditions
|
|
157
|
+
- `sys.env` for runtime env values that are not tree-shaken
|
|
158
|
+
- `sys.config` for the merged frontend config model
|
|
159
|
+
|
|
160
|
+
Representative patterns:
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
if (process.env.DEV) {
|
|
164
|
+
console.log('for development');
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const publicPath = this.sys.env.APP_PUBLIC_PATH;
|
|
168
|
+
const apiBaseURL = this.sys.config.api.baseURL;
|
|
169
|
+
const flavor = this.sys.config.meta.flavor;
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
This distinction is central to writing Zova code that behaves correctly across builds and runtime variants.
|
|
173
|
+
|
|
174
|
+
## Built-in env variables
|
|
175
|
+
|
|
176
|
+
Zova exposes built-in variables covering areas such as:
|
|
177
|
+
|
|
178
|
+
- app identity
|
|
179
|
+
- router mode
|
|
180
|
+
- dev-server settings
|
|
181
|
+
- project-disabled suites/modules
|
|
182
|
+
- build output settings
|
|
183
|
+
- API/proxy configuration
|
|
184
|
+
- SSR-specific values
|
|
185
|
+
- mock configuration
|
|
186
|
+
|
|
187
|
+
That means many common project-level knobs already exist and should be reused before inventing project-specific patterns.
|
|
188
|
+
|
|
189
|
+
## Custom flavors
|
|
190
|
+
|
|
191
|
+
Projects can define custom flavors when built-in variants are not enough.
|
|
192
|
+
|
|
193
|
+
This usually requires:
|
|
194
|
+
|
|
195
|
+
- adding scripts that pass the new `--flavor` value
|
|
196
|
+
- using `META_FLAVOR` or `sys.config.meta.flavor` in code
|
|
197
|
+
- optionally augmenting type definitions for better autocomplete
|
|
198
|
+
|
|
199
|
+
Representative flavor type extension:
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
declare module '@cabloy/module-info' {
|
|
203
|
+
export interface ZovaMetaFlavorExtend {
|
|
204
|
+
customA: never;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
In the VSCode workflow, the `recordflavor` snippet can generate this augmentation skeleton.
|
|
210
|
+
|
|
211
|
+
## Async config loading
|
|
212
|
+
|
|
213
|
+
Frontend config files can also load asynchronously when configuration must be derived from a remote or generated source.
|
|
214
|
+
|
|
215
|
+
Representative pattern:
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
export default async function (_sys: ZovaSys) {
|
|
219
|
+
const config: ZovaConfigOptional = {};
|
|
220
|
+
|
|
221
|
+
// async load remote config
|
|
222
|
+
|
|
223
|
+
return config;
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
That should be used deliberately, because asynchronous config still participates in the same startup and merge model.
|
|
228
|
+
|
|
229
|
+
## Relationship to other frontend guides
|
|
230
|
+
|
|
231
|
+
Read this guide together with:
|
|
232
|
+
|
|
233
|
+
- [Frontend Scripts](/frontend/scripts)
|
|
234
|
+
- [SSR Environment Variables](/frontend/ssr-env)
|
|
235
|
+
- [Frontend Quickstart](/frontend/quickstart)
|
|
236
|
+
- [App Startup Guide](/frontend/app-startup-guide)
|
|
237
|
+
- [System Startup Guide](/frontend/system-startup-guide)
|
|
238
|
+
|
|
239
|
+
These guides explain the operational script surface, SSR-specific environment concerns, and the monorepo-first starting path.
|
|
240
|
+
|
|
241
|
+
## Implementation checks for runtime-sensitive changes
|
|
242
|
+
|
|
243
|
+
When changing frontend runtime-sensitive code, ask:
|
|
244
|
+
|
|
245
|
+
1. does this behavior depend on mode, appMode, flavor, or more than one of them?
|
|
246
|
+
2. should this logic read from `process.env`, `sys.env`, or `sys.config`?
|
|
247
|
+
3. is there already a built-in env/config variable for this concern?
|
|
248
|
+
4. does the active edition change which flavor or script family is correct?
|
|
249
|
+
|
|
250
|
+
That helps AI keep frontend runtime behavior aligned with Zova’s actual configuration model.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Frontend Foundation
|
|
2
|
+
|
|
3
|
+
This guide explains the core architectural role of Zova in the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## What Zova is in Cabloy
|
|
6
|
+
|
|
7
|
+
Zova is the frontend half of the Cabloy fullstack architecture.
|
|
8
|
+
|
|
9
|
+
It is an intuitive frontend framework that combines strengths associated with Vue3 reactivity, React-style TSX rendering, and Angular-style IOC.
|
|
10
|
+
|
|
11
|
+
## Why that matters in practice
|
|
12
|
+
|
|
13
|
+
The point of this combination is not branding. The point is to make large business systems feel more natural to write and maintain.
|
|
14
|
+
|
|
15
|
+
Three enduring ideas define this design:
|
|
16
|
+
|
|
17
|
+
- intuitive reactive code
|
|
18
|
+
- elegant structure for complex systems
|
|
19
|
+
- strong extensibility through IOC and AOP patterns
|
|
20
|
+
|
|
21
|
+
## UI-library flexibility
|
|
22
|
+
|
|
23
|
+
One point still matters throughout the monorepo docs:
|
|
24
|
+
|
|
25
|
+
Zova is not tied to one UI library.
|
|
26
|
+
|
|
27
|
+
That flexibility matters directly for Cabloy’s edition model:
|
|
28
|
+
|
|
29
|
+
- **Shared frontend engineering layer**: both editions follow the same Zova-centered frontend direction, with Vue, Vite, Quasar tooling, and related libraries
|
|
30
|
+
- **Cabloy Basic UI layer**: current public docs and examples align with DaisyUI + Tailwind CSS
|
|
31
|
+
- **Cabloy Start UI layer**: the private commercial edition aligns with Vuetify-oriented frontend modules, workflows, and SSR site baselines
|
|
32
|
+
|
|
33
|
+
So docs and skills must separate shared Zova principles from edition-specific UI assumptions.
|
|
34
|
+
|
|
35
|
+
## Enduring frontend capabilities
|
|
36
|
+
|
|
37
|
+
The highest-value Zova capabilities to preserve in the unified docs are:
|
|
38
|
+
|
|
39
|
+
- SSR support across `SSR`, `SPA`, `Web`, and `Admin` flows
|
|
40
|
+
- dual-layer tabs navigation
|
|
41
|
+
- CRUD-oriented rendering patterns
|
|
42
|
+
- model-based unified state management
|
|
43
|
+
- CSS-in-JS and theme support
|
|
44
|
+
- IOC + AOP extensibility
|
|
45
|
+
- compatibility with multiple UI-library strategies
|
|
46
|
+
|
|
47
|
+
For the deeper architectural concepts behind IoC, module boundaries, and scope-based resources, see [IoC and Beans](/frontend/ioc-and-beans), [Modules and Suites](/frontend/modules-and-suites), and [Module Scope](/frontend/module-scope). For the runtime-variant and startup model, see [Environment and Config Guide](/frontend/environment-config-guide), [App Startup Guide](/frontend/app-startup-guide), and [System Startup Guide](/frontend/system-startup-guide).
|
|
48
|
+
|
|
49
|
+
## Why this matters for AI development
|
|
50
|
+
|
|
51
|
+
AI systems should not treat Zova as generic Vue with a few utilities.
|
|
52
|
+
|
|
53
|
+
Instead, they should:
|
|
54
|
+
|
|
55
|
+
- preserve Zova’s model, IOC, and AOP conventions
|
|
56
|
+
- detect the active edition before assuming a UI-library workflow
|
|
57
|
+
- prefer the Zova CLI for scaffolding and refactor work
|
|
58
|
+
- verify that the generated or edited code still matches Zova’s actual architecture
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Generic Component Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how generic components work in Zova within the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## Why generic components matter
|
|
6
|
+
|
|
7
|
+
Zova supports generic components so strongly typed reusable components can preserve richer type information across usage sites.
|
|
8
|
+
|
|
9
|
+
This matters in large TypeScript-heavy systems because generic components help keep abstraction reusable without giving up strong typing.
|
|
10
|
+
|
|
11
|
+
## Convert a component to a generic component
|
|
12
|
+
|
|
13
|
+
Example: convert component `card` into a generic component.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm run zova :refactor:componentGeneric card -- --module=demo-student
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Why the CLI matters here
|
|
20
|
+
|
|
21
|
+
This topic is intentionally short, but the implication is important: generic-component conversion is not treated as an ad hoc manual rewrite. It is part of the framework’s supported refactor surface.
|
|
22
|
+
|
|
23
|
+
That means the safest default is to let the Zova refactor command establish the skeleton first, then refine the typing and behavior.
|
|
24
|
+
|
|
25
|
+
## Implementation checks for reusable component design
|
|
26
|
+
|
|
27
|
+
When you see a component that is reused across multiple typed data shapes, ask whether the right answer is a generic component instead of copying the component into several near-duplicate variants.
|
|
28
|
+
|
|
29
|
+
A better default is:
|
|
30
|
+
|
|
31
|
+
1. inspect whether the component really needs generic typing
|
|
32
|
+
2. use the Zova generic-component refactor command
|
|
33
|
+
3. refine the resulting type surface instead of inventing a framework-foreign pattern
|
|
34
|
+
|
|
35
|
+
That keeps generic typing aligned with Zova’s supported refactor workflow.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Icon Engine Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how the icon engine works in Zova within the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## Why the icon engine exists
|
|
6
|
+
|
|
7
|
+
In large systems, no fixed built-in icon set is ever enough.
|
|
8
|
+
|
|
9
|
+
Zova’s icon engine solves that problem by treating icons as a modular, asynchronous, UI-library-independent resource system.
|
|
10
|
+
|
|
11
|
+
## Core advantages
|
|
12
|
+
|
|
13
|
+
Several important advantages stand out:
|
|
14
|
+
|
|
15
|
+
- easy icon maintenance
|
|
16
|
+
- performance-conscious loading behavior
|
|
17
|
+
- asynchronous loading on demand
|
|
18
|
+
- UI-library independence
|
|
19
|
+
|
|
20
|
+
This is especially important for Cabloy because the same icon strategy should work across Basic and Start even when their UI libraries differ.
|
|
21
|
+
|
|
22
|
+
## Basic concepts
|
|
23
|
+
|
|
24
|
+
The icon engine is organized around two ideas:
|
|
25
|
+
|
|
26
|
+
### Icon group
|
|
27
|
+
|
|
28
|
+
A group combines multiple SVG icons into one asynchronously loaded unit.
|
|
29
|
+
|
|
30
|
+
### Icon module
|
|
31
|
+
|
|
32
|
+
An icon module can contain multiple groups, and a system can contain multiple icon modules.
|
|
33
|
+
|
|
34
|
+
## Naming convention
|
|
35
|
+
|
|
36
|
+
The naming convention is:
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
{moduleName}:{groupName}:{iconName}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Representative example:
|
|
43
|
+
|
|
44
|
+
- full name: `home-icon:default:add`
|
|
45
|
+
|
|
46
|
+
There are also shorthand rules, such as:
|
|
47
|
+
|
|
48
|
+
- `::add`
|
|
49
|
+
- `:auth:github`
|
|
50
|
+
- `test-othericon::icon`
|
|
51
|
+
|
|
52
|
+
This matters because icon use is part of the framework’s typed, discoverable resource model.
|
|
53
|
+
|
|
54
|
+
## Access helpers
|
|
55
|
+
|
|
56
|
+
Two important helpers are:
|
|
57
|
+
|
|
58
|
+
- `icon` for typed icon-name access and completion
|
|
59
|
+
- `iconh` for directly generating the icon vnode
|
|
60
|
+
|
|
61
|
+
## UI-library independence
|
|
62
|
+
|
|
63
|
+
The icon engine exposes a unified interface that can be used from multiple UI libraries.
|
|
64
|
+
|
|
65
|
+
This is one of the clearest places where Zova’s architecture deliberately protects higher-level app code from UI-library churn.
|
|
66
|
+
|
|
67
|
+
## Create and build icons
|
|
68
|
+
|
|
69
|
+
A simple process looks like this:
|
|
70
|
+
|
|
71
|
+
1. initialize the icon skeleton
|
|
72
|
+
2. place SVG icons into the module/group directory
|
|
73
|
+
3. regenerate metadata
|
|
74
|
+
|
|
75
|
+
The metadata generation step matters because icons are part of the framework’s typed resource graph.
|
|
76
|
+
|
|
77
|
+
## Implementation checks for icon-related changes
|
|
78
|
+
|
|
79
|
+
When adding icons, do not hardcode one-off icon usage patterns too quickly.
|
|
80
|
+
|
|
81
|
+
A better default is to ask:
|
|
82
|
+
|
|
83
|
+
1. should the icon belong in an existing icon module or a new one?
|
|
84
|
+
2. what group should own it?
|
|
85
|
+
3. should metadata be regenerated after adding the icon?
|
|
86
|
+
4. is the chosen icon usage path still UI-library-independent?
|
|
87
|
+
|
|
88
|
+
That keeps icon work maintainable and consistent across editions.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Frontend (Zova)
|
|
2
|
+
|
|
3
|
+
This page is the frontend hub for Cabloy users, contributors, and AI vibe coding workflows that need the frontend side of the framework.
|
|
4
|
+
|
|
5
|
+
Zova is the frontend half of Cabloy’s one-framework-system fullstack architecture.
|
|
6
|
+
|
|
7
|
+
## What Zova is responsible for
|
|
8
|
+
|
|
9
|
+
- page and component architecture
|
|
10
|
+
- SSR, SPA, Web, and Admin rendering flows
|
|
11
|
+
- data access patterns such as `$fetch`, `$api`, and generated SDKs
|
|
12
|
+
- UI library integration
|
|
13
|
+
- route, icon, and component type generation
|
|
14
|
+
- frontend-side refactors and code generation through the Zova CLI
|
|
15
|
+
|
|
16
|
+
## How to approach frontend work
|
|
17
|
+
|
|
18
|
+
For contributor and automation workflows in this repository, prefer this order:
|
|
19
|
+
|
|
20
|
+
1. inspect the root `package.json` and `npm run zova` entrypoint
|
|
21
|
+
2. inspect Zova CLI command families such as `create:*`, `init:*`, `refactor:*`, `tools:*`, and `openapi:*`
|
|
22
|
+
3. inspect the active edition before assuming a UI stack
|
|
23
|
+
4. document shared concepts once, then isolate edition-specific notes where the module set or UI library differs
|
|
24
|
+
|
|
25
|
+
## Edition impact
|
|
26
|
+
|
|
27
|
+
Frontend work is where Cabloy Basic and Cabloy Start differ most clearly.
|
|
28
|
+
|
|
29
|
+
- **Shared frontend engineering layer**: both editions follow the same Zova-centered frontend direction, with Vue, Vite, Quasar tooling, and related libraries.
|
|
30
|
+
- **Cabloy Basic UI layer**: current public docs and examples align with DaisyUI + Tailwind CSS.
|
|
31
|
+
- **Cabloy Start UI layer**: the private commercial edition aligns with Vuetify and ships different frontend modules, SSR site baselines, and project assets.
|
|
32
|
+
|
|
33
|
+
Because of this, automation and docs should always detect the active edition before recommending page-level, component-level, or UI-library-specific work.
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# IoC and Beans
|
|
2
|
+
|
|
3
|
+
## Why IoC matters in Zova
|
|
4
|
+
|
|
5
|
+
Zova uses IoC as a unifying frontend architecture rather than treating it as a small dependency-injection helper.
|
|
6
|
+
|
|
7
|
+
That matters because state sharing, resource access, lifecycle behavior, and cross-module composition all need to stay structured as the system grows.
|
|
8
|
+
|
|
9
|
+
## The four state-sharing scopes
|
|
10
|
+
|
|
11
|
+
A key Zova idea is that several common sharing scopes can be handled through one IoC-centered model:
|
|
12
|
+
|
|
13
|
+
- component-internal
|
|
14
|
+
- between-components
|
|
15
|
+
- app-global
|
|
16
|
+
- system-level
|
|
17
|
+
|
|
18
|
+
This replaces the need to switch constantly between unrelated mechanisms for each sharing scope.
|
|
19
|
+
|
|
20
|
+
## The three container types
|
|
21
|
+
|
|
22
|
+
Zova uses three main IoC containers:
|
|
23
|
+
|
|
24
|
+
- **sys container** for system-wide singleton-style beans
|
|
25
|
+
- **app container** for request-scoped or app-scoped beans
|
|
26
|
+
- **ctx container** for component-instance-local beans
|
|
27
|
+
|
|
28
|
+
This is one of the main reasons Zova can support both SSR-aware behavior and strongly structured frontend logic.
|
|
29
|
+
|
|
30
|
+
## Bean classes
|
|
31
|
+
|
|
32
|
+
Zova’s IoC model is built around bean classes provided by modules.
|
|
33
|
+
|
|
34
|
+
All beans inherit from `BeanBase`, which exposes common framework capabilities and gives each bean a structured place inside the broader frontend architecture.
|
|
35
|
+
|
|
36
|
+
## `BeanBase`
|
|
37
|
+
|
|
38
|
+
`BeanBase` provides built-in members and is also a host for extended members injected by modules and adapters.
|
|
39
|
+
|
|
40
|
+
Representative members include:
|
|
41
|
+
|
|
42
|
+
- `sys`
|
|
43
|
+
- `app`
|
|
44
|
+
- `ctx`
|
|
45
|
+
- `bean`
|
|
46
|
+
- `scope`
|
|
47
|
+
- `$el`
|
|
48
|
+
- `$event`
|
|
49
|
+
- `$ssr`
|
|
50
|
+
- `$useMeta`
|
|
51
|
+
|
|
52
|
+
Page and component beans also get frontend-specific members such as:
|
|
53
|
+
|
|
54
|
+
- `$params`
|
|
55
|
+
- `$query`
|
|
56
|
+
- `$props`
|
|
57
|
+
|
|
58
|
+
Module and UI adapters can further extend the base surface.
|
|
59
|
+
|
|
60
|
+
## Injection methods
|
|
61
|
+
|
|
62
|
+
Zova supports two main styles:
|
|
63
|
+
|
|
64
|
+
- **dependency injection** through `@Use`
|
|
65
|
+
- **dependency lookup** through the container and scope model
|
|
66
|
+
|
|
67
|
+
A key Zova preference is to keep the code concise by favoring dependency lookup where it leads to clearer business code.
|
|
68
|
+
|
|
69
|
+
## Resolution rules
|
|
70
|
+
|
|
71
|
+
A bean can be resolved by:
|
|
72
|
+
|
|
73
|
+
- bean class
|
|
74
|
+
- bean identifier
|
|
75
|
+
- registration name
|
|
76
|
+
- variable name
|
|
77
|
+
|
|
78
|
+
The most important design point is that cross-module access should prefer bean identifiers over hardwired file-path coupling.
|
|
79
|
+
|
|
80
|
+
### Representative `@Use` patterns
|
|
81
|
+
|
|
82
|
+
Same-module injection can stay class-oriented and concise:
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import { ModelTodo } from '../../bean/model.todo.js';
|
|
86
|
+
|
|
87
|
+
class ControllerTodo {
|
|
88
|
+
@Use()
|
|
89
|
+
$$modelTodo: ModelTodo;
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Cross-module injection should usually prefer a bean identifier so the consuming module does not depend on the provider’s internal file path layout:
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import type { ModelTabs } from 'zova-module-a-routertabs';
|
|
97
|
+
|
|
98
|
+
class ControllerLayout {
|
|
99
|
+
@Use('a-routertabs.model.tabs')
|
|
100
|
+
$$modelTabs: ModelTabs;
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
In practice, Zova can still preserve the ergonomic class-based development experience while compiling cross-module usage back toward bean-identifier-based resolution.
|
|
105
|
+
|
|
106
|
+
### Hierarchical injection patterns
|
|
107
|
+
|
|
108
|
+
Hierarchical injection replaces many cases where a generic Vue app would fall back to `provide/inject`.
|
|
109
|
+
|
|
110
|
+
Representative child lookup pattern:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
import type { ModelTabs } from 'zova-module-a-routertabs';
|
|
114
|
+
|
|
115
|
+
class Child {
|
|
116
|
+
@Use({ injectionScope: 'host' })
|
|
117
|
+
$$modelTabs: ModelTabs;
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
That keeps parent/child sharing aligned with the same IoC model instead of introducing a separate state-sharing mechanism.
|
|
122
|
+
|
|
123
|
+
## Injection scopes
|
|
124
|
+
|
|
125
|
+
Zova supports several injection scopes:
|
|
126
|
+
|
|
127
|
+
- `sys`
|
|
128
|
+
- `app`
|
|
129
|
+
- `ctx`
|
|
130
|
+
- `new`
|
|
131
|
+
- `host`
|
|
132
|
+
- `skipSelf`
|
|
133
|
+
|
|
134
|
+
This allows code to be explicit about whether a bean should be shared globally, per request, per component instance, or created fresh.
|
|
135
|
+
|
|
136
|
+
## Hierarchical injection
|
|
137
|
+
|
|
138
|
+
The `host` and `skipSelf` scopes provide hierarchical lookup behavior.
|
|
139
|
+
|
|
140
|
+
This replaces much of the conventional Vue `provide/inject` style with an IoC-native rule set.
|
|
141
|
+
|
|
142
|
+
That means parent/child sharing can stay aligned with the same overall bean model instead of becoming a separate architectural subsystem.
|
|
143
|
+
|
|
144
|
+
## Lifecycle
|
|
145
|
+
|
|
146
|
+
All beans can define two lifecycle methods:
|
|
147
|
+
|
|
148
|
+
- `__init__`
|
|
149
|
+
- `__dispose__`
|
|
150
|
+
|
|
151
|
+
These lifecycle hooks are important because they give beans a structured place for initialization and cleanup logic.
|
|
152
|
+
|
|
153
|
+
Representative uses include:
|
|
154
|
+
|
|
155
|
+
- computed setup
|
|
156
|
+
- watchers
|
|
157
|
+
- derived state wiring
|
|
158
|
+
- resource cleanup
|
|
159
|
+
|
|
160
|
+
Representative initialization pattern:
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
export class Counter {
|
|
164
|
+
count: number = 0;
|
|
165
|
+
count2: string;
|
|
166
|
+
|
|
167
|
+
protected async __init__() {
|
|
168
|
+
this.count2 = this.$computed(() => {
|
|
169
|
+
return `=== ${this.count} ===`;
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
this.$watch(
|
|
173
|
+
() => this.count,
|
|
174
|
+
() => {
|
|
175
|
+
console.log('changed: ', this.count);
|
|
176
|
+
},
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
That gives a bean one consistent place to wire reactive behavior instead of scattering setup logic through unrelated hooks.
|
|
183
|
+
|
|
184
|
+
## Bean identifiers and loose coupling
|
|
185
|
+
|
|
186
|
+
Bean identifiers are a key part of Zova’s modular architecture.
|
|
187
|
+
|
|
188
|
+
They make cross-module access more stable and decoupled than always relying on direct file-path imports.
|
|
189
|
+
|
|
190
|
+
This matters especially in large systems, where business modules should remain reusable and composable.
|
|
191
|
+
|
|
192
|
+
## Relationship to other frontend guides
|
|
193
|
+
|
|
194
|
+
Read this together with:
|
|
195
|
+
|
|
196
|
+
- [Modules and Suites](/frontend/modules-and-suites)
|
|
197
|
+
- [Module Scope](/frontend/module-scope)
|
|
198
|
+
- [Frontend Design Principles](/frontend/design-principles)
|
|
199
|
+
|
|
200
|
+
Those pages explain how beans fit into module boundaries, scope-based resources, and the broader Zova architectural model.
|
|
201
|
+
|
|
202
|
+
## Implementation checks for frontend bean-architecture changes
|
|
203
|
+
|
|
204
|
+
When editing Zova frontend code, ask:
|
|
205
|
+
|
|
206
|
+
1. should this behavior live in a bean instead of a framework-neutral helper?
|
|
207
|
+
2. is the right sharing scope `ctx`, `app`, or `sys`?
|
|
208
|
+
3. should dependency injection or dependency lookup be preferred here?
|
|
209
|
+
4. does this component or page already rely on lifecycle hooks, hierarchical injection, or bean identifiers that should be preserved?
|
|
210
|
+
|
|
211
|
+
That helps AI keep frontend changes aligned with Zova’s real architectural model instead of drifting toward generic Vue patterns.
|