diff --git a/apps/web-antd/src/adapter/component/index.ts b/apps/web-antd/src/adapter/component/index.ts index 11edf6b53..ac8b74cdf 100644 --- a/apps/web-antd/src/adapter/component/index.ts +++ b/apps/web-antd/src/adapter/component/index.ts @@ -3,94 +3,60 @@ * 可用于 vben-form、vben-modal、vben-drawer 等组件使用, */ -import type { Component } from 'vue'; +import type { Component } from "vue"; -import type { BaseFormComponentType } from '@vben/common-ui'; -import type { Recordable } from '@vben/types'; +import type { BaseFormComponentType } from "@vben/common-ui"; +import type { Recordable } from "@vben/types"; -import { computed, defineAsyncComponent, defineComponent, h, ref } from 'vue'; +import { computed, defineAsyncComponent, defineComponent, h, ref } from "vue"; -import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui'; -import { $t } from '@vben/locales'; +import { ApiComponent, globalShareState, IconPicker } from "@vben/common-ui"; +import { $t } from "@vben/locales"; const RichTextarea = defineAsyncComponent(() => - import('#/components/tinymce/index').then((res) => res.Tinymce), + import("#/components/tinymce/index").then((res) => res.Tinymce), ); const FileUpload = defineAsyncComponent(() => - import('#/components/upload').then((res) => res.FileUpload), + import("#/components/upload").then((res) => res.FileUpload), ); const ImageUpload = defineAsyncComponent(() => - import('#/components/upload').then((res) => res.ImageUpload), + import("#/components/upload").then((res) => res.ImageUpload), ); -const Button = defineAsyncComponent( - () => import('antdv-next/dist/button/index'), -); -const Cascader = defineAsyncComponent( - () => import('antdv-next/dist/cascader/index'), -); -const Checkbox = defineAsyncComponent( - () => import('antdv-next/dist/checkbox/index'), -); -const CheckboxGroup = defineAsyncComponent( - () => import('antdv-next/dist/checkbox/Group'), -); -const DatePicker = defineAsyncComponent( - () => import('antdv-next/dist/date-picker/index'), -); -const Divider = defineAsyncComponent( - () => import('antdv-next/dist/divider/index'), -); -const Input = defineAsyncComponent(() => import('antdv-next/dist/input/index')); -const InputNumber = defineAsyncComponent( - () => import('antdv-next/dist/input-number/index'), -); -const InputPassword = defineAsyncComponent( - () => import('antdv-next/dist/input/Password'), -); -const Mentions = defineAsyncComponent( - () => import('antdv-next/dist/mentions/index'), -); -const Radio = defineAsyncComponent(() => import('antdv-next/dist/radio/index')); +const Button = defineAsyncComponent(() => import("antdv-next/dist/button/index")); +const Cascader = defineAsyncComponent(() => import("antdv-next/dist/cascader/index")); +const Checkbox = defineAsyncComponent(() => import("antdv-next/dist/checkbox/index")); +const CheckboxGroup = defineAsyncComponent(() => import("antdv-next/dist/checkbox/Group")); +const DatePicker = defineAsyncComponent(() => import("antdv-next/dist/date-picker/index")); +const Divider = defineAsyncComponent(() => import("antdv-next/dist/divider/index")); +const Input = defineAsyncComponent(() => import("antdv-next/dist/input/index")); +const InputNumber = defineAsyncComponent(() => import("antdv-next/dist/input-number/index")); +const InputPassword = defineAsyncComponent(() => import("antdv-next/dist/input/Password")); +const Mentions = defineAsyncComponent(() => import("antdv-next/dist/mentions/index")); +const Radio = defineAsyncComponent(() => import("antdv-next/dist/radio/index")); const RadioGroup = defineAsyncComponent(() => - import('antdv-next/dist/radio/index').then((res) => res.RadioGroup), + import("antdv-next/dist/radio/index").then((res) => res.RadioGroup), ); const RangePicker = defineAsyncComponent(() => - import('antdv-next/dist/date-picker/index').then( - (res) => res.DateRangePicker, - ), -); -const Rate = defineAsyncComponent(() => import('antdv-next/dist/rate/index')); -const Select = defineAsyncComponent( - () => import('antdv-next/dist/select/index'), -); -const Space = defineAsyncComponent(() => import('antdv-next/dist/space/index')); -const Switch = defineAsyncComponent( - () => import('antdv-next/dist/switch/index'), -); -const Textarea = defineAsyncComponent( - () => import('antdv-next/dist/input/TextArea'), -); -const TimePicker = defineAsyncComponent( - () => import('antdv-next/dist/time-picker/index'), + import("antdv-next/dist/date-picker/index").then((res) => res.DateRangePicker), ); +const Rate = defineAsyncComponent(() => import("antdv-next/dist/rate/index")); +const Select = defineAsyncComponent(() => import("antdv-next/dist/select/index")); +const Space = defineAsyncComponent(() => import("antdv-next/dist/space/index")); +const Switch = defineAsyncComponent(() => import("antdv-next/dist/switch/index")); +const Textarea = defineAsyncComponent(() => import("antdv-next/dist/input/TextArea")); +const TimePicker = defineAsyncComponent(() => import("antdv-next/dist/time-picker/index")); const TimeRangePicker = defineAsyncComponent(() => - import('antdv-next/dist/time-picker/index').then( - (res) => res.TimeRangePicker, - ), -); -const TreeSelect = defineAsyncComponent( - () => import('antdv-next/dist/tree-select/index'), -); -const Upload = defineAsyncComponent( - () => import('antdv-next/dist/upload/Upload'), + import("antdv-next/dist/time-picker/index").then((res) => res.TimeRangePicker), ); +const TreeSelect = defineAsyncComponent(() => import("antdv-next/dist/tree-select/index")); +const Upload = defineAsyncComponent(() => import("antdv-next/dist/upload/Upload")); const withDefaultPlaceholder = ( component: T, - type: 'input' | 'select', + type: "input" | "select", componentProps: Recordable = {}, ) => { return defineComponent({ @@ -99,10 +65,7 @@ const withDefaultPlaceholder = ( setup: (props: any, { attrs, expose, slots }) => { // 改为placeholder 解决在keepalive & 语言切换 & tab切换 显示不变的问题 const computedPlaceholder = computed( - () => - props?.placeholder || - attrs?.placeholder || - $t(`ui.placeholder.${type}`), + () => props?.placeholder || attrs?.placeholder || $t(`ui.placeholder.${type}`), ); // 透传组件暴露的方法 @@ -134,37 +97,37 @@ const withDefaultPlaceholder = ( // 这里需要自行根据业务组件库进行适配,需要用到的组件都需要在这里类型说明 export type ComponentType = - | 'ApiCascader' - | 'ApiSelect' - | 'ApiTreeSelect' - | 'AutoComplete' - | 'Cascader' - | 'Checkbox' - | 'CheckboxGroup' - | 'DatePicker' - | 'DefaultButton' - | 'Divider' - | 'FileUpload' - | 'IconPicker' - | 'ImageUpload' - | 'Input' - | 'InputNumber' - | 'InputPassword' - | 'Mentions' - | 'PrimaryButton' - | 'Radio' - | 'RadioGroup' - | 'RangePicker' - | 'Rate' - | 'RichTextarea' - | 'Select' - | 'Space' - | 'Switch' - | 'Textarea' - | 'TimePicker' - | 'TimeRangePicker' - | 'TreeSelect' - | 'Upload' + | "ApiCascader" + | "ApiSelect" + | "ApiTreeSelect" + | "AutoComplete" + | "Cascader" + | "Checkbox" + | "CheckboxGroup" + | "DatePicker" + | "DefaultButton" + | "Divider" + | "FileUpload" + | "IconPicker" + | "ImageUpload" + | "Input" + | "InputNumber" + | "InputPassword" + | "Mentions" + | "PrimaryButton" + | "Radio" + | "RadioGroup" + | "RangePicker" + | "Rate" + | "RichTextarea" + | "Select" + | "Space" + | "Switch" + | "Textarea" + | "TimePicker" + | "TimeRangePicker" + | "TreeSelect" + | "Upload" | BaseFormComponentType; async function initComponentAdapter() { @@ -173,74 +136,74 @@ async function initComponentAdapter() { // Button: () => // import('xxx').then((res) => res.Button), - ApiCascader: withDefaultPlaceholder(ApiComponent, 'select', { + ApiCascader: withDefaultPlaceholder(ApiComponent, "select", { component: Cascader, - fieldNames: { label: 'label', value: 'value', children: 'children' }, - loadingSlot: 'suffixIcon', - modelPropName: 'value', - visibleEvent: 'onVisibleChange', + fieldNames: { label: "label", value: "value", children: "children" }, + loadingSlot: "suffixIcon", + modelPropName: "value", + visibleEvent: "onVisibleChange", }), ApiSelect: withDefaultPlaceholder( { ...ApiComponent, - name: 'ApiSelect', + name: "ApiSelect", }, - 'select', + "select", { component: Select, - loadingSlot: 'suffixIcon', - visibleEvent: 'onDropdownVisibleChange', - modelPropName: 'value', + loadingSlot: "suffixIcon", + visibleEvent: "onDropdownVisibleChange", + modelPropName: "value", }, ), ApiTreeSelect: withDefaultPlaceholder( { ...ApiComponent, - name: 'ApiTreeSelect', + name: "ApiTreeSelect", }, - 'select', + "select", { component: TreeSelect, - fieldNames: { label: 'label', value: 'value', children: 'children' }, - loadingSlot: 'suffixIcon', - modelPropName: 'value', - optionsPropName: 'treeData', - visibleEvent: 'onVisibleChange', + fieldNames: { label: "label", value: "value", children: "children" }, + loadingSlot: "suffixIcon", + modelPropName: "value", + optionsPropName: "treeData", + visibleEvent: "onVisibleChange", }, ), - Cascader: withDefaultPlaceholder(Cascader, 'select'), + Cascader: withDefaultPlaceholder(Cascader, "select"), Checkbox, CheckboxGroup, DatePicker, // 自定义默认按钮 DefaultButton: (props, { attrs, slots }) => { - return h(Button, { ...props, attrs, type: 'default' }, slots); + return h(Button, { ...props, attrs, type: "default" }, slots); }, Divider, - IconPicker: withDefaultPlaceholder(IconPicker, 'select', { - iconSlot: 'addonAfter', + IconPicker: withDefaultPlaceholder(IconPicker, "select", { + iconSlot: "addonAfter", inputComponent: Input, - modelValueProp: 'value', + modelValueProp: "value", }), - Input: withDefaultPlaceholder(Input, 'input'), - InputNumber: withDefaultPlaceholder(InputNumber, 'input'), - InputPassword: withDefaultPlaceholder(InputPassword, 'input'), - Mentions: withDefaultPlaceholder(Mentions, 'input'), + Input: withDefaultPlaceholder(Input, "input"), + InputNumber: withDefaultPlaceholder(InputNumber, "input"), + InputPassword: withDefaultPlaceholder(InputPassword, "input"), + Mentions: withDefaultPlaceholder(Mentions, "input"), // 自定义主要按钮 PrimaryButton: (props, { attrs, slots }) => { - return h(Button, { ...props, attrs, type: 'primary' }, slots); + return h(Button, { ...props, attrs, type: "primary" }, slots); }, Radio, RadioGroup, RangePicker, Rate, - Select: withDefaultPlaceholder(Select, 'select'), + Select: withDefaultPlaceholder(Select, "select"), Space, Switch, - Textarea: withDefaultPlaceholder(Textarea, 'input'), + Textarea: withDefaultPlaceholder(Textarea, "input"), TimePicker, TimeRangePicker, - TreeSelect: withDefaultPlaceholder(TreeSelect, 'select'), + TreeSelect: withDefaultPlaceholder(TreeSelect, "select"), Upload, ImageUpload, FileUpload, @@ -257,7 +220,7 @@ async function initComponentAdapter() { window.notification.success({ description: content, title, - placement: 'bottomRight', + placement: "bottomRight", }); }, }); diff --git a/apps/web-antd/src/views/演示使用自行删除/form/index.vue b/apps/web-antd/src/views/演示使用自行删除/form/index.vue index 9e6cbb7b6..3126a03a9 100644 --- a/apps/web-antd/src/views/演示使用自行删除/form/index.vue +++ b/apps/web-antd/src/views/演示使用自行删除/form/index.vue @@ -1,19 +1,19 @@ diff --git a/cspell.json b/cspell.json index 7de2c11c5..7d8240560 100644 --- a/cspell.json +++ b/cspell.json @@ -70,6 +70,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 268fe3192..0e93c3bca 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,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:*", @@ -82,9 +83,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..62be7793d --- /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..a01e596b1 100644 --- a/packages/@core/base/typings/vue-router.d.ts +++ b/packages/@core/base/typings/vue-router.d.ts @@ -1,5 +1,4 @@ -/* 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..43e8cf1c5 --- /dev/null +++ b/packages/@core/ui-kit/form-ui/tsdown.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'tsdown'; +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/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..43e8cf1c5 --- /dev/null +++ b/packages/@core/ui-kit/layout-ui/tsdown.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'tsdown'; +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/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..43e8cf1c5 --- /dev/null +++ b/packages/@core/ui-kit/menu-ui/tsdown.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'tsdown'; +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/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..43e8cf1c5 --- /dev/null +++ b/packages/@core/ui-kit/popup-ui/tsdown.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'tsdown'; +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..43e8cf1c5 --- /dev/null +++ b/packages/@core/ui-kit/tabs-ui/tsdown.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'tsdown'; +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 845ded2a4..e583ed64f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -12,67 +12,68 @@ packages: - scripts/* overrides: - '@ast-grep/napi': 'catalog:' - '@ctrl/tinycolor': 'catalog:' - clsx: 'catalog:' - pinia: 'catalog:' - vue: 'catalog:' + "@ast-grep/napi": "catalog:" + "@ctrl/tinycolor": "catalog:" + clsx: "catalog:" + pinia: "catalog:" + vue: "catalog:" catalog: - '@alova/adapter-axios': ^2.0.17 - '@antdv-next/auto-import-resolver': 1.0.7 - '@antdv-next/happy-work-theme': ^1.0.0 - '@antdv-next/icons': 1.0.5 - '@ast-grep/napi': ^0.42.0 - '@changesets/changelog-github': ^0.6.0 - '@changesets/cli': ^2.30.0 - '@changesets/git': ^3.0.4 - '@clack/prompts': ^1.1.0 - '@codemirror/lang-html': ^6.4.9 - '@codemirror/lang-java': ^6.0.1 - '@codemirror/lang-javascript': ^6.2.2 - '@codemirror/lang-sql': ^6.7.1 - '@codemirror/lang-vue': ^0.1.3 - '@codemirror/lang-xml': ^6.1.0 - '@codemirror/theme-one-dark': ^6.1.2 - '@commitlint/cli': ^20.5.0 - '@commitlint/config-conventional': ^20.5.0 - '@ctrl/tinycolor': ^4.2.0 - '@eslint-community/eslint-plugin-eslint-comments': ^4.7.1 - '@eslint/js': ^10.0.1 - '@iconify/json': ^2.2.449 - '@iconify/tailwind4': ^1.2.3 - '@iconify/vue': ^5.0.0 - '@intlify/core-base': ^11.3.0 - '@intlify/unplugin-vue-i18n': ^11.0.7 - '@jspm/generator': ^2.11.0 - '@manypkg/get-packages': ^3.1.0 - '@playwright/test': ^1.58.2 - '@pnpm/workspace.read-manifest': ^1000.3.0 - '@stylistic/stylelint-plugin': ^5.0.1 - '@tailwindcss/typography': ^0.5.19 - '@tailwindcss/vite': ^4.2.1 - '@tanstack/vue-store': ^0.9.2 - '@tinymce/tinymce-vue': ^6.0.1 - '@types/archiver': ^7.0.0 - '@types/html-minifier-terser': ^7.0.2 - '@types/json-bigint': ^1.0.4 - '@types/lodash-es': ^4.17.12 - '@types/lodash.clonedeep': ^4.5.9 - '@types/node': ^25.5.0 - '@types/nprogress': ^0.2.3 - '@types/qrcode': ^1.5.6 - '@types/qs': ^6.15.0 - '@types/sortablejs': ^1.15.9 - '@typescript-eslint/eslint-plugin': ^8.57.0 - '@typescript-eslint/parser': ^8.57.0 - '@vee-validate/zod': ^4.15.1 - '@vitejs/plugin-vue': ^6.0.5 - '@vitejs/plugin-vue-jsx': ^5.1.5 - '@vue/shared': ^3.5.30 - '@vue/test-utils': ^2.4.6 - '@vueuse/core': ^14.2.1 - '@vueuse/integrations': ^14.2.1 - '@vueuse/motion': ^3.0.3 + "@alova/adapter-axios": ^2.0.17 + "@antdv-next/auto-import-resolver": 1.0.7 + "@antdv-next/happy-work-theme": ^1.0.0 + "@antdv-next/icons": 1.0.5 + "@ast-grep/napi": ^0.42.0 + "@changesets/changelog-github": ^0.6.0 + "@changesets/cli": ^2.30.0 + "@changesets/git": ^3.0.4 + "@clack/prompts": ^1.1.0 + "@codemirror/lang-html": ^6.4.9 + "@codemirror/lang-java": ^6.0.1 + "@codemirror/lang-javascript": ^6.2.2 + "@codemirror/lang-sql": ^6.7.1 + "@codemirror/lang-vue": ^0.1.3 + "@codemirror/lang-xml": ^6.1.0 + "@codemirror/theme-one-dark": ^6.1.2 + "@commitlint/cli": ^20.5.0 + "@commitlint/config-conventional": ^20.5.0 + "@ctrl/tinycolor": ^4.2.0 + "@eslint-community/eslint-plugin-eslint-comments": ^4.7.1 + "@eslint/js": ^10.0.1 + "@iconify/json": ^2.2.449 + "@iconify/tailwind4": ^1.2.3 + "@iconify/vue": ^5.0.0 + "@intlify/core-base": ^11.3.0 + "@intlify/unplugin-vue-i18n": ^11.0.7 + "@jspm/generator": ^2.11.0 + "@manypkg/get-packages": ^3.1.0 + "@playwright/test": ^1.58.2 + "@pnpm/workspace.read-manifest": ^1000.3.0 + "@stylistic/stylelint-plugin": ^5.0.1 + "@tailwindcss/typography": ^0.5.19 + "@tailwindcss/vite": ^4.2.1 + "@tanstack/vue-store": ^0.9.2 + "@tinymce/tinymce-vue": ^6.0.1 + "@tsdown/css": ^0.0.0 + "@types/archiver": ^7.0.0 + "@types/html-minifier-terser": ^7.0.2 + "@types/json-bigint": ^1.0.4 + "@types/lodash-es": ^4.17.12 + "@types/lodash.clonedeep": ^4.5.9 + "@types/node": ^25.5.0 + "@types/nprogress": ^0.2.3 + "@types/qrcode": ^1.5.6 + "@types/qs": ^6.15.0 + "@types/sortablejs": ^1.15.9 + "@typescript-eslint/eslint-plugin": ^8.57.0 + "@typescript-eslint/parser": ^8.57.0 + "@vee-validate/zod": ^4.15.1 + "@vitejs/plugin-vue": ^6.0.5 + "@vitejs/plugin-vue-jsx": ^5.1.5 + "@vue/shared": ^3.5.30 + "@vue/test-utils": ^2.4.6 + "@vueuse/core": ^14.2.1 + "@vueuse/integrations": ^14.2.1 + "@vueuse/motion": ^3.0.3 alova: ^3.4.1 antdv-next: ^1.1.4 archiver: ^7.0.1 @@ -160,10 +161,12 @@ catalog: theme-colors: ^0.1.0 tinymce: 7.9.1 tippy.js: ^6.3.7 + tsdown: ^0.0.0 turbo: ^2.8.17 tw-animate-css: ^1.4.0 typescript: ^5.9.3 unbuild: ^3.6.1 + unplugin-vue: ^0.0.0 unplugin-vue-components: ^0.27.3 vditor: 3.10.9 vee-validate: ^4.15.1 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', + }), +});