Ver Fonte

Merge branch 'fork/xingyu4j/tsdown'

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

+ 1 - 0
cspell.json

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

+ 0 - 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'],
-});

+ 2 - 4
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:",

+ 1 - 1
internal/lint-configs/eslint-config/src/configs/node.ts

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

+ 16 - 0
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',
+  }),
+});

+ 0 - 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'],
-});

+ 1 - 1
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"

+ 2 - 2
internal/lint-configs/oxfmt-config/src/index.ts

@@ -2,7 +2,7 @@ import { defineConfig as defineOxfmtConfig } from 'oxfmt';
 
 type OxfmtConfig = Parameters<typeof defineOxfmtConfig>[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,

+ 11 - 0
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',
+  }),
+});

+ 0 - 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'],
-});

+ 1 - 1
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"

+ 11 - 0
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',
+  }),
+});

+ 0 - 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'],
-});

+ 2 - 2
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"
     }

+ 37 - 0
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);
+  }
+}

+ 2 - 2
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);

+ 22 - 12
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 };

+ 8 - 0
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 - 0
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'],
+});

+ 0 - 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'],
-});

+ 3 - 4
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:"
   }

+ 3 - 2
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)],
     },
   ]);
 }

+ 1 - 1
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';
 
 /**

+ 41 - 0
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',
+  }),
+});

+ 3 - 1
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:",

+ 2 - 0
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"
     }
   },

+ 0 - 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'],
-});

+ 2 - 1
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"
     }
   },

+ 11 - 0
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',
+  }),
+});

+ 0 - 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',
-  ],
-});

+ 8 - 2
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"
     }
   },

+ 2 - 2
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 {

+ 2 - 2
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);

+ 18 - 0
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',
+  }),
+});

+ 0 - 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'],
-});

+ 4 - 2
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": {

+ 11 - 0
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',
+  }),
+});

+ 1 - 1
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';
 

+ 0 - 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'],
-});

+ 2 - 1
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"
     }
   },

+ 11 - 0
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',
+  }),
+});

+ 0 - 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'],
-});

+ 14 - 3
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": {

+ 11 - 0
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',
+  }),
+});

+ 0 - 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'],
-    },
-  ],
-});

+ 4 - 1
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"
       }
     }

+ 22 - 0
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,
+});

+ 0 - 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'],
-    },
-  ],
-});

+ 4 - 1
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"
       }
     }

+ 22 - 0
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,
+});

+ 0 - 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'],
-    },
-  ],
-});

+ 4 - 1
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"
       }
     }

+ 22 - 0
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,
+});

+ 0 - 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'],
-    },
-  ],
-});

+ 4 - 1
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"
       }
     }

+ 22 - 0
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,
+});

+ 0 - 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'],
-    },
-  ],
-});

+ 6 - 9
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"
       }
     }

+ 3 - 2
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;
 }

+ 0 - 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'],
-    },
-  ],
-});

+ 4 - 1
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"
       }
     }

+ 22 - 0
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,
+});

+ 4 - 3
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

+ 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'],
-});

+ 1 - 1
scripts/turbo-run/package.json

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

+ 11 - 0
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',
+  }),
+});

+ 0 - 7
scripts/vsh/build.config.ts

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

+ 1 - 1
scripts/vsh/package.json

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

+ 57 - 10
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<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 - 循环依赖结果
@@ -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);
+      }
     }
 
     // 如果发现循环依赖,只输出警告信息

+ 1 - 1
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/*',

+ 11 - 0
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',
+  }),
+});