create-bubbles 0.1.22 → 0.1.24
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/dist/index.mjs +5 -0
- package/index.js +1 -1
- package/package.json +25 -24
- package/template-taro-react-oxc/.env.development +1 -1
- package/template-taro-react-oxc/.env.production +1 -1
- package/template-taro-react-oxc/project.config.json +1 -1
- package/template-taro-vue-eslint/project.config.json +2 -2
- package/{template-vp-monorepo-react-nestjs → template-vp-monorepo-react-hono}/.spaces/server//347/231/273/345/275/225/JWT/344/270/216RefreshToken/350/275/256/346/215/242/351/211/264/346/235/203/346/236/266/346/236/204/345/256/236/347/216/260/346/214/207/345/215/227.md +588 -1133
- package/template-vp-monorepo-react-hono/.vite-hooks/commit-msg +2 -0
- package/template-vp-monorepo-react-hono/.vite-hooks/pre-commit +2 -0
- package/template-vp-monorepo-react-hono/.vscode/extensions.json +3 -0
- package/template-vp-monorepo-react-hono/.vscode/settings.json +23 -0
- package/template-vp-monorepo-react-hono/AGENTS.md +16 -0
- package/template-vp-monorepo-react-hono/README.md +54 -0
- package/template-vp-monorepo-react-hono/apps/server/.env.example +13 -0
- package/template-vp-monorepo-react-hono/apps/server/README.md +75 -0
- package/template-vp-monorepo-react-hono/apps/server/drizzle/0000_flaky_madame_masque.sql +18 -0
- package/template-vp-monorepo-react-hono/apps/server/drizzle/meta/0000_snapshot.json +153 -0
- package/template-vp-monorepo-react-hono/apps/server/drizzle/meta/_journal.json +13 -0
- package/template-vp-monorepo-react-hono/apps/server/drizzle.config.ts +19 -0
- package/template-vp-monorepo-react-hono/apps/server/package.json +46 -0
- package/template-vp-monorepo-react-hono/apps/server/src/app.test.ts +57 -0
- package/template-vp-monorepo-react-hono/apps/server/src/app.ts +68 -0
- package/template-vp-monorepo-react-hono/apps/server/src/common/errors/app-error.ts +23 -0
- package/template-vp-monorepo-react-hono/apps/server/src/common/http/response.ts +21 -0
- package/template-vp-monorepo-react-hono/apps/server/src/common/logger.ts +30 -0
- package/template-vp-monorepo-react-hono/apps/server/src/config/env.ts +54 -0
- package/template-vp-monorepo-react-hono/apps/server/src/index.bun.ts +60 -0
- package/template-vp-monorepo-react-hono/apps/server/src/index.ts +73 -0
- package/template-vp-monorepo-react-hono/apps/server/src/infrastructure/database/client.ts +46 -0
- package/template-vp-monorepo-react-hono/apps/server/src/infrastructure/database/schema/index.ts +1 -0
- package/template-vp-monorepo-react-hono/apps/server/src/infrastructure/database/schema/job-runs.ts +42 -0
- package/template-vp-monorepo-react-hono/apps/server/src/infrastructure/queue/connection.ts +6 -0
- package/template-vp-monorepo-react-hono/apps/server/src/infrastructure/redis/client.ts +39 -0
- package/template-vp-monorepo-react-hono/apps/server/src/infrastructure/redis/options.ts +28 -0
- package/template-vp-monorepo-react-hono/apps/server/src/modules/health/health.routes.ts +17 -0
- package/template-vp-monorepo-react-hono/apps/server/src/modules/health/health.service.ts +59 -0
- package/template-vp-monorepo-react-hono/apps/server/src/modules/jobs/jobs.queue.ts +46 -0
- package/template-vp-monorepo-react-hono/apps/server/src/modules/jobs/jobs.repository.ts +101 -0
- package/template-vp-monorepo-react-hono/apps/server/src/modules/jobs/jobs.routes.ts +46 -0
- package/template-vp-monorepo-react-hono/apps/server/src/modules/jobs/jobs.schemas.ts +9 -0
- package/template-vp-monorepo-react-hono/apps/server/src/modules/jobs/jobs.service.ts +57 -0
- package/template-vp-monorepo-react-hono/apps/server/src/modules/jobs/jobs.types.ts +11 -0
- package/template-vp-monorepo-react-hono/apps/server/src/modules/jobs/jobs.worker.ts +108 -0
- package/template-vp-monorepo-react-hono/apps/server/src/runtime/shutdown.ts +38 -0
- package/template-vp-monorepo-react-hono/apps/server/src/worker.ts +48 -0
- package/template-vp-monorepo-react-hono/apps/server/tsconfig.json +15 -0
- package/template-vp-monorepo-react-hono/apps/server/vite.config.ts +15 -0
- package/template-vp-monorepo-react-hono/apps/web/.env +2 -0
- package/template-vp-monorepo-react-hono/apps/web/.env.dev +1 -0
- package/template-vp-monorepo-react-hono/apps/web/.env.prod +1 -0
- package/template-vp-monorepo-react-hono/apps/web/index.html +13 -0
- package/template-vp-monorepo-react-hono/apps/web/package.json +35 -0
- package/template-vp-monorepo-react-hono/apps/web/public/favicon.svg +1 -0
- package/template-vp-monorepo-react-hono/apps/web/public/icons.svg +24 -0
- package/template-vp-monorepo-react-hono/apps/web/src/App.tsx +25 -0
- package/template-vp-monorepo-react-hono/apps/web/src/assets/hero.png +0 -0
- package/template-vp-monorepo-react-hono/apps/web/src/assets/react.svg +1 -0
- package/template-vp-monorepo-react-hono/apps/web/src/assets/vite.svg +1 -0
- package/template-vp-monorepo-react-hono/apps/web/src/components/Loading/PageLoading.tsx +11 -0
- package/template-vp-monorepo-react-hono/apps/web/src/locales/en_US.json +4 -0
- package/template-vp-monorepo-react-hono/apps/web/src/locales/zh_CN.json +4 -0
- package/template-vp-monorepo-react-hono/apps/web/src/main.tsx +5 -0
- package/template-vp-monorepo-react-hono/apps/web/src/pages/home/index.tsx +47 -0
- package/template-vp-monorepo-react-hono/apps/web/src/router/index.tsx +25 -0
- package/template-vp-monorepo-react-hono/apps/web/src/router/modules/.gitkeep +0 -0
- package/template-vp-monorepo-react-hono/apps/web/src/styles/index.css +7 -0
- package/template-vp-monorepo-react-hono/apps/web/src/types/auto-imports.d.ts +58 -0
- package/template-vp-monorepo-react-hono/apps/web/src/utils/env/index.ts +6 -0
- package/template-vp-monorepo-react-hono/apps/web/src/utils/request/core/index.ts +420 -0
- package/template-vp-monorepo-react-hono/apps/web/src/utils/request/core/utils.ts +39 -0
- package/template-vp-monorepo-react-hono/apps/web/src/utils/request/index.ts +61 -0
- package/template-vp-monorepo-react-hono/apps/web/tsconfig.json +18 -0
- package/template-vp-monorepo-react-hono/apps/web/vite.config.ts +45 -0
- package/template-vp-monorepo-react-hono/commitlint.config.js +1 -0
- package/template-vp-monorepo-react-hono/docker-compose.yml +41 -0
- package/template-vp-monorepo-react-hono/mise.toml +4 -0
- package/template-vp-monorepo-react-hono/package.json +37 -0
- package/template-vp-monorepo-react-hono/packages/i18n/core/package.json +20 -0
- package/template-vp-monorepo-react-hono/packages/i18n/core/src/format.ts +9 -0
- package/template-vp-monorepo-react-hono/packages/i18n/core/src/i18n.ts +73 -0
- package/template-vp-monorepo-react-hono/packages/i18n/core/src/index.ts +24 -0
- package/template-vp-monorepo-react-hono/packages/i18n/core/src/storage.ts +47 -0
- package/template-vp-monorepo-react-hono/packages/i18n/core/src/store.ts +48 -0
- package/template-vp-monorepo-react-hono/packages/i18n/core/src/types.ts +36 -0
- package/template-vp-monorepo-react-hono/packages/i18n/core/tsconfig.json +4 -0
- package/template-vp-monorepo-react-hono/packages/i18n/core/vite.config.ts +13 -0
- package/template-vp-monorepo-react-hono/packages/i18n/react/package.json +28 -0
- package/template-vp-monorepo-react-hono/packages/i18n/react/src/index.tsx +26 -0
- package/template-vp-monorepo-react-hono/packages/i18n/react/src/use-store.ts +14 -0
- package/template-vp-monorepo-react-hono/packages/i18n/react/tsconfig.json +9 -0
- package/template-vp-monorepo-react-hono/packages/i18n/react/vite.config.ts +16 -0
- package/template-vp-monorepo-react-hono/packages/i18n/vue/package.json +27 -0
- package/template-vp-monorepo-react-hono/packages/i18n/vue/src/index.ts +52 -0
- package/template-vp-monorepo-react-hono/packages/i18n/vue/src/use-store.ts +19 -0
- package/template-vp-monorepo-react-hono/packages/i18n/vue/tsconfig.json +8 -0
- package/template-vp-monorepo-react-hono/packages/i18n/vue/vite.config.ts +16 -0
- package/template-vp-monorepo-react-hono/pnpm-workspace.yaml +57 -0
- package/template-vp-monorepo-react-hono/scripts/clean.mjs +48 -0
- package/template-vp-monorepo-react-hono/tsconfig.base.json +10 -0
- package/template-vp-monorepo-react-hono/tsconfig.bundler.json +12 -0
- package/template-vp-monorepo-react-hono/tsconfig.json +11 -0
- package/template-vp-monorepo-react-hono/tsconfig.lib.json +10 -0
- package/template-vp-monorepo-react-hono/vite.config.ts +20 -0
- package/template-vp-monorepo-react-nestjs/.spaces/server/todo.md +991 -0
- package/template-vp-monorepo-react-nestjs/.vscode/launch.json +16 -0
- package/template-vp-monorepo-react-nestjs/.vscode/settings.json +21 -17
- package/template-vp-monorepo-react-nestjs/apps/server/.env.development +3 -39
- package/template-vp-monorepo-react-nestjs/apps/server/.swcrc +8 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle.config.ts +8 -3
- package/template-vp-monorepo-react-nestjs/apps/server/nest-cli.json +8 -1
- package/template-vp-monorepo-react-nestjs/apps/server/package.json +11 -6
- package/template-vp-monorepo-react-nestjs/apps/server/src/app.controller.ts +2 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/app.module.ts +20 -15
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/adapters/fastify.adapter.ts +16 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/constants/auth.ts +2 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/constants/response.ts +0 -4
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/constants/session.constants.ts +28 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/current-auth.decorator.ts +16 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/public.decorator.ts +4 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/dto/api-failure.dto.ts +25 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/error/common.error.ts +40 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/exceptions/app.exception.ts +55 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/filters/global-exception.filter.ts +384 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/openapi/response-headers.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/index.ts +1 -1
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/session.config.ts +36 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/database/schema.ts +7 -8
- package/template-vp-monorepo-react-nestjs/apps/server/src/main.ts +29 -8
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.controller.ts +55 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.errors.ts +42 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.module.ts +26 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.repository.ts +40 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.service.ts +129 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/dto/auth-repsponse.dto.ts +31 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/dto/login.dto.ts +11 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/dto/register.dto.ts +17 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/guards/session-auth.guard.ts +50 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/password.service.ts +24 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session-store.service.ts +198 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session-token.service.ts +29 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session.script.ts +221 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/session/session.types.ts +24 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/db.controller.ts +1 -1
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/db/dto/create-user.dto.ts +3 -5
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/redis/redis.service.ts +1 -1
- package/template-vp-monorepo-react-nestjs/apps/server/src/utils/env-arr.ts +3 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/error-catalog.spec.ts +30 -0
- package/template-vp-monorepo-react-nestjs/apps/server/tsconfig.build.json +11 -1
- package/template-vp-monorepo-react-nestjs/apps/server/tsconfig.json +12 -20
- package/template-vp-monorepo-react-nestjs/apps/server/vite.config.ts +15 -0
- package/template-vp-monorepo-react-nestjs/apps/web/package.json +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web/tsconfig.json +5 -15
- package/template-vp-monorepo-react-nestjs/apps/web-vue/commitlint.config.js +1 -1
- package/template-vp-monorepo-react-nestjs/apps/web-vue/lefthook.yml +1 -1
- package/template-vp-monorepo-react-nestjs/apps/web-vue/package.json +1 -3
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/api/index.ts +5 -5
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/components/Icon/svg-icon.vue +3 -3
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/hooks/chart/lib.ts +6 -6
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/hooks/chart/useEcharts.ts +34 -29
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/i18n/instance.ts +2 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/layout/default/index.vue +17 -32
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/locales/en_US.json +4 -1
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/locales/zh_CN.json +4 -1
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/index.ts +3 -3
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/guard/permissionGuard.ts +7 -7
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/index.ts +7 -7
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/router/interface.ts +6 -6
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/index.ts +6 -6
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/store/modules/user.ts +9 -9
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/styles/index.scss +3 -3
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/types/antdv-next.d.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/env.ts +1 -1
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/index.ts +63 -45
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/core/utils.ts +12 -6
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/utils/request/index.ts +1 -1
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/example/echart/config.ts +687 -687
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/example/echart/index.vue +7 -7
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/example/tree-chart.vue +2 -7
- package/template-vp-monorepo-react-nestjs/apps/web-vue/src/views/home/index.vue +13 -3
- package/template-vp-monorepo-react-nestjs/apps/web-vue/tsconfig.json +5 -17
- package/template-vp-monorepo-react-nestjs/apps/web-vue/uno.config.ts +5 -5
- package/template-vp-monorepo-react-nestjs/i18n.config.ts +22 -0
- package/template-vp-monorepo-react-nestjs/package.json +12 -1
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/README.md +113 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/docs/excel-sync-plan.md +618 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/package.json +31 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/cli.ts +5 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/command.ts +512 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/config.ts +15 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/files.ts +67 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/index.ts +19 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/load-config.ts +228 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/report.ts +57 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/scanner.test.ts +81 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/scanner.ts +290 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/src/sync.ts +274 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/command.test.ts +209 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/config.test.ts +19 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/load-config.test.ts +194 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/report.test.ts +63 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/sync.test.ts +203 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/test/temporary-directory.ts +25 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/tsconfig.json +9 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/cli/vite.config.ts +18 -0
- package/template-vp-monorepo-react-nestjs/packages/i18n/core/tsconfig.json +1 -12
- package/template-vp-monorepo-react-nestjs/packages/i18n/react/tsconfig.json +3 -10
- package/template-vp-monorepo-react-nestjs/packages/i18n/vue/tsconfig.json +3 -10
- package/template-vp-monorepo-react-nestjs/packages/shared/package.json +40 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/index.ts +13 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/types/auth.ts +35 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/types/common.ts +11 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/types/index.ts +11 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/account.ts +5 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/index.ts +2 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/src/utils/session-terminal.ts +11 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/tsconfig.json +4 -0
- package/template-vp-monorepo-react-nestjs/packages/shared/vite.config.ts +17 -0
- package/template-vp-monorepo-react-nestjs/pnpm-workspace.yaml +6 -6
- package/template-vp-monorepo-react-nestjs/scripts/clean.mjs +48 -0
- package/template-vp-monorepo-react-nestjs/tsconfig.base.json +10 -0
- package/template-vp-monorepo-react-nestjs/tsconfig.bundler.json +12 -0
- package/template-vp-monorepo-react-nestjs/tsconfig.json +8 -6
- package/template-vp-monorepo-react-nestjs/tsconfig.lib.json +10 -0
- package/template-vp-monorepo-react-nestjs/vite.config.ts +2 -1
- package/template-vp-vue-eslint-vapor/.env +6 -0
- package/template-vp-vue-eslint-vapor/.env.development +2 -0
- package/template-vp-vue-eslint-vapor/.env.production +2 -0
- package/template-vp-vue-eslint-vapor/.vite-hooks/commit-msg +1 -0
- package/template-vp-vue-eslint-vapor/.vite-hooks/pre-commit +1 -0
- package/template-vp-vue-eslint-vapor/.vscode/extensions.json +3 -0
- package/template-vp-vue-eslint-vapor/AGENTS.md +16 -0
- package/template-vp-vue-eslint-vapor/README.md +93 -0
- package/template-vp-vue-eslint-vapor/commitlint.config.js +1 -0
- package/template-vp-vue-eslint-vapor/eslint.config.js +13 -0
- package/template-vp-vue-eslint-vapor/index.html +13 -0
- package/template-vp-vue-eslint-vapor/package.json +64 -0
- package/template-vp-vue-eslint-vapor/pnpm-workspace.yaml +2 -0
- package/template-vp-vue-eslint-vapor/public/vite.svg +1 -0
- package/template-vp-vue-eslint-vapor/src/App.vue +7 -0
- package/template-vp-vue-eslint-vapor/src/api/index.ts +12 -0
- package/template-vp-vue-eslint-vapor/src/assets/icon/home.svg +3 -0
- package/template-vp-vue-eslint-vapor/src/assets/icon/logo.svg +1 -0
- package/template-vp-vue-eslint-vapor/src/assets/image/.gitkeep +0 -0
- package/template-vp-vue-eslint-vapor/src/components/Icon/svg-icon.vue +29 -0
- package/template-vp-vue-eslint-vapor/src/hooks/chart/lib.ts +57 -0
- package/template-vp-vue-eslint-vapor/src/hooks/chart/useEcharts.ts +65 -0
- package/template-vp-vue-eslint-vapor/src/layout/default/header/index.vue +57 -0
- package/template-vp-vue-eslint-vapor/src/layout/default/index.vue +138 -0
- package/template-vp-vue-eslint-vapor/src/main.ts +19 -0
- package/template-vp-vue-eslint-vapor/src/router/guard/index.ts +7 -0
- package/template-vp-vue-eslint-vapor/src/router/guard/permissionGuard.ts +13 -0
- package/template-vp-vue-eslint-vapor/src/router/index.ts +18 -0
- package/template-vp-vue-eslint-vapor/src/router/interface.ts +9 -0
- package/template-vp-vue-eslint-vapor/src/router/modules/index.ts +33 -0
- package/template-vp-vue-eslint-vapor/src/store/index.ts +11 -0
- package/template-vp-vue-eslint-vapor/src/store/modules/user.ts +17 -0
- package/template-vp-vue-eslint-vapor/src/styles/font.scss +0 -0
- package/template-vp-vue-eslint-vapor/src/styles/index.scss +29 -0
- package/template-vp-vue-eslint-vapor/src/styles/variables.scss +3 -0
- package/template-vp-vue-eslint-vapor/src/types/vite-env.d.ts +15 -0
- package/template-vp-vue-eslint-vapor/src/utils/env.ts +11 -0
- package/template-vp-vue-eslint-vapor/src/utils/request/core/index.ts +425 -0
- package/template-vp-vue-eslint-vapor/src/utils/request/core/utils.ts +39 -0
- package/template-vp-vue-eslint-vapor/src/utils/request/index.ts +44 -0
- package/template-vp-vue-eslint-vapor/src/views/example/echart/config.ts +1794 -0
- package/template-vp-vue-eslint-vapor/src/views/example/echart/index.vue +20 -0
- package/template-vp-vue-eslint-vapor/src/views/example/tree-chart.vue +16 -0
- package/template-vp-vue-eslint-vapor/src/views/home/index.vue +16 -0
- package/template-vp-vue-eslint-vapor/src/views/login/index.vue +9 -0
- package/template-vp-vue-eslint-vapor/tsconfig.json +32 -0
- package/template-vp-vue-eslint-vapor/tsconfig.tsbuildinfo +1 -0
- package/template-vp-vue-eslint-vapor/uno.config.ts +17 -0
- package/template-vp-vue-eslint-vapor/vite.config.ts +66 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/constants/decorator.ts +0 -2
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/decorators/bypass.ts +0 -12
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/interceptors/transform.ts +0 -34
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/model/response.ts +0 -23
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/auth.config.ts +0 -64
- package/template-vp-monorepo-react-nestjs/apps/web-vue/pnpm-workspace.yaml +0 -16
- /package/{template-vp-monorepo-react-nestjs/apps/server/src/config/security.config.ts → template-vp-monorepo-react-hono/.agents/auth.config.ts} +0 -0
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
# JSON 与 Excel 双向同步规划
|
|
2
|
+
|
|
3
|
+
> 状态:设计稿,尚未实施。
|
|
4
|
+
>
|
|
5
|
+
> 目标:在现有“代码扫描 → JSON”之外,增加“JSON → Excel”和“Excel → JSON”,并让两类功能的命令、配置、报告和删除参数彼此隔离。
|
|
6
|
+
|
|
7
|
+
## 1. 总体结论
|
|
8
|
+
|
|
9
|
+
保留现有命令不变:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
bubbles-i18n sync 代码 → JSON
|
|
13
|
+
bubbles-i18n check 检查代码与 JSON
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
新增独立的 Excel 命名空间:
|
|
17
|
+
|
|
18
|
+
```text
|
|
19
|
+
bubbles-i18n excel export JSON → Excel
|
|
20
|
+
bubbles-i18n excel import Excel → JSON
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
不建议增加 `excel sync`,因为它不能明确说明本次操作以哪一边为输入、会修改哪一边。
|
|
24
|
+
|
|
25
|
+
配置上新增顶层 `excel`,现有 `callNames`、`include`、`exclude` 等扫描参数不会进入 Excel 流程。`excel.projects.<name>` 自动引用同名的 `projects.<name>.catalogs`,避免重复维护 locale 和 JSON 文件路径。
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
代码扫描参数 ── sync/check ──→ JSON catalogs
|
|
29
|
+
↑
|
|
30
|
+
Excel 参数 ── excel import/export ───┘
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
两套功能唯一共享的是 `projects.<name>.catalogs`,因为它是 locale 与 JSON 文件路径的事实来源。
|
|
34
|
+
|
|
35
|
+
第一版明确采用“一项目一文件”:一个 project 对应一个 `.xlsx` 文件和一个由 CLI 管理的可见翻译 sheet,另有一个可选的隐藏 metadata sheet。用户自建的其他 sheet 不参与同步;不同 project 不共用 Excel 文件。
|
|
36
|
+
|
|
37
|
+
## 2. Excel 表格结构
|
|
38
|
+
|
|
39
|
+
可见数据 sheet 第一行为表头,纵向每一行是 key,横向每一列是语言:
|
|
40
|
+
|
|
41
|
+
| key | 中文 | English | 备注 |
|
|
42
|
+
| ---- | ---- | ------- | -------- |
|
|
43
|
+
| 登录 | 登录 | Sign in | 登录按钮 |
|
|
44
|
+
| 保存 | 保存 | Save | |
|
|
45
|
+
|
|
46
|
+
规则:
|
|
47
|
+
|
|
48
|
+
- 第一列是 key。
|
|
49
|
+
- 每个 locale 对应一个语言列。
|
|
50
|
+
- 一个 Excel 文件只属于一个 project。
|
|
51
|
+
- 每个文件只有一个由 CLI 管理的可见翻译 sheet;CLI 可以另外创建一个隐藏 metadata sheet。
|
|
52
|
+
- 用户自行增加的其他 sheet 不参与同步,导出时尽量原样保留,但不允许再映射到其他 project。
|
|
53
|
+
- 不同 project 配置的 Excel 路径解析后必须唯一,不能指向同一个文件。
|
|
54
|
+
- 导入按照表头名称匹配语言,不依赖语言列所在位置。
|
|
55
|
+
- 行顺序不影响导入。
|
|
56
|
+
- key 使用精确字符串匹配,不自动 trim,也不做 Unicode 标准化。
|
|
57
|
+
- 翻译值的换行、首尾空格、中文、emoji 和占位符原样保留。
|
|
58
|
+
- 完全空白的行忽略。
|
|
59
|
+
- key 为空但语言列存在内容时直接报错。
|
|
60
|
+
- 重复 key 直接报错,并给出重复行号。
|
|
61
|
+
- 缺少配置中的语言列直接报错。
|
|
62
|
+
- 未声明的额外列直接报错;声明为 `extraColumns` 的备注类列忽略并尽量保留。
|
|
63
|
+
|
|
64
|
+
第一版只支持 `.xlsx`:
|
|
65
|
+
|
|
66
|
+
- 不支持 `.xls`。
|
|
67
|
+
- 不支持 `.xlsm`。
|
|
68
|
+
- 不保证保留宏、透视表、图表等高级 Excel 特性。
|
|
69
|
+
|
|
70
|
+
## 3. 推荐配置结构
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import { defineConfig } from '@bubblesjs/i18n-cli'
|
|
74
|
+
|
|
75
|
+
export default defineConfig({
|
|
76
|
+
// 现有:代码扫描 → JSON
|
|
77
|
+
callNames: ['tr'],
|
|
78
|
+
projects: {
|
|
79
|
+
webVue: {
|
|
80
|
+
include: ['apps/web-vue/src/**/*.{js,ts,vue}'],
|
|
81
|
+
catalogs: {
|
|
82
|
+
zh_CN: 'apps/web-vue/src/locales/zh_CN.json',
|
|
83
|
+
en_US: 'apps/web-vue/src/locales/en_US.json',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
report: '.bubbles-i18n/report.json',
|
|
88
|
+
|
|
89
|
+
// 新增:JSON ↔ Excel
|
|
90
|
+
excel: {
|
|
91
|
+
report: '.bubbles-i18n/excel-report.json',
|
|
92
|
+
|
|
93
|
+
projects: {
|
|
94
|
+
// 这里的 webVue 自动引用上面的 projects.webVue.catalogs,
|
|
95
|
+
// 不再重复配置 project 名称或 JSON 路径。
|
|
96
|
+
webVue: {
|
|
97
|
+
file: 'translations/web-vue.xlsx',
|
|
98
|
+
sheet: 'translations',
|
|
99
|
+
keyHeader: 'key',
|
|
100
|
+
|
|
101
|
+
// 数组顺序就是 Excel 中的语言列顺序。
|
|
102
|
+
// 不配置时使用 projects.webVue.catalogs 的顺序,
|
|
103
|
+
// 表头直接使用 zh_CN、en_US 等 locale ID。
|
|
104
|
+
locales: [
|
|
105
|
+
{ locale: 'zh_CN', header: '中文' },
|
|
106
|
+
{ locale: 'en_US', header: 'English' },
|
|
107
|
+
],
|
|
108
|
+
|
|
109
|
+
// 用户可以维护这些列;导入时不写入 JSON。
|
|
110
|
+
extraColumns: ['备注'],
|
|
111
|
+
|
|
112
|
+
export: {
|
|
113
|
+
// merge:更新 CLI 管理的 key/locale 单元格,
|
|
114
|
+
// 保留额外列、已有行顺序和允许保留的格式。
|
|
115
|
+
mode: 'merge',
|
|
116
|
+
|
|
117
|
+
// catalog:按 catalogs 声明顺序遍历 JSON,
|
|
118
|
+
// key 第一次出现时加入,不引入 sourceLocale。
|
|
119
|
+
keyOrder: 'catalog',
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
import: {
|
|
123
|
+
// preserve:空单元格不覆盖 JSON。
|
|
124
|
+
emptyCell: 'preserve',
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
tracking: {
|
|
128
|
+
// 推荐开启隐藏 metadata sheet,用于检测
|
|
129
|
+
// JSON、Excel 是否同时修改。
|
|
130
|
+
enabled: true,
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
backup: {
|
|
136
|
+
enabled: true,
|
|
137
|
+
directory: '.bubbles-i18n/backups',
|
|
138
|
+
keep: 10,
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
limits: {
|
|
142
|
+
maxFileSizeMB: 20,
|
|
143
|
+
maxRows: 50_000,
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
})
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 3.1 隔离原则
|
|
150
|
+
|
|
151
|
+
| 配置 | 使用方 | Excel 命令是否读取 |
|
|
152
|
+
| --------------------- | ----------------- | ------------------ |
|
|
153
|
+
| `callNames` | 代码扫描 | 否 |
|
|
154
|
+
| `projects.*.include` | 代码扫描 | 否 |
|
|
155
|
+
| `projects.*.exclude` | 代码扫描 | 否 |
|
|
156
|
+
| `projects.*.catalogs` | JSON 文件映射 | 是,只读取这一项 |
|
|
157
|
+
| `report` | 代码扫描报告 | 否 |
|
|
158
|
+
| `excel.report` | Excel 报告 | 是 |
|
|
159
|
+
| `excel.projects` | 项目的 Excel 配置 | 是 |
|
|
160
|
+
| `excel.backup` | Excel 操作备份 | 是 |
|
|
161
|
+
|
|
162
|
+
Excel 下不再复制一份 JSON 路径,否则两处配置可能不一致。
|
|
163
|
+
|
|
164
|
+
### 3.2 第一版范围
|
|
165
|
+
|
|
166
|
+
- `excel.projects` 的 key 必须存在于根配置的 `projects` 中。
|
|
167
|
+
- 一个 project 最多配置一个 Excel 文件。
|
|
168
|
+
- 一个 Excel 文件只属于一个 project。
|
|
169
|
+
- 每个文件只有一个由 CLI 管理的可见翻译 sheet;隐藏 metadata sheet 和用户自建的非托管 sheet 都不算翻译数据 sheet。
|
|
170
|
+
- 不同 project 的 `file` 解析后不能指向同一路径,Windows 下按不区分大小写处理。
|
|
171
|
+
- 根配置中的 project 可以不配置 Excel;此时仍可使用现有 `sync/check`,但不能执行 Excel 命令。
|
|
172
|
+
- `sheet` 需满足 Excel 的 31 字符限制和非法字符规则,也不能与保留的 metadata sheet 名冲突。
|
|
173
|
+
|
|
174
|
+
## 4. package.json 脚本
|
|
175
|
+
|
|
176
|
+
建议新增:
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"scripts": {
|
|
181
|
+
"i18n:excel:export": "bubbles-i18n excel export",
|
|
182
|
+
"i18n:excel:import": "bubbles-i18n excel import"
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
从根目录运行:
|
|
188
|
+
|
|
189
|
+
```powershell
|
|
190
|
+
# JSON → Excel,先预览
|
|
191
|
+
vp run i18n:excel:export --project webVue --dry-run
|
|
192
|
+
|
|
193
|
+
# JSON → Excel,真实写入
|
|
194
|
+
vp run i18n:excel:export --project webVue
|
|
195
|
+
|
|
196
|
+
# Excel → JSON,先预览
|
|
197
|
+
vp run i18n:excel:import --project webVue --dry-run
|
|
198
|
+
|
|
199
|
+
# Excel → JSON,真实写入
|
|
200
|
+
vp run i18n:excel:import --project webVue
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
`--project` 可以多次传入。不传时默认处理 `excel.projects` 中配置的全部项目,但每个项目仍然读写自己的 Excel 文件。
|
|
204
|
+
|
|
205
|
+
## 5. 命令行参数规划
|
|
206
|
+
|
|
207
|
+
### 5.1 通用参数
|
|
208
|
+
|
|
209
|
+
| 参数 | 默认值 | 说明 |
|
|
210
|
+
| ------------------- | -------------- | ------------------------------------------- |
|
|
211
|
+
| `--config <path>` | 自动向上查找 | 指定 `i18n.config.*` |
|
|
212
|
+
| `--project <name>` | 全部 | 选择 Excel project;可以多次传入 |
|
|
213
|
+
| `--locale <locale>` | project 中全部 | 只处理指定语言;可以多次传入 |
|
|
214
|
+
| `--dry-run` | `false` | 只计算差异和报告,不写 Excel、JSON 或备份 |
|
|
215
|
+
| `--report <path>` | `excel.report` | 临时覆盖本次 Excel 报告路径 |
|
|
216
|
+
| `--no-backup` | `false` | 明确关闭本次备份 |
|
|
217
|
+
| `--allow-untracked` | `false` | 允许处理没有 CLI metadata 的手工 Excel 文件 |
|
|
218
|
+
|
|
219
|
+
`--report`、`--no-backup` 和 `--allow-untracked` 只属于 `excel` 子命令,不影响现有 `sync/check`。
|
|
220
|
+
|
|
221
|
+
### 5.2 JSON → Excel:`excel export`
|
|
222
|
+
|
|
223
|
+
```text
|
|
224
|
+
bubbles-i18n excel export [通用参数]
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
额外参数:
|
|
228
|
+
|
|
229
|
+
| 参数 | 默认值 | 说明 |
|
|
230
|
+
| --------------------- | ------- | --------------------------------------------------- |
|
|
231
|
+
| `--prune` | `false` | 删除 Excel 中存在、JSON key 并集中不存在的行 |
|
|
232
|
+
| `--allow-empty` | `false` | 只有和 `--prune` 一起使用时,允许空 JSON 清空数据行 |
|
|
233
|
+
| `--conflict <policy>` | `error` | 双方同时修改时的处理策略 |
|
|
234
|
+
|
|
235
|
+
导出默认使用 `merge`:
|
|
236
|
+
|
|
237
|
+
- JSON 中的新 key 添加为新行。
|
|
238
|
+
- JSON 中变化的翻译更新对应语言单元格。
|
|
239
|
+
- Excel 的额外列、已有行顺序和允许保留的格式尽量保留。
|
|
240
|
+
- Excel 独有行默认保留并写入报告。
|
|
241
|
+
- 只有 `--prune` 才删除 Excel 独有行。
|
|
242
|
+
|
|
243
|
+
配置路径下已经存在同名 Excel 是正常情况,不会直接重建整本文件。CLI 先读取现有文件,再按下面规则合并:
|
|
244
|
+
|
|
245
|
+
| 当前情况 | export 默认处理 |
|
|
246
|
+
| --------------------------------- | --------------------------------------------------- |
|
|
247
|
+
| JSON 有新 key,Excel 没有 | 在可见翻译 sheet 中追加一行 |
|
|
248
|
+
| JSON 没有该 key,Excel 有 | 保留 Excel 行并报告;只有 `--prune` 才删除 |
|
|
249
|
+
| 只有 JSON 相对 metadata 发生变化 | 把 JSON 值安全更新到 Excel |
|
|
250
|
+
| 只有 Excel 相对 metadata 发生变化 | 保留 Excel 值并报告“等待 import” |
|
|
251
|
+
| 双方改成相同值 | 视为已经一致并更新 metadata |
|
|
252
|
+
| 双方都修改且值不同 | 视为冲突,默认不写任何选中项目 |
|
|
253
|
+
| 现有 Excel 没有 metadata | 默认拒绝接管;显式 `--allow-untracked` 后按方向处理 |
|
|
254
|
+
|
|
255
|
+
覆盖同名 Excel 前创建备份,并通过临时文件验证后替换;文件被 Excel 占用时在任何正式写入前停止。
|
|
256
|
+
|
|
257
|
+
为避免无意删除全部项目,`--prune` 必须至少显式传入一个 `--project`。需要清理多个项目时可以重复传入 `--project`,但不能依赖“不传项目即全部”的默认选择。
|
|
258
|
+
|
|
259
|
+
### 5.3 Excel → JSON:`excel import`
|
|
260
|
+
|
|
261
|
+
```text
|
|
262
|
+
bubbles-i18n excel import [通用参数]
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
额外参数:
|
|
266
|
+
|
|
267
|
+
| 参数 | 默认值 | 说明 |
|
|
268
|
+
| --------------------- | ---------- | ----------------------------------------------------- |
|
|
269
|
+
| `--blank <policy>` | `preserve` | 空翻译单元格的处理方式 |
|
|
270
|
+
| `--prune` | `false` | 删除 Excel 中整行不存在的 JSON key |
|
|
271
|
+
| `--allow-empty` | `false` | 只有和 `--prune` 一起使用时,允许空翻译表清空 catalog |
|
|
272
|
+
| `--conflict <policy>` | `error` | 双方同时修改时的处理策略 |
|
|
273
|
+
|
|
274
|
+
`--blank` 可选值:
|
|
275
|
+
|
|
276
|
+
| 值 | 行为 |
|
|
277
|
+
| ---------- | --------------------------------------- |
|
|
278
|
+
| `preserve` | 默认;空单元格不修改 JSON,也不新增空值 |
|
|
279
|
+
| `empty` | 把空单元格写为 JSON 空字符串 `""` |
|
|
280
|
+
| `delete` | 删除该 locale 下对应的单个 key |
|
|
281
|
+
|
|
282
|
+
`--prune` 与 `--blank delete` 是两种不同删除:
|
|
283
|
+
|
|
284
|
+
- `--prune`:Excel 中整行不存在,删除整个 key。
|
|
285
|
+
- `--blank delete`:行存在,但某个语言单元格为空,只删除该 locale 的 key。
|
|
286
|
+
|
|
287
|
+
它们不能混为同一种语义。
|
|
288
|
+
|
|
289
|
+
import 的 `--prune` 同样要求至少显式传入一个 `--project`。
|
|
290
|
+
|
|
291
|
+
### 5.4 冲突参数
|
|
292
|
+
|
|
293
|
+
为保持命令方向明确,推荐按命令限制可选值:
|
|
294
|
+
|
|
295
|
+
```text
|
|
296
|
+
excel export --conflict error|use-json
|
|
297
|
+
excel import --conflict error|use-excel
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
| 命令 | 值 | 行为 |
|
|
301
|
+
| -------- | ----------- | ---------------------------------------------- |
|
|
302
|
+
| 两者 | `error` | 默认;发现双方同时修改且值不同,所有文件都不写 |
|
|
303
|
+
| `export` | `use-json` | 使用当前 JSON 值覆盖 Excel 冲突单元格 |
|
|
304
|
+
| `import` | `use-excel` | 使用当前 Excel 值覆盖 JSON 冲突项 |
|
|
305
|
+
|
|
306
|
+
如果 export 时决定保留 Excel,应改为执行 import;如果 import 时决定保留 JSON,应改为执行 export。这样不会让 export 反向修改 JSON,也不会让 import 反向修改可见 Excel 数据。
|
|
307
|
+
|
|
308
|
+
冲突策略只处理真正的“双边修改冲突”,不改变 `--prune` 和 `--blank` 的删除规则。一次选择多个 project 时,策略会应用于所有选中项目,因此默认 `error` 最安全。
|
|
309
|
+
|
|
310
|
+
## 6. JSON → Excel 规则
|
|
311
|
+
|
|
312
|
+
### 6.1 key 集合
|
|
313
|
+
|
|
314
|
+
导出使用配置中所有 locale JSON key 的并集,不引入 `sourceLocale`:
|
|
315
|
+
|
|
316
|
+
- key 只存在于 `zh_CN.json` 时仍然导出。
|
|
317
|
+
- 对应 `en_US` 单元格为空。
|
|
318
|
+
- 报告记录该 locale 缺少这个 key。
|
|
319
|
+
|
|
320
|
+
默认行顺序:
|
|
321
|
+
|
|
322
|
+
1. 按 `excel.projects.<project>.locales` 的配置顺序遍历 catalogs。
|
|
323
|
+
2. 保留各 JSON 中原有 key 顺序。
|
|
324
|
+
3. key 第一次出现时加入并集。
|
|
325
|
+
|
|
326
|
+
这只是展示顺序,不代表某种语言是 source locale。
|
|
327
|
+
|
|
328
|
+
### 6.2 Excel 独有数据
|
|
329
|
+
|
|
330
|
+
默认不删除:
|
|
331
|
+
|
|
332
|
+
- Excel 独有行记入 `targetOnlyKeys`。
|
|
333
|
+
- 额外列保持不变。
|
|
334
|
+
- 只有显式 `--prune` 才删除独有行。
|
|
335
|
+
|
|
336
|
+
### 6.3 公式安全
|
|
337
|
+
|
|
338
|
+
导出时所有 key 和翻译都写为文本 cell:
|
|
339
|
+
|
|
340
|
+
- `=SUM(...)` 仍是普通翻译文本,不生成公式。
|
|
341
|
+
- `+`、`-`、`@` 开头的内容也按文本写入。
|
|
342
|
+
- 超过 Excel 单元格 32,767 字符限制时直接报错。
|
|
343
|
+
|
|
344
|
+
## 7. Excel → JSON 规则
|
|
345
|
+
|
|
346
|
+
### 7.1 类型校验
|
|
347
|
+
|
|
348
|
+
key 和语言列只接受:
|
|
349
|
+
|
|
350
|
+
- 字符串 cell。
|
|
351
|
+
- 空 cell。
|
|
352
|
+
|
|
353
|
+
以下类型默认报错,不静默转字符串:
|
|
354
|
+
|
|
355
|
+
- 数字。
|
|
356
|
+
- 布尔值。
|
|
357
|
+
- 日期。
|
|
358
|
+
- 公式。
|
|
359
|
+
- hyperlink。
|
|
360
|
+
- rich text。
|
|
361
|
+
|
|
362
|
+
例如 Excel 把 `001` 自动转为数字 `1` 后,CLI 已无法还原原值,因此必须报错。
|
|
363
|
+
|
|
364
|
+
### 7.2 新增与更新
|
|
365
|
+
|
|
366
|
+
- Excel 非空值覆盖或新增对应 JSON 翻译。
|
|
367
|
+
- 新行只有部分语言有值时,只更新有值的 locale。
|
|
368
|
+
- 空单元格默认 `preserve`,不会清空已有翻译。
|
|
369
|
+
- JSON 中存在、Excel 中整行不存在的 key 默认保留并报告。
|
|
370
|
+
- 只有 `--prune` 才删除整行缺失的 key。
|
|
371
|
+
|
|
372
|
+
### 7.3 空字符串边界
|
|
373
|
+
|
|
374
|
+
Excel 在界面上无法可靠区分:
|
|
375
|
+
|
|
376
|
+
1. JSON 中没有这个 key。
|
|
377
|
+
2. JSON 中存在 `"key": ""`。
|
|
378
|
+
3. 用户暂时留空,不希望覆盖原值。
|
|
379
|
+
|
|
380
|
+
因此推荐默认:
|
|
381
|
+
|
|
382
|
+
```text
|
|
383
|
+
--blank preserve
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
这能保证把 Excel 导回原有 JSON 时不会因为译员留空而破坏已有翻译。
|
|
387
|
+
|
|
388
|
+
但如果只保留 Excel、删除全部 JSON,再依赖 Excel 完整重建 JSON,则“missing”和“空字符串”无法仅凭可见单元格区分。要实现完全无损重建,需要启用隐藏 metadata。
|
|
389
|
+
|
|
390
|
+
## 8. 隐藏 metadata 与真正的双向冲突检测
|
|
391
|
+
|
|
392
|
+
这是实施范围中最需要确认的一项。
|
|
393
|
+
|
|
394
|
+
### 8.1 为什么需要 metadata
|
|
395
|
+
|
|
396
|
+
典型场景:
|
|
397
|
+
|
|
398
|
+
1. 从 JSON 导出 Excel。
|
|
399
|
+
2. 开发人员修改 JSON。
|
|
400
|
+
3. 翻译人员同时修改 Excel。
|
|
401
|
+
4. 再次导入或导出。
|
|
402
|
+
|
|
403
|
+
如果没有同步基线,CLI 只能看到“两边当前值不同”,无法判断哪一边发生过修改,容易覆盖另一边的工作。
|
|
404
|
+
|
|
405
|
+
### 8.2 推荐 metadata 内容
|
|
406
|
+
|
|
407
|
+
CLI 在每个 project 的 Excel 文件内增加隐藏 sheet,例如 `__bubbles_i18n__`。它和可见翻译 sheet 位于同一个 `.xlsx` 中,不生成容易与 Excel 文件失去对应关系的旁路 metadata 文件。
|
|
408
|
+
|
|
409
|
+
metadata 记录:
|
|
410
|
+
|
|
411
|
+
- schema 版本。
|
|
412
|
+
- CLI 版本。
|
|
413
|
+
- project ID、文件 ID、revision 和最后更新时间。
|
|
414
|
+
- 可见翻译 sheet 的实际名称。
|
|
415
|
+
- locale 与表头映射指纹。
|
|
416
|
+
- 配置指纹;只包含相对配置目录的 catalog 路径、locale 集合、表头映射和 sheet 名,不包含机器绝对路径或备份设置。
|
|
417
|
+
- 每个 `key × locale` 在上次同步时是 missing、empty 还是 value。
|
|
418
|
+
- 上次同步值的 hash,不记录完整翻译正文。
|
|
419
|
+
|
|
420
|
+
metadata 使用 `key + locale` 定位数据,不依赖 Excel 行号,因此用户调整行顺序不会破坏基线。
|
|
421
|
+
|
|
422
|
+
### 8.3 metadata 更新时机
|
|
423
|
+
|
|
424
|
+
- 第一次 export 成功写入并重新读取 Excel 后创建 metadata。
|
|
425
|
+
- export 成功时,只更新已经安全同步到 Excel 的单元格基线。
|
|
426
|
+
- import 成功写入 JSON 后,更新同一个 Excel 文件内的隐藏 metadata;因此 import 会修改 Excel 的内部 metadata,即使可见翻译 sheet 没有变化。
|
|
427
|
+
- 只有 JSON 与 Excel 最终相同的单元格才能更新基线。
|
|
428
|
+
- 只处理部分 `--locale` 时,只更新本次处理的 locale。
|
|
429
|
+
- `--dry-run`、校验失败、写入失败、回滚或 `--conflict error` 时完全不更新。
|
|
430
|
+
- Excel 单边修改但尚未 import、JSON 单边修改但尚未 export 的单元格继续保留旧基线。
|
|
431
|
+
|
|
432
|
+
metadata 保存的是“最后一次双方确认一致的状态”,不是每次命令的历史日志。每次操作的历史由报告和备份承担。
|
|
433
|
+
|
|
434
|
+
### 8.4 三方比较
|
|
435
|
+
|
|
436
|
+
| 与基线比较 | 处理 |
|
|
437
|
+
| --------------------- | --------------------------------------- |
|
|
438
|
+
| JSON 未变、Excel 已变 | 只有 Excel 修改;import 可安全写入 JSON |
|
|
439
|
+
| JSON 已变、Excel 未变 | 只有 JSON 修改;export 可安全写入 Excel |
|
|
440
|
+
| 双方都修改成相同值 | 无冲突,接受最终值并更新 metadata |
|
|
441
|
+
| 双方都修改且值不同 | 真正冲突;默认所有选中项目都不写 |
|
|
442
|
+
|
|
443
|
+
“key 不存在”和“值为空字符串”都必须作为独立状态参与比较。双方修改成不同值时,只有方向匹配的 `use-json` 或 `use-excel` 才会解决冲突;两边一致后才能更新该单元格 metadata。
|
|
444
|
+
|
|
445
|
+
### 8.5 没有 metadata 的 Excel 文件
|
|
446
|
+
|
|
447
|
+
推荐默认拒绝导入已有数据的未跟踪 Excel 文件,并提示先执行 export。
|
|
448
|
+
|
|
449
|
+
如果用户明确传入:
|
|
450
|
+
|
|
451
|
+
```text
|
|
452
|
+
--allow-untracked
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
则允许按操作方向处理:
|
|
456
|
+
|
|
457
|
+
- export:JSON 视为来源。
|
|
458
|
+
- import:Excel 视为来源。
|
|
459
|
+
- 报告必须标记 `untracked: true`,说明无法检测历史双边冲突。
|
|
460
|
+
- 首次安全接管成功后,在该项目的 Excel 文件中创建 metadata。
|
|
461
|
+
|
|
462
|
+
### 8.6 两种实施范围
|
|
463
|
+
|
|
464
|
+
#### 方案 A:简单导入/导出
|
|
465
|
+
|
|
466
|
+
- 不保存同步基线。
|
|
467
|
+
- 操作方向决定来源。
|
|
468
|
+
- 实现较快。
|
|
469
|
+
- 无法判断 JSON、Excel 是否同时修改。
|
|
470
|
+
- 适合明确规定“同一时间只有一边允许编辑”的团队。
|
|
471
|
+
|
|
472
|
+
#### 方案 B:安全双向同步,推荐
|
|
473
|
+
|
|
474
|
+
- 隐藏 metadata 保存 hash 基线。
|
|
475
|
+
- 自动识别单边修改和双边冲突。
|
|
476
|
+
- 支持 missing 与 empty 的精确状态。
|
|
477
|
+
- 实现和测试工作量更大,但不容易静默覆盖翻译。
|
|
478
|
+
|
|
479
|
+
## 9. 原子写入、备份和并发修改
|
|
480
|
+
|
|
481
|
+
### 9.1 写入前
|
|
482
|
+
|
|
483
|
+
1. 读取并验证全部选中 project 的 JSON catalogs、Excel 文件、可见翻译 sheet 和表头。
|
|
484
|
+
2. 在内存生成完整变更计划。
|
|
485
|
+
3. 记录输入文件 hash。
|
|
486
|
+
4. 所有选中 project 都通过校验后才能开始写入;任何一个项目失败时不写任何文件。
|
|
487
|
+
|
|
488
|
+
### 9.2 写入时
|
|
489
|
+
|
|
490
|
+
1. 所有目标先写入同目录临时文件。
|
|
491
|
+
2. 重新读取临时 JSON/XLSX,确认可以解析。
|
|
492
|
+
3. 写入前再次检查原文件 hash,防止执行期间被其他程序修改。
|
|
493
|
+
4. 创建备份。
|
|
494
|
+
5. 使用原子替换提交。
|
|
495
|
+
6. 失败时从备份回滚。
|
|
496
|
+
|
|
497
|
+
文件系统无法提供多个文件的真正事务,因此需要事务清单和备份完成可回滚的“尽力事务”。失败报告必须区分已经提交、成功回滚和回滚失败的项目。
|
|
498
|
+
|
|
499
|
+
### 9.3 默认建议
|
|
500
|
+
|
|
501
|
+
- 有实际变化才创建备份。
|
|
502
|
+
- `--dry-run` 不创建临时文件和备份。
|
|
503
|
+
- 默认开启备份,`--no-backup` 才关闭。
|
|
504
|
+
- 备份按 `runId/project` 隔离,避免一个活跃项目挤掉其他项目的历史。
|
|
505
|
+
- export 覆盖已有 Excel 时备份该 `.xlsx`;import 修改 JSON 并刷新 metadata 时同时备份 JSON 和 `.xlsx`。
|
|
506
|
+
- Excel 文件被 Microsoft Excel 占用时立即停止,不允许只更新一部分 JSON。
|
|
507
|
+
- 备份目录加入 `.gitignore`。
|
|
508
|
+
|
|
509
|
+
## 10. 报告规划
|
|
510
|
+
|
|
511
|
+
Excel 报告使用独立文件:
|
|
512
|
+
|
|
513
|
+
```text
|
|
514
|
+
.bubbles-i18n/excel-report.json
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
示例:
|
|
518
|
+
|
|
519
|
+
```json
|
|
520
|
+
{
|
|
521
|
+
"version": 1,
|
|
522
|
+
"operation": "excel-import",
|
|
523
|
+
"dryRun": true,
|
|
524
|
+
"prune": false,
|
|
525
|
+
"projects": [
|
|
526
|
+
{
|
|
527
|
+
"project": "webVue",
|
|
528
|
+
"file": "translations/web-vue.xlsx",
|
|
529
|
+
"sheet": "translations",
|
|
530
|
+
"untracked": false,
|
|
531
|
+
"transactionStatus": "dry-run",
|
|
532
|
+
"locales": {
|
|
533
|
+
"en_US": {
|
|
534
|
+
"added": ["注册"],
|
|
535
|
+
"updated": ["登录"],
|
|
536
|
+
"targetOnly": ["已经废弃"],
|
|
537
|
+
"deleted": [],
|
|
538
|
+
"emptySkipped": ["忘记密码"],
|
|
539
|
+
"unchangedCount": 20
|
|
540
|
+
}
|
|
541
|
+
},
|
|
542
|
+
"conflicts": [
|
|
543
|
+
{
|
|
544
|
+
"locale": "en_US",
|
|
545
|
+
"key": "登录",
|
|
546
|
+
"cell": "C12",
|
|
547
|
+
"reason": "both-changed"
|
|
548
|
+
}
|
|
549
|
+
],
|
|
550
|
+
"warnings": []
|
|
551
|
+
}
|
|
552
|
+
]
|
|
553
|
+
}
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
默认报告不复制完整翻译正文,只记录 key、locale、cell 和变更类型,避免报告体积过大或泄露更多业务文本。
|
|
557
|
+
|
|
558
|
+
## 11. 实现模块隔离
|
|
559
|
+
|
|
560
|
+
建议新增独立目录:
|
|
561
|
+
|
|
562
|
+
```text
|
|
563
|
+
src/excel/
|
|
564
|
+
config.ts
|
|
565
|
+
workbook.ts
|
|
566
|
+
metadata.ts
|
|
567
|
+
export.ts
|
|
568
|
+
import.ts
|
|
569
|
+
transaction.ts
|
|
570
|
+
report.ts
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
现有模块保持职责不变:
|
|
574
|
+
|
|
575
|
+
```text
|
|
576
|
+
scanner.ts / files.ts / sync.ts 代码扫描 → JSON
|
|
577
|
+
excel/* JSON ↔ Excel
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
Excel 依赖建议使用 `exceljs`,并通过动态 `import()` 只在执行 `excel` 子命令时加载,避免普通 `sync/check` 启动时承担 Excel 库成本。
|
|
581
|
+
|
|
582
|
+
## 12. 第一版必测范围
|
|
583
|
+
|
|
584
|
+
- JSON → Excel → JSON 无变化往返。
|
|
585
|
+
- 中文、emoji、单双引号、反引号、换行和占位符。
|
|
586
|
+
- `=`、`+`、`-`、`@` 开头的普通文本。
|
|
587
|
+
- 新增、更新、单语言缺失、整行缺失。
|
|
588
|
+
- 三种 `--blank` 模式。
|
|
589
|
+
- `--prune` 与 `--allow-empty` 组合保护。
|
|
590
|
+
- 重复 key、空 key、重复表头、缺少 locale 列、未知列。
|
|
591
|
+
- 数字、布尔、日期、公式、hyperlink、rich text。
|
|
592
|
+
- 非法 JSON、损坏 XLSX、错误 sheet、文件不存在。
|
|
593
|
+
- `--dry-run` 完全不写文件。
|
|
594
|
+
- Excel 被占用时不产生部分 JSON 更新。
|
|
595
|
+
- 备份、回滚和保留数量。
|
|
596
|
+
- 多 project、多个独立 Excel 文件互不污染。
|
|
597
|
+
- 两个 project 指向同一个 Excel 路径时拒绝启动。
|
|
598
|
+
- `--project` 只读写对应项目的 Excel 和 catalogs。
|
|
599
|
+
- 不传 `--project` 时分别处理所有配置了 Excel 的项目。
|
|
600
|
+
- 隐藏 metadata sheet 不计入用户可见翻译 sheet。
|
|
601
|
+
- Windows 路径、中文目录和特殊 key,例如 `__proto__`。
|
|
602
|
+
- 如果开启 tracking:JSON 单边修改、Excel 单边修改、双方相同修改、双方冲突修改。
|
|
603
|
+
|
|
604
|
+
## 13. 实施前需要确认
|
|
605
|
+
|
|
606
|
+
已经确认:
|
|
607
|
+
|
|
608
|
+
- 一个 project 对应一个独立 `.xlsx` 文件。
|
|
609
|
+
- 每个文件只有一个 CLI 管理的可见翻译 sheet;隐藏 metadata sheet 是唯一的 CLI 内部附加 sheet。
|
|
610
|
+
- CLI 继续使用可重复的 `--project` 选择项目,不增加 `--workbook` 和 `--sheet`。
|
|
611
|
+
|
|
612
|
+
其余实施前需要确认:
|
|
613
|
+
|
|
614
|
+
1. 是否第一版就实现隐藏 metadata 和三方冲突检测?推荐:是,即方案 B。
|
|
615
|
+
2. 空单元格默认是否采用 `preserve`?推荐:是。
|
|
616
|
+
3. 语言表头是否允许配置为“中文 / English”,还是必须使用 `zh_CN / en_US`?推荐:允许映射,但 metadata 固定记录真实 locale。
|
|
617
|
+
4. 是否默认创建备份,只通过 `--no-backup` 关闭?推荐:是。
|
|
618
|
+
5. 删除参数是否使用独立的 `--prune`,不复用现有代码扫描的 `--clean`?推荐:是,以保持参数隔离。
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bubblesjs/i18n-cli",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"bin": {
|
|
6
|
+
"bubbles-i18n": "./src/cli.ts"
|
|
7
|
+
},
|
|
8
|
+
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./src/index.ts",
|
|
12
|
+
"import": "./src/index.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "vp pack",
|
|
17
|
+
"test": "vp test run"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"fast-glob": "catalog:"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "catalog:",
|
|
24
|
+
"typescript": "catalog:",
|
|
25
|
+
"vite": "catalog:",
|
|
26
|
+
"vite-plus": "catalog:"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=22.18.0"
|
|
30
|
+
}
|
|
31
|
+
}
|