cabloy 5.1.49 → 5.1.51
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 +288 -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 +29 -0
- package/.github/workflows/docs-pages.yml +54 -0
- package/.gitignore +1 -0
- package/CHANGELOG.md +46 -0
- package/CLAUDE.md +59 -0
- package/README.md +137 -0
- package/cabloy-docs/.vitepress/config.mjs +222 -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 +138 -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 +167 -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 +157 -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 +35 -0
- package/cabloy-docs/ai/verification.md +30 -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 +25 -0
- package/cabloy-docs/editions/cabloy-start.md +24 -0
- package/cabloy-docs/editions/detection.md +31 -0
- package/cabloy-docs/editions/overview.md +44 -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 +57 -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 +32 -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 +201 -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/edition-collaboration-differences.md +61 -0
- package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +64 -0
- package/cabloy-docs/fullstack/introduction.md +69 -0
- package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -0
- package/cabloy-docs/fullstack/quickstart.md +86 -0
- package/cabloy-docs/fullstack/vona-zova-integration.md +86 -0
- package/cabloy-docs/index.md +73 -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 +3 -3
- package/vona/README.zh-CN.md +4 -4
- package/vona/packages-vona/vona/package.json +1 -1
- 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/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 +4 -4
- package/zova/README.zh-CN.md +4 -4
- package/zova/packages-zova/zova/package.json +2 -2
- package/zova/src/suite/a-demo/modules/demo-basic/src/page/toolTwo/controller.tsx +0 -2
- package/zova/src/suite/a-home/modules/home-base/src/config/locale/en-us.ts +1 -0
- package/zova/src/suite/a-home/modules/home-base/src/config/locale/zh-cn.ts +1 -0
- package/zova/src/suite/a-home/modules/home-base/src/page/errorNotFound/controller.tsx +8 -2
- package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/controller.tsx +1 -1
- package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.header.tsx +1 -1
- package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.locale.tsx +2 -5
- package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.tabs.tsx +1 -4
- package/zova/src/suite-vendor/a-zova/modules/a-router/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/bean/sys.router.ts +28 -6
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkeySys.ts +15 -3
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/router.ts +1 -0
- package/zova/src/suite-vendor/a-zova/modules/a-routertabs/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-routertabs/src/model/tabs.ts +4 -0
- package/zova/src/suite-vendor/a-zova/package.json +3 -3
- /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,162 @@
|
|
|
1
|
+
# Captcha Guide
|
|
2
|
+
|
|
3
|
+
## Why captcha matters in Vona
|
|
4
|
+
|
|
5
|
+
Vona treats captcha as a reusable framework capability rather than a one-off image challenge.
|
|
6
|
+
|
|
7
|
+
That matters because different business flows may need different captcha types, different verification strategies, and different frontend/backend interaction patterns.
|
|
8
|
+
|
|
9
|
+
## Core captcha model
|
|
10
|
+
|
|
11
|
+
The `a-captcha` module provides a general captcha system built around two concepts:
|
|
12
|
+
|
|
13
|
+
- **captcha provider**
|
|
14
|
+
- **captcha scene**
|
|
15
|
+
|
|
16
|
+
### Provider
|
|
17
|
+
|
|
18
|
+
A provider implements a captcha mechanism, such as image-text captcha or another verification style.
|
|
19
|
+
|
|
20
|
+
### Scene
|
|
21
|
+
|
|
22
|
+
A scene chooses how captcha should be used in a specific business context.
|
|
23
|
+
|
|
24
|
+
A scene can:
|
|
25
|
+
|
|
26
|
+
- select one provider
|
|
27
|
+
- rotate across multiple providers
|
|
28
|
+
- vary provider choice by user state or other business context
|
|
29
|
+
|
|
30
|
+
## `bean.captcha`
|
|
31
|
+
|
|
32
|
+
Vona exposes a global bean `bean.captcha` so backend code can work with captcha through one unified entrypoint.
|
|
33
|
+
|
|
34
|
+
Representative generation workflow:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm run vona :create:bean captchaProvider imageText -- --module=captcha-simple
|
|
38
|
+
npm run vona :create:bean captchaScene simple -- --module=captcha-simple
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The main operations are:
|
|
42
|
+
|
|
43
|
+
- `create`
|
|
44
|
+
- `refresh`
|
|
45
|
+
- `verify`
|
|
46
|
+
- `verifyImmediate`
|
|
47
|
+
|
|
48
|
+
### Create captcha
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
const captcha = await this.bean.captcha.create('captcha-simple:simple');
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Refresh captcha
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
const captchaNew = await this.bean.captcha.refresh(captchaId, 'captcha-simple:simple');
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Verify captcha
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
const passed = await this.bean.captcha.verify(captchaId, '1234', 'captcha-simple:simple');
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Immediate verification
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
const tokenOrFalse = await this.bean.captcha.verifyImmediate(captchaId, '1234');
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Immediate verification can return a secondary token that must still be verified again on form submission.
|
|
73
|
+
|
|
74
|
+
## Provider model
|
|
75
|
+
|
|
76
|
+
A provider defines:
|
|
77
|
+
|
|
78
|
+
- token type
|
|
79
|
+
- payload type
|
|
80
|
+
- creation logic
|
|
81
|
+
- verification logic
|
|
82
|
+
- provider-specific options
|
|
83
|
+
|
|
84
|
+
A representative provider can implement image-text captcha with fields such as:
|
|
85
|
+
|
|
86
|
+
- `type`
|
|
87
|
+
- `fontPath`
|
|
88
|
+
- `opts`
|
|
89
|
+
|
|
90
|
+
That makes captcha providers extensible rather than hardcoded to one built-in shape.
|
|
91
|
+
|
|
92
|
+
The image-text example is a good mental model: provider code decides how to create and verify one captcha mechanism, while scene code decides when and why that mechanism should be chosen.
|
|
93
|
+
|
|
94
|
+
## Scene model
|
|
95
|
+
|
|
96
|
+
A scene defines:
|
|
97
|
+
|
|
98
|
+
- which providers are available
|
|
99
|
+
- how one provider is resolved for the current request
|
|
100
|
+
- how provider-level options can be configured or overridden
|
|
101
|
+
|
|
102
|
+
That means business policy can be expressed at the scene layer while implementation details remain in the provider layer.
|
|
103
|
+
|
|
104
|
+
A representative scene can choose one provider statically, rotate among several providers, or vary difficulty and provider options by request context or user state.
|
|
105
|
+
|
|
106
|
+
## Captcha verify interceptor
|
|
107
|
+
|
|
108
|
+
Vona also provides a local interceptor for captcha verification:
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
@Core.captchaVerify({ scene: 'captcha-simple:simple' })
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
This interceptor supports:
|
|
115
|
+
|
|
116
|
+
- normal form verification
|
|
117
|
+
- secondary verification after `verifyImmediate`
|
|
118
|
+
|
|
119
|
+
This is the most important request-path integration point for captcha in ordinary controller code.
|
|
120
|
+
|
|
121
|
+
## Built-in captcha API
|
|
122
|
+
|
|
123
|
+
The `a-captcha` module exposes out-of-the-box captcha APIs for:
|
|
124
|
+
|
|
125
|
+
- `create`
|
|
126
|
+
- `refresh`
|
|
127
|
+
- `verifyImmediate`
|
|
128
|
+
|
|
129
|
+
The direct `verify` path is usually consumed through the interceptor-oriented request flow.
|
|
130
|
+
|
|
131
|
+
## Configuration
|
|
132
|
+
|
|
133
|
+
Captcha behavior can be configured through app config, including:
|
|
134
|
+
|
|
135
|
+
- whether to expose the token for debugging
|
|
136
|
+
- captcha token TTL
|
|
137
|
+
- secondary-token TTL
|
|
138
|
+
- provider-specific options
|
|
139
|
+
- scene-specific provider setup
|
|
140
|
+
|
|
141
|
+
A useful separation rule is:
|
|
142
|
+
|
|
143
|
+
- module config for broad captcha defaults such as `showToken`
|
|
144
|
+
- `config.onions.captchaProvider` for provider-level TTL and option tuning
|
|
145
|
+
- `config.onions.captchaScene` for scene-level provider selection and overrides
|
|
146
|
+
|
|
147
|
+
## Relationship to auth flows
|
|
148
|
+
|
|
149
|
+
Captcha is often used in login, registration, or other user-facing flows, but it should remain a separate framework concern.
|
|
150
|
+
|
|
151
|
+
That makes it easier to reuse the same captcha capability across different account-related APIs.
|
|
152
|
+
|
|
153
|
+
## Implementation checks for captcha-sensitive changes
|
|
154
|
+
|
|
155
|
+
When editing captcha-sensitive flows, ask:
|
|
156
|
+
|
|
157
|
+
1. is the right layer the provider, the scene, or the request interceptor?
|
|
158
|
+
2. does the flow need immediate verification, form verification, or both?
|
|
159
|
+
3. should the captcha policy vary by business scenario?
|
|
160
|
+
4. is there already an existing scene/provider combination that should be reused?
|
|
161
|
+
|
|
162
|
+
That helps AI keep captcha behavior aligned with Vona’s reusable verification model.
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# Backend CLI
|
|
2
|
+
|
|
3
|
+
This guide explains how to use the Vona CLI in the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## Why the CLI matters
|
|
6
|
+
|
|
7
|
+
Vona provides a large number of CLI commands for generating code skeletons and running backend workflows.
|
|
8
|
+
|
|
9
|
+
For implementation work, the CLI is especially important because it encodes framework conventions directly. If a command already exists, use it before writing backend scaffolding manually.
|
|
10
|
+
|
|
11
|
+
## Entry from repo root
|
|
12
|
+
|
|
13
|
+
The current monorepo entrypoint is defined at the repo root:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm run vona :
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
That wrapper points to the Vona CLI under `vona/packages-cli/` while preserving the monorepo project path.
|
|
20
|
+
|
|
21
|
+
## Command discovery pattern
|
|
22
|
+
|
|
23
|
+
Vona commands follow a consistent discovery model.
|
|
24
|
+
|
|
25
|
+
### 1. List all command groups and commands
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm run vona :
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 2. List commands for a specific group
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm run vona :create
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 3. Inspect help for one command
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm run vona :create:bean --help
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
This discovery pattern should be the default contributor workflow before inventing manual scaffolding steps.
|
|
44
|
+
|
|
45
|
+
## High-value command families
|
|
46
|
+
|
|
47
|
+
From the current source tree, the most useful Vona command families for day-to-day development are:
|
|
48
|
+
|
|
49
|
+
- `bin:*`
|
|
50
|
+
- `create:*`
|
|
51
|
+
- `init:*`
|
|
52
|
+
- `tools:*`
|
|
53
|
+
|
|
54
|
+
Typical use cases include:
|
|
55
|
+
|
|
56
|
+
- scaffold suites, modules, beans, and tests
|
|
57
|
+
- initialize config, locale, constants, assets, types, and related module-scope resources
|
|
58
|
+
- generate CRUD-oriented resources
|
|
59
|
+
- refresh metadata and dependency-related output
|
|
60
|
+
- run build, dev, test, typecheck, playground, and database reset flows
|
|
61
|
+
|
|
62
|
+
## Generator-first workflow
|
|
63
|
+
|
|
64
|
+
A practical backend workflow is:
|
|
65
|
+
|
|
66
|
+
1. inspect the command family
|
|
67
|
+
2. run the generator or initializer
|
|
68
|
+
3. inspect the generated suite/module/bean structure
|
|
69
|
+
4. only then add the minimal manual logic the task actually needs
|
|
70
|
+
|
|
71
|
+
This matters because backend modularization, naming, and bean scenes are part of the framework architecture, not only coding style.
|
|
72
|
+
|
|
73
|
+
## Representative generation examples
|
|
74
|
+
|
|
75
|
+
### Create a suite
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npm run vona :create:suite suiteName
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Create a module
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npm run vona :create:module moduleName -- [--suite=]
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Create a service bean
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
npm run vona :create:bean service student -- --module=demo-student
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Create a model bean
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npm run vona :create:bean model student -- --module=demo-student
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Create an entity bean
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
npm run vona :create:bean entity student -- --module=demo-student
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Create a DTO bean
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npm run vona :create:bean dto studentCreate -- --module=demo-student
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Create a startup bean
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
npm run vona :create:bean startup log -- --module=demo-student
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
These examples show that the CLI is tightly connected to module boundaries and bean scenes such as service, model, entity, DTO, and startup.
|
|
118
|
+
|
|
119
|
+
A practical bean-scene reading is:
|
|
120
|
+
|
|
121
|
+
- `service`, `model`, `entity`, `dto`, and `startup` are representative bean scenes
|
|
122
|
+
- `:create:bean sceneName beanName -- --module=...` uses `sceneName` as the operational family slot inside the bean identifier
|
|
123
|
+
- this is why generated bean names later appear in forms such as `module.scene.bean`
|
|
124
|
+
|
|
125
|
+
## Initializer-family examples
|
|
126
|
+
|
|
127
|
+
Not every backend resource is created through bean scenes.
|
|
128
|
+
|
|
129
|
+
Representative initializer commands include:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
npm run vona :init:constant demo-student
|
|
133
|
+
npm run vona :init:types demo-student
|
|
134
|
+
npm run vona :init:asset static -- --module=demo-student
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
A practical distinction is:
|
|
138
|
+
|
|
139
|
+
- `:create:bean` creates scene-based backend beans
|
|
140
|
+
- `:init:*` commands create module-scope resources such as constants, typings, or asset-resource structure
|
|
141
|
+
|
|
142
|
+
## Relationship to modules, suites, and package metadata
|
|
143
|
+
|
|
144
|
+
The backend CLI is not only a code generator. It is also one of the clearest expressions of Vona’s modular architecture.
|
|
145
|
+
|
|
146
|
+
CLI generation decisions affect:
|
|
147
|
+
|
|
148
|
+
- where files live
|
|
149
|
+
- which suite or module owns the resource
|
|
150
|
+
- how bean identifiers and onion names are derived
|
|
151
|
+
- how package metadata and dependencies should be interpreted later
|
|
152
|
+
|
|
153
|
+
For the current repo structure, also see [Package Map](/reference/package-map).
|
|
154
|
+
|
|
155
|
+
## CLI vs scripts
|
|
156
|
+
|
|
157
|
+
A practical distinction is:
|
|
158
|
+
|
|
159
|
+
- use [Backend Scripts](/backend/scripts) for root dev/build/start/test workflows
|
|
160
|
+
- use the Vona CLI when you are discovering commands, generating backend resources, or running backend-specific tool flows
|
|
161
|
+
|
|
162
|
+
This keeps contributor workflows clear instead of mixing runtime scripts with generator commands.
|
|
163
|
+
|
|
164
|
+
## Generator-first workflow checklist
|
|
165
|
+
|
|
166
|
+
When creating backend code:
|
|
167
|
+
|
|
168
|
+
1. inspect `npm run vona :` or the relevant command family
|
|
169
|
+
2. prefer the matching generator or initializer
|
|
170
|
+
3. inspect the generated output
|
|
171
|
+
4. only then make minimal follow-up edits
|
|
172
|
+
|
|
173
|
+
This reduces unnecessary manual scaffolding and keeps the implementation aligned with Vona conventions.
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# Config Guide
|
|
2
|
+
|
|
3
|
+
## Why config matters as a backend scope resource
|
|
4
|
+
|
|
5
|
+
In Vona, configuration is not only a global backend settings concern. It is also a module-scoped resource that can be defined close to a module and then accessed through scope.
|
|
6
|
+
|
|
7
|
+
That matters because backend capabilities often need both:
|
|
8
|
+
|
|
9
|
+
- reusable module-local defaults
|
|
10
|
+
- project-level overrides for the current application
|
|
11
|
+
- runtime-sensitive configuration chosen by mode, flavor, and instance
|
|
12
|
+
|
|
13
|
+
## Initialize the config skeleton
|
|
14
|
+
|
|
15
|
+
Example: initialize config for module `demo-student`.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm run vona :init:config demo-student
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This gives the module its own config file under the module’s config area.
|
|
22
|
+
|
|
23
|
+
## Define module config
|
|
24
|
+
|
|
25
|
+
Representative pattern:
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
export function config(_app: VonaApplication) {
|
|
29
|
+
return {
|
|
30
|
+
title: 'Hello World',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The important point is that module config fields are declared directly, and the framework extracts the config typing from that shape.
|
|
36
|
+
|
|
37
|
+
## Use config within the current module
|
|
38
|
+
|
|
39
|
+
The current module’s config can be accessed through scope.
|
|
40
|
+
|
|
41
|
+
Representative pattern:
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
console.log(this.scope.config.title);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This keeps config access aligned with the same module-resource model used for service, model, entity, locale, and error.
|
|
48
|
+
|
|
49
|
+
## Use config across modules
|
|
50
|
+
|
|
51
|
+
Cross-module config access uses the cross-module scope surface.
|
|
52
|
+
|
|
53
|
+
Representative pattern:
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
console.log(this.$scope.demoStudent.config.title);
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
A practical distinction is:
|
|
60
|
+
|
|
61
|
+
- `this.scope.config` for the current module
|
|
62
|
+
- `this.$scope.<module>.config` for another module
|
|
63
|
+
|
|
64
|
+
## Project config is layered, not single-file
|
|
65
|
+
|
|
66
|
+
At the application level, Vona config is assembled from a cascading set of config files.
|
|
67
|
+
|
|
68
|
+
In the current repo, representative project config files include:
|
|
69
|
+
|
|
70
|
+
- `config.ts`
|
|
71
|
+
- `config.dev.ts`
|
|
72
|
+
- `config.dev.play.ts`
|
|
73
|
+
- `config.test.ts`
|
|
74
|
+
- `config.prod.ts`
|
|
75
|
+
- `config.dev.local.ts`
|
|
76
|
+
- `config.test.local.ts`
|
|
77
|
+
- `config.prod.local.ts`
|
|
78
|
+
- `config.local.tsx`
|
|
79
|
+
|
|
80
|
+
That means effective config is built by merging general config with more specific runtime/flavor/local layers.
|
|
81
|
+
|
|
82
|
+
A practical mental model is:
|
|
83
|
+
|
|
84
|
+
1. start from the shared base config
|
|
85
|
+
2. merge mode-specific config
|
|
86
|
+
3. merge flavor-specific config when present
|
|
87
|
+
4. merge local override config last
|
|
88
|
+
|
|
89
|
+
This is one of the main reasons backend config should be understood together with [Runtime and Flavors](/backend/runtime-and-flavors).
|
|
90
|
+
|
|
91
|
+
## Async config loading is normal
|
|
92
|
+
|
|
93
|
+
In the current Vona startup flow, project config items are loaded asynchronously and then deep-merged.
|
|
94
|
+
|
|
95
|
+
That means async config is a normal part of the framework model rather than a special workaround.
|
|
96
|
+
|
|
97
|
+
A practical implication is:
|
|
98
|
+
|
|
99
|
+
- config can safely derive values from runtime information, filesystem state, or other async setup needs during config assembly
|
|
100
|
+
|
|
101
|
+
## How runtime env and flavor affect config
|
|
102
|
+
|
|
103
|
+
Runtime metadata does not only choose env files. It also participates directly in config assembly.
|
|
104
|
+
|
|
105
|
+
In the current app config, representative fields derived from env/meta include:
|
|
106
|
+
|
|
107
|
+
- `config.meta.mode`
|
|
108
|
+
- `config.meta.flavor`
|
|
109
|
+
- `config.server.workers`
|
|
110
|
+
- `config.server.listen.*`
|
|
111
|
+
- `config.server.serve.*`
|
|
112
|
+
- `config.database.defaultClient`
|
|
113
|
+
- logger, Redis, and mail client settings
|
|
114
|
+
|
|
115
|
+
That means config selection and runtime selection are part of one continuous flow rather than two unrelated systems.
|
|
116
|
+
|
|
117
|
+
## Override module config at the project level
|
|
118
|
+
|
|
119
|
+
Project-level config can override module-level defaults.
|
|
120
|
+
|
|
121
|
+
Representative pattern:
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
config.modules = {
|
|
125
|
+
'demo-student': {
|
|
126
|
+
title: 'Hello World!!',
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
This is the key ownership rule:
|
|
132
|
+
|
|
133
|
+
- module config defines reusable defaults close to the module
|
|
134
|
+
- project config overrides those defaults for the current backend application
|
|
135
|
+
|
|
136
|
+
## App config vs instance-merged config
|
|
137
|
+
|
|
138
|
+
One important Vona distinction is:
|
|
139
|
+
|
|
140
|
+
- `this.app.config` is the global application config
|
|
141
|
+
- `this.ctx.config` is the effective config for the current instance-aware request context
|
|
142
|
+
|
|
143
|
+
That matters in multi-instance or multi-tenant scenarios.
|
|
144
|
+
|
|
145
|
+
In the current runtime, instance config is assembled by merging:
|
|
146
|
+
|
|
147
|
+
1. the global app config
|
|
148
|
+
2. any static config under `config.instance.instances[instanceName].config`
|
|
149
|
+
3. any stored instance config data from the instance record
|
|
150
|
+
|
|
151
|
+
A practical interpretation is:
|
|
152
|
+
|
|
153
|
+
- use `app.config` when you need the backend-wide config baseline
|
|
154
|
+
- use `ctx.config` when behavior should respect the active instance
|
|
155
|
+
|
|
156
|
+
## Config access surfaces at a glance
|
|
157
|
+
|
|
158
|
+
| Access surface | Typical meaning |
|
|
159
|
+
| ----------------------------- | ------------------------------------------------------ |
|
|
160
|
+
| `app.config` | app-wide baseline config |
|
|
161
|
+
| `ctx.config` | effective config for the active instance-aware context |
|
|
162
|
+
| `this.scope.config` | current-module config resource |
|
|
163
|
+
| `this.$scope.<module>.config` | another module’s config resource |
|
|
164
|
+
|
|
165
|
+
A practical rule is:
|
|
166
|
+
|
|
167
|
+
- use `scope` access when the task is about module-owned config
|
|
168
|
+
- use `app.config` when the task is about backend-wide baseline behavior
|
|
169
|
+
- use `ctx.config` when request-scoped behavior must respect the active instance
|
|
170
|
+
|
|
171
|
+
## Effective instance-aware config merge order
|
|
172
|
+
|
|
173
|
+
This page owns the config-layering view. For env-file precedence and mode/flavor selection, see [Runtime and Flavors](/backend/runtime-and-flavors). For the fuller request-context view of instance resolution and instance-aware config behavior, see [Multi-Instance and Instance Resolution](/backend/multi-instance-and-instance-resolution).
|
|
174
|
+
|
|
175
|
+
In the current runtime, the effective instance-aware config can be understood at a high level like this:
|
|
176
|
+
|
|
177
|
+
1. start from the app-wide baseline config
|
|
178
|
+
2. merge static config from `config.instance.instances[instanceName].config`
|
|
179
|
+
3. merge any persisted config stored on the instance record
|
|
180
|
+
4. expose the merged result as `ctx.config`
|
|
181
|
+
|
|
182
|
+
That means `ctx.config` is not just a pointer to `app.config`. It is the instance-aware effective config surface.
|
|
183
|
+
|
|
184
|
+
## Instance config shape
|
|
185
|
+
|
|
186
|
+
Representative instance config shape in the current repo looks like:
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
config.instance = {
|
|
190
|
+
getInstanceName: undefined,
|
|
191
|
+
queryField: $protocolKey('x-vona-instance-name'),
|
|
192
|
+
headerField: $protocolKey('x-vona-instance-name'),
|
|
193
|
+
instances: {
|
|
194
|
+
'': { password: '', title: '' },
|
|
195
|
+
'isolateTest': {
|
|
196
|
+
password: '',
|
|
197
|
+
title: '',
|
|
198
|
+
id: 1000,
|
|
199
|
+
isolate: true,
|
|
200
|
+
isolateClient: 'isolateTest',
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
The key point is that instance configuration is part of the config system itself, not an external plugin layer.
|
|
207
|
+
|
|
208
|
+
## Config ownership layers
|
|
209
|
+
|
|
210
|
+
A useful backend mental model is:
|
|
211
|
+
|
|
212
|
+
- env files provide deployable runtime values
|
|
213
|
+
- project config translates and organizes those values into backend config
|
|
214
|
+
- module config provides reusable module-local defaults
|
|
215
|
+
- `config.modules[...]` overrides module-local defaults for the current app
|
|
216
|
+
- `config.instance.instances[...]` adds static per-instance behavior
|
|
217
|
+
- `ctx.config` is the effective instance-aware result seen by request-scoped code
|
|
218
|
+
|
|
219
|
+
This layered model is the safest way to reason about config changes in Cabloy.
|
|
220
|
+
|
|
221
|
+
## Relationship to startup, model, and datasource behavior
|
|
222
|
+
|
|
223
|
+
Config does not live in isolation. In many backend tasks, config interacts directly with:
|
|
224
|
+
|
|
225
|
+
- runtime environment and flavor
|
|
226
|
+
- startup lifecycle and startup bean overrides
|
|
227
|
+
- model options
|
|
228
|
+
- datasource defaults and isolated-instance routing
|
|
229
|
+
|
|
230
|
+
Read this guide together with:
|
|
231
|
+
|
|
232
|
+
- [Backend Essentials](/backend/backend-essentials)
|
|
233
|
+
- [Backend Foundation](/backend/foundation)
|
|
234
|
+
- [Runtime and Flavors](/backend/runtime-and-flavors)
|
|
235
|
+
- [Backend Startup Guide](/backend/startup-guide)
|
|
236
|
+
- [Model Guide](/backend/model-guide)
|
|
237
|
+
- [Multi-Database and Datasource Guide](/backend/multi-database-datasource)
|
|
238
|
+
|
|
239
|
+
## Implementation checks for backend configuration changes
|
|
240
|
+
|
|
241
|
+
When editing backend configuration behavior, ask:
|
|
242
|
+
|
|
243
|
+
1. should this value live in env files, project config, or module config?
|
|
244
|
+
2. is the value consumed through current-module scope, cross-module scope, `app.config`, or `ctx.config`?
|
|
245
|
+
3. does the config depend on runtime mode, flavor, or instance?
|
|
246
|
+
4. is there already a module config skeleton or project config layer that should be extended instead of inventing a new pattern?
|
|
247
|
+
5. will a config change alter startup, datasource, or model behavior indirectly?
|
|
248
|
+
|
|
249
|
+
That helps AI keep backend configuration aligned with Vona’s module-resource model and current runtime layering.
|