diff --git a/README.md b/README.md index c01c60f26..76d997c1b 100644 --- a/README.md +++ b/README.md @@ -65,27 +65,6 @@ ![](https://s2.loli.net/2022/06/07/rRSG6mEZpujOACT.png) -## 开发计划 - -- [x] 引入 ECharts 替换 AntV G2Plot -- [x] 图表示例:ECharts、AntV G2 -- [x] 多页签:支持 query、hash 等参数,同一页面支持多个 Tab -- [x] 缓存主题配置 -- [x] 精简版(新分支 thin) -- [ ] v0.9.7 表单、表格示例(ing...) -- [ ] v0.9.8 可修改的 KeepAlive 的页面缓存和全局 Tab 组件 store 重构 -- [ ] v0.9.9 全局 Iframe 组件 -- [ ] v1.0 示例页面完善 -- [ ] v1.0 版本文档 -- [ ] element-plus 版本 -- [ ] i18n 国际化 -- [ ] 其他 UI 版本 -- [ ] soybean-admin cli 工具(选择不同 UI) -- [ ] soybean-admin 后台服务 java 版: [soybean-admin-java](https://github.com/honghuangdc/soybean-admin-java) -- [ ] soybean-admin 后台服务 go 版: [soybean-admin-go](https://github.com/honghuangdc/soybean-admin-go) -- [ ] soybean-admin 后台服务 nodejs 版: [soybean-admin-nestjs](https://github.com/honghuangdc/soybean-admin-nestjs) -- [ ] 前端可视化创建路由页面 - ## 安装使用 - 环境配置 diff --git a/mock/api/route.ts b/mock/api/route.ts index 6d9982bee..ded8a5770 100644 --- a/mock/api/route.ts +++ b/mock/api/route.ts @@ -8,7 +8,7 @@ const apis: MockMethod[] = [ response: (options: Service.MockOption): Service.MockServiceResult => { const { userId = undefined } = options.body; - const routeHomeName: AuthRoute.RouteKey = 'dashboard_analysis'; + const routeHomeName: AuthRoute.LastDegreeRouteKey = 'dashboard_analysis'; const role = userModel.find(item => item.userId === userId)?.userRole || 'user'; diff --git a/package.json b/package.json index 99cb56b77..a7e9bd9c8 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,8 @@ "esno": "esno", "cleanup": "esno ./scripts/cleanup.ts", "update-pkg": "ncu --deep -u", - "update-version": "bumpp package.json", + "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", + "release": "standard-version", "prepare": "husky install" }, "dependencies": { @@ -86,7 +87,7 @@ "@iconify/json": "^2.1.133", "@iconify/vue": "^4.0.0", "@soybeanjs/cli": "^0.1.2", - "@soybeanjs/router-page": "0.2.0", + "@soybeanjs/router-page": "1.0.3", "@tauri-apps/cli": "^1.1.1", "@types/bmapgl": "^0.0.5", "@types/crypto-js": "^4.1.1", @@ -97,7 +98,7 @@ "@unocss/vite": "^0.46.3", "@vitejs/plugin-vue": "^3.2.0", "@vitejs/plugin-vue-jsx": "^2.1.0", - "bumpp": "^8.2.1", + "conventional-changelog": "^3.1.25", "cross-env": "^7.0.3", "eslint": "^8.27.0", "eslint-config-soybeanjs-vue": "^0.1.2", @@ -108,6 +109,7 @@ "rimraf": "^3.0.2", "rollup-plugin-visualizer": "^5.8.3", "sass": "^1.56.0", + "standard-version": "^9.5.0", "typescript": "4.8.4", "unplugin-icons": "^0.14.13", "unplugin-vue-components": "0.22.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68a583937..654763e2b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ specifiers: '@iconify/json': ^2.1.133 '@iconify/vue': ^4.0.0 '@soybeanjs/cli': ^0.1.2 - '@soybeanjs/router-page': 0.2.0 + '@soybeanjs/router-page': 1.0.3 '@soybeanjs/vue-admin-layout': ^1.1.1 '@soybeanjs/vue-admin-tab': ^1.0.5 '@tauri-apps/cli': ^1.1.1 @@ -28,9 +28,9 @@ specifiers: '@vitejs/plugin-vue-jsx': ^2.1.0 '@vueuse/core': ^9.4.0 axios: 0.27.2 - bumpp: ^8.2.1 clipboard: ^2.0.11 colord: ^2.9.3 + conventional-changelog: ^3.1.25 cross-env: ^7.0.3 crypto-js: ^4.1.1 dayjs: ^1.11.6 @@ -50,6 +50,7 @@ specifiers: rimraf: ^3.0.2 rollup-plugin-visualizer: ^5.8.3 sass: ^1.56.0 + standard-version: ^9.5.0 swiper: ^8.4.4 typescript: 4.8.4 ua-parser-js: ^1.0.32 @@ -108,7 +109,7 @@ devDependencies: '@iconify/json': 2.1.133 '@iconify/vue': 4.0.0_vue@3.2.41 '@soybeanjs/cli': 0.1.2 - '@soybeanjs/router-page': 0.2.0 + '@soybeanjs/router-page': 1.0.3 '@tauri-apps/cli': 1.1.1 '@types/bmapgl': 0.0.5 '@types/crypto-js': 4.1.1 @@ -119,7 +120,7 @@ devDependencies: '@unocss/vite': 0.46.3_rollup@2.79.1+vite@3.2.2 '@vitejs/plugin-vue': 3.2.0_vite@3.2.2+vue@3.2.41 '@vitejs/plugin-vue-jsx': 2.1.0_vite@3.2.2+vue@3.2.41 - bumpp: 8.2.1 + conventional-changelog: 3.1.25 cross-env: 7.0.3 eslint: 8.27.0 eslint-config-soybeanjs-vue: 0.1.2_rmayb2veg2btbq6mbmnyivgasy @@ -130,6 +131,7 @@ devDependencies: rimraf: 3.0.2 rollup-plugin-visualizer: 5.8.3_rollup@2.79.1 sass: 1.56.0 + standard-version: 9.5.0 typescript: 4.8.4 unplugin-icons: 0.14.13 unplugin-vue-components: 0.22.8_vue@3.2.41 @@ -1662,6 +1664,11 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@hutson/parse-repository-url/3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true + /@iconify/json/2.1.133: resolution: {integrity: sha512-m/BRPD74mGJNrQXByCK40VymdGocBko3SmPCIp3IV2mRY9EWa3tmCnn+HpqsMg0IZJAWMi9dQfI8bIShs+ZSrg==} dependencies: @@ -1778,16 +1785,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jsdevtools/ez-spawn/3.0.4: - resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} - engines: {node: '>=10'} - dependencies: - call-me-maybe: 1.0.2 - cross-spawn: 7.0.3 - string-argv: 0.3.1 - type-detect: 4.0.8 - dev: true - /@juggle/resize-observer/3.4.0: resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} dev: false @@ -2016,8 +2013,8 @@ packages: prompts: 2.4.2 dev: true - /@soybeanjs/router-page/0.2.0: - resolution: {integrity: sha512-3vZlw3o+AzPS2TrL2zRSxEeNMOXVW48y8VO1RK74d3uG8/6XXxJDhlOFmNqgk/EQ5qDDwW5ofnbj7S3oYGBcFQ==} + /@soybeanjs/router-page/1.0.3: + resolution: {integrity: sha512-jFGAdgcTnV6guMQh6rXBbPdKL3VkH0G0+SOdlUjEP5HZLRBUvqPhqb5iZWPP88v7HMvw0EUUPDTH4L1vuRr/qg==} dependencies: fast-glob: 3.2.12 dev: true @@ -2248,6 +2245,10 @@ packages: resolution: {integrity: sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==} dev: true + /@types/normalize-package-data/2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + /@types/ps-tree/1.1.2: resolution: {integrity: sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw==} dev: true @@ -2819,6 +2820,14 @@ packages: - '@vue/composition-api' - vue + /JSONStream/1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true @@ -2855,6 +2864,10 @@ packages: hasBin: true dev: true + /add-stream/1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true + /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -3007,6 +3020,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /array-ify/1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + /array-includes/3.1.5: resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} engines: {node: '>= 0.4'} @@ -3038,6 +3055,11 @@ packages: es-shim-unscopables: 1.0.0 dev: true + /arrify/1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + /assign-symbols/1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} @@ -3240,24 +3262,6 @@ packages: semver: 7.3.8 dev: true - /bumpp/8.2.1: - resolution: {integrity: sha512-4tHKsWC2mqHQvdjZ4AXgVhS2xMsz8qQ4zYt87vGRXW5tqAjrYa/UJqy7s/dGYI2OIe9ghBdiFhKpyKEX9SXffg==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jsdevtools/ez-spawn': 3.0.4 - cac: 6.7.14 - fast-glob: 3.2.12 - kleur: 4.1.5 - prompts: 2.4.2 - semver: 7.3.8 - dev: true - - /cac/6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - /cacache/16.1.3: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -3344,10 +3348,6 @@ packages: function-bind: 1.1.1 get-intrinsic: 1.1.3 - /call-me-maybe/1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - dev: true - /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -3360,6 +3360,20 @@ packages: tslib: 2.4.0 dev: true + /camelcase-keys/6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + /camelcase/6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} @@ -3508,6 +3522,14 @@ packages: tiny-emitter: 2.1.0 dev: false + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + /cliui/8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -3605,6 +3627,13 @@ packages: engines: {node: '>=4.0.0'} dev: true + /compare-func/2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + /component-emitter/1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true @@ -3613,6 +3642,16 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true + /concat-stream/2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.0 + typedarray: 0.0.6 + dev: true + /config-chain/1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} dependencies: @@ -3656,6 +3695,171 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true + /conventional-changelog-angular/5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-atom/2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-codemirror/2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-config-spec/2.1.0: + resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + dev: true + + /conventional-changelog-conventionalcommits/4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-changelog-core/4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + dev: true + + /conventional-changelog-ember/2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-eslint/3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-express/2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jquery/3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jshint/2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-preset-loader/2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + dev: true + + /conventional-changelog-writer/5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.7 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.0 + split: 1.0.1 + through2: 4.0.2 + dev: true + + /conventional-changelog/3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + dev: true + + /conventional-commits-filter/2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser/3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /conventional-recommended-bump/6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 2.3.4 + conventional-commits-filter: 2.0.7 + conventional-commits-parser: 3.2.4 + git-raw-commits: 2.0.11 + git-semver-tags: 4.1.1 + meow: 8.1.2 + q: 1.5.1 + dev: true + /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true @@ -3676,6 +3880,10 @@ packages: requiresBuild: true dev: false + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + /cors/2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} @@ -3932,6 +4140,11 @@ packages: event-emitter: 0.3.5 dev: false + /dargs/7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + /data-uri-to-buffer/4.0.0: resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==} engines: {node: '>= 12'} @@ -3950,6 +4163,10 @@ packages: engines: {node: '>=0.11'} dev: false + /dateformat/3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + /dayjs/1.11.6: resolution: {integrity: sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==} dev: false @@ -3992,6 +4209,19 @@ packages: ms: 2.1.2 dev: true + /decamelize-keys/1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize/1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + /decode-uri-component/0.2.0: resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} engines: {node: '>=0.10'} @@ -4084,6 +4314,16 @@ packages: resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} dev: false + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + /diff-match-patch/1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} dev: false @@ -4196,6 +4436,13 @@ packages: tslib: 2.4.0 dev: true + /dot-prop/5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + /dot-prop/6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} @@ -4213,6 +4460,14 @@ packages: engines: {node: '>=12'} dev: true + /dotgitignore/2.1.0: + resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + minimatch: 3.1.2 + dev: true + /downloadjs/1.4.7: resolution: {integrity: sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==} dev: false @@ -4307,6 +4562,12 @@ packages: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} dev: true + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + /es-abstract/1.20.4: resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} engines: {node: '>= 0.4'} @@ -5337,6 +5598,28 @@ packages: - supports-color dev: true + /find-up/2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up/3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + /find-up/5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -5536,6 +5819,17 @@ packages: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} dev: true + /get-pkg-repo/4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + /get-size/2.0.3: resolution: {integrity: sha512-lXNzT/h/dTjTxRbm9BXb+SGxxzkm97h/PCIKtlN/CBCxxmkkIVV21udumMS93MuVTDX583gqc94v3RjuHmI+2Q==} dev: false @@ -5567,6 +5861,41 @@ packages: engines: {node: '>=0.10.0'} dev: true + /git-raw-commits/2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /git-remote-origin-url/2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags/4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 6.3.0 + dev: true + + /gitconfiglocal/1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 + dev: true + /gl-matrix/3.4.3: resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} dev: false @@ -5699,6 +6028,24 @@ packages: duplexer: 0.1.2 dev: true + /handlebars/4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.7 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /hard-rejection/2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + /has-ansi/2.0.0: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} @@ -5797,6 +6144,17 @@ packages: engines: {node: '>=12.0.0'} dev: false + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info/4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + /hosted-git-info/5.2.1: resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -6061,6 +6419,10 @@ packages: is-decimal: 1.0.4 dev: true + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -6318,6 +6680,13 @@ packages: has-symbols: 1.0.3 dev: true + /is-text-path/1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + /is-typedarray/1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: true @@ -6448,6 +6817,10 @@ packages: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true + /json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true @@ -6479,6 +6852,10 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true + /json-stringify-safe/5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + /json5/1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true @@ -6602,6 +6979,20 @@ packages: type-check: 0.4.0 dev: true + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /load-json-file/4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.10 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + /loader-utils/1.4.0: resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} engines: {node: '>=4.0.0'} @@ -6616,6 +7007,29 @@ packages: engines: {node: '>=14'} dev: true + /locate-path/2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path/3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + /locate-path/6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -6631,6 +7045,10 @@ packages: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true + /lodash.ismatch/4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true + /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -6711,6 +7129,16 @@ packages: engines: {node: '>=0.10.0'} dev: true + /map-obj/1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj/4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + /map-stream/0.1.0: resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} dev: true @@ -6765,6 +7193,23 @@ packages: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} dev: true + /meow/8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + /merge-options/1.0.1: resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} engines: {node: '>=4'} @@ -6837,6 +7282,11 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -6850,6 +7300,15 @@ packages: brace-expansion: 2.0.1 dev: true + /minimist-options/4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + /minimist/1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} dev: true @@ -6944,6 +7403,11 @@ packages: dev: true patched: true + /modify-values/1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + /mrmime/1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} @@ -7031,6 +7495,10 @@ packages: engines: {node: '>= 0.6'} dev: true + /neo-async/2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + /next-tick/1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} dev: false @@ -7099,6 +7567,25 @@ packages: abbrev: 1.1.1 dev: true + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data/3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.11.0 + semver: 7.3.8 + validate-npm-package-license: 3.0.4 + dev: true + /normalize-package-data/4.0.1: resolution: {integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -7369,6 +7856,20 @@ packages: engines: {node: '>=12.20'} dev: true + /p-limit/1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + /p-limit/3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -7376,6 +7877,27 @@ packages: yocto-queue: 0.1.0 dev: true + /p-locate/2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate/3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + /p-locate/5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -7390,6 +7912,16 @@ packages: aggregate-error: 3.1.0 dev: true + /p-try/1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + /package-json/8.1.0: resolution: {integrity: sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==} engines: {node: '>=14.16'} @@ -7458,6 +7990,24 @@ packages: hasBin: true dev: true + /parse-json/4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + /parse-svg-path/0.1.2: resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} dev: false @@ -7479,6 +8029,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /path-exists/3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -7507,6 +8062,13 @@ packages: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: true + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -7534,6 +8096,16 @@ packages: engines: {node: '>=8.6'} dev: true + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify/3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + /pinia/2.0.23_l7r24p6nevbtlimqmqcwa3ouhu: resolution: {integrity: sha512-N15hFf4o5STrxpNrib1IEb1GOArvPYf1zPvQVRGOO1G1d74Ak0J0lVyalX/SmrzdT4Q0nlEFjbURsmBmIGUR5Q==} peerDependencies: @@ -7683,6 +8255,10 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dev: true + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -7745,6 +8321,11 @@ packages: escape-goat: 4.0.0 dev: true + /q/1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + /qs/6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -7764,6 +8345,11 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /quick-lru/4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + /quick-lru/5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -7828,6 +8414,54 @@ packages: npm-normalize-package-bin: 2.0.0 dev: true + /read-pkg-up/3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up/7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg/3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg/5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream/2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + /readable-stream/3.6.0: resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} engines: {node: '>= 6'} @@ -7844,6 +8478,14 @@ packages: picomatch: 2.3.1 dev: true + /redent/3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + /regenerate-unicode-properties/10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} @@ -8595,6 +9237,10 @@ packages: tslib: 1.14.1 dev: true + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true @@ -8918,6 +9564,18 @@ packages: through: 2.3.8 dev: true + /split/1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /split2/3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.0 + dev: true + /sprintf-js/1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true @@ -8945,6 +9603,27 @@ packages: deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' dev: true + /standard-version/9.5.0: + resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chalk: 2.4.2 + conventional-changelog: 3.1.25 + conventional-changelog-config-spec: 2.1.0 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-recommended-bump: 6.1.0 + detect-indent: 6.1.0 + detect-newline: 3.1.0 + dotgitignore: 2.1.0 + figures: 3.2.0 + find-up: 5.0.0 + git-semver-tags: 4.1.1 + semver: 7.3.8 + stringify-package: 1.0.1 + yargs: 16.2.0 + dev: true + /state-toggle/1.0.3: resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} dev: true @@ -8973,11 +9652,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /string-argv/0.3.1: - resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} - engines: {node: '>=0.6.19'} - dev: true - /string-width/3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} @@ -9034,6 +9708,12 @@ packages: es-abstract: 1.20.4 dev: true + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + /string_decoder/1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: @@ -9059,6 +9739,11 @@ packages: is-regexp: 1.0.0 dev: true + /stringify-package/1.0.1: + resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json + dev: true + /strip-ansi/3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} @@ -9102,6 +9787,13 @@ packages: engines: {node: '>=6'} dev: true + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + /strip-json-comments/2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -9237,6 +9929,11 @@ packages: source-map-support: 0.5.21 dev: true + /text-extensions/1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + /text-table/0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -9245,6 +9942,19 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true + /through2/2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.7 + xtend: 4.0.2 + dev: true + + /through2/4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.0 + dev: true + /tiny-emitter/2.1.0: resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} dev: false @@ -9318,6 +10028,11 @@ packages: resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} dev: false + /trim-newlines/3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + /trim-trailing-lines/1.1.4: resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} dev: true @@ -9384,16 +10099,16 @@ packages: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - /type-fest/0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} dev: true + /type-fest/0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -9404,6 +10119,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest/0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + /type-fest/0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} @@ -9433,6 +10153,10 @@ packages: is-typedarray: 1.0.0 dev: true + /typedarray/0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + /typescript/4.8.4: resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} engines: {node: '>=4.2.0'} @@ -9442,6 +10166,14 @@ packages: resolution: {integrity: sha512-dXVsz3M4j+5tTiovFVyVqssXBu5HM47//YSOeZ9fQkdDKkfzv2v3PP1jmH6FUyPW+yCSn7aBVK1fGGKNhowdDA==} dev: false + /uglify-js/3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -10245,6 +10977,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /wordwrap/1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + /workbox-background-sync/6.5.4: resolution: {integrity: sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==} dependencies: @@ -10495,11 +11231,29 @@ packages: engines: {node: '>= 14'} dev: true + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + /yargs-parser/21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} dev: true + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + /yargs/17.6.0: resolution: {integrity: sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==} engines: {node: '>=12'} diff --git a/src/composables/layout.ts b/src/composables/layout.ts index 8df159196..b80ebe2a5 100644 --- a/src/composables/layout.ts +++ b/src/composables/layout.ts @@ -3,7 +3,7 @@ import { breakpointsTailwind, useBreakpoints } from '@vueuse/core'; import { useAppStore, useThemeStore } from '@/store'; type LayoutMode = 'vertical' | 'horizontal'; -type LayoutHeaderProps = Record; +type LayoutHeaderProps = Record; export function useBasicLayout() { const app = useAppStore(); diff --git a/src/enum/common.ts b/src/enum/common.ts index e33c896f8..598ee9c9e 100644 --- a/src/enum/common.ts +++ b/src/enum/common.ts @@ -30,8 +30,10 @@ export enum EnumDataType { undefined = '[object Undefined]', object = '[object Object]', array = '[object Array]', + function = '[object Function]', date = '[object Date]', regexp = '[object RegExp]', + promise = '[object Promise]', set = '[object Set]', map = '[object Map]', file = '[object File]' diff --git a/src/layouts/common/GlobalHeader/components/GlobalBreadcrumb.vue b/src/layouts/common/GlobalHeader/components/GlobalBreadcrumb.vue index 0824dd086..d6344f59f 100644 --- a/src/layouts/common/GlobalHeader/components/GlobalBreadcrumb.vue +++ b/src/layouts/common/GlobalHeader/components/GlobalBreadcrumb.vue @@ -42,7 +42,7 @@ const routeStore = useRouteStore(); const { routerPush } = useRouterPush(); const breadcrumbs = computed(() => - getBreadcrumbByRouteKey(route.name as string, routeStore.menus as GlobalMenuOption[], routePath('root')) + getBreadcrumbByRouteKey(route.name as string, routeStore.menus as App.GlobalMenuOption[], routePath('root')) ); function dropdownSelect(key: string) { diff --git a/src/layouts/common/GlobalHeader/components/HeaderMenu.vue b/src/layouts/common/GlobalHeader/components/HeaderMenu.vue index a336f875a..e19cd64c7 100644 --- a/src/layouts/common/GlobalHeader/components/HeaderMenu.vue +++ b/src/layouts/common/GlobalHeader/components/HeaderMenu.vue @@ -28,11 +28,11 @@ const routeStore = useRouteStore(); const theme = useThemeStore(); const { routerPush } = useRouterPush(); -const menus = computed(() => routeStore.menus as GlobalMenuOption[]); +const menus = computed(() => routeStore.menus as App.GlobalMenuOption[]); const activeKey = computed(() => (route.meta?.activeMenu ? route.meta.activeMenu : route.name) as string); function handleUpdateMenu(_key: string, item: MenuOption) { - const menuItem = item as GlobalMenuOption; + const menuItem = item as App.GlobalMenuOption; routerPush(menuItem.routePath); } diff --git a/src/layouts/common/GlobalHeader/components/MessageList.vue b/src/layouts/common/GlobalHeader/components/MessageList.vue index b0e1a7666..a8845aa12 100644 --- a/src/layouts/common/GlobalHeader/components/MessageList.vue +++ b/src/layouts/common/GlobalHeader/components/MessageList.vue @@ -38,7 +38,7 @@ defineOptions({ name: 'MessageList' }); interface Props { - list?: Message.List[]; + list?: App.MessageList[]; } withDefaults(defineProps(), { diff --git a/src/layouts/common/GlobalHeader/components/SystemMessage.vue b/src/layouts/common/GlobalHeader/components/SystemMessage.vue index ef639ee65..25d8a6c60 100644 --- a/src/layouts/common/GlobalHeader/components/SystemMessage.vue +++ b/src/layouts/common/GlobalHeader/components/SystemMessage.vue @@ -62,7 +62,7 @@ const { bool: loading, setBool: setLoading } = useBoolean(); const currentTab = ref(0); -const tabData = ref([ +const tabData = ref([ { key: 1, name: '通知', diff --git a/src/layouts/common/GlobalHeader/index.vue b/src/layouts/common/GlobalHeader/index.vue index e41a16b8f..b738abd35 100644 --- a/src/layouts/common/GlobalHeader/index.vue +++ b/src/layouts/common/GlobalHeader/index.vue @@ -39,11 +39,11 @@ defineOptions({ name: 'GlobalHeader' }); interface Props { /** 显示logo */ - showLogo: GlobalHeaderProps['showLogo']; + showLogo: App.GlobalHeaderProps['showLogo']; /** 显示头部菜单 */ - showHeaderMenu: GlobalHeaderProps['showHeaderMenu']; + showHeaderMenu: App.GlobalHeaderProps['showHeaderMenu']; /** 显示菜单折叠按钮 */ - showMenuCollapse: GlobalHeaderProps['showMenuCollapse']; + showMenuCollapse: App.GlobalHeaderProps['showMenuCollapse']; } defineProps(); diff --git a/src/layouts/common/GlobalSider/components/VerticalMixSider/components/MixMenuDrawer.vue b/src/layouts/common/GlobalSider/components/VerticalMixSider/components/MixMenuDrawer.vue index e556f6954..00a1cdf17 100644 --- a/src/layouts/common/GlobalSider/components/VerticalMixSider/components/MixMenuDrawer.vue +++ b/src/layouts/common/GlobalSider/components/VerticalMixSider/components/MixMenuDrawer.vue @@ -42,7 +42,7 @@ interface Props { /** 菜单抽屉可见性 */ visible: boolean; /** 子菜单数据 */ - menus: GlobalMenuOption[]; + menus: App.GlobalMenuOption[]; } const props = defineProps(); @@ -59,7 +59,7 @@ const activeKey = computed(() => (route.meta?.activeMenu ? route.meta.activeMenu const expandedKeys = ref([]); function handleUpdateMenu(_key: string, item: MenuOption) { - const menuItem = item as GlobalMenuOption; + const menuItem = item as App.GlobalMenuOption; routerPush(menuItem.routePath); } diff --git a/src/layouts/common/GlobalSider/components/VerticalMixSider/index.vue b/src/layouts/common/GlobalSider/components/VerticalMixSider/index.vue index 03b8d077a..abc73b465 100644 --- a/src/layouts/common/GlobalSider/components/VerticalMixSider/index.vue +++ b/src/layouts/common/GlobalSider/components/VerticalMixSider/index.vue @@ -84,7 +84,7 @@ function resetFirstDegreeMenus() { } const activeChildMenus = computed(() => { - const menus: GlobalMenuOption[] = []; + const menus: App.GlobalMenuOption[] = []; routeStore.menus.some(item => { const flag = item.routeName === activeParentRouteName.value && Boolean(item.children?.length); if (flag) { diff --git a/src/layouts/common/GlobalSider/components/VerticalSider/components/VerticalMenu.vue b/src/layouts/common/GlobalSider/components/VerticalSider/components/VerticalMenu.vue index 700dd5714..25c0e450e 100644 --- a/src/layouts/common/GlobalSider/components/VerticalSider/components/VerticalMenu.vue +++ b/src/layouts/common/GlobalSider/components/VerticalSider/components/VerticalMenu.vue @@ -31,13 +31,13 @@ const theme = useThemeStore(); const routeStore = useRouteStore(); const { routerPush } = useRouterPush(); -const menus = computed(() => routeStore.menus as GlobalMenuOption[]); +const menus = computed(() => routeStore.menus as App.GlobalMenuOption[]); const activeKey = computed(() => (route.meta?.activeMenu ? route.meta.activeMenu : route.name) as string); const expandedKeys = ref([]); function handleUpdateMenu(_key: string, item: MenuOption) { - const menuItem = item as GlobalMenuOption; + const menuItem = item as App.GlobalMenuOption; routerPush(menuItem.routePath); } diff --git a/src/router/guard/dynamic.ts b/src/router/guard/dynamic.ts index 965c4914c..e57ad2fe8 100644 --- a/src/router/guard/dynamic.ts +++ b/src/router/guard/dynamic.ts @@ -18,7 +18,7 @@ export async function createDynamicRouteGuard( if (!route.isInitAuthRoute) { // 未登录情况下直接回到登录页,登录成功后再加载权限路由 if (!isLogin) { - const toName = to.name as AuthRoute.RouteKey; + const toName = to.name as AuthRoute.AllRouteKey; if (route.isValidConstantRoute(toName) && !to.meta.requiresAuth) { next(); } else { @@ -30,19 +30,19 @@ export async function createDynamicRouteGuard( await route.initAuthRoute(); - if (to.name === routeName('not-found-page')) { - // 动态路由没有加载导致被not-found-page路由捕获,等待权限路由加载好了,回到之前的路由 + if (to.name === routeName('not-found')) { + // 动态路由没有加载导致被not-found路由捕获,等待权限路由加载好了,回到之前的路由 // 若路由是从根路由重定向过来的,重新回到根路由 - const ROOT_ROUTE_NAME: AuthRoute.RouteKey = 'root'; + const ROOT_ROUTE_NAME: AuthRoute.AllRouteKey = 'root'; const path = to.redirectedFrom?.name === ROOT_ROUTE_NAME ? '/' : to.fullPath; next({ path, replace: true, query: to.query, hash: to.hash }); return false; } } - // 权限路由已经加载,仍然未找到,重定向到not-found - if (to.name === routeName('not-found-page')) { - next({ name: routeName('not-found'), replace: true }); + // 权限路由已经加载,仍然未找到,重定向到404 + if (to.name === routeName('not-found')) { + next({ name: routeName('404'), replace: true }); return false; } diff --git a/src/router/guard/permission.ts b/src/router/guard/permission.ts index fd216bc37..e50f3fd9a 100644 --- a/src/router/guard/permission.ts +++ b/src/router/guard/permission.ts @@ -61,7 +61,7 @@ export async function createPermissionGuard( // 登录状态进入需要登录权限的页面,无权限,重定向到无权限页面 isLogin && needLogin && !hasPermission, () => { - next({ name: routeName('no-permission') }); + next({ name: routeName('403') }); } ] ]; diff --git a/src/router/index.ts b/src/router/index.ts index e3332b535..711a37f63 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,6 +1,7 @@ import type { App } from 'vue'; import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router'; -import { transformAuthRoutesToVueRoutes, transformRouteNameToRoutePath } from '@/utils'; +import { transformRouteNameToRoutePath } from '@/utils'; +import { transformAuthRouteToVueRoutes } from '@/utils/router/transform'; import { constantRoutes } from './routes'; import { scrollBehavior } from './helpers'; import { createRouterGuard } from './guard'; @@ -9,7 +10,7 @@ const { VITE_HASH_ROUTE = 'N', VITE_BASE_URL } = import.meta.env; export const router = createRouter({ history: VITE_HASH_ROUTE === 'Y' ? createWebHashHistory(VITE_BASE_URL) : createWebHistory(VITE_BASE_URL), - routes: transformAuthRoutesToVueRoutes(constantRoutes), + routes: transformAuthRouteToVueRoutes(constantRoutes), scrollBehavior }); @@ -21,9 +22,9 @@ export async function setupRouter(app: App) { } /** 路由名称 */ -export const routeName = (key: AuthRoute.RouteKey) => key; +export const routeName = (key: AuthRoute.AllRouteKey) => key; /** 路由路径 */ -export const routePath = (key: Exclude) => transformRouteNameToRoutePath(key); +export const routePath = (key: Exclude) => transformRouteNameToRoutePath(key); export * from './routes'; export * from './modules'; diff --git a/src/router/modules/about.ts b/src/router/modules/about.ts index eeedabafd..6f149fc10 100644 --- a/src/router/modules/about.ts +++ b/src/router/modules/about.ts @@ -1,4 +1,4 @@ -const about: AuthRoutes.Route = { +const about: AuthRoute.Route = { name: 'about', path: '/about', component: 'self', diff --git a/src/router/routes/index.ts b/src/router/routes/index.ts index 10f115c72..9d9d4047c 100644 --- a/src/router/routes/index.ts +++ b/src/router/routes/index.ts @@ -39,8 +39,8 @@ export const constantRoutes: AuthRoute.Route[] = [ } }, { - name: 'no-permission', - path: '/no-permission', + name: '403', + path: '/403', component: 'self', meta: { title: '无权限', @@ -48,8 +48,8 @@ export const constantRoutes: AuthRoute.Route[] = [ } }, { - name: 'not-found', - path: '/not-found', + name: '404', + path: '/404', component: 'self', meta: { title: '未找到', @@ -57,8 +57,8 @@ export const constantRoutes: AuthRoute.Route[] = [ } }, { - name: 'service-error', - path: '/service-error', + name: '500', + path: '/500', component: 'self', meta: { title: '服务器错误', @@ -67,7 +67,7 @@ export const constantRoutes: AuthRoute.Route[] = [ }, // 匹配无效路径的路由 { - name: 'not-found-page', + name: 'not-found', path: '/:pathMatch(.*)*', component: 'blank', meta: { diff --git a/src/store/modules/route/index.ts b/src/store/modules/route/index.ts index 33c3a521e..2b5df4b20 100644 --- a/src/store/modules/route/index.ts +++ b/src/store/modules/route/index.ts @@ -7,12 +7,11 @@ import { getConstantRouteNames, getUserInfo, transformAuthRouteToMenu, - transformAuthRouteToVueRoute, - transformAuthRoutesToSearchMenus, - transformAuthRoutesToVueRoutes, + transformAuthRouteToSearchMenus, transformRouteNameToRoutePath, transformRoutePathToRouteName } from '@/utils'; +import { transformAuthRouteToVueRoutes, transformAuthRouteToVueRoute } from '@/utils/router/transform'; import { useAuthStore } from '../auth'; import { useTabStore } from '../tab'; @@ -26,9 +25,9 @@ interface RouteState { /** 是否初始化了权限路由 */ isInitAuthRoute: boolean; /** 路由首页name(前端静态路由时生效,后端动态路由该值会被后端返回的值覆盖) */ - routeHomeName: AuthRoute.RouteKey; + routeHomeName: AuthRoute.AllRouteKey; /** 菜单 */ - menus: GlobalMenuOption[]; + menus: App.GlobalMenuOption[]; /** 搜索的菜单 */ searchMenus: AuthRoute.Route[]; /** 缓存的路由名称 */ @@ -54,7 +53,7 @@ export const useRouteStore = defineStore('route-store', { resetRoutes() { const routes = router.getRoutes(); routes.forEach(route => { - const name: AuthRoute.RouteKey = (route.name || 'root') as AuthRoute.RouteKey; + const name = (route.name || 'root') as AuthRoute.AllRouteKey; if (!this.isConstantRoute(name)) { router.removeRoute(name); } @@ -64,7 +63,7 @@ export const useRouteStore = defineStore('route-store', { * 是否是固定路由 * @param name 路由名称 */ - isConstantRoute(name: AuthRoute.RouteKey) { + isConstantRoute(name: AuthRoute.AllRouteKey) { const constantRouteNames = getConstantRouteNames(constantRoutes); return constantRouteNames.includes(name); }, @@ -72,8 +71,8 @@ export const useRouteStore = defineStore('route-store', { * 是否是有效的固定路由 * @param name 路由名称 */ - isValidConstantRoute(name: AuthRoute.RouteKey) { - const NOT_FOUND_PAGE_NAME: AuthRoute.RouteKey = 'not-found-page'; + isValidConstantRoute(name: AuthRoute.AllRouteKey) { + const NOT_FOUND_PAGE_NAME: AuthRoute.NotFoundRouteKey = 'not-found'; const constantRouteNames = getConstantRouteNames(constantRoutes); return constantRouteNames.includes(name) && name !== NOT_FOUND_PAGE_NAME; }, @@ -81,11 +80,11 @@ export const useRouteStore = defineStore('route-store', { * 处理权限路由 * @param routes - 权限路由 */ - handleAuthRoutes(routes: AuthRoute.Route[]) { - (this.menus as GlobalMenuOption[]) = transformAuthRouteToMenu(routes); - this.searchMenus = transformAuthRoutesToSearchMenus(routes); + handleAuthRoute(routes: AuthRoute.Route[]) { + (this.menus as App.GlobalMenuOption[]) = transformAuthRouteToMenu(routes); + this.searchMenus = transformAuthRouteToSearchMenus(routes); - const vueRoutes = transformAuthRoutesToVueRoutes(routes); + const vueRoutes = transformAuthRouteToVueRoutes(routes); vueRoutes.forEach(route => { router.addRoute(route); @@ -94,12 +93,12 @@ export const useRouteStore = defineStore('route-store', { this.cacheRoutes = getCacheRoutes(vueRoutes); }, /** 动态路由模式下:更新根路由的重定向 */ - handleUpdateRootRedirect(routeKey: AuthRoute.RouteKey) { - if (routeKey === 'root' || routeKey === 'not-found-page') { - throw new Error('routeKey的值不能为root或者not-found-page'); + handleUpdateRootRedirect(routeKey: AuthRoute.AllRouteKey) { + if (routeKey === 'root' || routeKey === 'not-found') { + throw new Error('routeKey的值不能为root或者not-found'); } const rootRoute: AuthRoute.Route = { ...ROOT_ROUTE, redirect: transformRouteNameToRoutePath(routeKey) }; - const rootRouteName: AuthRoute.RouteKey = 'root'; + const rootRouteName: AuthRoute.AllRouteKey = 'root'; router.removeRoute(rootRouteName); const rootVueRoute = transformAuthRouteToVueRoute(rootRoute)[0]; router.addRoute(rootVueRoute); @@ -111,14 +110,14 @@ export const useRouteStore = defineStore('route-store', { if (data) { this.routeHomeName = data.home; this.handleUpdateRootRedirect(data.home); - this.handleAuthRoutes(data.routes); + this.handleAuthRoute(data.routes); } }, /** 初始化静态路由 */ async initStaticRoute() { const auth = useAuthStore(); const routes = filterAuthRoutesByUserPermission(staticRoutes, auth.userInfo.userRole); - this.handleAuthRoutes(routes); + this.handleAuthRoute(routes); }, /** 初始化权限路由 */ async initAuthRoute() { diff --git a/src/store/modules/tab/helpers.ts b/src/store/modules/tab/helpers.ts index 6c0f4ea39..019f3580b 100644 --- a/src/store/modules/tab/helpers.ts +++ b/src/store/modules/tab/helpers.ts @@ -9,7 +9,7 @@ import { getLocal, setLocal } from '@/utils'; export function getTabRouteByVueRoute(route: RouteRecordNormalized | RouteLocationNormalizedLoaded) { const fullPath = hasFullPath(route) ? route.fullPath : route.path; - const tabRoute: GlobalTabRoute = { + const tabRoute: App.GlobalTabRoute = { name: route.name, fullPath, meta: route.meta, @@ -26,7 +26,7 @@ export function getTabRouteByVueRoute(route: RouteRecordNormalized | RouteLocati * @param tabs - 多页签数据 * @param fullPath - 该页签的路径 */ -export function getIndexInTabRoutes(tabs: GlobalTabRoute[], fullPath: string) { +export function getIndexInTabRoutes(tabs: App.GlobalTabRoute[], fullPath: string) { return tabs.findIndex(tab => tab.fullPath === fullPath); } @@ -35,7 +35,7 @@ export function getIndexInTabRoutes(tabs: GlobalTabRoute[], fullPath: string) { * @param tabs - 多页签数据 * @param fullPath - 该页签的路径 */ -export function isInTabRoutes(tabs: GlobalTabRoute[], fullPath: string) { +export function isInTabRoutes(tabs: App.GlobalTabRoute[], fullPath: string) { return getIndexInTabRoutes(tabs, fullPath) > -1; } @@ -44,7 +44,7 @@ export function isInTabRoutes(tabs: GlobalTabRoute[], fullPath: string) { * @param tabs - 多页签数据 * @param routeName - 路由名称 */ -export function getIndexInTabRoutesByRouteName(tabs: GlobalTabRoute[], routeName: string) { +export function getIndexInTabRoutesByRouteName(tabs: App.GlobalTabRoute[], routeName: string) { return tabs.findIndex(tab => tab.name === routeName); } @@ -59,14 +59,14 @@ function hasFullPath( } /** 缓存多页签数据 */ -export function setTabRoutes(data: GlobalTabRoute[]) { +export function setTabRoutes(data: App.GlobalTabRoute[]) { setLocal(EnumStorageKey['multi-tab-routes'], data); } /** 获取缓存的多页签数据 */ export function getTabRoutes() { - const routes: GlobalTabRoute[] = []; - const data = getLocal(EnumStorageKey['multi-tab-routes']); + const routes: App.GlobalTabRoute[] = []; + const data = getLocal(EnumStorageKey['multi-tab-routes']); if (data) { const defaultTabRoutes = data.map(item => ({ ...item, diff --git a/src/store/modules/tab/index.ts b/src/store/modules/tab/index.ts index 5c4744625..5f153b4d6 100644 --- a/src/store/modules/tab/index.ts +++ b/src/store/modules/tab/index.ts @@ -14,9 +14,9 @@ import { interface TabState { /** 多页签数据 */ - tabs: GlobalTabRoute[]; + tabs: App.GlobalTabRoute[]; /** 多页签首页 */ - homeTab: GlobalTabRoute; + homeTab: App.GlobalTabRoute; /** 当前激活状态的页签(路由fullPath) */ activeTab: string; } @@ -213,7 +213,7 @@ export const useTabStore = defineStore('tab-store', { iniTabStore(currentRoute: RouteLocationNormalizedLoaded) { const theme = useThemeStore(); - const tabs: GlobalTabRoute[] = theme.tab.isCache ? getTabRoutes() : []; + const tabs: App.GlobalTabRoute[] = theme.tab.isCache ? getTabRoutes() : []; const hasHome = getIndexInTabRoutesByRouteName(tabs, this.homeTab.name as string) > -1; if (!hasHome && this.homeTab.name !== 'root') { diff --git a/src/typings/api.d.ts b/src/typings/api.d.ts index 03b1bd6d0..1ede6340c 100644 --- a/src/typings/api.d.ts +++ b/src/typings/api.d.ts @@ -18,7 +18,7 @@ declare namespace ApiRoute { /** 动态路由 */ routes: AuthRoute.Route[]; /** 路由首页对应的key */ - home: AuthRoute.RouteKey; + home: AuthRoute.AllRouteKey; } } diff --git a/src/typings/env.d.ts b/src/typings/env.d.ts index ca23da3c5..6621247ab 100644 --- a/src/typings/env.d.ts +++ b/src/typings/env.d.ts @@ -34,7 +34,7 @@ interface ImportMetaEnv { */ readonly VITE_AUTH_ROUTE_MODE: 'static' | 'dynamic'; /** 路由首页的路径 */ - readonly VITE_ROUTE_HOME_PATH: Exclude; + readonly VITE_ROUTE_HOME_PATH: AuthRoute.RoutePath; /** iconify图标作为组件的前缀 */ readonly VITE_ICON_PREFFIX: string; /** diff --git a/src/typings/route.d.ts b/src/typings/route.d.ts index 6b19c858d..cfad97b8a 100644 --- a/src/typings/route.d.ts +++ b/src/typings/route.d.ts @@ -1,74 +1,22 @@ -/** 权限路由相关类型 */ declare namespace AuthRoute { - /** 多级路由分割符号 */ - type RouteSplitMark = '_'; - - /** 路由的key */ - type RouteKey = - // 固定的路由 - | 'root' // 根路由 - | 'login' - | 'not-found' - | 'no-permission' - | 'service-error' - | 'constant-page' - | 'not-found-page' // 捕获无效path的路由 - // 自定义路由 - | 'dashboard' - | 'dashboard_analysis' - | 'dashboard_workbench' - | 'document' - | 'document_vue' - | 'document_vite' - | 'document_naive' - | 'document_project' - | 'document_project-link' - | 'component' - | 'component_button' - | 'component_card' - | 'component_table' - | 'plugin' - | 'plugin_map' - | 'plugin_video' - | 'plugin_editor' - | 'plugin_editor_quill' - | 'plugin_editor_markdown' - | 'plugin_copy' - | 'plugin_icon' - | 'plugin_print' - | 'plugin_swiper' - | 'plugin_charts' - | 'plugin_charts_echarts' - | 'plugin_charts_antv' - | 'auth-demo' - | 'auth-demo_permission' - | 'auth-demo_super' - | 'function' - | 'function_tab' - | 'function_tab-detail' - | 'function_tab-multi-detail' - | 'exception' - | 'exception_403' - | 'exception_404' - | 'exception_500' - | 'multi-menu' - | 'multi-menu_first' - | 'multi-menu_first_second' - | 'multi-menu_first_second-new' - | 'multi-menu_first_second-new_third' - | 'management' - | 'management_user' - | 'management_role' - | 'management_auth' - | 'management_route' - | 'about'; - - /** 路由的path */ - type RoutePath = - | '/' - | Exclude, '/root' | '/not-found-page'> - | SingleRouteParentPath - | '/:pathMatch(.*)*'; + /** 根路由路径 */ + type RootRoutePath = '/'; + + /** 捕获无效路由的路由路径 */ + type NotFoundRoutePath = '/:pathMatch(.*)*'; + + type RootRouteKey = RouterPage.RootRouteKey; + + type NotFoundRouteKey = RouterPage.NotFoundRouteKey; + + type RouteKey = RouterPage.RouteKey; + + type LastDegreeRouteKey = RouterPage.LastDegreeRouteKey; + + type AllRouteKey = RouteKey | RootRouteKey | NotFoundRouteKey; + + /** 路由路径 */ + type RoutePath = AuthRouteUtils.GetRoutePath; /** * 路由的组件 @@ -77,16 +25,16 @@ declare namespace AuthRoute { * - multi - 多级路由布局(三级路由或三级以上时,除第一级路由和最后一级路由,其余的采用该布局) * - self - 作为子路由,使用自身的布局(作为最后一级路由,没有子路由) */ - type RouteComponent = 'basic' | 'blank' | 'multi' | 'self'; + type RouteComponentType = 'basic' | 'blank' | 'multi' | 'self'; /** 路由描述 */ interface RouteMeta { /** 路由标题(可用来作document.title或者菜单的名称) */ title: string; /** 路由的动态路径(需要动态路径的页面需要将path添加进范型参数) */ - dynamicPath?: PathToDynamicPath<'/login'>; + dynamicPath?: AuthRouteUtils.GetDynamicPath<'/login'>; /** 作为单级路由的父级路由布局组件 */ - singleLayout?: Extract; + singleLayout?: Extract; /** 需要登录权限 */ requiresAuth?: boolean; /** @@ -96,7 +44,7 @@ declare namespace AuthRoute { permissions?: Auth.RoleType[]; /** 缓存页面 */ keepAlive?: boolean; - /** 菜单和面包屑对应的图标(iconify图标名称) */ + /** 菜单和面包屑对应的图标 */ icon?: string; /** 使用本地svg作为的菜单和面包屑对应的图标(assets/svg-icon文件夹的的svg文件名) */ localIcon?: string; @@ -114,62 +62,86 @@ declare namespace AuthRoute { multi?: boolean; } - /** 单个路由的类型结构(动态路由模式:后端返回此类型结构的路由) */ - interface Route { - /** 路由名称(路由唯一标识) */ - name: RouteKey; - /** 路由路径 */ - path: RoutePath; - /** 路由重定向 */ - redirect?: RoutePath; - /** - * 路由组件 - * - basic: 基础布局,具有公共部分的布局 - * - blank: 空白布局 - * - multi: 多级路由布局(三级路由或三级以上时,除第一级路由和最后一级路由,其余的采用该布局) - * - self: 作为子路由,使用自身的布局(作为最后一级路由,没有子路由) - */ - component?: RouteComponent; - /** 子路由 */ - children?: Route[]; - /** 路由描述 */ - meta: RouteMeta; - /** 路由属性 */ - props?: boolean | Record | ((to: any) => Record); - } + type Route = K extends AllRouteKey + ? { + /** 路由名称(路由唯一标识) */ + name: K; + /** 路由路径 */ + path: AuthRouteUtils.GetRoutePath; + /** 路由重定向 */ + redirect?: AuthRouteUtils.GetRoutePath; + /** + * 路由组件 + * - basic: 基础布局,具有公共部分的布局 + * - blank: 空白布局 + * - multi: 多级路由布局(三级路由或三级以上时,除第一级路由和最后一级路由,其余的采用该布局) + * - self: 作为子路由,使用自身的布局(作为最后一级路由,没有子路由) + */ + component?: RouteComponentType; + /** 子路由 */ + children?: Route[]; + /** 路由描述 */ + meta: RouteMeta; + } & Omit + : never; /** 前端导入的路由模块 */ - type RouteModule = Record; + type RouteModule = Record; +} + +declare namespace AuthRouteUtils { + /** 路由key层级分割符 */ + type RouteKeySplitMark = '_'; + + /** 路由path层级分割符 */ + type RoutePathSplitMark = '/'; - /** 单独一级路由的key (单独路由需要添加一个父级路由用于应用布局组件) */ + /** 空白字符串 */ + type BlankString = ''; + + /** key转换成path */ + type KeyToPath = K extends `${infer _Left}${RouteKeySplitMark}${RouteKeySplitMark}${infer _Right}` + ? never + : K extends `${infer Left}${RouteKeySplitMark}${infer Right}` + ? Left extends BlankString + ? never + : Right extends BlankString + ? never + : KeyToPath<`${Left}${RoutePathSplitMark}${Right}`> + : `${RoutePathSplitMark}${K}`; + + /** 根据路由key获取路由路径 */ + type GetRoutePath = K extends AuthRoute.AllRouteKey + ? K extends AuthRoute.RootRouteKey + ? AuthRoute.RootRoutePath + : K extends AuthRoute.NotFoundRouteKey + ? AuthRoute.NotFoundRoutePath + : KeyToPath + : never; + + /** 获取一级路由(有子路由的一级路由和没有子路由的路由) */ + type GetFirstDegreeRouteKey = + K extends `${infer _Left}${RouteKeySplitMark}${infer _Right}` ? never : K; + + /** 获取有子路由的一级路由 */ + type GetFirstDegreeRouteKeyWithChildren = + K extends `${infer Left}${RouteKeySplitMark}${infer _Right}` ? Left : never; + + /** 单级路由的key (单级路由需要添加一个父级路由用于应用布局组件) */ type SingleRouteKey = Exclude< - GetSingleRouteKey, - GetRouteFirstParentKey | 'root' | 'not-found-page' + GetFirstDegreeRouteKey, + GetFirstDegreeRouteKeyWithChildren | AuthRoute.RootRouteKey | AuthRoute.NotFoundRouteKey >; + /** 单独路由父级路由key */ type SingleRouteParentKey = `${SingleRouteKey}-parent`; /** 单独路由父级路由path */ type SingleRouteParentPath = KeyToPath; - /** 路由key转换路由path */ - type KeyToPath = Key extends `${infer Left}_${infer Right}` - ? KeyToPath<`${Left}/${Right}`> - : `/${Key}`; - - /** 路由path转换动态路径 */ - type PathToDynamicPath = - | `${Path}/:${string}` - | `${Path}/:${string}(${string})` - | `${Path}/:${string}(${string})?`; - - /** 获取一级路由(包括有子路由的一级路由) */ - type GetSingleRouteKey = Key extends `${infer _Left}${RouteSplitMark}${infer _Right}` - ? never - : Key; - - /** 获取子路由的一级父路由 */ - type GetRouteFirstParentKey = Key extends `${infer Left}${RouteSplitMark}${infer _Right}` - ? Left - : never; + /** 获取路由动态路径 */ + type GetDynamicPath

= + | `${P}/:${string}` + | `${P}/:${string}(${string})` + | `${P}/:${string}(${string})?`; } diff --git a/src/typings/routes.d.ts b/src/typings/routes.d.ts deleted file mode 100644 index 821df484a..000000000 --- a/src/typings/routes.d.ts +++ /dev/null @@ -1,200 +0,0 @@ -declare namespace AuthRoutes { - /** 路由key */ - type RouteKey = ConstantRouteKey | AuthRouteKey; - - /** 根路由key */ - type RootRouteKey = 'root'; - - /** 捕获无效路由的路由key */ - type RouteCaptureKey = 'not-found-page'; - - /** 固定的路由key */ - type ConstantRouteKey = RootRouteKey | 'login' | 'not-found' | 'no-permission' | 'service-error' | RouteCaptureKey; - - /** 权限路由key */ - type AuthRouteKey = - | 'dashboard' - | 'dashboard_analysis' - | 'dashboard_workbench' - | 'document' - | 'document_vue' - | 'document_vue-new' - | 'document_vite' - | 'document_naive' - | 'document_project' - | 'component' - | 'component_button' - | 'component_card' - | 'component_table' - | 'plugin' - | 'plugin_map' - | 'plugin_video' - | 'plugin_editor' - | 'plugin_editor_quill' - | 'plugin_editor_markdown' - | 'plugin_copy' - | 'plugin_icon' - | 'plugin_print' - | 'plugin_swiper' - | 'plugin_charts' - | 'plugin_charts_echarts' - | 'plugin_charts_antv' - | 'auth-demo' - | 'auth-demo_permission' - | 'auth-demo_super' - | 'function' - | 'function_tab' - | 'function_tab-detail' - | 'function_tab-multi-detail' - | 'exception' - | 'exception_403' - | 'exception_404' - | 'exception_500' - | 'multi-menu' - | 'multi-menu_first' - | 'multi-menu_first_second' - | 'multi-menu_first_second-new' - | 'multi-menu_first_second-new_third' - | 'management' - | 'management_user' - | 'management_role' - | 'management_auth' - | 'management_route' - | 'about'; - - /** 根路由路径 */ - type RootRoutePath = '/'; - - /** 捕获无效路由的路由路径 */ - type RouteCapturePath = '/:pathMatch(.*)*'; - - /** 路由路径 */ - type RoutePath = AuthRouteUtils.GetRoutePath; - - /** 常用的路由路径 */ - type CommonRoutePath = Exclude; - - /** - * 路由的组件 - * - basic - 基础布局,具有公共部分的布局 - * - blank - 空白布局 - * - multi - 多级路由布局(三级路由或三级以上时,除第一级路由和最后一级路由,其余的采用该布局) - * - self - 作为子路由,使用自身的布局(作为最后一级路由,没有子路由) - */ - type RouteComponent = 'basic' | 'blank' | 'multi' | 'self'; - - /** 路由描述 */ - interface RouteMeta { - /** 路由标题(可用来作document.title或者菜单的名称) */ - title: string; - /** 路由的动态路径(需要动态路径的页面需要将path添加进范型参数) */ - dynamicPath?: AuthRouteUtils.GetDynamicPath<'/login'>; - /** 作为单级路由的父级路由布局组件 */ - singleLayout?: Extract; - /** 需要登录权限 */ - requiresAuth?: boolean; - /** - * 哪些类型的用户有权限才能访问的路由(空的话则表示不需要权限) - * @description 后端动态路由数据不需要该属性,直接由后端根据用户角色返回对应权限的路由数据 - */ - permissions?: Auth.RoleType[]; - /** 缓存页面 */ - keepAlive?: boolean; - /** 菜单和面包屑对应的图标 */ - icon?: string; - /** 自定义的菜单和面包屑对应的图标 */ - customIcon?: string; - /** 是否在菜单中隐藏(一些列表、表格的详情页面需要通过参数跳转,所以不能显示在菜单中) */ - hide?: boolean; - /** 外链链接 */ - href?: string; - /** 是否支持多个tab页签(默认一个,即相同name的路由会被替换) */ - multiTab?: boolean; - /** 路由顺序,可用于菜单的排序 */ - order?: number; - /** 当前路由需要选中的菜单项(用于跳转至不在左侧菜单显示的路由且需要高亮某个菜单的情况) */ - activeMenu?: RouteKey; - /** 表示是否是多级路由的中间级路由(用于转换路由数据时筛选多级路由的标识,定义路由时不用填写) */ - multi?: boolean; - } - - type Route = K extends RouteKey - ? { - /** 路由名称(路由唯一标识) */ - name: K; - /** 路由路径 */ - path: AuthRouteUtils.GetRoutePath; - /** 路由重定向 */ - redirect?: CommonRoutePath; - /** - * 路由组件 - * - basic: 基础布局,具有公共部分的布局 - * - blank: 空白布局 - * - multi: 多级路由布局(三级路由或三级以上时,除第一级路由和最后一级路由,其余的采用该布局) - * - self: 作为子路由,使用自身的布局(作为最后一级路由,没有子路由) - */ - component?: RouteComponent; - /** 子路由 */ - children?: Route[]; - /** 路由描述 */ - meta: RouteMeta; - } & Omit - : never; -} - -declare namespace AuthRouteUtils { - /** 路由key层级分割符 */ - type RouteKeySplitMark = '_'; - - /** 路由path层级分割符 */ - type RoutePathSplitMark = '/'; - - /** 空白字符串 */ - type BlankString = ''; - - /** key转换成path */ - type KeyToPath = K extends `${infer _Left}${RouteKeySplitMark}${RouteKeySplitMark}${infer _Right}` - ? never - : K extends `${infer Left}${RouteKeySplitMark}${infer Right}` - ? Left extends BlankString - ? never - : Right extends BlankString - ? never - : KeyToPath<`${Left}${RoutePathSplitMark}${Right}`> - : `${RoutePathSplitMark}${K}`; - - /** 根据路由key获取路由路径 */ - type GetRoutePath = K extends AuthRoutes.RouteKey - ? K extends AuthRoutes.RootRouteKey - ? AuthRoutes.RootRoutePath - : K extends AuthRoutes.RouteCaptureKey - ? AuthRoutes.RouteCapturePath - : KeyToPath - : never; - - /** 获取一级路由(有子路由的一级路由和没有子路由的路由) */ - type GetFirstDegreeRouteKey = - K extends `${infer _Left}${RouteKeySplitMark}${infer _Right}` ? never : K; - - /** 获取有子路由的一级路由 */ - type GetFirstDegreeRouteKeyWithChildren = - K extends `${infer Left}${RouteKeySplitMark}${infer _Right}` ? Left : never; - - /** 单级路由的key (单级路由需要添加一个父级路由用于应用布局组件) */ - type SingleRouteKey = Exclude< - GetFirstDegreeRouteKey, - GetFirstDegreeRouteKeyWithChildren | AuthRoutes.RootRouteKey | AuthRoutes.RouteCaptureKey - >; - - /** 单独路由父级路由key */ - type SingleRouteParentKey = `${SingleRouteKey}-parent`; - - /** 单独路由父级路由path */ - type SingleRouteParentPath = KeyToPath; - - /** 获取路由动态路径 */ - type GetDynamicPath

= - | `${P}/:${string}` - | `${P}/:${string}(${string})` - | `${P}/:${string}(${string})?`; -} diff --git a/src/typings/system.d.ts b/src/typings/system.d.ts index 65a723d2d..301c2db47 100644 --- a/src/typings/system.d.ts +++ b/src/typings/system.d.ts @@ -254,49 +254,48 @@ declare namespace Theme { } } -/** 全局头部属性 */ -interface GlobalHeaderProps { - /** 显示logo */ - showLogo: boolean; - /** 显示头部菜单 */ - showHeaderMenu: boolean; - /** 显示菜单折叠按钮 */ - showMenuCollapse: boolean; -} - -/** 菜单项配置 */ -type GlobalMenuOption = import('naive-ui').MenuOption & { - key: string; - label: string; - routeName: string; - routePath: string; - icon?: () => import('vue').VNodeChild; - children?: GlobalMenuOption[]; -}; +declare namespace App { + /** 全局头部属性 */ + interface GlobalHeaderProps { + /** 显示logo */ + showLogo: boolean; + /** 显示头部菜单 */ + showHeaderMenu: boolean; + /** 显示菜单折叠按钮 */ + showMenuCollapse: boolean; + } -/** 面包屑 */ -type GlobalBreadcrumb = import('naive-ui').DropdownOption & { - key: string; - label: string; - disabled: boolean; - routeName: string; - hasChildren: boolean; - children?: GlobalBreadcrumb[]; -}; + /** 菜单项配置 */ + type GlobalMenuOption = import('naive-ui').MenuOption & { + key: string; + label: string; + routeName: string; + routePath: string; + icon?: () => import('vue').VNodeChild; + children?: GlobalMenuOption[]; + }; -/** 多页签Tab的路由 */ -interface GlobalTabRoute - extends Pick { - /** 滚动的位置 */ - scrollPosition: { - left: number; - top: number; + /** 面包屑 */ + type GlobalBreadcrumb = import('naive-ui').DropdownOption & { + key: string; + label: string; + disabled: boolean; + routeName: string; + hasChildren: boolean; + children?: GlobalBreadcrumb[]; }; -} -/** 系统消息 */ -declare namespace Message { - interface Tab { + /** 多页签Tab的路由 */ + interface GlobalTabRoute + extends Pick { + /** 滚动的位置 */ + scrollPosition: { + left: number; + top: number; + }; + } + + interface MessageTab { /** tab的key */ key: number; /** tab名称 */ @@ -304,10 +303,10 @@ declare namespace Message { /** badge类型 */ badgeProps?: import('naive-ui').BadgeProps; /** 消息数据 */ - list: List[]; + list: MessageList[]; } - interface List { + interface MessageList { /** 数据唯一值 */ id: number; /** 头像 */ diff --git a/src/utils/common/typeof.ts b/src/utils/common/typeof.ts index 6eb957d8a..e86076dbc 100644 --- a/src/utils/common/typeof.ts +++ b/src/utils/common/typeof.ts @@ -1,38 +1,57 @@ import { EnumDataType } from '@/enum'; -export function isNumber(data: unknown) { +export function isNumber(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.number; } -export function isString(data: unknown) { + +export function isString(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.string; } -export function isBoolean(data: unknown) { + +export function isBoolean(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.boolean; } -export function isNull(data: unknown) { + +export function isNull(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.null; } -export function isUndefined(data: unknown) { + +export function isUndefined(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.undefined; } -export function isObject(data: unknown) { + +export function isObject>(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.object; } -export function isArray(data: unknown) { + +export function isArray(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.array; } -export function isDate(data: unknown) { + +export function isFunction any | void | never>(data: T | unknown): data is T { + return Object.prototype.toString.call(data) === EnumDataType.function; +} + +export function isDate(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.date; } -export function isRegExp(data: unknown) { + +export function isRegExp(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.regexp; } -export function isSet(data: unknown) { + +export function isPromise>(data: T | unknown): data is T { + return Object.prototype.toString.call(data) === EnumDataType.promise; +} + +export function isSet>(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.set; } -export function isMap(data: unknown) { + +export function isMap>(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.map; } -export function isFile(data: unknown) { + +export function isFile(data: T | unknown): data is T { return Object.prototype.toString.call(data) === EnumDataType.file; } diff --git a/src/utils/router/breadcrumb.ts b/src/utils/router/breadcrumb.ts index 668d15c9e..21c9540ba 100644 --- a/src/utils/router/breadcrumb.ts +++ b/src/utils/router/breadcrumb.ts @@ -4,7 +4,7 @@ * @param menus - 菜单数据 * @param rootPath - 根路由路径 */ -export function getBreadcrumbByRouteKey(activeKey: string, menus: GlobalMenuOption[], rootPath: string) { +export function getBreadcrumbByRouteKey(activeKey: string, menus: App.GlobalMenuOption[], rootPath: string) { const breadcrumbMenu = getBreadcrumbMenu(activeKey, menus); const breadcrumb = breadcrumbMenu.map(item => transformBreadcrumbMenuToBreadcrumb(item, rootPath)); return breadcrumb; @@ -15,8 +15,8 @@ export function getBreadcrumbByRouteKey(activeKey: string, menus: GlobalMenuOpti * @param activeKey - 当前页面路由的key * @param menus - 菜单数据 */ -function getBreadcrumbMenu(activeKey: string, menus: GlobalMenuOption[]) { - const breadcrumbMenu: GlobalMenuOption[] = []; +function getBreadcrumbMenu(activeKey: string, menus: App.GlobalMenuOption[]) { + const breadcrumbMenu: App.GlobalMenuOption[] = []; menus.some(menu => { const flag = activeKey.includes(menu.routeName); if (flag) { @@ -32,15 +32,15 @@ function getBreadcrumbMenu(activeKey: string, menus: GlobalMenuOption[]) { * @param activeKey - 当前页面路由的key * @param menu - 单个菜单数据 */ -function getBreadcrumbMenuItem(activeKey: string, menu: GlobalMenuOption) { - const breadcrumbMenu: GlobalMenuOption[] = []; +function getBreadcrumbMenuItem(activeKey: string, menu: App.GlobalMenuOption) { + const breadcrumbMenu: App.GlobalMenuOption[] = []; if (activeKey === menu.routeName) { breadcrumbMenu.push(menu); } if (activeKey.includes(menu.routeName) && menu.children && menu.children.length) { breadcrumbMenu.push(menu); breadcrumbMenu.push( - ...menu.children.map(item => getBreadcrumbMenuItem(activeKey, item as GlobalMenuOption)).flat(1) + ...menu.children.map(item => getBreadcrumbMenuItem(activeKey, item as App.GlobalMenuOption)).flat(1) ); } @@ -52,9 +52,9 @@ function getBreadcrumbMenuItem(activeKey: string, menu: GlobalMenuOption) { * @param menu - 单个菜单数据 * @param rootPath - 根路由路径 */ -function transformBreadcrumbMenuToBreadcrumb(menu: GlobalMenuOption, rootPath: string) { +function transformBreadcrumbMenuToBreadcrumb(menu: App.GlobalMenuOption, rootPath: string) { const hasChildren = Boolean(menu.children && menu.children.length); - const breadcrumb: GlobalBreadcrumb = { + const breadcrumb: App.GlobalBreadcrumb = { key: menu.routeName, label: menu.label as string, routeName: menu.routeName, @@ -66,7 +66,7 @@ function transformBreadcrumbMenuToBreadcrumb(menu: GlobalMenuOption, rootPath: s } if (hasChildren) { breadcrumb.children = menu.children?.map(item => - transformBreadcrumbMenuToBreadcrumb(item as GlobalMenuOption, rootPath) + transformBreadcrumbMenuToBreadcrumb(item as App.GlobalMenuOption, rootPath) ); } return breadcrumb; diff --git a/src/utils/router/component.ts b/src/utils/router/component.ts deleted file mode 100644 index 8fb3258ae..000000000 --- a/src/utils/router/component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { Component } from 'vue'; -import { BasicLayout, BlankLayout } from '@/layouts'; -import { views } from '@/views'; - -type LayoutComponent = Record Promise>; - -/** - * 获取页面导入的vue文件(懒加载的方式) - * @param layoutType - 布局类型 - */ -export function getLayoutComponent(layoutType: EnumType.LayoutComponentName) { - const layoutComponent: LayoutComponent = { - basic: BasicLayout, - blank: BlankLayout - }; - return layoutComponent[layoutType]; -} - -/** - * 获取页面导入的vue文件(懒加载的方式) - * @param routeKey - 路由key - */ -export function getViewComponent(routeKey: AuthRoute.RouteKey) { - if (!views[routeKey]) { - window.console.error(`路由“${routeKey}”没有对应的组件文件!`); - } - return () => setViewComponentName(views[routeKey], routeKey) as Promise; -} - -/** 给页面组件设置名称 */ -async function setViewComponentName(asyncComponent: () => Promise, name: string) { - const component = (await asyncComponent()) as { default: Component }; - Object.assign(component.default, { name }); - return component; -} diff --git a/src/utils/router/helpers.ts b/src/utils/router/helpers.ts index 3f536d624..028387454 100644 --- a/src/utils/router/helpers.ts +++ b/src/utils/router/helpers.ts @@ -1,6 +1,3 @@ -import type { RouteRecordRaw } from 'vue-router'; -import { getLayoutComponent, getViewComponent } from './component'; - /** * 获取所有固定路由的名称集合 * @param routes - 固定路由 @@ -9,41 +6,30 @@ export function getConstantRouteNames(routes: AuthRoute.Route[]) { return routes.map(route => getConstantRouteName(route)).flat(1); } -/** - * 将权限路由转换成vue路由 - * @param routes - 权限路由 - * @description 所有多级路由都会被转换成二级路由 - */ -export function transformAuthRoutesToVueRoutes(routes: AuthRoute.Route[]) { - return routes.map(route => transformAuthRouteToVueRoute(route)).flat(1); -} - /** * 将权限路由转换成搜索的菜单数据 * @param routes - 权限路由 * @param treeMap */ -export function transformAuthRoutesToSearchMenus(routes: AuthRoute.Route[], treeMap: AuthRoute.Route[] = []) { +export function transformAuthRouteToSearchMenus(routes: AuthRoute.Route[], treeMap: AuthRoute.Route[] = []) { if (routes && routes.length === 0) return []; return routes.reduce((acc, cur) => { if (!cur.meta?.hide) { acc.push(cur); } if (cur.children && cur.children.length > 0) { - transformAuthRoutesToSearchMenus(cur.children, treeMap); + transformAuthRouteToSearchMenus(cur.children, treeMap); } return acc; }, treeMap); } /** 将路由名字转换成路由路径 */ -export function transformRouteNameToRoutePath( - name: Exclude -): AuthRoute.RoutePath { +export function transformRouteNameToRoutePath(name: Exclude): AuthRoute.RoutePath { const rootPath: AuthRoute.RoutePath = '/'; if (name === 'root') return rootPath; - const splitMark: AuthRoute.RouteSplitMark = '_'; + const splitMark = '_'; const pathSplitMark = '/'; const path = name.split(splitMark).join(pathSplitMark); @@ -51,15 +37,13 @@ export function transformRouteNameToRoutePath( } /** 将路由路径转换成路由名字 */ -export function transformRoutePathToRouteName( - path: Exclude -): AuthRoute.RouteKey { +export function transformRoutePathToRouteName(path: K) { if (path === '/') return 'root'; const pathSplitMark = '/'; - const routeSplitMark: AuthRoute.RouteSplitMark = '_'; + const routeSplitMark = '_'; - const name = path.split(pathSplitMark).slice(1).join(routeSplitMark) as AuthRoute.RouteKey; + const name = path.split(pathSplitMark).slice(1).join(routeSplitMark) as AuthRoute.AllRouteKey; return name; } @@ -76,140 +60,6 @@ function getConstantRouteName(route: AuthRoute.Route) { return names; } -type ComponentAction = Record void>; - -/** - * 将单个权限路由转换成vue路由 - * @param item - 单个权限路由 - */ -export function transformAuthRouteToVueRoute(item: AuthRoute.Route) { - const resultRoute: RouteRecordRaw[] = []; - - const itemRoute = { ...item } as RouteRecordRaw; - - // 动态path - if (hasDynamicPath(item)) { - Object.assign(itemRoute, { path: item.meta.dynamicPath }); - } - - // 外链路由 - if (hasHref(item)) { - Object.assign(itemRoute, { component: getViewComponent('not-found-page') }); - } - - // 路由组件 - if (hasComponent(item)) { - const action: ComponentAction = { - basic() { - itemRoute.component = getLayoutComponent('basic'); - }, - blank() { - itemRoute.component = getLayoutComponent('blank'); - }, - multi() { - // 多级路由一定有子路由 - if (hasChildren(item)) { - Object.assign(itemRoute, { meta: { ...itemRoute.meta, multi: true } }); - delete itemRoute.component; - } else { - window.console.error('多级路由缺少子路由: ', item); - } - }, - self() { - itemRoute.component = getViewComponent(item.name); - } - }; - try { - if (item.component) { - action[item.component](); - } else { - window.console.error('路由组件解析失败: ', item); - } - } catch { - window.console.error('路由组件解析失败: ', item); - } - } - - // 注意:单独路由没有children - if (isSingleRoute(item)) { - if (hasChildren(item)) { - window.console.error('单独路由不应该有子路由: ', item); - } - - // 捕获无效路由的需特殊处理 - if (item.name === 'not-found-page') { - itemRoute.children = [ - { - path: '', - name: item.name, - component: getViewComponent('not-found-page') - } - ]; - } else { - const parentPath = `${itemRoute.path}-parent` as AuthRoute.SingleRouteParentPath; - - const layout = item.meta.singleLayout === 'basic' ? getLayoutComponent('basic') : getLayoutComponent('blank'); - - const parentRoute: RouteRecordRaw = { - path: parentPath, - component: layout, - redirect: item.path, - children: [itemRoute] - }; - - return [parentRoute]; - } - } - - // 子路由 - if (hasChildren(item)) { - const children = (item.children as AuthRoute.Route[]).map(child => transformAuthRouteToVueRoute(child)).flat(); - - // 找出第一个不为多级路由中间级的子路由路径作为重定向路径 - const redirectPath: AuthRoute.RoutePath = (children.find(v => !v.meta?.multi)?.path || '/') as AuthRoute.RoutePath; - if (redirectPath === '/') { - window.console.error('该多级路由没有有效的子路径', item); - } - - if (item.component === 'multi') { - // 多级路由,将子路由提取出来变成同级 - resultRoute.push(...children); - delete itemRoute.children; - } else { - itemRoute.children = children; - } - itemRoute.redirect = redirectPath; - } - - resultRoute.push(itemRoute); - - return resultRoute; -} - -/** - * 是否有外链 - * @param item - 权限路由 - */ -function hasHref(item: AuthRoute.Route) { - return Boolean(item.meta.href); -} - -/** - * 是否有动态路由path - * @param item - 权限路由 - */ -function hasDynamicPath(item: AuthRoute.Route) { - return Boolean(item.meta.dynamicPath); -} - -/** - * 是否有路由组件 - * @param item - 权限路由 - */ -function hasComponent(item: AuthRoute.Route) { - return Boolean(item.component); -} - /** * 是否有子路由 * @param item - 权限路由 @@ -217,11 +67,3 @@ function hasComponent(item: AuthRoute.Route) { function hasChildren(item: AuthRoute.Route) { return Boolean(item.children && item.children.length); } - -/** - * 是否是单层级路由 - * @param item - 权限路由 - */ -function isSingleRoute(item: AuthRoute.Route) { - return Boolean(item.meta.singleLayout); -} diff --git a/src/utils/router/menu.ts b/src/utils/router/menu.ts index de7db1ee3..0f5b03139 100644 --- a/src/utils/router/menu.ts +++ b/src/utils/router/menu.ts @@ -7,10 +7,10 @@ function hideInMenu(route: AuthRoute.Route) { /** 给菜单添加可选属性 */ function addPartialProps(config: { - menu: GlobalMenuOption; + menu: App.GlobalMenuOption; icon?: string; localIcon?: string; - children?: GlobalMenuOption[]; + children?: App.GlobalMenuOption[]; }) { const { iconRender } = useIconRender(); @@ -36,16 +36,16 @@ function addPartialProps(config: { * 将权限路由转换成菜单 * @param routes - 路由 */ -export function transformAuthRouteToMenu(routes: AuthRoute.Route[]): GlobalMenuOption[] { - const globalMenu: GlobalMenuOption[] = []; +export function transformAuthRouteToMenu(routes: AuthRoute.Route[]): App.GlobalMenuOption[] { + const globalMenu: App.GlobalMenuOption[] = []; routes.forEach(route => { const { name, path, meta } = route; const routeName = name as string; - let menuChildren: GlobalMenuOption[] | undefined; + let menuChildren: App.GlobalMenuOption[] | undefined; if (route.children) { menuChildren = transformAuthRouteToMenu(route.children); } - const menuItem: GlobalMenuOption = addPartialProps({ + const menuItem: App.GlobalMenuOption = addPartialProps({ menu: { key: routeName, label: meta.title, @@ -70,18 +70,18 @@ export function transformAuthRouteToMenu(routes: AuthRoute.Route[]): GlobalMenuO * @param activeKey - 当前路由的key * @param menus - 菜单数据 */ -export function getActiveKeyPathsOfMenus(activeKey: string, menus: GlobalMenuOption[]) { +export function getActiveKeyPathsOfMenus(activeKey: string, menus: App.GlobalMenuOption[]) { const keys = menus.map(menu => getActiveKeyPathsOfMenu(activeKey, menu)).flat(1); return keys; } -function getActiveKeyPathsOfMenu(activeKey: string, menu: GlobalMenuOption) { +function getActiveKeyPathsOfMenu(activeKey: string, menu: App.GlobalMenuOption) { const keys: string[] = []; if (activeKey.includes(menu.routeName)) { keys.push(menu.routeName); } if (menu.children) { - keys.push(...menu.children.map(item => getActiveKeyPathsOfMenu(activeKey, item as GlobalMenuOption)).flat(1)); + keys.push(...menu.children.map(item => getActiveKeyPathsOfMenu(activeKey, item as App.GlobalMenuOption)).flat(1)); } return keys; } diff --git a/src/utils/router/transform.ts b/src/utils/router/transform.ts new file mode 100644 index 000000000..f2d4addc4 --- /dev/null +++ b/src/utils/router/transform.ts @@ -0,0 +1,214 @@ +import type { RouteComponent, RouteRecordRaw } from 'vue-router'; +import { BasicLayout, BlankLayout } from '@/layouts'; +import { views } from '@/views'; +import { isFunction } from '@/utils'; + +type Lazy = () => Promise; + +type LayoutComponent = Record>; + +/** + * 获取布局的vue文件(懒加载的方式) + * @param layoutType - 布局类型 + */ +export function getLayoutComponent(layoutType: EnumType.LayoutComponentName) { + const layoutComponent: LayoutComponent = { + basic: BasicLayout, + blank: BlankLayout + }; + return layoutComponent[layoutType]; +} + +/** + * 获取页面导入的vue文件 + * @param routeKey - 路由key + */ +export function getViewComponent(routeKey: AuthRoute.LastDegreeRouteKey) { + if (!views[routeKey]) { + throw new Error(`路由“${routeKey}”没有对应的组件文件!`); + } + return setViewComponentName(views[routeKey], routeKey); +} + +interface ModuleComponent { + default: RouteComponent; +} + +/** 给页面组件设置名称 */ +function setViewComponentName(component: RouteComponent | Lazy, name: string) { + if (isAsyncComponent(component)) { + return async () => { + const result = await component(); + Object.assign(result.default, { name }); + return result; + }; + } + + Object.assign(component, { name }); + + return component; +} + +function isAsyncComponent(component: RouteComponent | Lazy): component is Lazy { + return isFunction(component); +} + +/** + * 是否有外链 + * @param item - 权限路由 + */ +function hasHref(item: AuthRoute.Route) { + return Boolean(item.meta.href); +} + +/** + * 是否有动态路由path + * @param item - 权限路由 + */ +function hasDynamicPath(item: AuthRoute.Route) { + return Boolean(item.meta.dynamicPath); +} + +/** + * 是否有路由组件 + * @param item - 权限路由 + */ +function hasComponent(item: AuthRoute.Route) { + return Boolean(item.component); +} + +/** + * 是否有子路由 + * @param item - 权限路由 + */ +function hasChildren(item: AuthRoute.Route) { + return Boolean(item.children && item.children.length); +} + +/** + * 是否是单层级路由 + * @param item - 权限路由 + */ +function isSingleRoute(item: AuthRoute.Route) { + return Boolean(item.meta.singleLayout); +} + +/** + * 将权限路由转换成vue路由 + * @param routes - 权限路由 + * @description 所有多级路由都会被转换成二级路由 + */ +export function transformAuthRouteToVueRoutes(routes: AuthRoute.Route[]) { + return routes.map(route => transformAuthRouteToVueRoute(route)).flat(1); +} + +type ComponentAction = Record void>; + +/** + * 将单个权限路由转换成vue路由 + * @param item - 单个权限路由 + */ +export function transformAuthRouteToVueRoute(item: AuthRoute.Route) { + const resultRoute: RouteRecordRaw[] = []; + + const itemRoute = { ...item } as RouteRecordRaw; + + // 动态path + if (hasDynamicPath(item)) { + Object.assign(itemRoute, { path: item.meta.dynamicPath }); + } + + // 外链路由 + if (hasHref(item)) { + Object.assign(itemRoute, { component: getViewComponent('404') }); + } + + // 路由组件 + if (hasComponent(item)) { + const action: ComponentAction = { + basic() { + itemRoute.component = getLayoutComponent('basic'); + }, + blank() { + itemRoute.component = getLayoutComponent('blank'); + }, + multi() { + // 多级路由一定有子路由 + if (hasChildren(item)) { + Object.assign(itemRoute, { meta: { ...itemRoute.meta, multi: true } }); + delete itemRoute.component; + } else { + window.console.error('多级路由缺少子路由: ', item); + } + }, + self() { + itemRoute.component = getViewComponent(item.name as AuthRoute.LastDegreeRouteKey); + } + }; + try { + if (item.component) { + action[item.component](); + } else { + window.console.error('路由组件解析失败: ', item); + } + } catch { + window.console.error('路由组件解析失败: ', item); + } + } + + // 注意:单独路由没有children + if (isSingleRoute(item)) { + if (hasChildren(item)) { + window.console.error('单独路由不应该有子路由: ', item); + } + + // 捕获无效路由的需特殊处理 + if (item.name === 'not-found') { + itemRoute.children = [ + { + path: '', + name: item.name, + component: getViewComponent('not-found') + } + ]; + } else { + const parentPath = `${itemRoute.path}-parent` as AuthRouteUtils.SingleRouteKey; + + const layout = item.meta.singleLayout === 'basic' ? getLayoutComponent('basic') : getLayoutComponent('blank'); + + const parentRoute: RouteRecordRaw = { + path: parentPath, + component: layout, + redirect: item.path, + children: [itemRoute] + }; + + return [parentRoute]; + } + } + + // 子路由 + if (hasChildren(item)) { + const children = (item.children as AuthRoute.Route[]).map(child => transformAuthRouteToVueRoute(child)).flat(); + + // 找出第一个不为多级路由中间级的子路由路径作为重定向路径 + const redirectPath = (children.find(v => !v.meta?.multi)?.path || '/') as AuthRoute.RoutePath; + + if (redirectPath === '/') { + window.console.error('该多级路由没有有效的子路径', item); + } + + if (item.component === 'multi') { + // 多级路由,将子路由提取出来变成同级 + resultRoute.push(...children); + delete itemRoute.children; + } else { + itemRoute.children = children; + } + itemRoute.redirect = redirectPath; + } + + resultRoute.push(itemRoute); + + return resultRoute; +} diff --git a/src/views/system-view/no-permission/index.vue b/src/views/_builtin/403/index.vue similarity index 100% rename from src/views/system-view/no-permission/index.vue rename to src/views/_builtin/403/index.vue diff --git a/src/views/system-view/not-found-page/index.vue b/src/views/_builtin/404/index.vue similarity index 100% rename from src/views/system-view/not-found-page/index.vue rename to src/views/_builtin/404/index.vue diff --git a/src/views/system-view/service-error/index.vue b/src/views/_builtin/500/index.vue similarity index 100% rename from src/views/system-view/service-error/index.vue rename to src/views/_builtin/500/index.vue diff --git a/src/views/system-view/constant-page/index.vue b/src/views/_builtin/constant-page/index.vue similarity index 100% rename from src/views/system-view/constant-page/index.vue rename to src/views/_builtin/constant-page/index.vue diff --git a/src/views/system-view/login/components/BindWechat/index.vue b/src/views/_builtin/login/components/BindWechat/index.vue similarity index 100% rename from src/views/system-view/login/components/BindWechat/index.vue rename to src/views/_builtin/login/components/BindWechat/index.vue diff --git a/src/views/system-view/login/components/CodeLogin/index.vue b/src/views/_builtin/login/components/CodeLogin/index.vue similarity index 100% rename from src/views/system-view/login/components/CodeLogin/index.vue rename to src/views/_builtin/login/components/CodeLogin/index.vue diff --git a/src/views/system-view/login/components/LoginBg/components/CornerBottom.vue b/src/views/_builtin/login/components/LoginBg/components/CornerBottom.vue similarity index 100% rename from src/views/system-view/login/components/LoginBg/components/CornerBottom.vue rename to src/views/_builtin/login/components/LoginBg/components/CornerBottom.vue diff --git a/src/views/system-view/login/components/LoginBg/components/CornerTop.vue b/src/views/_builtin/login/components/LoginBg/components/CornerTop.vue similarity index 100% rename from src/views/system-view/login/components/LoginBg/components/CornerTop.vue rename to src/views/_builtin/login/components/LoginBg/components/CornerTop.vue diff --git a/src/views/system-view/login/components/LoginBg/components/index.ts b/src/views/_builtin/login/components/LoginBg/components/index.ts similarity index 100% rename from src/views/system-view/login/components/LoginBg/components/index.ts rename to src/views/_builtin/login/components/LoginBg/components/index.ts diff --git a/src/views/system-view/login/components/LoginBg/index.vue b/src/views/_builtin/login/components/LoginBg/index.vue similarity index 100% rename from src/views/system-view/login/components/LoginBg/index.vue rename to src/views/_builtin/login/components/LoginBg/index.vue diff --git a/src/views/system-view/login/components/PwdLogin/components/OtherAccount.vue b/src/views/_builtin/login/components/PwdLogin/components/OtherAccount.vue similarity index 100% rename from src/views/system-view/login/components/PwdLogin/components/OtherAccount.vue rename to src/views/_builtin/login/components/PwdLogin/components/OtherAccount.vue diff --git a/src/views/system-view/login/components/PwdLogin/components/OtherLogin.vue b/src/views/_builtin/login/components/PwdLogin/components/OtherLogin.vue similarity index 100% rename from src/views/system-view/login/components/PwdLogin/components/OtherLogin.vue rename to src/views/_builtin/login/components/PwdLogin/components/OtherLogin.vue diff --git a/src/views/system-view/login/components/PwdLogin/components/index.ts b/src/views/_builtin/login/components/PwdLogin/components/index.ts similarity index 100% rename from src/views/system-view/login/components/PwdLogin/components/index.ts rename to src/views/_builtin/login/components/PwdLogin/components/index.ts diff --git a/src/views/system-view/login/components/PwdLogin/index.vue b/src/views/_builtin/login/components/PwdLogin/index.vue similarity index 100% rename from src/views/system-view/login/components/PwdLogin/index.vue rename to src/views/_builtin/login/components/PwdLogin/index.vue diff --git a/src/views/system-view/login/components/Register/index.vue b/src/views/_builtin/login/components/Register/index.vue similarity index 100% rename from src/views/system-view/login/components/Register/index.vue rename to src/views/_builtin/login/components/Register/index.vue diff --git a/src/views/system-view/login/components/ResetPwd/index.vue b/src/views/_builtin/login/components/ResetPwd/index.vue similarity index 100% rename from src/views/system-view/login/components/ResetPwd/index.vue rename to src/views/_builtin/login/components/ResetPwd/index.vue diff --git a/src/views/system-view/login/components/index.ts b/src/views/_builtin/login/components/index.ts similarity index 100% rename from src/views/system-view/login/components/index.ts rename to src/views/_builtin/login/components/index.ts diff --git a/src/views/system-view/login/index.vue b/src/views/_builtin/login/index.vue similarity index 100% rename from src/views/system-view/login/index.vue rename to src/views/_builtin/login/index.vue diff --git a/src/views/system-view/not-found/index.vue b/src/views/_builtin/not-found/index.vue similarity index 100% rename from src/views/system-view/not-found/index.vue rename to src/views/_builtin/not-found/index.vue diff --git a/src/views/document/project-link/index.vue b/src/views/document/project-link/index.vue new file mode 100644 index 000000000..fb62d1f05 --- /dev/null +++ b/src/views/document/project-link/index.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/src/views/index.ts b/src/views/index.ts index bcadfde95..500a9d46d 100644 --- a/src/views/index.ts +++ b/src/views/index.ts @@ -1,31 +1,45 @@ -import type { Component } from 'vue'; +import type { RouteComponent } from 'vue-router'; -type ViewComponent = Record Promise>; - -const importViews = import.meta.glob('./**/index.vue') as ViewComponent; - -const COMPONENTS_KEY = 'components'; -const PREFIX = './'; -const SUFFIX = '/index.vue'; -const PATH_SPLIT_MARK = '/'; -const ROUTE_KEY_SPLIT_MARK = '_'; -/** 系统的内置路由,该文件夹名称不作为RouteKey */ -const SYSTEM_VIEW = 'system-view_'; - -/** 过滤掉组件文件 */ -const viewKeys = Object.keys(importViews).filter(key => !key.includes(COMPONENTS_KEY)); - -function getViewComponent() { - const components: ViewComponent = {}; - viewKeys.forEach(key => { - const routeKey = key - .replace(PREFIX, '') - .replace(SUFFIX, '') - .replace(new RegExp(PATH_SPLIT_MARK, 'g'), ROUTE_KEY_SPLIT_MARK) - .replace(SYSTEM_VIEW, ''); - components[routeKey] = importViews[key]; - }); - return components; -} - -export const views = getViewComponent(); +export const views: Record Promise)> = { + 403: () => import('./_builtin/403/index.vue'), + 404: () => import('./_builtin/404/index.vue'), + 500: () => import('./_builtin/500/index.vue'), + 'constant-page': () => import('./_builtin/constant-page/index.vue'), + login: () => import('./_builtin/login/index.vue'), + 'not-found': () => import('./_builtin/not-found/index.vue'), + about: () => import('./about/index.vue'), + 'auth-demo_permission': () => import('./auth-demo/permission/index.vue'), + 'auth-demo_super': () => import('./auth-demo/super/index.vue'), + component_button: () => import('./component/button/index.vue'), + component_card: () => import('./component/card/index.vue'), + component_table: () => import('./component/table/index.vue'), + dashboard_analysis: () => import('./dashboard/analysis/index.vue'), + dashboard_workbench: () => import('./dashboard/workbench/index.vue'), + document_naive: () => import('./document/naive/index.vue'), + 'document_project-link': () => import('./document/project-link/index.vue'), + document_project: () => import('./document/project/index.vue'), + document_vite: () => import('./document/vite/index.vue'), + document_vue: () => import('./document/vue/index.vue'), + exception_403: () => import('./exception/403/index.vue'), + exception_404: () => import('./exception/404/index.vue'), + exception_500: () => import('./exception/500/index.vue'), + 'function_tab-detail': () => import('./function/tab-detail/index.vue'), + 'function_tab-multi-detail': () => import('./function/tab-multi-detail/index.vue'), + function_tab: () => import('./function/tab/index.vue'), + management_auth: () => import('./management/auth/index.vue'), + management_role: () => import('./management/role/index.vue'), + management_route: () => import('./management/route/index.vue'), + management_user: () => import('./management/user/index.vue'), + 'multi-menu_first_second-new_third': () => import('./multi-menu/first/second-new/third/index.vue'), + 'multi-menu_first_second': () => import('./multi-menu/first/second/index.vue'), + plugin_charts_antv: () => import('./plugin/charts/antv/index.vue'), + plugin_charts_echarts: () => import('./plugin/charts/echarts/index.vue'), + plugin_copy: () => import('./plugin/copy/index.vue'), + plugin_editor_markdown: () => import('./plugin/editor/markdown/index.vue'), + plugin_editor_quill: () => import('./plugin/editor/quill/index.vue'), + plugin_icon: () => import('./plugin/icon/index.vue'), + plugin_map: () => import('./plugin/map/index.vue'), + plugin_print: () => import('./plugin/print/index.vue'), + plugin_swiper: () => import('./plugin/swiper/index.vue'), + plugin_video: () => import('./plugin/video/index.vue') +};