diff --git a/.gitignore b/.gitignore index e58771b..72977cd 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,7 @@ dist-ssr # Editor directories and files .vscode/* !.vscode/extensions.json -.idea +/.idea .DS_Store *.suo *.ntvs* @@ -25,3 +25,15 @@ dist-ssr /components.d.ts .agents/ skills-lock.json + +# 自动生成的类型声明(unplugin-auto-import 产物,dev/build 时重新生成) +/types/auto-imports.d.ts + +# TypeScript 增量构建缓存 +*.tsbuildinfo + +# VSCode Local History 插件 +.history/ + +# 构建分析报告(rollup-plugin-visualizer 产物) +/stats.html diff --git a/MIGRATION-PLAN.md b/MIGRATION-PLAN.md deleted file mode 100644 index b1bd1af..0000000 --- a/MIGRATION-PLAN.md +++ /dev/null @@ -1,172 +0,0 @@ -# DaxPay H5 升级迁移方案 - -> 基于 [vue3-vant4-mobile](https://github.com/xiangshu233/vue3-vant4-mobile) 重建 H5 端脚手架。 -> 旧版业务代码(收银台/订单/业务组件/crypto 签名)**不迁移**,后续将重新实现。 -> 本方案仅产出干净的、带完整基础设施的 DaxPay H5 空壳项目。 - -## 一、目标与原则 - -**目标**:以 `vue3-vant4-mobile@main` 为新脚手架重建 `dax-pay-h5`,拿到 Vite 8 / Pinia 3 / Vue Router 5 / UnoCSS 66 的架构红利 + Dark Mode + 系统主题色 + keep-alive/routeStore + http 分层封装,产出等待业务开发的干净基座。 - -**原则**: - -1. 模板作基座,裁掉所有 demo 演示业务(dashboard / example / message / my 演示页、ECharts、Mock)。 -2. 现有 DaxPay 业务资产(收银台、订单、22 个业务组件、crypto、api、views、router modules、store.user 等)**全部不迁移**,后续重新实现。 -3. 保留模板的完整基础设施(Dark Mode、主题色、keep-alive、http 分层),但 http 分层保留**通用版**,不植入业务拦截器逻辑(token 头等留待业务阶段定)。 -4. 分阶段可验证,每个阶段结束都能 `pnpm dev` 起来且 `pnpm type:check` 通过。 -5. 保留 DaxPay 品牌与环境:应用名 `DaxPay`、端口 `9100`、代理 `/server` → `http://127.0.0.1:19999/`、`VITE_GLOB_*` 环境变量体系。 - -## 二、最终技术栈锁定 - -| 类别 | 版本 | 来源 | -| ------------------------------------- | -------------------------------- | ------------------------------------- | -| Vite | ^8.0.2 | 模板 | -| Vue | ^3.5.30 | 模板 | -| Vue Router | ^5.0.4 | 模板 | -| Pinia | ^3.0.4 | 模板 | -| pinia-plugin-persistedstate | ^4.7.1 | 模板(替代旧 `pinia-plugin-persist`) | -| Vant | ^4.9.22 | 模板 | -| UnoCSS | ^66.6.7(含 `@unocss/*` 同版本) | 模板 | -| TypeScript | ^5.9.3 | 模板 | -| vue-tsc | ^3.2.6 | 模板 | -| @vitejs/plugin-vue | ^6.0.5 | 模板 | -| @vueuse/core | ^14.2.1 | 模板 | -| unplugin-auto-import / vue-components | ^21 / ^32 | 模板 | -| tsx | ^4.21 | 模板(替代 `esno`) | -| terser | ^5.46 | 模板(drop console) | -| vconsole + vite-plugin-vconsole | 保留现有版本 | 开发期调试工具 | -| **Node** | **>=22.12.0** | 用户要求(engines 锁定 22) | -| pnpm | >=9.0.2 | monorepo 约定 | - -**不安装**:`echarts`、`mockjs`、`vue-qr`(业务重写后按需再加)。 - -## 三、纳入 / 裁剪 / 迁入清单 - -### 从模板纳入 - -- 构建脚本:`build/` 全套(`script/buildConf.ts`、`postBuild.ts`、`getConfigFileName.ts`、`vite/plugin/*`) -- `vite.config.ts`(`rolldownOptions` + oxc/terser minify) -- `main.ts`(按需 vant 样式 + `setupStore`/`setupRouter` 异步 mount) -- `store/index.ts`(`setupStore` + `persistedstate`) -- `router/`(`base` + `index` + `modules` + `router-guards` + `routeStore`) -- `utils/http/axios/`(分层封装,全套 7 文件,保留通用版) -- `hooks/`(`core`/`event`/`setting`/`web` 分层,移除 `useECharts`) -- `layout/`(`index.vue` + `FloatingNavBar`) -- Dark Mode + 主题色体系:`store/modules/designSetting.ts` + `settings/designSetting.ts` + `hooks/setting/useDesignSetting.ts` + `views/my/ThemeSetting.vue` + `styles/entry.css` + `styles/vant.less` + `App.vue` -- `enums/`(breakpointEnum / cacheEnum / httpEnum / pageEnum) -- `utils/`(Storage、dateUtil、domUtils、env、is、urlUtils、log、index) -- `types/`(auto-imports.d.ts、config.d.ts、global.d.ts、index.d.ts、modules.d.ts) -- `uno.config.ts`(webfonts provider 改回 `none`) -- `eslint.config.js`、`commitlint.config.cjs`、`.editorconfig`、`simple-git-hooks` - -### 从模板裁剪 - -- `src/views/dashboard/`、`example/`、`message/`(含 barChart/lineChart/pieChart)、`my/` 演示页(**保留 `ThemeSetting.vue`** 作为主题设置页骨架) -- `src/hooks/web/useECharts.ts` + `src/utils/lib/echarts.ts` -- `mock/` 目录 + `build/vite/plugin/mock.ts` + `vite-plugin-mock` + `mockjs` + `@types/mockjs` 依赖 + `VITE_GLOB_PROD_MOCK` -- `vercel.json`、`public/_redirects`、`.github/workflows/` -- `uno.config.ts` 的演示 safelist、`webfonts` provider(改 `none`) - -### 从现有项目迁入(仅非业务资产) - -- `.env` / `.env.development` / `.env.production`(端口 9100、代理 `/server`、`VITE_V_CONSOLE`、`VITE_DROP_CONSOLE`、`VITE_BUILD_COMPRESS`) -- `用户授权使用协议.txt` -- `README.md`(业务说明保留,技术说明换新栈) -- `.git/`(保留提交历史) -- `index.html` 的 DaxPay 品牌(title / meta) - -### 明确丢弃(不迁移,重新实现) - -`src/api/*`、`views/*`、`components/*`(22 个业务组件)、`utils/{axios,crypto,format,validate}.ts`、`router/{guard,modules}/*`、`store/modules/user.ts`、`hooks/{useConfig,useUser,useTheme,useDevice,useRequest,useCountdown}.ts`、`layout/{Default,IndexTabBar,Helper}*`、`vue-qr` 依赖——全部不迁。 - -> 旧版完整业务代码已保留在备份分支 `h5-legacy`(tag `h5-legacy-v3.0.0`),供重新实现时参考。 - -## 四、交付物定义 - -产出一个**干净的 DaxPay H5 脚手架**: - -- 基于 vue3-vant4-mobile,裁掉所有 demo 演示页。 -- 保留完整基础设施:Dark Mode + 主题色 + keep-alive/routeStore + http 分层 + vconsole。 -- 品牌定制:应用名 DaxPay、端口 9100、代理 `/server` → `127.0.0.1:19999`。 -- 只保留一个占位首页(登录后落地,最简),等待业务开发。 -- `pnpm dev` / `pnpm type:check` / `pnpm lint` / `pnpm build` 全绿。 - -## 五、分阶段执行计划 - -### 阶段 0:准备(0.3 天) - -- [x] `dax-pay-h5` 打 tag `h5-legacy-v3.0.0`(旧业务最后状态) -- [x] 切备份分支 `h5-legacy`(保留全部旧业务供后续参考) -- [x] Node 版本确认 ≥ 22.12.0(实测 v24.17.0) -- [x] 记录现网基础配置:端口 9100、代理 `/server` → `http://127.0.0.1:19999/` - -### 阶段 1:脚手架搭建(0.5 天) - -- [ ] 克隆 `vue3-vant4-mobile`,整体替换 `dax-pay-h5`(保留 `.git/`、协议文件、`README.md`、本文件) -- [ ] `package.json`:`name=daxpay-gateway-ui`、`version=3.1.0`、`engines.node=">=22.12.0"`、`engines.pnpm=">=9.0.2"` -- [ ] 删除演示业务:`src/views/{dashboard,example,message,my}`(`my/ThemeSetting.vue` 单独保留)、`src/hooks/web/useECharts.ts`、`src/utils/lib/`、`mock/`、`build/vite/plugin/mock.ts`、`vercel.json`、`.github/`、`public/_redirects` -- [ ] 删除依赖:`echarts`、`mockjs`、`@types/mockjs`、`vite-plugin-mock`、`@oxc-parser/binding-win32-x64-msvc` -- [ ] 加回依赖:`vconsole`、`vite-plugin-vconsole`,新建 `build/vite/plugin/vconsole.ts` 注册 -- [ ] `src/views/` 只留一个占位首页 `views/home/index.vue` -- [ ] `uno.config.ts`:webfonts provider 改 `none`、清空演示 safelist -- [ ] `pnpm install && pnpm dev` 验证脚手架自洽 -- **验证**:`dev` / `type:check` / `build` 三绿 - -### 阶段 2:基础设施定制(0.5 天) - -- [ ] 环境变量:用现有 `.env*` 覆盖(端口 9100、代理、`VITE_V_CONSOLE=true`、`VITE_DROP_CONSOLE`、`VITE_BUILD_COMPRESS`),删 `VITE_GLOB_PROD_MOCK` -- [ ] `build/utils.ts` 的 `wrapperEnv` 同步调整校验项 -- [ ] `router/modules.ts`:清空 demo 路由,只留登录页 + 占位首页 + 404 -- [ ] `store/modules/user.ts`:保留模板默认骨架(供后续业务用) -- [ ] `main.ts`:加回 vconsole 开发环境初始化 -- [ ] HTTP 分层:保留模板通用版,不植业务拦截器 -- **验证**:dev 起来,登录页/占位首页可访问,Dark Mode + 主题色切换生效 - -### 阶段 3:样式与适配(0.3 天) - -- [ ] `postcss.config.js`:采用模板版(去掉现有 `exclude:[/src/]` 这个疑似 bug 的配置) -- [ ] 合并 `styles/var.less`,确认 vant 主题变量 -- [ ] Dark Mode 下占位页自查 - -### 阶段 4:质量验证(0.2 天) - -- [ ] `pnpm type:check`(vue-tsc 3)零错误 -- [ ] `pnpm lint`(@antfu/eslint-config 2)零 error -- [ ] `pnpm build` 成功,记录产物体积基线 -- [ ] `npx simple-git-hooks` 装 hooks -- [ ] 真机扫描进 H5,验证 viewport 适配 + Dark Mode - -**工期估算**:约 1.8 人天 - -## 六、关键 Breaking Change 应对手册 - -| 变更点 | 现状 | 新版应对 | -| ----------------------------------- | ---------------------------------- | ----------------------------------------------------------------------------------------- | -| Vite 8 移除 CJS Node API | 配置已 ESM | 确认所有 `.js` 配置含 ESM 导出;`postcss.config.js` 保持 `import` | -| `rollupOptions` → `rolldownOptions` | rollupOptions | `vite.config.ts` 改名(模板已示范) | -| esbuild drop 失效 | `esbuild.drop` | 改 `minify:'terser'` + `terserOptions.compress.drop_console`(模板已示范) | -| Pinia 3 持久化 | `pinia-plugin-persist` | 换 `pinia-plugin-persistedstate`,`persist:true` 写法基本兼容 | -| Vue Router 4 → 5 | v4 | `createRouter`/`createWebHashHistory` 兼容;守卫 API 复核 | -| UnoCSS 0.58 → 66 | 分散包 0.58 | 统一升 66,preset/transformer 导入路径不变,配置语法兼容 | -| @vueuse 10 → 14 | v10 | 业务重写后按需核对(本项目不迁旧 hooks,影响小) | -| vue-tsc 1 → 3 | v1 | CLI 兼容;TS 需 ≥5.5 | -| vant 全量 → 按需 | `app.use(Vant)` | `main.ts` 删 `app.use(Vant)`,靠 unplugin-vue-components 自动注册 + 手动导 4 个副作用样式 | -| esno → tsx | `esno ./build/script/postBuild.ts` | script 改 `tsx ./build/script/postBuild.ts` | - -## 七、风险与回滚 - -| 风险 | 等级 | 缓解 | -| ------------------------------------------- | ---- | ------------------------------------ | -| UnoCSS 66 与业务原子类不兼容 | 中 | 阶段 1 先跑通,出问题可临时锁回 0.58 | -| Pinia 3 persistedstate 持久化行为差异 | 中 | 阶段 2 测主题/设置持久化 | -| vant 按需导入漏样式(Toast/Dialog 等) | 中 | `main.ts` 显式导 4 个,其余用到再补 | -| Vite 8 三方插件未跟进(vconsole/svg-icons) | 中 | 阶段 1 验证,必要时锁版本 | - -**回滚**:`h5-legacy` 分支随时可切回;每个阶段结束提交一次,便于二分定位。 - -## 八、约定备忘 - -- `node` 锁定 `>=22.12.0`,`pnpm` `>=9.0.2`。 -- 路由模式:`createWebHashHistory`(H5 嵌入支付场景更稳)。 -- 接口 token 头约定:`Accesstoken`(Sa-Token,来自 DaxPay 后端约定),待业务阶段在 http transform 中实现。 -- 不自动提交代码,每阶段结束询问是否提交。 diff --git a/用户授权使用协议.txt b/USER-AGREEMENT.txt similarity index 100% rename from 用户授权使用协议.txt rename to USER-AGREEMENT.txt diff --git a/package.json b/package.json index f6a7c68..3f52cbd 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "lint:lint-staged": "lint-staged" }, "dependencies": { - "@types/lodash-es": "^4.17.12", "@vueuse/core": "^14.2.1", "axios": "^1.4.0", "date-fns": "^3.0.6", @@ -47,6 +46,7 @@ "@iconify/json": "^2.2.188", "@oxc-parser/binding-win32-x64-msvc": "0.115.0", "@types/fs-extra": "^11.0.4", + "@types/lodash-es": "^4.17.12", "@types/node": "^25.5.0", "@types/nprogress": "^0.2.3", "@types/qs": "^6.9.11", diff --git a/types/auto-imports.d.ts b/types/auto-imports.d.ts deleted file mode 100644 index 80751c1..0000000 --- a/types/auto-imports.d.ts +++ /dev/null @@ -1,319 +0,0 @@ -/* eslint-disable */ -/* prettier-ignore */ -// @ts-nocheck -// noinspection JSUnusedGlobalSymbols -// Generated by unplugin-auto-import -// biome-ignore lint: disable -export {} -declare global { - const EffectScope: typeof import('vue').EffectScope - const acceptHMRUpdate: typeof import('pinia').acceptHMRUpdate - const asyncComputed: typeof import('@vueuse/core').asyncComputed - const autoResetRef: typeof import('@vueuse/core').autoResetRef - const computed: typeof import('vue').computed - const computedAsync: typeof import('@vueuse/core').computedAsync - const computedEager: typeof import('@vueuse/core').computedEager - const computedInject: typeof import('@vueuse/core').computedInject - const computedWithControl: typeof import('@vueuse/core').computedWithControl - const controlledComputed: typeof import('@vueuse/core').controlledComputed - const controlledRef: typeof import('@vueuse/core').controlledRef - const createApp: typeof import('vue').createApp - const createEventHook: typeof import('@vueuse/core').createEventHook - const createGlobalState: typeof import('@vueuse/core').createGlobalState - const createInjectionState: typeof import('@vueuse/core').createInjectionState - const createPinia: typeof import('pinia').createPinia - const createReactiveFn: typeof import('@vueuse/core').createReactiveFn - const createRef: typeof import('@vueuse/core').createRef - const createReusableTemplate: typeof import('@vueuse/core').createReusableTemplate - const createSharedComposable: typeof import('@vueuse/core').createSharedComposable - const createTemplatePromise: typeof import('@vueuse/core').createTemplatePromise - const createUnrefFn: typeof import('@vueuse/core').createUnrefFn - const customRef: typeof import('vue').customRef - const debouncedRef: typeof import('@vueuse/core').debouncedRef - const debouncedWatch: typeof import('@vueuse/core').debouncedWatch - const defineAsyncComponent: typeof import('vue').defineAsyncComponent - const defineComponent: typeof import('vue').defineComponent - const defineStore: typeof import('pinia').defineStore - const eagerComputed: typeof import('@vueuse/core').eagerComputed - const effectScope: typeof import('vue').effectScope - const extendRef: typeof import('@vueuse/core').extendRef - const getActivePinia: typeof import('pinia').getActivePinia - const getCurrentInstance: typeof import('vue').getCurrentInstance - const getCurrentScope: typeof import('vue').getCurrentScope - const getCurrentWatcher: typeof import('vue').getCurrentWatcher - const h: typeof import('vue').h - const ignorableWatch: typeof import('@vueuse/core').ignorableWatch - const inject: typeof import('vue').inject - const injectLocal: typeof import('@vueuse/core').injectLocal - const isDefined: typeof import('@vueuse/core').isDefined - const isProxy: typeof import('vue').isProxy - const isReactive: typeof import('vue').isReactive - const isReadonly: typeof import('vue').isReadonly - const isRef: typeof import('vue').isRef - const isShallow: typeof import('vue').isShallow - const makeDestructurable: typeof import('@vueuse/core').makeDestructurable - const mapActions: typeof import('pinia').mapActions - const mapGetters: typeof import('pinia').mapGetters - const mapState: typeof import('pinia').mapState - const mapStores: typeof import('pinia').mapStores - const mapWritableState: typeof import('pinia').mapWritableState - const markRaw: typeof import('vue').markRaw - const nextTick: typeof import('vue').nextTick - const onActivated: typeof import('vue').onActivated - const onBeforeMount: typeof import('vue').onBeforeMount - const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave - const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate - const onBeforeUnmount: typeof import('vue').onBeforeUnmount - const onBeforeUpdate: typeof import('vue').onBeforeUpdate - const onClickOutside: typeof import('@vueuse/core').onClickOutside - const onDeactivated: typeof import('vue').onDeactivated - const onElementRemoval: typeof import('@vueuse/core').onElementRemoval - const onErrorCaptured: typeof import('vue').onErrorCaptured - const onKeyStroke: typeof import('@vueuse/core').onKeyStroke - const onLongPress: typeof import('@vueuse/core').onLongPress - const onMounted: typeof import('vue').onMounted - const onRenderTracked: typeof import('vue').onRenderTracked - const onRenderTriggered: typeof import('vue').onRenderTriggered - const onScopeDispose: typeof import('vue').onScopeDispose - const onServerPrefetch: typeof import('vue').onServerPrefetch - const onStartTyping: typeof import('@vueuse/core').onStartTyping - const onUnmounted: typeof import('vue').onUnmounted - const onUpdated: typeof import('vue').onUpdated - const onWatcherCleanup: typeof import('vue').onWatcherCleanup - const pausableWatch: typeof import('@vueuse/core').pausableWatch - const provide: typeof import('vue').provide - const provideLocal: typeof import('@vueuse/core').provideLocal - const reactify: typeof import('@vueuse/core').reactify - const reactifyObject: typeof import('@vueuse/core').reactifyObject - const reactive: typeof import('vue').reactive - const reactiveComputed: typeof import('@vueuse/core').reactiveComputed - const reactiveOmit: typeof import('@vueuse/core').reactiveOmit - const reactivePick: typeof import('@vueuse/core').reactivePick - const readonly: typeof import('vue').readonly - const ref: typeof import('vue').ref - const refAutoReset: typeof import('@vueuse/core').refAutoReset - const refDebounced: typeof import('@vueuse/core').refDebounced - const refDefault: typeof import('@vueuse/core').refDefault - const refManualReset: typeof import('@vueuse/core').refManualReset - const refThrottled: typeof import('@vueuse/core').refThrottled - const refWithControl: typeof import('@vueuse/core').refWithControl - const resolveComponent: typeof import('vue').resolveComponent - const resolveRef: typeof import('@vueuse/core').resolveRef - const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] - const setActivePinia: typeof import('pinia').setActivePinia - const setMapStoreSuffix: typeof import('pinia').setMapStoreSuffix - const shallowReactive: typeof import('vue').shallowReactive - const shallowReadonly: typeof import('vue').shallowReadonly - const shallowRef: typeof import('vue').shallowRef - const storeToRefs: typeof import('pinia').storeToRefs - const syncRef: typeof import('@vueuse/core').syncRef - const syncRefs: typeof import('@vueuse/core').syncRefs - const templateRef: typeof import('@vueuse/core').templateRef - const throttledRef: typeof import('@vueuse/core').throttledRef - const throttledWatch: typeof import('@vueuse/core').throttledWatch - const toRaw: typeof import('vue').toRaw - const toReactive: typeof import('@vueuse/core').toReactive - const toRef: typeof import('vue').toRef - const toRefs: typeof import('vue').toRefs - const toValue: typeof import('vue').toValue - const triggerRef: typeof import('vue').triggerRef - const tryOnBeforeMount: typeof import('@vueuse/core').tryOnBeforeMount - const tryOnBeforeUnmount: typeof import('@vueuse/core').tryOnBeforeUnmount - const tryOnMounted: typeof import('@vueuse/core').tryOnMounted - const tryOnScopeDispose: typeof import('@vueuse/core').tryOnScopeDispose - const tryOnUnmounted: typeof import('@vueuse/core').tryOnUnmounted - const unref: typeof import('vue').unref - const unrefElement: typeof import('@vueuse/core').unrefElement - const until: typeof import('@vueuse/core').until - const useActiveElement: typeof import('@vueuse/core').useActiveElement - const useAnimate: typeof import('@vueuse/core').useAnimate - const useArrayDifference: typeof import('@vueuse/core').useArrayDifference - const useArrayEvery: typeof import('@vueuse/core').useArrayEvery - const useArrayFilter: typeof import('@vueuse/core').useArrayFilter - const useArrayFind: typeof import('@vueuse/core').useArrayFind - const useArrayFindIndex: typeof import('@vueuse/core').useArrayFindIndex - const useArrayFindLast: typeof import('@vueuse/core').useArrayFindLast - const useArrayIncludes: typeof import('@vueuse/core').useArrayIncludes - const useArrayJoin: typeof import('@vueuse/core').useArrayJoin - const useArrayMap: typeof import('@vueuse/core').useArrayMap - const useArrayReduce: typeof import('@vueuse/core').useArrayReduce - const useArraySome: typeof import('@vueuse/core').useArraySome - const useArrayUnique: typeof import('@vueuse/core').useArrayUnique - const useAsyncQueue: typeof import('@vueuse/core').useAsyncQueue - const useAsyncState: typeof import('@vueuse/core').useAsyncState - const useAttrs: typeof import('vue').useAttrs - const useBase64: typeof import('@vueuse/core').useBase64 - const useBattery: typeof import('@vueuse/core').useBattery - const useBluetooth: typeof import('@vueuse/core').useBluetooth - const useBreakpoints: typeof import('@vueuse/core').useBreakpoints - const useBroadcastChannel: typeof import('@vueuse/core').useBroadcastChannel - const useBrowserLocation: typeof import('@vueuse/core').useBrowserLocation - const useCached: typeof import('@vueuse/core').useCached - const useClipboard: typeof import('@vueuse/core').useClipboard - const useClipboardItems: typeof import('@vueuse/core').useClipboardItems - const useCloned: typeof import('@vueuse/core').useCloned - const useColorMode: typeof import('@vueuse/core').useColorMode - const useConfirmDialog: typeof import('@vueuse/core').useConfirmDialog - const useCountdown: typeof import('@vueuse/core').useCountdown - const useCounter: typeof import('@vueuse/core').useCounter - const useCssModule: typeof import('vue').useCssModule - const useCssSupports: typeof import('@vueuse/core').useCssSupports - const useCssVar: typeof import('@vueuse/core').useCssVar - const useCssVars: typeof import('vue').useCssVars - const useCurrentElement: typeof import('@vueuse/core').useCurrentElement - const useCycleList: typeof import('@vueuse/core').useCycleList - const useDark: typeof import('@vueuse/core').useDark - const useDateFormat: typeof import('@vueuse/core').useDateFormat - const useDebounce: typeof import('@vueuse/core').useDebounce - const useDebounceFn: typeof import('@vueuse/core').useDebounceFn - const useDebouncedRefHistory: typeof import('@vueuse/core').useDebouncedRefHistory - const useDeviceMotion: typeof import('@vueuse/core').useDeviceMotion - const useDeviceOrientation: typeof import('@vueuse/core').useDeviceOrientation - const useDevicePixelRatio: typeof import('@vueuse/core').useDevicePixelRatio - const useDevicesList: typeof import('@vueuse/core').useDevicesList - const useDisplayMedia: typeof import('@vueuse/core').useDisplayMedia - const useDocumentVisibility: typeof import('@vueuse/core').useDocumentVisibility - const useDraggable: typeof import('@vueuse/core').useDraggable - const useDropZone: typeof import('@vueuse/core').useDropZone - const useElementBounding: typeof import('@vueuse/core').useElementBounding - const useElementByPoint: typeof import('@vueuse/core').useElementByPoint - const useElementHover: typeof import('@vueuse/core').useElementHover - const useElementSize: typeof import('@vueuse/core').useElementSize - const useElementVisibility: typeof import('@vueuse/core').useElementVisibility - const useEventBus: typeof import('@vueuse/core').useEventBus - const useEventListener: typeof import('@vueuse/core').useEventListener - const useEventSource: typeof import('@vueuse/core').useEventSource - const useEyeDropper: typeof import('@vueuse/core').useEyeDropper - const useFavicon: typeof import('@vueuse/core').useFavicon - const useFetch: typeof import('@vueuse/core').useFetch - const useFileDialog: typeof import('@vueuse/core').useFileDialog - const useFileSystemAccess: typeof import('@vueuse/core').useFileSystemAccess - const useFocus: typeof import('@vueuse/core').useFocus - const useFocusWithin: typeof import('@vueuse/core').useFocusWithin - const useFps: typeof import('@vueuse/core').useFps - const useFullscreen: typeof import('@vueuse/core').useFullscreen - const useGamepad: typeof import('@vueuse/core').useGamepad - const useGeolocation: typeof import('@vueuse/core').useGeolocation - const useId: typeof import('vue').useId - const useIdle: typeof import('@vueuse/core').useIdle - const useImage: typeof import('@vueuse/core').useImage - const useInfiniteScroll: typeof import('@vueuse/core').useInfiniteScroll - const useIntersectionObserver: typeof import('@vueuse/core').useIntersectionObserver - const useInterval: typeof import('@vueuse/core').useInterval - const useIntervalFn: typeof import('@vueuse/core').useIntervalFn - const useKeyModifier: typeof import('@vueuse/core').useKeyModifier - const useLastChanged: typeof import('@vueuse/core').useLastChanged - const useLink: typeof import('vue-router').useLink - const useLocalStorage: typeof import('@vueuse/core').useLocalStorage - const useMagicKeys: typeof import('@vueuse/core').useMagicKeys - const useManualRefHistory: typeof import('@vueuse/core').useManualRefHistory - const useMediaControls: typeof import('@vueuse/core').useMediaControls - const useMediaQuery: typeof import('@vueuse/core').useMediaQuery - const useMemoize: typeof import('@vueuse/core').useMemoize - const useMemory: typeof import('@vueuse/core').useMemory - const useModel: typeof import('vue').useModel - const useMounted: typeof import('@vueuse/core').useMounted - const useMouse: typeof import('@vueuse/core').useMouse - const useMouseInElement: typeof import('@vueuse/core').useMouseInElement - const useMousePressed: typeof import('@vueuse/core').useMousePressed - const useMutationObserver: typeof import('@vueuse/core').useMutationObserver - const useNavigatorLanguage: typeof import('@vueuse/core').useNavigatorLanguage - const useNetwork: typeof import('@vueuse/core').useNetwork - const useNow: typeof import('@vueuse/core').useNow - const useObjectUrl: typeof import('@vueuse/core').useObjectUrl - const useOffsetPagination: typeof import('@vueuse/core').useOffsetPagination - const useOnline: typeof import('@vueuse/core').useOnline - const usePageLeave: typeof import('@vueuse/core').usePageLeave - const useParallax: typeof import('@vueuse/core').useParallax - const useParentElement: typeof import('@vueuse/core').useParentElement - const usePerformanceObserver: typeof import('@vueuse/core').usePerformanceObserver - const usePermission: typeof import('@vueuse/core').usePermission - const usePointer: typeof import('@vueuse/core').usePointer - const usePointerLock: typeof import('@vueuse/core').usePointerLock - const usePointerSwipe: typeof import('@vueuse/core').usePointerSwipe - const usePreferredColorScheme: typeof import('@vueuse/core').usePreferredColorScheme - const usePreferredContrast: typeof import('@vueuse/core').usePreferredContrast - const usePreferredDark: typeof import('@vueuse/core').usePreferredDark - const usePreferredLanguages: typeof import('@vueuse/core').usePreferredLanguages - const usePreferredReducedMotion: typeof import('@vueuse/core').usePreferredReducedMotion - const usePreferredReducedTransparency: typeof import('@vueuse/core').usePreferredReducedTransparency - const usePrevious: typeof import('@vueuse/core').usePrevious - const useRafFn: typeof import('@vueuse/core').useRafFn - const useRefHistory: typeof import('@vueuse/core').useRefHistory - const useResizeObserver: typeof import('@vueuse/core').useResizeObserver - const useRoute: typeof import('vue-router').useRoute - const useRouter: typeof import('vue-router').useRouter - const useSSRWidth: typeof import('@vueuse/core').useSSRWidth - const useScreenOrientation: typeof import('@vueuse/core').useScreenOrientation - const useScreenSafeArea: typeof import('@vueuse/core').useScreenSafeArea - const useScriptTag: typeof import('@vueuse/core').useScriptTag - const useScroll: typeof import('@vueuse/core').useScroll - const useScrollLock: typeof import('@vueuse/core').useScrollLock - const useSessionStorage: typeof import('@vueuse/core').useSessionStorage - const useShare: typeof import('@vueuse/core').useShare - const useSlots: typeof import('vue').useSlots - const useSorted: typeof import('@vueuse/core').useSorted - const useSpeechRecognition: typeof import('@vueuse/core').useSpeechRecognition - const useSpeechSynthesis: typeof import('@vueuse/core').useSpeechSynthesis - const useStepper: typeof import('@vueuse/core').useStepper - const useStorage: typeof import('@vueuse/core').useStorage - const useStorageAsync: typeof import('@vueuse/core').useStorageAsync - const useStyleTag: typeof import('@vueuse/core').useStyleTag - const useSupported: typeof import('@vueuse/core').useSupported - const useSwipe: typeof import('@vueuse/core').useSwipe - const useTemplateRef: typeof import('vue').useTemplateRef - const useTemplateRefsList: typeof import('@vueuse/core').useTemplateRefsList - const useTextDirection: typeof import('@vueuse/core').useTextDirection - const useTextSelection: typeof import('@vueuse/core').useTextSelection - const useTextareaAutosize: typeof import('@vueuse/core').useTextareaAutosize - const useThrottle: typeof import('@vueuse/core').useThrottle - const useThrottleFn: typeof import('@vueuse/core').useThrottleFn - const useThrottledRefHistory: typeof import('@vueuse/core').useThrottledRefHistory - const useTimeAgo: typeof import('@vueuse/core').useTimeAgo - const useTimeAgoIntl: typeof import('@vueuse/core').useTimeAgoIntl - const useTimeout: typeof import('@vueuse/core').useTimeout - const useTimeoutFn: typeof import('@vueuse/core').useTimeoutFn - const useTimeoutPoll: typeof import('@vueuse/core').useTimeoutPoll - const useTimestamp: typeof import('@vueuse/core').useTimestamp - const useTitle: typeof import('@vueuse/core').useTitle - const useToNumber: typeof import('@vueuse/core').useToNumber - const useToString: typeof import('@vueuse/core').useToString - const useToggle: typeof import('@vueuse/core').useToggle - const useTransition: typeof import('@vueuse/core').useTransition - const useUrlSearchParams: typeof import('@vueuse/core').useUrlSearchParams - const useUserMedia: typeof import('@vueuse/core').useUserMedia - const useVModel: typeof import('@vueuse/core').useVModel - const useVModels: typeof import('@vueuse/core').useVModels - const useVibrate: typeof import('@vueuse/core').useVibrate - const useVirtualList: typeof import('@vueuse/core').useVirtualList - const useWakeLock: typeof import('@vueuse/core').useWakeLock - const useWebNotification: typeof import('@vueuse/core').useWebNotification - const useWebSocket: typeof import('@vueuse/core').useWebSocket - const useWebWorker: typeof import('@vueuse/core').useWebWorker - const useWebWorkerFn: typeof import('@vueuse/core').useWebWorkerFn - const useWindowFocus: typeof import('@vueuse/core').useWindowFocus - const useWindowScroll: typeof import('@vueuse/core').useWindowScroll - const useWindowSize: typeof import('@vueuse/core').useWindowSize - const watch: typeof import('vue').watch - const watchArray: typeof import('@vueuse/core').watchArray - const watchAtMost: typeof import('@vueuse/core').watchAtMost - const watchDebounced: typeof import('@vueuse/core').watchDebounced - const watchDeep: typeof import('@vueuse/core').watchDeep - const watchEffect: typeof import('vue').watchEffect - const watchIgnorable: typeof import('@vueuse/core').watchIgnorable - const watchImmediate: typeof import('@vueuse/core').watchImmediate - const watchOnce: typeof import('@vueuse/core').watchOnce - const watchPausable: typeof import('@vueuse/core').watchPausable - const watchPostEffect: typeof import('vue').watchPostEffect - const watchSyncEffect: typeof import('vue').watchSyncEffect - const watchThrottled: typeof import('@vueuse/core').watchThrottled - const watchTriggerable: typeof import('@vueuse/core').watchTriggerable - const watchWithFilter: typeof import('@vueuse/core').watchWithFilter - const whenever: typeof import('@vueuse/core').whenever -} -// for type re-export -declare global { - // @ts-ignore - export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' - import('vue') -}