Browse Source

Merge branch 'fork/xingyu4j/tsdown'

# Conflicts:
#	pnpm-lock.yaml
pull/7676/head
Jin Mao 1 week ago
parent
commit
82cda0edaa
  1. 1
      cspell.json
  2. 7
      internal/lint-configs/eslint-config/build.config.ts
  3. 6
      internal/lint-configs/eslint-config/package.json
  4. 2
      internal/lint-configs/eslint-config/src/configs/node.ts
  5. 16
      internal/lint-configs/eslint-config/tsdown.config.ts
  6. 7
      internal/lint-configs/oxfmt-config/build.config.ts
  7. 2
      internal/lint-configs/oxfmt-config/package.json
  8. 4
      internal/lint-configs/oxfmt-config/src/index.ts
  9. 11
      internal/lint-configs/oxfmt-config/tsdown.config.ts
  10. 7
      internal/lint-configs/oxlint-config/build.config.ts
  11. 2
      internal/lint-configs/oxlint-config/package.json
  12. 11
      internal/lint-configs/oxlint-config/tsdown.config.ts
  13. 7
      internal/node-utils/build.config.ts
  14. 4
      internal/node-utils/package.json
  15. 37
      internal/node-utils/scripts/build.mjs
  16. 4
      internal/node-utils/src/date.ts
  17. 34
      internal/node-utils/src/monorepo.ts
  18. 8
      internal/node-utils/tsconfig.build.json
  19. 10
      internal/node-utils/tsdown.config.ts
  20. 7
      internal/vite-config/build.config.ts
  21. 7
      internal/vite-config/package.json
  22. 5
      internal/vite-config/src/plugins/index.ts
  23. 2
      internal/vite-config/src/typing.ts
  24. 41
      internal/vite-config/tsdown.config.ts
  25. 4
      package.json
  26. 2
      packages/@core/base/design/package.json
  27. 7
      packages/@core/base/icons/build.config.ts
  28. 3
      packages/@core/base/icons/package.json
  29. 11
      packages/@core/base/icons/tsdown.config.ts
  30. 14
      packages/@core/base/shared/build.config.ts
  31. 10
      packages/@core/base/shared/package.json
  32. 4
      packages/@core/base/shared/src/utils/__tests__/date.test.ts
  33. 4
      packages/@core/base/shared/src/utils/date.ts
  34. 18
      packages/@core/base/shared/tsdown.config.ts
  35. 7
      packages/@core/base/typings/build.config.ts
  36. 6
      packages/@core/base/typings/package.json
  37. 11
      packages/@core/base/typings/tsdown.config.ts
  38. 2
      packages/@core/base/typings/vue-router.d.ts
  39. 7
      packages/@core/composables/build.config.ts
  40. 3
      packages/@core/composables/package.json
  41. 11
      packages/@core/composables/tsdown.config.ts
  42. 7
      packages/@core/preferences/build.config.ts
  43. 17
      packages/@core/preferences/package.json
  44. 11
      packages/@core/preferences/tsdown.config.ts
  45. 21
      packages/@core/ui-kit/form-ui/build.config.ts
  46. 5
      packages/@core/ui-kit/form-ui/package.json
  47. 22
      packages/@core/ui-kit/form-ui/tsdown.config.ts
  48. 21
      packages/@core/ui-kit/layout-ui/build.config.ts
  49. 5
      packages/@core/ui-kit/layout-ui/package.json
  50. 22
      packages/@core/ui-kit/layout-ui/tsdown.config.ts
  51. 26
      packages/@core/ui-kit/menu-ui/build.config.ts
  52. 5
      packages/@core/ui-kit/menu-ui/package.json
  53. 22
      packages/@core/ui-kit/menu-ui/tsdown.config.ts
  54. 21
      packages/@core/ui-kit/popup-ui/build.config.ts
  55. 5
      packages/@core/ui-kit/popup-ui/package.json
  56. 22
      packages/@core/ui-kit/popup-ui/tsdown.config.ts
  57. 27
      packages/@core/ui-kit/shadcn-ui/build.config.ts
  58. 15
      packages/@core/ui-kit/shadcn-ui/package.json
  59. 5
      packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue
  60. 21
      packages/@core/ui-kit/tabs-ui/build.config.ts
  61. 5
      packages/@core/ui-kit/tabs-ui/package.json
  62. 22
      packages/@core/ui-kit/tabs-ui/tsdown.config.ts
  63. 7
      pnpm-workspace.yaml
  64. 7
      scripts/turbo-run/build.config.ts
  65. 2
      scripts/turbo-run/package.json
  66. 11
      scripts/turbo-run/tsdown.config.ts
  67. 7
      scripts/vsh/build.config.ts
  68. 2
      scripts/vsh/package.json
  69. 67
      scripts/vsh/src/check-circular/index.ts
  70. 2
      scripts/vsh/src/check-dep/index.ts
  71. 11
      scripts/vsh/tsdown.config.ts

1
cspell.json

@ -60,6 +60,7 @@
"tabler", "tabler",
"taze", "taze",
"tdesign", "tdesign",
"tsdown",
"tsgolint", "tsgolint",
"turborepo", "turborepo",
"ui-kit", "ui-kit",

7
internal/lint-configs/eslint-config/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

6
internal/lint-configs/eslint-config/package.json

@ -12,7 +12,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"stub": "pnpm unbuild --stub" "stub": "pnpm exec tsdown"
}, },
"files": [ "files": [
"dist" "dist"
@ -27,12 +27,10 @@
} }
}, },
"dependencies": { "dependencies": {
"@vben/oxlint-config": "workspace:*"
},
"devDependencies": {
"@eslint/js": "catalog:", "@eslint/js": "catalog:",
"@typescript-eslint/eslint-plugin": "catalog:", "@typescript-eslint/eslint-plugin": "catalog:",
"@typescript-eslint/parser": "catalog:", "@typescript-eslint/parser": "catalog:",
"@vben/oxlint-config": "workspace:*",
"eslint": "catalog:", "eslint": "catalog:",
"eslint-plugin-jsonc": "catalog:", "eslint-plugin-jsonc": "catalog:",
"eslint-plugin-n": "catalog:", "eslint-plugin-n": "catalog:",

2
internal/lint-configs/eslint-config/src/configs/node.ts

@ -17,7 +17,7 @@ export async function node(): Promise<Linter.Config[]> {
'error', 'error',
{ {
allowModules: [ allowModules: [
'unbuild', 'tsdown',
'@vben/vite-config', '@vben/vite-config',
'vitest', 'vitest',
'vite', 'vite',

16
internal/lint-configs/eslint-config/tsdown.config.ts

@ -0,0 +1,16 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
deps: {
skipNodeModulesBundle: true,
},
dts: {
resolver: 'tsc',
},
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
}),
});

7
internal/lint-configs/oxfmt-config/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

2
internal/lint-configs/oxfmt-config/package.json

@ -12,7 +12,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"stub": "pnpm unbuild --stub" "stub": "pnpm exec tsdown"
}, },
"files": [ "files": [
"dist" "dist"

4
internal/lint-configs/oxfmt-config/src/index.ts

@ -2,7 +2,7 @@ import { defineConfig as defineOxfmtConfig } from 'oxfmt';
type OxfmtConfig = Parameters<typeof defineOxfmtConfig>[0]; type OxfmtConfig = Parameters<typeof defineOxfmtConfig>[0];
const oxfmtConfig = defineOxfmtConfig({ const oxfmtConfig: OxfmtConfig = defineOxfmtConfig({
printWidth: 80, printWidth: 80,
proseWrap: 'never', proseWrap: 'never',
semi: true, semi: true,
@ -28,7 +28,7 @@ const oxfmtConfig = defineOxfmtConfig({
], ],
}); });
function defineConfig(config: OxfmtConfig = {}) { function defineConfig(config: OxfmtConfig = {}): OxfmtConfig {
return defineOxfmtConfig({ return defineOxfmtConfig({
...oxfmtConfig, ...oxfmtConfig,
...config, ...config,

11
internal/lint-configs/oxfmt-config/tsdown.config.ts

@ -0,0 +1,11 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
dts: true,
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
}),
});

7
internal/lint-configs/oxlint-config/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

2
internal/lint-configs/oxlint-config/package.json

@ -12,7 +12,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"stub": "pnpm unbuild --stub" "stub": "pnpm exec tsdown"
}, },
"files": [ "files": [
"dist" "dist"

11
internal/lint-configs/oxlint-config/tsdown.config.ts

@ -0,0 +1,11 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
dts: true,
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
}),
});

7
internal/node-utils/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

4
internal/node-utils/package.json

@ -12,7 +12,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"stub": "pnpm unbuild --stub" "stub": "node ./scripts/build.mjs"
}, },
"files": [ "files": [
"dist" "dist"
@ -22,7 +22,7 @@
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
"exports": { "exports": {
".": { ".": {
"types": "./src/index.ts", "types": "./dist/index.d.ts",
"import": "./dist/index.mjs", "import": "./dist/index.mjs",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }

37
internal/node-utils/scripts/build.mjs

@ -0,0 +1,37 @@
import { spawnSync } from 'node:child_process';
const pnpmCommand =
process.env.npm_execpath &&
process.env.npm_execpath.endsWith('.cjs')
? [process.execPath, process.env.npm_execpath]
: ['pnpm'];
const steps = [
['exec', 'tsdown', '--no-dts'],
[
'exec',
'tsc',
'-p',
'tsconfig.build.json',
'--emitDeclarationOnly',
'--declaration',
'--outDir',
'dist',
],
];
for (const args of steps) {
const [command, ...commandArgs] = pnpmCommand;
const result = spawnSync(command, [...commandArgs, ...args], {
shell: true,
stdio: 'inherit',
});
if (result.error) {
throw result.error;
}
if (result.status !== 0) {
process.exit(result.status ?? 1);
}
}

4
internal/node-utils/src/date.ts

@ -1,6 +1,6 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import timezone from 'dayjs/plugin/timezone'; import timezone from 'dayjs/plugin/timezone.js';
import utc from 'dayjs/plugin/utc'; import utc from 'dayjs/plugin/utc.js';
dayjs.extend(utc); dayjs.extend(utc);
dayjs.extend(timezone); dayjs.extend(timezone);

34
internal/node-utils/src/monorepo.ts

@ -1,21 +1,31 @@
import { dirname } from 'node:path'; import type { Package } from '@manypkg/get-packages';
import { import { existsSync } from 'node:fs';
getPackages as getPackagesFunc, import { dirname, join, resolve } from 'node:path';
getPackagesSync as getPackagesSyncFunc,
} from '@manypkg/get-packages'; import * as manypkg from '@manypkg/get-packages';
import { findUpSync } from 'find-up'; const { getPackages: getPackagesFunc, getPackagesSync: getPackagesSyncFunc } =
manypkg;
/** /**
* *
* @param cwd * @param cwd
*/ */
function findMonorepoRoot(cwd: string = process.cwd()) { function findMonorepoRoot(cwd: string = process.cwd()) {
const lockFile = findUpSync('pnpm-lock.yaml', { let currentDir = resolve(cwd);
cwd,
type: 'file', while (true) {
}); if (existsSync(join(currentDir, 'pnpm-lock.yaml'))) {
return dirname(lockFile || ''); return currentDir;
}
const parentDir = dirname(currentDir);
if (parentDir === currentDir) {
return '';
}
currentDir = parentDir;
}
} }
/** /**
@ -40,7 +50,7 @@ async function getPackages() {
*/ */
async function getPackage(pkgName: string) { async function getPackage(pkgName: string) {
const { packages } = await getPackages(); const { packages } = await getPackages();
return packages.find((pkg) => pkg.packageJson.name === pkgName); return packages.find((pkg: Package) => pkg.packageJson.name === pkgName);
} }
export { findMonorepoRoot, getPackage, getPackages, getPackagesSync }; export { findMonorepoRoot, getPackage, getPackages, getPackagesSync };

8
internal/node-utils/tsconfig.build.json

@ -0,0 +1,8 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"extends": "./tsconfig.json",
"compilerOptions": {
"noEmit": false
},
"exclude": ["node_modules", "src/__tests__"]
}

10
internal/node-utils/tsdown.config.ts

@ -0,0 +1,10 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: false,
deps: {
skipNodeModulesBundle: true,
},
entry: ['src/index.ts'],
format: ['esm'],
});

7
internal/vite-config/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

7
internal/vite-config/package.json

@ -12,7 +12,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"stub": "pnpm unbuild --stub" "stub": "pnpm exec tsdown"
}, },
"files": [ "files": [
"dist" "dist"
@ -30,6 +30,7 @@
"@intlify/unplugin-vue-i18n": "catalog:", "@intlify/unplugin-vue-i18n": "catalog:",
"@jspm/generator": "catalog:", "@jspm/generator": "catalog:",
"@tailwindcss/vite": "catalog:", "@tailwindcss/vite": "catalog:",
"@vben/node-utils": "workspace:*",
"archiver": "catalog:", "archiver": "catalog:",
"cheerio": "catalog:", "cheerio": "catalog:",
"get-port": "catalog:", "get-port": "catalog:",
@ -43,18 +44,16 @@
"@pnpm/workspace.read-manifest": "catalog:", "@pnpm/workspace.read-manifest": "catalog:",
"@types/archiver": "catalog:", "@types/archiver": "catalog:",
"@types/html-minifier-terser": "catalog:", "@types/html-minifier-terser": "catalog:",
"@vben/node-utils": "workspace:*",
"@vitejs/plugin-vue": "catalog:", "@vitejs/plugin-vue": "catalog:",
"@vitejs/plugin-vue-jsx": "catalog:", "@vitejs/plugin-vue-jsx": "catalog:",
"dayjs": "catalog:", "dayjs": "catalog:",
"dotenv": "catalog:", "dotenv": "catalog:",
"rollup": "catalog:",
"rollup-plugin-visualizer": "catalog:", "rollup-plugin-visualizer": "catalog:",
"sass": "catalog:", "sass": "catalog:",
"sass-embedded": "catalog:", "sass-embedded": "catalog:",
"unplugin-dts": "catalog:",
"vite": "catalog:", "vite": "catalog:",
"vite-plugin-compression": "catalog:", "vite-plugin-compression": "catalog:",
"vite-plugin-dts": "catalog:",
"vite-plugin-html": "catalog:", "vite-plugin-html": "catalog:",
"vite-plugin-lazy-import": "catalog:" "vite-plugin-lazy-import": "catalog:"
} }

5
internal/vite-config/src/plugins/index.ts

@ -12,8 +12,8 @@ import tailwindcss from '@tailwindcss/vite';
import viteVue from '@vitejs/plugin-vue'; import viteVue from '@vitejs/plugin-vue';
import viteVueJsx from '@vitejs/plugin-vue-jsx'; import viteVueJsx from '@vitejs/plugin-vue-jsx';
import { visualizer as viteVisualizerPlugin } from 'rollup-plugin-visualizer'; import { visualizer as viteVisualizerPlugin } from 'rollup-plugin-visualizer';
import viteDtsPlugin from 'unplugin-dts/vite';
import viteCompressPlugin from 'vite-plugin-compression'; import viteCompressPlugin from 'vite-plugin-compression';
import viteDtsPlugin from 'vite-plugin-dts';
import { createHtmlPlugin as viteHtmlPlugin } from 'vite-plugin-html'; import { createHtmlPlugin as viteHtmlPlugin } from 'vite-plugin-html';
import { VitePWA } from 'vite-plugin-pwa'; import { VitePWA } from 'vite-plugin-pwa';
import viteVueDevTools from 'vite-plugin-vue-devtools'; import viteVueDevTools from 'vite-plugin-vue-devtools';
@ -231,12 +231,13 @@ async function loadLibraryPlugins(
// 单独取,否则commonOptions拿不到 // 单独取,否则commonOptions拿不到
const isBuild = options.isBuild; const isBuild = options.isBuild;
const { dts, ...commonOptions } = options; const { dts, ...commonOptions } = options;
const dtsOptions = typeof dts === 'object' ? dts : undefined;
const commonPlugins = await loadCommonPlugins(commonOptions); const commonPlugins = await loadCommonPlugins(commonOptions);
return await loadConditionPlugins([ return await loadConditionPlugins([
...commonPlugins, ...commonPlugins,
{ {
condition: isBuild && !!dts, condition: isBuild && !!dts,
plugins: () => [viteDtsPlugin({ logLevel: 'error' })], plugins: () => [viteDtsPlugin(dtsOptions)],
}, },
]); ]);
} }

2
internal/vite-config/src/typing.ts

@ -1,11 +1,11 @@
import type { PluginVisualizerOptions } from 'rollup-plugin-visualizer'; import type { PluginVisualizerOptions } from 'rollup-plugin-visualizer';
import type { PluginOptions } from 'unplugin-dts';
import type { import type {
ConfigEnv, ConfigEnv,
PluginOption, PluginOption,
UserConfig, UserConfig,
UserConfigFnPromise, UserConfigFnPromise,
} from 'vite'; } from 'vite';
import type { PluginOptions } from 'vite-plugin-dts';
import type { Options as PwaPluginOptions } from 'vite-plugin-pwa'; import type { Options as PwaPluginOptions } from 'vite-plugin-pwa';
/** /**

41
internal/vite-config/tsdown.config.ts

@ -0,0 +1,41 @@
import { cp, mkdir } from 'node:fs/promises';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
import { defineConfig } from 'tsdown';
const rootDir = dirname(fileURLToPath(import.meta.url));
const loadingAssets = ['default-loading-antd.html', 'default-loading.html'];
export default defineConfig({
clean: true,
deps: {
neverBundle: ['@vben/node-utils'],
skipNodeModulesBundle: true,
},
dts: {
resolver: 'tsc',
},
entry: ['src/index.ts'],
format: ['esm'],
hooks: {
'build:done': async (context) => {
const outDir = context.options.outDir;
if (!outDir) {
return;
}
await mkdir(outDir, { recursive: true });
for (const file of loadingAssets) {
await cp(
join(rootDir, 'src/plugins/inject-app-loading', file),
join(outDir, file),
);
}
},
},
outExtensions: () => ({
dts: '.d.ts',
}),
});

4
package.json

@ -68,6 +68,7 @@
"@changesets/changelog-github": "catalog:", "@changesets/changelog-github": "catalog:",
"@changesets/cli": "catalog:", "@changesets/cli": "catalog:",
"@playwright/test": "catalog:", "@playwright/test": "catalog:",
"@tsdown/css": "catalog:",
"@types/node": "catalog:", "@types/node": "catalog:",
"@vben/commitlint-config": "workspace:*", "@vben/commitlint-config": "workspace:*",
"@vben/eslint-config": "workspace:*", "@vben/eslint-config": "workspace:*",
@ -92,9 +93,10 @@
"playwright": "catalog:", "playwright": "catalog:",
"rimraf": "catalog:", "rimraf": "catalog:",
"tailwindcss": "catalog:", "tailwindcss": "catalog:",
"tsdown": "catalog:",
"turbo": "catalog:", "turbo": "catalog:",
"typescript": "catalog:", "typescript": "catalog:",
"unbuild": "catalog:", "unplugin-vue": "catalog:",
"vite": "catalog:", "vite": "catalog:",
"vitest": "catalog:", "vitest": "catalog:",
"vue": "catalog:", "vue": "catalog:",

2
packages/@core/base/design/package.json

@ -23,6 +23,7 @@
"exports": { "exports": {
"./bem": { "./bem": {
"development": "./src/scss-bem/bem.scss", "development": "./src/scss-bem/bem.scss",
"production": "./src/scss-bem/bem.scss",
"default": "./dist/bem.scss" "default": "./dist/bem.scss"
}, },
"./theme": { "./theme": {
@ -31,6 +32,7 @@
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"production": "./src/index.ts",
"default": "./dist/design.css" "default": "./dist/design.css"
} }
}, },

7
packages/@core/base/icons/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

3
packages/@core/base/icons/package.json

@ -11,7 +11,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "pnpm unbuild" "build": "pnpm exec tsdown"
}, },
"files": [ "files": [
"dist" "dist"
@ -22,6 +22,7 @@
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"production": "./src/index.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
}, },

11
packages/@core/base/icons/tsdown.config.ts

@ -0,0 +1,11 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
dts: true,
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
}),
});

14
packages/@core/base/shared/build.config.ts

@ -1,14 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: [
'src/store',
'src/constants/index',
'src/utils/index',
'src/color/index',
'src/cache/index',
'src/global-state',
],
});

10
packages/@core/base/shared/package.json

@ -11,8 +11,8 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "pnpm unbuild", "build": "pnpm exec tsdown",
"stub": "pnpm unbuild --stub" "stub": "pnpm run build"
}, },
"files": [ "files": [
"dist" "dist"
@ -22,31 +22,37 @@
"./constants": { "./constants": {
"types": "./src/constants/index.ts", "types": "./src/constants/index.ts",
"development": "./src/constants/index.ts", "development": "./src/constants/index.ts",
"production": "./src/constants/index.ts",
"default": "./dist/constants/index.mjs" "default": "./dist/constants/index.mjs"
}, },
"./utils": { "./utils": {
"types": "./src/utils/index.ts", "types": "./src/utils/index.ts",
"development": "./src/utils/index.ts", "development": "./src/utils/index.ts",
"production": "./src/utils/index.ts",
"default": "./dist/utils/index.mjs" "default": "./dist/utils/index.mjs"
}, },
"./color": { "./color": {
"types": "./src/color/index.ts", "types": "./src/color/index.ts",
"development": "./src/color/index.ts", "development": "./src/color/index.ts",
"production": "./src/color/index.ts",
"default": "./dist/color/index.mjs" "default": "./dist/color/index.mjs"
}, },
"./cache": { "./cache": {
"types": "./src/cache/index.ts", "types": "./src/cache/index.ts",
"development": "./src/cache/index.ts", "development": "./src/cache/index.ts",
"production": "./src/cache/index.ts",
"default": "./dist/cache/index.mjs" "default": "./dist/cache/index.mjs"
}, },
"./store": { "./store": {
"types": "./src/store.ts", "types": "./src/store.ts",
"development": "./src/store.ts", "development": "./src/store.ts",
"production": "./src/store.ts",
"default": "./dist/store.mjs" "default": "./dist/store.mjs"
}, },
"./global-state": { "./global-state": {
"types": "./src/global-state.ts", "types": "./src/global-state.ts",
"development": "./src/global-state.ts", "development": "./src/global-state.ts",
"production": "./src/global-state.ts",
"default": "./dist/global-state.mjs" "default": "./dist/global-state.mjs"
} }
}, },

4
packages/@core/base/shared/src/utils/__tests__/date.test.ts

@ -1,6 +1,6 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import timezone from 'dayjs/plugin/timezone'; import timezone from 'dayjs/plugin/timezone.js';
import utc from 'dayjs/plugin/utc'; import utc from 'dayjs/plugin/utc.js';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { import {

4
packages/@core/base/shared/src/utils/date.ts

@ -1,6 +1,6 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import timezone from 'dayjs/plugin/timezone'; import timezone from 'dayjs/plugin/timezone.js';
import utc from 'dayjs/plugin/utc'; import utc from 'dayjs/plugin/utc.js';
dayjs.extend(utc); dayjs.extend(utc);
dayjs.extend(timezone); dayjs.extend(timezone);

18
packages/@core/base/shared/tsdown.config.ts

@ -0,0 +1,18 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
dts: true,
entry: {
'cache/index': 'src/cache/index.ts',
'color/index': 'src/color/index.ts',
'constants/index': 'src/constants/index.ts',
'global-state': 'src/global-state.ts',
'store': 'src/store.ts',
'utils/index': 'src/utils/index.ts',
},
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
}),
});

7
packages/@core/base/typings/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

6
packages/@core/base/typings/package.json

@ -11,10 +11,11 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "pnpm unbuild" "build": "pnpm exec tsdown"
}, },
"files": [ "files": [
"dist" "dist",
"vue-router.d.ts"
], ],
"main": "./dist/index.mjs", "main": "./dist/index.mjs",
"module": "./dist/index.mjs", "module": "./dist/index.mjs",
@ -23,6 +24,7 @@
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"production": "./src/index.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
}, },
"./vue-router": { "./vue-router": {

11
packages/@core/base/typings/tsdown.config.ts

@ -0,0 +1,11 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
dts: true,
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
}),
});

2
packages/@core/base/typings/vue-router.d.ts

@ -1,5 +1,5 @@
/* eslint-disable no-restricted-imports */ /* eslint-disable no-restricted-imports */
import type { RouteMeta as IRouteMeta } from '@vben-core/typings'; import type { RouteMeta as IRouteMeta } from './dist/index.d.mts';
import 'vue-router'; import 'vue-router';

7
packages/@core/composables/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

3
packages/@core/composables/package.json

@ -11,7 +11,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "pnpm unbuild" "build": "pnpm exec tsdown"
}, },
"files": [ "files": [
"dist" "dist"
@ -23,6 +23,7 @@
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"production": "./src/index.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
}, },

11
packages/@core/composables/tsdown.config.ts

@ -0,0 +1,11 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
dts: true,
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
}),
});

7
packages/@core/preferences/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

17
packages/@core/preferences/package.json

@ -11,7 +11,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"#build": "pnpm unbuild" "#build": "pnpm exec tsdown"
}, },
"files": [ "files": [
"dist", "dist",
@ -20,12 +20,23 @@
"sideEffects": [ "sideEffects": [
"**/*.css" "**/*.css"
], ],
"main": "./dist/index.mjs",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": { "exports": {
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"default": "./src/index.ts", "production": "./src/index.ts",
"#default": "./dist/index.mjs" "default": "./dist/index.mjs"
}
},
"publishConfig": {
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.mjs"
}
} }
}, },
"dependencies": { "dependencies": {

11
packages/@core/preferences/tsdown.config.ts

@ -0,0 +1,11 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
dts: true,
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
}),
});

21
packages/@core/ui-kit/form-ui/build.config.ts

@ -1,21 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: [
{
builder: 'mkdist',
input: './src',
loaders: ['vue'],
pattern: ['**/*.vue'],
},
{
builder: 'mkdist',
format: 'esm',
input: './src',
loaders: ['js'],
pattern: ['**/*.ts'],
},
],
});

5
packages/@core/ui-kit/form-ui/package.json

@ -11,7 +11,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "pnpm unbuild", "build": "pnpm exec tsdown",
"prepublishOnly": "npm run build" "prepublishOnly": "npm run build"
}, },
"files": [ "files": [
@ -22,16 +22,19 @@
], ],
"main": "./dist/index.mjs", "main": "./dist/index.mjs",
"module": "./dist/index.mjs", "module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": { "exports": {
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"production": "./src/index.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
}, },
"publishConfig": { "publishConfig": {
"exports": { "exports": {
".": { ".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
} }

22
packages/@core/ui-kit/form-ui/tsdown.config.ts

@ -0,0 +1,22 @@
import Vue from 'unplugin-vue/rolldown';
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
deps: {
skipNodeModulesBundle: true,
},
dts: {
vue: true,
},
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
js: '.mjs',
}),
platform: 'neutral',
plugins: [Vue({ isProduction: true })],
unbundle: true,
});

21
packages/@core/ui-kit/layout-ui/build.config.ts

@ -1,21 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: [
{
builder: 'mkdist',
input: './src',
loaders: ['vue'],
pattern: ['**/*.vue'],
},
{
builder: 'mkdist',
format: 'esm',
input: './src',
loaders: ['js'],
pattern: ['**/*.ts'],
},
],
});

5
packages/@core/ui-kit/layout-ui/package.json

@ -11,7 +11,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "pnpm unbuild", "build": "pnpm exec tsdown",
"prepublishOnly": "npm run build" "prepublishOnly": "npm run build"
}, },
"files": [ "files": [
@ -22,16 +22,19 @@
], ],
"main": "./dist/index.mjs", "main": "./dist/index.mjs",
"module": "./dist/index.mjs", "module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": { "exports": {
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"production": "./src/index.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
}, },
"publishConfig": { "publishConfig": {
"exports": { "exports": {
".": { ".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
} }

22
packages/@core/ui-kit/layout-ui/tsdown.config.ts

@ -0,0 +1,22 @@
import Vue from 'unplugin-vue/rolldown';
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
deps: {
skipNodeModulesBundle: true,
},
dts: {
vue: true,
},
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
js: '.mjs',
}),
platform: 'neutral',
plugins: [Vue({ isProduction: true })],
unbundle: true,
});

26
packages/@core/ui-kit/menu-ui/build.config.ts

@ -1,26 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: [
{
builder: 'mkdist',
input: './src',
pattern: ['**/*'],
},
{
builder: 'mkdist',
input: './src',
loaders: ['vue'],
pattern: ['**/*.vue'],
},
{
builder: 'mkdist',
format: 'esm',
input: './src',
loaders: ['js'],
pattern: ['**/*.ts'],
},
],
});

5
packages/@core/ui-kit/menu-ui/package.json

@ -11,7 +11,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "pnpm unbuild", "build": "pnpm exec tsdown",
"prepublishOnly": "npm run build" "prepublishOnly": "npm run build"
}, },
"files": [ "files": [
@ -22,16 +22,19 @@
], ],
"main": "./dist/index.mjs", "main": "./dist/index.mjs",
"module": "./dist/index.mjs", "module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": { "exports": {
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"production": "./src/index.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
}, },
"publishConfig": { "publishConfig": {
"exports": { "exports": {
".": { ".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
} }

22
packages/@core/ui-kit/menu-ui/tsdown.config.ts

@ -0,0 +1,22 @@
import Vue from 'unplugin-vue/rolldown';
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
deps: {
skipNodeModulesBundle: true,
},
dts: {
vue: true,
},
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
js: '.mjs',
}),
platform: 'neutral',
plugins: [Vue({ isProduction: true })],
unbundle: true,
});

21
packages/@core/ui-kit/popup-ui/build.config.ts

@ -1,21 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: [
{
builder: 'mkdist',
input: './src',
loaders: ['vue'],
pattern: ['**/*.vue'],
},
{
builder: 'mkdist',
format: 'esm',
input: './src',
loaders: ['js'],
pattern: ['**/*.ts'],
},
],
});

5
packages/@core/ui-kit/popup-ui/package.json

@ -11,7 +11,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "pnpm unbuild", "build": "pnpm exec tsdown",
"prepublishOnly": "npm run build" "prepublishOnly": "npm run build"
}, },
"files": [ "files": [
@ -22,16 +22,19 @@
], ],
"main": "./dist/index.mjs", "main": "./dist/index.mjs",
"module": "./dist/index.mjs", "module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": { "exports": {
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"production": "./src/index.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
}, },
"publishConfig": { "publishConfig": {
"exports": { "exports": {
".": { ".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
} }

22
packages/@core/ui-kit/popup-ui/tsdown.config.ts

@ -0,0 +1,22 @@
import { defineConfig } from 'tsdown';
// eslint-disable-next-line n/no-extraneous-import
import Vue from 'unplugin-vue/rolldown';
export default defineConfig({
clean: true,
deps: {
skipNodeModulesBundle: true,
},
dts: {
vue: true,
},
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
js: '.mjs',
}),
platform: 'neutral',
plugins: [Vue({ isProduction: true })],
unbundle: true,
});

27
packages/@core/ui-kit/shadcn-ui/build.config.ts

@ -1,27 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: [
{
builder: 'mkdist',
input: './src',
pattern: ['**/*'],
},
{
builder: 'mkdist',
input: './src',
loaders: ['vue'],
pattern: ['**/*.vue'],
},
{
builder: 'mkdist',
format: 'esm',
input: './src',
loaders: ['js'],
pattern: ['**/*.ts'],
},
],
});

15
packages/@core/ui-kit/shadcn-ui/package.json

@ -1,8 +1,6 @@
{ {
"name": "@vben-core/shadcn-ui", "name": "@vben-core/shadcn-ui",
"version": "5.7.0", "version": "5.7.0",
"#main": "./dist/index.mjs",
"#module": "./dist/index.mjs",
"homepage": "https://github.com/vbenjs/vue-vben-admin", "homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": { "repository": {
@ -12,29 +10,28 @@
}, },
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": {
"#build": "pnpm unbuild",
"#prepublishOnly": "npm run build"
},
"files": [ "files": [
"dist" "components.json",
"src"
], ],
"sideEffects": [ "sideEffects": [
"**/*.css" "**/*.css"
], ],
"main": "./src/index.ts", "main": "./src/index.ts",
"module": "./src/index.ts", "module": "./src/index.ts",
"types": "./src/index.ts",
"exports": { "exports": {
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"default": "./src/index.ts", "default": "./src/index.ts"
"//default": "./dist/index.mjs"
} }
}, },
"publishConfig": { "publishConfig": {
"exports": { "exports": {
".": { ".": {
"types": "./src/index.ts",
"development": "./src/index.ts",
"default": "./src/index.ts" "default": "./src/index.ts"
} }
} }

5
packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue

@ -448,8 +448,9 @@ defineExpose({
} }
.item { .item {
@apply h-7.5 w-full box-border; box-sizing: border-box;
width: 100%;
height: 30px;
background-color: #f3f3f3; background-color: #f3f3f3;
border: 1px solid #666; border: 1px solid #666;
} }

21
packages/@core/ui-kit/tabs-ui/build.config.ts

@ -1,21 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: [
{
builder: 'mkdist',
input: './src',
loaders: ['vue'],
pattern: ['**/*.vue'],
},
{
builder: 'mkdist',
format: 'esm',
input: './src',
loaders: ['js'],
pattern: ['**/*.ts'],
},
],
});

5
packages/@core/ui-kit/tabs-ui/package.json

@ -11,7 +11,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "pnpm unbuild", "build": "pnpm exec tsdown",
"prepublishOnly": "npm run build" "prepublishOnly": "npm run build"
}, },
"files": [ "files": [
@ -22,16 +22,19 @@
], ],
"main": "./dist/index.mjs", "main": "./dist/index.mjs",
"module": "./dist/index.mjs", "module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": { "exports": {
".": { ".": {
"types": "./src/index.ts", "types": "./src/index.ts",
"development": "./src/index.ts", "development": "./src/index.ts",
"production": "./src/index.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
}, },
"publishConfig": { "publishConfig": {
"exports": { "exports": {
".": { ".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.mjs" "default": "./dist/index.mjs"
} }
} }

22
packages/@core/ui-kit/tabs-ui/tsdown.config.ts

@ -0,0 +1,22 @@
import { defineConfig } from 'tsdown';
// eslint-disable-next-line n/no-extraneous-import
import Vue from 'unplugin-vue/rolldown';
export default defineConfig({
clean: true,
deps: {
skipNodeModulesBundle: true,
},
dts: {
vue: true,
},
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
js: '.mjs',
}),
platform: 'neutral',
plugins: [Vue({ isProduction: true })],
unbundle: true,
});

7
pnpm-workspace.yaml

@ -46,6 +46,7 @@ catalog:
'@tailwindcss/vite': ^4.2.1 '@tailwindcss/vite': ^4.2.1
'@tanstack/vue-query': ^5.92.9 '@tanstack/vue-query': ^5.92.9
'@tanstack/vue-store': ^0.9.2 '@tanstack/vue-store': ^0.9.2
'@tsdown/css': ^0.21.3
'@types/archiver': ^7.0.0 '@types/archiver': ^7.0.0
'@types/html-minifier-terser': ^7.0.2 '@types/html-minifier-terser': ^7.0.2
'@types/json-bigint': ^1.0.4 '@types/json-bigint': ^1.0.4
@ -136,7 +137,6 @@ catalog:
reka-ui: ^2.9.2 reka-ui: ^2.9.2
resolve.exports: ^2.0.3 resolve.exports: ^2.0.3
rimraf: ^6.1.3 rimraf: ^6.1.3
rollup: ^4.59.0
rollup-plugin-visualizer: ^7.0.1 rollup-plugin-visualizer: ^7.0.1
sass: ^1.98.0 sass: ^1.98.0
sass-embedded: ^1.98.0 sass-embedded: ^1.98.0
@ -155,15 +155,16 @@ catalog:
tdesign-vue-next: ^1.18.5 tdesign-vue-next: ^1.18.5
theme-colors: ^0.1.0 theme-colors: ^0.1.0
tippy.js: ^6.3.7 tippy.js: ^6.3.7
tsdown: ^0.21.3
turbo: ^2.8.17 turbo: ^2.8.17
tw-animate-css: ^1.4.0 tw-animate-css: ^1.4.0
typescript: ^5.9.3 typescript: ^5.9.3
unbuild: ^3.6.1 unplugin-dts: ^1.0.0-beta.6
unplugin-element-plus: ^0.11.2 unplugin-element-plus: ^0.11.2
unplugin-vue: ^7.1.1
vee-validate: ^4.15.1 vee-validate: ^4.15.1
vite: ^8.0.0 vite: ^8.0.0
vite-plugin-compression: ^0.5.1 vite-plugin-compression: ^0.5.1
vite-plugin-dts: ^4.5.4
vite-plugin-html: ^3.2.2 vite-plugin-html: ^3.2.2
vite-plugin-lazy-import: ^1.0.7 vite-plugin-lazy-import: ^1.0.7
vite-plugin-pwa: ^1.2.0 vite-plugin-pwa: ^1.2.0

7
scripts/turbo-run/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

2
scripts/turbo-run/package.json

@ -5,7 +5,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"stub": "pnpm unbuild --stub" "stub": "pnpm exec tsdown"
}, },
"files": [ "files": [
"dist" "dist"

11
scripts/turbo-run/tsdown.config.ts

@ -0,0 +1,11 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
dts: true,
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
}),
});

7
scripts/vsh/build.config.ts

@ -1,7 +0,0 @@
import { defineBuildConfig } from 'unbuild';
export default defineBuildConfig({
clean: true,
declaration: true,
entries: ['src/index'],
});

2
scripts/vsh/package.json

@ -5,7 +5,7 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"stub": "pnpm unbuild --stub" "stub": "pnpm exec tsdown"
}, },
"files": [ "files": [
"dist" "dist"

67
scripts/vsh/src/check-circular/index.ts

@ -1,10 +1,15 @@
import type { CAC } from 'cac'; import type { CAC } from 'cac';
import { extname } from 'node:path'; import { access, mkdtemp, readFile, rm } from 'node:fs/promises';
import { createRequire } from 'node:module';
import { tmpdir } from 'node:os';
import { extname, join } from 'node:path';
import { getStagedFiles } from '@vben/node-utils'; import { execa, getStagedFiles } from '@vben/node-utils';
import { circularDepsDetect } from 'circular-dependency-scanner'; const require = createRequire(import.meta.url);
const circularScannerCli =
require.resolve('circular-dependency-scanner/dist/cli.js');
// 默认配置 // 默认配置
const DEFAULT_CONFIG = { const DEFAULT_CONFIG = {
@ -41,6 +46,44 @@ interface CommandOptions {
// 缓存机制 // 缓存机制
const cache = new Map<string, CircularDependencyResult[]>(); const cache = new Map<string, CircularDependencyResult[]>();
async function detectCircularDependencies({
cwd,
ignorePattern,
staged,
}: {
cwd: string;
ignorePattern: string;
staged: boolean;
}): Promise<CircularDependencyResult[]> {
const tempDir = await mkdtemp(join(tmpdir(), 'vsh-check-circular-'));
const outputFile = join(tempDir, 'circles.json');
try {
const args = [circularScannerCli, cwd, '--output', outputFile];
if (staged) {
args.push('--absolute');
}
args.push('--ignore', ignorePattern);
await execa(process.execPath, args, {
cwd,
});
await access(outputFile);
const output = await readFile(outputFile, 'utf8');
return JSON.parse(output) as CircularDependencyResult[];
} catch (error) {
if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') {
return [];
}
throw error;
} finally {
await rm(tempDir, { force: true, recursive: true });
}
}
/** /**
* *
* @param circles - * @param circles -
@ -85,17 +128,17 @@ async function checkCircular({
const cacheKey = `${staged}-${process.cwd()}-${ignorePattern}`; const cacheKey = `${staged}-${process.cwd()}-${ignorePattern}`;
if (cache.has(cacheKey)) { if (cache.has(cacheKey)) {
const cachedResults = cache.get(cacheKey); const cachedResults = cache.get(cacheKey);
if (cachedResults) { if (cachedResults && verbose) {
verbose && formatCircles(cachedResults); formatCircles(cachedResults);
} }
return; return;
} }
// 检测循环依赖 // 检测循环依赖
const results = await circularDepsDetect({ const results = await detectCircularDependencies({
absolute: staged,
cwd: process.cwd(), cwd: process.cwd(),
ignore: [ignorePattern], ignorePattern,
staged,
}); });
if (staged) { if (staged) {
@ -118,11 +161,15 @@ async function checkCircular({
// 更新缓存 // 更新缓存
cache.set(cacheKey, circularFiles); cache.set(cacheKey, circularFiles);
verbose && formatCircles(circularFiles); if (verbose) {
formatCircles(circularFiles);
}
} else { } else {
// 更新缓存 // 更新缓存
cache.set(cacheKey, results); cache.set(cacheKey, results);
verbose && formatCircles(results); if (verbose) {
formatCircles(results);
}
} }
// 如果发现循环依赖,只输出警告信息 // 如果发现循环依赖,只输出警告信息

2
scripts/vsh/src/check-dep/index.ts

@ -10,7 +10,7 @@ const DEFAULT_CONFIG = {
ignoreMatches: [ ignoreMatches: [
'vite', 'vite',
'vitest', 'vitest',
'unbuild', 'tsdown',
'@vben/tsconfig', '@vben/tsconfig',
'@vben/vite-config', '@vben/vite-config',
'@types/*', '@types/*',

11
scripts/vsh/tsdown.config.ts

@ -0,0 +1,11 @@
import { defineConfig } from 'tsdown';
export default defineConfig({
clean: true,
dts: true,
entry: ['src/index.ts'],
format: ['esm'],
outExtensions: () => ({
dts: '.d.ts',
}),
});
Loading…
Cancel
Save