Compare commits
2 Commits
9190f86fe8
...
renovate/l
| Author | SHA1 | Date | |
|---|---|---|---|
| 7c79e486a2 | |||
|
|
5bbbf488fe |
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"image": "ghcr.io/yanhao98/h-devcontainer:main",
|
|
||||||
"runArgs": [
|
|
||||||
"--hostname=devcontainer-host",
|
|
||||||
"--name=${localWorkspaceFolderBasename}-devcontainer"
|
|
||||||
],
|
|
||||||
"forwardPorts": [4730, 4731, 5901],
|
|
||||||
"portsAttributes": {
|
|
||||||
"4730": { "label": "开发服务器端口", "onAutoForward": "notify" },
|
|
||||||
"4731": { "label": "预览服务器端口", "onAutoForward": "notify" }
|
|
||||||
},
|
|
||||||
"containerEnv": {
|
|
||||||
"TZ": "${localEnv:TZ:Asia/Shanghai}"
|
|
||||||
},
|
|
||||||
"customizations": {
|
|
||||||
"vscode": {
|
|
||||||
"extensions": ["prettier.prettier-vscode", "vue.volar"],
|
|
||||||
"settings": {
|
|
||||||
// "tasks": { "version": "2.0.0", "tasks": [] },
|
|
||||||
"github.copilot.chat.codeGeneration.instructions": [
|
|
||||||
{
|
|
||||||
"text": "This dev container includes a lightweight Fluxbox based desktop that can be accessed using a VNC viewer or the web. GUI-based commands executed from the built-in VS Code terminal will open on the desktop automatically."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mounts": [
|
|
||||||
"source=${localWorkspaceFolderBasename}-node_modules,target=${containerWorkspaceFolder}/node_modules,type=volume",
|
|
||||||
"source=${localWorkspaceFolder}/.devcontainer/lifecycle-scripts.d,target=/usr/local/etc/lifecycle-scripts.d,type=bind,consistency=delegated"
|
|
||||||
],
|
|
||||||
"workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/${localWorkspaceFolderBasename},type=bind,consistency=delegated",
|
|
||||||
"initializeCommand": "docker pull ghcr.io/yanhao98/h-devcontainer:main;",
|
|
||||||
"onCreateCommand": "/usr/local/bin/run-lifecycle-scripts.sh onCreateCommand",
|
|
||||||
"updateContentCommand": "/usr/local/bin/run-lifecycle-scripts.sh updateContentCommand",
|
|
||||||
"postCreateCommand": "/usr/local/bin/run-lifecycle-scripts.sh postCreateCommand",
|
|
||||||
"postStartCommand": "/usr/local/bin/run-lifecycle-scripts.sh postStartCommand",
|
|
||||||
"postAttachCommand": "/usr/local/bin/run-lifecycle-scripts.sh postAttachCommand"
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/bin/zsh -eu
|
|
||||||
h-setup-zh-locale
|
|
||||||
|
|
||||||
h-setup-bun-bin
|
|
||||||
h-setup-pnpm-bin
|
|
||||||
|
|
||||||
h-setup-ai-claude-code --config
|
|
||||||
h-setup-ai-gemini-cli --config
|
|
||||||
|
|
||||||
h-setup-chromium
|
|
||||||
h-setup-desktop-lite
|
|
||||||
|
|
||||||
h-install-node-modules
|
|
||||||
|
|
||||||
echo "-----------------------------"
|
|
||||||
echo "开发容器已启动并配置完成!"
|
|
||||||
echo "-----------------------------"
|
|
||||||
6
.github/workflows/ci-cd.yaml
vendored
6
.github/workflows/ci-cd.yaml
vendored
@@ -14,10 +14,10 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
playwright:
|
playwright:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: mcr.microsoft.com/playwright:v1.57.0-noble
|
container: mcr.microsoft.com/playwright:v1.56.1-noble
|
||||||
steps:
|
steps:
|
||||||
- name: ⚙️ 设置 Node 环境
|
- name: ⚙️ 设置 Node 环境
|
||||||
uses: yanhao98/composite-actions/setup-node-environment@faab20ac2f9c85dfce1a4147fca493bf632bd744
|
uses: yanhao98/composite-actions/setup-node-environment@25eb4dc0c134cc9df2b7c569aa54140a366b45a8
|
||||||
# - name: 📥 安装 Playwright 浏览器
|
# - name: 📥 安装 Playwright 浏览器
|
||||||
# run: pnpm exec playwright install --with-deps
|
# run: pnpm exec playwright install --with-deps
|
||||||
- name: 📦 构建项目
|
- name: 📦 构建项目
|
||||||
@@ -32,7 +32,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🛠️ 设置Node环境
|
- name: 🛠️ 设置Node环境
|
||||||
uses: yanhao98/composite-actions/setup-node-environment@faab20ac2f9c85dfce1a4147fca493bf632bd744
|
uses: yanhao98/composite-actions/setup-node-environment@25eb4dc0c134cc9df2b7c569aa54140a366b45a8
|
||||||
|
|
||||||
- name: 🔍 静态代码分析
|
- name: 🔍 静态代码分析
|
||||||
run: pnpm run lint
|
run: pnpm run lint
|
||||||
|
|||||||
2
.github/workflows/测试最新依赖.yaml
vendored
2
.github/workflows/测试最新依赖.yaml
vendored
@@ -60,7 +60,7 @@ jobs:
|
|||||||
|
|
||||||
playwright:
|
playwright:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: mcr.microsoft.com/playwright:v1.57.0-noble
|
container: mcr.microsoft.com/playwright:v1.56.1-noble
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@main
|
- uses: actions/checkout@main
|
||||||
with:
|
with:
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,7 +7,6 @@ yarn-error.log*
|
|||||||
pnpm-debug.log*
|
pnpm-debug.log*
|
||||||
lerna-debug.log*
|
lerna-debug.log*
|
||||||
|
|
||||||
.pnpm-store
|
|
||||||
node_modules
|
node_modules
|
||||||
.DS_Store
|
.DS_Store
|
||||||
dist
|
dist
|
||||||
|
|||||||
@@ -8,6 +8,6 @@ cat $1
|
|||||||
echo "🟢 [Commit-msg] Node 版本:$(node -v)"
|
echo "🟢 [Commit-msg] Node 版本:$(node -v)"
|
||||||
|
|
||||||
# pnpm exec commitlint --edit $1
|
# pnpm exec commitlint --edit $1
|
||||||
node node_modules/@commitlint/cli/cli.js --edit $1
|
time node node_modules/@commitlint/cli/cli.js --edit $1
|
||||||
|
|
||||||
echo "📝 [Commit-msg] commit-msg 钩子完成!"
|
echo "📝 [Commit-msg] commit-msg 钩子完成!"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# 此钩子在 git merge 或 git pull 成功完成后运行。
|
# 此钩子在 git merge 或 git pull 成功完成后运行。
|
||||||
echo "🔗 [Post-merge] 正在安装依赖..."
|
echo "🔗 [Post-merge] 正在安装依赖..."
|
||||||
pnpm install
|
time pnpm install
|
||||||
echo "🔗 [Post-merge] 依赖安装完成!"
|
echo "🔗 [Post-merge] 依赖安装完成!"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 此钩子在执行 git commit 命令时,在创建提交之前运行。
|
# 此钩子在执行 git commit 命令时,在创建提交之前运行。
|
||||||
echo "🧹 [Pre-commit] 正在运行 lint-staged..."
|
echo "🧹 [Pre-commit] 正在运行 lint-staged..."
|
||||||
pnpm exec lint-staged
|
time pnpm exec lint-staged
|
||||||
pnpm run lint:vue-i18n-extract
|
time pnpm run lint:vue-i18n-extract
|
||||||
# pnpm run type-check
|
# time pnpm run type-check
|
||||||
echo "🧹 [Pre-commit] lint-staged 完成!"
|
echo "🧹 [Pre-commit] lint-staged 完成!"
|
||||||
|
|||||||
8
.npmrc
8
.npmrc
@@ -1 +1,9 @@
|
|||||||
# registry=https://registry.npmmirror.com/
|
# registry=https://registry.npmmirror.com/
|
||||||
|
|
||||||
|
# https://pnpm.io/zh/npmrc#node-mirrorltreleasedir
|
||||||
|
use-node-version=24.7.0
|
||||||
|
node-mirror:release=https://npmmirror.com/mirrors/node/ # pnpm config set node-mirror:release=https://npmmirror.com/mirrors/node/
|
||||||
|
node-mirror:rc=https://npmmirror.com/mirrors/node-rc/
|
||||||
|
node-mirror:nightly=https://npmmirror.com/mirrors/node-nightly/
|
||||||
|
|
||||||
|
# shamefully-hoist=true
|
||||||
|
|||||||
@@ -4,6 +4,5 @@
|
|||||||
"tabWidth": 2,
|
"tabWidth": 2,
|
||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
"printWidth": 100,
|
"printWidth": 100,
|
||||||
"trailingComma": "all",
|
"trailingComma": "all"
|
||||||
"plugins": ["@prettier/plugin-oxc"]
|
|
||||||
}
|
}
|
||||||
|
|||||||
5
.vscode/extensions.json
vendored
5
.vscode/extensions.json
vendored
@@ -2,11 +2,10 @@
|
|||||||
"recommendations": [
|
"recommendations": [
|
||||||
"Vue.volar",
|
"Vue.volar",
|
||||||
"vitest.explorer",
|
"vitest.explorer",
|
||||||
|
"ms-playwright.playwright",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"EditorConfig.EditorConfig",
|
"EditorConfig.EditorConfig",
|
||||||
"oxc.oxc-vscode",
|
"oxc.oxc-vscode",
|
||||||
"prettier.prettier-vscode",
|
"esbenp.prettier-vscode"
|
||||||
"stylelint.vscode-stylelint",
|
|
||||||
"lokalise.i18n-ally"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
61
.vscode/settings.json
vendored
61
.vscode/settings.json
vendored
@@ -1,56 +1,28 @@
|
|||||||
{
|
{
|
||||||
"typescript.tsdk": "node_modules/typescript/lib",
|
|
||||||
"typescript.preferences.autoImportFileExcludePatterns": [
|
|
||||||
"vue-router$",
|
|
||||||
"**/src/composables/**",
|
|
||||||
"**/*-auto-imports.ts",
|
|
||||||
"**/*-auto-imports.types.ts"
|
|
||||||
],
|
|
||||||
"search.exclude": {
|
|
||||||
"public/report-ui-dist": true
|
|
||||||
},
|
|
||||||
|
|
||||||
// ============================================================
|
|
||||||
// 代码格式化相关配置
|
|
||||||
// ============================================================
|
|
||||||
"prettier.enable": true,
|
|
||||||
"files.readonlyInclude": {
|
|
||||||
"dist/**": true
|
|
||||||
},
|
|
||||||
"eslint.enable": true,
|
|
||||||
"oxc.enable": true,
|
|
||||||
"stylelint.enable": true,
|
|
||||||
"editor.formatOnSave": true,
|
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll": "explicit",
|
"source.fixAll": "explicit",
|
||||||
"source.fixAll.eslint": "explicit",
|
"source.fixAll.eslint": "explicit",
|
||||||
"source.fixAll.oxc": "explicit",
|
|
||||||
"source.fixAll.stylelint": "explicit",
|
"source.fixAll.stylelint": "explicit",
|
||||||
"source.organizeImports": "explicit"
|
"source.fixAll.oxc": "explicit",
|
||||||
|
"source.organizeImports": "never"
|
||||||
},
|
},
|
||||||
|
"eslint.enable": true,
|
||||||
|
"stylelint.enable": true,
|
||||||
|
"oxc.enable": true,
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
|
||||||
"stylelint.validate": ["css", "less", "postcss", "scss", "vue"],
|
"stylelint.validate": ["css", "less", "postcss", "scss", "vue"],
|
||||||
"scss.lint.unknownAtRules": "ignore",
|
"scss.lint.unknownAtRules": "ignore",
|
||||||
"css.lint.unknownAtRules": "ignore",
|
"css.lint.unknownAtRules": "ignore",
|
||||||
"less.lint.unknownAtRules": "ignore",
|
"less.lint.unknownAtRules": "ignore",
|
||||||
"editor.defaultFormatter": "prettier.prettier-vscode",
|
|
||||||
"[typescript]": {
|
|
||||||
"editor.defaultFormatter": "prettier.prettier-vscode"
|
|
||||||
},
|
|
||||||
"[vue]": {
|
|
||||||
"editor.defaultFormatter": "prettier.prettier-vscode"
|
|
||||||
},
|
|
||||||
"[json]": {
|
|
||||||
"editor.defaultFormatter": "prettier.prettier-vscode"
|
|
||||||
},
|
|
||||||
"[jsonc]": {
|
|
||||||
"editor.defaultFormatter": "prettier.prettier-vscode"
|
|
||||||
},
|
|
||||||
|
|
||||||
// ============================================================
|
"[vue]": {
|
||||||
// i18n-ally 配置
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
// ============================================================
|
},
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
|
|
||||||
// >>>>>
|
// >>>>>
|
||||||
"i18n-ally.readonly": false,
|
"i18n-ally.readonly": true,
|
||||||
"i18n-ally.namespace": false /* 禁用命名空间(@intlify/unplugin-vue-i18n不支持吧?) */,
|
"i18n-ally.namespace": false /* 禁用命名空间(@intlify/unplugin-vue-i18n不支持吧?) */,
|
||||||
"i18n-ally.localesPaths": ["src/locales/demo", "src/locales"],
|
"i18n-ally.localesPaths": ["src/locales/demo", "src/locales"],
|
||||||
// https://github.com/lokalise/i18n-ally/wiki/Path-Matcher
|
// https://github.com/lokalise/i18n-ally/wiki/Path-Matcher
|
||||||
@@ -59,7 +31,12 @@
|
|||||||
"i18n-ally.enabledParsers": ["json"],
|
"i18n-ally.enabledParsers": ["json"],
|
||||||
"i18n-ally.keystyle": "nested",
|
"i18n-ally.keystyle": "nested",
|
||||||
"i18n-ally.sourceLanguage": "zh-CN", // 翻译源语言 (源文件) 根据此语言文件翻译其他语言文件的变量和内容
|
"i18n-ally.sourceLanguage": "zh-CN", // 翻译源语言 (源文件) 根据此语言文件翻译其他语言文件的变量和内容
|
||||||
"i18n-ally.displayLanguage": "zh-CN" // 显示语言 (显示文件/翻译文件)
|
"i18n-ally.displayLanguage": "zh-CN", // 显示语言 (显示文件/翻译文件)
|
||||||
// <<<<<
|
// <<<<<
|
||||||
|
|
||||||
|
// https://github.com/copilot/share/8a1a019a-0180-80e7-8141-a40be02c4006
|
||||||
// "iconify.customCollectionJsonPaths": ["https://example.com/my-icons.json", "./local/icons.json"],
|
// "iconify.customCollectionJsonPaths": ["https://example.com/my-icons.json", "./local/icons.json"],
|
||||||
|
|
||||||
|
"typescript.tsdk": "node_modules/typescript/lib",
|
||||||
|
"typescript.preferences.autoImportFileExcludePatterns": ["vue-router/auto$"]
|
||||||
}
|
}
|
||||||
|
|||||||
24
.vscode/tasks.json
vendored
24
.vscode/tasks.json
vendored
@@ -6,12 +6,16 @@
|
|||||||
"script": "dev",
|
"script": "dev",
|
||||||
"label": "🚀 dev",
|
"label": "🚀 dev",
|
||||||
"detail": "启动开发服务器",
|
"detail": "启动开发服务器",
|
||||||
"problemMatcher": [],
|
"problemMatcher": {
|
||||||
"isBackground": true,
|
"pattern": { "regexp": "." },
|
||||||
"presentation": {
|
"background": {
|
||||||
"reveal": "always", // 控制运行任务的终端是否显示。可按选项 "revealProblems" 进行替代。默认设置为“始终”。
|
"activeOnStart": true,
|
||||||
"panel": "dedicated" // dedicated:一个任务独占一个终端,方便查看特定任务的日志,不会被其他任务干扰。
|
"beginsPattern": "VITE.*ready in",
|
||||||
|
"endsPattern": "(Local|Network):.*http"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
"isBackground": true,
|
||||||
|
"presentation": { "reveal": "always", "panel": "dedicated" },
|
||||||
"group": { "kind": "build", "isDefault": false }
|
"group": { "kind": "build", "isDefault": false }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -19,6 +23,7 @@
|
|||||||
"script": "build-only",
|
"script": "build-only",
|
||||||
"label": "🔨 build-only",
|
"label": "🔨 build-only",
|
||||||
"detail": "" /* 如果为空或省略,VSCode 将自动使用 package.json 中 scripts[scriptName] 的值作为 detail */,
|
"detail": "" /* 如果为空或省略,VSCode 将自动使用 package.json 中 scripts[scriptName] 的值作为 detail */,
|
||||||
|
"problemMatcher": ["$tsc"],
|
||||||
"presentation": { "reveal": "always", "panel": "shared" },
|
"presentation": { "reveal": "always", "panel": "shared" },
|
||||||
"group": { "kind": "none", "isDefault": false }
|
"group": { "kind": "none", "isDefault": false }
|
||||||
},
|
},
|
||||||
@@ -28,7 +33,14 @@
|
|||||||
"label": "☁️ wrangler:dev",
|
"label": "☁️ wrangler:dev",
|
||||||
"detail": "启动 Cloudflare Workers 开发服务器,相当于预览",
|
"detail": "启动 Cloudflare Workers 开发服务器,相当于预览",
|
||||||
"dependsOn": ["🔨 build-only"],
|
"dependsOn": ["🔨 build-only"],
|
||||||
"problemMatcher": [],
|
"problemMatcher": {
|
||||||
|
"pattern": { "regexp": "." },
|
||||||
|
"background": {
|
||||||
|
"activeOnStart": true,
|
||||||
|
"beginsPattern": "wrangler dev",
|
||||||
|
"endsPattern": "Ready on"
|
||||||
|
}
|
||||||
|
},
|
||||||
"isBackground": true,
|
"isBackground": true,
|
||||||
"presentation": { "reveal": "always", "panel": "dedicated" },
|
"presentation": { "reveal": "always", "panel": "dedicated" },
|
||||||
"group": { "kind": "build", "isDefault": false }
|
"group": { "kind": "build", "isDefault": false }
|
||||||
|
|||||||
20
AGENTS.md
20
AGENTS.md
@@ -9,7 +9,6 @@ Vue 3 TypeScript application with Vite.
|
|||||||
## 开发服务器
|
## 开发服务器
|
||||||
|
|
||||||
- **不要启动开发服务器**: 开发服务器通常已经由用户启动。除非特别要求,否则不要执行 `pnpm dev` 之类的命令。
|
- **不要启动开发服务器**: 开发服务器通常已经由用户启动。除非特别要求,否则不要执行 `pnpm dev` 之类的命令。
|
||||||
- **不要执行 Playwright 测试**: 除非用户明确要求,否则不要运行 Playwright 端到端测试。
|
|
||||||
|
|
||||||
### Routing & Layouts
|
### Routing & Layouts
|
||||||
|
|
||||||
@@ -47,6 +46,25 @@ Multiple auto-import systems are active:
|
|||||||
Project has multiple UI frameworks configured:
|
Project has multiple UI frameworks configured:
|
||||||
|
|
||||||
- **Naive UI**
|
- **Naive UI**
|
||||||
|
- **Form Layout**: When using `NGrid` for form layouts, prefer `NFormItemGi` over nesting `NFormItem` inside `NGridItem` for more concise code.
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<!-- ❌ Avoid: Verbose nesting -->
|
||||||
|
<NGrid :cols="4">
|
||||||
|
<NGridItem>
|
||||||
|
<NFormItem label="Username">
|
||||||
|
<NInput />
|
||||||
|
</NFormItem>
|
||||||
|
</NGridItem>
|
||||||
|
</NGrid>
|
||||||
|
|
||||||
|
<!-- ✅ Use: Concise and direct -->
|
||||||
|
<NGrid :cols="4">
|
||||||
|
<NFormItemGi label="Username">
|
||||||
|
<NInput />
|
||||||
|
</NFormItemGi>
|
||||||
|
</NGrid>
|
||||||
|
```
|
||||||
|
|
||||||
- **PrimeVue**:
|
- **PrimeVue**:
|
||||||
|
|
||||||
|
|||||||
664
auto-imports.d.ts
vendored
664
auto-imports.d.ts
vendored
@@ -6,335 +6,335 @@
|
|||||||
// biome-ignore lint: disable
|
// biome-ignore lint: disable
|
||||||
export {}
|
export {}
|
||||||
declare global {
|
declare global {
|
||||||
const ConfirmationService: typeof import('utils4u/primevue').ConfirmationService
|
const ConfirmationService: typeof import('utils4u/primevue')['ConfirmationService']
|
||||||
const DialogService: typeof import('utils4u/primevue').DialogService
|
const DialogService: typeof import('utils4u/primevue')['DialogService']
|
||||||
const EffectScope: typeof import('vue').EffectScope
|
const EffectScope: typeof import('vue')['EffectScope']
|
||||||
const ToastService: typeof import('utils4u/primevue').ToastService
|
const ToastService: typeof import('utils4u/primevue')['ToastService']
|
||||||
const acceptHMRUpdate: typeof import('pinia').acceptHMRUpdate
|
const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
|
||||||
const arrayToTree: typeof import('utils4u/array').arrayToTree
|
const arrayToTree: typeof import('utils4u/array')['arrayToTree']
|
||||||
const asyncComputed: typeof import('@vueuse/core').asyncComputed
|
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
|
||||||
const autoResetRef: typeof import('@vueuse/core').autoResetRef
|
const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
|
||||||
const computed: typeof import('vue').computed
|
const computed: typeof import('vue')['computed']
|
||||||
const computedAsync: typeof import('@vueuse/core').computedAsync
|
const computedAsync: typeof import('@vueuse/core')['computedAsync']
|
||||||
const computedEager: typeof import('@vueuse/core').computedEager
|
const computedEager: typeof import('@vueuse/core')['computedEager']
|
||||||
const computedInject: typeof import('@vueuse/core').computedInject
|
const computedInject: typeof import('@vueuse/core')['computedInject']
|
||||||
const computedWithControl: typeof import('@vueuse/core').computedWithControl
|
const computedWithControl: typeof import('@vueuse/core')['computedWithControl']
|
||||||
const consola: typeof import('consola/browser').consola
|
const consola: typeof import('consola/browser')['consola']
|
||||||
const controlledComputed: typeof import('@vueuse/core').controlledComputed
|
const controlledComputed: typeof import('@vueuse/core')['controlledComputed']
|
||||||
const controlledRef: typeof import('@vueuse/core').controlledRef
|
const controlledRef: typeof import('@vueuse/core')['controlledRef']
|
||||||
const convertFileToBase64: typeof import('utils4u/browser').convertFileToBase64
|
const convertFileToBase64: typeof import('utils4u/browser')['convertFileToBase64']
|
||||||
const createApp: typeof import('vue').createApp
|
const createApp: typeof import('vue')['createApp']
|
||||||
const createEventHook: typeof import('@vueuse/core').createEventHook
|
const createEventHook: typeof import('@vueuse/core')['createEventHook']
|
||||||
const createGlobalState: typeof import('@vueuse/core').createGlobalState
|
const createGlobalState: typeof import('@vueuse/core')['createGlobalState']
|
||||||
const createInjectionState: typeof import('@vueuse/core').createInjectionState
|
const createInjectionState: typeof import('@vueuse/core')['createInjectionState']
|
||||||
const createLogGuard: typeof import('utils4u/vue-router').createLogGuard
|
const createLogGuard: typeof import('utils4u/vue-router')['createLogGuard']
|
||||||
const createNProgressGuard: typeof import('utils4u/vue-router').createNProgressGuard
|
const createNProgressGuard: typeof import('utils4u/vue-router')['createNProgressGuard']
|
||||||
const createPinia: typeof import('pinia').createPinia
|
const createPinia: typeof import('pinia')['createPinia']
|
||||||
const createReactiveFn: typeof import('@vueuse/core').createReactiveFn
|
const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn']
|
||||||
const createRef: typeof import('@vueuse/core').createRef
|
const createRef: typeof import('@vueuse/core')['createRef']
|
||||||
const createReusableTemplate: typeof import('@vueuse/core').createReusableTemplate
|
const createReusableTemplate: typeof import('@vueuse/core')['createReusableTemplate']
|
||||||
const createSharedComposable: typeof import('@vueuse/core').createSharedComposable
|
const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable']
|
||||||
const createStackGuard: typeof import('utils4u/vue-router').createStackGuard
|
const createStackGuard: typeof import('utils4u/vue-router')['createStackGuard']
|
||||||
const createTemplatePromise: typeof import('@vueuse/core').createTemplatePromise
|
const createTemplatePromise: typeof import('@vueuse/core')['createTemplatePromise']
|
||||||
const createUnrefFn: typeof import('@vueuse/core').createUnrefFn
|
const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn']
|
||||||
const customRef: typeof import('vue').customRef
|
const customRef: typeof import('vue')['customRef']
|
||||||
const debouncedRef: typeof import('@vueuse/core').debouncedRef
|
const debouncedRef: typeof import('@vueuse/core')['debouncedRef']
|
||||||
const debouncedWatch: typeof import('@vueuse/core').debouncedWatch
|
const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
|
||||||
const deepFreeze: typeof import('deep-freeze-es6').default
|
const deepFreeze: typeof import('deep-freeze-es6')['default']
|
||||||
const defineAsyncComponent: typeof import('vue').defineAsyncComponent
|
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
|
||||||
const defineBasicLoader: typeof import('unplugin-vue-router/data-loaders/basic').defineBasicLoader
|
const defineComponent: typeof import('vue')['defineComponent']
|
||||||
const defineComponent: typeof import('vue').defineComponent
|
const defineStore: typeof import('pinia')['defineStore']
|
||||||
const defineStore: typeof import('pinia').defineStore
|
const eagerComputed: typeof import('@vueuse/core')['eagerComputed']
|
||||||
const eagerComputed: typeof import('@vueuse/core').eagerComputed
|
const effectScope: typeof import('vue')['effectScope']
|
||||||
const effectScope: typeof import('vue').effectScope
|
const extendRef: typeof import('@vueuse/core')['extendRef']
|
||||||
const extendRef: typeof import('@vueuse/core').extendRef
|
const getActivePinia: typeof import('pinia')['getActivePinia']
|
||||||
const getActivePinia: typeof import('pinia').getActivePinia
|
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
|
||||||
const getCurrentInstance: typeof import('vue').getCurrentInstance
|
const getCurrentScope: typeof import('vue')['getCurrentScope']
|
||||||
const getCurrentScope: typeof import('vue').getCurrentScope
|
const getCurrentWatcher: typeof import('vue')['getCurrentWatcher']
|
||||||
const getCurrentWatcher: typeof import('vue').getCurrentWatcher
|
const h: typeof import('vue')['h']
|
||||||
const h: typeof import('vue').h
|
const i18nInstance: typeof import('./src/locales-utils/i18n-auto-imports')['i18nInstance']
|
||||||
const i18nInstance: typeof import('./src/locales-utils/i18n-auto-imports').i18nInstance
|
const i18nRouteMessages: typeof import('./src/locales-utils/route-messages/route-messages-auto-imports')['i18nRouteMessages']
|
||||||
const i18nRouteMessages: typeof import('./src/locales-utils/route-messages/route-messages-auto-imports').i18nRouteMessages
|
const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch']
|
||||||
const ignorableWatch: typeof import('@vueuse/core').ignorableWatch
|
const inject: typeof import('vue')['inject']
|
||||||
const inject: typeof import('vue').inject
|
const injectLocal: typeof import('@vueuse/core')['injectLocal']
|
||||||
const injectLocal: typeof import('@vueuse/core').injectLocal
|
const isDefined: typeof import('@vueuse/core')['isDefined']
|
||||||
const isDefined: typeof import('@vueuse/core').isDefined
|
const isProxy: typeof import('vue')['isProxy']
|
||||||
const isProxy: typeof import('vue').isProxy
|
const isReactive: typeof import('vue')['isReactive']
|
||||||
const isReactive: typeof import('vue').isReactive
|
const isReadonly: typeof import('vue')['isReadonly']
|
||||||
const isReadonly: typeof import('vue').isReadonly
|
const isRef: typeof import('vue')['isRef']
|
||||||
const isRef: typeof import('vue').isRef
|
const isShallow: typeof import('vue')['isShallow']
|
||||||
const isShallow: typeof import('vue').isShallow
|
const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable']
|
||||||
const makeDestructurable: typeof import('@vueuse/core').makeDestructurable
|
const mapActions: typeof import('pinia')['mapActions']
|
||||||
const mapActions: typeof import('pinia').mapActions
|
const mapGetters: typeof import('pinia')['mapGetters']
|
||||||
const mapGetters: typeof import('pinia').mapGetters
|
const mapState: typeof import('pinia')['mapState']
|
||||||
const mapState: typeof import('pinia').mapState
|
const mapStores: typeof import('pinia')['mapStores']
|
||||||
const mapStores: typeof import('pinia').mapStores
|
const mapWritableState: typeof import('pinia')['mapWritableState']
|
||||||
const mapWritableState: typeof import('pinia').mapWritableState
|
const markRaw: typeof import('vue')['markRaw']
|
||||||
const markRaw: typeof import('vue').markRaw
|
const nextTick: typeof import('vue')['nextTick']
|
||||||
const nextTick: typeof import('vue').nextTick
|
const onActivated: typeof import('vue')['onActivated']
|
||||||
const onActivated: typeof import('vue').onActivated
|
const onBeforeMount: typeof import('vue')['onBeforeMount']
|
||||||
const onBeforeMount: typeof import('vue').onBeforeMount
|
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
|
||||||
const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave
|
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
|
||||||
const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate
|
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
|
||||||
const onBeforeUnmount: typeof import('vue').onBeforeUnmount
|
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
|
||||||
const onBeforeUpdate: typeof import('vue').onBeforeUpdate
|
const onClickOutside: typeof import('@vueuse/core')['onClickOutside']
|
||||||
const onClickOutside: typeof import('@vueuse/core').onClickOutside
|
const onDeactivated: typeof import('vue')['onDeactivated']
|
||||||
const onDeactivated: typeof import('vue').onDeactivated
|
const onElementRemoval: typeof import('@vueuse/core')['onElementRemoval']
|
||||||
const onElementRemoval: typeof import('@vueuse/core').onElementRemoval
|
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
|
||||||
const onErrorCaptured: typeof import('vue').onErrorCaptured
|
const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke']
|
||||||
const onKeyStroke: typeof import('@vueuse/core').onKeyStroke
|
const onLongPress: typeof import('@vueuse/core')['onLongPress']
|
||||||
const onLongPress: typeof import('@vueuse/core').onLongPress
|
const onMounted: typeof import('vue')['onMounted']
|
||||||
const onMounted: typeof import('vue').onMounted
|
const onRenderTracked: typeof import('vue')['onRenderTracked']
|
||||||
const onRenderTracked: typeof import('vue').onRenderTracked
|
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
|
||||||
const onRenderTriggered: typeof import('vue').onRenderTriggered
|
const onScopeDispose: typeof import('vue')['onScopeDispose']
|
||||||
const onScopeDispose: typeof import('vue').onScopeDispose
|
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
|
||||||
const onServerPrefetch: typeof import('vue').onServerPrefetch
|
const onStartTyping: typeof import('@vueuse/core')['onStartTyping']
|
||||||
const onStartTyping: typeof import('@vueuse/core').onStartTyping
|
const onUnmounted: typeof import('vue')['onUnmounted']
|
||||||
const onUnmounted: typeof import('vue').onUnmounted
|
const onUpdated: typeof import('vue')['onUpdated']
|
||||||
const onUpdated: typeof import('vue').onUpdated
|
const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
|
||||||
const onWatcherCleanup: typeof import('vue').onWatcherCleanup
|
const pausableWatch: typeof import('@vueuse/core')['pausableWatch']
|
||||||
const pausableWatch: typeof import('@vueuse/core').pausableWatch
|
const provide: typeof import('vue')['provide']
|
||||||
const provide: typeof import('vue').provide
|
const provideLocal: typeof import('@vueuse/core')['provideLocal']
|
||||||
const provideLocal: typeof import('@vueuse/core').provideLocal
|
const reactify: typeof import('@vueuse/core')['reactify']
|
||||||
const reactify: typeof import('@vueuse/core').reactify
|
const reactifyObject: typeof import('@vueuse/core')['reactifyObject']
|
||||||
const reactifyObject: typeof import('@vueuse/core').reactifyObject
|
const reactive: typeof import('vue')['reactive']
|
||||||
const reactive: typeof import('vue').reactive
|
const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed']
|
||||||
const reactiveComputed: typeof import('@vueuse/core').reactiveComputed
|
const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit']
|
||||||
const reactiveOmit: typeof import('@vueuse/core').reactiveOmit
|
const reactivePick: typeof import('@vueuse/core')['reactivePick']
|
||||||
const reactivePick: typeof import('@vueuse/core').reactivePick
|
const readonly: typeof import('vue')['readonly']
|
||||||
const readonly: typeof import('vue').readonly
|
const ref: typeof import('vue')['ref']
|
||||||
const ref: typeof import('vue').ref
|
const refAutoReset: typeof import('@vueuse/core')['refAutoReset']
|
||||||
const refAutoReset: typeof import('@vueuse/core').refAutoReset
|
const refDebounced: typeof import('@vueuse/core')['refDebounced']
|
||||||
const refDebounced: typeof import('@vueuse/core').refDebounced
|
const refDefault: typeof import('@vueuse/core')['refDefault']
|
||||||
const refDefault: typeof import('@vueuse/core').refDefault
|
const refThrottled: typeof import('@vueuse/core')['refThrottled']
|
||||||
const refManualReset: typeof import('@vueuse/core').refManualReset
|
const refWithControl: typeof import('@vueuse/core')['refWithControl']
|
||||||
const refThrottled: typeof import('@vueuse/core').refThrottled
|
const resolveComponent: typeof import('vue')['resolveComponent']
|
||||||
const refWithControl: typeof import('@vueuse/core').refWithControl
|
const resolveRef: typeof import('@vueuse/core')['resolveRef']
|
||||||
const resolveComponent: typeof import('vue').resolveComponent
|
const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
|
||||||
const resolveRef: typeof import('@vueuse/core').resolveRef
|
const routeI18nInstance: typeof import('./src/locales-utils/i18n-auto-imports')['routeI18nInstance']
|
||||||
const routeI18nInstance: typeof import('./src/locales-utils/i18n-auto-imports').routeI18nInstance
|
const setActivePinia: typeof import('pinia')['setActivePinia']
|
||||||
const routeI18nT: typeof import('./src/locales-utils/i18n-auto-imports').routeI18nT
|
const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix']
|
||||||
const setActivePinia: typeof import('pinia').setActivePinia
|
const setViewportCSSVars: typeof import('utils4u/browser')['setViewportCSSVars']
|
||||||
const setMapStoreSuffix: typeof import('pinia').setMapStoreSuffix
|
const shallowReactive: typeof import('vue')['shallowReactive']
|
||||||
const setViewportCSSVars: typeof import('utils4u/browser').setViewportCSSVars
|
const shallowReadonly: typeof import('vue')['shallowReadonly']
|
||||||
const shallowReactive: typeof import('vue').shallowReactive
|
const shallowRef: typeof import('vue')['shallowRef']
|
||||||
const shallowReadonly: typeof import('vue').shallowReadonly
|
const showOpenFilePicker: typeof import('utils4u/browser')['showOpenFilePicker']
|
||||||
const shallowRef: typeof import('vue').shallowRef
|
const storeToRefs: typeof import('pinia')['storeToRefs']
|
||||||
const showOpenFilePicker: typeof import('utils4u/browser').showOpenFilePicker
|
const syncRef: typeof import('@vueuse/core')['syncRef']
|
||||||
const storeToRefs: typeof import('pinia').storeToRefs
|
const syncRefs: typeof import('@vueuse/core')['syncRefs']
|
||||||
const syncRef: typeof import('@vueuse/core').syncRef
|
const templateRef: typeof import('@vueuse/core')['templateRef']
|
||||||
const syncRefs: typeof import('@vueuse/core').syncRefs
|
const throttledRef: typeof import('@vueuse/core')['throttledRef']
|
||||||
const templateRef: typeof import('@vueuse/core').templateRef
|
const throttledWatch: typeof import('@vueuse/core')['throttledWatch']
|
||||||
const throttledRef: typeof import('@vueuse/core').throttledRef
|
const toRaw: typeof import('vue')['toRaw']
|
||||||
const throttledWatch: typeof import('@vueuse/core').throttledWatch
|
const toReactive: typeof import('@vueuse/core')['toReactive']
|
||||||
const toRaw: typeof import('vue').toRaw
|
const toRef: typeof import('vue')['toRef']
|
||||||
const toReactive: typeof import('@vueuse/core').toReactive
|
const toRefs: typeof import('vue')['toRefs']
|
||||||
const toRef: typeof import('vue').toRef
|
const toValue: typeof import('vue')['toValue']
|
||||||
const toRefs: typeof import('vue').toRefs
|
const triggerRef: typeof import('vue')['triggerRef']
|
||||||
const toValue: typeof import('vue').toValue
|
const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount']
|
||||||
const triggerRef: typeof import('vue').triggerRef
|
const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount']
|
||||||
const tryOnBeforeMount: typeof import('@vueuse/core').tryOnBeforeMount
|
const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted']
|
||||||
const tryOnBeforeUnmount: typeof import('@vueuse/core').tryOnBeforeUnmount
|
const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose']
|
||||||
const tryOnMounted: typeof import('@vueuse/core').tryOnMounted
|
const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted']
|
||||||
const tryOnScopeDispose: typeof import('@vueuse/core').tryOnScopeDispose
|
const unref: typeof import('vue')['unref']
|
||||||
const tryOnUnmounted: typeof import('@vueuse/core').tryOnUnmounted
|
const unrefElement: typeof import('@vueuse/core')['unrefElement']
|
||||||
const unref: typeof import('vue').unref
|
const until: typeof import('@vueuse/core')['until']
|
||||||
const unrefElement: typeof import('@vueuse/core').unrefElement
|
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
|
||||||
const until: typeof import('@vueuse/core').until
|
const useAnimate: typeof import('@vueuse/core')['useAnimate']
|
||||||
const useActiveElement: typeof import('@vueuse/core').useActiveElement
|
const useAppStore: typeof import('./src/stores/app-store-auto-imports')['useAppStore']
|
||||||
const useAnimate: typeof import('@vueuse/core').useAnimate
|
const useArrayDifference: typeof import('@vueuse/core')['useArrayDifference']
|
||||||
const useAppStore: typeof import('./src/stores/app-store-auto-imports').useAppStore
|
const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery']
|
||||||
const useArrayDifference: typeof import('@vueuse/core').useArrayDifference
|
const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter']
|
||||||
const useArrayEvery: typeof import('@vueuse/core').useArrayEvery
|
const useArrayFind: typeof import('@vueuse/core')['useArrayFind']
|
||||||
const useArrayFilter: typeof import('@vueuse/core').useArrayFilter
|
const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex']
|
||||||
const useArrayFind: typeof import('@vueuse/core').useArrayFind
|
const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast']
|
||||||
const useArrayFindIndex: typeof import('@vueuse/core').useArrayFindIndex
|
const useArrayIncludes: typeof import('@vueuse/core')['useArrayIncludes']
|
||||||
const useArrayFindLast: typeof import('@vueuse/core').useArrayFindLast
|
const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin']
|
||||||
const useArrayIncludes: typeof import('@vueuse/core').useArrayIncludes
|
const useArrayMap: typeof import('@vueuse/core')['useArrayMap']
|
||||||
const useArrayJoin: typeof import('@vueuse/core').useArrayJoin
|
const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce']
|
||||||
const useArrayMap: typeof import('@vueuse/core').useArrayMap
|
const useArraySome: typeof import('@vueuse/core')['useArraySome']
|
||||||
const useArrayReduce: typeof import('@vueuse/core').useArrayReduce
|
const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique']
|
||||||
const useArraySome: typeof import('@vueuse/core').useArraySome
|
const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue']
|
||||||
const useArrayUnique: typeof import('@vueuse/core').useArrayUnique
|
const useAsyncState: typeof import('@vueuse/core')['useAsyncState']
|
||||||
const useAsyncQueue: typeof import('@vueuse/core').useAsyncQueue
|
const useAttrs: typeof import('vue')['useAttrs']
|
||||||
const useAsyncState: typeof import('@vueuse/core').useAsyncState
|
const useAuthStore: typeof import('./src/stores/auth-store-auto-imports')['useAuthStore']
|
||||||
const useAttrs: typeof import('vue').useAttrs
|
const useBase64: typeof import('@vueuse/core')['useBase64']
|
||||||
const useAuthStore: typeof import('./src/stores/auth-store-auto-imports').useAuthStore
|
const useBattery: typeof import('@vueuse/core')['useBattery']
|
||||||
const useBase64: typeof import('@vueuse/core').useBase64
|
const useBluetooth: typeof import('@vueuse/core')['useBluetooth']
|
||||||
const useBattery: typeof import('@vueuse/core').useBattery
|
const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints']
|
||||||
const useBluetooth: typeof import('@vueuse/core').useBluetooth
|
const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel']
|
||||||
const useBreakpoints: typeof import('@vueuse/core').useBreakpoints
|
const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
|
||||||
const useBroadcastChannel: typeof import('@vueuse/core').useBroadcastChannel
|
const useCached: typeof import('@vueuse/core')['useCached']
|
||||||
const useBrowserLocation: typeof import('@vueuse/core').useBrowserLocation
|
const useClipboard: typeof import('@vueuse/core')['useClipboard']
|
||||||
const useCached: typeof import('@vueuse/core').useCached
|
const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems']
|
||||||
const useClipboard: typeof import('@vueuse/core').useClipboard
|
const useCloned: typeof import('@vueuse/core')['useCloned']
|
||||||
const useClipboardItems: typeof import('@vueuse/core').useClipboardItems
|
const useColorMode: typeof import('@vueuse/core')['useColorMode']
|
||||||
const useCloned: typeof import('@vueuse/core').useCloned
|
const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
|
||||||
const useColorMode: typeof import('@vueuse/core').useColorMode
|
const useCountdown: typeof import('@vueuse/core')['useCountdown']
|
||||||
const useConfirmDialog: typeof import('@vueuse/core').useConfirmDialog
|
const useCounter: typeof import('@vueuse/core')['useCounter']
|
||||||
const useCountdown: typeof import('@vueuse/core').useCountdown
|
const useCssModule: typeof import('vue')['useCssModule']
|
||||||
const useCounter: typeof import('@vueuse/core').useCounter
|
const useCssVar: typeof import('@vueuse/core')['useCssVar']
|
||||||
const useCssModule: typeof import('vue').useCssModule
|
const useCssVars: typeof import('vue')['useCssVars']
|
||||||
const useCssVar: typeof import('@vueuse/core').useCssVar
|
const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement']
|
||||||
const useCssVars: typeof import('vue').useCssVars
|
const useCycleList: typeof import('@vueuse/core')['useCycleList']
|
||||||
const useCurrentElement: typeof import('@vueuse/core').useCurrentElement
|
const useDark: typeof import('@vueuse/core')['useDark']
|
||||||
const useCycleList: typeof import('@vueuse/core').useCycleList
|
const useDateFormat: typeof import('@vueuse/core')['useDateFormat']
|
||||||
const useDark: typeof import('@vueuse/core').useDark
|
const useDebounce: typeof import('@vueuse/core')['useDebounce']
|
||||||
const useDateFormat: typeof import('@vueuse/core').useDateFormat
|
const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn']
|
||||||
const useDebounce: typeof import('@vueuse/core').useDebounce
|
const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory']
|
||||||
const useDebounceFn: typeof import('@vueuse/core').useDebounceFn
|
const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion']
|
||||||
const useDebouncedRefHistory: typeof import('@vueuse/core').useDebouncedRefHistory
|
const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation']
|
||||||
const useDeviceMotion: typeof import('@vueuse/core').useDeviceMotion
|
const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio']
|
||||||
const useDeviceOrientation: typeof import('@vueuse/core').useDeviceOrientation
|
const useDevicesList: typeof import('@vueuse/core')['useDevicesList']
|
||||||
const useDevicePixelRatio: typeof import('@vueuse/core').useDevicePixelRatio
|
const useDialog: typeof import('naive-ui')['useDialog']
|
||||||
const useDevicesList: typeof import('@vueuse/core').useDevicesList
|
const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia']
|
||||||
const useDialog: typeof import('naive-ui').useDialog
|
const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility']
|
||||||
const useDisplayMedia: typeof import('@vueuse/core').useDisplayMedia
|
const useDraggable: typeof import('@vueuse/core')['useDraggable']
|
||||||
const useDocumentVisibility: typeof import('@vueuse/core').useDocumentVisibility
|
const useDropZone: typeof import('@vueuse/core')['useDropZone']
|
||||||
const useDraggable: typeof import('@vueuse/core').useDraggable
|
const useElementBounding: typeof import('@vueuse/core')['useElementBounding']
|
||||||
const useDropZone: typeof import('@vueuse/core').useDropZone
|
const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint']
|
||||||
const useElementBounding: typeof import('@vueuse/core').useElementBounding
|
const useElementHover: typeof import('@vueuse/core')['useElementHover']
|
||||||
const useElementByPoint: typeof import('@vueuse/core').useElementByPoint
|
const useElementSize: typeof import('@vueuse/core')['useElementSize']
|
||||||
const useElementHover: typeof import('@vueuse/core').useElementHover
|
const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility']
|
||||||
const useElementSize: typeof import('@vueuse/core').useElementSize
|
const useEventBus: typeof import('@vueuse/core')['useEventBus']
|
||||||
const useElementVisibility: typeof import('@vueuse/core').useElementVisibility
|
const useEventListener: typeof import('@vueuse/core')['useEventListener']
|
||||||
const useEventBus: typeof import('@vueuse/core').useEventBus
|
const useEventSource: typeof import('@vueuse/core')['useEventSource']
|
||||||
const useEventListener: typeof import('@vueuse/core').useEventListener
|
const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper']
|
||||||
const useEventSource: typeof import('@vueuse/core').useEventSource
|
const useFavicon: typeof import('@vueuse/core')['useFavicon']
|
||||||
const useEyeDropper: typeof import('@vueuse/core').useEyeDropper
|
const useFetch: typeof import('@vueuse/core')['useFetch']
|
||||||
const useFavicon: typeof import('@vueuse/core').useFavicon
|
const useFileDialog: typeof import('@vueuse/core')['useFileDialog']
|
||||||
const useFetch: typeof import('@vueuse/core').useFetch
|
const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess']
|
||||||
const useFileDialog: typeof import('@vueuse/core').useFileDialog
|
const useFocus: typeof import('@vueuse/core')['useFocus']
|
||||||
const useFileSystemAccess: typeof import('@vueuse/core').useFileSystemAccess
|
const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin']
|
||||||
const useFocus: typeof import('@vueuse/core').useFocus
|
const useFps: typeof import('@vueuse/core')['useFps']
|
||||||
const useFocusWithin: typeof import('@vueuse/core').useFocusWithin
|
const useFullscreen: typeof import('@vueuse/core')['useFullscreen']
|
||||||
const useFps: typeof import('@vueuse/core').useFps
|
const useGamepad: typeof import('@vueuse/core')['useGamepad']
|
||||||
const useFullscreen: typeof import('@vueuse/core').useFullscreen
|
const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
|
||||||
const useGamepad: typeof import('@vueuse/core').useGamepad
|
const useI18n: typeof import('vue-i18n')['useI18n']
|
||||||
const useGeolocation: typeof import('@vueuse/core').useGeolocation
|
const useId: typeof import('vue')['useId']
|
||||||
const useI18n: typeof import('vue-i18n').useI18n
|
const useIdle: typeof import('@vueuse/core')['useIdle']
|
||||||
const useId: typeof import('vue').useId
|
const useImage: typeof import('@vueuse/core')['useImage']
|
||||||
const useIdle: typeof import('@vueuse/core').useIdle
|
const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
|
||||||
const useImage: typeof import('@vueuse/core').useImage
|
const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver']
|
||||||
const useInfiniteScroll: typeof import('@vueuse/core').useInfiniteScroll
|
const useInterval: typeof import('@vueuse/core')['useInterval']
|
||||||
const useIntersectionObserver: typeof import('@vueuse/core').useIntersectionObserver
|
const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn']
|
||||||
const useInterval: typeof import('@vueuse/core').useInterval
|
const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier']
|
||||||
const useIntervalFn: typeof import('@vueuse/core').useIntervalFn
|
const useLastChanged: typeof import('@vueuse/core')['useLastChanged']
|
||||||
const useKeyModifier: typeof import('@vueuse/core').useKeyModifier
|
const useLink: typeof import('vue-router/auto')['useLink']
|
||||||
const useLastChanged: typeof import('@vueuse/core').useLastChanged
|
const useLoadingBar: typeof import('naive-ui')['useLoadingBar']
|
||||||
const useLoadingBar: typeof import('naive-ui').useLoadingBar
|
const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage']
|
||||||
const useLocalStorage: typeof import('@vueuse/core').useLocalStorage
|
const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys']
|
||||||
const useMagicKeys: typeof import('@vueuse/core').useMagicKeys
|
const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory']
|
||||||
const useManualRefHistory: typeof import('@vueuse/core').useManualRefHistory
|
const useMediaControls: typeof import('@vueuse/core')['useMediaControls']
|
||||||
const useMediaControls: typeof import('@vueuse/core').useMediaControls
|
const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery']
|
||||||
const useMediaQuery: typeof import('@vueuse/core').useMediaQuery
|
const useMemoize: typeof import('@vueuse/core')['useMemoize']
|
||||||
const useMemoize: typeof import('@vueuse/core').useMemoize
|
const useMemory: typeof import('@vueuse/core')['useMemory']
|
||||||
const useMemory: typeof import('@vueuse/core').useMemory
|
const useMessage: typeof import('naive-ui')['useMessage']
|
||||||
const useMessage: typeof import('naive-ui').useMessage
|
const useMetaLayoutsNMenuOptions: typeof import('./src/composables/useMetaLayoutsMenuOptions')['useMetaLayoutsNMenuOptions']
|
||||||
const useMetaLayoutsNMenuOptions: typeof import('./src/composables/useMetaLayoutsMenuOptions').useMetaLayoutsNMenuOptions
|
const useModal: typeof import('naive-ui')['useModal']
|
||||||
const useModal: typeof import('naive-ui').useModal
|
const useModel: typeof import('vue')['useModel']
|
||||||
const useModel: typeof import('vue').useModel
|
const useMounted: typeof import('@vueuse/core')['useMounted']
|
||||||
const useMounted: typeof import('@vueuse/core').useMounted
|
const useMouse: typeof import('@vueuse/core')['useMouse']
|
||||||
const useMouse: typeof import('@vueuse/core').useMouse
|
const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement']
|
||||||
const useMouseInElement: typeof import('@vueuse/core').useMouseInElement
|
const useMousePressed: typeof import('@vueuse/core')['useMousePressed']
|
||||||
const useMousePressed: typeof import('@vueuse/core').useMousePressed
|
const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver']
|
||||||
const useMutationObserver: typeof import('@vueuse/core').useMutationObserver
|
const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage']
|
||||||
const useNavigatorLanguage: typeof import('@vueuse/core').useNavigatorLanguage
|
const useNetwork: typeof import('@vueuse/core')['useNetwork']
|
||||||
const useNetwork: typeof import('@vueuse/core').useNetwork
|
const useNotification: typeof import('naive-ui')['useNotification']
|
||||||
const useNotification: typeof import('naive-ui').useNotification
|
const useNow: typeof import('@vueuse/core')['useNow']
|
||||||
const useNow: typeof import('@vueuse/core').useNow
|
const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl']
|
||||||
const useObjectUrl: typeof import('@vueuse/core').useObjectUrl
|
const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination']
|
||||||
const useOffsetPagination: typeof import('@vueuse/core').useOffsetPagination
|
const useOnline: typeof import('@vueuse/core')['useOnline']
|
||||||
const useOnline: typeof import('@vueuse/core').useOnline
|
const usePageLeave: typeof import('@vueuse/core')['usePageLeave']
|
||||||
const usePageLeave: typeof import('@vueuse/core').usePageLeave
|
const useParallax: typeof import('@vueuse/core')['useParallax']
|
||||||
const useParallax: typeof import('@vueuse/core').useParallax
|
const useParentElement: typeof import('@vueuse/core')['useParentElement']
|
||||||
const useParentElement: typeof import('@vueuse/core').useParentElement
|
const usePerformanceObserver: typeof import('@vueuse/core')['usePerformanceObserver']
|
||||||
const usePerformanceObserver: typeof import('@vueuse/core').usePerformanceObserver
|
const usePermission: typeof import('@vueuse/core')['usePermission']
|
||||||
const usePermission: typeof import('@vueuse/core').usePermission
|
const usePointer: typeof import('@vueuse/core')['usePointer']
|
||||||
const usePointer: typeof import('@vueuse/core').usePointer
|
const usePointerLock: typeof import('@vueuse/core')['usePointerLock']
|
||||||
const usePointerLock: typeof import('@vueuse/core').usePointerLock
|
const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe']
|
||||||
const usePointerSwipe: typeof import('@vueuse/core').usePointerSwipe
|
const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme']
|
||||||
const usePreferredColorScheme: typeof import('@vueuse/core').usePreferredColorScheme
|
const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast']
|
||||||
const usePreferredContrast: typeof import('@vueuse/core').usePreferredContrast
|
const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark']
|
||||||
const usePreferredDark: typeof import('@vueuse/core').usePreferredDark
|
const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages']
|
||||||
const usePreferredLanguages: typeof import('@vueuse/core').usePreferredLanguages
|
const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
|
||||||
const usePreferredReducedMotion: typeof import('@vueuse/core').usePreferredReducedMotion
|
const usePreferredReducedTransparency: typeof import('@vueuse/core')['usePreferredReducedTransparency']
|
||||||
const usePreferredReducedTransparency: typeof import('@vueuse/core').usePreferredReducedTransparency
|
const usePrevious: typeof import('@vueuse/core')['usePrevious']
|
||||||
const usePrevious: typeof import('@vueuse/core').usePrevious
|
const usePrimevueDialogRef: typeof import('utils4u/primevue')['usePrimevueDialogRef']
|
||||||
const usePrimevueDialogRef: typeof import('utils4u/primevue').usePrimevueDialogRef
|
const useRafFn: typeof import('@vueuse/core')['useRafFn']
|
||||||
const useRafFn: typeof import('@vueuse/core').useRafFn
|
const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
|
||||||
const useRefHistory: typeof import('@vueuse/core').useRefHistory
|
const useRefs: typeof import('utils4u/vue-use')['useRefs']
|
||||||
const useRefs: typeof import('utils4u/vue-use').useRefs
|
const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
|
||||||
const useResizeObserver: typeof import('@vueuse/core').useResizeObserver
|
const useRoute: typeof import('vue-router')['useRoute']
|
||||||
const useRoute: typeof import('vue-router').useRoute
|
const useRouter: typeof import('vue-router')['useRouter']
|
||||||
const useRouter: typeof import('vue-router').useRouter
|
const useSSRWidth: typeof import('@vueuse/core')['useSSRWidth']
|
||||||
const useSSRWidth: typeof import('@vueuse/core').useSSRWidth
|
const useSafeNForm: typeof import('./src/utils/use-safe-n-form-auto-imports')['useSafeNForm']
|
||||||
const useScreenOrientation: typeof import('@vueuse/core').useScreenOrientation
|
const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation']
|
||||||
const useScreenSafeArea: typeof import('@vueuse/core').useScreenSafeArea
|
const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea']
|
||||||
const useScriptTag: typeof import('@vueuse/core').useScriptTag
|
const useScriptTag: typeof import('@vueuse/core')['useScriptTag']
|
||||||
const useScroll: typeof import('@vueuse/core').useScroll
|
const useScroll: typeof import('@vueuse/core')['useScroll']
|
||||||
const useScrollLock: typeof import('@vueuse/core').useScrollLock
|
const useScrollLock: typeof import('@vueuse/core')['useScrollLock']
|
||||||
const useSessionStorage: typeof import('@vueuse/core').useSessionStorage
|
const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage']
|
||||||
const useShare: typeof import('@vueuse/core').useShare
|
const useShare: typeof import('@vueuse/core')['useShare']
|
||||||
const useSlots: typeof import('vue').useSlots
|
const useSlots: typeof import('vue')['useSlots']
|
||||||
const useSorted: typeof import('@vueuse/core').useSorted
|
const useSorted: typeof import('@vueuse/core')['useSorted']
|
||||||
const useSpeechRecognition: typeof import('@vueuse/core').useSpeechRecognition
|
const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition']
|
||||||
const useSpeechSynthesis: typeof import('@vueuse/core').useSpeechSynthesis
|
const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis']
|
||||||
const useStepper: typeof import('@vueuse/core').useStepper
|
const useStepper: typeof import('@vueuse/core')['useStepper']
|
||||||
const useStorage: typeof import('@vueuse/core').useStorage
|
const useStorage: typeof import('@vueuse/core')['useStorage']
|
||||||
const useStorageAsync: typeof import('@vueuse/core').useStorageAsync
|
const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync']
|
||||||
const useStyleTag: typeof import('@vueuse/core').useStyleTag
|
const useStyleTag: typeof import('@vueuse/core')['useStyleTag']
|
||||||
const useSupported: typeof import('@vueuse/core').useSupported
|
const useSupported: typeof import('@vueuse/core')['useSupported']
|
||||||
const useSwipe: typeof import('@vueuse/core').useSwipe
|
const useSwipe: typeof import('@vueuse/core')['useSwipe']
|
||||||
const useTemplateRef: typeof import('vue').useTemplateRef
|
const useTemplateRef: typeof import('vue')['useTemplateRef']
|
||||||
const useTemplateRefsList: typeof import('@vueuse/core').useTemplateRefsList
|
const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
|
||||||
const useTextDirection: typeof import('@vueuse/core').useTextDirection
|
const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
|
||||||
const useTextSelection: typeof import('@vueuse/core').useTextSelection
|
const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
|
||||||
const useTextareaAutosize: typeof import('@vueuse/core').useTextareaAutosize
|
const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize']
|
||||||
const useThrottle: typeof import('@vueuse/core').useThrottle
|
const useThrottle: typeof import('@vueuse/core')['useThrottle']
|
||||||
const useThrottleFn: typeof import('@vueuse/core').useThrottleFn
|
const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn']
|
||||||
const useThrottledRefHistory: typeof import('@vueuse/core').useThrottledRefHistory
|
const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory']
|
||||||
const useTimeAgo: typeof import('@vueuse/core').useTimeAgo
|
const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo']
|
||||||
const useTimeAgoIntl: typeof import('@vueuse/core').useTimeAgoIntl
|
const useTimeAgoIntl: typeof import('@vueuse/core')['useTimeAgoIntl']
|
||||||
const useTimeout: typeof import('@vueuse/core').useTimeout
|
const useTimeout: typeof import('@vueuse/core')['useTimeout']
|
||||||
const useTimeoutFn: typeof import('@vueuse/core').useTimeoutFn
|
const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn']
|
||||||
const useTimeoutPoll: typeof import('@vueuse/core').useTimeoutPoll
|
const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll']
|
||||||
const useTimestamp: typeof import('@vueuse/core').useTimestamp
|
const useTimestamp: typeof import('@vueuse/core')['useTimestamp']
|
||||||
const useTitle: typeof import('@vueuse/core').useTitle
|
const useTitle: typeof import('@vueuse/core')['useTitle']
|
||||||
const useToNumber: typeof import('@vueuse/core').useToNumber
|
const useToNumber: typeof import('@vueuse/core')['useToNumber']
|
||||||
const useToString: typeof import('@vueuse/core').useToString
|
const useToString: typeof import('@vueuse/core')['useToString']
|
||||||
const useToggle: typeof import('@vueuse/core').useToggle
|
const useToggle: typeof import('@vueuse/core')['useToggle']
|
||||||
const useTransition: typeof import('@vueuse/core').useTransition
|
const useTransition: typeof import('@vueuse/core')['useTransition']
|
||||||
const useUrlSearchParams: typeof import('@vueuse/core').useUrlSearchParams
|
const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams']
|
||||||
const useUserMedia: typeof import('@vueuse/core').useUserMedia
|
const useUserMedia: typeof import('@vueuse/core')['useUserMedia']
|
||||||
const useVModel: typeof import('@vueuse/core').useVModel
|
const useVModel: typeof import('@vueuse/core')['useVModel']
|
||||||
const useVModels: typeof import('@vueuse/core').useVModels
|
const useVModels: typeof import('@vueuse/core')['useVModels']
|
||||||
const useVibrate: typeof import('@vueuse/core').useVibrate
|
const useVibrate: typeof import('@vueuse/core')['useVibrate']
|
||||||
const useVirtualList: typeof import('@vueuse/core').useVirtualList
|
const useVirtualList: typeof import('@vueuse/core')['useVirtualList']
|
||||||
const useWakeLock: typeof import('@vueuse/core').useWakeLock
|
const useWakeLock: typeof import('@vueuse/core')['useWakeLock']
|
||||||
const useWebNotification: typeof import('@vueuse/core').useWebNotification
|
const useWebNotification: typeof import('@vueuse/core')['useWebNotification']
|
||||||
const useWebSocket: typeof import('@vueuse/core').useWebSocket
|
const useWebSocket: typeof import('@vueuse/core')['useWebSocket']
|
||||||
const useWebWorker: typeof import('@vueuse/core').useWebWorker
|
const useWebWorker: typeof import('@vueuse/core')['useWebWorker']
|
||||||
const useWebWorkerFn: typeof import('@vueuse/core').useWebWorkerFn
|
const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn']
|
||||||
const useWindowFocus: typeof import('@vueuse/core').useWindowFocus
|
const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus']
|
||||||
const useWindowScroll: typeof import('@vueuse/core').useWindowScroll
|
const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll']
|
||||||
const useWindowSize: typeof import('@vueuse/core').useWindowSize
|
const useWindowSize: typeof import('@vueuse/core')['useWindowSize']
|
||||||
const watch: typeof import('vue').watch
|
const watch: typeof import('vue')['watch']
|
||||||
const watchArray: typeof import('@vueuse/core').watchArray
|
const watchArray: typeof import('@vueuse/core')['watchArray']
|
||||||
const watchAtMost: typeof import('@vueuse/core').watchAtMost
|
const watchAtMost: typeof import('@vueuse/core')['watchAtMost']
|
||||||
const watchDebounced: typeof import('@vueuse/core').watchDebounced
|
const watchDebounced: typeof import('@vueuse/core')['watchDebounced']
|
||||||
const watchDeep: typeof import('@vueuse/core').watchDeep
|
const watchDeep: typeof import('@vueuse/core')['watchDeep']
|
||||||
const watchEffect: typeof import('vue').watchEffect
|
const watchEffect: typeof import('vue')['watchEffect']
|
||||||
const watchIgnorable: typeof import('@vueuse/core').watchIgnorable
|
const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable']
|
||||||
const watchImmediate: typeof import('@vueuse/core').watchImmediate
|
const watchImmediate: typeof import('@vueuse/core')['watchImmediate']
|
||||||
const watchOnce: typeof import('@vueuse/core').watchOnce
|
const watchOnce: typeof import('@vueuse/core')['watchOnce']
|
||||||
const watchPausable: typeof import('@vueuse/core').watchPausable
|
const watchPausable: typeof import('@vueuse/core')['watchPausable']
|
||||||
const watchPostEffect: typeof import('vue').watchPostEffect
|
const watchPostEffect: typeof import('vue')['watchPostEffect']
|
||||||
const watchSyncEffect: typeof import('vue').watchSyncEffect
|
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
|
||||||
const watchThrottled: typeof import('@vueuse/core').watchThrottled
|
const watchThrottled: typeof import('@vueuse/core')['watchThrottled']
|
||||||
const watchTriggerable: typeof import('@vueuse/core').watchTriggerable
|
const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable']
|
||||||
const watchWithFilter: typeof import('@vueuse/core').watchWithFilter
|
const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter']
|
||||||
const whenever: typeof import('@vueuse/core').whenever
|
const whenever: typeof import('@vueuse/core')['whenever']
|
||||||
}
|
}
|
||||||
// for type re-export
|
// for type re-export
|
||||||
declare global {
|
declare global {
|
||||||
@@ -387,7 +387,6 @@ declare module 'vue' {
|
|||||||
readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']>
|
readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']>
|
||||||
readonly deepFreeze: UnwrapRef<typeof import('deep-freeze-es6')['default']>
|
readonly deepFreeze: UnwrapRef<typeof import('deep-freeze-es6')['default']>
|
||||||
readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
|
readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
|
||||||
readonly defineBasicLoader: UnwrapRef<typeof import('unplugin-vue-router/data-loaders/basic')['defineBasicLoader']>
|
|
||||||
readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
|
readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
|
||||||
readonly defineStore: UnwrapRef<typeof import('pinia')['defineStore']>
|
readonly defineStore: UnwrapRef<typeof import('pinia')['defineStore']>
|
||||||
readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']>
|
readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']>
|
||||||
@@ -452,13 +451,12 @@ declare module 'vue' {
|
|||||||
readonly refAutoReset: UnwrapRef<typeof import('@vueuse/core')['refAutoReset']>
|
readonly refAutoReset: UnwrapRef<typeof import('@vueuse/core')['refAutoReset']>
|
||||||
readonly refDebounced: UnwrapRef<typeof import('@vueuse/core')['refDebounced']>
|
readonly refDebounced: UnwrapRef<typeof import('@vueuse/core')['refDebounced']>
|
||||||
readonly refDefault: UnwrapRef<typeof import('@vueuse/core')['refDefault']>
|
readonly refDefault: UnwrapRef<typeof import('@vueuse/core')['refDefault']>
|
||||||
readonly refManualReset: UnwrapRef<typeof import('@vueuse/core')['refManualReset']>
|
|
||||||
readonly refThrottled: UnwrapRef<typeof import('@vueuse/core')['refThrottled']>
|
readonly refThrottled: UnwrapRef<typeof import('@vueuse/core')['refThrottled']>
|
||||||
readonly refWithControl: UnwrapRef<typeof import('@vueuse/core')['refWithControl']>
|
readonly refWithControl: UnwrapRef<typeof import('@vueuse/core')['refWithControl']>
|
||||||
readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
|
readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
|
||||||
readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']>
|
readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']>
|
||||||
|
readonly resolveUnref: UnwrapRef<typeof import('@vueuse/core')['resolveUnref']>
|
||||||
readonly routeI18nInstance: UnwrapRef<typeof import('./src/locales-utils/i18n-auto-imports')['routeI18nInstance']>
|
readonly routeI18nInstance: UnwrapRef<typeof import('./src/locales-utils/i18n-auto-imports')['routeI18nInstance']>
|
||||||
readonly routeI18nT: UnwrapRef<typeof import('./src/locales-utils/i18n-auto-imports')['routeI18nT']>
|
|
||||||
readonly setActivePinia: UnwrapRef<typeof import('pinia')['setActivePinia']>
|
readonly setActivePinia: UnwrapRef<typeof import('pinia')['setActivePinia']>
|
||||||
readonly setMapStoreSuffix: UnwrapRef<typeof import('pinia')['setMapStoreSuffix']>
|
readonly setMapStoreSuffix: UnwrapRef<typeof import('pinia')['setMapStoreSuffix']>
|
||||||
readonly setViewportCSSVars: UnwrapRef<typeof import('utils4u/browser')['setViewportCSSVars']>
|
readonly setViewportCSSVars: UnwrapRef<typeof import('utils4u/browser')['setViewportCSSVars']>
|
||||||
@@ -567,6 +565,7 @@ declare module 'vue' {
|
|||||||
readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']>
|
readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']>
|
||||||
readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']>
|
readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']>
|
||||||
readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']>
|
readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']>
|
||||||
|
readonly useLink: UnwrapRef<typeof import('vue-router/auto')['useLink']>
|
||||||
readonly useLoadingBar: UnwrapRef<typeof import('naive-ui')['useLoadingBar']>
|
readonly useLoadingBar: UnwrapRef<typeof import('naive-ui')['useLoadingBar']>
|
||||||
readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']>
|
readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']>
|
||||||
readonly useMagicKeys: UnwrapRef<typeof import('@vueuse/core')['useMagicKeys']>
|
readonly useMagicKeys: UnwrapRef<typeof import('@vueuse/core')['useMagicKeys']>
|
||||||
@@ -614,6 +613,7 @@ declare module 'vue' {
|
|||||||
readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']>
|
readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']>
|
||||||
readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']>
|
readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']>
|
||||||
readonly useSSRWidth: UnwrapRef<typeof import('@vueuse/core')['useSSRWidth']>
|
readonly useSSRWidth: UnwrapRef<typeof import('@vueuse/core')['useSSRWidth']>
|
||||||
|
readonly useSafeNForm: UnwrapRef<typeof import('./src/utils/use-safe-n-form-auto-imports')['useSafeNForm']>
|
||||||
readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']>
|
readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']>
|
||||||
readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']>
|
readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']>
|
||||||
readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']>
|
readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']>
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
import type { UserConfig } from '@commitlint/types';
|
import type { UserConfig } from '@commitlint/types';
|
||||||
|
|
||||||
|
|
||||||
const Configuration: UserConfig = {
|
const Configuration: UserConfig = {
|
||||||
extends: ['@commitlint/config-conventional'],
|
extends: ['@commitlint/config-conventional'],
|
||||||
formatter: '@commitlint/format',
|
formatter: '@commitlint/format',
|
||||||
rules: {
|
|
||||||
'body-max-line-length': [2, 'always', 500],
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Configuration;
|
export default Configuration;
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import vueI18n from '@intlify/eslint-plugin-vue-i18n';
|
|
||||||
// import stylistic from '@stylistic/eslint-plugin';
|
|
||||||
import pluginVitest from '@vitest/eslint-plugin';
|
import pluginVitest from '@vitest/eslint-plugin';
|
||||||
import skipFormatting from '@vue/eslint-config-prettier/skip-formatting';
|
import skipFormatting from '@vue/eslint-config-prettier/skip-formatting';
|
||||||
import {
|
import {
|
||||||
@@ -10,7 +8,6 @@ import {
|
|||||||
import pluginImport from 'eslint-plugin-import';
|
import pluginImport from 'eslint-plugin-import';
|
||||||
import pluginJsonc from 'eslint-plugin-jsonc';
|
import pluginJsonc from 'eslint-plugin-jsonc';
|
||||||
import pluginOxlint from 'eslint-plugin-oxlint';
|
import pluginOxlint from 'eslint-plugin-oxlint';
|
||||||
import pluginPerfectionist from 'eslint-plugin-perfectionist';
|
|
||||||
import pluginPlaywright from 'eslint-plugin-playwright';
|
import pluginPlaywright from 'eslint-plugin-playwright';
|
||||||
import pluginVue from 'eslint-plugin-vue';
|
import pluginVue from 'eslint-plugin-vue';
|
||||||
import { globalIgnores } from 'eslint/config';
|
import { globalIgnores } from 'eslint/config';
|
||||||
@@ -25,14 +22,7 @@ export default defineConfigWithVueTs(
|
|||||||
files: ['**/*.{ts,mts,tsx,vue}'],
|
files: ['**/*.{ts,mts,tsx,vue}'],
|
||||||
},
|
},
|
||||||
|
|
||||||
globalIgnores([
|
globalIgnores(['worker-configuration.d.ts', '**/dist/**', '**/dist-ssr/**', '**/coverage/**']),
|
||||||
'worker-configuration.d.ts',
|
|
||||||
'**/dist/**',
|
|
||||||
'**/dist-ssr/**',
|
|
||||||
'**/coverage/**',
|
|
||||||
'**/public/**',
|
|
||||||
'**/-----TEMP-----/**',
|
|
||||||
]),
|
|
||||||
|
|
||||||
pluginVue.configs['flat/essential'],
|
pluginVue.configs['flat/essential'],
|
||||||
vueTsConfigs.recommended,
|
vueTsConfigs.recommended,
|
||||||
@@ -47,29 +37,10 @@ export default defineConfigWithVueTs(
|
|||||||
files: ['e2e/**/*.{test,spec}.{js,ts,jsx,tsx}'],
|
files: ['e2e/**/*.{test,spec}.{js,ts,jsx,tsx}'],
|
||||||
},
|
},
|
||||||
...pluginOxlint.configs['flat/recommended'],
|
...pluginOxlint.configs['flat/recommended'],
|
||||||
|
|
||||||
// https://eslint-plugin-vue-i18n.intlify.dev/started.html#getting-started
|
|
||||||
...vueI18n.configs.recommended,
|
|
||||||
{
|
{
|
||||||
rules: {
|
plugins: {
|
||||||
'@intlify/vue-i18n/no-raw-text': 'off',
|
import: pluginImport,
|
||||||
'@intlify/vue-i18n/no-unused-keys': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
src: './src',
|
|
||||||
extensions: ['.js', '.ts', '.tsx', '.vue'],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
settings: {
|
|
||||||
'vue-i18n': {
|
|
||||||
localeDir: './src/locales/**/*.json',
|
|
||||||
messageSyntaxVersion: '^11.0.0',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
plugins: { import: pluginImport },
|
|
||||||
rules: {
|
rules: {
|
||||||
'import/first': 'error',
|
'import/first': 'error',
|
||||||
'import/no-duplicates': 'error',
|
'import/no-duplicates': 'error',
|
||||||
@@ -83,8 +54,6 @@ export default defineConfigWithVueTs(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
{ plugins: { perfectionist: pluginPerfectionist } },
|
|
||||||
|
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* 启用 sort-keys 规则以强制对象键按字母顺序排序
|
* 启用 sort-keys 规则以强制对象键按字母顺序排序
|
||||||
@@ -99,9 +68,6 @@ export default defineConfigWithVueTs(
|
|||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
// plugins: {
|
|
||||||
// '@stylistic': stylistic,
|
|
||||||
// },
|
|
||||||
rules: {
|
rules: {
|
||||||
'@typescript-eslint/no-explicit-any': 'off',
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
'vue/block-order': [
|
'vue/block-order': [
|
||||||
@@ -116,18 +82,6 @@ export default defineConfigWithVueTs(
|
|||||||
],
|
],
|
||||||
'vue/attributes-order': 'error',
|
'vue/attributes-order': 'error',
|
||||||
'vue/multi-word-component-names': 'off',
|
'vue/multi-word-component-names': 'off',
|
||||||
'vue/padding-line-between-blocks': ['error', 'always'],
|
|
||||||
'vue/component-name-in-template-casing': [
|
|
||||||
'error',
|
|
||||||
'PascalCase',
|
|
||||||
{ registeredComponentsOnly: false, ignores: [] },
|
|
||||||
],
|
|
||||||
// '@stylistic/padding-line-between-statements': [
|
|
||||||
// 'error',
|
|
||||||
// { blankLine: 'always', prev: '*', next: ['const', 'let', 'var'] },
|
|
||||||
// { blankLine: 'always', prev: ['const', 'let', 'var'], next: '*' },
|
|
||||||
// { blankLine: 'any', prev: ['const', 'let', 'var'], next: ['const', 'let', 'var'] },
|
|
||||||
// ],
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
143
package.json
143
package.json
@@ -1,34 +1,28 @@
|
|||||||
{
|
{
|
||||||
"packageManager": "pnpm@10.25.0",
|
"packageManager": "pnpm@10.18.3",
|
||||||
"name": "vue-ts-example-2025",
|
"name": "vue-ts-example-2025",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"_devenginesruntime_docs": "https://pnpm.io/zh/package_json#devenginesruntime",
|
"engines": {
|
||||||
"devEngines": {
|
"node": "^20.19.0 || >=22.12.0"
|
||||||
"runtime": {
|
|
||||||
"name": "node",
|
|
||||||
"version": "^24.11.1",
|
|
||||||
"onFail": "download"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"all": "run-s lint format:prettier build-only type-check test:unit:DisableWatch",
|
"_all": "run-s build-only lint format:prettier type-check test:unit:DisableWatch",
|
||||||
"dev": "nodemon --delay 280ms --watch vite-plugins --ext ts -x vite -- --port 4730 --host --strictPort",
|
"dev": "vite --port 4730 --host --strictPort",
|
||||||
"build": "run-p type-check \"build-only {@}\" --",
|
"build": "run-p type-check \"build-only {@}\" --",
|
||||||
"build-only": "vite build",
|
"build-only": "vite build",
|
||||||
"preview": "vite preview --port 4731 --host --strictPort",
|
"preview": "vite preview --port 4731 --host --strictPort",
|
||||||
"wrangler:dev": "wrangler dev --port 4732",
|
"wrangler:dev": "wrangler dev --port 4732",
|
||||||
"format:prettier": "prettier --config=.prettierrc.json --cache --write --log-level=warn src/",
|
"format:prettier": "prettier --write src/",
|
||||||
"type-check": "vue-tsc --build",
|
"type-check": "vue-tsc --build",
|
||||||
"lint": "run-s lint:*",
|
"lint": "run-s lint:*",
|
||||||
"lint:vue-i18n-extract": "vue-i18n-extract report --vueFiles './src/**/*.?(ts|tsx|vue)' --languageFiles './src/locales/**/*.?(json|yml|yaml|js)' --ci",
|
"lint:vue-i18n-extract": "vue-i18n-extract report --vueFiles './src/**/*.?(ts|tsx|vue)' --languageFiles './src/locales/**/*.?(json|yml|yaml|js)' --ci",
|
||||||
"lint:stylelint": "stylelint --config=stylelint.config.mjs --cache --output-file=node_modules/.cache/stylelint/stylelint-report.json --cache-location=node_modules/.cache/stylelint/.stylelintcache --fix --ignore-path=.gitignore '**/*.{css,less,scss,vue}'",
|
"lint:stylelint": "stylelint --fix --ignore-path .gitignore \"**/*.{css,less,scss,vue}\"",
|
||||||
"lint:oxlint": "oxlint . --fix -D correctness --ignore-path .gitignore",
|
"lint:oxlint": "oxlint . --fix -D correctness --ignore-path .gitignore",
|
||||||
"lint:eslint": "eslint . --fix --config=eslint.config.ts --concurrency=auto --env-info --cache --cache-location=node_modules/.cache/eslint/.eslintcache",
|
"lint:eslint": "eslint . --fix",
|
||||||
"test:unit:DisableWatch": "vitest --run",
|
"test:unit:DisableWatch": "vitest --run",
|
||||||
"test:playwright:headless": "HEADLESS=true playwright test --quiet",
|
"test:playwright:headless": "HEADLESS=true playwright test --quiet",
|
||||||
"_stylelint-config": "stylelint --config=stylelint.config.mjs --print-config src/styles/scss/global.scss",
|
|
||||||
"postinstall": "wrangler types",
|
"postinstall": "wrangler types",
|
||||||
"prepare": "husky"
|
"prepare": "husky"
|
||||||
},
|
},
|
||||||
@@ -44,6 +38,9 @@
|
|||||||
"{src/locales-utils,src/locales}/**/*": "node scripts/type-check-for-lint-staged.mjs"
|
"{src/locales-utils,src/locales}/**/*": "node scripts/type-check-for-lint-staged.mjs"
|
||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
|
"overrides": {
|
||||||
|
"vue-tsc": "$vue-tsc"
|
||||||
|
},
|
||||||
"onlyBuiltDependencies": [
|
"onlyBuiltDependencies": [
|
||||||
"@parcel/watcher",
|
"@parcel/watcher",
|
||||||
"esbuild",
|
"esbuild",
|
||||||
@@ -54,110 +51,104 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/cli": "^20.1.0",
|
"@commitlint/cli": "^20.0.0",
|
||||||
"@commitlint/config-conventional": "^20.0.0",
|
"@commitlint/config-conventional": "^20.0.0",
|
||||||
"@formkit/auto-animate": "^0.9.0",
|
"@formkit/auto-animate": "^0.9.0",
|
||||||
"@pinia/colada": "^0.18.0",
|
"@pinia/colada": "^0.17.4",
|
||||||
"@primeuix/themes": "^2.0.0",
|
"@primeuix/themes": "^1.2.3",
|
||||||
"@sa/materials": "workspace:*",
|
"@sa/materials": "workspace:*",
|
||||||
"@unhead/vue": "^2.0.19",
|
"@unhead/vue": "^2.0.14",
|
||||||
"@vueuse/core": "^14.0.0",
|
"@vueuse/core": "^13.9.0",
|
||||||
"highlight.js": "^11.11.1",
|
"highlight.js": "^11.11.1",
|
||||||
"jsonc-eslint-parser": "^2.4.1",
|
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"naive-ui": "^2.43.2",
|
"naive-ui": "^2.43.1",
|
||||||
"pinia": "^3.0.4",
|
"pinia": "^3.0.3",
|
||||||
"primeicons": "^7.0.0",
|
"primeicons": "^7.0.0",
|
||||||
"primelocale": "^2.2.2",
|
"primelocale": "^2.1.7",
|
||||||
"primevue": "^4.4.1",
|
"primevue": "^4.3.9",
|
||||||
"ts-enum-util": "^4.1.0",
|
"ts-enum-util": "^4.1.0",
|
||||||
"utils4u": "^5",
|
"utils4u": "^4.2.3",
|
||||||
"vue": "^3.5.24",
|
"vue": "^3.5.21",
|
||||||
"vue-i18n": "^11.2.1",
|
"vue-i18n": "^11.1.12",
|
||||||
"vue-memoize-dict": "^1.1.3",
|
"vue-memoize-dict": "^1.1.3",
|
||||||
"vue-router": "^4.6.3"
|
"vue-router": "^4.6.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@cloudflare/vite-plugin": "^1.15.2",
|
"@cloudflare/vite-plugin": "^1.13.2",
|
||||||
"@commitlint/types": "^20.0.0",
|
"@commitlint/types": "^20.0.0",
|
||||||
"@iconify-json/carbon": "^1.2.14",
|
"@iconify-json/carbon": "^1.2.13",
|
||||||
"@iconify-json/clarity": "^1.2.4",
|
"@iconify-json/clarity": "^1.2.4",
|
||||||
"@iconify-json/line-md": "^1.2.11",
|
"@iconify-json/line-md": "^1.2.11",
|
||||||
"@iconify-json/material-symbols": "^1.2.47",
|
"@iconify-json/material-symbols": "^1.2.42",
|
||||||
"@intlify/eslint-plugin-vue-i18n": "^4.1.0",
|
"@intlify/unplugin-vue-i18n": "^11.0.0",
|
||||||
"@intlify/unplugin-vue-i18n": "^11.0.1",
|
"@playwright/test": "^1.55.0",
|
||||||
"@playwright/test": "^1.57.0",
|
"@prettier/plugin-oxc": "^0.0.4",
|
||||||
"@prettier/plugin-oxc": "^0.1.3",
|
"@primevue/auto-import-resolver": "^4.3.9",
|
||||||
"@primevue/auto-import-resolver": "^4.4.1",
|
"@primevue/metadata": "^4.3.9",
|
||||||
"@primevue/metadata": "^4.4.1",
|
|
||||||
"@stylelint-types/stylelint-order": "^7.0.0",
|
"@stylelint-types/stylelint-order": "^7.0.0",
|
||||||
"@stylelint-types/stylelint-scss": "^6.11.0",
|
"@stylelint-types/stylelint-scss": "^6.11.0",
|
||||||
"@stylistic/eslint-plugin": "^5.6.1",
|
"@tsconfig/node22": "^22.0.2",
|
||||||
"@tsconfig/node22": "^22.0.5",
|
|
||||||
"@types/html-minifier-terser": "^7.0.2",
|
"@types/html-minifier-terser": "^7.0.2",
|
||||||
"@types/jsdom": "^27.0.0",
|
"@types/jsdom": "^27.0.0",
|
||||||
"@types/lodash-es": "^4.17.12",
|
"@types/lodash-es": "^4.17.12",
|
||||||
"@types/node": "^24.10.1",
|
"@types/node": "^22.18.1",
|
||||||
"@vant/auto-import-resolver": "^1.3.0",
|
"@vant/auto-import-resolver": "^1.3.0",
|
||||||
"@vitejs/plugin-vue": "^6.0.2",
|
"@vitejs/plugin-vue": "^6.0.1",
|
||||||
"@vitejs/plugin-vue-jsx": "^5.1.2",
|
"@vitejs/plugin-vue-jsx": "^5.1.1",
|
||||||
"@vitest/eslint-plugin": "^1.4.3",
|
"@vitest/eslint-plugin": "^1.3.9",
|
||||||
"@vue/eslint-config-prettier": "^10.2.0",
|
"@vue/eslint-config-prettier": "^10.2.0",
|
||||||
"@vue/eslint-config-typescript": "^14.6.0",
|
"@vue/eslint-config-typescript": "^14.6.0",
|
||||||
"@vue/test-utils": "^2.4.6",
|
"@vue/test-utils": "^2.4.6",
|
||||||
"@vue/tsconfig": "^0.8.1",
|
"@vue/tsconfig": "^0.8.1",
|
||||||
"boxen": "^8.0.1",
|
|
||||||
"consola": "^3.4.2",
|
"consola": "^3.4.2",
|
||||||
"eslint": "^9.39.1",
|
"eslint": "^9.35.0",
|
||||||
"eslint-plugin-import": "^2.32.0",
|
"eslint-plugin-import": "^2.32.0",
|
||||||
"eslint-plugin-jsonc": "^2.21.0",
|
"eslint-plugin-jsonc": "^2.21.0",
|
||||||
"eslint-plugin-oxlint": "~1.32.0",
|
"eslint-plugin-oxlint": "~1.25.0",
|
||||||
"eslint-plugin-perfectionist": "^5.0.0",
|
"eslint-plugin-playwright": "^2.2.2",
|
||||||
"eslint-plugin-playwright": "^2.3.0",
|
"eslint-plugin-vue": "~10.5.0",
|
||||||
"eslint-plugin-vue": "~10.6.0",
|
"happy-dom": "^20.0.1",
|
||||||
"happy-dom": "^20.0.10",
|
|
||||||
"html-minifier-terser": "^7.2.0",
|
"html-minifier-terser": "^7.2.0",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
"jsdom": "^27.2.0",
|
"jsdom": "^27.0.0",
|
||||||
"lint-staged": "^16.2.7",
|
"lint-staged": "^16.1.6",
|
||||||
"nodemon": "^3.1.11",
|
|
||||||
"npm-run-all2": "^8.0.4",
|
"npm-run-all2": "^8.0.4",
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
"oxlint": "~1.29.0",
|
"oxlint": "~1.25.0",
|
||||||
"postcss-html": "^1.8.0",
|
"postcss-html": "^1.8.0",
|
||||||
"prettier": "3.7.4",
|
"prettier": "3.6.2",
|
||||||
"rollup": "^4.53.3",
|
"rollup": "^4.52.5",
|
||||||
"sass-embedded": "^1.93.3",
|
"sass-embedded": "^1.93.2",
|
||||||
"sharp": "^0.34.5",
|
"sharp": "^0.34.4",
|
||||||
"stylelint": "^16.26.0",
|
"stylelint": "^16.25.0",
|
||||||
"stylelint-config-recess-order": "^7.4.0",
|
"stylelint-config-recess-order": "^7.3.0",
|
||||||
"stylelint-config-standard": "^39.0.1",
|
"stylelint-config-standard": "^39.0.1",
|
||||||
"stylelint-config-standard-scss": "^16.0.0",
|
"stylelint-config-standard-scss": "^16.0.0",
|
||||||
"stylelint-config-standard-vue": "^1.0.0",
|
"stylelint-config-standard-vue": "^1.0.0",
|
||||||
"stylelint-define-config": "^16.24.0",
|
"stylelint-define-config": "^16.24.0",
|
||||||
"svgo": "^4.0.0",
|
"svgo": "^4.0.0",
|
||||||
"tinyglobby": "^0.2.15",
|
"tinyglobby": "^0.2.15",
|
||||||
"type-fest": "^5.2.0",
|
"type-fest": "^5.1.0",
|
||||||
"typescript": "~5.9.3",
|
"typescript": "~5.9.2",
|
||||||
"unocss": "^66.5.9",
|
"unocss": "^66.5.1",
|
||||||
"unocss-preset-animations": "^1.3.0",
|
"unocss-preset-animations": "^1.2.1",
|
||||||
"unplugin-auto-import": "^20.2.0",
|
"unplugin-auto-import": "^20.1.0",
|
||||||
"unplugin-icons": "^22.5.0",
|
"unplugin-icons": "^22.2.0",
|
||||||
"unplugin-vue-components": "^30.0.0",
|
"unplugin-vue-components": "^29.2.0",
|
||||||
"unplugin-vue-markdown": "^29.2.0",
|
"unplugin-vue-markdown": "^29.2.0",
|
||||||
"unplugin-vue-router": "^0.19.0",
|
"unplugin-vue-router": "^0.16.0",
|
||||||
"vite": "^7.2.4",
|
"vite": "^7.1.5",
|
||||||
"vite-plugin-checker": "^0.12.0",
|
"vite-plugin-checker": "^0.11.0",
|
||||||
"vite-plugin-fake-server": "^2.2.2",
|
"vite-plugin-fake-server": "^2.2.0",
|
||||||
"vite-plugin-image-optimizer": "^2.0.3",
|
"vite-plugin-image-optimizer": "^2.0.2",
|
||||||
"vite-plugin-vue-devtools": "^8.0.5",
|
"vite-plugin-vue-devtools": "^8.0.1",
|
||||||
"vite-plugin-vue-meta-layouts": "^0.6.1",
|
"vite-plugin-vue-meta-layouts": "^0.6.1",
|
||||||
"vite-plugin-webfont-dl": "^3.11.1",
|
"vite-plugin-webfont-dl": "^3.11.1",
|
||||||
"vitest": "^4.0.13",
|
"vitest": "^3.2.4",
|
||||||
"vue-component-type-helpers": "^3.1.4",
|
"vue-component-type-helpers": "^3.1.2",
|
||||||
"vue-i18n-extract": "^2.0.7",
|
"vue-i18n-extract": "^2.0.7",
|
||||||
"vue-macros": "3.1.1",
|
"vue-macros": "3.1.1",
|
||||||
"vue-tsc": "^3.1.8",
|
"vue-tsc": "^3.1.0",
|
||||||
"wrangler": "^4.50.0"
|
"wrangler": "^4.37.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5254
pnpm-lock.yaml
generated
5254
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,2 @@
|
|||||||
packages:
|
packages:
|
||||||
- 'packages/*'
|
- "packages/*"
|
||||||
# shamefullyHoist: false # https://pnpm.io/zh/settings#shamefullyhoist
|
|
||||||
|
|
||||||
overrides:
|
|
||||||
vue-tsc: $vue-tsc
|
|
||||||
|
|||||||
10
src/App.vue
10
src/App.vue
@@ -6,13 +6,13 @@ import AppNaiveUIProvider from './AppNaiveUIProvider.vue';
|
|||||||
<template>
|
<template>
|
||||||
<DynamicDialog />
|
<DynamicDialog />
|
||||||
<ConfirmDialog />
|
<ConfirmDialog />
|
||||||
<Toast style="z-index: 5000" />
|
<Toast />
|
||||||
|
|
||||||
<AppNaiveUIProvider>
|
<AppNaiveUIProvider>
|
||||||
<RouterView v-slot="{ Component }">
|
<router-view v-slot="{ Component }">
|
||||||
<Transition name="fade" mode="out-in">
|
<transition name="fade" mode="out-in">
|
||||||
<component :is="Component" />
|
<component :is="Component" />
|
||||||
</Transition>
|
</transition>
|
||||||
</RouterView>
|
</router-view>
|
||||||
</AppNaiveUIProvider>
|
</AppNaiveUIProvider>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -42,17 +42,17 @@ declare global {
|
|||||||
:theme="appStore.isDark ? darkTheme : null"
|
:theme="appStore.isDark ? darkTheme : null"
|
||||||
abstract
|
abstract
|
||||||
>
|
>
|
||||||
<NLoadingBarProvider>
|
<n-loading-bar-provider>
|
||||||
<NMessageProvider>
|
<n-message-provider>
|
||||||
<NNotificationProvider>
|
<n-notification-provider>
|
||||||
<NModalProvider>
|
<n-modal-provider>
|
||||||
<NDialogProvider>
|
<n-dialog-provider>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
<ContextHolder />
|
<ContextHolder />
|
||||||
</NDialogProvider>
|
</n-dialog-provider>
|
||||||
</NModalProvider>
|
</n-modal-provider>
|
||||||
</NNotificationProvider>
|
</n-notification-provider>
|
||||||
</NMessageProvider>
|
</n-message-provider>
|
||||||
</NLoadingBarProvider>
|
</n-loading-bar-provider>
|
||||||
</NConfigProvider>
|
</NConfigProvider>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ function handleSelect(key: string) {
|
|||||||
<NDropdown trigger="hover" placement="bottom-end" :options="options" @select="handleSelect">
|
<NDropdown trigger="hover" placement="bottom-end" :options="options" @select="handleSelect">
|
||||||
<NButton quaternary class="flex items-center gap-1">
|
<NButton quaternary class="flex items-center gap-1">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<IconClarityLanguageLine w-4.5 h-4.5 />
|
<icon-clarity-language-line w-4.5 h-4.5 />
|
||||||
</template>
|
</template>
|
||||||
<span>{{ languageLabels[locale] }}</span>
|
<span>{{ languageLabels[locale] }}</span>
|
||||||
</NButton>
|
</NButton>
|
||||||
|
|||||||
@@ -13,17 +13,17 @@ const themeLabels: Record<AppThemeMode, string> = {
|
|||||||
{{ themeLabels[appStore.themeMode] }}
|
{{ themeLabels[appStore.themeMode] }}
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<NButton quaternary @click="appStore.cycleTheme()">
|
<NButton quaternary @click="appStore.cycleTheme()">
|
||||||
<IconLineMdSunnyFilledLoopToMoonFilledLoopTransition
|
<icon-line-md-sunny-filled-loop-to-moon-filled-loop-transition
|
||||||
v-if="appStore.themeMode === 'light'"
|
v-if="appStore.themeMode === 'light'"
|
||||||
w-4.5
|
w-4.5
|
||||||
h-4.5
|
h-4.5
|
||||||
/>
|
/>
|
||||||
<IconLineMdMoonFilledToSunnyFilledLoopTransition
|
<icon-line-md-moon-filled-to-sunny-filled-loop-transition
|
||||||
v-else-if="appStore.themeMode === 'dark'"
|
v-else-if="appStore.themeMode === 'dark'"
|
||||||
w-4.5
|
w-4.5
|
||||||
h-4.5
|
h-4.5
|
||||||
/>
|
/>
|
||||||
<IconLineMdComputer v-else w-4.5 h-4.5 />
|
<icon-line-md-computer v-else w-4.5 h-4.5 />
|
||||||
</NButton>
|
</NButton>
|
||||||
</template>
|
</template>
|
||||||
</NTooltip>
|
</NTooltip>
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ function toggleCollapsed() {
|
|||||||
{{ appStore.sidebarCollapsed ? '展开菜单' : '收起菜单' }}
|
{{ appStore.sidebarCollapsed ? '展开菜单' : '收起菜单' }}
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<NButton ref="buttonRef" quaternary @click="toggleCollapsed">
|
<NButton ref="buttonRef" quaternary @click="toggleCollapsed">
|
||||||
<IconLineMdMenuFoldRight v-if="appStore.sidebarCollapsed" w-4.5 h-4.5 />
|
<icon-line-md-menu-fold-right v-if="appStore.sidebarCollapsed" w-4.5 h-4.5 />
|
||||||
<IconLineMdMenuFoldLeft v-else w-4.5 h-4.5 />
|
<icon-line-md-menu-fold-left v-else w-4.5 h-4.5 />
|
||||||
</NButton>
|
</NButton>
|
||||||
</template>
|
</template>
|
||||||
</NTooltip>
|
</NTooltip>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ function handleSelect(key: string) {
|
|||||||
<template>
|
<template>
|
||||||
<NDropdown :options="options" placement="bottom-end" @select="handleSelect">
|
<NDropdown :options="options" placement="bottom-end" @select="handleSelect">
|
||||||
<NButton quaternary circle>
|
<NButton quaternary circle>
|
||||||
<IconMaterialSymbolsAccountCircle w-5 h-5 />
|
<icon-material-symbols-account-circle w-5 h-5 />
|
||||||
</NButton>
|
</NButton>
|
||||||
</NDropdown>
|
</NDropdown>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -29,11 +29,11 @@ const appStore = useAppStore();
|
|||||||
<BaseLayoutSider />
|
<BaseLayoutSider />
|
||||||
</template>
|
</template>
|
||||||
<!-- <div>GlobalContent</div> -->
|
<!-- <div>GlobalContent</div> -->
|
||||||
<RouterView v-slot="{ Component }">
|
<router-view v-slot="{ Component }">
|
||||||
<Transition name="fade" mode="out-in">
|
<transition name="fade" mode="out-in">
|
||||||
<component :is="Component" />
|
<component :is="Component" />
|
||||||
</Transition>
|
</transition>
|
||||||
</RouterView>
|
</router-view>
|
||||||
<!-- <div>ThemeDrawer</div> -->
|
<!-- <div>ThemeDrawer</div> -->
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -2,12 +2,11 @@
|
|||||||
* All i18n resources specified in the plugin `include` option can be loaded
|
* All i18n resources specified in the plugin `include` option can be loaded
|
||||||
* at once using the import syntax
|
* at once using the import syntax
|
||||||
*/
|
*/
|
||||||
import messages from '@intlify/unplugin-vue-i18n/messages';
|
|
||||||
|
|
||||||
import { router } from '@/plugins/00.router-plugin';
|
import { router } from '@/plugins/00.router-plugin';
|
||||||
|
import messages from '@intlify/unplugin-vue-i18n/messages';
|
||||||
import { createGetRoutes } from 'virtual:meta-layouts';
|
import { createGetRoutes } from 'virtual:meta-layouts';
|
||||||
|
|
||||||
import { createI18n } from 'vue-i18n';
|
import { createI18n } from 'vue-i18n';
|
||||||
import { START_LOCATION } from 'vue-router';
|
|
||||||
|
|
||||||
const locale = useLocalStorage<string>('app-locale', navigator.language);
|
const locale = useLocalStorage<string>('app-locale', navigator.language);
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
@@ -36,20 +35,11 @@ export const routeI18nInstance = createI18n({
|
|||||||
useScope: 'local',
|
useScope: 'local',
|
||||||
missing: (locale, key) => {
|
missing: (locale, key) => {
|
||||||
consola.warn(`菜单翻译缺失: locale=${locale}, key=${key}`);
|
consola.warn(`菜单翻译缺失: locale=${locale}, key=${key}`);
|
||||||
if (__DEV__) {
|
|
||||||
ToastService.add({
|
|
||||||
severity: 'warn',
|
|
||||||
summary: '菜单翻译缺失',
|
|
||||||
detail: `菜单翻译缺失: locale=${locale}, key=${key}`,
|
|
||||||
life: 5000,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return key;
|
return key;
|
||||||
},
|
},
|
||||||
fallbackRoot: true,
|
fallbackRoot: true,
|
||||||
messages: i18nRouteMessages,
|
messages: i18nRouteMessages,
|
||||||
});
|
});
|
||||||
export const routeI18nT = routeI18nInstance.global.t;
|
|
||||||
|
|
||||||
watchEffect(
|
watchEffect(
|
||||||
() => {
|
() => {
|
||||||
@@ -61,17 +51,18 @@ watchEffect(
|
|||||||
watch(
|
watch(
|
||||||
() => i18nInstance.global.locale.value,
|
() => i18nInstance.global.locale.value,
|
||||||
() => {
|
() => {
|
||||||
const { t, te } = routeI18nInstance.global;
|
|
||||||
|
|
||||||
routeI18nInstance.global.locale.value = i18nInstance.global.locale.value;
|
routeI18nInstance.global.locale.value = i18nInstance.global.locale.value;
|
||||||
|
|
||||||
if (router.currentRoute.value.name && router.currentRoute.value !== START_LOCATION) {
|
|
||||||
router.currentRoute.value.meta.title = t(router.currentRoute.value.name as string);
|
|
||||||
}
|
|
||||||
|
|
||||||
const routes = createGetRoutes(router)(); // 获取路由表但是不包含布局路由
|
const routes = createGetRoutes(router)(); // 获取路由表但是不包含布局路由
|
||||||
|
|
||||||
routes.forEach((route) => {
|
routes.forEach((route) => {
|
||||||
|
const { t, te } = routeI18nInstance.global;
|
||||||
|
|
||||||
|
if (router.currentRoute.value.name) {
|
||||||
|
router.currentRoute.value.meta.title = t(router.currentRoute.value.name as string);
|
||||||
|
}
|
||||||
|
|
||||||
|
route.meta = route.meta || {};
|
||||||
const routeName = route.name as string;
|
const routeName = route.name as string;
|
||||||
route.meta.title = te(routeName) ? t(routeName) : routeName;
|
route.meta.title = te(routeName) ? t(routeName) : routeName;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
/*eslint perfectionist/sort-objects: "error"*/
|
/*eslint sort-keys: "error"*/
|
||||||
/**
|
/**
|
||||||
* 启用 perfectionist/sort-objects 规则以强制对象键按字母顺序排序
|
* 启用 sort-keys 规则以强制对象键按字母顺序排序
|
||||||
* 原因:
|
* 原因:
|
||||||
* 1. 减少多人协作时的合并冲突
|
* 1. 减少多人协作时的合并冲突
|
||||||
* 2. 保持代码一致性,提高可维护性
|
* 2. 保持代码一致性,提高可维护性
|
||||||
*
|
|
||||||
* 运行以下命令自动修复排序:
|
|
||||||
* pnpm exec eslint --fix --no-ignore src/locales-utils/route-messages/
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
/*eslint perfectionist/sort-objects: "error"*/
|
/*eslint sort-keys: "error"*/
|
||||||
/**
|
/**
|
||||||
* 启用 perfectionist/sort-objects 规则以强制对象键按字母顺序排序
|
* 启用 sort-keys 规则以强制对象键按字母顺序排序
|
||||||
* 原因:
|
* 原因:
|
||||||
* 1. 减少多人协作时的合并冲突
|
* 1. 减少多人协作时的合并冲突
|
||||||
* 2. 保持代码一致性,提高可维护性
|
* 2. 保持代码一致性,提高可维护性
|
||||||
*
|
|
||||||
* 运行以下命令自动修复排序:
|
|
||||||
* pnpm exec eslint --fix --no-ignore src/locales-utils/route-messages/
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import { setupPlugins } from './plugins';
|
|||||||
consola.level = LogLevels.verbose;
|
consola.level = LogLevels.verbose;
|
||||||
|
|
||||||
const app = createApp(App);
|
const app = createApp(App);
|
||||||
if (__DEV__) Object.defineProperty(window, '__APP__', { value: app });
|
|
||||||
setupPlugins(app);
|
setupPlugins(app);
|
||||||
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 280));
|
await new Promise((resolve) => setTimeout(resolve, 280));
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ const resetCount = () => {
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Naive UI 按钮 -->
|
<!-- Naive UI 按钮 -->
|
||||||
<NButton
|
<n-button
|
||||||
type="warning"
|
type="warning"
|
||||||
size="large"
|
size="large"
|
||||||
block
|
block
|
||||||
@@ -148,7 +148,7 @@ const resetCount = () => {
|
|||||||
</svg>
|
</svg>
|
||||||
</template>
|
</template>
|
||||||
点击 +1 (Naive UI)
|
点击 +1 (Naive UI)
|
||||||
</NButton>
|
</n-button>
|
||||||
|
|
||||||
<!-- 重置按钮 -->
|
<!-- 重置按钮 -->
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -9,29 +9,24 @@ function setLocale(newLocale: 'en-US' | 'zh-CN') {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
<NH1>{{ t('page.i18n-demo.title') }}</NH1>
|
<n-h1>{{ t('page.i18n-demo.title') }}</n-h1>
|
||||||
|
|
||||||
<NCard :title="t('page.i18n-demo.change-language')">
|
<n-card :title="t('page.i18n-demo.change-language')">
|
||||||
<NP>
|
<n-p>
|
||||||
{{ t('page.i18n-demo.current-language') }}:
|
{{ t('page.i18n-demo.current-language') }}:
|
||||||
<span class="font-bold">{{ locale }}</span>
|
<span class="font-bold">{{ locale }}</span>
|
||||||
</NP>
|
</n-p>
|
||||||
|
|
||||||
<NP>
|
<n-p>
|
||||||
{{ t('page.i18n-demo.hello', { name: 'Kilo' }) }}
|
{{ t('page.i18n-demo.hello', { name: 'Kilo' }) }}
|
||||||
</NP>
|
</n-p>
|
||||||
|
|
||||||
<NSpace>
|
<n-p> $route.meta: {{ $route.meta }} </n-p>
|
||||||
<NButton type="primary" @click="setLocale('en-US')"> English </NButton>
|
|
||||||
<NButton type="success" @click="setLocale('zh-CN')"> 简体中文 </NButton>
|
|
||||||
</NSpace>
|
|
||||||
</NCard>
|
|
||||||
|
|
||||||
<!-- 这里响应式有问题: -->
|
<n-space>
|
||||||
<NP> $route.meta.title: {{ $route.meta.title }} </NP>
|
<n-button type="primary" @click="setLocale('en-US')"> English </n-button>
|
||||||
<!-- 这样才正常 -->
|
<n-button type="success" @click="setLocale('zh-CN')"> 简体中文 </n-button>
|
||||||
<NP>
|
</n-space>
|
||||||
routeI18nInstance.global.t($route.name): {{ routeI18nInstance.global.t($route.name) }}
|
</n-card>
|
||||||
</NP>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ const FComponent: FunctionalComponent<{ prop: string }> = (props /* context */)
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<NCard title="函数式组件(TSX)示例">
|
<NCard title="函数式组件(TSX)示例">
|
||||||
<FComponent prop="some-prop-value" />
|
<FComponent prop="some-prop-value" />
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { MessageType } from 'naive-ui';
|
import type { MessageType } from 'naive-ui';
|
||||||
import { useDialog, useMessage } from 'naive-ui';
|
import { useDialog, useMessage } from 'naive-ui';
|
||||||
|
import UseSafeNForm from './use-safe-n-form.vue';
|
||||||
|
|
||||||
definePage({ meta: {} });
|
definePage({ meta: {} });
|
||||||
|
|
||||||
@@ -60,6 +61,9 @@ const openModal = () => {
|
|||||||
<NAlert title="信息" type="info" :bordered="false">
|
<NAlert title="信息" type="info" :bordered="false">
|
||||||
演示 Naive UI 各种组件的使用方法和功能特性
|
演示 Naive UI 各种组件的使用方法和功能特性
|
||||||
</NAlert>
|
</NAlert>
|
||||||
|
<n-card title="SafeNForm" mt-4>
|
||||||
|
<UseSafeNForm />
|
||||||
|
</n-card>
|
||||||
<NCard title="Message 消息" class="mt-4">
|
<NCard title="Message 消息" class="mt-4">
|
||||||
<NSpace>
|
<NSpace>
|
||||||
<NButton
|
<NButton
|
||||||
|
|||||||
72
src/pages/demos/naive-ui-demo/use-safe-n-form.vue
Normal file
72
src/pages/demos/naive-ui-demo/use-safe-n-form.vue
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const { formInst, formValue, SafeNForm, SafeNFormItem } = useSafeNForm({
|
||||||
|
initialFormValue: {
|
||||||
|
/* ⚠️:
|
||||||
|
如果没使用`SafeNFormItem`,
|
||||||
|
这里`user`对象没有手动初始化的话,将会报错:
|
||||||
|
`can't access property "name", $setup.formValue.user is undefined`
|
||||||
|
*/
|
||||||
|
user: {
|
||||||
|
name: '',
|
||||||
|
age: 0,
|
||||||
|
},
|
||||||
|
phone: '',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleValidateClick() {
|
||||||
|
formInst.value?.validate((errors) => {
|
||||||
|
if (!errors) {
|
||||||
|
window.$nMessage!.success('Valid');
|
||||||
|
} else {
|
||||||
|
console.log(errors);
|
||||||
|
window.$nMessage!.error('Invalid');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div border>
|
||||||
|
<pre>formValue: {{ JSON.stringify(formValue, null, 2) }}</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<SafeNForm inline label-placement="left" label-width="auto" mt-4>
|
||||||
|
<n-form-item
|
||||||
|
label="姓名"
|
||||||
|
path="user.name"
|
||||||
|
:rule="{ required: true, message: '请输入姓名', trigger: ['input'] }"
|
||||||
|
>
|
||||||
|
<n-input v-model:value="formValue.user.name" placeholder="输入姓名" />
|
||||||
|
</n-form-item>
|
||||||
|
|
||||||
|
<SafeNFormItem
|
||||||
|
#default="{ value, setValue }"
|
||||||
|
:rule="{ required: true, message: '请输入姓名', trigger: ['input'] }"
|
||||||
|
label="姓名"
|
||||||
|
path="user.name"
|
||||||
|
>
|
||||||
|
<NInput :value="value" placeholder="SafeNFormItem" @update:value="setValue" />
|
||||||
|
</SafeNFormItem>
|
||||||
|
|
||||||
|
<n-form-item
|
||||||
|
label="电话号码"
|
||||||
|
path="phone"
|
||||||
|
:rule="{ required: true, message: '请输入电话号码', trigger: ['blur'] }"
|
||||||
|
>
|
||||||
|
<n-input v-model:value="formValue.phone" placeholder="电话号码" />
|
||||||
|
</n-form-item>
|
||||||
|
|
||||||
|
<SafeNFormItem
|
||||||
|
label="电话号码"
|
||||||
|
path="phone"
|
||||||
|
:rule="{ required: true, message: '请输入电话号码', trigger: ['blur'] }"
|
||||||
|
>
|
||||||
|
<!-- 如果没有提供插槽,会默认渲染一个`<NInput>` -->
|
||||||
|
</SafeNFormItem>
|
||||||
|
|
||||||
|
<n-form-item>
|
||||||
|
<n-button attr-type="button" @click="handleValidateClick"> 验证 </n-button>
|
||||||
|
</n-form-item>
|
||||||
|
</SafeNForm>
|
||||||
|
</template>
|
||||||
@@ -2,6 +2,6 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<NButton @click="$router.push({ name: 'DemosCreate' })">DemosCreate</NButton>
|
<n-button @click="$router.push({ name: 'DemosCreate' })">DemosCreate</n-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
export function install({ app }: { app: import('vue').App<Element> }) {
|
export function install({ app }: { app: import('vue').App<Element> }) {
|
||||||
app.config.globalProperties.__DEV__ =
|
app.config.globalProperties.__DEV__ = __DEV__;
|
||||||
__DEV__; /* vite.config.ts: define: { __DEV__: JSON.stringify(!isBuild) } */
|
|
||||||
|
|
||||||
app.config.errorHandler = (error, instance, info) => {
|
app.config.errorHandler = (error, instance, info) => {
|
||||||
console.error('Global error:', error);
|
console.error('Global error:', error);
|
||||||
|
|||||||
@@ -5,21 +5,12 @@
|
|||||||
import Aura from '@primeuix/themes/aura';
|
import Aura from '@primeuix/themes/aura';
|
||||||
import zhCN from 'primelocale/zh-CN.json';
|
import zhCN from 'primelocale/zh-CN.json';
|
||||||
import PrimeVue from 'primevue/config';
|
import PrimeVue from 'primevue/config';
|
||||||
import type { PrimeVueConfiguration } from 'primevue/config';
|
|
||||||
import StyleClass from 'primevue/styleclass';
|
import StyleClass from 'primevue/styleclass';
|
||||||
import ToastService from 'primevue/toastservice';
|
import ToastService from 'primevue/toastservice';
|
||||||
|
|
||||||
export function install({ app }: { app: import('vue').App<Element> }) {
|
export function install({ app }: { app: import('vue').App<Element> }) {
|
||||||
app.directive('styleclass', StyleClass);
|
app.directive('styleclass', StyleClass);
|
||||||
|
|
||||||
// https://github.com/primefaces/primevue/blob/afe6f58ae55e9caf7f9bc094cd453a21a6113001/packages/core/src/config/PrimeVue.js
|
|
||||||
app.use(PrimeVue, {
|
app.use(PrimeVue, {
|
||||||
zIndex: {
|
|
||||||
modal: 5100,
|
|
||||||
overlay: 5000,
|
|
||||||
menu: 5000,
|
|
||||||
tooltip: 5100,
|
|
||||||
},
|
|
||||||
locale: {
|
locale: {
|
||||||
...zhCN['zh-CN'],
|
...zhCN['zh-CN'],
|
||||||
completed: '已上传',
|
completed: '已上传',
|
||||||
@@ -34,6 +25,6 @@ export function install({ app }: { app: import('vue').App<Element> }) {
|
|||||||
},
|
},
|
||||||
preset: Aura,
|
preset: Aura,
|
||||||
},
|
},
|
||||||
} satisfies PrimeVueConfiguration);
|
});
|
||||||
app.use(ToastService);
|
app.use(ToastService);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,12 @@
|
|||||||
import type { BasicColorSchema } from '@vueuse/core';
|
|
||||||
import { useLocalStorage, useMediaQuery } from '@vueuse/core';
|
import { useLocalStorage, useMediaQuery } from '@vueuse/core';
|
||||||
import { defineStore } from 'pinia';
|
import { defineStore } from 'pinia';
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
|
|
||||||
// >>>>>
|
// >>>>>
|
||||||
// https://vueuse.org/core/useColorMode/#advanced-usage
|
// https://vueuse.org/core/useColorMode/#advanced-usage
|
||||||
const { system, store: themeMode } = useColorMode<BasicColorSchema>({
|
const { system, store: themeMode } = useColorMode({
|
||||||
selector: 'html',
|
|
||||||
attribute: 'class',
|
|
||||||
modes: { light: '', dark: 'app-dark', auto: '' },
|
modes: { light: '', dark: 'app-dark', auto: '' },
|
||||||
disableTransition: false,
|
disableTransition: false,
|
||||||
initialValue: 'auto',
|
|
||||||
});
|
});
|
||||||
const { state, next: cycleTheme } = useCycleList(['light', 'dark', 'auto'] as const, {
|
const { state, next: cycleTheme } = useCycleList(['light', 'dark', 'auto'] as const, {
|
||||||
initialValue: themeMode,
|
initialValue: themeMode,
|
||||||
|
|||||||
121
src/utils/use-safe-n-form-auto-imports.tsx
Normal file
121
src/utils/use-safe-n-form-auto-imports.tsx
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
/**
|
||||||
|
* https://www.naiveui.com/zh-CN/os-theme/components/form
|
||||||
|
*
|
||||||
|
* FIXME: `NForm` 和 `NFormItem` 的 slots 还没有实现。`NFormItemGi`组件。
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { get, set } from 'lodash-es';
|
||||||
|
import type { FormInst, FormItemProps, FormProps } from 'naive-ui';
|
||||||
|
import { NForm, NFormItem, formItemProps, NInput, formProps } from 'naive-ui';
|
||||||
|
import type { Get, Paths } from 'type-fest';
|
||||||
|
import type { SlotsType } from 'vue';
|
||||||
|
import { Comment } from 'vue';
|
||||||
|
|
||||||
|
type UseSafeNFormOptions<FormValue> = {
|
||||||
|
initialFormValue?: FormValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function useSafeNForm<T extends Record<string, any> = Record<string, unknown>>(
|
||||||
|
options: UseSafeNFormOptions<T> = {},
|
||||||
|
) {
|
||||||
|
const formInst = ref<FormInst | null>(null);
|
||||||
|
const formValue = ref<T>(structuredClone(toRaw(options.initialFormValue)) || ({} as T));
|
||||||
|
|
||||||
|
// 创建类型安全的 Form 组件
|
||||||
|
type SafeNFormProps = FormProps;
|
||||||
|
|
||||||
|
type SafeNFormSlots = SlotsType<{
|
||||||
|
default?: { count?: number };
|
||||||
|
}>;
|
||||||
|
|
||||||
|
const SafeNForm = defineComponent<SafeNFormProps, /* Emits */ [], /* EE */ never, SafeNFormSlots>(
|
||||||
|
(props, ctx) => {
|
||||||
|
return () => (
|
||||||
|
<NForm
|
||||||
|
{...props}
|
||||||
|
model={formValue.value}
|
||||||
|
ref={(inst) => {
|
||||||
|
formInst.value = inst as unknown as FormInst;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{ctx.slots.default?.({})}
|
||||||
|
</NForm>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'SafeNForm',
|
||||||
|
inheritAttrs: true,
|
||||||
|
props: formProps,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
// <<<<<
|
||||||
|
|
||||||
|
// >>>>> 创建类型安全的 FormItem 组件
|
||||||
|
type SafeNFormItemProps<P extends Paths<T> & string> = FormItemProps & {
|
||||||
|
path: P;
|
||||||
|
};
|
||||||
|
|
||||||
|
type SafeNFormItemDefaultSlot<P extends Paths<T> & string> = {
|
||||||
|
value: Get<T, P>;
|
||||||
|
setValue: (val: Get<T, P>) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const SafeNFormItemImpl = defineComponent<
|
||||||
|
SafeNFormItemProps<Paths<T> & string>,
|
||||||
|
/* Emits */ [],
|
||||||
|
/* EE */ never,
|
||||||
|
SlotsType<{ default: SafeNFormItemDefaultSlot<Paths<T> & string> }>
|
||||||
|
>(
|
||||||
|
(props, ctx) => {
|
||||||
|
return () => {
|
||||||
|
const value = get(formValue.value, props.path);
|
||||||
|
function setValue(val: typeof value) {
|
||||||
|
set(formValue.value, props.path, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultSlotContent = ctx.slots.default?.({
|
||||||
|
value,
|
||||||
|
setValue,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 如果没有提供默认 slot 内容,则渲染一个 NInput 作为默认输入组件
|
||||||
|
const renderDefaultNInput = defaultSlotContent?.some((v) => v.type !== Comment) ? null : (
|
||||||
|
<NInput value={value} onUpdate:value={setValue} />
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NFormItem {...props} path={props.path}>
|
||||||
|
{defaultSlotContent}
|
||||||
|
{renderDefaultNInput}
|
||||||
|
</NFormItem>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'SafeNFormItem',
|
||||||
|
inheritAttrs: false,
|
||||||
|
props: Object.keys(formItemProps) as unknown as [keyof FormItemProps],
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Expose a generic constructor so template literals narrow `path`.
|
||||||
|
type SafeNFormItemComponent = {
|
||||||
|
new <P extends Paths<T> & string>(
|
||||||
|
props: SafeNFormItemProps<P>,
|
||||||
|
): {
|
||||||
|
$props: SafeNFormItemProps<P>;
|
||||||
|
$slots: {
|
||||||
|
default?: (scope: SafeNFormItemDefaultSlot<P>) => VNode[];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
const SafeNFormItem = SafeNFormItemImpl as SafeNFormItemComponent;
|
||||||
|
// <<<<<
|
||||||
|
|
||||||
|
return {
|
||||||
|
formValue,
|
||||||
|
SafeNForm,
|
||||||
|
SafeNFormItem,
|
||||||
|
formInst,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -14,15 +14,7 @@
|
|||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["./src/*"],
|
"@/*": ["./src/*"]
|
||||||
"~/*": ["./src/*"]
|
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"vueCompilerOptions": {
|
|
||||||
"plugins": [
|
|
||||||
"vue-macros/volar",
|
|
||||||
"unplugin-vue-router/volar/sfc-route-blocks",
|
|
||||||
"unplugin-vue-router/volar/sfc-typed-router"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
typed-router.d.ts
vendored
2
typed-router.d.ts
vendored
@@ -2,7 +2,7 @@
|
|||||||
/* prettier-ignore */
|
/* prettier-ignore */
|
||||||
// @ts-nocheck
|
// @ts-nocheck
|
||||||
// noinspection ES6UnusedImports
|
// noinspection ES6UnusedImports
|
||||||
// Generated by unplugin-vue-router. !! DO NOT MODIFY THIS FILE !!
|
// Generated by unplugin-vue-router. ‼️ DO NOT MODIFY THIS FILE ‼️
|
||||||
// It's recommended to commit this file.
|
// It's recommended to commit this file.
|
||||||
// Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry.
|
// Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry.
|
||||||
|
|
||||||
|
|||||||
@@ -1,33 +1,26 @@
|
|||||||
import vue from '@vitejs/plugin-vue';
|
import vue from '@vitejs/plugin-vue';
|
||||||
import vueJsx from '@vitejs/plugin-vue-jsx';
|
import vueJsx from '@vitejs/plugin-vue-jsx';
|
||||||
|
import { getPascalCaseRouteName } from 'unplugin-vue-router';
|
||||||
import vueRouter from 'unplugin-vue-router/vite';
|
import vueRouter from 'unplugin-vue-router/vite';
|
||||||
|
import type { PluginOption } from 'vite';
|
||||||
import VueMacros from 'vue-macros/vite';
|
import VueMacros from 'vue-macros/vite';
|
||||||
|
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
export default [
|
||||||
|
VueMacros({
|
||||||
|
plugins: {
|
||||||
|
vue: vue({ include: [/\.vue$/, /\.md$/] }),
|
||||||
|
vueJsx: vueJsx(),
|
||||||
|
|
||||||
export const loadPlugin: LoadPluginFunction = async (_pluginLoadOptions) => {
|
// https://uvr.esm.is/guide/configuration.html
|
||||||
return [
|
// https://github.com/posva/unplugin-vue-router
|
||||||
VueMacros({
|
// ⚠️ Vue must be placed after VueRouter()
|
||||||
plugins: {
|
vueRouter: vueRouter({
|
||||||
vue: vue({ include: [/\.vue$/, /\.md$/] }),
|
exclude: ['**/__*', '**/__*/**/*'],
|
||||||
vueJsx: vueJsx(),
|
extensions: ['.page.vue', '.page.md'],
|
||||||
|
getRouteName: (routeNode) => getPascalCaseRouteName(routeNode),
|
||||||
// https://uvr.esm.is/guide/configuration.html
|
logs: false,
|
||||||
// https://github.com/posva/unplugin-vue-router
|
routesFolder: 'src/pages',
|
||||||
// ⚠️ Vue must be placed after VueRouter()
|
}),
|
||||||
vueRouter: vueRouter({
|
},
|
||||||
routesFolder: 'src/pages',
|
}),
|
||||||
extensions: ['.page.vue', '.page.md'],
|
] satisfies PluginOption;
|
||||||
exclude: ['**/__*', '**/__*/**/*'],
|
|
||||||
getRouteName: (await import('unplugin-vue-router')).getPascalCaseRouteName,
|
|
||||||
beforeWriteFiles(rootRoute) {
|
|
||||||
for (/* 深度优先遍历 */ const route of rootRoute.traverseDFS()) {
|
|
||||||
route.addToMeta({ _: route.fullPath });
|
|
||||||
}
|
|
||||||
},
|
|
||||||
logs: !true,
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
|
import type { PluginOption } from 'vite';
|
||||||
import UnoCSS from 'unocss/vite';
|
import UnoCSS from 'unocss/vite';
|
||||||
|
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
export default [
|
||||||
|
// https://github.com/antfu/unocss
|
||||||
export const loadPlugin: LoadPluginFunction = (_pluginLoadOptions) => {
|
// see uno.config.ts for config
|
||||||
return [
|
UnoCSS({
|
||||||
// https://github.com/antfu/unocss
|
checkImport: true,
|
||||||
// see uno.config.ts for config
|
}),
|
||||||
UnoCSS({
|
] satisfies PluginOption;
|
||||||
checkImport: true,
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,21 +1,18 @@
|
|||||||
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite';
|
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite';
|
||||||
|
import type { PluginOption } from 'vite';
|
||||||
|
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
export default [
|
||||||
|
// https://github.com/intlify/bundle-tools/tree/main/packages/unplugin-vue-i18n
|
||||||
|
VueI18nPlugin({
|
||||||
|
/* options */
|
||||||
|
// locale messages resource pre-compile option
|
||||||
|
include: ['src/locales/**'],
|
||||||
|
|
||||||
export const loadPlugin: LoadPluginFunction = (_pluginLoadOptions) => {
|
// https://github.com/intlify/bundle-tools/tree/main/packages/unplugin-vue-i18n#transformi18nblock
|
||||||
return [
|
// transformI18nBlock(src) {
|
||||||
// https://github.com/intlify/bundle-tools/tree/main/packages/unplugin-vue-i18n
|
// console.debug(`src :>> `, src);
|
||||||
VueI18nPlugin({
|
// console.debug(`typeof src :>> `, typeof src);
|
||||||
/* options */
|
// return src as string;
|
||||||
// locale messages resource pre-compile option
|
// },
|
||||||
include: ['src/locales/**'],
|
}),
|
||||||
|
] satisfies PluginOption;
|
||||||
// https://github.com/intlify/bundle-tools/tree/main/packages/unplugin-vue-i18n#transformi18nblock
|
|
||||||
// transformI18nBlock(src) {
|
|
||||||
// console.debug(`src :>> `, src);
|
|
||||||
// console.debug(`typeof src :>> `, typeof src);
|
|
||||||
// return src as string;
|
|
||||||
// },
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
|
import type { PluginOption } from 'vite';
|
||||||
import Markdown from 'unplugin-vue-markdown/vite';
|
import Markdown from 'unplugin-vue-markdown/vite';
|
||||||
|
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
export default [
|
||||||
|
// https://github.com/unplugin/unplugin-vue-markdown
|
||||||
export const loadPlugin: LoadPluginFunction = (_pluginLoadOptions) => {
|
Markdown({
|
||||||
return [
|
headEnabled: true,
|
||||||
// https://github.com/unplugin/unplugin-vue-markdown
|
}),
|
||||||
Markdown({
|
] satisfies PluginOption;
|
||||||
headEnabled: true,
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,20 +1,17 @@
|
|||||||
|
import type { PluginOption } from 'vite';
|
||||||
import MetaLayouts from 'vite-plugin-vue-meta-layouts';
|
import MetaLayouts from 'vite-plugin-vue-meta-layouts';
|
||||||
|
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
export default [
|
||||||
|
// https://github.com/dishait/vite-plugin-vue-meta-layouts
|
||||||
export const loadPlugin: LoadPluginFunction = (_pluginLoadOptions) => {
|
MetaLayouts({
|
||||||
return [
|
target: 'src/layouts',
|
||||||
// https://github.com/dishait/vite-plugin-vue-meta-layouts
|
excludes: ['**/!(the-)*.vue'], // 排除非 the- 开头的文件。
|
||||||
MetaLayouts({
|
metaName: 'layout',
|
||||||
target: 'src/layouts',
|
// defaultLayout: 'sakai-vue/AppLayout',
|
||||||
excludes: ['**/!(the-)*.vue'], // 排除非 the- 开头的文件。
|
// defaultLayout: 'naive-ui/AppLayout',
|
||||||
metaName: 'layout',
|
defaultLayout: 'base-layout/the-base-layout',
|
||||||
// defaultLayout: 'sakai-vue/AppLayout',
|
// !⬇️: 当设置为 `sync` 时,注意`import 'virtual:uno.css'`的顺序问题。
|
||||||
// defaultLayout: 'naive-ui/AppLayout',
|
// importMode: 'sync', // 默认为自动处理,SSG 时为 sync,非 SSG 时为 async
|
||||||
defaultLayout: 'base-layout/the-base-layout',
|
skipTopLevelRouteLayout: true, // 打开修复 https://github.com/JohnCampionJr/vite-plugin-vue-layouts/issues/134,默认为 false 关闭
|
||||||
// !⬇️: 当设置为 `sync` 时,注意`import 'virtual:uno.css'`的顺序问题。
|
}),
|
||||||
// importMode: 'sync', // 默认为自动处理,SSG 时为 sync,非 SSG 时为 async
|
] satisfies PluginOption;
|
||||||
skipTopLevelRouteLayout: true, // 打开修复 https://github.com/JohnCampionJr/vite-plugin-vue-layouts/issues/134,默认为 false 关闭
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import Icons from 'unplugin-icons/vite';
|
|||||||
import Components from 'unplugin-vue-components/vite';
|
import Components from 'unplugin-vue-components/vite';
|
||||||
import { VueRouterAutoImports } from 'unplugin-vue-router';
|
import { VueRouterAutoImports } from 'unplugin-vue-router';
|
||||||
import { createUtils4uAutoImports } from 'utils4u/auto-imports';
|
import { createUtils4uAutoImports } from 'utils4u/auto-imports';
|
||||||
|
import type { ConfigEnv, PluginOption } from 'vite';
|
||||||
|
|
||||||
// >>>>>
|
// >>>>>
|
||||||
// eslint-disable-next-line import/no-duplicates
|
// eslint-disable-next-line import/no-duplicates
|
||||||
@@ -25,8 +26,6 @@ import { PrimeVueResolver } from '@primevue/auto-import-resolver';
|
|||||||
import { VantResolver } from '@vant/auto-import-resolver';
|
import { VantResolver } from '@vant/auto-import-resolver';
|
||||||
// <<<<<
|
// <<<<<
|
||||||
|
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
|
||||||
|
|
||||||
function _getNaiveUiComponentNames() {
|
function _getNaiveUiComponentNames() {
|
||||||
// [dtsTsx](https://github.com/unplugin/unplugin-vue-components/pull/673/files/84e80738885cfe11298f41f070cda94a7a779276)
|
// [dtsTsx](https://github.com/unplugin/unplugin-vue-components/pull/673/files/84e80738885cfe11298f41f070cda94a7a779276)
|
||||||
|
|
||||||
@@ -56,7 +55,7 @@ function _getNaiveUiComponentNames() {
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const loadPlugin: LoadPluginFunction = (_pluginLoadOptions) => {
|
export function loadPlugin(_configEnv: ConfigEnv): PluginOption {
|
||||||
return [
|
return [
|
||||||
// https://github.com/antfu/unplugin-auto-import
|
// https://github.com/antfu/unplugin-auto-import
|
||||||
AutoImport({
|
AutoImport({
|
||||||
@@ -77,7 +76,7 @@ export const loadPlugin: LoadPluginFunction = (_pluginLoadOptions) => {
|
|||||||
createUtils4uAutoImports(['primevue']),
|
createUtils4uAutoImports(['primevue']),
|
||||||
{
|
{
|
||||||
'consola/browser': ['consola'],
|
'consola/browser': ['consola'],
|
||||||
'unplugin-vue-router/data-loaders/basic': ['defineBasicLoader'],
|
'vue-router/auto': ['useLink'],
|
||||||
'naive-ui': [
|
'naive-ui': [
|
||||||
'useModal',
|
'useModal',
|
||||||
'useDialog',
|
'useDialog',
|
||||||
@@ -142,4 +141,4 @@ export const loadPlugin: LoadPluginFunction = (_pluginLoadOptions) => {
|
|||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
};
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { minify as minifyHtml } from 'html-minifier-terser';
|
import { minify as minifyHtml } from 'html-minifier-terser';
|
||||||
import type { PluginOption } from 'vite';
|
import { loadEnv } from 'vite';
|
||||||
|
import type { ConfigEnv, PluginOption } from 'vite';
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
|
||||||
|
|
||||||
function IndexHtmlPlugin(): PluginOption {
|
function IndexHtmlPlugin(): PluginOption {
|
||||||
return {
|
return {
|
||||||
@@ -92,14 +91,8 @@ function ___(): PluginOption {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export const loadPlugin: LoadPluginFunction = (pluginLoadOptions) => {
|
export function loadPlugin(_configEnv: ConfigEnv): PluginOption {
|
||||||
const { mode, env } = pluginLoadOptions;
|
|
||||||
// return [___()];
|
// return [___()];
|
||||||
if (mode !== 'production') {
|
const env = loadEnv(_configEnv.mode, process.cwd());
|
||||||
return { plugins: [], message: '仅在生产模式下启用' };
|
if (env.VITE_BUILD_MINIFY === 'true') return IndexHtmlPlugin();
|
||||||
}
|
}
|
||||||
if (env.VITE_BUILD_MINIFY !== 'true') {
|
|
||||||
return { plugins: [], message: `已通过环境变量禁用: VITE_BUILD_MINIFY=${env.VITE_BUILD_MINIFY}` };
|
|
||||||
}
|
|
||||||
return IndexHtmlPlugin();
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
|
import { consola } from 'consola';
|
||||||
|
import type { ConfigEnv, PluginOption } from 'vite';
|
||||||
import { vitePluginFakeServer } from 'vite-plugin-fake-server';
|
import { vitePluginFakeServer } from 'vite-plugin-fake-server';
|
||||||
|
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
|
||||||
|
|
||||||
// https://github.com/condorheroblog/vite-plugin-fake-server?tab=readme-ov-file#usage
|
// https://github.com/condorheroblog/vite-plugin-fake-server?tab=readme-ov-file#usage
|
||||||
export const loadPlugin: LoadPluginFunction = (pluginLoadOptions) => {
|
|
||||||
const { mode } = pluginLoadOptions;
|
export function loadPlugin(_configEnv: ConfigEnv): PluginOption {
|
||||||
if (mode !== 'development') {
|
if (_configEnv.mode !== 'development') {
|
||||||
return { plugins: [], message: '仅在开发模式下启用' };
|
consola.info('fake server plugin is disabled in non-development mode.');
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
return vitePluginFakeServer({
|
return vitePluginFakeServer({
|
||||||
basename: 'fake-api',
|
basename: 'fake-api',
|
||||||
enableProd: true,
|
enableProd: true,
|
||||||
include: 'fake',
|
include: 'fake',
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
|
import type { PluginOption } from 'vite';
|
||||||
import { ViteImageOptimizer } from 'vite-plugin-image-optimizer';
|
import { ViteImageOptimizer } from 'vite-plugin-image-optimizer';
|
||||||
|
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
export default [
|
||||||
|
// https://github.com/FatehAK/vite-plugin-image-optimizer?tab=readme-ov-file#default-configuration
|
||||||
export const loadPlugin: LoadPluginFunction = (_pluginLoadOptions) => {
|
ViteImageOptimizer({
|
||||||
return [
|
/* pass your config */
|
||||||
// https://github.com/FatehAK/vite-plugin-image-optimizer?tab=readme-ov-file#default-configuration
|
}),
|
||||||
ViteImageOptimizer({
|
] satisfies PluginOption;
|
||||||
/* pass your config */
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,27 +1,20 @@
|
|||||||
|
import consola from 'consola';
|
||||||
|
import type { ConfigEnv, PluginOption } from 'vite';
|
||||||
|
import { loadEnv } from 'vite';
|
||||||
import vueDevTools from 'vite-plugin-vue-devtools';
|
import vueDevTools from 'vite-plugin-vue-devtools';
|
||||||
|
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
export function loadPlugin(configEnv: ConfigEnv): PluginOption {
|
||||||
|
const env = loadEnv(configEnv.mode, process.cwd());
|
||||||
|
|
||||||
export const loadPlugin: LoadPluginFunction = (_pluginLoadOptions) => {
|
if (configEnv.command === 'build') {
|
||||||
const { mode } = _pluginLoadOptions;
|
consola.info('vue-devtools plugin is not used in build mode.');
|
||||||
if (mode !== 'development') {
|
return [];
|
||||||
return { plugins: [], message: '仅在开发模式下启用' };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let launchEditor = 'code';
|
if (env.VITE_APP_ENABLE_VUE_DEVTOOLS !== 'true') {
|
||||||
let message: string | undefined;
|
consola.info('vue-devtools plugin disabled by env');
|
||||||
|
return [];
|
||||||
if (process.env.TERM_PROGRAM_VERSION?.toLowerCase()?.includes('insider')) {
|
|
||||||
launchEditor = 'code-insiders';
|
|
||||||
message = '检测到 VSCode Insiders 环境';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return [vueDevTools()];
|
||||||
plugins: [
|
}
|
||||||
vueDevTools({
|
|
||||||
launchEditor: launchEditor,
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
message,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
import { cloudflare } from '@cloudflare/vite-plugin';
|
import { cloudflare } from '@cloudflare/vite-plugin';
|
||||||
|
import { loadEnv } from 'vite';
|
||||||
|
import type {ConfigEnv, PluginOption} from 'vite';
|
||||||
|
|
||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
export function loadPlugin(_configEnv: ConfigEnv): PluginOption {
|
||||||
|
const env = loadEnv(_configEnv.mode, process.cwd());
|
||||||
export const loadPlugin: LoadPluginFunction = (pluginLoadOptions) => {
|
if (_configEnv.mode === 'test') {
|
||||||
const { mode, env } = pluginLoadOptions;
|
console.log('cloudflare plugin disabled in test mode');
|
||||||
if (mode === 'test') {
|
return [];
|
||||||
return { plugins: [], message: '在测试模式下禁用' };
|
|
||||||
}
|
}
|
||||||
if (env.VITE_CLOUDFLARE_SERVER_ENABLED !== 'true') {
|
if (env.VITE_CLOUDFLARE_SERVER_ENABLED !== 'true') {
|
||||||
return {
|
console.log('cloudflare plugin disabled by env');
|
||||||
plugins: [],
|
return [];
|
||||||
message: `已通过环境变量禁用: VITE_CLOUDFLARE_SERVER_ENABLED=${env.VITE_CLOUDFLARE_SERVER_ENABLED}`,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
return [cloudflare()];
|
return [cloudflare()];
|
||||||
};
|
}
|
||||||
|
|||||||
@@ -1,47 +1,28 @@
|
|||||||
import boxen from 'boxen';
|
|
||||||
import consola from 'consola';
|
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import { pathToFileURL } from 'node:url';
|
import { pathToFileURL } from 'node:url';
|
||||||
|
|
||||||
|
import consola from 'consola';
|
||||||
import { glob } from 'tinyglobby';
|
import { glob } from 'tinyglobby';
|
||||||
import type { ConfigEnv, PluginOption } from 'vite';
|
import type { ConfigEnv, PluginOption } from 'vite';
|
||||||
import { loadEnv } from 'vite';
|
|
||||||
|
|
||||||
export type LoadPluginFunction = (
|
|
||||||
configEnv: ConfigEnv & {
|
|
||||||
env: Record<string, string>;
|
|
||||||
},
|
|
||||||
) => PluginOption | LoadPluginResult;
|
|
||||||
export interface LoadPluginResult {
|
|
||||||
plugins: PluginOption;
|
|
||||||
message?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
type LoadPluginFunction = (configEnv: ConfigEnv) => PluginOption;
|
||||||
export async function loadPlugins(configEnv: ConfigEnv): Promise<PluginOption[]> {
|
export async function loadPlugins(configEnv: ConfigEnv): Promise<PluginOption[]> {
|
||||||
const plugins: PluginOption[] = [];
|
const plugins: PluginOption[] = [];
|
||||||
|
|
||||||
const cwd = path.resolve(import.meta.dirname);
|
consola.start('开始加载 Vite 插件...');
|
||||||
|
|
||||||
const pluginEntries = await glob('**/*.ts', {
|
const pluginEntries = await glob('**/*.ts', {
|
||||||
absolute: true,
|
absolute: true,
|
||||||
cwd,
|
cwd: path.resolve(import.meta.dirname),
|
||||||
ignore: [
|
ignore: [
|
||||||
'**/*.d.ts',
|
'**/*.d.ts',
|
||||||
'**/*.disabled.ts',
|
'**/*.disabled.ts',
|
||||||
'**/x-*.ts', // 禁用以 x- 开头的插件文件
|
'**/x-*.ts', // 禁用以 x- 开头的插件文件
|
||||||
'**/*-x.ts', // 禁用以 -x 结尾的插件文件
|
|
||||||
'**/*-X.ts', // 禁用以 -X 结尾的插件文件
|
|
||||||
'**/_*',
|
'**/_*',
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
const relativeCwd = path.relative(process.cwd(), cwd);
|
consola.info(`找到 ${pluginEntries.length} 个插件文件`);
|
||||||
console.time('加载插件');
|
|
||||||
consola.log(
|
|
||||||
boxen(`正在加载 Vite 插件... (./${relativeCwd})`, {
|
|
||||||
borderStyle: 'classic',
|
|
||||||
borderColor: 'cyan',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
// 计算最长的文件名长度,用于对齐输出
|
// 计算最长的文件名长度,用于对齐输出
|
||||||
const maxNameLength = Math.max(...pluginEntries.map((entry) => path.basename(entry).length));
|
const maxNameLength = Math.max(...pluginEntries.map((entry) => path.basename(entry).length));
|
||||||
@@ -52,39 +33,36 @@ export async function loadPlugins(configEnv: ConfigEnv): Promise<PluginOption[]>
|
|||||||
const imported = await import(pathToFileURL(entry).href);
|
const imported = await import(pathToFileURL(entry).href);
|
||||||
|
|
||||||
const loadPlugin = imported.loadPlugin as LoadPluginFunction | undefined;
|
const loadPlugin = imported.loadPlugin as LoadPluginFunction | undefined;
|
||||||
|
let plugin: PluginOption | undefined;
|
||||||
|
let loadMethod = '';
|
||||||
|
|
||||||
if (!loadPlugin || typeof loadPlugin !== 'function') {
|
// 优先使用 loadPlugin 函数(接收 configEnv 参数)
|
||||||
consola.warn(`插件未导出 loadPlugin 函数: ${paddedName}`);
|
if (loadPlugin && typeof loadPlugin === 'function') {
|
||||||
continue;
|
plugin = loadPlugin(configEnv);
|
||||||
|
loadMethod = 'loadPlugin';
|
||||||
|
} else if (imported.default) {
|
||||||
|
plugin = imported.default;
|
||||||
|
loadMethod = 'default';
|
||||||
|
} else {
|
||||||
|
consola.warn(`插件未导出有效内容: ${paddedName}`);
|
||||||
|
continue; // 跳过无效插件
|
||||||
}
|
}
|
||||||
|
|
||||||
const env = loadEnv(configEnv.mode, process.cwd());
|
if (plugin) {
|
||||||
const result = loadPlugin({ ...configEnv, env });
|
const pluginArray = Array.isArray(plugin) ? plugin : [plugin];
|
||||||
|
const validPlugins = pluginArray.filter(Boolean); // 过滤掉 null/undefined
|
||||||
|
const pluginCount = validPlugins.length;
|
||||||
|
|
||||||
// 判断是否是 LoadPluginResult 对象
|
if (pluginCount > 0) {
|
||||||
const isResultObject = (val: unknown): val is LoadPluginResult =>
|
plugins.push(...validPlugins);
|
||||||
typeof val === 'object' && val !== null && 'plugins' in val;
|
consola.success(`${paddedName} → ${pluginCount} 个实例 (${loadMethod})`);
|
||||||
|
} else {
|
||||||
const plugin = isResultObject(result) ? result.plugins : result;
|
consola.info(`${paddedName} 返回了空数组或无效值`);
|
||||||
const message = isResultObject(result) ? result.message : undefined;
|
}
|
||||||
|
|
||||||
const pluginArray = Array.isArray(plugin) ? plugin : [plugin];
|
|
||||||
const validPlugins = pluginArray.filter(Boolean);
|
|
||||||
const pluginCount = validPlugins.length;
|
|
||||||
|
|
||||||
if (pluginCount > 0) {
|
|
||||||
plugins.push(...validPlugins);
|
|
||||||
const suffix = message ? ` (${message})` : '';
|
|
||||||
consola.info(`${paddedName} → ${pluginCount} 个实例${suffix}`);
|
|
||||||
} else if (message) {
|
|
||||||
consola.info(`${paddedName} → ${message}`);
|
|
||||||
} else {
|
|
||||||
consola.info(`${paddedName} 返回了空数组或无效值`);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
consola.success(`共 ${pluginEntries.length} 个插件文件,已加载 ${plugins.length} 个实例`);
|
consola.success(`✅ 总共加载了 ${plugins.length} 个插件实例`);
|
||||||
console.timeEnd('加载插件');
|
|
||||||
|
|
||||||
return plugins;
|
return plugins;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,13 @@
|
|||||||
import type { LoadPluginFunction } from './_loadPlugins';
|
import type { ConfigEnv, PluginOption } from 'vite';
|
||||||
|
import { loadEnv } from 'vite';
|
||||||
|
|
||||||
export const loadPlugin: LoadPluginFunction = (_pluginLoadOptions) => {
|
export default [
|
||||||
const env = _pluginLoadOptions.env;
|
// ...
|
||||||
|
] satisfies PluginOption;
|
||||||
|
|
||||||
// 示例:根据环境变量禁用插件并返回消息
|
export function loadPlugin(_configEnv: ConfigEnv): PluginOption {
|
||||||
if (env.VITE_DEMO_ENABLED !== 'true') {
|
const env = loadEnv(_configEnv.mode, process.cwd());
|
||||||
return {
|
console.debug(`env :>> `, env);
|
||||||
plugins: [],
|
// ...
|
||||||
message: `已通过环境变量禁用: VITE_DEMO_ENABLED=${env.VITE_DEMO_ENABLED}`,
|
return undefined;
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// 正常返回插件
|
|
||||||
return [];
|
|
||||||
};
|
|
||||||
|
|||||||
17
vite-plugins/x-vite-plugin-zip-file.ts
Normal file
17
vite-plugins/x-vite-plugin-zip-file.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import type { PluginOption } from 'vite';
|
||||||
|
|
||||||
|
export default [
|
||||||
|
// // 检查是否在VS Code终端中运行
|
||||||
|
// if (process.env.TERM_PROGRAM === 'vscode' || process.env.VSCODE_PID) {
|
||||||
|
// // plugins.push(
|
||||||
|
// // // 构建后自动将dist目录打包成zip文件
|
||||||
|
// // viteArchiverPlugin({
|
||||||
|
// // addTimestamp: false, // 是否添加时间戳到输出文件名
|
||||||
|
// // format: 'zip', // 输出的压缩文件格式
|
||||||
|
// // outputDir: '', // 输出目录,默认为项目根目录
|
||||||
|
// // outputFileName: 'dist', // 输出的zip文件名(不含扩展名)
|
||||||
|
// // sourceDir: 'dist', // 要打包的源目录
|
||||||
|
// // }),
|
||||||
|
// // )
|
||||||
|
// }
|
||||||
|
] satisfies PluginOption;
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import type { /* ManualChunkMeta, PreRenderedAsset, */ RollupOptions } from 'rollup';
|
import type { ManualChunkMeta, PreRenderedAsset, RollupOptions } from 'rollup';
|
||||||
|
|
||||||
// import path from 'node:path';
|
import path from 'node:path';
|
||||||
|
|
||||||
// https://www.npmjs.com/package/utils4u/v/2.19.2?activeTab=code
|
// https://www.npmjs.com/package/utils4u/v/2.19.2?activeTab=code
|
||||||
|
|
||||||
@@ -12,95 +12,106 @@ export const viteConfigRollupOptions: RollupOptions = {
|
|||||||
if (warning.code === 'EVAL' && warning.id?.includes('node_modules/protobufjs')) return;
|
if (warning.code === 'EVAL' && warning.id?.includes('node_modules/protobufjs')) return;
|
||||||
warn(warning);
|
warn(warning);
|
||||||
}, */
|
}, */
|
||||||
|
|
||||||
output: {
|
output: {
|
||||||
// 如果一个 chunk 小于 10KB,Rollup 会尝试将它合并到其他 chunk 中。这样可以避免产生大量碎片文件
|
// Keep hashed file names predictable across entry, chunk, and asset outputs.
|
||||||
experimentalMinChunkSize: 10 * 1024,
|
entryFileNames: 'entry/[name].[hash].js', // 默认: "[name].js"
|
||||||
// // Keep hashed file names predictable across entry, chunk, and asset outputs.
|
chunkFileNames: 'chunk/[name].[hash].js', // 默认: "[name]-[hash].js"
|
||||||
// entryFileNames: 'entry/[name].[hash].js', // 默认: "[name].js"
|
// assetFileNames:'', // 默认: "assets/[name]-[hash][extname]"
|
||||||
// chunkFileNames: 'chunk/[name].[hash].js', // 默认: "[name]-[hash].js"
|
// https://cn.rollupjs.org/configuration-options/#output-assetfilenames
|
||||||
// // assetFileNames:'', // 默认: "assets/[name]-[hash][extname]"
|
assetFileNames(chunkInfo: PreRenderedAsset) {
|
||||||
// // https://cn.rollupjs.org/configuration-options/#output-assetfilenames
|
const names = [...new Set(chunkInfo.names)];
|
||||||
// assetFileNames(chunkInfo: PreRenderedAsset) {
|
|
||||||
// const names = [...new Set(chunkInfo.names)];
|
if (names.length !== 1) {
|
||||||
// if (names.length !== 1) {
|
console.error('Multiple names for asset:', chunkInfo);
|
||||||
// console.error('Multiple names for asset:', chunkInfo);
|
process.exit(1);
|
||||||
// process.exit(1);
|
}
|
||||||
// }
|
|
||||||
// const assetName = names[0];
|
const assetName = names[0];
|
||||||
// const ext = assetName.split('.').pop()?.toLowerCase();
|
const ext = assetName.split('.').pop()?.toLowerCase();
|
||||||
// if (ext && /png|jpe?g|gif|svg|webp|avif/.test(ext)) {
|
if (ext && /png|jpe?g|gif|svg|webp|avif/.test(ext)) {
|
||||||
// return 'chunks/images/[name].[hash][extname]';
|
return 'chunks/images/[name].[hash][extname]';
|
||||||
// }
|
}
|
||||||
// if (ext && /woff2?|ttf|otf/.test(ext)) {
|
if (ext && /woff2?|ttf|otf/.test(ext)) {
|
||||||
// return 'chunks/fonts/[name].[hash][extname]';
|
return 'chunks/fonts/[name].[hash][extname]';
|
||||||
// }
|
}
|
||||||
// if (ext === 'css') {
|
if (ext === 'css') {
|
||||||
// return 'chunks/css/[name].[hash][extname]';
|
return 'chunks/css/[name].[hash][extname]';
|
||||||
// }
|
}
|
||||||
// return '_chunks/[name].[hash][extname]';
|
return '_chunks/[name].[hash][extname]';
|
||||||
// },
|
},
|
||||||
// manualChunks: (id: string, _meta: ManualChunkMeta) => {
|
|
||||||
// // https://github.com/unocss/unocss/issues/4917
|
manualChunks: (id: string, _meta: ManualChunkMeta) => {
|
||||||
// // if (['/src/layouts'].some((prefix) => id.includes(prefix))) {
|
// https://github.com/unocss/unocss/issues/4917
|
||||||
// // const url = new URL(id, 'file://');
|
// if (['/src/layouts'].some((prefix) => id.includes(prefix))) {
|
||||||
// // if (!url.search /* ?vue&type=script&setup=true&lang.ts */) {
|
// const url = new URL(id, 'file://');
|
||||||
// // return 'layouts';
|
// if (!url.search /* ?vue&type=script&setup=true&lang.ts */) {
|
||||||
// // }
|
// return 'layouts';
|
||||||
// // }
|
// }
|
||||||
// if (id.includes('meta-layouts')) {
|
// }
|
||||||
// // console.debug(`id :>> `, id); // id :>> virtual:meta-layouts
|
|
||||||
// // 这里很奇怪,打印 id 是`virtual:meta-layouts`,但是 `'virtual:meta-layouts' === id` 却是 false
|
if (id.includes('meta-layouts')) {
|
||||||
// return 'lib-meta-layouts';
|
// console.debug(`id :>> `, id); // id :>> virtual:meta-layouts
|
||||||
// }
|
// 这里很奇怪,打印 id 是`virtual:meta-layouts`,但是 `'virtual:meta-layouts' === id` 却是 false
|
||||||
// if (id.includes('index.page.vue')) {
|
return 'lib-meta-layouts';
|
||||||
// const url = new URL(id, 'file://');
|
}
|
||||||
// if (!url.search /* ?vue&type=script&setup=true&lang.ts */) {
|
|
||||||
// const parentDir = path.basename(path.dirname(id));
|
if (id.includes('index.page.vue')) {
|
||||||
// return `${parentDir}-index.page`;
|
const url = new URL(id, 'file://');
|
||||||
// }
|
if (!url.search /* ?vue&type=script&setup=true&lang.ts */) {
|
||||||
// }
|
const parentDir = path.basename(path.dirname(id));
|
||||||
// if (!id.includes('node_modules')) return;
|
return `${parentDir}-index.page`;
|
||||||
// // 处理 pnpm 的特殊路径结构
|
}
|
||||||
// let packageName;
|
}
|
||||||
// if (id.includes('.pnpm')) {
|
|
||||||
// // pnpm 路径: .pnpm/naive-ui@2.43.1_vue@3.5.22/node_modules/naive-ui/...
|
if (!id.includes('node_modules')) return;
|
||||||
// const pnpmMatch = id.match(/\.pnpm\/(.+?)@/);
|
// 处理 pnpm 的特殊路径结构
|
||||||
// if (pnpmMatch) {
|
let packageName;
|
||||||
// packageName = pnpmMatch[1];
|
if (id.includes('.pnpm')) {
|
||||||
// }
|
// pnpm 路径: .pnpm/naive-ui@2.43.1_vue@3.5.22/node_modules/naive-ui/...
|
||||||
// } else {
|
const pnpmMatch = id.match(/\.pnpm\/(.+?)@/);
|
||||||
// // 普通路径: node_modules/lodash/...
|
if (pnpmMatch) {
|
||||||
// const normalMatch = id.match(/node_modules\/(@[^/]+\/[^/]+|[^/]+)\//);
|
packageName = pnpmMatch[1];
|
||||||
// if (normalMatch) {
|
}
|
||||||
// packageName = normalMatch[1];
|
} else {
|
||||||
// }
|
// 普通路径: node_modules/lodash/...
|
||||||
// }
|
const normalMatch = id.match(/node_modules\/(@[^/]+\/[^/]+|[^/]+)\//);
|
||||||
// if (packageName) {
|
if (normalMatch) {
|
||||||
// if (['highlight.js'].includes(packageName)) {
|
packageName = normalMatch[1];
|
||||||
// return 'lib-hljs';
|
}
|
||||||
// }
|
}
|
||||||
// // 根据包名分组
|
|
||||||
// if (['consola', 'lodash', '@juggle+resize-observer', 'vueuc'].includes(packageName)) {
|
if (packageName) {
|
||||||
// return 'lib-vendor';
|
if (['highlight.js'].includes(packageName)) {
|
||||||
// }
|
return 'lib-hljs';
|
||||||
// // // 拆了有问题
|
}
|
||||||
// // if (['naive-ui'].includes(packageName) && id.includes('_internal')) {
|
|
||||||
// // return 'lib-naive-ui-internal';
|
// 根据包名分组
|
||||||
// // }
|
if (['consola', 'lodash', '@juggle+resize-observer', 'vueuc'].includes(packageName)) {
|
||||||
// if (['naive-ui'].includes(packageName)) {
|
return 'lib-vendor';
|
||||||
// return 'lib-naive-ui';
|
}
|
||||||
// }
|
|
||||||
// if (
|
// // 拆了有问题
|
||||||
// ['primelocale', 'primevue', 'primeuix', 'primeicons'].some((name) =>
|
// if (['naive-ui'].includes(packageName) && id.includes('_internal')) {
|
||||||
// packageName!.includes(name),
|
// return 'lib-naive-ui-internal';
|
||||||
// )
|
// }
|
||||||
// ) {
|
|
||||||
// return 'lib-primevue';
|
if (['naive-ui'].includes(packageName)) {
|
||||||
// }
|
return 'lib-naive-ui';
|
||||||
// if (['vue', 'vue-router', 'pinia', 'vue-demi', 'vue-i18n'].includes(packageName)) {
|
}
|
||||||
// return 'lib-vue-vendor';
|
|
||||||
// }
|
if (
|
||||||
// }
|
['primelocale', 'primevue', 'primeuix', 'primeicons'].some((name) =>
|
||||||
// },
|
packageName!.includes(name),
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return 'lib-primevue';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (['vue', 'vue-router', 'pinia', 'vue-demi', 'vue-i18n'].includes(packageName)) {
|
||||||
|
return 'lib-vue-vendor';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ export default defineConfig(async (configEnv) => {
|
|||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
||||||
'~': fileURLToPath(new URL('./src', import.meta.url)),
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
define: {
|
define: {
|
||||||
|
|||||||
1389
worker-configuration.d.ts
vendored
1389
worker-configuration.d.ts
vendored
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user