Browse Source

chore: Resolve merge conflicts

vben 9 months ago
parent
commit
082847c441
44 changed files with 485 additions and 285 deletions
  1. 2 0
      .github/CODEOWNERS
  2. 8 0
      .github/workflows/deploy.yml
  3. 1 1
      apps/web-antd/package.json
  4. 1 1
      apps/web-naive/index.html
  5. 1 1
      apps/web-naive/package.json
  6. 1 0
      cspell.json
  7. 2 2
      internal/lint-configs/eslint-config/package.json
  8. 9 2
      internal/node-utils/package.json
  9. 15 7
      internal/node-utils/src/git.ts
  10. 4 1
      internal/node-utils/src/index.ts
  11. 1 1
      internal/node-utils/src/prettier.ts
  12. 24 0
      internal/node-utils/src/spinner.ts
  13. 0 1
      internal/vite-config/package.json
  14. 1 7
      internal/vite-config/src/plugins/nitor-mock.ts
  15. 18 12
      package.json
  16. 1 1
      packages/@core/base/icons/package.json
  17. 1 1
      packages/@core/base/shared/package.json
  18. 1 1
      packages/@core/base/typings/package.json
  19. 1 1
      packages/@core/composables/package.json
  20. 1 1
      packages/@core/preferences/package.json
  21. 1 1
      packages/@core/ui-kit/layout-ui/package.json
  22. 1 1
      packages/@core/ui-kit/menu-ui/package.json
  23. 1 1
      packages/@core/ui-kit/shadcn-ui/package.json
  24. 1 1
      packages/@core/ui-kit/tabs-ui/package.json
  25. 1 1
      packages/effects/access/package.json
  26. 1 1
      packages/effects/chart-ui/package.json
  27. 1 1
      packages/effects/common-ui/package.json
  28. 1 1
      packages/effects/hooks/package.json
  29. 1 1
      packages/effects/layouts/package.json
  30. 1 2
      packages/effects/request/package.json
  31. 0 1
      packages/effects/request/src/index.ts
  32. 0 11
      packages/effects/request/src/use-request.ts
  33. 1 1
      packages/locales/package.json
  34. 1 1
      packages/stores/package.json
  35. 1 1
      packages/types/package.json
  36. 237 144
      pnpm-lock.yaml
  37. 2 2
      scripts/turbo-run/README.md
  38. 41 39
      scripts/turbo-run/src/run.ts
  39. 10 11
      scripts/vsh/src/clean/index.ts
  40. 20 10
      scripts/vsh/src/lint/index.ts
  41. 14 6
      website/.vitepress/config.mts
  42. 2 2
      website/package.json
  43. 37 4
      website/src/guide/essentials/development.md
  44. 16 0
      website/src/guide/in-depth/ui-framework.md

+ 2 - 0
.github/CODEOWNERS

@@ -3,3 +3,5 @@
 
 # vben core onwer
 /packages/@core/ anncwb@126.com
+/internal/ anncwb@126.com
+/scripts/ anncwb@126.com

+ 8 - 0
.github/workflows/deploy.yml

@@ -49,6 +49,14 @@ jobs:
           password: ${{ secrets.WEB_ANTD_FTP_PASSWORD }}
           local-dir: ./apps/web-antd/dist/
 
+      - name: Sync Web Naive files
+        uses: SamKirkland/FTP-Deploy-Action@v4.3.5
+        with:
+          server: ${{ secrets.PRO_FTP_HOST }}
+          username: ${{ secrets.WEB_NAIVE_FTP_ACCOUNT }}
+          password: ${{ secrets.WEB_NAIVE_FTP_PASSWORD }}
+          local-dir: ./apps/web-naive/dist/
+
       - name: Sync Website files
         uses: SamKirkland/FTP-Deploy-Action@v4.3.5
         with:

+ 1 - 1
apps/web-antd/package.json

@@ -44,7 +44,7 @@
     "ant-design-vue": "^4.2.3",
     "dayjs": "^1.11.12",
     "pinia": "2.1.7",
-    "vue": "^3.4.34",
+    "vue": "^3.4.35",
     "vue-router": "^4.4.0"
   }
 }

+ 1 - 1
apps/web-naive/index.html

@@ -21,7 +21,7 @@
         (function () {
           var hm = document.createElement('script');
           hm.src =
-            'https://hm.baidu.com/hm.js?d20a01273820422b6aa2ee41b6c9414d';
+            'https://hm.baidu.com/hm.js?24bb3eb91dfe4ebfcbcee6952a107cb6';
           var s = document.getElementsByTagName('script')[0];
           s.parentNode.insertBefore(hm, s);
         })();

+ 1 - 1
apps/web-naive/package.json

@@ -43,7 +43,7 @@
     "@vueuse/core": "^10.11.0",
     "naive-ui": "^2.39.0",
     "pinia": "2.1.7",
-    "vue": "^3.4.34",
+    "vue": "^3.4.35",
     "vue-router": "^4.4.0"
   }
 }

+ 1 - 0
cspell.json

@@ -14,6 +14,7 @@
     "lucide",
     "brotli",
     "defu",
+    "execa",
     "iconify",
     "intlify",
     "mkdist",

+ 2 - 2
internal/lint-configs/eslint-config/package.json

@@ -27,7 +27,7 @@
     }
   },
   "dependencies": {
-    "eslint-config-turbo": "^2.0.9",
+    "eslint-config-turbo": "^2.0.10",
     "eslint-plugin-command": "^0.2.3",
     "eslint-plugin-import-x": "^3.1.0"
   },
@@ -39,7 +39,7 @@
     "eslint": "^9.8.0",
     "eslint-config-prettier": "^9.1.0",
     "eslint-plugin-eslint-comments": "^3.2.0",
-    "eslint-plugin-jsdoc": "^48.10.1",
+    "eslint-plugin-jsdoc": "^48.10.2",
     "eslint-plugin-jsonc": "^2.16.0",
     "eslint-plugin-n": "^17.10.1",
     "eslint-plugin-no-only-tests": "^3.1.0",

+ 9 - 2
internal/node-utils/package.json

@@ -30,13 +30,20 @@
   "dependencies": {
     "@changesets/git": "^3.0.0",
     "@manypkg/get-packages": "^2.2.2",
+    "chalk": "^5.3.0",
     "consola": "^3.2.3",
     "dayjs": "^1.11.12",
+    "execa": "^9.3.0",
     "find-up": "^7.0.0",
+    "fs-extra": "^11.2.0",
     "nanoid": "^5.0.7",
+    "ora": "^8.0.1",
     "pkg-types": "^1.1.3",
     "prettier": "^3.3.3",
-    "rimraf": "^6.0.1",
-    "zx": "^8.1.4"
+    "rimraf": "^6.0.1"
+  },
+  "devDependencies": {
+    "@types/chalk": "^2.2.0",
+    "@types/fs-extra": "^11.0.4"
   }
 }

+ 15 - 7
internal/node-utils/src/git.ts

@@ -1,24 +1,32 @@
 import path from 'node:path';
 
-import { $ } from 'zx';
+import { execa } from 'execa';
 
 export * from '@changesets/git';
 
 /**
  * 获取暂存区文件
  */
-async function getStagedFiles() {
+async function getStagedFiles(): Promise<string[]> {
   try {
-    $.verbose = false;
-    const { stdout: lines } =
-      await $`git -c submodule.recurse=false diff --staged --diff-filter=ACMR --name-only --ignore-submodules -z`;
+    const { stdout } = await execa('git', [
+      '-c',
+      'submodule.recurse=false',
+      'diff',
+      '--staged',
+      '--diff-filter=ACMR',
+      '--name-only',
+      '--ignore-submodules',
+      '-z',
+    ]);
 
-    let changedList = lines ? lines.replace(/\0$/, '').split('\0') : [];
+    let changedList = stdout ? stdout.replace(/\0$/, '').split('\0') : [];
     changedList = changedList.map((item) => path.resolve(process.cwd(), item));
     const changedSet = new Set(changedList);
     changedSet.delete('');
     return [...changedSet];
-  } catch {
+  } catch (error) {
+    console.error('Failed to get staged files:', error);
     return [];
   }
 }

+ 4 - 1
internal/node-utils/src/index.ts

@@ -6,9 +6,12 @@ export { generatorContentHash } from './hash';
 export * from './monorepo';
 export { toPosixPath } from './path';
 export { prettierFormat } from './prettier';
+export * from './spinner';
 export type { Package } from '@manypkg/get-packages';
+export { default as colors } from 'chalk';
 export { consola } from 'consola';
+export * from 'execa';
+export { default as fs } from 'fs-extra';
 export { nanoid } from 'nanoid';
 export { type PackageJson, readPackageJSON } from 'pkg-types';
 export { rimraf } from 'rimraf';
-export { $, chalk as colors, fs, spinner } from 'zx';

+ 1 - 1
internal/node-utils/src/prettier.ts

@@ -1,5 +1,5 @@
+import fs from 'fs-extra';
 import { format, getFileInfo, resolveConfig } from 'prettier';
-import { fs } from 'zx';
 
 async function prettierFormat(filepath: string) {
   const prettierOptions = await resolveConfig(filepath, {});

+ 24 - 0
internal/node-utils/src/spinner.ts

@@ -0,0 +1,24 @@
+import ora, { Ora } from 'ora';
+
+interface SpinnerOptions {
+  failedText?: string;
+  successText?: string;
+  title: string;
+}
+export async function spinner<T>(
+  { failedText, successText, title }: SpinnerOptions,
+  callback: () => Promise<T>,
+): Promise<T> {
+  const loading: Ora = ora(title).start();
+
+  try {
+    const result = await callback();
+    loading.succeed(successText || 'Success!');
+    return result;
+  } catch (error) {
+    loading.fail(failedText || 'Failed!');
+    throw error;
+  } finally {
+    loading.stop();
+  }
+}

+ 0 - 1
internal/vite-config/package.json

@@ -32,7 +32,6 @@
     "cheerio": "1.0.0-rc.12",
     "html-minifier-terser": "^7.2.0",
     "nitropack": "^2.9.7",
-    "portfinder": "^1.0.32",
     "resolve.exports": "^2.0.2",
     "vite-plugin-lib-inject-css": "^2.1.1",
     "vite-plugin-pwa": "^0.20.1",

+ 1 - 7
internal/vite-config/src/plugins/nitor-mock.ts

@@ -5,7 +5,6 @@ import type { NitroMockPluginOptions } from '../typing';
 import { colors, consola, getPackage } from '@vben/node-utils';
 
 import { build, createDevServer, createNitro, prepare } from 'nitropack';
-import portfinder from 'portfinder';
 
 const hmrKeyRe = /^runtimeConfig\.|routeRules\./;
 
@@ -78,11 +77,6 @@ async function runNitroServer(rootDir: string, port: number, verbose: boolean) {
     nitro.hooks.hookOnce('restart', reload);
 
     const server = createDevServer(nitro);
-    // 端口已经存在
-    const availablePort = await portfinder.getPortPromise({ port });
-    if (availablePort !== port) {
-      return;
-    }
     await server.listen(port, { showURL: false });
     await prepare(nitro);
     await build(nitro);
@@ -92,5 +86,5 @@ async function runNitroServer(rootDir: string, port: number, verbose: boolean) {
       consola.success(colors.bold(colors.green('Nitro Mock Server started.')));
     }
   };
-  await reload();
+  return await reload();
 }

+ 18 - 12
package.json

@@ -6,12 +6,12 @@
     "monorepo",
     "turbo",
     "vben",
-    "vue vben admin",
-    "vue vben admin pro",
     "vben admin",
     "vben pro",
     "vue",
     "vue admin",
+    "vue vben admin",
+    "vue vben admin pro",
     "vue3"
   ],
   "homepage": "https://github.com/vbenjs/vue-vben-admin",
@@ -27,30 +27,30 @@
   "scripts": {
     "bootstrap": "pnpm install",
     "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 turbo build",
-    "preview": "turbo preview",
     "build:analyze": "turbo build:analyze",
     "build:docker": "./build-local-docker-image.sh",
     "changeset": "pnpm exec changeset",
-    "check": "pnpm run check:circular && pnpm run check:dep && pnpm run check:type",
+    "check": "pnpm run check:circular && pnpm run check:dep && pnpm run check:type && pnpm check:cspell",
     "check:circular": "vsh check-circular",
+    "check:cspell": "cspell lint **/*.ts **/README.md .changeset/*.md --no-progress",
     "check:dep": "vsh check-dep",
     "check:type": "turbo run typecheck",
     "clean": "vsh clean",
     "commit": "czg",
     "dev": "turbo-run dev",
-    "dev:antd": "pnpm -F @vben/web-antd",
-    "dev:ele": "pnpm -F @vben/web-ele",
-    "dev:naive": "pnpm -F @vben/web-naive",
-    "dev:docs": "pnpm -F @vben/website run docs:dev",
+    "dev:antd": "pnpm -F @vben/web-antd run dev",
+    "dev:docs": "pnpm -F @vben/website run dev",
+    "dev:ele": "pnpm -F @vben/web-ele run dev",
+    "dev:naive": "pnpm -F @vben/web-naive run dev",
     "format": "vsh lint --format",
     "lint": "vsh lint",
     "postinstall": "turbo run stub",
     "preinstall": "npx only-allow pnpm",
     "prepare": "is-ci || husky",
+    "preview": "turbo-run preview",
     "publint": "vsh publint",
     "reinstall": "pnpm clean --del-lock && pnpm bootstrap",
     "test:unit": "vitest",
-    "turbo-run": "turbo-run",
     "update:deps": " pnpm update --latest --recursive",
     "version": "pnpm exec changeset version && pnpm install --no-frozen-lockfile"
   },
@@ -78,11 +78,11 @@
     "is-ci": "^3.0.1",
     "jsdom": "^24.1.1",
     "rimraf": "^6.0.1",
-    "turbo": "^2.0.9",
+    "turbo": "^2.0.10",
     "typescript": "^5.5.4",
     "unbuild": "^2.0.0",
     "vite": "^5.3.5",
-    "vitest": "^2.0.4",
+    "vitest": "^2.0.5",
     "vue-tsc": "^2.0.29"
   },
   "engines": {
@@ -91,10 +91,16 @@
   },
   "packageManager": "pnpm@9.6.0",
   "pnpm": {
+    "peerDependencyRules": {
+      "allowedVersions": {
+        "eslint": "*",
+        "@typescript-eslint/eslint-plugin": "*"
+      }
+    },
     "overrides": {
       "@ctrl/tinycolor": "^4.1.0",
       "clsx": "^2.1.1",
-      "vue": "^3.4.34"
+      "vue": "^3.4.35"
     },
     "neverBuiltDependencies": [
       "canvas",

+ 1 - 1
packages/@core/base/icons/package.json

@@ -36,6 +36,6 @@
   "dependencies": {
     "@iconify/vue": "^4.1.2",
     "lucide-vue-next": "^0.417.0",
-    "vue": "^3.4.34"
+    "vue": "^3.4.35"
   }
 }

+ 1 - 1
packages/@core/base/shared/package.json

@@ -56,7 +56,7 @@
   },
   "dependencies": {
     "@ctrl/tinycolor": "^4.1.0",
-    "@vue/shared": "^3.4.34",
+    "@vue/shared": "^3.4.35",
     "clsx": "^2.1.1",
     "defu": "^6.1.4",
     "lodash.clonedeep": "^4.5.0",

+ 1 - 1
packages/@core/base/typings/package.json

@@ -38,7 +38,7 @@
     }
   },
   "dependencies": {
-    "vue": "^3.4.34",
+    "vue": "^3.4.35",
     "vue-router": "^4.4.0"
   }
 }

+ 1 - 1
packages/@core/composables/package.json

@@ -39,7 +39,7 @@
     "@vueuse/core": "^10.11.0",
     "radix-vue": "^1.9.2",
     "sortablejs": "^1.15.2",
-    "vue": "^3.4.34"
+    "vue": "^3.4.35"
   },
   "devDependencies": {
     "@types/sortablejs": "^1.15.8"

+ 1 - 1
packages/@core/preferences/package.json

@@ -32,6 +32,6 @@
     "@vben-core/shared": "workspace:*",
     "@vben-core/typings": "workspace:*",
     "@vueuse/core": "^10.11.0",
-    "vue": "^3.4.34"
+    "vue": "^3.4.35"
   }
 }

+ 1 - 1
packages/@core/ui-kit/layout-ui/package.json

@@ -42,6 +42,6 @@
     "@vben-core/shadcn-ui": "workspace:*",
     "@vben-core/typings": "workspace:*",
     "@vueuse/core": "^10.11.0",
-    "vue": "^3.4.34"
+    "vue": "^3.4.35"
   }
 }

+ 1 - 1
packages/@core/ui-kit/menu-ui/package.json

@@ -43,6 +43,6 @@
     "@vben-core/shared": "workspace:*",
     "@vben-core/typings": "workspace:*",
     "@vueuse/core": "^10.11.0",
-    "vue": "^3.4.34"
+    "vue": "^3.4.35"
   }
 }

+ 1 - 1
packages/@core/ui-kit/shadcn-ui/package.json

@@ -50,6 +50,6 @@
     "class-variance-authority": "^0.7.0",
     "lucide-vue-next": "^0.417.0",
     "radix-vue": "^1.9.2",
-    "vue": "^3.4.34"
+    "vue": "^3.4.35"
   }
 }

+ 1 - 1
packages/@core/ui-kit/tabs-ui/package.json

@@ -41,6 +41,6 @@
     "@vben-core/icons": "workspace:*",
     "@vben-core/shadcn-ui": "workspace:*",
     "@vben-core/typings": "workspace:*",
-    "vue": "^3.4.34"
+    "vue": "^3.4.35"
   }
 }

+ 1 - 1
packages/effects/access/package.json

@@ -24,6 +24,6 @@
     "@vben/stores": "workspace:*",
     "@vben/types": "workspace:*",
     "@vben/utils": "workspace:*",
-    "vue": "^3.4.34"
+    "vue": "^3.4.35"
   }
 }

+ 1 - 1
packages/effects/chart-ui/package.json

@@ -23,6 +23,6 @@
     "@vben/preferences": "workspace:*",
     "@vueuse/core": "^10.11.0",
     "echarts": "^5.5.1",
-    "vue": "^3.4.34"
+    "vue": "^3.4.35"
   }
 }

+ 1 - 1
packages/effects/common-ui/package.json

@@ -28,7 +28,7 @@
     "@vben/types": "workspace:*",
     "@vueuse/integrations": "^10.11.0",
     "qrcode": "^1.5.3",
-    "vue": "^3.4.34",
+    "vue": "^3.4.35",
     "vue-router": "^4.4.0"
   },
   "devDependencies": {

+ 1 - 1
packages/effects/hooks/package.json

@@ -24,7 +24,7 @@
     "@vben/preferences": "workspace:*",
     "@vben/stores": "workspace:*",
     "@vben/types": "workspace:*",
-    "vue": "^3.4.34",
+    "vue": "^3.4.35",
     "vue-router": "^4.4.0",
     "watermark-js-plus": "^1.5.2"
   }

+ 1 - 1
packages/effects/layouts/package.json

@@ -33,7 +33,7 @@
     "@vben/types": "workspace:*",
     "@vben/utils": "workspace:*",
     "@vueuse/core": "^10.11.0",
-    "vue": "^3.4.34",
+    "vue": "^3.4.35",
     "vue-router": "^4.4.0"
   }
 }

+ 1 - 2
packages/effects/request/package.json

@@ -22,8 +22,7 @@
   "dependencies": {
     "@vben/locales": "workspace:*",
     "@vben/utils": "workspace:*",
-    "axios": "^1.7.2",
-    "vue-request": "^2.0.4"
+    "axios": "^1.7.2"
   },
   "devDependencies": {
     "axios-mock-adapter": "^1.22.0"

+ 0 - 1
packages/effects/request/src/index.ts

@@ -1,3 +1,2 @@
 export * from './request-client';
-export * from './use-request';
 export * from 'axios';

+ 0 - 11
packages/effects/request/src/use-request.ts

@@ -1,11 +0,0 @@
-// import { setGlobalOptions, } from 'vue-request';
-
-// setGlobalOptions({
-//   manual: true,
-//   // ...
-// });
-
-/**
- * @see https://www.attojs.com/guide/documentation/globalOptions.html
- */
-export * from 'vue-request';

+ 1 - 1
packages/locales/package.json

@@ -21,7 +21,7 @@
   },
   "dependencies": {
     "@intlify/core-base": "^9.13.1",
-    "vue": "^3.4.34",
+    "vue": "^3.4.35",
     "vue-i18n": "^9.13.1"
   }
 }

+ 1 - 1
packages/stores/package.json

@@ -24,7 +24,7 @@
     "@vben-core/typings": "workspace:*",
     "pinia": "2.1.7",
     "pinia-plugin-persistedstate": "^3.2.1",
-    "vue": "^3.4.34",
+    "vue": "^3.4.35",
     "vue-router": "^4.4.0"
   }
 }

+ 1 - 1
packages/types/package.json

@@ -21,7 +21,7 @@
   },
   "dependencies": {
     "@vben-core/typings": "workspace:*",
-    "vue": "^3.4.34",
+    "vue": "^3.4.35",
     "vue-router": "^4.4.0"
   }
 }

File diff suppressed because it is too large
+ 237 - 144
pnpm-lock.yaml


+ 2 - 2
scripts/turbo-run/README.md

@@ -1,3 +1,3 @@
-# @vben/vsh
+# @vben/turbo-run
 
-shell 脚本工具集合
+turbo-run is a command line tool that allows you to run multiple commands in parallel.

+ 41 - 39
scripts/turbo-run/src/run.ts

@@ -1,10 +1,6 @@
-import type { Package } from '@vben/node-utils';
+import { execaCommand, getPackages } from '@vben/node-utils';
 
-import { join } from 'node:path';
-
-import { $, fs, getPackages } from '@vben/node-utils';
-
-import { cancel, isCancel, multiselect } from '@clack/prompts';
+import { cancel, isCancel, select } from '@clack/prompts';
 
 interface RunOptions {
   command?: string;
@@ -12,35 +8,45 @@ interface RunOptions {
 
 export async function run(options: RunOptions) {
   const { command } = options;
+  if (!command) {
+    console.error('Please enter the command to run');
+    process.exit(1);
+  }
   const { packages } = await getPackages();
-  const appPkgs = await findApps(process.cwd(), packages);
+  // const appPkgs = await findApps(process.cwd(), packages);
+  // const websitePkg = packages.find(
+  //   (item) => item.packageJson.name === '@vben/website',
+  // );
+
+  // 只显示有对应命令的包
+  const selectPkgs = packages.filter((pkg) => {
+    return (pkg?.packageJson as Record<string, any>).scripts?.[command];
+  });
 
-  const selectApps = await multiselect<any, string>({
+  const selectPkg = await select<any, string>({
     message: `Select the app you need to run [${command}]:`,
-    options: appPkgs.map((item) => ({ label: item, value: item })),
-    required: true,
+    options: selectPkgs.map((item) => ({
+      label: item?.packageJson.name,
+      value: item?.packageJson.name,
+    })),
   });
 
-  if (isCancel(selectApps)) {
+  if (isCancel(selectPkg) || !selectPkg) {
     cancel('👋 Has cancelled');
     process.exit(0);
   }
 
-  if (selectApps.length === 1) {
-    $.verbose = true;
-    // 让控制台显示颜色
-    process.env.FORCE_COLOR = '1';
-    await $`pnpm --filter=${selectApps[0]} run ${command} `;
-    return;
-  }
-  const filters = [];
-  for (const app of selectApps) {
-    filters.push(`--filter=${app}`);
-  }
-  $.verbose = true;
-  // 让控制台显示颜色
-  process.env.FORCE_COLOR = '1';
-  await $`turbo run ${command} ${filters}`;
+  execaCommand(`pnpm --filter=${selectPkg} run ${command}`, {
+    stdio: 'inherit',
+  });
+  // const filters = [];
+  // for (const app of selectApps) {
+  //   filters.push(`--filter=${app}`);
+  // }
+  // $.verbose = true;
+  // execaCommand(`turbo run ${command} ${filters}`, {
+  //   stdio: 'inherit',
+  // });
 }
 
 /**
@@ -48,16 +54,12 @@ export async function run(options: RunOptions) {
  * @param root
  * @param packages
  */
-async function findApps(root: string, packages: Package[]) {
-  // apps内的
-  const appPackages = packages
-    .filter((pkg) => {
-      const viteConfigExists = fs.existsSync(join(pkg.dir, 'vite.config.mts'));
-      return pkg.dir.startsWith(join(root, 'apps')) && viteConfigExists;
-    })
-    .map((pkg) => {
-      return pkg.packageJson.name;
-    });
-
-  return appPackages;
-}
+// async function findApps(root: string, packages: Package[]) {
+//   // apps内的
+//   const appPackages = packages.filter((pkg) => {
+//     const viteConfigExists = fs.existsSync(join(pkg.dir, 'vite.config.mts'));
+//     return pkg.dir.startsWith(join(root, 'apps')) && viteConfigExists;
+//   });
+
+//   return appPackages;
+// }

+ 10 - 11
scripts/vsh/src/clean/index.ts

@@ -2,13 +2,7 @@ import type { CAC } from 'cac';
 
 import { join } from 'node:path';
 
-import {
-  colors,
-  consola,
-  getPackages,
-  rimraf,
-  spinner,
-} from '@vben/node-utils';
+import { colors, getPackages, rimraf, spinner } from '@vben/node-utils';
 
 const CLEAN_DIRS = ['dist', 'node_modules', '.turbo'];
 
@@ -38,10 +32,15 @@ async function runClean({
 
   const cleanDirsText = JSON.stringify(cleanDirs);
 
-  spinner(`${colors.dim(cleanDirsText)} cleaning in progress...`, async () => {
-    await clean({ delLock, dirs: cleanDirs, recursive });
-    consola.success(colors.green(`clean up all \`${cleanDirsText}\` success.`));
-  });
+  spinner(
+    {
+      successText: colors.green(`clean up all \`${cleanDirsText}\` success.`),
+      title: `${colors.dim(cleanDirsText)} cleaning in progress...`,
+    },
+    async () => {
+      await clean({ delLock, dirs: cleanDirs, recursive });
+    },
+  );
 }
 
 async function clean({ delLock, dirs = [], recursive }: CleanCommandOptions) {

+ 20 - 10
scripts/vsh/src/lint/index.ts

@@ -1,6 +1,6 @@
 import type { CAC } from 'cac';
 
-import { $ } from '@vben/node-utils';
+import { execaCommand } from '@vben/node-utils';
 
 interface LintCommandOptions {
   /**
@@ -10,21 +10,31 @@ interface LintCommandOptions {
 }
 
 async function runLint({ format }: LintCommandOptions) {
-  process.env.FORCE_COLOR = '3';
+  // process.env.FORCE_COLOR = '3';
 
   if (format) {
-    await $`stylelint "**/*.{vue,css,less.scss}" --cache --fix`;
-    await $`eslint . --cache --fix`;
-    await $`prettier . --write --cache --log-level warn`;
+    await execaCommand(`stylelint "**/*.{vue,css,less.scss}" --cache --fix`, {
+      stdio: 'inherit',
+    });
+    await execaCommand(`eslint . --cache --fix`, {
+      stdio: 'inherit',
+    });
+    await execaCommand(`prettier . --write --cache --log-level warn`, {
+      stdio: 'inherit',
+    });
     return;
   }
-  $.verbose = true;
   await Promise.all([
-    $`cspell lint "**/*.ts"  "**/README.md" ".changeset/*.md" --no-progress`,
-    $`eslint . --cache`,
+    execaCommand(`eslint . --cache`, {
+      stdio: 'inherit',
+    }),
     // $`ls-lint`,
-    $`prettier . --ignore-unknown --check --cache`,
-    $`stylelint "**/*.{vue,css,less.scss}" --cache`,
+    execaCommand(`prettier . --ignore-unknown --check --cache`, {
+      stdio: 'inherit',
+    }),
+    execaCommand(`stylelint "**/*.{vue,css,less.scss}" --cache`, {
+      stdio: 'inherit',
+    }),
   ]);
 }
 

+ 14 - 6
website/.vitepress/config.mts

@@ -162,7 +162,15 @@ function nav(): DefaultTheme.NavItem[] {
           items: [
             {
               link: 'https://www.vben.pro',
-              text: '完整版(Ant Design Vue)',
+              text: 'Ant Design Vue 版本(默认)',
+            },
+            {
+              link: 'https://naive.vben.pro',
+              text: 'Naive 版本',
+            },
+            {
+              link: 'https://ele.vben.pro',
+              text: 'Element Plus版本',
             },
           ],
         },
@@ -184,6 +192,10 @@ function nav(): DefaultTheme.NavItem[] {
           link: 'https://github.com/vbenjs/vue-vben-admin/releases',
           text: '更新日志',
         },
+        {
+          link: 'https://github.com/orgs/vbenjs/projects/5',
+          text: '路线图',
+        },
         {
           link: 'https://github.com/vbenjs/vue-vben-admin/blob/main/.github/contributing.md',
           text: '贡献',
@@ -220,11 +232,6 @@ function sidebarGuide(): DefaultTheme.SidebarItem[] {
           text: '为什么选择我们?',
         },
         { link: 'introduction/quick-start', text: '快速开始' },
-        {
-          link: 'https://github.com/vbenjs/vue-vben-admin/releases',
-          text: '更新日志',
-        },
-        { link: 'https://github.com/orgs/vbenjs/projects/5', text: '路线图' },
       ],
     },
     {
@@ -251,6 +258,7 @@ function sidebarGuide(): DefaultTheme.SidebarItem[] {
         { link: 'in-depth/features', text: '常用功能' },
         { link: 'in-depth/check-updates', text: '检查更新' },
         { link: 'in-depth/loading', text: '全局loading' },
+        { link: 'in-depth/ui-framework', text: '组件库切换' },
       ],
     },
     {

+ 2 - 2
website/package.json

@@ -4,7 +4,7 @@
   "private": true,
   "scripts": {
     "build": "vitepress build",
-    "docs:dev": "vitepress dev",
+    "dev": "vitepress dev",
     "docs:preview": "vitepress preview"
   },
   "dependencies": {
@@ -13,6 +13,6 @@
   "devDependencies": {
     "@vite-pwa/vitepress": "^0.5.0",
     "vitepress": "^1.3.1",
-    "vue": "^3.4.34"
+    "vue": "^3.4.35"
   }
 }

+ 37 - 4
website/src/guide/essentials/development.md

@@ -50,14 +50,18 @@ npm 脚本是项目常见的配置,用于执行一些常见的任务,比如
     "bootstrap": "pnpm install",
     // 构建项目
     "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 turbo build",
+    // 构建项目并分析
+    "build:analyze": "turbo build:analyze",
     // 构建docker镜像
     "build:docker": "./build-local-docker-image.sh",
     // changeset 版本管理
     "changeset": "pnpm exec changeset",
     // 检查项目各种问题
-    "check": "pnpm run check:circular && pnpm run check:dep && pnpm run check:type",,
+    "check": "pnpm run check:circular && pnpm run check:dep && pnpm run check:type && pnpm check:cspell",
     // 检查循环引用
     "check:circular": "vsh check-circular",
+    // 检查拼写
+    "check:cspell": "cspell lint **/*.ts **/README.md .changeset/*.md --no-progress"
     // 检查依赖
     "check:dep": "vsh check-dep",
     // 检查类型
@@ -67,9 +71,15 @@ npm 脚本是项目常见的配置,用于执行一些常见的任务,比如
     // 提交代码
     "commit": "czg",
     // 启动项目(默认会运行整个仓库所有包的dev脚本)
-    "dev": "cross-env TURBO_UI=1 turbo run dev",
+    "dev": "turbo-run dev",
+    // 启动web-antd应用
+    "dev:antd": "pnpm -F @vben/web-antd run dev",
     // 启动文档
-    "dev:docs": "pnpm -F @vben/website run docs:dev",
+    "dev:docs": "pnpm -F @vben/website run dev",
+    // 启动 element plus应用
+    "dev:ele": "pnpm -F @vben/web-ele run dev",
+    // 启动web-naive应用
+    "dev:naive": "pnpm -F @vben/web-naive run dev",
     // 格式化代码
     "format": "vsh lint --format",
     // lint 代码
@@ -80,6 +90,8 @@ npm 脚本是项目常见的配置,用于执行一些常见的任务,比如
     "preinstall": "npx only-allow pnpm",
     // husky的安装
     "prepare": "is-ci || husky",
+    // 预览应用
+    "preview": "turbo-run preview",
     // 包规范检查
     "publint": "vsh publint",
     // 删除所有的node_modules、yarn.lock、package.lock.json,重新安装依赖
@@ -96,12 +108,33 @@ npm 脚本是项目常见的配置,用于执行一些常见的任务,比如
 
 ## 本地运行项目
 
-如需本地运行文档,并进行调整,可以执行以下命令:
+如需本地运行文档,并进行调整,可以执行以下命令,执行该命令,你可以选择需要的应用进行开发
 
 ```bash
 pnpm dev
 ```
 
+如果你想直接运行某个应用,可以执行以下命令:
+
+运行 `web-antd` 应用:
+
+```bash
+pnpm dev:antd
+
+```
+
+运行 `web-naive` 应用:
+
+```bash
+pnpm dev:naive
+```
+
+运行 `website` 应用:
+
+```bash
+pnpm dev:docs
+```
+
 ## DevTools
 
 项目内置了 [Vue DevTools](https://github.com/vuejs/devtools-next) 插件,可以在开发过程中使用。默认关闭,可在`.env.development` 内开启,并重新运行项目即可:

+ 16 - 0
website/src/guide/in-depth/ui-framework.md

@@ -0,0 +1,16 @@
+# 组件库切换
+
+`Vue Admin` 支持你自由选择组件库,目前演示站点的默认组件库是 `Ant Design Vue`,与旧版本保持一致。同时框架还内置了 `Element Plus` 版本和 `Naive UI` 版本,你可以根据自己的喜好选择。
+
+## 新增组件库应用
+
+如果你想用其他别的组件库,你只需要按一下步骤进行操作:
+
+1. 在`apps`内创建一个新的文件夹,例如`apps/web-xxx`。
+2. 更改`apps/web-xxx/package.json`的`name`字段为`web-xxx`。
+3. 移除其他组件库依赖及代码,并用你的组件库进行替换相应逻辑,需要改动的地方不多。
+4. 调整`locales`内的语言文件。
+5. 调整 `app.vue` 内的组件。
+6. 自行适配组件库的主题,与 `Vben Admin` 契合。
+7. 调整 `.env` 内的应用名
+8. 在大仓根目录增加 `dev:xxx` 脚本

Some files were not shown because too many files changed in this diff