diff --git a/cspell.json b/cspell.json index f1071a848..c53d1cc51 100644 --- a/cspell.json +++ b/cspell.json @@ -60,6 +60,7 @@ "tabler", "taze", "tdesign", + "tsdown", "tsgolint", "turborepo", "ui-kit", diff --git a/internal/lint-configs/eslint-config/build.config.ts b/internal/lint-configs/eslint-config/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/internal/lint-configs/eslint-config/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/internal/lint-configs/eslint-config/package.json b/internal/lint-configs/eslint-config/package.json index db7f699ac..c0ce7615f 100644 --- a/internal/lint-configs/eslint-config/package.json +++ b/internal/lint-configs/eslint-config/package.json @@ -12,7 +12,7 @@ "license": "MIT", "type": "module", "scripts": { - "stub": "pnpm unbuild --stub" + "stub": "pnpm exec tsdown" }, "files": [ "dist" @@ -27,12 +27,10 @@ } }, "dependencies": { - "@vben/oxlint-config": "workspace:*" - }, - "devDependencies": { "@eslint/js": "catalog:", "@typescript-eslint/eslint-plugin": "catalog:", "@typescript-eslint/parser": "catalog:", + "@vben/oxlint-config": "workspace:*", "eslint": "catalog:", "eslint-plugin-jsonc": "catalog:", "eslint-plugin-n": "catalog:", diff --git a/internal/lint-configs/eslint-config/src/configs/node.ts b/internal/lint-configs/eslint-config/src/configs/node.ts index 65f81fd53..721bd5a0a 100644 --- a/internal/lint-configs/eslint-config/src/configs/node.ts +++ b/internal/lint-configs/eslint-config/src/configs/node.ts @@ -17,7 +17,7 @@ export async function node(): Promise { 'error', { allowModules: [ - 'unbuild', + 'tsdown', '@vben/vite-config', 'vitest', 'vite', diff --git a/internal/lint-configs/eslint-config/tsdown.config.ts b/internal/lint-configs/eslint-config/tsdown.config.ts new file mode 100644 index 000000000..a7a8ce27f --- /dev/null +++ b/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', + }), +}); diff --git a/internal/lint-configs/oxfmt-config/build.config.ts b/internal/lint-configs/oxfmt-config/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/internal/lint-configs/oxfmt-config/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/internal/lint-configs/oxfmt-config/package.json b/internal/lint-configs/oxfmt-config/package.json index 3e016797e..c239c026b 100644 --- a/internal/lint-configs/oxfmt-config/package.json +++ b/internal/lint-configs/oxfmt-config/package.json @@ -12,7 +12,7 @@ "license": "MIT", "type": "module", "scripts": { - "stub": "pnpm unbuild --stub" + "stub": "pnpm exec tsdown" }, "files": [ "dist" diff --git a/internal/lint-configs/oxfmt-config/src/index.ts b/internal/lint-configs/oxfmt-config/src/index.ts index 5f88c1809..edce2504a 100644 --- a/internal/lint-configs/oxfmt-config/src/index.ts +++ b/internal/lint-configs/oxfmt-config/src/index.ts @@ -2,7 +2,7 @@ import { defineConfig as defineOxfmtConfig } from 'oxfmt'; type OxfmtConfig = Parameters[0]; -const oxfmtConfig = defineOxfmtConfig({ +const oxfmtConfig: OxfmtConfig = defineOxfmtConfig({ printWidth: 80, proseWrap: 'never', semi: true, @@ -28,7 +28,7 @@ const oxfmtConfig = defineOxfmtConfig({ ], }); -function defineConfig(config: OxfmtConfig = {}) { +function defineConfig(config: OxfmtConfig = {}): OxfmtConfig { return defineOxfmtConfig({ ...oxfmtConfig, ...config, diff --git a/internal/lint-configs/oxfmt-config/tsdown.config.ts b/internal/lint-configs/oxfmt-config/tsdown.config.ts new file mode 100644 index 000000000..c4f51c5ee --- /dev/null +++ b/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', + }), +}); diff --git a/internal/lint-configs/oxlint-config/build.config.ts b/internal/lint-configs/oxlint-config/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/internal/lint-configs/oxlint-config/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/internal/lint-configs/oxlint-config/package.json b/internal/lint-configs/oxlint-config/package.json index 05d3bedfe..bc20762fe 100644 --- a/internal/lint-configs/oxlint-config/package.json +++ b/internal/lint-configs/oxlint-config/package.json @@ -12,7 +12,7 @@ "license": "MIT", "type": "module", "scripts": { - "stub": "pnpm unbuild --stub" + "stub": "pnpm exec tsdown" }, "files": [ "dist" diff --git a/internal/lint-configs/oxlint-config/tsdown.config.ts b/internal/lint-configs/oxlint-config/tsdown.config.ts new file mode 100644 index 000000000..c4f51c5ee --- /dev/null +++ b/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', + }), +}); diff --git a/internal/node-utils/build.config.ts b/internal/node-utils/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/internal/node-utils/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/internal/node-utils/package.json b/internal/node-utils/package.json index 40a017f14..35892a118 100644 --- a/internal/node-utils/package.json +++ b/internal/node-utils/package.json @@ -12,7 +12,7 @@ "license": "MIT", "type": "module", "scripts": { - "stub": "pnpm unbuild --stub" + "stub": "node ./scripts/build.mjs" }, "files": [ "dist" @@ -22,7 +22,7 @@ "types": "./dist/index.d.ts", "exports": { ".": { - "types": "./src/index.ts", + "types": "./dist/index.d.ts", "import": "./dist/index.mjs", "default": "./dist/index.mjs" } diff --git a/internal/node-utils/scripts/build.mjs b/internal/node-utils/scripts/build.mjs new file mode 100644 index 000000000..c38b4914c --- /dev/null +++ b/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); + } +} diff --git a/internal/node-utils/src/date.ts b/internal/node-utils/src/date.ts index d36572d97..7b11583f3 100644 --- a/internal/node-utils/src/date.ts +++ b/internal/node-utils/src/date.ts @@ -1,6 +1,6 @@ import dayjs from 'dayjs'; -import timezone from 'dayjs/plugin/timezone'; -import utc from 'dayjs/plugin/utc'; +import timezone from 'dayjs/plugin/timezone.js'; +import utc from 'dayjs/plugin/utc.js'; dayjs.extend(utc); dayjs.extend(timezone); diff --git a/internal/node-utils/src/monorepo.ts b/internal/node-utils/src/monorepo.ts index b6373e78b..33246c683 100644 --- a/internal/node-utils/src/monorepo.ts +++ b/internal/node-utils/src/monorepo.ts @@ -1,21 +1,31 @@ -import { dirname } from 'node:path'; +import type { Package } from '@manypkg/get-packages'; -import { - getPackages as getPackagesFunc, - getPackagesSync as getPackagesSyncFunc, -} from '@manypkg/get-packages'; -import { findUpSync } from 'find-up'; +import { existsSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; + +import * as manypkg from '@manypkg/get-packages'; +const { getPackages: getPackagesFunc, getPackagesSync: getPackagesSyncFunc } = + manypkg; /** * 查找大仓的根目录 * @param cwd */ function findMonorepoRoot(cwd: string = process.cwd()) { - const lockFile = findUpSync('pnpm-lock.yaml', { - cwd, - type: 'file', - }); - return dirname(lockFile || ''); + let currentDir = resolve(cwd); + + while (true) { + if (existsSync(join(currentDir, 'pnpm-lock.yaml'))) { + return currentDir; + } + + const parentDir = dirname(currentDir); + if (parentDir === currentDir) { + return ''; + } + + currentDir = parentDir; + } } /** @@ -40,7 +50,7 @@ async function getPackages() { */ async function getPackage(pkgName: string) { 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 }; diff --git a/internal/node-utils/tsconfig.build.json b/internal/node-utils/tsconfig.build.json new file mode 100644 index 000000000..b62e0ab6b --- /dev/null +++ b/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__"] +} diff --git a/internal/node-utils/tsdown.config.ts b/internal/node-utils/tsdown.config.ts new file mode 100644 index 000000000..4a607e00c --- /dev/null +++ b/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'], +}); diff --git a/internal/vite-config/build.config.ts b/internal/vite-config/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/internal/vite-config/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/internal/vite-config/package.json b/internal/vite-config/package.json index d8e87d11b..b420f14fa 100644 --- a/internal/vite-config/package.json +++ b/internal/vite-config/package.json @@ -12,7 +12,7 @@ "license": "MIT", "type": "module", "scripts": { - "stub": "pnpm unbuild --stub" + "stub": "pnpm exec tsdown" }, "files": [ "dist" @@ -30,6 +30,7 @@ "@intlify/unplugin-vue-i18n": "catalog:", "@jspm/generator": "catalog:", "@tailwindcss/vite": "catalog:", + "@vben/node-utils": "workspace:*", "archiver": "catalog:", "cheerio": "catalog:", "get-port": "catalog:", @@ -43,18 +44,16 @@ "@pnpm/workspace.read-manifest": "catalog:", "@types/archiver": "catalog:", "@types/html-minifier-terser": "catalog:", - "@vben/node-utils": "workspace:*", "@vitejs/plugin-vue": "catalog:", "@vitejs/plugin-vue-jsx": "catalog:", "dayjs": "catalog:", "dotenv": "catalog:", - "rollup": "catalog:", "rollup-plugin-visualizer": "catalog:", "sass": "catalog:", "sass-embedded": "catalog:", + "unplugin-dts": "catalog:", "vite": "catalog:", "vite-plugin-compression": "catalog:", - "vite-plugin-dts": "catalog:", "vite-plugin-html": "catalog:", "vite-plugin-lazy-import": "catalog:" } diff --git a/internal/vite-config/src/plugins/index.ts b/internal/vite-config/src/plugins/index.ts index 114d4d837..9d3ba3f1c 100644 --- a/internal/vite-config/src/plugins/index.ts +++ b/internal/vite-config/src/plugins/index.ts @@ -12,8 +12,8 @@ import tailwindcss from '@tailwindcss/vite'; import viteVue from '@vitejs/plugin-vue'; import viteVueJsx from '@vitejs/plugin-vue-jsx'; import { visualizer as viteVisualizerPlugin } from 'rollup-plugin-visualizer'; +import viteDtsPlugin from 'unplugin-dts/vite'; import viteCompressPlugin from 'vite-plugin-compression'; -import viteDtsPlugin from 'vite-plugin-dts'; import { createHtmlPlugin as viteHtmlPlugin } from 'vite-plugin-html'; import { VitePWA } from 'vite-plugin-pwa'; import viteVueDevTools from 'vite-plugin-vue-devtools'; @@ -231,12 +231,13 @@ async function loadLibraryPlugins( // 单独取,否则commonOptions拿不到 const isBuild = options.isBuild; const { dts, ...commonOptions } = options; + const dtsOptions = typeof dts === 'object' ? dts : undefined; const commonPlugins = await loadCommonPlugins(commonOptions); return await loadConditionPlugins([ ...commonPlugins, { condition: isBuild && !!dts, - plugins: () => [viteDtsPlugin({ logLevel: 'error' })], + plugins: () => [viteDtsPlugin(dtsOptions)], }, ]); } diff --git a/internal/vite-config/src/typing.ts b/internal/vite-config/src/typing.ts index 2dd048306..376b47b8a 100644 --- a/internal/vite-config/src/typing.ts +++ b/internal/vite-config/src/typing.ts @@ -1,11 +1,11 @@ import type { PluginVisualizerOptions } from 'rollup-plugin-visualizer'; +import type { PluginOptions } from 'unplugin-dts'; import type { ConfigEnv, PluginOption, UserConfig, UserConfigFnPromise, } from 'vite'; -import type { PluginOptions } from 'vite-plugin-dts'; import type { Options as PwaPluginOptions } from 'vite-plugin-pwa'; /** diff --git a/internal/vite-config/tsdown.config.ts b/internal/vite-config/tsdown.config.ts new file mode 100644 index 000000000..de7727b06 --- /dev/null +++ b/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', + }), +}); diff --git a/package.json b/package.json index 43531f182..e80894d31 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "@changesets/changelog-github": "catalog:", "@changesets/cli": "catalog:", "@playwright/test": "catalog:", + "@tsdown/css": "catalog:", "@types/node": "catalog:", "@vben/commitlint-config": "workspace:*", "@vben/eslint-config": "workspace:*", @@ -92,9 +93,10 @@ "playwright": "catalog:", "rimraf": "catalog:", "tailwindcss": "catalog:", + "tsdown": "catalog:", "turbo": "catalog:", "typescript": "catalog:", - "unbuild": "catalog:", + "unplugin-vue": "catalog:", "vite": "catalog:", "vitest": "catalog:", "vue": "catalog:", diff --git a/packages/@core/base/design/package.json b/packages/@core/base/design/package.json index 071049c80..e5a6d6e83 100644 --- a/packages/@core/base/design/package.json +++ b/packages/@core/base/design/package.json @@ -23,6 +23,7 @@ "exports": { "./bem": { "development": "./src/scss-bem/bem.scss", + "production": "./src/scss-bem/bem.scss", "default": "./dist/bem.scss" }, "./theme": { @@ -31,6 +32,7 @@ ".": { "types": "./src/index.ts", "development": "./src/index.ts", + "production": "./src/index.ts", "default": "./dist/design.css" } }, diff --git a/packages/@core/base/icons/build.config.ts b/packages/@core/base/icons/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/packages/@core/base/icons/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/packages/@core/base/icons/package.json b/packages/@core/base/icons/package.json index 0161ed482..558a5b7ca 100644 --- a/packages/@core/base/icons/package.json +++ b/packages/@core/base/icons/package.json @@ -11,7 +11,7 @@ "license": "MIT", "type": "module", "scripts": { - "build": "pnpm unbuild" + "build": "pnpm exec tsdown" }, "files": [ "dist" @@ -22,6 +22,7 @@ ".": { "types": "./src/index.ts", "development": "./src/index.ts", + "production": "./src/index.ts", "default": "./dist/index.mjs" } }, diff --git a/packages/@core/base/icons/tsdown.config.ts b/packages/@core/base/icons/tsdown.config.ts new file mode 100644 index 000000000..c4f51c5ee --- /dev/null +++ b/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', + }), +}); diff --git a/packages/@core/base/shared/build.config.ts b/packages/@core/base/shared/build.config.ts deleted file mode 100644 index 98e2209fe..000000000 --- a/packages/@core/base/shared/build.config.ts +++ /dev/null @@ -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', - ], -}); diff --git a/packages/@core/base/shared/package.json b/packages/@core/base/shared/package.json index e48de9a27..61fa032d0 100644 --- a/packages/@core/base/shared/package.json +++ b/packages/@core/base/shared/package.json @@ -11,8 +11,8 @@ "license": "MIT", "type": "module", "scripts": { - "build": "pnpm unbuild", - "stub": "pnpm unbuild --stub" + "build": "pnpm exec tsdown", + "stub": "pnpm run build" }, "files": [ "dist" @@ -22,31 +22,37 @@ "./constants": { "types": "./src/constants/index.ts", "development": "./src/constants/index.ts", + "production": "./src/constants/index.ts", "default": "./dist/constants/index.mjs" }, "./utils": { "types": "./src/utils/index.ts", "development": "./src/utils/index.ts", + "production": "./src/utils/index.ts", "default": "./dist/utils/index.mjs" }, "./color": { "types": "./src/color/index.ts", "development": "./src/color/index.ts", + "production": "./src/color/index.ts", "default": "./dist/color/index.mjs" }, "./cache": { "types": "./src/cache/index.ts", "development": "./src/cache/index.ts", + "production": "./src/cache/index.ts", "default": "./dist/cache/index.mjs" }, "./store": { "types": "./src/store.ts", "development": "./src/store.ts", + "production": "./src/store.ts", "default": "./dist/store.mjs" }, "./global-state": { "types": "./src/global-state.ts", "development": "./src/global-state.ts", + "production": "./src/global-state.ts", "default": "./dist/global-state.mjs" } }, diff --git a/packages/@core/base/shared/src/utils/__tests__/date.test.ts b/packages/@core/base/shared/src/utils/__tests__/date.test.ts index 46a27c588..dc8a9e88d 100644 --- a/packages/@core/base/shared/src/utils/__tests__/date.test.ts +++ b/packages/@core/base/shared/src/utils/__tests__/date.test.ts @@ -1,6 +1,6 @@ import dayjs from 'dayjs'; -import timezone from 'dayjs/plugin/timezone'; -import utc from 'dayjs/plugin/utc'; +import timezone from 'dayjs/plugin/timezone.js'; +import utc from 'dayjs/plugin/utc.js'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { diff --git a/packages/@core/base/shared/src/utils/date.ts b/packages/@core/base/shared/src/utils/date.ts index 926050d11..c68c33850 100644 --- a/packages/@core/base/shared/src/utils/date.ts +++ b/packages/@core/base/shared/src/utils/date.ts @@ -1,6 +1,6 @@ import dayjs from 'dayjs'; -import timezone from 'dayjs/plugin/timezone'; -import utc from 'dayjs/plugin/utc'; +import timezone from 'dayjs/plugin/timezone.js'; +import utc from 'dayjs/plugin/utc.js'; dayjs.extend(utc); dayjs.extend(timezone); diff --git a/packages/@core/base/shared/tsdown.config.ts b/packages/@core/base/shared/tsdown.config.ts new file mode 100644 index 000000000..d83605cad --- /dev/null +++ b/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', + }), +}); diff --git a/packages/@core/base/typings/build.config.ts b/packages/@core/base/typings/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/packages/@core/base/typings/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/packages/@core/base/typings/package.json b/packages/@core/base/typings/package.json index 73b346385..b90f3df25 100644 --- a/packages/@core/base/typings/package.json +++ b/packages/@core/base/typings/package.json @@ -11,10 +11,11 @@ "license": "MIT", "type": "module", "scripts": { - "build": "pnpm unbuild" + "build": "pnpm exec tsdown" }, "files": [ - "dist" + "dist", + "vue-router.d.ts" ], "main": "./dist/index.mjs", "module": "./dist/index.mjs", @@ -23,6 +24,7 @@ ".": { "types": "./src/index.ts", "development": "./src/index.ts", + "production": "./src/index.ts", "default": "./dist/index.mjs" }, "./vue-router": { diff --git a/packages/@core/base/typings/tsdown.config.ts b/packages/@core/base/typings/tsdown.config.ts new file mode 100644 index 000000000..c4f51c5ee --- /dev/null +++ b/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', + }), +}); diff --git a/packages/@core/base/typings/vue-router.d.ts b/packages/@core/base/typings/vue-router.d.ts index 4874bcd75..8ea588602 100644 --- a/packages/@core/base/typings/vue-router.d.ts +++ b/packages/@core/base/typings/vue-router.d.ts @@ -1,5 +1,5 @@ /* 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'; diff --git a/packages/@core/composables/build.config.ts b/packages/@core/composables/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/packages/@core/composables/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/packages/@core/composables/package.json b/packages/@core/composables/package.json index a541a6bea..de58e59ff 100644 --- a/packages/@core/composables/package.json +++ b/packages/@core/composables/package.json @@ -11,7 +11,7 @@ "license": "MIT", "type": "module", "scripts": { - "build": "pnpm unbuild" + "build": "pnpm exec tsdown" }, "files": [ "dist" @@ -23,6 +23,7 @@ ".": { "types": "./src/index.ts", "development": "./src/index.ts", + "production": "./src/index.ts", "default": "./dist/index.mjs" } }, diff --git a/packages/@core/composables/tsdown.config.ts b/packages/@core/composables/tsdown.config.ts new file mode 100644 index 000000000..c4f51c5ee --- /dev/null +++ b/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', + }), +}); diff --git a/packages/@core/preferences/build.config.ts b/packages/@core/preferences/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/packages/@core/preferences/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/packages/@core/preferences/package.json b/packages/@core/preferences/package.json index fd859bee9..3a92f9264 100644 --- a/packages/@core/preferences/package.json +++ b/packages/@core/preferences/package.json @@ -11,7 +11,7 @@ "license": "MIT", "type": "module", "scripts": { - "#build": "pnpm unbuild" + "#build": "pnpm exec tsdown" }, "files": [ "dist", @@ -20,12 +20,23 @@ "sideEffects": [ "**/*.css" ], + "main": "./dist/index.mjs", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./src/index.ts", "development": "./src/index.ts", - "default": "./src/index.ts", - "#default": "./dist/index.mjs" + "production": "./src/index.ts", + "default": "./dist/index.mjs" + } + }, + "publishConfig": { + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.mjs" + } } }, "dependencies": { diff --git a/packages/@core/preferences/tsdown.config.ts b/packages/@core/preferences/tsdown.config.ts new file mode 100644 index 000000000..c4f51c5ee --- /dev/null +++ b/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', + }), +}); diff --git a/packages/@core/ui-kit/form-ui/build.config.ts b/packages/@core/ui-kit/form-ui/build.config.ts deleted file mode 100644 index 18eaa604c..000000000 --- a/packages/@core/ui-kit/form-ui/build.config.ts +++ /dev/null @@ -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'], - }, - ], -}); diff --git a/packages/@core/ui-kit/form-ui/package.json b/packages/@core/ui-kit/form-ui/package.json index 7ea3b3ace..f79c2a169 100644 --- a/packages/@core/ui-kit/form-ui/package.json +++ b/packages/@core/ui-kit/form-ui/package.json @@ -11,7 +11,7 @@ "license": "MIT", "type": "module", "scripts": { - "build": "pnpm unbuild", + "build": "pnpm exec tsdown", "prepublishOnly": "npm run build" }, "files": [ @@ -22,16 +22,19 @@ ], "main": "./dist/index.mjs", "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./src/index.ts", "development": "./src/index.ts", + "production": "./src/index.ts", "default": "./dist/index.mjs" } }, "publishConfig": { "exports": { ".": { + "types": "./dist/index.d.ts", "default": "./dist/index.mjs" } } diff --git a/packages/@core/ui-kit/form-ui/tsdown.config.ts b/packages/@core/ui-kit/form-ui/tsdown.config.ts new file mode 100644 index 000000000..b5bde2fdd --- /dev/null +++ b/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, +}); diff --git a/packages/@core/ui-kit/layout-ui/build.config.ts b/packages/@core/ui-kit/layout-ui/build.config.ts deleted file mode 100644 index 18eaa604c..000000000 --- a/packages/@core/ui-kit/layout-ui/build.config.ts +++ /dev/null @@ -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'], - }, - ], -}); diff --git a/packages/@core/ui-kit/layout-ui/package.json b/packages/@core/ui-kit/layout-ui/package.json index 9554b4bac..efeba2269 100644 --- a/packages/@core/ui-kit/layout-ui/package.json +++ b/packages/@core/ui-kit/layout-ui/package.json @@ -11,7 +11,7 @@ "license": "MIT", "type": "module", "scripts": { - "build": "pnpm unbuild", + "build": "pnpm exec tsdown", "prepublishOnly": "npm run build" }, "files": [ @@ -22,16 +22,19 @@ ], "main": "./dist/index.mjs", "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./src/index.ts", "development": "./src/index.ts", + "production": "./src/index.ts", "default": "./dist/index.mjs" } }, "publishConfig": { "exports": { ".": { + "types": "./dist/index.d.ts", "default": "./dist/index.mjs" } } diff --git a/packages/@core/ui-kit/layout-ui/tsdown.config.ts b/packages/@core/ui-kit/layout-ui/tsdown.config.ts new file mode 100644 index 000000000..b5bde2fdd --- /dev/null +++ b/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, +}); diff --git a/packages/@core/ui-kit/menu-ui/build.config.ts b/packages/@core/ui-kit/menu-ui/build.config.ts deleted file mode 100644 index 1ff78fabb..000000000 --- a/packages/@core/ui-kit/menu-ui/build.config.ts +++ /dev/null @@ -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'], - }, - ], -}); diff --git a/packages/@core/ui-kit/menu-ui/package.json b/packages/@core/ui-kit/menu-ui/package.json index dfb3fabe1..a1dbc1b2a 100644 --- a/packages/@core/ui-kit/menu-ui/package.json +++ b/packages/@core/ui-kit/menu-ui/package.json @@ -11,7 +11,7 @@ "license": "MIT", "type": "module", "scripts": { - "build": "pnpm unbuild", + "build": "pnpm exec tsdown", "prepublishOnly": "npm run build" }, "files": [ @@ -22,16 +22,19 @@ ], "main": "./dist/index.mjs", "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./src/index.ts", "development": "./src/index.ts", + "production": "./src/index.ts", "default": "./dist/index.mjs" } }, "publishConfig": { "exports": { ".": { + "types": "./dist/index.d.ts", "default": "./dist/index.mjs" } } diff --git a/packages/@core/ui-kit/menu-ui/tsdown.config.ts b/packages/@core/ui-kit/menu-ui/tsdown.config.ts new file mode 100644 index 000000000..b5bde2fdd --- /dev/null +++ b/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, +}); diff --git a/packages/@core/ui-kit/popup-ui/build.config.ts b/packages/@core/ui-kit/popup-ui/build.config.ts deleted file mode 100644 index 18eaa604c..000000000 --- a/packages/@core/ui-kit/popup-ui/build.config.ts +++ /dev/null @@ -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'], - }, - ], -}); diff --git a/packages/@core/ui-kit/popup-ui/package.json b/packages/@core/ui-kit/popup-ui/package.json index fb885d3a5..0e384cbf3 100644 --- a/packages/@core/ui-kit/popup-ui/package.json +++ b/packages/@core/ui-kit/popup-ui/package.json @@ -11,7 +11,7 @@ "license": "MIT", "type": "module", "scripts": { - "build": "pnpm unbuild", + "build": "pnpm exec tsdown", "prepublishOnly": "npm run build" }, "files": [ @@ -22,16 +22,19 @@ ], "main": "./dist/index.mjs", "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./src/index.ts", "development": "./src/index.ts", + "production": "./src/index.ts", "default": "./dist/index.mjs" } }, "publishConfig": { "exports": { ".": { + "types": "./dist/index.d.ts", "default": "./dist/index.mjs" } } diff --git a/packages/@core/ui-kit/popup-ui/tsdown.config.ts b/packages/@core/ui-kit/popup-ui/tsdown.config.ts new file mode 100644 index 000000000..3bbe38d1d --- /dev/null +++ b/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, +}); diff --git a/packages/@core/ui-kit/shadcn-ui/build.config.ts b/packages/@core/ui-kit/shadcn-ui/build.config.ts deleted file mode 100644 index aec93408a..000000000 --- a/packages/@core/ui-kit/shadcn-ui/build.config.ts +++ /dev/null @@ -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'], - }, - ], -}); diff --git a/packages/@core/ui-kit/shadcn-ui/package.json b/packages/@core/ui-kit/shadcn-ui/package.json index f4f0136a1..b49b7ab5c 100644 --- a/packages/@core/ui-kit/shadcn-ui/package.json +++ b/packages/@core/ui-kit/shadcn-ui/package.json @@ -1,8 +1,6 @@ { "name": "@vben-core/shadcn-ui", "version": "5.7.0", - "#main": "./dist/index.mjs", - "#module": "./dist/index.mjs", "homepage": "https://github.com/vbenjs/vue-vben-admin", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "repository": { @@ -12,29 +10,28 @@ }, "license": "MIT", "type": "module", - "scripts": { - "#build": "pnpm unbuild", - "#prepublishOnly": "npm run build" - }, "files": [ - "dist" + "components.json", + "src" ], "sideEffects": [ "**/*.css" ], "main": "./src/index.ts", "module": "./src/index.ts", + "types": "./src/index.ts", "exports": { ".": { "types": "./src/index.ts", "development": "./src/index.ts", - "default": "./src/index.ts", - "//default": "./dist/index.mjs" + "default": "./src/index.ts" } }, "publishConfig": { "exports": { ".": { + "types": "./src/index.ts", + "development": "./src/index.ts", "default": "./src/index.ts" } } diff --git a/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue b/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue index f4f7ffa47..9dc784334 100644 --- a/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue +++ b/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue @@ -448,8 +448,9 @@ defineExpose({ } .item { - @apply h-7.5 w-full box-border; - + box-sizing: border-box; + width: 100%; + height: 30px; background-color: #f3f3f3; border: 1px solid #666; } diff --git a/packages/@core/ui-kit/tabs-ui/build.config.ts b/packages/@core/ui-kit/tabs-ui/build.config.ts deleted file mode 100644 index 18eaa604c..000000000 --- a/packages/@core/ui-kit/tabs-ui/build.config.ts +++ /dev/null @@ -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'], - }, - ], -}); diff --git a/packages/@core/ui-kit/tabs-ui/package.json b/packages/@core/ui-kit/tabs-ui/package.json index c436122a9..23e37f0a4 100644 --- a/packages/@core/ui-kit/tabs-ui/package.json +++ b/packages/@core/ui-kit/tabs-ui/package.json @@ -11,7 +11,7 @@ "license": "MIT", "type": "module", "scripts": { - "build": "pnpm unbuild", + "build": "pnpm exec tsdown", "prepublishOnly": "npm run build" }, "files": [ @@ -22,16 +22,19 @@ ], "main": "./dist/index.mjs", "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./src/index.ts", "development": "./src/index.ts", + "production": "./src/index.ts", "default": "./dist/index.mjs" } }, "publishConfig": { "exports": { ".": { + "types": "./dist/index.d.ts", "default": "./dist/index.mjs" } } diff --git a/packages/@core/ui-kit/tabs-ui/tsdown.config.ts b/packages/@core/ui-kit/tabs-ui/tsdown.config.ts new file mode 100644 index 000000000..3bbe38d1d --- /dev/null +++ b/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, +}); diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8834fc621..9db67088c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -46,6 +46,7 @@ catalog: '@tailwindcss/vite': ^4.2.1 '@tanstack/vue-query': ^5.92.9 '@tanstack/vue-store': ^0.9.2 + '@tsdown/css': ^0.21.3 '@types/archiver': ^7.0.0 '@types/html-minifier-terser': ^7.0.2 '@types/json-bigint': ^1.0.4 @@ -136,7 +137,6 @@ catalog: reka-ui: ^2.9.2 resolve.exports: ^2.0.3 rimraf: ^6.1.3 - rollup: ^4.59.0 rollup-plugin-visualizer: ^7.0.1 sass: ^1.98.0 sass-embedded: ^1.98.0 @@ -155,15 +155,16 @@ catalog: tdesign-vue-next: ^1.18.5 theme-colors: ^0.1.0 tippy.js: ^6.3.7 + tsdown: ^0.21.3 turbo: ^2.8.17 tw-animate-css: ^1.4.0 typescript: ^5.9.3 - unbuild: ^3.6.1 + unplugin-dts: ^1.0.0-beta.6 unplugin-element-plus: ^0.11.2 + unplugin-vue: ^7.1.1 vee-validate: ^4.15.1 vite: ^8.0.0 vite-plugin-compression: ^0.5.1 - vite-plugin-dts: ^4.5.4 vite-plugin-html: ^3.2.2 vite-plugin-lazy-import: ^1.0.7 vite-plugin-pwa: ^1.2.0 diff --git a/scripts/turbo-run/build.config.ts b/scripts/turbo-run/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/scripts/turbo-run/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/scripts/turbo-run/package.json b/scripts/turbo-run/package.json index b2acd458f..0ab451fdc 100644 --- a/scripts/turbo-run/package.json +++ b/scripts/turbo-run/package.json @@ -5,7 +5,7 @@ "license": "MIT", "type": "module", "scripts": { - "stub": "pnpm unbuild --stub" + "stub": "pnpm exec tsdown" }, "files": [ "dist" diff --git a/scripts/turbo-run/tsdown.config.ts b/scripts/turbo-run/tsdown.config.ts new file mode 100644 index 000000000..c4f51c5ee --- /dev/null +++ b/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', + }), +}); diff --git a/scripts/vsh/build.config.ts b/scripts/vsh/build.config.ts deleted file mode 100644 index 97e572c56..000000000 --- a/scripts/vsh/build.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; - -export default defineBuildConfig({ - clean: true, - declaration: true, - entries: ['src/index'], -}); diff --git a/scripts/vsh/package.json b/scripts/vsh/package.json index 441dbb756..a973bd5ae 100644 --- a/scripts/vsh/package.json +++ b/scripts/vsh/package.json @@ -5,7 +5,7 @@ "license": "MIT", "type": "module", "scripts": { - "stub": "pnpm unbuild --stub" + "stub": "pnpm exec tsdown" }, "files": [ "dist" diff --git a/scripts/vsh/src/check-circular/index.ts b/scripts/vsh/src/check-circular/index.ts index 064250613..999f7f249 100644 --- a/scripts/vsh/src/check-circular/index.ts +++ b/scripts/vsh/src/check-circular/index.ts @@ -1,10 +1,15 @@ 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 = { @@ -41,6 +46,44 @@ interface CommandOptions { // 缓存机制 const cache = new Map(); +async function detectCircularDependencies({ + cwd, + ignorePattern, + staged, +}: { + cwd: string; + ignorePattern: string; + staged: boolean; +}): Promise { + 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 - 循环依赖结果 @@ -85,17 +128,17 @@ async function checkCircular({ const cacheKey = `${staged}-${process.cwd()}-${ignorePattern}`; if (cache.has(cacheKey)) { const cachedResults = cache.get(cacheKey); - if (cachedResults) { - verbose && formatCircles(cachedResults); + if (cachedResults && verbose) { + formatCircles(cachedResults); } return; } // 检测循环依赖 - const results = await circularDepsDetect({ - absolute: staged, + const results = await detectCircularDependencies({ cwd: process.cwd(), - ignore: [ignorePattern], + ignorePattern, + staged, }); if (staged) { @@ -118,11 +161,15 @@ async function checkCircular({ // 更新缓存 cache.set(cacheKey, circularFiles); - verbose && formatCircles(circularFiles); + if (verbose) { + formatCircles(circularFiles); + } } else { // 更新缓存 cache.set(cacheKey, results); - verbose && formatCircles(results); + if (verbose) { + formatCircles(results); + } } // 如果发现循环依赖,只输出警告信息 diff --git a/scripts/vsh/src/check-dep/index.ts b/scripts/vsh/src/check-dep/index.ts index ba8ed4c3f..bbda58280 100644 --- a/scripts/vsh/src/check-dep/index.ts +++ b/scripts/vsh/src/check-dep/index.ts @@ -10,7 +10,7 @@ const DEFAULT_CONFIG = { ignoreMatches: [ 'vite', 'vitest', - 'unbuild', + 'tsdown', '@vben/tsconfig', '@vben/vite-config', '@types/*', diff --git a/scripts/vsh/tsdown.config.ts b/scripts/vsh/tsdown.config.ts new file mode 100644 index 000000000..c4f51c5ee --- /dev/null +++ b/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', + }), +});