create-bubbles 0.1.25 → 0.1.26
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.js +3 -9
- package/package.json +1 -1
- package/template-nextjs-vinext-eslint/Dockerfile +4 -4
- package/template-nextjs-vinext-eslint/README.md +6 -2
- package/template-nextjs-vinext-eslint/docker-compose.yaml +4 -4
- package/template-nextjs-vinext-eslint/eslint.config.js +2 -0
- package/template-nextjs-vinext-eslint/package.json +28 -26
- package/template-nextjs-vinext-eslint/pnpm-workspace.yaml +13 -1
- package/template-nextjs-vinext-eslint/src/utils/request/core/index.ts +63 -45
- package/template-nextjs-vinext-eslint/src/utils/request/core/utils.ts +12 -6
- package/template-nextjs-vinext-eslint/vite.config.ts +1 -1
- package/template-react-rsbuild-biome/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
- package/template-react-rsbuild-biome/AGENTS.md +11 -0
- package/template-react-rsbuild-biome/index.html +2 -2
- package/template-react-rsbuild-biome/package.json +25 -24
- package/template-react-rsbuild-biome/pnpm-workspace.yaml +5 -0
- package/template-react-rsbuild-biome/rsbuild.config.ts +1 -1
- package/template-react-rsbuild-biome/src/assets/icon/logo.svg +1 -1
- package/template-react-rsbuild-biome/src/assets/svg/draft.svg +4 -0
- package/template-react-rsbuild-biome/src/components/Icon/svg-icon/README.md +37 -0
- package/template-react-rsbuild-biome/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
- package/template-react-rsbuild-biome/src/env.d.ts +7 -0
- package/template-react-rsbuild-biome/src/utils/request/index.ts +3 -4
- package/template-react-rsbuild-biome/tsconfig.json +1 -2
- package/template-taro-react-oxc/.oxlintrc.json +0 -1
- package/template-taro-react-oxc/package.json +53 -52
- package/template-taro-react-oxc/pnpm-workspace.yaml +46 -0
- package/template-taro-vue-eslint/package.json +56 -56
- package/template-vp-monorepo-react-hono/apps/web/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
- package/template-vp-monorepo-react-hono/apps/web/AGENTS.md +11 -0
- package/template-vp-monorepo-react-hono/apps/web/package.json +1 -0
- package/template-vp-monorepo-react-hono/apps/web/src/assets/svg/draft.svg +4 -0
- package/template-vp-monorepo-react-hono/apps/web/src/components/Icon/svg-icon/README.md +37 -0
- package/template-vp-monorepo-react-hono/apps/web/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
- package/template-vp-monorepo-react-hono/apps/web/tsconfig.json +1 -1
- package/template-vp-monorepo-react-hono/apps/web/vite.config.ts +2 -0
- package/template-vp-monorepo-react-hono/pnpm-workspace.yaml +1 -0
- package/template-vp-monorepo-react-nestjs/.agents/rules//344/273/243/347/240/201/350/256/276/350/256/241.md +4 -0
- package/template-vp-monorepo-react-nestjs/.agents/rules//345/205/261/344/272/253/344/273/243/347/240/201.md +4 -0
- package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//351/234/200/346/261/202/346/226/207/346/241/243.md +177 -0
- package/template-vp-monorepo-react-nestjs/.spaces/server/04.upload.md +4504 -0
- package/template-vp-monorepo-react-nestjs/.spaces/server/05./344/270/212/344/274/240/346/224/271/351/200/240/346/226/271/346/241/210/README.md +858 -0
- package/template-vp-monorepo-react-nestjs/.spaces/server/06./345/205/254/345/205/261/351/230/237/345/210/227/346/216/245/345/205/245/346/226/271/346/241/210/README.md +1890 -0
- package/template-vp-monorepo-react-nestjs/.spaces/server/06./345/205/254/345/205/261/351/230/237/345/210/227/346/216/245/345/205/245/346/226/271/346/241/210//344/270/212/344/274/240/346/270/205/347/220/206.md +1465 -0
- package/template-vp-monorepo-react-nestjs/AGENTS.md +8 -12
- package/template-vp-monorepo-react-nestjs/apps/server/.agents/rules/error-handling.md +84 -0
- package/template-vp-monorepo-react-nestjs/apps/server/.env.development +60 -0
- package/template-vp-monorepo-react-nestjs/apps/server/.env.production +16 -0
- package/template-vp-monorepo-react-nestjs/apps/server/AGENTS.md +9 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0000_military_colonel_america.sql +11 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0001_loud_siren.sql +27 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0000_snapshot.json +97 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0001_snapshot.json +354 -0
- package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/_journal.json +20 -0
- package/template-vp-monorepo-react-nestjs/apps/server/package.json +4 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/app.module.ts +14 -2
- package/template-vp-monorepo-react-nestjs/apps/server/src/common/adapters/fastify.adapter.ts +6 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/index.ts +2 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/queue.config.ts +105 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/config/storage.config.ts +33 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/database/schema.ts +57 -1
- package/template-vp-monorepo-react-nestjs/apps/server/src/main.ts +1 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.service.ts +1 -3
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/dto/auth-repsponse.dto.ts +2 -2
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/queue-worker.bootstrap.ts +24 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.constants.ts +24 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.contracts.ts +35 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.module.ts +56 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.processor.ts +62 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.service.ts +58 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/error-catelog.spec.ts +34 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/dto/initiate-mutipart-upload.dto.ts +26 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/dto/upload-params.dto.ts +15 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/exact-size.transform.ts +66 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/minio-storage.adapter.ts +239 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/storage.port.ts +61 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.constants.ts +23 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.controller.ts +109 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.errors.ts +80 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.module.ts +20 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.reponsitory.ts +166 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.service.ts +696 -0
- package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/utils/object-key.ts +10 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/task-queue.integration.spec.ts +120 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/task-queue.processor.spec.ts +63 -0
- package/template-vp-monorepo-react-nestjs/apps/server/test/task-queue.service.spec.ts +106 -0
- package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
- package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//345/274/271/347/252/227/347/273/204/344/273/266.md +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//346/226/207/344/273/266/346/213/206/345/210/206.md +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//347/273/204/344/273/266/345/221/275/345/220/215.md +3 -0
- package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//350/241/250/346/240/274/351/241/265/351/235/242.md +11 -0
- package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//351/241/265/351/235/242/346/216/245/345/217/243.md +3 -0
- package/template-vp-monorepo-react-nestjs/apps/web/.env.dev +1 -1
- package/template-vp-monorepo-react-nestjs/apps/web/AGENTS.md +16 -0
- package/template-vp-monorepo-react-nestjs/apps/web/README.MD +153 -0
- package/template-vp-monorepo-react-nestjs/apps/web/index.html +3 -2
- package/template-vp-monorepo-react-nestjs/apps/web/package.json +6 -1
- package/template-vp-monorepo-react-nestjs/apps/web/public/favicon.svg +9 -1
- package/template-vp-monorepo-react-nestjs/apps/web/src/App.module.css +5 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/App.tsx +16 -9
- package/template-vp-monorepo-react-nestjs/apps/web/src/api/auth.ts +9 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/draft.svg +4 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/DraftProTable.module.css +78 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/DraftProTable.tsx +99 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/README.md +34 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/FullHeightProTable/FullHeightProTable.module.css +54 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/FullHeightProTable/FullHeightProTable.tsx +41 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/svg-icon/README.md +37 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Loading/PageLoading.module.css +7 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/components/Loading/PageLoading.tsx +2 -1
- package/template-vp-monorepo-react-nestjs/apps/web/src/config/theme.ts +20 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/BasicLayout.module.css +17 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/BasicLayout.tsx +106 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/i18n/index.module.css +23 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/i18n/index.tsx +53 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/components/ProjectFormDialog.tsx +132 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/columns.tsx +121 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/index.ts +77 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/components/DraftProjectFormDialog.tsx +140 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/columns.tsx +127 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/index.ts +39 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/projects.ts +48 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/index.module.css +49 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/index.tsx +163 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/index.module.css +53 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/index.tsx +135 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/home/index.module.css +23 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/home/index.tsx +26 -43
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/api.ts +11 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/index.tsx +183 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/login.css +164 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/router/index.tsx +36 -12
- package/template-vp-monorepo-react-nestjs/apps/web/src/styles/index.css +11 -4
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/index.ts +55 -47
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/index.ts +10 -5
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/cookie.ts +50 -0
- package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/session.ts +33 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/draft-projects.spec.ts +89 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/request.spec.ts +145 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/storage.spec.ts +108 -0
- package/template-vp-monorepo-react-nestjs/apps/web/test/tsconfig.json +7 -0
- package/template-vp-monorepo-react-nestjs/apps/web/tsconfig.json +1 -1
- package/template-vp-monorepo-react-nestjs/apps/web/vite.config.ts +7 -0
- package/template-vp-monorepo-react-nestjs/apps/web-vue/tsconfig.tsbuildinfo +1 -0
- package/template-vp-monorepo-react-nestjs/docker-compose.yml +19 -0
- package/template-vp-monorepo-react-nestjs/mise.toml +1 -1
- package/template-vp-monorepo-react-nestjs/package.json +1 -6
- package/template-vp-monorepo-react-nestjs/pnpm-workspace.yaml +9 -1
- package/template-vp-react/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
- package/template-vp-react/AGENTS.md +11 -0
- package/template-vp-react/commitlint.config.js +0 -0
- package/template-vp-react/package.json +21 -26
- package/template-vp-react/pnpm-workspace.yaml +6 -0
- package/template-vp-react/src/assets/svg/draft.svg +4 -0
- package/template-vp-react/src/components/Icon/svg-icon/README.md +37 -0
- package/template-vp-react/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
- package/template-vp-react/src/utils/request/index.ts +18 -5
- package/template-vp-react/tsconfig.json +2 -3
- package/template-vp-react/vite.config.ts +2 -0
- package/template-vp-react-shadcn/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
- package/template-vp-react-shadcn/.vscode/settings.json +2 -2
- package/template-vp-react-shadcn/{agents.md → AGENTS.md} +12 -2
- package/template-vp-react-shadcn/README.md +41 -0
- package/template-vp-react-shadcn/commitlint.config.js +1 -1
- package/template-vp-react-shadcn/components.json +1 -1
- package/template-vp-react-shadcn/package.json +25 -32
- package/template-vp-react-shadcn/pnpm-workspace.yaml +10 -0
- package/template-vp-react-shadcn/src/App.tsx +10 -10
- package/template-vp-react-shadcn/src/assets/svg/draft.svg +4 -0
- package/template-vp-react-shadcn/src/components/Icon/svg-icon/README.md +37 -0
- package/template-vp-react-shadcn/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
- package/template-vp-react-shadcn/src/components/Loading/PageLoading.tsx +4 -4
- package/template-vp-react-shadcn/src/components/Player/VideoJS/index.tsx +94 -78
- package/template-vp-react-shadcn/src/components/Player/index.ts +1 -1
- package/template-vp-react-shadcn/src/components/ui/button.tsx +25 -32
- package/template-vp-react-shadcn/src/components/ui/spinner.tsx +8 -7
- package/template-vp-react-shadcn/src/components/ui/toast.tsx +229 -0
- package/template-vp-react-shadcn/src/lib/utils.ts +3 -3
- package/template-vp-react-shadcn/src/main.tsx +5 -4
- package/template-vp-react-shadcn/src/pages/home/index.tsx +43 -35
- package/template-vp-react-shadcn/src/router/index.tsx +15 -15
- package/template-vp-react-shadcn/src/styles/index.css +4 -4
- package/template-vp-react-shadcn/src/styles/shadcn.css +2 -2
- package/template-vp-react-shadcn/src/utils/env/index.tsx +2 -2
- package/template-vp-react-shadcn/src/utils/request/alova-core/index.ts +102 -30
- package/template-vp-react-shadcn/src/utils/request/alova-core/utils.ts +5 -2
- package/template-vp-react-shadcn/src/utils/request/index.ts +32 -19
- package/template-vp-react-shadcn/src/utils/request/readme.md +41 -38
- package/template-vp-react-shadcn/tsconfig.json +2 -3
- package/template-vp-react-shadcn/vite.config.ts +29 -15
- package/template-vp-vue-eslint-vapor/package.json +26 -33
- package/template-vp-vue-eslint-vapor/pnpm-workspace.yaml +29 -1
- package/template-vue-vp-eslint/README.md +3 -10
- package/template-vue-vp-eslint/package.json +27 -34
- package/template-vue-vp-eslint/pnpm-workspace.yaml +27 -2
- package/template-vue-vp-eslint/src/layout/default/index.vue +4 -3
- package/template-vp-monorepo-react-nestjs/.agents/auth.config.ts +0 -0
- package/template-vp-monorepo-react-nestjs/.spaces/server/todo.md +0 -991
- package/template-vp-monorepo-react-nestjs/apps/server/README.md +0 -3
- package/template-vp-react-shadcn/.oxfmtrc.jsonc +0 -8
- package/template-vp-react-shadcn/.oxlintrc.jsonc +0 -3
- package/template-vp-react-shadcn/src/components/ui/sonner.tsx +0 -43
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import{fileURLToPath as n}from"node:url";import*as r from"@clack/prompts";import i from"cross-spawn";import a from"gradient-string";import o from"mri";const s={vue:a([`#42B883`,`#42B883`]),react:a([`#087EA4`,`#087EA4`]),taro:a([`#0000C2`,`#fff`]),nextjs:a([`#000`,`#fff`]),others:a([`#8B5CF6`,`#A855F7`])},c=o(process.argv.slice(2),{alias:{h:`help`,t:`template`},boolean:[`help`,`overwrite`],string:[`template`]}),l=process.cwd(),u=`\
|
|
1
|
+
import e from"node:fs";import t from"node:path";import{fileURLToPath as n}from"node:url";import*as r from"@clack/prompts";import i from"cross-spawn";import a from"gradient-string";import o from"mri";const s={vue:a([`#42B883`,`#42B883`]),react:a([`#087EA4`,`#087EA4`]),taro:a([`#0000C2`,`#fff`]),nextjs:a([`#000`,`#fff`]),others:a([`#8B5CF6`,`#A855F7`])},c=o(process.argv.slice(2),{alias:{h:`help`,t:`template`},boolean:[`help`,`overwrite`],string:[`template`]}),l=process.cwd(),u=e=>e.trim().replace(/\/+$/g,``),d=e=>{if(!e)return;let t=e.split(` `)[0].split(`/`);return{name:t[0],version:t[1]}},f=t=>{let n=e.readdirSync(t);return n.length===0||n.length===1&&n[0]===`.git`},p=async n=>{await Promise.all(e.readdirSync(n).filter(e=>e!==`.git`).map(r=>e.promises.rm(t.resolve(n,r),{recursive:!0,force:!0})))},m=e=>/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e),h=e=>e.trim().toLowerCase().replace(/\s+/g,`-`).replace(/^[._]/,``).replace(/[^a-z\d\-~]+g/,`-`),g=[{name:`vue`,display:`Vue`,color:s.vue,variants:[{name:`vue-vp-eslint`,display:`vp + eslint`,color:s.vue},{name:`vp-vue-eslint-vapor`,display:`vp + eslint + vapor`,color:s.vue}]},{name:`react`,display:`React`,color:s.react,variants:[{name:`react-rsbuild-biome`,display:`rsbuild-biome`,color:s.react},{name:`vp-react`,display:`vp-react`,color:s.react},{name:`vp-react-shadcn`,display:`vp-react-shadcn`,color:s.react},{name:`vp-monorepo-react-nestjs`,display:`vp-monorepo-react-nestjs`,color:s.react},{name:`vp-monorepo-react-hono`,display:`vp-monorepo-react-hono`,color:s.react}]},{name:`taro`,display:`Taro`,color:s.taro,variants:[{name:`taro-vue-eslint`,display:`taro-vue + eslint`,color:s.taro},{name:`taro-react-oxc`,display:`taro-react + oxc`,color:s.taro}]},{name:`nextjs`,display:`NextJS`,color:s.nextjs,variants:[{name:`nextjs-vinext-eslint`,display:`nextjs + vinext + eslint`,color:s.nextjs}]},{name:`others`,display:`Others`,color:s.others,variants:[{name:`create-eletron-vite`,display:`Electron ↗`,color:s.others,customCommand:`pnpm create electron-vite@latest TARGET_DIR`}]}],_=g.map(e=>e.variants.map(e=>`${e.name}`)).reduce((e,t)=>e.concat(t),[]),v=`\
|
|
2
2
|
Usage: create-bubbles [OPTION]... [DIRECTORY]
|
|
3
3
|
|
|
4
4
|
Create a new Bubbles project in JavaScript or TypeScript.
|
|
@@ -8,14 +8,8 @@ Options:
|
|
|
8
8
|
-t, --template NAME use a specific template
|
|
9
9
|
|
|
10
10
|
Available templates:
|
|
11
|
-
${
|
|
12
|
-
|
|
13
|
-
${s.react(`react-rsbuild-biome react`)}
|
|
14
|
-
${s.react(`vp-react react`)}
|
|
15
|
-
${s.react(`vp-react-shadcn react`)}
|
|
16
|
-
${s.react(`vp-monorepo-react-nestjs react`)}
|
|
17
|
-
${s.taro(`taro-vue-eslint taro`)}
|
|
18
|
-
${s.nextjs(`nextjs-vinext-eslint nextjs`)}`,d=e=>e.trim().replace(/\/+$/g,``),f=e=>{if(!e)return;let t=e.split(` `)[0].split(`/`);return{name:t[0],version:t[1]}},p=t=>{let n=e.readdirSync(t);return n.length===0||n.length===1&&n[0]===`.git`},m=async n=>{await Promise.all(e.readdirSync(n).filter(e=>e!==`.git`).map(r=>e.promises.rm(t.resolve(n,r),{recursive:!0,force:!0})))},h=e=>/^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(e),g=e=>e.trim().toLowerCase().replace(/\s+/g,`-`).replace(/^[._]/,``).replace(/[^a-z\d\-~]+g/,`-`),_=[{name:`vue`,display:`Vue`,color:s.vue,variants:[{name:`vue-vp-eslint`,display:`vp + eslint`,color:s.vue},{name:`vp-vue-eslint-vapor`,display:`vp + eslint + vapor`,color:s.vue}]},{name:`react`,display:`React`,color:s.react,variants:[{name:`react-rsbuild-biome`,display:`rsbuild-biome`,color:s.react},{name:`vp-react`,display:`vp-react`,color:s.react},{name:`vp-react-shadcn`,display:`vp-react-shadcn`,color:s.react},{name:`vp-monorepo-react-nestjs`,display:`vp-monorepo-react-nestjs`,color:s.react}]},{name:`taro`,display:`Taro`,color:s.taro,variants:[{name:`taro-vue-eslint`,display:`taro-vue + eslint`,color:s.taro},{name:`taro-react-oxc`,display:`taro-react + oxc`,color:s.taro}]},{name:`nextjs`,display:`NextJS`,color:s.nextjs,variants:[{name:`nextjs-vinext-eslint`,display:`nextjs + vinext + eslint`,color:s.nextjs}]},{name:`others`,display:`Others`,color:s.others,variants:[{name:`create-eletron-vite`,display:`Electron ↗`,color:s.others,customCommand:`pnpm create electron-vite@latest TARGET_DIR`}]}],v=_.map(e=>e.variants.map(e=>`${e.name}`)).reduce((e,t)=>e.concat(t),[]),y=(e,t)=>{console.log(`💦customCommand`,e,t);let n=t?t.name:`npm`,r=n===`yarn`&&t?.version.startsWith(`1.`);return e.replace(/^npm create (?:-- )?/,()=>n===`bun`?`bun x create-`:n===`pnpm`?`pnpm create `:e.startsWith(`npm create -- `)?`${n} create -- `:`${n} create `).replace(`@latest`,()=>r?``:`@latest`).replace(/^npm exec/,()=>n===`pnpm`?`pnpm dlx`:n===`yarn`&&!r?`yarn dlx`:n===`bun`?`bun x`:`npm exec`)},b={_gitignore:`.gitignore`},x=(n,r)=>{e.mkdirSync(r,{recursive:!0});for(let i of e.readdirSync(n)){let e=t.resolve(n,i),a=t.resolve(r,i);S(e,a)}},S=(t,n)=>{e.statSync(t).isDirectory()?x(t,n):e.copyFileSync(t,n)},C=(t,n)=>{let r=e.readFileSync(t,`utf-8`);e.writeFileSync(t,n(r),`utf-8`)},w=(e,n)=>{C(t.resolve(e,`package.json`),e=>e.replace(/"@vitejs\/plugin-react": ".+?"/,`"@vitejs/plugin-react-swc": "^4.0.1"`)),C(t.resolve(e,`vite.config.${n?`ts`:`js`}`),e=>e.replace(`@vitejs/plugin-react`,`@vitejs/plugin-react-swc`))};(async()=>{console.log(c);let o=c._[0]?d(c._[0]):void 0,x=c.template,C=c.overwrite,T=`bubbles-project`;if(c.help){console.log(u);return}let E=f(process.env.npm_config_user_agent),D=()=>r.cancel(`Operation cancelled`),O=o;if(!O){let e=await r.text({message:`Project name`,defaultValue:T,placeholder:T,validate:e=>(e||[]).length===0||d(e||``).length>0?void 0:`Invalid project name`});if(r.isCancel(e))return D();O=d(e)}if(e.existsSync(O)&&!p(O)){let e=C?`yes`:await r.select({message:O===`.`?`Current directory`:`Target directory "${O}" is not empty. Please choose how to proceed:`,options:[{label:`${s.vue(`Cancel operation`)}`,value:`no`},{label:`Remove existing files and continue`,value:`yes`},{label:`Ignore files and continue`,value:`ignore`}]});if(r.isCancel(e))return D();switch(e){case`yes`:m(O);break;case`no`:D();return}}let k=t.basename(t.resolve(O));if(!h(k)){let e=await r.text({message:`Package name is invalid. please input again:`,defaultValue:g(k),placeholder:g(k),validate(e){if(!h(e))return`Invalid package.json name`}});if(r.isCancel(e))return D();k=e}let A=x,j=!1;if(x&&!v.includes(x)&&(A=void 0,j=!0),!A){let e=await r.select({message:j?`"${x}" isn't a valia template. please choose from below:`:`Select a framework`,options:_.map(e=>{let t=e.color;return{label:t(e.display),value:e}})});if(r.isCancel(e))return D();console.log(`💦pkgInfo`,E);let t=await r.select({message:`Select a variant:`,options:e.variants.map(e=>{let t=e.color,n=e.customCommand?y(e.customCommand,E).replace(/ TARGET_DIR$/,``):void 0;return{label:t(e.display||e.name),value:e.name,hint:n}})});if(r.isCancel(t))return D();A=t}let M=t.join(l,O);e.mkdirSync(M,{recursive:!0});let N=!1;A.includes(`-swc`)&&(N=!0,A=A.replace(`-swc`,``));let P=E?E.name:`npm`,{customCommand:F}=_.flatMap(e=>e.variants).find(e=>e.name===A)??{};if(F){let[e,...t]=y(F,E).split(` `),n=t.map(e=>e.replace(`TARGET_DIR`,()=>O));console.log(`💦replacedArgs`,n);let{status:r}=i.sync(e,n,{stdio:`inherit`});process.exit(r??0)}r.log.step(`scaffolding project in ${M}...`);let I=t.resolve(n(import.meta.url),`../..`,`template-${A}`),L=(n,r)=>{let i=t.join(M,b[n]??n);r?e.writeFileSync(i,r):S(t.join(I,n),i)},R=e.readdirSync(I);for(let e of R)e!==`package.json`&&L(e);let z=JSON.parse(e.readFileSync(t.join(I,`package.json`),`utf-8`));z.name=k,L(`package.json`,`${JSON.stringify(z,null,2)}\n`),N&&w(M,A.endsWith(`-ts`));let B=``,V=t.relative(l,M);switch(console.log(`💦cwd`,l),console.log(`💦root`,M),console.log(`💦cdProjectName`,V),B+=`Done. Now run:
|
|
11
|
+
${g.flatMap(e=>e.variants.map(t=>t.color(`${t.name.padEnd(28)}${e.name}`))).join(`
|
|
12
|
+
`)}`,y=(e,t)=>{console.log(`💦customCommand`,e,t);let n=t?t.name:`npm`,r=n===`yarn`&&t?.version.startsWith(`1.`);return e.replace(/^npm create (?:-- )?/,()=>n===`bun`?`bun x create-`:n===`pnpm`?`pnpm create `:e.startsWith(`npm create -- `)?`${n} create -- `:`${n} create `).replace(`@latest`,()=>r?``:`@latest`).replace(/^npm exec/,()=>n===`pnpm`?`pnpm dlx`:n===`yarn`&&!r?`yarn dlx`:n===`bun`?`bun x`:`npm exec`)},b={_gitignore:`.gitignore`},x=(n,r)=>{e.mkdirSync(r,{recursive:!0});for(let i of e.readdirSync(n)){let e=t.resolve(n,i),a=t.resolve(r,i);S(e,a)}},S=(t,n)=>{e.statSync(t).isDirectory()?x(t,n):e.copyFileSync(t,n)},C=(t,n)=>{let r=e.readFileSync(t,`utf-8`);e.writeFileSync(t,n(r),`utf-8`)},w=(e,n)=>{C(t.resolve(e,`package.json`),e=>e.replace(/"@vitejs\/plugin-react": ".+?"/,`"@vitejs/plugin-react-swc": "^4.0.1"`)),C(t.resolve(e,`vite.config.${n?`ts`:`js`}`),e=>e.replace(`@vitejs/plugin-react`,`@vitejs/plugin-react-swc`))};(async()=>{console.log(c);let o=c._[0]?u(c._[0]):void 0,x=c.template,C=c.overwrite,T=`bubbles-project`;if(c.help){console.log(v);return}let E=d(process.env.npm_config_user_agent),D=()=>r.cancel(`Operation cancelled`),O=o;if(!O){let e=await r.text({message:`Project name`,defaultValue:T,placeholder:T,validate:e=>(e||[]).length===0||u(e||``).length>0?void 0:`Invalid project name`});if(r.isCancel(e))return D();O=u(e)}if(e.existsSync(O)&&!f(O)){let e=C?`yes`:await r.select({message:O===`.`?`Current directory`:`Target directory "${O}" is not empty. Please choose how to proceed:`,options:[{label:`${s.vue(`Cancel operation`)}`,value:`no`},{label:`Remove existing files and continue`,value:`yes`},{label:`Ignore files and continue`,value:`ignore`}]});if(r.isCancel(e))return D();switch(e){case`yes`:p(O);break;case`no`:D();return}}let k=t.basename(t.resolve(O));if(!m(k)){let e=await r.text({message:`Package name is invalid. please input again:`,defaultValue:h(k),placeholder:h(k),validate(e){if(!m(e))return`Invalid package.json name`}});if(r.isCancel(e))return D();k=e}let A=x,j=!1;if(x&&!_.includes(x)&&(A=void 0,j=!0),!A){let e=await r.select({message:j?`"${x}" isn't a valia template. please choose from below:`:`Select a framework`,options:g.map(e=>{let t=e.color;return{label:t(e.display),value:e}})});if(r.isCancel(e))return D();console.log(`💦pkgInfo`,E);let t=await r.select({message:`Select a variant:`,options:e.variants.map(e=>{let t=e.color,n=e.customCommand?y(e.customCommand,E).replace(/ TARGET_DIR$/,``):void 0;return{label:t(e.display||e.name),value:e.name,hint:n}})});if(r.isCancel(t))return D();A=t}let M=t.join(l,O);e.mkdirSync(M,{recursive:!0});let N=!1;A.includes(`-swc`)&&(N=!0,A=A.replace(`-swc`,``));let P=E?E.name:`npm`,{customCommand:F}=g.flatMap(e=>e.variants).find(e=>e.name===A)??{};if(F){let[e,...t]=y(F,E).split(` `),n=t.map(e=>e.replace(`TARGET_DIR`,()=>O));console.log(`💦replacedArgs`,n);let{status:r}=i.sync(e,n,{stdio:`inherit`});process.exit(r??0)}r.log.step(`scaffolding project in ${M}...`);let I=t.resolve(n(import.meta.url),`../..`,`template-${A}`),L=(n,r)=>{let i=t.join(M,b[n]??n);r?e.writeFileSync(i,r):S(t.join(I,n),i)},R=e.readdirSync(I);for(let e of R)e!==`package.json`&&L(e);let z=JSON.parse(e.readFileSync(t.join(I,`package.json`),`utf-8`));z.name=k,L(`package.json`,`${JSON.stringify(z,null,2)}\n`),N&&w(M,A.endsWith(`-ts`));let B=``,V=t.relative(l,M);switch(console.log(`💦cwd`,l),console.log(`💦root`,M),console.log(`💦cdProjectName`,V),B+=`Done. Now run:
|
|
19
13
|
`,M!==l&&(B+=`\n cd ${V.includes(` `)?`"${V}"`:V} `),P){case`yarn`:B+=`
|
|
20
14
|
yarn`,B+=`
|
|
21
15
|
yarn dev`;break;default:B+=a([`pink`,`white`])(`\n ${P} install`),B+=a([`pink`,`white`])(`\n ${P} run dev`);break}r.outro(B)})().catch(e=>{console.error(`💦`,e)});export{};
|
package/package.json
CHANGED
|
@@ -7,14 +7,18 @@
|
|
|
7
7
|
| 类别 | 技术 |
|
|
8
8
|
| -------- | ----------------------------------- |
|
|
9
9
|
| 框架 | Next.js 16 App Router(via vinext) |
|
|
10
|
-
| 运行时 | Node.js
|
|
10
|
+
| 运行时 | Node.js |
|
|
11
11
|
| 包管理 | pnpm |
|
|
12
|
-
| 语言 | TypeScript
|
|
12
|
+
| 语言 | TypeScript 7(严格模式) |
|
|
13
13
|
| UI | Ant Design 6 |
|
|
14
14
|
| CSS | UnoCSS(presetWind4 + Attributify) |
|
|
15
15
|
| 动画 | GSAP 3 |
|
|
16
16
|
| 代码检查 | ESLint 10 |
|
|
17
17
|
|
|
18
|
+
`pnpm typecheck` 使用 TypeScript 7。ESLint 通过 `@typescript/typescript6` 兼容包使用 TypeScript 6 API。
|
|
19
|
+
|
|
20
|
+
vinext 当前的 npm `latest` 版本为 `1.0.0-beta.9`。显式声明 `ipaddr.js` 是为了让 pnpm 安装后的生产服务能够加载 vinext 图片处理所需的运行时依赖。
|
|
21
|
+
|
|
18
22
|
---
|
|
19
23
|
|
|
20
24
|
## 代码规范
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
version:
|
|
1
|
+
version: '0.1'
|
|
2
2
|
|
|
3
3
|
services:
|
|
4
4
|
web:
|
|
5
5
|
container_name: bee-portal
|
|
6
6
|
image: bee-portal
|
|
7
7
|
ports:
|
|
8
|
-
-
|
|
8
|
+
- '9980:9980'
|
|
9
9
|
nginx:
|
|
10
10
|
image: nginx:latest
|
|
11
11
|
container_name: nginx
|
|
@@ -14,8 +14,8 @@ services:
|
|
|
14
14
|
- ./nginx.conf:/etc/nginx/nginx.conf
|
|
15
15
|
- ./logs:/var/log/nginx
|
|
16
16
|
ports:
|
|
17
|
-
-
|
|
18
|
-
-
|
|
17
|
+
- '8080:80'
|
|
18
|
+
- '8443:443'
|
|
19
19
|
restart: always
|
|
20
20
|
# 依赖于哪个服务,这边是依赖于web服务
|
|
21
21
|
depends_on:
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "vinext dev --port 9980",
|
|
8
8
|
"build": "vinext build",
|
|
9
|
+
"typecheck": "tsc --noEmit",
|
|
9
10
|
"start": "vinext start",
|
|
10
11
|
"prepare": "lefthook install",
|
|
11
12
|
"lint": "eslint",
|
|
@@ -13,38 +14,39 @@
|
|
|
13
14
|
},
|
|
14
15
|
"dependencies": {
|
|
15
16
|
"@ant-design/cssinjs": "^2.1.2",
|
|
16
|
-
"alova": "^3.5.
|
|
17
|
-
"antd": "^6.
|
|
17
|
+
"alova": "^3.5.5",
|
|
18
|
+
"antd": "^6.6.3",
|
|
18
19
|
"gsap": "^3.15.0",
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"react
|
|
20
|
+
"ipaddr.js": "^2.5.0",
|
|
21
|
+
"next": "16.3.4",
|
|
22
|
+
"react": "19.2.8",
|
|
23
|
+
"react-dom": "19.2.8"
|
|
22
24
|
},
|
|
23
25
|
"devDependencies": {
|
|
24
|
-
"@antfu/eslint-config": "^9.
|
|
25
|
-
"@commitlint/cli": "^21.
|
|
26
|
-
"@commitlint/config-conventional": "^21.
|
|
27
|
-
"@eslint-react/eslint-plugin": "^5.
|
|
28
|
-
"@next/eslint-plugin-next": "^16.
|
|
26
|
+
"@antfu/eslint-config": "^9.5.1",
|
|
27
|
+
"@commitlint/cli": "^21.2.2",
|
|
28
|
+
"@commitlint/config-conventional": "^21.2.2",
|
|
29
|
+
"@eslint-react/eslint-plugin": "^5.19.0",
|
|
30
|
+
"@next/eslint-plugin-next": "^16.3.4",
|
|
29
31
|
"@svgr/core": "^8.1.0",
|
|
30
|
-
"@types/node": "^
|
|
31
|
-
"@types/react": "^19.2.
|
|
32
|
-
"@types/react-dom": "^19.2.
|
|
33
|
-
"@
|
|
34
|
-
"@
|
|
35
|
-
"
|
|
32
|
+
"@types/node": "^26.5.0",
|
|
33
|
+
"@types/react": "^19.2.18",
|
|
34
|
+
"@types/react-dom": "^19.2.7",
|
|
35
|
+
"@typescript/native": "npm:typescript@^7.0.2",
|
|
36
|
+
"@unocss/eslint-plugin": "^66.10.0",
|
|
37
|
+
"@vitejs/plugin-react": "^6.1.1",
|
|
38
|
+
"@vitejs/plugin-rsc": "^0.5.34",
|
|
39
|
+
"eslint": "^10.10.0",
|
|
36
40
|
"eslint-plugin-format": "^2.0.1",
|
|
41
|
+
"eslint-plugin-jsx-a11y": "^6.10.2",
|
|
37
42
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
38
|
-
"eslint-plugin-react-refresh": "^0.5.
|
|
39
|
-
"lefthook": "^2.1.
|
|
40
|
-
"react-server-dom-webpack": "^19.2.
|
|
41
|
-
"typescript": "
|
|
42
|
-
"unocss": "^66.
|
|
43
|
-
"vinext": "^0.0.
|
|
44
|
-
"vite": "^8.
|
|
43
|
+
"eslint-plugin-react-refresh": "^0.5.6",
|
|
44
|
+
"lefthook": "^2.1.12",
|
|
45
|
+
"react-server-dom-webpack": "^19.2.8",
|
|
46
|
+
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
47
|
+
"unocss": "^66.10.0",
|
|
48
|
+
"vinext": "^1.0.0-beta.9",
|
|
49
|
+
"vite": "^8.2.2",
|
|
45
50
|
"vite-plugin-svgr": "^5.2.0"
|
|
46
|
-
},
|
|
47
|
-
"volta": {
|
|
48
|
-
"node": "24.14.0"
|
|
49
51
|
}
|
|
50
52
|
}
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
-
|
|
1
|
+
minimumReleaseAgeExcludePrune: true
|
|
2
|
+
minimumReleaseAgeExclude:
|
|
3
|
+
- '@types/node@26.5.0'
|
|
2
4
|
|
|
3
5
|
trustPolicy: no-downgrade
|
|
4
6
|
|
|
7
|
+
# Babel 7 requires this legacy release; its npm integrity matches the existing lockfile.
|
|
8
|
+
trustPolicyExclude:
|
|
9
|
+
- semver@6.3.1
|
|
10
|
+
|
|
11
|
+
shellEmulator: true
|
|
12
|
+
|
|
13
|
+
allowBuilds:
|
|
14
|
+
esbuild: true
|
|
15
|
+
lefthook: true
|
|
16
|
+
|
|
5
17
|
ignoredBuiltDependencies:
|
|
6
18
|
- sharp
|
|
7
19
|
- unrs-resolver
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
deepMergeObject,
|
|
3
|
-
isPlainObject,
|
|
4
|
-
isReadableStream,
|
|
5
|
-
tryParseJsonString,
|
|
6
|
-
} from './utils'
|
|
7
1
|
import type {
|
|
8
2
|
AlovaGlobalCacheAdapter,
|
|
9
3
|
AlovaOptions,
|
|
@@ -12,18 +6,24 @@ import type {
|
|
|
12
6
|
StatesExport,
|
|
13
7
|
StatesHook,
|
|
14
8
|
} from 'alova'
|
|
15
|
-
import { createAlova } from 'alova'
|
|
16
9
|
import type { FetchRequestInit } from 'alova/fetch'
|
|
10
|
+
import { createAlova } from 'alova'
|
|
17
11
|
import adapterFetch from 'alova/fetch'
|
|
12
|
+
import {
|
|
13
|
+
deepMergeObject,
|
|
14
|
+
isPlainObject,
|
|
15
|
+
isReadableStream,
|
|
16
|
+
tryParseJsonString,
|
|
17
|
+
} from './utils'
|
|
18
18
|
|
|
19
19
|
type MaybePromise<T> = T | Promise<T>
|
|
20
|
-
type HeaderValue
|
|
21
|
-
| string
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
type HeaderValue
|
|
21
|
+
= | string
|
|
22
|
+
| number
|
|
23
|
+
| boolean
|
|
24
|
+
| null
|
|
25
|
+
| undefined
|
|
26
|
+
| (() => MaybePromise<string | number | boolean | null | undefined>)
|
|
27
27
|
type StatusMatcher<RE> = number | number[] | ((status: number, response: RE) => boolean)
|
|
28
28
|
type CodeMatcher = Array<number | string>
|
|
29
29
|
|
|
@@ -86,7 +86,7 @@ export type RequestOption<
|
|
|
86
86
|
SE extends StatesExport<any> = StatesExport<any>,
|
|
87
87
|
> = BaseRequestOption<RC, RE, RH, SE>
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
interface RequestAlovaGenerics<RC extends object, RE, RH, SE extends StatesExport<any>> {
|
|
90
90
|
Responded: unknown
|
|
91
91
|
Transformed: unknown
|
|
92
92
|
RequestConfig: RC
|
|
@@ -114,8 +114,8 @@ type ResolvedRequestOption<RC extends object, RE, RH, SE extends StatesExport<an
|
|
|
114
114
|
| 'errorDefaultMessage'
|
|
115
115
|
| 'cacheLogger'
|
|
116
116
|
>
|
|
117
|
-
>
|
|
118
|
-
|
|
117
|
+
>
|
|
118
|
+
& BaseRequestOption<RC, RE, RH, SE>
|
|
119
119
|
|
|
120
120
|
const DEFAULT_SUCCESS_MESSAGE = '操作成功'
|
|
121
121
|
const DEFAULT_ERROR_MESSAGE = '服务异常'
|
|
@@ -146,7 +146,7 @@ const defaultRequestOption: BaseRequestOption<any, any, any, any> = {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
function getMethodMeta(method: unknown): RequestMeta {
|
|
149
|
-
const methodRecord = method as { meta?: RequestMeta
|
|
149
|
+
const methodRecord = method as { meta?: RequestMeta, config?: { meta?: RequestMeta } } | undefined
|
|
150
150
|
return methodRecord?.config?.meta ?? methodRecord?.meta ?? {}
|
|
151
151
|
}
|
|
152
152
|
|
|
@@ -160,31 +160,37 @@ function isMatchedStatus<RE>(
|
|
|
160
160
|
matcher: StatusMatcher<RE> | undefined,
|
|
161
161
|
response: RE,
|
|
162
162
|
): boolean {
|
|
163
|
-
if (matcher === undefined)
|
|
163
|
+
if (matcher === undefined)
|
|
164
|
+
return status >= 200 && status < 300
|
|
164
165
|
|
|
165
|
-
if (typeof matcher === 'function')
|
|
166
|
+
if (typeof matcher === 'function')
|
|
167
|
+
return matcher(status, response)
|
|
166
168
|
|
|
167
169
|
return Array.isArray(matcher) ? matcher.includes(status) : matcher === status
|
|
168
170
|
}
|
|
169
171
|
|
|
170
172
|
function isMatchedCode(code: unknown, matcher: CodeMatcher | undefined): boolean {
|
|
171
|
-
if (!matcher?.length)
|
|
173
|
+
if (!matcher?.length)
|
|
174
|
+
return true
|
|
172
175
|
|
|
173
|
-
return matcher.some(
|
|
176
|
+
return matcher.some(item => String(item) === String(code))
|
|
174
177
|
}
|
|
175
178
|
|
|
176
179
|
function getResponseStatus(response: unknown): number {
|
|
177
|
-
const responseRecord = response as { status?: unknown
|
|
180
|
+
const responseRecord = response as { status?: unknown, statusCode?: unknown }
|
|
178
181
|
const status = responseRecord.statusCode ?? responseRecord.status
|
|
179
182
|
return typeof status === 'number' ? status : Number(status)
|
|
180
183
|
}
|
|
181
184
|
|
|
182
185
|
function getResponseMessage(data: unknown, messageKey: string, defaultMessage: string): string {
|
|
183
|
-
if (!isPlainObject(data))
|
|
186
|
+
if (!isPlainObject(data))
|
|
187
|
+
return defaultMessage
|
|
184
188
|
|
|
185
189
|
const message = data[messageKey] ?? data.message ?? data.msg
|
|
186
|
-
if (typeof message === 'string')
|
|
187
|
-
|
|
190
|
+
if (typeof message === 'string')
|
|
191
|
+
return message || defaultMessage
|
|
192
|
+
if (typeof message === 'number')
|
|
193
|
+
return String(message)
|
|
188
194
|
|
|
189
195
|
return defaultMessage
|
|
190
196
|
}
|
|
@@ -201,7 +207,8 @@ async function parseFetchResponse(response: {
|
|
|
201
207
|
json?: () => Promise<unknown>
|
|
202
208
|
text?: () => Promise<string>
|
|
203
209
|
}): Promise<unknown> {
|
|
204
|
-
if (response.status === 204)
|
|
210
|
+
if (response.status === 204)
|
|
211
|
+
return undefined
|
|
205
212
|
|
|
206
213
|
const reader = typeof response.clone === 'function' ? response.clone() : response
|
|
207
214
|
const contentType = getHeaderValue(response.headers, 'content-type')
|
|
@@ -215,12 +222,14 @@ async function parseFetchResponse(response: {
|
|
|
215
222
|
if (typeof reader.json === 'function') {
|
|
216
223
|
try {
|
|
217
224
|
return await reader.json()
|
|
218
|
-
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
219
227
|
// Fall through to text parsing.
|
|
220
228
|
}
|
|
221
229
|
}
|
|
222
230
|
|
|
223
|
-
if (typeof reader.text === 'function')
|
|
231
|
+
if (typeof reader.text === 'function')
|
|
232
|
+
return tryParseJsonString(await reader.text())
|
|
224
233
|
|
|
225
234
|
return undefined
|
|
226
235
|
}
|
|
@@ -229,13 +238,15 @@ function getHeaderValue(
|
|
|
229
238
|
headers: Headers | Record<string, unknown> | undefined,
|
|
230
239
|
key: string,
|
|
231
240
|
): string {
|
|
232
|
-
if (!headers)
|
|
241
|
+
if (!headers)
|
|
242
|
+
return ''
|
|
233
243
|
|
|
234
|
-
if (typeof Headers !== 'undefined' && headers instanceof Headers)
|
|
244
|
+
if (typeof Headers !== 'undefined' && headers instanceof Headers)
|
|
245
|
+
return headers.get(key) ?? ''
|
|
235
246
|
|
|
236
247
|
const headerRecord = headers as Record<string, unknown>
|
|
237
|
-
const value
|
|
238
|
-
headerRecord[key] ?? headerRecord[key.toLowerCase()] ?? headerRecord[key.toUpperCase()]
|
|
248
|
+
const value
|
|
249
|
+
= headerRecord[key] ?? headerRecord[key.toLowerCase()] ?? headerRecord[key.toUpperCase()]
|
|
239
250
|
return typeof value === 'string' ? value : ''
|
|
240
251
|
}
|
|
241
252
|
|
|
@@ -251,9 +262,9 @@ async function getResponseData(response: unknown): Promise<unknown> {
|
|
|
251
262
|
return tryParseJsonString(responseRecord.data)
|
|
252
263
|
|
|
253
264
|
if (
|
|
254
|
-
isReadableStream(responseRecord.body)
|
|
255
|
-
typeof responseRecord.json === 'function'
|
|
256
|
-
typeof responseRecord.text === 'function'
|
|
265
|
+
isReadableStream(responseRecord.body)
|
|
266
|
+
|| typeof responseRecord.json === 'function'
|
|
267
|
+
|| typeof responseRecord.text === 'function'
|
|
257
268
|
) {
|
|
258
269
|
return parseFetchResponse(responseRecord)
|
|
259
270
|
}
|
|
@@ -263,7 +274,8 @@ async function getResponseData(response: unknown): Promise<unknown> {
|
|
|
263
274
|
|
|
264
275
|
async function resolveHeaderValue(value: HeaderValue): Promise<string | undefined> {
|
|
265
276
|
const resolved = typeof value === 'function' ? await value() : value
|
|
266
|
-
if (resolved === null || resolved === undefined)
|
|
277
|
+
if (resolved === null || resolved === undefined)
|
|
278
|
+
return undefined
|
|
267
279
|
return String(resolved)
|
|
268
280
|
}
|
|
269
281
|
|
|
@@ -311,7 +323,8 @@ export function createInstance<
|
|
|
311
323
|
|
|
312
324
|
for (const [key, value] of Object.entries(config.commonHeaders?.() ?? {})) {
|
|
313
325
|
const resolvedValue = await resolveHeaderValue(value)
|
|
314
|
-
if (resolvedValue !== undefined)
|
|
326
|
+
if (resolvedValue !== undefined)
|
|
327
|
+
setHeader(headers, key, resolvedValue)
|
|
315
328
|
}
|
|
316
329
|
},
|
|
317
330
|
responded: {
|
|
@@ -322,7 +335,8 @@ export function createInstance<
|
|
|
322
335
|
const showError = getMetaFlag(meta, 'isShowErrorMessage', config.isShowErrorMessage)
|
|
323
336
|
const isWrapped = getMetaFlag(meta, 'isWrapped', config.isWrapped)
|
|
324
337
|
|
|
325
|
-
if (!shouldTransform)
|
|
338
|
+
if (!shouldTransform)
|
|
339
|
+
return response
|
|
326
340
|
|
|
327
341
|
const status = getResponseStatus(response)
|
|
328
342
|
const data = await getResponseData(response)
|
|
@@ -340,7 +354,8 @@ export function createInstance<
|
|
|
340
354
|
}
|
|
341
355
|
|
|
342
356
|
if (!isWrapped) {
|
|
343
|
-
if (showSuccess)
|
|
357
|
+
if (showSuccess)
|
|
358
|
+
config.successMessageFunc?.(config.successDefaultMessage)
|
|
344
359
|
return data
|
|
345
360
|
}
|
|
346
361
|
|
|
@@ -353,7 +368,8 @@ export function createInstance<
|
|
|
353
368
|
)
|
|
354
369
|
|
|
355
370
|
if (!isMatchedCode(code, config.codeMap.success)) {
|
|
356
|
-
if (isMatchedCode(code, config.codeMap.unAuthorized))
|
|
371
|
+
if (isMatchedCode(code, config.codeMap.unAuthorized))
|
|
372
|
+
config.unAuthorizedResponseFunc?.()
|
|
357
373
|
|
|
358
374
|
if (showError) {
|
|
359
375
|
config.errorMessageFunc?.(
|
|
@@ -363,7 +379,8 @@ export function createInstance<
|
|
|
363
379
|
return Promise.reject(response)
|
|
364
380
|
}
|
|
365
381
|
|
|
366
|
-
if (showSuccess)
|
|
382
|
+
if (showSuccess)
|
|
383
|
+
config.successMessageFunc?.(responseMessage)
|
|
367
384
|
|
|
368
385
|
return responseData
|
|
369
386
|
},
|
|
@@ -396,8 +413,8 @@ export type DualCallInstance<
|
|
|
396
413
|
RE = Response,
|
|
397
414
|
RH = Headers,
|
|
398
415
|
SE extends StatesExport<any> = StatesExport<any>,
|
|
399
|
-
> = RequestInstance<RC, RE, RH, SE>
|
|
400
|
-
((option?: RequestOption<RC, RE, RH, SE>) => RequestInstance<RC, RE, RH, SE>)
|
|
416
|
+
> = RequestInstance<RC, RE, RH, SE>
|
|
417
|
+
& ((option?: RequestOption<RC, RE, RH, SE>) => RequestInstance<RC, RE, RH, SE>)
|
|
401
418
|
|
|
402
419
|
export function createDualCallInstance<
|
|
403
420
|
RC extends object = FetchRequestInit,
|
|
@@ -407,7 +424,8 @@ export function createDualCallInstance<
|
|
|
407
424
|
>(baseConfig: BaseRequestOption<RC, RE, RH, SE>): DualCallInstance<RC, RE, RH, SE> {
|
|
408
425
|
const defaultInstance = createInstance(baseConfig)
|
|
409
426
|
const dualInstance = ((option?: RequestOption<RC, RE, RH, SE>) => {
|
|
410
|
-
if (!option)
|
|
427
|
+
if (!option)
|
|
428
|
+
return defaultInstance
|
|
411
429
|
return createInstance(deepMergeObject(baseConfig, option))
|
|
412
430
|
}) as DualCallInstance<RC, RE, RH, SE>
|
|
413
431
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export function deepMergeObject<T = any>(source: T, target: Partial<T>): T {
|
|
2
2
|
const merge = (src: any, tgt: any): any => {
|
|
3
|
-
if (!isPlainObject(src) || !isPlainObject(tgt))
|
|
3
|
+
if (!isPlainObject(src) || !isPlainObject(tgt))
|
|
4
|
+
return tgt === undefined ? src : tgt
|
|
4
5
|
|
|
5
6
|
const result = { ...src }
|
|
6
7
|
for (const key of Object.keys(tgt)) {
|
|
@@ -19,21 +20,26 @@ export function isPlainObject(data: unknown): data is Record<string, any> {
|
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
export function isReadableStream(data: unknown): boolean {
|
|
22
|
-
if (typeof ReadableStream === 'undefined')
|
|
23
|
+
if (typeof ReadableStream === 'undefined')
|
|
24
|
+
return false
|
|
23
25
|
return data instanceof ReadableStream
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
export function tryParseJsonString(data: unknown): unknown {
|
|
27
|
-
if (typeof data !== 'string')
|
|
29
|
+
if (typeof data !== 'string')
|
|
30
|
+
return data
|
|
28
31
|
|
|
29
32
|
const value = data.trim()
|
|
30
|
-
if (!value)
|
|
33
|
+
if (!value)
|
|
34
|
+
return data
|
|
31
35
|
|
|
32
|
-
if (!value.startsWith('{') && !value.startsWith('['))
|
|
36
|
+
if (!value.startsWith('{') && !value.startsWith('['))
|
|
37
|
+
return data
|
|
33
38
|
|
|
34
39
|
try {
|
|
35
40
|
return JSON.parse(value)
|
|
36
|
-
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
37
43
|
return data
|
|
38
44
|
}
|
|
39
45
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# SVG 使用
|
|
2
|
+
|
|
3
|
+
- 图标通过 `*.svg?react` 导入,使用 `@/components/Icon/svg-icon/SvgIcon` 渲染;用 `size`、`color` 控制大小和颜色,默认继承父级。
|
|
4
|
+
- 公共图标放 `src/assets/svg/`,页面专用图标放所属页面的 `assets/svg/`。
|
|
5
|
+
- 保留 `viewBox`;单色图标用 `currentColor`,保留 `none`、多色和渐变。
|
|
6
|
+
- 图片或背景直接导入 `*.svg` 获取 URL。
|
|
7
|
+
|
|
8
|
+
参数、无障碍设置及示例见 [SvgIcon 使用说明](../../src/components/Icon/svg-icon/README.md)。
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
## 目录说明
|
|
2
|
+
|
|
3
|
+
- 修改文件前,须从文件所在目录逐级向上查找并阅读相关的 `AGENTS.md`(如存在),并遵循其中的说明。
|
|
4
|
+
|
|
5
|
+
## 按需规则
|
|
6
|
+
|
|
7
|
+
根据当前任务匹配下表,在执行相关操作前读取对应规则。不要预先加载整个 `.agents/rules/` 目录;任务范围变化时补读新命中的规则。
|
|
8
|
+
|
|
9
|
+
| 适用条件 | 规则文件 |
|
|
10
|
+
| -------------------- | ------------------------------------ |
|
|
11
|
+
| 新增、修改或使用 SVG | [SVG 使用](.agents/rules/SVG使用.md) |
|
|
@@ -6,37 +6,38 @@
|
|
|
6
6
|
"dev": "rsbuild dev --env-mode development",
|
|
7
7
|
"dev:prod": "rsbuild dev --env-mode production",
|
|
8
8
|
"build": "rsbuild build",
|
|
9
|
+
"typecheck": "tsc --noEmit",
|
|
9
10
|
"check": "biome check --write",
|
|
10
11
|
"format": "prettier --write .",
|
|
11
12
|
"preview": "rsbuild preview",
|
|
12
13
|
"reinstall": "rimraf pnpm-lock.yaml && rimraf node_modules && pnpm install"
|
|
13
14
|
},
|
|
14
15
|
"dependencies": {
|
|
15
|
-
"@alova/adapter-axios": "^2.0.
|
|
16
|
-
"@ant-design/icons": "~6.
|
|
17
|
-
"ahooks": "^3.
|
|
18
|
-
"alova": "^3.5.
|
|
19
|
-
"antd": "^6.
|
|
20
|
-
"dayjs": "^1.11.
|
|
21
|
-
"react": "^19.2.
|
|
22
|
-
"react-dom": "^19.2.
|
|
23
|
-
"react-router": "^
|
|
24
|
-
"zustand": "^5.0.
|
|
16
|
+
"@alova/adapter-axios": "^2.0.20",
|
|
17
|
+
"@ant-design/icons": "~6.3.4",
|
|
18
|
+
"ahooks": "^3.10.0",
|
|
19
|
+
"alova": "^3.5.5",
|
|
20
|
+
"antd": "^6.6.3",
|
|
21
|
+
"dayjs": "^1.11.23",
|
|
22
|
+
"react": "^19.2.8",
|
|
23
|
+
"react-dom": "^19.2.8",
|
|
24
|
+
"react-router": "^8.3.1",
|
|
25
|
+
"zustand": "^5.0.15"
|
|
25
26
|
},
|
|
26
27
|
"devDependencies": {
|
|
27
|
-
"@biomejs/biome": "^2.
|
|
28
|
-
"@commitlint/config-conventional": "^21.
|
|
29
|
-
"@rsbuild/core": "^2.
|
|
30
|
-
"@rsbuild/plugin-react": "^2.0
|
|
31
|
-
"@rsbuild/plugin-sass": "^
|
|
32
|
-
"@rsbuild/plugin-svgr": "^2.0.
|
|
33
|
-
"@types/react": "^19.2.
|
|
34
|
-
"@types/react-dom": "^19.2.
|
|
35
|
-
"@unocss/postcss": "^66.
|
|
36
|
-
"lefthook": "^2.1.
|
|
37
|
-
"prettier": "^3.
|
|
38
|
-
"typescript": "^
|
|
39
|
-
"unocss": "^66.
|
|
40
|
-
"unplugin-auto-import": "^21.
|
|
28
|
+
"@biomejs/biome": "^2.5.12",
|
|
29
|
+
"@commitlint/config-conventional": "^21.2.2",
|
|
30
|
+
"@rsbuild/core": "^2.2.3",
|
|
31
|
+
"@rsbuild/plugin-react": "^2.1.0",
|
|
32
|
+
"@rsbuild/plugin-sass": "^2.0.1",
|
|
33
|
+
"@rsbuild/plugin-svgr": "^2.0.5",
|
|
34
|
+
"@types/react": "^19.2.18",
|
|
35
|
+
"@types/react-dom": "^19.2.7",
|
|
36
|
+
"@unocss/postcss": "^66.10.0",
|
|
37
|
+
"lefthook": "^2.1.12",
|
|
38
|
+
"prettier": "^3.9.6",
|
|
39
|
+
"typescript": "^7.0.2",
|
|
40
|
+
"unocss": "^66.10.0",
|
|
41
|
+
"unplugin-auto-import": "^21.1.0"
|
|
41
42
|
}
|
|
42
43
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<title>Bubbles</title>
|
|
2
3
|
<rect width="32" height="32" rx="8" fill="white" fill-opacity="0.96"/>
|
|
3
4
|
<path d="M19.0579 9.09827L15.8082 11.0706L12.9421 9.09827L6 13.3109V21.7368L12.9421 25.9498L16.1918 24.2105L19.0579 25.9498L26 21.7368V13.3109L19.0579 9.09827ZM12.9421 24.705L7.02568 21.1148V13.9336L12.9421 10.3433L14.7822 11.6929L12.1157 13.3112V21.7371L15.1661 23.5882L12.9421 24.705ZM13.1417 20.0549H18.8586V21.3475L16.1918 22.9658L13.1417 21.1148V20.0549ZM13.1417 18.9765V16.5097H18.8586V18.9765H13.1417ZM18.8586 15.4312H13.1417V13.9336L15.8082 12.3153L18.8586 14.1663V15.4312ZM24.9743 21.1148L19.0579 24.705L17.2178 23.5882L19.8846 21.9699V13.544L16.8342 11.6929L19.0582 10.3433L24.9746 13.9336L24.9743 21.1148Z" fill="#146AE1"/>
|
|
4
5
|
<path d="M14.573 7.86376L13.3172 5.51634C13.3835 5.37271 13.4218 5.21177 13.4218 5.04137C13.4218 4.43853 12.9568 3.94971 12.3832 3.94971C11.8097 3.94971 11.3447 4.43853 11.3447 5.04137C11.3447 5.64421 11.7792 6.0987 12.326 6.1302L13.5704 8.45652C13.6759 8.65401 13.8713 8.76487 14.0723 8.76487C14.1676 8.76487 14.2647 8.73999 14.3537 8.68708C14.6306 8.5233 14.7289 8.15479 14.573 7.86376Z" fill="#FDC23A"/>
|
|
5
6
|
<path d="M17.4268 7.86376L18.6826 5.51634C18.6164 5.37271 18.5781 5.21177 18.5781 5.04137C18.5781 4.43853 19.0431 3.94971 19.6169 3.94971C20.1904 3.94971 20.6555 4.43853 20.6555 5.04137C20.6555 5.62405 20.221 6.0987 19.6742 6.1302L18.4297 8.45652C18.3243 8.65401 18.1289 8.76487 17.9278 8.76487C17.8325 8.76487 17.7355 8.73999 17.6465 8.68708C17.3696 8.5233 17.2713 8.15479 17.4271 7.86376H17.4268Z" fill="#FDC23A"/>
|
|
6
7
|
</svg>
|
|
7
|
-
|