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,168 @@
|
|
|
1
|
+
# Module Scope
|
|
2
|
+
|
|
3
|
+
## Why module scope matters in Zova
|
|
4
|
+
|
|
5
|
+
Zova uses module scope as the unified resource facade for frontend modules.
|
|
6
|
+
|
|
7
|
+
That matters because business code needs a consistent way to access module resources such as config, locale, errors, APIs, and related metadata without scattering unrelated access patterns through every page or component.
|
|
8
|
+
|
|
9
|
+
## What scope is
|
|
10
|
+
|
|
11
|
+
A `Scope` instance is the module-facing object that exposes the resources of a module in one place.
|
|
12
|
+
|
|
13
|
+
This is one of the main reasons Zova can keep dependency lookup concise while still preserving strong structure.
|
|
14
|
+
|
|
15
|
+
## `this.scope`
|
|
16
|
+
|
|
17
|
+
All beans inherit from `BeanBase`, so the current module scope is directly available through:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
this.scope;
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
This gives the current bean a natural way to access the resources of its own module.
|
|
24
|
+
|
|
25
|
+
## Main scope resource categories
|
|
26
|
+
|
|
27
|
+
Representative scope members include:
|
|
28
|
+
|
|
29
|
+
- `config`
|
|
30
|
+
- `constant`
|
|
31
|
+
- `locale`
|
|
32
|
+
- `error`
|
|
33
|
+
- `api`
|
|
34
|
+
- `apiSchema`
|
|
35
|
+
|
|
36
|
+
These categories make module resources discoverable and consistently organized.
|
|
37
|
+
|
|
38
|
+
## Initialize scope-backed resources
|
|
39
|
+
|
|
40
|
+
Representative CLI entrypoints include:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm run zova :init:config demo-student
|
|
44
|
+
npm run zova :init:constant demo-student
|
|
45
|
+
npm run zova :init:locale demo-student
|
|
46
|
+
npm run zova :init:error demo-student
|
|
47
|
+
npm run zova :create:bean api test -- --module=demo-student
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
This matters because scope is not just a read surface. It is the organized destination for resources generated or initialized through the standard Zova workflow.
|
|
51
|
+
|
|
52
|
+
## `config`
|
|
53
|
+
|
|
54
|
+
Module config belongs in the scope model so business logic can read feature-specific configuration in a structured way.
|
|
55
|
+
|
|
56
|
+
Representative access pattern:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
console.log(this.scope.config.title);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Projects can also override module-level config through project-level frontend config, which makes scope a bridge between reusable module defaults and app-specific customization.
|
|
63
|
+
|
|
64
|
+
## `constant`
|
|
65
|
+
|
|
66
|
+
Module constants can live in scope so feature-level constant values remain namespaced and easy to access.
|
|
67
|
+
|
|
68
|
+
Representative access pattern:
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
console.log(this.scope.constant.gender.male);
|
|
72
|
+
console.log(this.scope.constant.gender.female);
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## `locale`
|
|
76
|
+
|
|
77
|
+
Module locale resources are exposed through scope so frontend code can retrieve localized text in a module-aware way.
|
|
78
|
+
|
|
79
|
+
Representative access patterns:
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
const message1 = this.scope.locale.HelloWorld();
|
|
83
|
+
const message2 = this.scope.locale.HelloWorld.locale('en-us');
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Project-level locale resources can override module-level locale values, which is one of the key reasons scope stays useful even when the final app wants customized wording.
|
|
87
|
+
|
|
88
|
+
## `error`
|
|
89
|
+
|
|
90
|
+
Module-specific errors are exposed through scope so business code can throw namespaced error definitions without inventing ad hoc exception patterns.
|
|
91
|
+
|
|
92
|
+
Representative access pattern:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
this.scope.error.ErrorTest.throw();
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## `api`
|
|
99
|
+
|
|
100
|
+
Backend API calls can be wrapped as module `api` resources and accessed through scope.
|
|
101
|
+
|
|
102
|
+
This is one of the most practical scope categories because it keeps request logic close to the module boundary instead of scattering raw request paths through page code.
|
|
103
|
+
|
|
104
|
+
Representative access pattern:
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
const res = await this.scope.api.test.echo();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## `apiSchema`
|
|
111
|
+
|
|
112
|
+
Schema-oriented API metadata can also be exposed through scope when higher-level frontend behavior depends on API metadata directly.
|
|
113
|
+
|
|
114
|
+
## Cross-module scope access
|
|
115
|
+
|
|
116
|
+
Zova also supports cross-module scope access through `@UseScope()`.
|
|
117
|
+
|
|
118
|
+
Representative pattern:
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
@UseScope()
|
|
122
|
+
$$scopeDemoStudent: ScopeModuleDemoStudent;
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
A common follow-up access pattern is:
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
const res = await this.$$scopeDemoStudent.api.test.echo();
|
|
129
|
+
console.log(this.$$scopeDemoStudent.locale.HelloWorld());
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
This allows one module to consume another module’s scoped resources explicitly without flattening everything into one shared global namespace.
|
|
133
|
+
|
|
134
|
+
Compiler support also lets `@UseScope()` participate in async module loading behavior, which fits naturally with Zova’s module-level bundle boundaries.
|
|
135
|
+
|
|
136
|
+
## Why this matters for architecture
|
|
137
|
+
|
|
138
|
+
Module scope is a key bridge between:
|
|
139
|
+
|
|
140
|
+
- modularization
|
|
141
|
+
- IoC and bean lookup
|
|
142
|
+
- API access
|
|
143
|
+
- locale and error handling
|
|
144
|
+
- project-level override behavior
|
|
145
|
+
|
|
146
|
+
That makes scope one of the most important frontend concepts to understand before extending a larger Zova application.
|
|
147
|
+
|
|
148
|
+
## Relationship to other frontend guides
|
|
149
|
+
|
|
150
|
+
Read this together with:
|
|
151
|
+
|
|
152
|
+
- [IoC and Beans](/frontend/ioc-and-beans)
|
|
153
|
+
- [Modules and Suites](/frontend/modules-and-suites)
|
|
154
|
+
- [API Guide](/frontend/api-guide)
|
|
155
|
+
- [Server Data](/frontend/server-data)
|
|
156
|
+
|
|
157
|
+
These guides explain how scope fits into bean architecture, module boundaries, and data-access design.
|
|
158
|
+
|
|
159
|
+
## Implementation checks for module-scope changes
|
|
160
|
+
|
|
161
|
+
When editing Zova frontend code, ask:
|
|
162
|
+
|
|
163
|
+
1. should this resource be accessed through `this.scope` instead of a direct ad hoc import?
|
|
164
|
+
2. does the logic belong to the current module or another module’s scope?
|
|
165
|
+
3. should cross-module access use `@UseScope()`?
|
|
166
|
+
4. is this concern best modeled as config, constant, locale, error, api, or apiSchema?
|
|
167
|
+
|
|
168
|
+
That helps AI keep frontend resource access aligned with Zova’s intended module architecture.
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Modules and Suites
|
|
2
|
+
|
|
3
|
+
## Why modularization matters in Zova
|
|
4
|
+
|
|
5
|
+
Zova organizes frontend code into modules and suites so business code can scale without collapsing into one large undifferentiated app surface.
|
|
6
|
+
|
|
7
|
+
That matters for:
|
|
8
|
+
|
|
9
|
+
- business decoupling
|
|
10
|
+
- reuse of feature units
|
|
11
|
+
- clear bundle boundaries
|
|
12
|
+
- team-level work decomposition
|
|
13
|
+
- namespace isolation
|
|
14
|
+
|
|
15
|
+
## Module as the core business unit
|
|
16
|
+
|
|
17
|
+
In Zova, a module groups related pages, components, config, locale, API resources, and other frontend assets into one coherent feature boundary.
|
|
18
|
+
|
|
19
|
+
A module is not just a folder. It is a unit of architecture, naming, and bundling.
|
|
20
|
+
|
|
21
|
+
## Why modules help
|
|
22
|
+
|
|
23
|
+
Representative benefits include:
|
|
24
|
+
|
|
25
|
+
- clearer business boundaries
|
|
26
|
+
- easier reuse across systems
|
|
27
|
+
- reduced naming conflicts through namespace isolation
|
|
28
|
+
- more natural async bundle boundaries during build
|
|
29
|
+
|
|
30
|
+
## Module naming convention
|
|
31
|
+
|
|
32
|
+
Zova modules follow a naming model such as:
|
|
33
|
+
|
|
34
|
+
```text
|
|
35
|
+
FullName: zova-module-{providerId}-{moduleName}
|
|
36
|
+
ShortName: {providerId}-{moduleName}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
This naming system is important because it supports both architectural clarity and bean/scope identity across module boundaries.
|
|
40
|
+
|
|
41
|
+
## Suite as a multi-module boundary
|
|
42
|
+
|
|
43
|
+
A suite groups several related modules into a larger business scenario.
|
|
44
|
+
|
|
45
|
+
Representative examples might correspond to areas such as:
|
|
46
|
+
|
|
47
|
+
- e-commerce
|
|
48
|
+
- CRM
|
|
49
|
+
- supply chain
|
|
50
|
+
- shared application foundations
|
|
51
|
+
|
|
52
|
+
A suite is therefore not merely a package wrapper. It is a business-level composition boundary.
|
|
53
|
+
|
|
54
|
+
## Suite naming convention
|
|
55
|
+
|
|
56
|
+
Suites follow a similar naming model:
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
FullName: zova-suite-{providerId}-{suiteName}
|
|
60
|
+
ShortName: {providerId}-{suiteName}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Create modules and suites
|
|
64
|
+
|
|
65
|
+
Representative CLI entrypoints are:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npm run zova :create:module moduleName -- [--suite=]
|
|
69
|
+
npm run zova :create:suite suiteName
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
That matters because the CLI already knows the intended source-tree conventions and should be preferred over ad hoc manual scaffolding.
|
|
73
|
+
|
|
74
|
+
## Directory structure
|
|
75
|
+
|
|
76
|
+
The project directory structure expresses this modular architecture directly.
|
|
77
|
+
|
|
78
|
+
Representative areas include:
|
|
79
|
+
|
|
80
|
+
- `src/module`
|
|
81
|
+
- `src/module-vendor`
|
|
82
|
+
- `src/suite`
|
|
83
|
+
- `src/suite-vendor`
|
|
84
|
+
|
|
85
|
+
This makes frontend architecture visible in the source tree rather than hiding it behind build-only conventions.
|
|
86
|
+
|
|
87
|
+
### Representative source tree
|
|
88
|
+
|
|
89
|
+
```text
|
|
90
|
+
project
|
|
91
|
+
├── env
|
|
92
|
+
├── src
|
|
93
|
+
│ ├── front
|
|
94
|
+
│ │ └── config
|
|
95
|
+
│ ├── module
|
|
96
|
+
│ ├── module-vendor
|
|
97
|
+
│ ├── suite
|
|
98
|
+
│ │ ├── a-demo
|
|
99
|
+
│ │ └── a-home
|
|
100
|
+
│ │ └── modules
|
|
101
|
+
│ │ ├── home-base
|
|
102
|
+
│ │ ├── home-icon
|
|
103
|
+
│ │ ├── home-indexadmin
|
|
104
|
+
│ │ └── home-layoutadmin
|
|
105
|
+
│ └── suite-vendor
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
A practical convention from the legacy guidance is that `a-demo` can host demo or disposable exploratory code, while suites such as `a-home` act as the normal starting point for real application growth.
|
|
109
|
+
|
|
110
|
+
## Module and suite boundaries in practice
|
|
111
|
+
|
|
112
|
+
A practical mental model is:
|
|
113
|
+
|
|
114
|
+
- use a **module** for a coherent feature unit
|
|
115
|
+
- use a **suite** when several modules belong to one larger business scenario
|
|
116
|
+
- use the source tree as a reflection of real architecture, not only file storage
|
|
117
|
+
|
|
118
|
+
## Relationship to frontend build behavior
|
|
119
|
+
|
|
120
|
+
A module is also a natural async bundle boundary.
|
|
121
|
+
|
|
122
|
+
That means modularization is not only about code organization. It also affects how frontend output is built, loaded, and maintained.
|
|
123
|
+
|
|
124
|
+
### Package-level module metadata
|
|
125
|
+
|
|
126
|
+
A module package can also declare metadata in `package.json` through `zovaModule`, for example to describe inter-module dependencies or bundle behavior.
|
|
127
|
+
|
|
128
|
+
Representative patterns include:
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"name": "zova-module-demo-student",
|
|
133
|
+
"zovaModule": {
|
|
134
|
+
"dependencies": {
|
|
135
|
+
"a-zova": "5.0.0"
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"name": "zova-module-a-model",
|
|
144
|
+
"zovaModule": {
|
|
145
|
+
"bundle": {
|
|
146
|
+
"vendors": [
|
|
147
|
+
{
|
|
148
|
+
"match": ["@tanstack/query-core", "@tanstack/vue-query"],
|
|
149
|
+
"output": "tanstack-query"
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
This reinforces that modules are not merely folders. They are explicit package, dependency, and bundle boundaries.
|
|
158
|
+
|
|
159
|
+
## Relationship to other frontend guides
|
|
160
|
+
|
|
161
|
+
Read this together with:
|
|
162
|
+
|
|
163
|
+
- [IoC and Beans](/frontend/ioc-and-beans)
|
|
164
|
+
- [Module Scope](/frontend/module-scope)
|
|
165
|
+
- [Frontend Scripts](/frontend/scripts)
|
|
166
|
+
- [Reference Package Map](/reference/package-map)
|
|
167
|
+
|
|
168
|
+
These guides explain how modules connect to bean identity, scope-based resources, and monorepo layout.
|
|
169
|
+
|
|
170
|
+
## Implementation checks for module and suite changes
|
|
171
|
+
|
|
172
|
+
When editing or creates frontend code, ask:
|
|
173
|
+
|
|
174
|
+
1. does this belong in an existing module or a new one?
|
|
175
|
+
2. is this really one feature unit, or should it become part of a suite?
|
|
176
|
+
3. does the naming follow Zova’s module/suite conventions?
|
|
177
|
+
4. will the chosen placement preserve the intended architectural and bundle boundaries?
|
|
178
|
+
|
|
179
|
+
That helps AI keep frontend growth aligned with Zova’s modular system instead of falling back to generic folder expansion.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Navigation Guards Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how navigation guards work in Zova within the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## Why navigation guards matter
|
|
6
|
+
|
|
7
|
+
Navigation guards are one of the main places where routing behavior becomes application policy.
|
|
8
|
+
|
|
9
|
+
Typical uses include:
|
|
10
|
+
|
|
11
|
+
- checking authentication state
|
|
12
|
+
- redirecting unauthenticated users to login
|
|
13
|
+
- enforcing route-level behavior from route metadata
|
|
14
|
+
|
|
15
|
+
## Home-base guard entrypoint
|
|
16
|
+
|
|
17
|
+
The `home-base` module provides a router-guard service hook where custom logic can be added.
|
|
18
|
+
|
|
19
|
+
Representative shape:
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
class ServiceRouterGuards {
|
|
23
|
+
protected onRouterGuards(router: BeanRouter) {
|
|
24
|
+
router.beforeEach(async to => {
|
|
25
|
+
if (
|
|
26
|
+
!this.sys.config.ssr.ignoreCookieOnServer &&
|
|
27
|
+
to.meta.requiresAuth !== false &&
|
|
28
|
+
!this.$passport.isAuthenticated
|
|
29
|
+
) {
|
|
30
|
+
const [_res, err] = await catchError(() => {
|
|
31
|
+
return this.$passport.ensurePassport();
|
|
32
|
+
});
|
|
33
|
+
if (err) {
|
|
34
|
+
this.$errorHandler(err, 'onRouterGuards');
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (!this.$passport.isAuthenticated) {
|
|
38
|
+
this.app.$gotoLogin(to.fullPath);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Why route meta matters here
|
|
48
|
+
|
|
49
|
+
The example makes a key architectural point: navigation guards are tightly coupled to route metadata such as `requiresAuth`.
|
|
50
|
+
|
|
51
|
+
That means route configuration and guard behavior should be read together, not as separate concerns.
|
|
52
|
+
|
|
53
|
+
## SSR-sensitive detail
|
|
54
|
+
|
|
55
|
+
The example also references SSR-related configuration such as cookie handling on the server side.
|
|
56
|
+
|
|
57
|
+
So guards are not purely a client-side router concern. In Cabloy/Zova, they can also intersect with SSR behavior.
|
|
58
|
+
|
|
59
|
+
## Implementation checks for navigation-guard changes
|
|
60
|
+
|
|
61
|
+
When changing auth-sensitive routing behavior, ask:
|
|
62
|
+
|
|
63
|
+
1. does the route meta need to change?
|
|
64
|
+
2. does the guard logic need to change?
|
|
65
|
+
3. does SSR cookie or server-side behavior affect the guard decision path?
|
|
66
|
+
4. should redirects happen at the routing-policy layer rather than being hardcoded into page logic?
|
|
67
|
+
|
|
68
|
+
That produces cleaner and more framework-native navigation behavior.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# OpenAPI SDK Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how the Zova OpenAPI SDK workflow fits into the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
## Why OpenAPI SDK matters
|
|
6
|
+
|
|
7
|
+
Zova can generate frontend client SDKs from backend Swagger/OpenAPI metadata.
|
|
8
|
+
|
|
9
|
+
This is one of the most important fullstack links in Cabloy, because it lets backend contracts drive frontend integration more directly and reduces redundant hand-written API code.
|
|
10
|
+
|
|
11
|
+
## This page’s role in the contract loop
|
|
12
|
+
|
|
13
|
+
A practical split is:
|
|
14
|
+
|
|
15
|
+
- backend docs explain contract authoring and OpenAPI emission
|
|
16
|
+
- the fullstack bridge doc explains how emitted OpenAPI becomes generated frontend SDKs
|
|
17
|
+
- this page explains frontend configuration, generation, and usage choices after that contract reaches Zova
|
|
18
|
+
|
|
19
|
+
For the bridge view, also see [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk).
|
|
20
|
+
|
|
21
|
+
For the broader frontend contract-consumption ladder, also see [Server Data](/frontend/server-data), [API Schema Guide](/frontend/api-schema-guide), and [SDK Guide](/frontend/sdk-guide).
|
|
22
|
+
|
|
23
|
+
## Initialize OpenAPI config
|
|
24
|
+
|
|
25
|
+
Example: initialize OpenAPI config for module `demo-student`.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm run zova :openapi:config demo-student
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Module-level config
|
|
32
|
+
|
|
33
|
+
Each module can control which backend operations belong to it.
|
|
34
|
+
|
|
35
|
+
Representative idea:
|
|
36
|
+
|
|
37
|
+
- configure matching rules in the module OpenAPI config
|
|
38
|
+
- keep API ownership aligned with the module boundary
|
|
39
|
+
|
|
40
|
+
This modular split matters because Cabloy does not treat the frontend as one flat API client surface.
|
|
41
|
+
|
|
42
|
+
## Project-level config
|
|
43
|
+
|
|
44
|
+
The project-level OpenAPI config defines where Swagger/OpenAPI metadata is downloaded from.
|
|
45
|
+
|
|
46
|
+
Representative use case:
|
|
47
|
+
|
|
48
|
+
- point the frontend project at the correct backend Swagger JSON source
|
|
49
|
+
- then generate only the SDK slices needed by the current module
|
|
50
|
+
|
|
51
|
+
## Generate the SDK
|
|
52
|
+
|
|
53
|
+
Example: generate OpenAPI-based frontend services for module `demo-student`.
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm run zova :openapi:generate demo-student
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Build the rest-contract output
|
|
60
|
+
|
|
61
|
+
For Cabloy Basic, representative contract-build commands include:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
cd zova && npm run build:rest:cabloyBasicAdmin
|
|
65
|
+
cd zova && npm run build:rest:cabloyBasicWeb
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
This matters because SDK generation and rest-contract build steps are related, but not identical.
|
|
69
|
+
|
|
70
|
+
## Important convention
|
|
71
|
+
|
|
72
|
+
One important rule is that a module should usually standardize on one API-service creation style.
|
|
73
|
+
|
|
74
|
+
That means a module should generally choose between:
|
|
75
|
+
|
|
76
|
+
- manually authored API services
|
|
77
|
+
- OpenAPI-generated API services
|
|
78
|
+
|
|
79
|
+
Mixing both styles carelessly inside one module makes the codebase harder to reason about.
|
|
80
|
+
|
|
81
|
+
## Relationship to backend authoring
|
|
82
|
+
|
|
83
|
+
This page is about frontend consumption and generation, not backend contract authoring.
|
|
84
|
+
|
|
85
|
+
If the backend contract itself changes, first inspect or update the backend contract pages such as:
|
|
86
|
+
|
|
87
|
+
- [Controller Guide](/backend/controller-guide)
|
|
88
|
+
- [OpenAPI Guide](/backend/openapi-guide)
|
|
89
|
+
- [DTO Guide](/backend/dto-guide)
|
|
90
|
+
|
|
91
|
+
Then return to this page for the frontend regeneration step.
|
|
92
|
+
|
|
93
|
+
## Implementation checks for SDK regeneration decisions
|
|
94
|
+
|
|
95
|
+
When evaluating a request that depends on backend contracts, ask:
|
|
96
|
+
|
|
97
|
+
1. is this module already using generated OpenAPI services?
|
|
98
|
+
2. should the SDK be regenerated instead of hand-writing a new frontend service?
|
|
99
|
+
3. is the real source of truth the backend OpenAPI metadata rather than the current frontend code?
|
|
100
|
+
4. is the current task backend authoring, bridge regeneration, or frontend consumption?
|
|
101
|
+
|
|
102
|
+
That helps keep frontend integration aligned with the backend contract.
|