From f862530142ca3948c91878a00f09aab7cfa2ef70 Mon Sep 17 00:00:00 2001 From: Timi Date: Tue, 8 Jul 2025 16:33:11 +0800 Subject: [PATCH] Initial project --- .editorconfig | 12 + .eslintignore | 15 + .eslintrc.js | 78 + .gitignore | 144 +- .npmrc | 1 + README.md | 19 +- examples/Root.vue | 21 + examples/main.ts | 10 + examples/vite-env.d.ts | 7 + index.html | 12 + package.json | 66 + pnpm-lock.yaml | 3598 +++++++++++++++++ src/api/CommentAPI.ts | 36 + src/api/CommonAPI.ts | 28 + src/api/DeveloperAPI.ts | 11 + src/api/UserAPI.ts | 85 + src/assets/icon.json | 151 + src/assets/img/default.png | Bin 0 -> 183 bytes src/assets/img/input.png | Bin 0 -> 146 bytes src/assets/img/link.png | Bin 0 -> 207 bytes src/assets/style/timi-web.less | 213 + src/assets/style/variable.less | 58 + .../flower-fall/assets/petal.png | Bin 0 -> 370 bytes .../background-effect/flower-fall/index.ts | 5 + .../background-effect/flower-fall/index.vue | 155 + src/components/background-effect/style.less | 8 + src/components/captcha/index.ts | 5 + src/components/captcha/index.vue | 46 + src/components/copyright/assets/bottom.png | Bin 0 -> 786 bytes src/components/copyright/index.ts | 5 + src/components/copyright/index.vue | 45 + src/components/empty-tips/index.ts | 5 + src/components/empty-tips/index.vue | 27 + src/components/icon/index.ts | 5 + src/components/icon/index.vue | 62 + src/components/index.ts | 37 + src/components/loading/index.ts | 5 + src/components/loading/index.vue | 153 + .../markdown-editor/CalcTextareaHeight.ts | 112 + src/components/markdown-editor/index.ts | 5 + src/components/markdown-editor/index.vue | 192 + src/components/markdown-view/index.ts | 6 + src/components/markdown-view/index.vue | 42 + src/components/markdown-view/style.less | 341 ++ src/components/popup/index.ts | 5 + src/components/popup/index.vue | 26 + src/components/user-level/icon.png | Bin 0 -> 745 bytes src/components/user-level/index.ts | 5 + src/components/user-level/index.vue | 25 + src/index.ts | 90 + src/store/device.ts | 110 + src/store/user.ts | 77 + src/types.ts | 43 + src/types/Attachment.ts | 24 + src/types/Comment.ts | 78 + src/types/Developer.ts | 6 + src/types/Model.ts | 79 + src/types/Setting.ts | 28 + src/types/Template.ts | 6 + src/types/User.ts | 89 + src/utils/Cooker.ts | 31 + src/utils/Events.ts | 106 + src/utils/IOSize.ts | 80 + src/utils/IconMapper.ts | 26 + src/utils/Markdown.ts | 209 + src/utils/MethodLocker.ts | 48 + src/utils/Network.ts | 61 + src/utils/Prismjs.ts | 96 + src/utils/Resizer.ts | 83 + src/utils/Scroller.ts | 74 + src/utils/SettingMapper.ts | 94 + src/utils/Storage.ts | 129 + src/utils/Time.ts | 97 + src/utils/Toolkit.ts | 354 ++ src/utils/directives/Draggable.ts | 130 + src/utils/directives/Popup.ts | 120 + tsconfig.json | 44 + tsconfig.node.json | 11 + tsconfig.types.json | 10 + vite.config.ts | 110 + 80 files changed, 8301 insertions(+), 129 deletions(-) create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .npmrc create mode 100644 examples/Root.vue create mode 100644 examples/main.ts create mode 100644 examples/vite-env.d.ts create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 src/api/CommentAPI.ts create mode 100644 src/api/CommonAPI.ts create mode 100644 src/api/DeveloperAPI.ts create mode 100644 src/api/UserAPI.ts create mode 100644 src/assets/icon.json create mode 100644 src/assets/img/default.png create mode 100644 src/assets/img/input.png create mode 100644 src/assets/img/link.png create mode 100644 src/assets/style/timi-web.less create mode 100644 src/assets/style/variable.less create mode 100644 src/components/background-effect/flower-fall/assets/petal.png create mode 100644 src/components/background-effect/flower-fall/index.ts create mode 100644 src/components/background-effect/flower-fall/index.vue create mode 100644 src/components/background-effect/style.less create mode 100644 src/components/captcha/index.ts create mode 100644 src/components/captcha/index.vue create mode 100644 src/components/copyright/assets/bottom.png create mode 100644 src/components/copyright/index.ts create mode 100644 src/components/copyright/index.vue create mode 100644 src/components/empty-tips/index.ts create mode 100644 src/components/empty-tips/index.vue create mode 100644 src/components/icon/index.ts create mode 100644 src/components/icon/index.vue create mode 100644 src/components/index.ts create mode 100644 src/components/loading/index.ts create mode 100644 src/components/loading/index.vue create mode 100644 src/components/markdown-editor/CalcTextareaHeight.ts create mode 100644 src/components/markdown-editor/index.ts create mode 100644 src/components/markdown-editor/index.vue create mode 100644 src/components/markdown-view/index.ts create mode 100644 src/components/markdown-view/index.vue create mode 100644 src/components/markdown-view/style.less create mode 100644 src/components/popup/index.ts create mode 100644 src/components/popup/index.vue create mode 100644 src/components/user-level/icon.png create mode 100644 src/components/user-level/index.ts create mode 100644 src/components/user-level/index.vue create mode 100644 src/index.ts create mode 100644 src/store/device.ts create mode 100644 src/store/user.ts create mode 100644 src/types.ts create mode 100644 src/types/Attachment.ts create mode 100644 src/types/Comment.ts create mode 100644 src/types/Developer.ts create mode 100644 src/types/Model.ts create mode 100644 src/types/Setting.ts create mode 100644 src/types/Template.ts create mode 100644 src/types/User.ts create mode 100644 src/utils/Cooker.ts create mode 100644 src/utils/Events.ts create mode 100644 src/utils/IOSize.ts create mode 100644 src/utils/IconMapper.ts create mode 100644 src/utils/Markdown.ts create mode 100644 src/utils/MethodLocker.ts create mode 100644 src/utils/Network.ts create mode 100644 src/utils/Prismjs.ts create mode 100644 src/utils/Resizer.ts create mode 100644 src/utils/Scroller.ts create mode 100644 src/utils/SettingMapper.ts create mode 100644 src/utils/Storage.ts create mode 100644 src/utils/Time.ts create mode 100644 src/utils/Toolkit.ts create mode 100644 src/utils/directives/Draggable.ts create mode 100644 src/utils/directives/Popup.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 tsconfig.types.json create mode 100644 vite.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4a5d694 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..1a7299d --- /dev/null +++ b/.eslintignore @@ -0,0 +1,15 @@ +*.sh +node_modules +*.md +*.woff +*.ttf +.vscode +.idea +dist +/public +/docs +.husky +.local +.eslintrc.js +dist +pnpm-lock.yaml diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..d25856a --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,78 @@ +module.exports = { + "env": { + "browser": true, + "es2021": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:vue/vue3-essential", + "./.eslintrc-auto-import.json" + ], + "overrides": [ + { + "env": { + "node": true + }, + "files": [ + ".eslintrc.{js}" + ], + "parserOptions": { + "sourceType": "script" + } + } + ], + "parserOptions": { + "ecmaVersion": "latest", + "parser": "@typescript-eslint/parser", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint", + "vue" + ], + "rules": { // 注释是解释使用该设置的效果,而不是设置属性本身 + "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", + "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", + // 其他 + "camelcase": 2, // 变量驼峰式命名 + "quotes": ["error", "double"], // 强制双引字符串 + "eqeqeq": ["error", "always"], // 强制全等比较 + "semi": ["error", "always"], // 强制语句分号结束 + "max-len": [ + "error", + { + "code": 180 + } + ], + // 逗号 + "comma-style": [2, "last"], // 逗号出现在行末 [first, last] + "comma-dangle": [2, "never"], // 数组或对象不可带最后一个逗号 [never, always, always-multiline] + // 空格 + "no-trailing-spaces": "error", // 禁止行末存在空格 + "comma-spacing": [2, { "before": false, "after": true }], // 逗号后需要空格 + "semi-spacing": ["error", { "before": false, "after": true }], // 分号后需要空格 + "computed-property-spacing": [2, "never"], // 以方括号取对象属性时,[ 后面和 ] 前面需要空格, [never, always] + "space-before-function-paren": ["error", { // 函数括号前空格 + "anonymous": "always", // 针对匿名函数表达式,比如 function () {} + "named": "never", // 针对命名函数表达式,比如 function foo() {} + "asyncArrow": "always" // 针对异步的箭头函数表达式,比如 async () => {} + }], + // 缩进 + "no-mixed-spaces-and-tabs": "off", // 允许混合缩进 + "no-tabs": ["error", { allowIndentationTabs: true }], // 使用 Tab 缩进 + "indent": ["error", "tab", { // Tab 缩进相关 + SwitchCase: 1 // Switch Case 缩进一级 + }], + // 框架 + "@typescript-eslint/ban-types": "off", // TS 允许空对象 + "@typescript-eslint/no-empty-function": "off", // TS 允许空函数 + "@typescript-eslint/no-explicit-any": "off", // TS 允许 any 类型 + "@typescript-eslint/explicit-module-boundary-types": "off", // TS 允许显式模块边界类型? + "vue/no-multiple-template-root": "off", // Vue3 支持多个根节点 + "@typescript-eslint/no-this-alias": "off", // 允许 this 变量本地化 + "vue/no-v-model-argument": "off", // 允许 v-model 支持参数 + "vue/multi-word-component-names": "off" // 允许单个词语的组件名 + } +}; diff --git a/.gitignore b/.gitignore index 2309cc8..ea27417 100644 --- a/.gitignore +++ b/.gitignore @@ -1,138 +1,28 @@ -# ---> Node # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* +pnpm-debug.log* lerna-debug.log* -.pnpm-debug.log* -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt +node_modules dist +dist-ssr +*.local -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# vitepress build output -**/.vitepress/dist - -# vitepress cache directory -**/.vitepress/cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +/.eslintrc-auto-import.json +/components.d.ts +/examples/auto-imports.d.ts diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..bf2e764 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +shamefully-hoist=true diff --git a/README.md b/README.md index 632c6f7..ef72fd5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,18 @@ -# timi-web +# Vue 3 + TypeScript + Vite -Timi 前端通用组件库 \ No newline at end of file +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + diff --git a/examples/main.ts b/examples/main.ts new file mode 100644 index 0000000..b032158 --- /dev/null +++ b/examples/main.ts @@ -0,0 +1,10 @@ +import { createApp } from "vue"; +import Root from "./Root.vue"; +import TimiWebUI, { axios, VPopup } from "timi-web"; // 本地开发 + +axios.defaults.baseURL = "http://localhost:8091"; + +const app = createApp(Root); +app.use(TimiWebUI); +app.directive("popup", VPopup); +app.mount("#root"); diff --git a/examples/vite-env.d.ts b/examples/vite-env.d.ts new file mode 100644 index 0000000..0c2fa44 --- /dev/null +++ b/examples/vite-env.d.ts @@ -0,0 +1,7 @@ +declare module "*.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent<{}, {}, any>; + export default component; +} + +declare module "prismjs"; diff --git a/index.html b/index.html new file mode 100644 index 0000000..df22728 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + Vite + Vue + TS + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..3b1981a --- /dev/null +++ b/package.json @@ -0,0 +1,66 @@ +{ + "name": "timi-web", + "main": "./dist/timi-web.umd.js", + "types": "./dist/src/index.d.ts", + "module": "./dist/timi-web.mjs", + "style": "./dist/style.css", + "private": false, + "version": "1.0.0", + "license": "MIT", + "scripts": { + "dev": "vite", + "dev:doc": "pnpm run -C docs dev", + "build": "vue-tsc --noEmit && vite build", + "build:doc": "pnpm run -C docs build" + }, + "files": [ + "dist/**", + "src/**", + "examples/**", + "README.md", + "package.json" + ], + "exports": { + ".": { + "import": "./dist/timi-web.mjs", + "require": "./dist/timi-web.umd.js" + }, + "./style.css": "./dist/timi-web.css" + }, + "engines": { + "node": ">=16.0.0" + }, + "dependencies": { + "axios": "1.8.2", + "less": "4.3.0", + "marked": "^15.0.11", + "marked-gfm-heading-id": "^4.1.1", + "marked-highlight": "^2.2.1", + "marked-mangle": "^1.1.10", + "prismjs": "1.30.0", + "terser": "^5.39.0" + }, + "devDependencies": { + "@types/marked": "^6.0.0", + "@types/node": "^22.15.2", + "@types/prismjs": "1.26.5", + "@typescript-eslint/eslint-plugin": "^8.31.0", + "@typescript-eslint/parser": "^8.31.0", + "@vitejs/plugin-vue": "^5.2.3", + "eslint": "^9.25.1", + "eslint-config-prettier": "^10.1.2", + "eslint-define-config": "^2.1.0", + "eslint-plugin-prettier": "^5.2.6", + "eslint-plugin-vue": "^10.0.0", + "prettier": "^3.5.3", + "typescript": "^5.8.3", + "unplugin-auto-import": "^19.1.2", + "unplugin-vue-components": "^28.5.0", + "vite": "6.2.6", + "vite-plugin-dts": "^4.5.3", + "vite-plugin-prismjs": "^0.0.11", + "vite-plugin-vue-setup-extend": "^0.4.0", + "vue": "^3.5.13", + "vue-tsc": "^2.2.10" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..96eb384 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3598 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + axios: + specifier: 1.8.2 + version: 1.8.2 + less: + specifier: 4.3.0 + version: 4.3.0 + marked: + specifier: ^15.0.11 + version: 15.0.11 + marked-gfm-heading-id: + specifier: ^4.1.1 + version: 4.1.1(marked@15.0.11) + marked-highlight: + specifier: ^2.2.1 + version: 2.2.1(marked@15.0.11) + marked-mangle: + specifier: ^1.1.10 + version: 1.1.10(marked@15.0.11) + prismjs: + specifier: 1.30.0 + version: 1.30.0 + terser: + specifier: ^5.39.0 + version: 5.39.0 + devDependencies: + '@types/marked': + specifier: ^6.0.0 + version: 6.0.0 + '@types/node': + specifier: ^22.15.2 + version: 22.15.2 + '@types/prismjs': + specifier: 1.26.5 + version: 1.26.5 + '@typescript-eslint/eslint-plugin': + specifier: ^8.31.0 + version: 8.31.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(typescript@5.8.3) + '@typescript-eslint/parser': + specifier: ^8.31.0 + version: 8.31.0(eslint@9.25.1)(typescript@5.8.3) + '@vitejs/plugin-vue': + specifier: ^5.2.3 + version: 5.2.3(vite@6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0))(vue@3.5.13(typescript@5.8.3)) + eslint: + specifier: ^9.25.1 + version: 9.25.1 + eslint-config-prettier: + specifier: ^10.1.2 + version: 10.1.2(eslint@9.25.1) + eslint-define-config: + specifier: ^2.1.0 + version: 2.1.0 + eslint-plugin-prettier: + specifier: ^5.2.6 + version: 5.2.6(eslint-config-prettier@10.1.2(eslint@9.25.1))(eslint@9.25.1)(prettier@3.5.3) + eslint-plugin-vue: + specifier: ^10.0.0 + version: 10.0.0(eslint@9.25.1)(vue-eslint-parser@9.4.3(eslint@9.25.1)) + prettier: + specifier: ^3.5.3 + version: 3.5.3 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + unplugin-auto-import: + specifier: ^19.1.2 + version: 19.1.2 + unplugin-vue-components: + specifier: ^28.5.0 + version: 28.5.0(@babel/parser@7.26.9)(vue@3.5.13(typescript@5.8.3)) + vite: + specifier: 6.2.6 + version: 6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0) + vite-plugin-dts: + specifier: ^4.5.3 + version: 4.5.3(@types/node@22.15.2)(rollup@4.40.0)(typescript@5.8.3)(vite@6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0)) + vite-plugin-prismjs: + specifier: ^0.0.11 + version: 0.0.11(prismjs@1.30.0) + vite-plugin-vue-setup-extend: + specifier: ^0.4.0 + version: 0.4.0(vite@6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0)) + vue: + specifier: ^3.5.13 + version: 3.5.13(typescript@5.8.3) + vue-tsc: + specifier: ^2.2.10 + version: 2.2.10(typescript@5.8.3) + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.23.5': + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.0': + resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.23.6': + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.23.4': + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.0': + resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.0': + resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.3': + resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.3': + resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.3': + resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.3': + resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.3': + resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.3': + resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.3': + resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.3': + resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.3': + resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.3': + resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.3': + resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.3': + resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.3': + resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.3': + resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.3': + resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.1': + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.25.1': + resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@microsoft/api-extractor-model@7.30.3': + resolution: {integrity: sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w==} + + '@microsoft/api-extractor@7.50.1': + resolution: {integrity: sha512-L18vz0ARLNaBLKwWe0DdEf7eijDsb7ERZspgZK7PxclLoQrc+9hJZo8y4OVfCHxNVyxlwVywY2WdE/3pOFViLQ==} + hasBin: true + + '@microsoft/tsdoc-config@0.17.1': + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.2.4': + resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.40.0': + resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.40.0': + resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.40.0': + resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.40.0': + resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.40.0': + resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.40.0': + resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.40.0': + resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.40.0': + resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.40.0': + resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.40.0': + resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@5.11.0': + resolution: {integrity: sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + + '@rushstack/terminal@0.15.0': + resolution: {integrity: sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@4.23.5': + resolution: {integrity: sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/marked@6.0.0': + resolution: {integrity: sha512-jmjpa4BwUsmhxcfsgUit/7A9KbrC48Q0q8KvnY107ogcjGgTFDlIL3RpihNpx2Mu1hM4mdFQjoVc4O6JoGKHsA==} + deprecated: This is a stub types definition. marked provides its own type definitions, so you do not need this installed. + + '@types/node@22.15.2': + resolution: {integrity: sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==} + + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + + '@typescript-eslint/eslint-plugin@8.31.0': + resolution: {integrity: sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.31.0': + resolution: {integrity: sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.31.0': + resolution: {integrity: sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.31.0': + resolution: {integrity: sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.31.0': + resolution: {integrity: sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.31.0': + resolution: {integrity: sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.31.0': + resolution: {integrity: sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.31.0': + resolution: {integrity: sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-vue@5.2.3': + resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.11': + resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} + + '@volar/source-map@2.4.11': + resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} + + '@volar/typescript@2.4.11': + resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} + + '@vue/compiler-core@3.4.21': + resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.4.21': + resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.4.21': + resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.4.21': + resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/language-core@2.2.10': + resolution: {integrity: sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.4.21': + resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + + alien-signals@1.0.4: + resolution: {integrity: sha512-DJqqQD3XcsaQcQ1s+iE2jDUZmmQpXwHiR6fCAim/w87luaW+vmLY8fMlrdkmRwzaFXhkxf3rqPCR59tKVv1MDw==} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.8.2: + resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==} + + babel-plugin-prismjs@2.1.0: + resolution: {integrity: sha512-ehzSKYfeAz4U78zi/sfwsjDPlq0LvDKxNefcZTJ/iKBu+plsHsLqZhUeGf1+82LAcA35UZGbU6ksEx2Utphc/g==} + peerDependencies: + prismjs: ^1.18.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001599: + resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + electron-to-chromium@1.4.708: + resolution: {integrity: sha512-iWgEEvREL4GTXXHKohhh33+6Y8XkPI5eHihDmm8zUk5Zo7HICEW+wI/j5kJ2tbuNUCXJ/sNXa03ajW635DiJXA==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + esbuild@0.25.3: + resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@10.1.2: + resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-define-config@2.1.0: + resolution: {integrity: sha512-QUp6pM9pjKEVannNAbSJNeRuYwW3LshejfyBBpjeMGaJjaDUpVps4C6KVR8R7dWZnD3i0synmrE36znjTkJvdQ==} + engines: {node: '>=18.0.0', npm: '>=9.0.0', pnpm: '>=8.6.0'} + + eslint-plugin-prettier@5.2.6: + resolution: {integrity: sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-vue@10.0.0: + resolution: {integrity: sha512-XKckedtajqwmaX6u1VnECmZ6xJt+YvlmMzBPZd+/sI3ub2lpYZyFnsyWo7c3nMOQKJQudeyk1lw/JxdgeKT64w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + vue-eslint-parser: ^10.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.25.1: + resolution: {integrity: sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + exsolve@1.0.5: + resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + less@4.3.0: + resolution: {integrity: sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==} + engines: {node: '>=14'} + hasBin: true + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + local-pkg@1.0.0: + resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} + engines: {node: '>=14'} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + marked-gfm-heading-id@4.1.1: + resolution: {integrity: sha512-EeQZieAQmsI6c2tWLx0ETd0VjPwLV8qi+HT0dIsfVMERm0rCIuXfRvZXJbo1SgUi++lmuR1LVY+QzgNiLNvVpw==} + peerDependencies: + marked: '>=13 <16' + + marked-highlight@2.2.1: + resolution: {integrity: sha512-SiCIeEiQbs9TxGwle9/OwbOejHCZsohQRaNTY2u8euEXYt2rYUFoiImUirThU3Gd/o6Q1gHGtH9qloHlbJpNIA==} + peerDependencies: + marked: '>=4 <16' + + marked-mangle@1.1.10: + resolution: {integrity: sha512-TrpN67SMJJdzXXWIzOd/QmnpsC5o1B44PUYaG2bh1XEbqVjA0UCI2ijFuE5LWESwKeI2gCP5FqcUHRGQwFtDIA==} + peerDependencies: + marked: '>=4 <16' + + marked@15.0.11: + resolution: {integrity: sha512-1BEXAU2euRCG3xwgLVT1y0xbJEld1XOrmRJpUwRCcy7rxhSCwMrmEu9LXoPhHSCJG41V7YcQ2mjKRr5BA3ITIA==} + engines: {node: '>= 18'} + hasBin: true + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + + postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.40.0: + resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.11.4: + resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + terser@5.39.0: + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + engines: {node: '>=10'} + hasBin: true + + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unimport@4.1.2: + resolution: {integrity: sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==} + engines: {node: '>=18.12.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin-auto-import@19.1.2: + resolution: {integrity: sha512-EkxNIJm4ZPYtV7rRaPBKnsscgTaifIZNrJF5DkMffTxkUOJOlJuKVypA6YBSBOjzPJDTFPjfVmCQPoBuOO+YYQ==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^3.2.2 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + + unplugin-utils@0.2.4: + resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} + engines: {node: '>=18.12.0'} + + unplugin-vue-components@28.5.0: + resolution: {integrity: sha512-o7fMKU/uI8NiP+E0W62zoduuguWqB0obTfHFtbr1AP2uo2lhUPnPttWUE92yesdiYfo9/0hxIrj38FMc1eaySg==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin@2.3.2: + resolution: {integrity: sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w==} + engines: {node: '>=18.12.0'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite-plugin-dts@4.5.3: + resolution: {integrity: sha512-P64VnD00dR+e8S26ESoFELqc17+w7pKkwlBpgXteOljFyT0zDwD8hH4zXp49M/kciy//7ZbVXIwQCekBJjfWzA==} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite-plugin-prismjs@0.0.11: + resolution: {integrity: sha512-20NBQxg/zH+3FTrlU6BQTob720xkuXNYtrx7psAQ4E6pMcRDeLEK77QU9kXURU587+f2To7ASH1JVTGbXVV/vQ==} + engines: {node: '>=12.0.0'} + + vite-plugin-vue-setup-extend@0.4.0: + resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==} + peerDependencies: + vite: '>=2.0.0' + + vite@6.2.6: + resolution: {integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-tsc@2.2.10: + resolution: {integrity: sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.23.5': + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + '@babel/compat-data@7.23.5': {} + + '@babel/core@7.24.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/helpers': 7.24.0 + '@babel/parser': 7.24.5 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.23.6': + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.23.6': + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-imports@7.22.15': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + '@babel/helper-simple-access@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-split-export-declaration@7.22.6': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-string-parser@7.23.4': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.24.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.23.4': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/parser@7.24.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/parser@7.26.9': + dependencies: + '@babel/types': 7.26.9 + + '@babel/template@7.24.0': + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.0 + + '@babel/traverse@7.24.0': + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@babel/types@7.26.9': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@esbuild/aix-ppc64@0.25.3': + optional: true + + '@esbuild/android-arm64@0.25.3': + optional: true + + '@esbuild/android-arm@0.25.3': + optional: true + + '@esbuild/android-x64@0.25.3': + optional: true + + '@esbuild/darwin-arm64@0.25.3': + optional: true + + '@esbuild/darwin-x64@0.25.3': + optional: true + + '@esbuild/freebsd-arm64@0.25.3': + optional: true + + '@esbuild/freebsd-x64@0.25.3': + optional: true + + '@esbuild/linux-arm64@0.25.3': + optional: true + + '@esbuild/linux-arm@0.25.3': + optional: true + + '@esbuild/linux-ia32@0.25.3': + optional: true + + '@esbuild/linux-loong64@0.25.3': + optional: true + + '@esbuild/linux-mips64el@0.25.3': + optional: true + + '@esbuild/linux-ppc64@0.25.3': + optional: true + + '@esbuild/linux-riscv64@0.25.3': + optional: true + + '@esbuild/linux-s390x@0.25.3': + optional: true + + '@esbuild/linux-x64@0.25.3': + optional: true + + '@esbuild/netbsd-arm64@0.25.3': + optional: true + + '@esbuild/netbsd-x64@0.25.3': + optional: true + + '@esbuild/openbsd-arm64@0.25.3': + optional: true + + '@esbuild/openbsd-x64@0.25.3': + optional: true + + '@esbuild/sunos-x64@0.25.3': + optional: true + + '@esbuild/win32-arm64@0.25.3': + optional: true + + '@esbuild/win32-ia32@0.25.3': + optional: true + + '@esbuild/win32-x64@0.25.3': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.25.1)': + dependencies: + eslint: 9.25.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.20.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.1': {} + + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.25.1': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@microsoft/api-extractor-model@7.30.3(@types/node@22.15.2)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.11.0(@types/node@22.15.2) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.50.1(@types/node@22.15.2)': + dependencies: + '@microsoft/api-extractor-model': 7.30.3(@types/node@22.15.2) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.11.0(@types/node@22.15.2) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.0(@types/node@22.15.2) + '@rushstack/ts-command-line': 4.23.5(@types/node@22.15.2) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.7.3 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.17.1': + dependencies: + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.8 + + '@microsoft/tsdoc@0.15.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgr/core@0.2.4': {} + + '@rollup/pluginutils@5.1.4(rollup@4.40.0)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.40.0 + + '@rollup/rollup-android-arm-eabi@4.40.0': + optional: true + + '@rollup/rollup-android-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-x64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.40.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.40.0': + optional: true + + '@rushstack/node-core-library@5.11.0(@types/node@22.15.2)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.0 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + optionalDependencies: + '@types/node': 22.15.2 + + '@rushstack/rig-package@0.5.3': + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.15.0(@types/node@22.15.2)': + dependencies: + '@rushstack/node-core-library': 5.11.0(@types/node@22.15.2) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 22.15.2 + + '@rushstack/ts-command-line@4.23.5(@types/node@22.15.2)': + dependencies: + '@rushstack/terminal': 0.15.0(@types/node@22.15.2) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@types/argparse@1.0.38': {} + + '@types/estree@1.0.6': {} + + '@types/estree@1.0.7': {} + + '@types/json-schema@7.0.15': {} + + '@types/marked@6.0.0': + dependencies: + marked: 15.0.11 + + '@types/node@22.15.2': + dependencies: + undici-types: 6.21.0 + + '@types/prismjs@1.26.5': {} + + '@typescript-eslint/eslint-plugin@8.31.0(@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3))(eslint@9.25.1)(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.31.0(eslint@9.25.1)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.31.0 + '@typescript-eslint/type-utils': 8.31.0(eslint@9.25.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.31.0(eslint@9.25.1)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.31.0 + eslint: 9.25.1 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 2.0.1(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.31.0(eslint@9.25.1)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.31.0 + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.31.0 + debug: 4.4.0 + eslint: 9.25.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.31.0': + dependencies: + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/visitor-keys': 8.31.0 + + '@typescript-eslint/type-utils@8.31.0(eslint@9.25.1)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.31.0(eslint@9.25.1)(typescript@5.8.3) + debug: 4.4.0 + eslint: 9.25.1 + ts-api-utils: 2.0.1(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.31.0': {} + + '@typescript-eslint/typescript-estree@8.31.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/visitor-keys': 8.31.0 + debug: 4.4.0 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.25.1) + '@typescript-eslint/scope-manager': 8.31.0 + '@typescript-eslint/types': 8.31.0 + '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3) + eslint: 9.25.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.31.0': + dependencies: + '@typescript-eslint/types': 8.31.0 + eslint-visitor-keys: 4.2.0 + + '@vitejs/plugin-vue@5.2.3(vite@6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0))(vue@3.5.13(typescript@5.8.3))': + dependencies: + vite: 6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0) + vue: 3.5.13(typescript@5.8.3) + + '@volar/language-core@2.4.11': + dependencies: + '@volar/source-map': 2.4.11 + + '@volar/source-map@2.4.11': {} + + '@volar/typescript@2.4.11': + dependencies: + '@volar/language-core': 2.4.11 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 + + '@vue/compiler-core@3.4.21': + dependencies: + '@babel/parser': 7.24.5 + '@vue/shared': 3.4.21 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.9 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.4.21': + dependencies: + '@vue/compiler-core': 3.4.21 + '@vue/shared': 3.4.21 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.4.21': + dependencies: + '@babel/parser': 7.24.5 + '@vue/compiler-core': 3.4.21 + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.9 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.4.49 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.4.21': + dependencies: + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.0(typescript@5.8.3)': + dependencies: + '@volar/language-core': 2.4.11 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + alien-signals: 0.4.14 + minimatch: 9.0.4 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.8.3 + + '@vue/language-core@2.2.10(typescript@5.8.3)': + dependencies: + '@volar/language-core': 2.4.11 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + alien-signals: 1.0.4 + minimatch: 9.0.4 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.8.3 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.3))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.8.3) + + '@vue/shared@3.4.21': {} + + '@vue/shared@3.5.13': {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.12.0: {} + + acorn@8.14.0: {} + + acorn@8.14.1: {} + + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv-formats@3.0.1(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ajv@8.13.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + alien-signals@0.4.14: {} + + alien-signals@1.0.4: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + asynckit@0.4.0: {} + + axios@1.8.2: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-plugin-prismjs@2.1.0(prismjs@1.30.0): + dependencies: + prismjs: 1.30.0 + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001599 + electron-to-chromium: 1.4.708 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + buffer-from@1.1.2: {} + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001599: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: {} + + compare-versions@6.1.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + convert-source-map@2.0.0: {} + + copy-anything@2.0.6: + dependencies: + is-what: 3.14.1 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + de-indent@1.0.2: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + electron-to-chromium@1.4.708: {} + + entities@4.5.0: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + + esbuild@0.25.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.3 + '@esbuild/android-arm': 0.25.3 + '@esbuild/android-arm64': 0.25.3 + '@esbuild/android-x64': 0.25.3 + '@esbuild/darwin-arm64': 0.25.3 + '@esbuild/darwin-x64': 0.25.3 + '@esbuild/freebsd-arm64': 0.25.3 + '@esbuild/freebsd-x64': 0.25.3 + '@esbuild/linux-arm': 0.25.3 + '@esbuild/linux-arm64': 0.25.3 + '@esbuild/linux-ia32': 0.25.3 + '@esbuild/linux-loong64': 0.25.3 + '@esbuild/linux-mips64el': 0.25.3 + '@esbuild/linux-ppc64': 0.25.3 + '@esbuild/linux-riscv64': 0.25.3 + '@esbuild/linux-s390x': 0.25.3 + '@esbuild/linux-x64': 0.25.3 + '@esbuild/netbsd-arm64': 0.25.3 + '@esbuild/netbsd-x64': 0.25.3 + '@esbuild/openbsd-arm64': 0.25.3 + '@esbuild/openbsd-x64': 0.25.3 + '@esbuild/sunos-x64': 0.25.3 + '@esbuild/win32-arm64': 0.25.3 + '@esbuild/win32-ia32': 0.25.3 + '@esbuild/win32-x64': 0.25.3 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@10.1.2(eslint@9.25.1): + dependencies: + eslint: 9.25.1 + + eslint-define-config@2.1.0: {} + + eslint-plugin-prettier@5.2.6(eslint-config-prettier@10.1.2(eslint@9.25.1))(eslint@9.25.1)(prettier@3.5.3): + dependencies: + eslint: 9.25.1 + prettier: 3.5.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.4 + optionalDependencies: + eslint-config-prettier: 10.1.2(eslint@9.25.1) + + eslint-plugin-vue@10.0.0(eslint@9.25.1)(vue-eslint-parser@9.4.3(eslint@9.25.1)): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.25.1) + eslint: 9.25.1 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.0.16 + semver: 7.7.1 + vue-eslint-parser: 9.4.3(eslint@9.25.1) + xml-name-validator: 4.0.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.25.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.25.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.1 + '@eslint/core': 0.13.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.25.1 + '@eslint/plugin-kit': 0.2.8 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + esutils@2.0.3: {} + + exsolve@1.0.5: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + + follow-redirects@1.15.6: {} + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@11.12.0: {} + + globals@14.0.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + ignore@5.3.1: {} + + image-size@0.5.5: + optional: true + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + imurmurhash@0.1.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-what@3.14.1: {} + + isexe@2.0.0: {} + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kolorist@1.8.0: {} + + less@4.3.0: + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.6.2 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + local-pkg@1.0.0: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.1.0 + quansync: 0.2.10 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + optional: true + + marked-gfm-heading-id@4.1.1(marked@15.0.11): + dependencies: + github-slugger: 2.0.0 + marked: 15.0.11 + + marked-highlight@2.2.1(marked@15.0.11): + dependencies: + marked: 15.0.11 + + marked-mangle@1.1.10(marked@15.0.11): + dependencies: + marked: 15.0.11 + + marked@15.0.11: {} + + merge2@1.4.1: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: + optional: true + + minimatch@3.0.8: + dependencies: + brace-expansion: 1.1.11 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + + ms@2.1.2: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.3.0 + optional: true + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + optionator@0.9.3: + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-node-version@1.0.1: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + pathe@2.0.3: {} + + picocolors@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@4.0.1: + optional: true + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.1.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.5 + pathe: 2.0.3 + + postcss-selector-parser@6.0.16: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.5.3: {} + + prismjs@1.30.0: {} + + proxy-from-env@1.1.0: {} + + prr@1.0.1: + optional: true + + punycode@2.3.1: {} + + quansync@0.2.10: {} + + queue-microtask@1.2.3: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rollup@4.40.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.0 + '@rollup/rollup-android-arm64': 4.40.0 + '@rollup/rollup-darwin-arm64': 4.40.0 + '@rollup/rollup-darwin-x64': 4.40.0 + '@rollup/rollup-freebsd-arm64': 4.40.0 + '@rollup/rollup-freebsd-x64': 4.40.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 + '@rollup/rollup-linux-arm-musleabihf': 4.40.0 + '@rollup/rollup-linux-arm64-gnu': 4.40.0 + '@rollup/rollup-linux-arm64-musl': 4.40.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-musl': 4.40.0 + '@rollup/rollup-linux-s390x-gnu': 4.40.0 + '@rollup/rollup-linux-x64-gnu': 4.40.0 + '@rollup/rollup-linux-x64-musl': 4.40.0 + '@rollup/rollup-win32-arm64-msvc': 4.40.0 + '@rollup/rollup-win32-ia32-msvc': 4.40.0 + '@rollup/rollup-win32-x64-msvc': 4.40.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: + optional: true + + sax@1.3.0: + optional: true + + scule@1.3.0: {} + + semver@5.7.2: + optional: true + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + source-map-js@1.2.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sourcemap-codec@1.4.8: {} + + sprintf-js@1.0.3: {} + + string-argv@0.3.2: {} + + strip-json-comments@3.1.1: {} + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.11.4: + dependencies: + '@pkgr/core': 0.2.4 + tslib: 2.8.1 + + terser@5.39.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@2.0.1(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + tslib@2.6.2: {} + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript@5.7.3: {} + + typescript@5.8.3: {} + + ufo@1.5.4: {} + + undici-types@6.21.0: {} + + unimport@4.1.2: + dependencies: + acorn: 8.14.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.1.1 + magic-string: 0.30.17 + mlly: 1.7.4 + pathe: 2.0.3 + picomatch: 4.0.2 + pkg-types: 1.3.1 + scule: 1.3.0 + strip-literal: 3.0.0 + tinyglobby: 0.2.12 + unplugin: 2.3.2 + unplugin-utils: 0.2.4 + + universalify@2.0.1: {} + + unplugin-auto-import@19.1.2: + dependencies: + local-pkg: 1.1.1 + magic-string: 0.30.17 + picomatch: 4.0.2 + unimport: 4.1.2 + unplugin: 2.3.2 + unplugin-utils: 0.2.4 + + unplugin-utils@0.2.4: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.2 + + unplugin-vue-components@28.5.0(@babel/parser@7.26.9)(vue@3.5.13(typescript@5.8.3)): + dependencies: + chokidar: 3.6.0 + debug: 4.4.0 + local-pkg: 1.1.1 + magic-string: 0.30.17 + mlly: 1.7.4 + tinyglobby: 0.2.12 + unplugin: 2.3.2 + unplugin-utils: 0.2.4 + vue: 3.5.13(typescript@5.8.3) + optionalDependencies: + '@babel/parser': 7.26.9 + transitivePeerDependencies: + - supports-color + + unplugin@2.3.2: + dependencies: + acorn: 8.14.1 + picomatch: 4.0.2 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.0.13(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + vite-plugin-dts@4.5.3(@types/node@22.15.2)(rollup@4.40.0)(typescript@5.8.3)(vite@6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0)): + dependencies: + '@microsoft/api-extractor': 7.50.1(@types/node@22.15.2) + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) + '@volar/typescript': 2.4.11 + '@vue/language-core': 2.2.0(typescript@5.8.3) + compare-versions: 6.1.1 + debug: 4.4.0 + kolorist: 1.8.0 + local-pkg: 1.0.0 + magic-string: 0.30.17 + typescript: 5.8.3 + optionalDependencies: + vite: 6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite-plugin-prismjs@0.0.11(prismjs@1.30.0): + dependencies: + '@babel/core': 7.24.0 + babel-plugin-prismjs: 2.1.0(prismjs@1.30.0) + transitivePeerDependencies: + - prismjs + - supports-color + + vite-plugin-vue-setup-extend@0.4.0(vite@6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0)): + dependencies: + '@vue/compiler-sfc': 3.4.21 + magic-string: 0.25.9 + vite: 6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0) + + vite@6.2.6(@types/node@22.15.2)(less@4.3.0)(terser@5.39.0): + dependencies: + esbuild: 0.25.3 + postcss: 8.5.3 + rollup: 4.40.0 + optionalDependencies: + '@types/node': 22.15.2 + fsevents: 2.3.3 + less: 4.3.0 + terser: 5.39.0 + + vscode-uri@3.0.8: {} + + vue-eslint-parser@9.4.3(eslint@9.25.1): + dependencies: + debug: 4.4.0 + eslint: 9.25.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 7.7.1 + transitivePeerDependencies: + - supports-color + + vue-tsc@2.2.10(typescript@5.8.3): + dependencies: + '@volar/typescript': 2.4.11 + '@vue/language-core': 2.2.10(typescript@5.8.3) + typescript: 5.8.3 + + vue@3.5.13(typescript@5.8.3): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.3)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.8.3 + + webpack-virtual-modules@0.6.2: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + xml-name-validator@4.0.0: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yocto-queue@0.1.0: {} diff --git a/src/api/CommentAPI.ts b/src/api/CommentAPI.ts new file mode 100644 index 0000000..120423d --- /dev/null +++ b/src/api/CommentAPI.ts @@ -0,0 +1,36 @@ +import { + axios, + CaptchaData, + Comment, + CommentPage, + CommentReply, + CommentReplyPage, + CommentReplyView, + CommentView, + PageResult +} from "~/index"; + +const BASE_URI = "/comment"; + +async function page(commentPage: CommentPage): Promise> { + return axios.post(`${BASE_URI}/list`, commentPage); +} + +async function create(captchaData: CaptchaData): Promise { + return axios.post(`${BASE_URI}/create`, captchaData); +} + +async function pageReply(commentReplyPage: CommentReplyPage): Promise> { + return axios.post(`${BASE_URI}/reply/list`, commentReplyPage); +} + +async function createReply(captchaData: CaptchaData): Promise { + return axios.post(`${BASE_URI}/reply/create`, captchaData); +} + +export default { + page, + create, + createReply, + pageReply +}; diff --git a/src/api/CommonAPI.ts b/src/api/CommonAPI.ts new file mode 100644 index 0000000..9691e36 --- /dev/null +++ b/src/api/CommonAPI.ts @@ -0,0 +1,28 @@ +import { axios, SettingKey, TemplateBizType, Toolkit } from "~/index"; + +const getCaptchaAPI = () => axios.defaults.baseURL + "/captcha"; + +const getAttachmentReadAPI = (mongoId: string) => `${axios.defaults.baseURL}/attachment/read/${mongoId}`; + +async function getTemplate(bizType: TemplateBizType, code: string): Promise { + return axios.get(`/template?bizType=${bizType}&bizCode=${code}`); +} + +async function getSetting(key: string, args?: { [key: string]: any }): Promise { + return axios.get(`/setting/${key}?${Toolkit.toURLArgs(args)}`); +} + +async function listSetting(keyMap: Map): Promise> { + const result = await axios.post("/setting/map", Toolkit.toObject(keyMap)); + const map = new Map(); + Object.entries(result).forEach(([key, value]) => map.set(key, value as string)); + return map; +} + +export default { + getCaptchaAPI, + getAttachmentReadAPI, + getTemplate, + getSetting, + listSetting +}; diff --git a/src/api/DeveloperAPI.ts b/src/api/DeveloperAPI.ts new file mode 100644 index 0000000..4fdf7a3 --- /dev/null +++ b/src/api/DeveloperAPI.ts @@ -0,0 +1,11 @@ +import { axios, Developer } from "~/index"; + +const BASE_URI = "/git/developer"; + +async function get(): Promise { + return axios.post(`${BASE_URI}`); +} + +export default { + get +}; diff --git a/src/api/UserAPI.ts b/src/api/UserAPI.ts new file mode 100644 index 0000000..cd3fb51 --- /dev/null +++ b/src/api/UserAPI.ts @@ -0,0 +1,85 @@ +import { + Attachment, + axios, + CaptchaData, + CommonAPI, + LoginRequest, + LoginResponse, + RegisterRequest, + UserAttachType, + UserProfileView, + UserView +} from "~/index"; + +const BASE_URI = "/user"; + +async function register(captchaData: CaptchaData): Promise { + return axios.post(`${BASE_URI}/register`, captchaData); +} + +/** + * 登录 + * + * @param captchaData 验证码登录对象 + * @returns LoginResponse + */ +async function login(captchaData: CaptchaData): Promise { + return axios.post(`${BASE_URI}/login`, captchaData); +} + +/** + * 验证是否已登录 + * + * @returns true 为已登录 + */ +async function login4Token(): Promise { + return axios.post(`${BASE_URI}/login/token`); +} + +async function logout(): Promise { + return axios.post(`${BASE_URI}/logout`); +} + +/** + * 获取用户数据 + * + * @param id 用户 ID + * @returns 用户数据 + */ +async function view(id: number): Promise { + return axios.post(`${BASE_URI}/view/${id}`); +} + +function getAvatarURL(profile?: UserProfileView) { + if (profile && profile.attachmentList) { + return findAttachmentByType(profile.attachmentList, [UserAttachType.AVATAR, UserAttachType.DEFAULT_AVATAR]); + } +} + +function getWrapperURL(profile?: UserProfileView) { + if (profile && profile.attachmentList) { + return findAttachmentByType(profile.attachmentList, [UserAttachType.WRAPPER, UserAttachType.DEFAULT_WRAPPER]); + } +} + +function findAttachmentByType(attachmentList: Attachment[], types: UserAttachType[]) { + for (let i = 0; i < attachmentList.length; i++) { + const attachType = (UserAttachType)[attachmentList[i].attachType!]; + for (let type of types) { + if (attachType === type) { + return CommonAPI.getAttachmentReadAPI(attachmentList[i].mongoId); + } + } + } +} + +export default { + register, + login, + login4Token, + logout, + + view, + getAvatarURL, + getWrapperURL +}; diff --git a/src/assets/icon.json b/src/assets/icon.json new file mode 100644 index 0000000..22de731 --- /dev/null +++ b/src/assets/icon.json @@ -0,0 +1,151 @@ +{ + "play": "M3 12h2v-10h-2v10zM7 12h2v-1h1v-1h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v-1h-1v-1h-2z", + "tomcat": "M1 0v2h1v1h1v3h1v-1h1v1h2v1h3v-2h1v-1h1v-1h2v-1h1v-1h-3v1h-2v1h-4v-1h1v-1h-2v1h-1v-1h-2v-1zM2 9h1v-3h-1v3zM3 11h1v-2h-1v2zM4 12h2v-1h-2v1zM6 11h2v-2h-2v2zM11 9h1v-1h2v1h1v-3h-1v-1h-2v1h-1z", + "underline": "M4 2h8v-1h-8v1zM4 12h2v-7h4v7h2v-7h-1v-1h-1v-1h-4v1h-1v1h-1z", + "upload": "M2 5h2v-2h8v2h2v-4h-12zM4 8v1h1v1h1v1h1v1h2v-1h1v-1h1v-1h1v-1h-3v-4h-2v4z", + "server_0": "M5 14h6v-6h-2v-1h5v-2h1v-4h-4v4h1v1h-3v-1h1v-4h-4v4h1v1h-3v-1h1v-4h-4v4h1v2h5v1h-2z", + "fontsize": "M2 9v3h10v-3h-1v1h-3v-7h3v4h-1v-1h-1v2h5v-2h-1v1h-1v-4h2v-1h-9v1h2v7h-4v-1z", + "spec_weaken": "M1 3h2v-3h-2v3zM4 5h2v-5h-2v5zM7 8h2v-8h-2v8zM10 3h2v-3h-2v3zM13 5h2v-5h-2v5zM4 14h2v-3h2v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h2z", + "play_next": "M3 12h2v-1h1v-1h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v-1h-1v-1h-2zM10 12h2v-10h-2v10z", + "branch": "M1 14h4v-1h9v-2h-9v-1h-1v-2h6v1h4v-4h-4v1h-6v-3h6v1h4v-4h-4v1h-8v9h-1z", + "redis": "M7 14h2v-1h2v-1h2v-1h2v-2h-2v-1h-2v-1h-2v-1h-2v1h-2v1h-2v1h-2v2h2v1h2v1h2zM1 8h2v-1h2v-1h2v-1h2v1h2v1h2v1h2v-2h-2v-1h-2v-1h-2v-1h-2v1h-2v1h-2v1h-2zM1 5h2v-1h2v-1h2v-1h2v1h2v1h2v1h2v-2h-2v-1h-2v-1h-2v-1h-2v1h-2v1h-2v1h-2z", + "music": "M2 1v4h2v7h10v-10h-4v4h2v4h-6v-9z", + "java": "M3 2h10v-1h-10v1zM5 4h5v-1h-5v1zM4 6h7v-1h-7v1zM7 7h1v-1h-1v1zM6 9h1v-2h-1v2zM8 9h-1v2h1v1h2v-1h-1v-1h-1zM9 7h-1v2h2v-1h-1zM10 10h1v-1h-1v1zM11 7h1v-1h-1v1zM12 6h1v-2h-1v2zM11 4h1v-1h-1v1z", + "pen": "M11 8v-2h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-4v4h1v1h1v1h1v1h1v1h1v1h1v1h2v-1h1v-1zM15 11v-1h-1v-1h-1v-1h-1v1h-1v1h-1v1h-1v1h1v1h1v1h1v-1h1v-1h1v-1z", + "text": "M12 11v1h-1v1h-8v-12h10v10h-1zM9 5h-5v1h5v-1zM11 7h-7v1h7v-1zM11 9h-7v1h7v-1z", + "mail_0": "M1 1v9h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h2v1h1v1h1v1h1v1h1v1h1v1h1v-9zM1 12v-1h2v-1h1v-1h1v-1h1v-1h1v-1h2v1h1v1h1v1h1v1h1v1h2v1z", + "zip": "M12 11v1h-1v1h-8v-5h-2v-8h8v1h4v10h-1zM8 1h-6v6h6v-6zM3 6h4v-1h-1v-1h-1v1h-2zM4 4h1v-1h2v-1h-4v1h1z", + "filter_0": "M9 13h-7v-2h1v-1h1v-1h1v-8h1v1h1v1h1v1h1v1h-2v5h-1v1h3zM15 13h-2v-1h-1v-1h-1v-1h-1v-5h2v4h1v1h1v1h1z", + "version": "M3 13h2v-6h1v2h1v2h1v2h2v-2h-1v-2h-1v-2h-1v-2h-1v-2h-1v-2h-2zM10 3h2v-2h-2v2z", + "arrow_0_w": "M14 6h-8v-1h1v-1h1v-2h-2v1h-1v1h-1v1h-1v1h-1v2h1v1h1v1h1v1h1v1h2v-2h-1v-1h-1v-1h8z", + "extend": "M1 0v6h2v-4h4v-2zM9 14h6v-6h-2v4h-4z", + "sampling_rate": "M0 12h7v-3h-2v1h-3v-2h5v-6h-7v3h2v-1h3v2h-5zM16 6v6h-7v-10h2v3h1v-1h1v-1h1v-1h2v2h-1v1h-1v1h2zM11 8v2h3v-2h-3z", + "fail": "M3 2v2h1v1h1v1h1v2h-1v1h-1v1h-1v2h2v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-2h-2v1h-1v1h-1v1h-2v-1h-1v-1h-1v-1zM10 8h1v1h1v1h1v2h-2v-1h-1v-1h-1v-1h1z", + "proxy": "M15 8v5h-5v-2h-2v-3h-1v2h-6v-6h6v2h1v-3h2v-2h5v5h-5v-2h-1v6h1v-2h5zM11 12h3v-3h-3v3zM11 5h3v-3h-3v3z", + "folder": "M2 2h12v8h-7v1h-1v1h-4z", + "system": "M12 11v1h-1v1h-8v-12h10v10h-1zM4 9h3v-3h-3v3zM8 3h-3v2h1v-1h2v-1zM8 8h3v-2h-1v1h-2v1zM12 2h-3v3h3v-3z", + "arrow_0_s": "M9 13v-8h1v1h1v1h2v-2h-1v-1h-1v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h-1v1h-1v2h2v-1h1v-1h1v8z", + "stop": "M3 12h10v-10h-10v10z", + "arrow_0_n": "M7 1v8h-1v-1h-1v-1h-2v2h1v1h1v1h1v1h1v1h2v-1h1v-1h1v-1h1v-1h1v-2h-2v1h-1v1h-1v-8z", + "spec_1": "M1 6h2v-5h-2v5zM4 12h2v-11h-2v11zM7 9h2v-8h-2v8zM10 4h2v-3h-2v3zM13 6h2v-5h-2v5z", + "thumbtack": "M7 1c0 1.30 0 2.70 0 4h-5v1h3v6h-2v1h10v-1h-2v-6h3v-1h-5c0-1.30 0-2.70 0-4-0.70 0-1.30 0-2 0z", + "spec_0": "M1 10h2v-6h-2v6zM4 14h2v-14h-2v14zM7 11h2v-8h-2v8zM10 9h2v-4h-2v4zM13 11h2v-8h-2v8z", + "java_0": "M3 2h10v-1h-10v1zM5 4h5v-1h-5v1zM4 6h7v-1h-7v1zM7 7h1v-1h-1v1zM6 9h1v-2h-1v2zM8 9h-1v2h1v1h2v-1h-1v-1h-1zM9 7h-1v2h2v-1h-1zM10 10h1v-1h-1v1zM11 7h1v-1h-1v1zM12 6h1v-2h-1v2zM11 4h1v-1h-1v1zM1 15h14v-1h-14v1zM1 0h14v-1h-14v1zM0 14h1v-14h-1v14zM15 14h1v-14h-1v14z", + "arrow_0_e": "M2 8h8v1h-1v1h-1v2h2v-1h1v-1h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v-1h-1v-1h-2v2h1v1h1v1h-8z", + "magnifier": "M4 14h8v-2h-8v2zM2 12h2v-8h-2v8zM4 4h8v-2h-8v2zM12 12h2v-8h-2v8zM13 3h2v-1h1v-2h-2v1h-1z", + "server": "M1 12v-11h14v11h-14zM14 2h-12v4h12v-4zM14 7h-12v4h12v-4zM3 10h2v-2h-2v2zM6 10h7v-2h-7v2zM3 5h2v-2h-2v2zM6 5h7v-2h-7v2z", + "cut": "M1 7h4v-1h-4v1zM6 7h4v-1h-4v1zM11 7h4v-1h-4v1zM3 5h10v-5h-10v5zM3 8h10v4h-1v1h-1v1h-8z", + "flag": "M1 0v12h2v2h10v-2h2v-12h-2v2h-2v2h-2v2h-2v-2h-2v-2h-2v-2z", + "sd_card": "M4 13v-4h-1v-2h1v-2h-1v-4h10v12h-9zM6 10h-1v2h1v-2zM8 10h-1v2h1v-2zM10 10h-1v2h1v-2zM12 10h-1v2h1v-2z", + "log": "M6 6h1v-2h-1v2zM14 11v1h-1v1h-1v1h-9v-6h-2v-6h2v-2h12v11h-1zM2 3v4h1v-3h1v-1h-2zM14 1h-10v1h9v6h-9v5h7v-3h3v-9zM8 6v-2h-1v-1h-1v1h-1v2h1v1h1v-1h1zM11 4v1h1v-2h-2v1h-1v2h1v1h2v-1h-2v-2h1z", + "mic": "M1 0v3h1v1h1v1h1v1h1v2h1v-1h1v-1h1v-1h1v-1h-2v-1h-1v-1h-1v-1h-1v-1zM8 8h-1v1h-1v2h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h-2v1h-1v1h-1zM8 11v2h1v1h4v-1h1v-1h1v-4h-1v-1h-2v1h-1v1h-1v1h-1v1z", + "save": "M12 11v1h-1v1h-8v-12h10v10h-1zM8 12h1v-2h-1v2zM5 12h2v-2h-2v2zM11 2h-6v3h6v-3z", + "play_prev": "M12 2h-2v1h-1v1h-1v1h-1v1h-1v2h1v1h1v1h1v1h1v1h2zM3 12h2v-10h-2v10z", + "min": "M3 8h10v-1h-10v1z", + "file": "M12 11v1h-1v1h-8v-12h10v10h-1z", + "writing": "M7 13v1h-5v-12h1v-1h1v-1h1v1h1v1h1v1h7v10h-7zM6 4h-3v1h3v-1zM6 11h-3v2h3v-2zM12 5h-5v1h4v1h-4v1h4v2h-4v1h5v-6z", + "power": "M4 3h8v-2h-8v2zM2 9h2v-6h-2v6zM4 11h2v-2h-2v2zM7 13h2v-6h-2v6zM10 11h2v-2h-2v2zM12 9h2v-6h-2v6z", + "copy": "M12 12v1h-1v1h-7v-2h-2v-12h9v2h2v10h-1zM12 3h-1v7h-1v1h-1v1h-4v1h5v-1h1v-1h1v-8z", + "close": "M7 8h2v-2h-2v2zM6 9h1v-1h-1v1zM5 10h1v-1h-1v1zM4 11h1v-1h-1v1zM3 12h1v-1h-1v1zM3 3h1v-1h-1v1zM4 4h1v-1h-1v1zM5 5h1v-1h-1v1zM6 6h1v-1h-1v1zM9 9h1v-1h-1v1zM10 10h1v-1h-1v1zM11 11h1v-1h-1v1zM12 12h1v-1h-1v1zM9 6h1v-1h-1v1zM10 5h1v-1h-1v1zM11 4h1v-1h-1v1zM12 3h1v-1h-1v1z", + "table": "M1 13v-12h14v12h-14zM5 2h-3v2h3v-2zM5 5h-3v2h3v-2zM5 8h-3v2h3v-2zM14 2h-8v2h8v-2zM14 5h-8v2h8v-2zM14 8h-8v2h8v-2z", + "b": "M13 9v2h-1v1h-1v1h-8v-12h8v1h1v1h1v2h-1v4h1zM10 4h-1v-1h-3v3h3v-1h1v-1zM10 9h-1v-1h-3v3h3v-1h1v-1z", + "question": "M3 11h2v-3h-2v3zM5 13h6v-2h-6v2zM11 11h2v-4h-2v4zM11 7h-2v-1h-2v-3h2v2h2zM7 2h2v-2h-2v2z", + "star": "M4 8v1h5v1h1v2h1v2h1v-5h3v-1h-1v-1h-1v-1h-1v-6h-1v1h-1v1h-2v-1h-1v-1h-1v3h1v3h-1v1h-1v1zM6 13h3v-1h-3v1zM5 11h3v-1h-3v1zM2 3h3v-1h-3v1zM3 5h3v-1h-3v1z", + "max": "M3 12v-10h10v10h-10zM12 3h-8v8h8v-8z", + "refresh": "M11 9h2v3h-10v-4h-2v-1h1v-1h1v-1h2v1h1v1h1v1h-2v2h6zM11 8h2v-1h1v-1h1v-1h-2v-4h-10v3h2v-1h6v2h-2v1h1v1h1z", + "arrow_5_v": "M8 5v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h2v6h2v-6zM10 3v6h-2v1h1v1h1v1h2v-1h1v-1h1v-1h-2v-6z", + "link_0": "M1 11h10v-4h-2v2h-6v-4h1v-2h-3zM5 7h2v-2h6v4h-1v2h3v-8h-10z", + "arrow_1_w": "M11 2h-2v1h-1v1h-1v1h-1v1h-1v2h1v1h1v1h1v1h1v1h2v-2h-1v-1h-1v-1h-1v-2h1v-1h1v-1h1z", + "filter": "M10 14h-10v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-8h1v1h1v1h1v1h1v5h1v1h1v1h1v1h1v1h1v1h1v1h-2v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-5h-1v-1h-1v6h-1v1h-1v1h-1v1h-1v1h7z", + "insert_before": "M1 10h5v1h1v-1h1v-1h1c0-0.30 0-0.70 0-1-2 0-4 0-6 0 0-1.30 0-2.70 0-4-0.70 0-1.30 0-2 0 0 2 0 4 0 6zM5 7h3v-3h-3v3zM9 7h6v-3h-6v3z", + "arrow_1_s": "M13 10v-2h-1v-1h-1v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h-1v1h-1v2h2v-1h1v-1h1v-1h2v1h1v1h1v1z", + "hide": "M3 1v12h8v-1h1v-1h1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1zM5 2h2v-1h-2v1zM8 2h2v-1h-2v1zM11 1v1h1v1h1v-2zM12 6h1v-2h-1v2zM12 9h1v-2h-1v2z", + "t": "M2 13h12v-4h-1v1h-1v1h-3v-9h3v-1h-8v1h3v9h-3v-1h-1v-1h-1z", + "firewall": "M15 12v1h-3v1h-8v-1h-3v-1h-1v-7h1v-2h1v-1h2v-1h2v-1h4v1h2v1h2v1h1v2h1v7h-1zM15 6h-1v-2h-1v-1h-2v-1h-2v-1h-1v6c-2.30 0-4.70 0-7 0 0 1.30 0 2.70 0 4h1v1h3v1c1 0 2 0 3 0 0-2 0-4 0-6h7v-1z", + "arrow_5_h": "M6 6h-1v1h-1v1h-1v2h1v1h1v1h1v-2h6v-2h-6zM4 5h6v2h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v2h-6z", + "rename": "M2 9v-4h12v4h-12zM13 6h-10v2h10v-2zM8 12v-1h1v-8h-1v-1h3v1h-1v8h1v1z", + "arrow_1_n": "M3 4v2h1v1h1v1h1v1h1v1h2v-1h1v-1h1v-1h1v-1h1v-2h-2v1h-1v1h-1v1h-2v-1h-1v-1h-1v-1z", + "arrow_1_e": "M5 12h2v-1h1v-1h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v-1h-1v-1h-2v2h1v1h1v1h1v2h-1v1h-1v1h-1z", + "wrap": "M1 13h14v-2h-14v2zM1 9h5v-2h-5v2zM1 5h5v-2h-5v2zM13 9h2v-6h-4v-2h-1v1h-1v1h-1v2h1v1h1v1h1v-2h2z", + "die": "M15 9v2h-2v1h-1v2h-2v-2h-1v2h-2v-2h-1v2h-2v-2h-1v-1h-2v-2h2v-1h-2v-2h2v-1h-2v-2h2v-1h1v-2h2v2h1v-2h2v2h1v-2h2v2h1v1h2v2h-2v1h2v2h-2v1h2zM11 4h-6v6h6v-6zM6 9h4v-4h-4v4z", + "keep_end": "M1 4h14v-2h-14v2zM1 8h5v-2h-5v2zM1 12h5v-2h-5v2zM10 12h2v-4h2v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h2z", + "lib": "M1 11h2v-10h-2v10zM4 11h2v-10h-2v10zM7 13h2v-12h-2v12zM10 11h2v-10h-2v10zM13 9h2v-8h-2v8z", + "mail": "M1 10h2v-1h2v-1h6v1h2v1h2v-8h-14zM1 12h14v-1h-3v-1h-2v-1h-4v1h-2v1h-3z", + "italic": "M4 13h8v-2h-3v-4h-1v-4h3v-2h-8v2h3v4h1v4h-3z", + "insert_after": "M1 10c0.70 0 1.30 0 2 0 0-1.30 0-2.70 0-4 2 0 4 0 6 0 0-0.30 0-0.70 0-1h-1v-1h-1v-1h-1v1h-5c0 2 0 4 0 6zM5 10h3v-3h-3v3zM9 10h6v-3h-6v3z", + "translate": "M9 10v1h3v-3h-1v2zM5 7h1v-2h2v-1h-3zM9 7h4v-1h-3v-1h2v-1h-2v-1h3v-1h-4zM6 12v1h-1v-1h-2v-3h2v-1h1v1h2v3h-2zM5 10h-1v1h1v-1zM7 10h-1v1h1v-1z", + "spec": "M2 9h1v-4h-1v4zM4 12h1v-10h-1v10zM6 10h1v-6h-1v6zM8 11h1v-8h-1v8zM10 8h1v-2h-1v2zM12 9h1v-4h-1v4z", + "download": "M2 5h2v-2h8v2h2v-4h-12zM4 8h3v4h2v-4h3v-1h-1v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h-1z", + "apache": "M1 0v2h1v2h1v2h1v2h1v1h1v1h1v1h1v1h2v1h2v1h3v-3h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-2v-1h-2v-1h-2v-1h-1v-2h-1v-1h-1z", + "function": "M2 6h5v-5h-5v5zM2 13h5v-5h-5v5zM9 6h5v-5h-5v5zM9 10h-1v1h1v1h1v1h1v1h1v-1h1v-1h1v-1h1v-1h-1v-1h-1v-1h-1v-1h-1v1h-1v1h-1z", + "tile": "M2 6h5v-5h-5v5zM2 13h5v-5h-5v5zM9 13h5v-5h-5v5zM9 6h5v-5h-5v5z", + "spec_boost": "M1 4h2v-4h-2v4zM4 0v10h-2v1h1v1h1v1h2v-1h1v-1h1v-1h-2v-10zM7 8h2v-8h-2v8zM10 3h2v-3h-2v3zM13 5h2v-5h-2v5z", + "lrc": "M0 0v4h2v10h4v-2h-2v-12zM8 14h8v-14h-10v2h8v10h-6zM6 10h7v-2h-7v2zM6 6h5v-2h-5v2z", + "export": "M8 0v1h-5v12h6v-4h5v2h-1v1h-1v1h-1v1h-9v-14zM6 3v3h4v2h1v-1h1v-1h1v-1h1v-1h-1v-1h-1v-1h-1v-1h-1v2z", + "info": "M1 12h2v-8h-2v8zM3 14h10v-2h-10v2zM13 12h2v-8h-2v8zM3 4h4v-2h-4v2zM9 4h4v-2h-4v2zM7 2h2v-2h-2v2zM7 11h2v-3h-2v3zM7 7h2v-2h-2v2z", + "image": "M1 12v-10h14v10h-14zM14 6h-1v1h-1v1h-1v-1h-1v-1h-2v1h-1v-1h-1v-1h-2v-1h-2v7h12v-5zM3 10h2v-2h-2v2z", + "tar": "M12 11v1h-1v1h-8v-5h-2v-8h8v1h4v10h-1zM8 1h-6v6h6v-6zM3 6h4v-1h-1v-3h-2v3h-1z", + "nginx": "M13 11v1h-2v1h-2v1h-2v-1h-2v-1h-2v-1h-2v-8h2v-1h2v-1h2v-1h2v1h2v1h2v1h2v8h-2zM12 5h-3v1h-1v1h-1v1h-1v-3h-2v4h3v-1h1v-1h1v-1h1v3h2v-4z", + "maven": "M1 14h14v-2h-14v2zM1 10h1v-1h1v-1h1v1h1v1h1v-6h-1v2h-1v-1h-1v1h-1v-2h-1zM7 10h1v-3h1v3h1v-4h-1v-2h-1v2h-1zM11 4v6h1v-1h1v-1h1v2h1v-6h-1v1h-1v1h-1v-2zM1 2h14v-2h-14v2z", + "arrow_2_w": "M15 9v-4h-7v-4h-1v1h-1v1h-1v1h-1v1h-1v1h-1v2h1v1h1v1h1v1h1v1h1v1h1v-4z", + "to_top": "M9 2h-2v4h-3v1h1v1h1v1h1v1h2v-1h1v-1h1v-1h1v-1h-3zM12 11h-8v1h8z", + "clock": "M2 11h2v-8h-2v8zM4 13h8v-2h-8v2zM12 11h2v-8h-2v8zM4 3h8v-2h-8v2zM7 10h2v-3h1v-1h1v-2h-2v1h-1v1h-1z", + "duplicate": "M3 14v-3h-2v-11h11v1h3v13h-12zM13 3h-1v8h-7v1h8v-9z", + "girl": "M11 6v1h1v4h-1v1h-1v1h-4v-1h-1v-1h-1v-4h1v-1h2c0-0.70 0-1.30 0-2-0.70 0-1.30 0-2 0 0-0.30 0-0.70 0-1 0.70 0 1.30 0 2 0v-2h2v2c0.70 0 1.30 0 2 0 0 0.30 0 0.70 0 1-0.70 0-1.30 0-2 0 0 0.70 0 1.30 0 2h2zM7 7v1h-1v2h1v1h2v-1h1v-2h-1v-1h-2z", + "list": "M2 12h2v-2h-2v2zM5 12h9v-2h-9v2zM2 8h2v-2h-2v2zM5 8h9v-2h-9v2zM2 4h2v-2h-2v2zM5 4h9v-2h-9v2z", + "arrow_2_s": "M6 13h4v-7h4v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h-1v1h-1v1h-1v1h4z", + "plus": "M3 8h4v4h2v-4h4v-2h-4v-4h-2v4h-4z", + "pause": "M4 12h3v-10h-3v10zM9 12h3v-10h-3v10z", + "tool": "M1 0v3h1v1h1v1h2v1h1v2h-4v1h-1v2h2v-1h2v2h-1v2h2v-1h1v-4h2v1h1v1h1v1h1v1h1v1h2v-2h-1v-1h-1v-1h-1v-1h-1v-1h-1v-2h1v-1h1v-1h1v-1h1v-1h1v-2h-2v1h-1v1h-1v1h-1v1h-1v1h-2v-1h-1v-2h-1v-1h-1v-1z", + "trash": "M7 13h2v-2h5v-2h-12v2h5zM3 8h2v-6h6v6h2v-8h-10zM6 8h4v-5h-4v5z", + "volume": "M0 9h3v1h1v1h1v1h1v1h2v-12h-2v1h-1v1h-1v1h-1v1h-3zM9 10h1v-1h1v-4h-1v-1h-1zM9 13v-2h2v-1h1v-1h1v-4h-1v-1h-1v-1h-2v-2h2v1h1v1h1v1h1v6h-1v1h-1v1h-1v1z", + "disk": "M14 9c0 0.30 0 0.70 0 1h-1v1h-1v1h-8v-1h-1v-1c-0.30 0-0.70 0-1 0 0-0.30 0-0.70 0-1-0.30 0-0.70 0-1 0 0-2.30 0-4.70 0-7h14c0 2.30 0 4.70 0 7-0.30 0-0.70 0-1 0zM14 3h-12v4h12v-4zM3 6h7v-2h-7v2zM11 6h2v-2h-2v2z", + "task": "M5 14h6v-4h-6v4zM12 12v-3h-8v3h-3v-12h14v12h-3zM5 2h-2v2h2v-2zM5 5h-2v2h2v-2zM13 2h-7v2h7v-2zM13 5h-7v2h7v-2z", + "transfer": "M3 8v1h1v1h1v1h1v1h1v-11h-2v7zM9 12v-11h1v1h1v1h1v1h1v1h-2v7z", + "remote_control": "M7 6v6h-7v-10h2v3h1v-1h1v-1h1v-1h2v2h-1v1h-1v1h2zM2 8v2h3v-2h-3zM9 12h7v-4h-2v2h-3v-6h3v2h2v-4h-7z", + "info_0": "M3 14h10v-2h-10v2zM1 12h2v-10h-2v10zM3 2h10v-2h-10v2zM13 12h2v-10h-2v10zM7 8h2v-5h-2v5zM7 11h2v-2h-2v2z", + "arrow_2_n": "M10 1h-4v7h-4v1h1v1h1v1h1v1h1v1h1v1h2v-1h1v-1h1v-1h1v-1h1v-1h1v-1h-4z", + "success": "M3 8h2v-1h1v-1h2v1h1v1h1v1h1v1h1v1h2v-2h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h-1z", + "arrow_2_e": "M2 5v4h7v4h1v-1h1v-1h1v-1h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v4z", + "frame": "M2 12v-10h12v10h-12zM5 3h-2v5h2v-5zM13 3h-7v5h7v-5zM13 9h-10v2h10v-2zM9 7h3v-3h-1v2h-2z", + "full": "M0 13h4v-2h-2v-2h-2zM12 13h4v-4h-2v2h-2zM0 5h2v-2h2v-2h-4zM14 5h2v-4h-4v2h2z", + "arrow_4_en": "M13 12v-6h-1v1h-1v1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1c-0.70 0-1.30 0-2 0 0 0.70 0 1.30 0 2h1v1h1v1h1v1h1v1h1v1h1v1h-1v1h-1v1h6z", + "private": "M3 2h2v-2h-2v2zM1 2h2.10l-0.10 10h-2zM3 14h10v-2h-10v2zM13 12h2v-2h-2v2zM4 11h4v-2h-4v2zM4 8h2v-2h-2v2zM14 6v2h-1v1h-4v-1h-1v-2h-1v-5h1v-1h6v1h1v5h-1zM10 7h2v-1h-2v1zM13 2h-4v2h4v-2z", + "memory": "M16 8v3h-16v-3h1v-1h-1v-6h8v1h2v-1h6v6h-1v1h1zM5 5h-2v3h2v-3zM9 5h-2v3h2v-3zM13 5h-2v3h2v-3z", + "code": "M0 8h1v1h1v1h1v1h2v-1h-1v-1h-1v-1h-1v-2h1v-1h1v-1h1v-1h-2v1h-1v1h-1v1h-1zM16 8h-1v1h-1v1h-1v1h-2v-1h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v-1h2v1h1v1h1v1h1zM9 13h1v-3h-1v-4h-1v-3h-1v-2h-1v3h1v4h1v3h1z", + "arrow_4_es": "M13 2h-6v1h1v1h1v1h-1v1h-1v1h-1v1h-1v1h-1v1h-1c0 0.70 0 1.30 0 2 0.70 0 1.30 0 2 0v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v1h1v1h1v-6z", + "hammer": "M1 8v1h1v1h1v1h1v1h1v1h5v-1h-1v-1h-1v-1h-1v-1h1v-1h1v-1h2v-1h1v-1h1v-1h1v-1h1v-1h1v-1h-1v-1h-1v-1h-1v1h-1v1h-1v1h-1v1h-1v1h-1v2h-1v1h-1v1h-1v-1h-1v-1h-1v1h-1v1z", + "import": "M8 0v1h-5v12h6v-4h5v2h-1v1h-1v1h-1v1h-9v-14zM10 8h-1v-1h-1v-1h-1v-1h-1v-1h1v-1h1v-1h1v-1h1v2h4v3h-4z", + "import_0": "M1 5h2v-3h10v3h2v-5h-14zM2 9h6v-3h-2v-1h1v-1h1v-1h2v1h1v1h1v1h-2v5h-8z", + "volume_mute": "M0 9h3v1h1v1h1v1h1v1h2v-12h-2v1h-1v1h-1v1h-1v1h-3zM9 11h2v-1h1v-1h1v1h1v1h2v-2h-1v-1h-1v-2h1v-1h1v-2h-2v1h-1v1h-1v-1h-1v-1h-2v2h1v1h1v2h-1v1h-1z", + "book": "M7 0v1h-7v10h2v-8h12v8h2v-10h-7v-1zM3 13h4v-9h-4v9zM9 13h4v-9h-4v9z", + "link": "M1 6h6v-6h-6v6zM3 7v5h5v-2h-3v-3zM9 14h6v-6h-6v6zM11 7h2v-5h-5v2h3z", + "back": "M4 4h7v5h-4v-3h-1v1h-1v1h-1v1h-1v2h1v1h1v1h1v1h1v-3h6v-9h-9z", + "full_exit": "M2 13v-2h-2v-2h4v4zM14 13h-2v-4h4v2h-2zM0 5h4v-4h-2v2h-2zM12 5h4v-2h-2v-2h-2z", + "video": "M0 13h16v-13h-2v11h-12v-9h10v-2h-12zM6 10h1v-1h1v-1h1v-1h1v-1h-1v-1h-1v-1h-1v-1h-1z", + "paste": "M12 11v1h-1v1h-8v-4h-1v-9h7v1h4v10h-1zM12 2h-3v5h-1v1h-1v1h-3v3h6v-1h1v-1h1v-8z", + "to_bottom": "M1 14h14v-2h-14v2zM1 9h14v-2h-14v2zM1 4h3v2h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v2h-3zM8 4h7v-2h-7v2z", + "delete": "M12 8v2h-1v2h-1v1h-6v-5h-3v-2h3v-5h6v1h1v2h1v2h3v2h-3zM10 4h-1v-1h-3v3h4v-2zM10 8h-4v3h3v-1h1v-2z", + "boy": "M8 13c0 0 0-1.70 0-2 0.70 0 1.30 0 2 0v-1h-1v-1h-1v1h-4v-1h-1v-1h-1v-5h1v-1h1v-1h5v1h1v1h1v4h-1v1h1v1h1c0-0.70 0-1.30 0-2 0.30 0 2 0 2 0v6h-6zM9 4h-1v-1h-3v1h-1v3h1v1h3v-1h1v-3z", + "random": "M11 10v2h2v1h-1v1h-1v1h-2v-1h-1v-1h-1v-1h2v-2h-4v-4h-5v-2h5v-2h-2v-1h1v-1h1v-1h2v1h1v1h1v1h-2v2h4v4h5v2h-5zM9 6h-2v2h2v-2z", + "database": "M5 14h6v-1h2v-1h2v-2h-2v-1h-2v-1h-6v1h-2v1h-2v2h2v1h2zM1 9h2v-1h2v-1h6v1h2v1h2v-3h-2v-1h-2v-1h-6v1h-2v1h-2zM1 5h2v-1h2v-1h6v1h2v1h2v-3h-2v-1h-2v-1h-6v1h-2v1h-2z", + "repeat": "M6 4v-2h-4v10h4v2h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v2h-2v-6zM7 4h1v1h1v1h1v-2h2v6h-2v2h4v-10h-4v-2h-1v1h-1v1h-1z", + "play_list": "M1 14h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1zM6 12h9v-2h-9v2zM1 7h14v-2h-14v2zM1 2h14v-2h-14v2z", + "play_0": "M6 12c0.70 0 1.30 0 2 0v-1h1v-1h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v-1h-1v-1c-0.70 0-1.30 0-2 0 0 3.30 0 6.70 0 10z", + "lang": "M1 14v-2h-1v-12h14v1h2v13h-15zM7 6h-2v-1h-1v1h-2v3h2v1h1v-1h2v-3zM12 6h-3v-1h2v-1h-2v-1h3v-1h-4v5h4v-1zM15 2h-1v10h-12v1h13v-11zM3 8h1v-1h-1v1zM5 8h1v-1h-1v1z", + "arrow_3_w": "M10 8v-2h1v-1h1v-1h1v-2h-2v1h-1v1h-1v1h-1v1h-1v2h1v1h1v1h1v1h1v1h2v-2h-1v-1h-1v-1zM8 12v-2h-1v-1h-1v-1h-1v-2h1v-1h1v-1h1v-2h-2v1h-1v1h-1v1h-1v1h-1v2h1v1h1v1h1v1h1v1z", + "resources": "M1 8v4h2v2h4v-6zM1 6h6v-6h-4v2h-2zM9 8v6h4v-2h2v-4zM9 6h6v-4h-2v-2h-4z", + "terminal": "M1 12v-10h14v10h-14zM6 6h-1v-1h-1v-1h-1v1h1v1h1v1h-1v1h-1v1h1v-1h1v-1h1v-1zM13 4h-6v1h6v-1z", + "message": "M15 11v1h-1v1h-12v-1h-1v-1h-1v-7h1v-1h1v-1h1v-1h1v-1h1v1h1v1h8v1h1v1h1v7h-1zM14 4h-8v-1h-1v-1h-1v1h-1v1h-1v7h12v-7zM4 10h8v-2h-8v2zM4 7h4v-2h-4v2z", + "arrow_3_s": "M7 9h2v1h1v1h1v1h2v-2h-1v-1h-1v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h-1v1h-1v2h2v-1h1v-1h1zM3 7h2v-1h1v-1h1v-1h2v1h1v1h1v1h2v-2h-1v-1h-1v-1h-1v-1h-1v-1h-2v1h-1v1h-1v1h-1v1h-1z", + "home": "M7 1h-4v5h-2v1h1v1h1v1h1v1h1v1h1v1h1v1h2v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h-2v-5h-4v3h-2z", + "arrow_3_n": "M9 4h-2v-1h-1v-1h-1v-1h-2v2h1v1h1v1h1v1h1v1h2v-1h1v-1h1v-1h1v-1h1v-2h-2v1h-1v1h-1zM13 6h-2v1h-1v1h-1v1h-2v-1h-1v-1h-1v-1h-2v2h1v1h1v1h1v1h1v1h2v-1h1v-1h1v-1h1v-1h1z", + "popup": "M7 13h-5v-12h12v5h-2v-3h-8v8h3zM8 13h6v-6h-2v2h-1v-1h-1v-1h-1v-1h-2v2h1v1h1v1h1v1h-2z", + "arrow_4_wn": "M3 12h6v-1h-1v-1h-1v-1h1v-1h1v-1h1v-1h1v-1h1v-1h1c0-0.70 0-1.30 0-2-0.70 0-1.30 0-2 0v1h-1v1h-1v1h-1v1h-1v1h-1v1h-1v-1h-1v-1h-1v6z", + "money": "M7 1v2h-3v1h3v2h-2v-1h-1v1h-1v1h1v1h1v-1h2v2h-1v1h-1v1h-1v1h-1v1h2v-1h1v-1h1v-1h2v1h1v1h1v1h2v-1h-1v-1h-1v-1h-1v-1h-1v-2h3v-1h-3v-2h2v1h1v-1h1v-1h-1v-1h-1v1h-2v-2z", + "unlink": "M4 0v2h1v2h1v2h1v2h1v2h1v2h1v2h2v-2h-1v-2h-1v-2h-1v-2h-1v-2h-1v-2h-1v-2zM4 3h-3v8h6v-2h-4v-4h1zM9 3v2h4v4h-1v2h3v-8z", + "arrow_4_ws": "M3 2v6h1v-1h1v-1h1v1h1v1h1v1h1v1h1v1h1v1c0.70 0 1.30 0 2 0 0-0.70 0-1.30 0-2h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h-1v-1h1v-1h1v-1h-6z", + "folder_add": "M7 10v1h-1v1h-4v-10h12v8h-7zM13 5h-1v-1h-1v1h-1v1h1v1h1v-1h1v-1z", + "user": "M6 14h4v-2h2v-4h-2v-2h-4v2h-2v4h2zM3 5h10v-2h2v-3h-14v3h2z", + "arrow_3_e": "M6 6v2h-1v1h-1v1h-1v2h2v-1h1v-1h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v-1h-1v-1h-2v2h1v1h1v1zM8 2v2h1v1h1v1h1v2h-1v1h-1v1h-1v2h2v-1h1v-1h1v-1h1v-1h1v-2h-1v-1h-1v-1h-1v-1h-1v-1z" +} \ No newline at end of file diff --git a/src/assets/img/default.png b/src/assets/img/default.png new file mode 100644 index 0000000000000000000000000000000000000000..21395a7cb3f15e9a79d33c4783379a8ad859c5c2 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!3HD`IPL*ab)GJcAr`%RuQ+lYP~c%X;QO-t zZ1T6m-?m%`ySU1dJMxaKt;ey38Ik3F{cCMDcWmK19JxcObF;4K!KZxxg;id@ zTy&3nmgE^8<%=tI)3@(bu~eUN_nA;b{@bqn$hy-3q5MU)Y@uKC??0R@puxG$Aw-lR zuhGD{<;3=nSKY!}W%5rVgo@`Mb-o4tN>(to*V_{g5hpFQ`ftwIaXg$$mqelF{r G5}E+yd{LhO literal 0 HcmV?d00001 diff --git a/src/assets/style/timi-web.less b/src/assets/style/timi-web.less new file mode 100644 index 0000000..d522932 --- /dev/null +++ b/src/assets/style/timi-web.less @@ -0,0 +1,213 @@ +@import url(~/assets/style/variable); + +*::-webkit-scrollbar { + width: 10px !important; + height: 10px !important; + cursor: var(--tui-cur-default); + background: #CFD2E0; +} + +*::-webkit-scrollbar-corner { + background: #CFD2E0; + cursor: var(--tui-cur-default); +} + +*::-webkit-scrollbar-thumb { + cursor: var(--tui-cur-default); + background: #525870; +} + +*::selection { + color: #FFF; + background: #525870 !important; +} + +html { + cursor: var(--tui-cur-default); +} + +body { + width: 100% !important; + margin: 0; + padding: 0; + overflow-x: hidden !important; + overflow-y: scroll !important; + font-family: var(--tui-font); + -webkit-text-size-adjust: 100%; + + &::-webkit-scrollbar { + background: transparent; + } + + #root { + display: flex; + position: relative; + justify-content: center; + } +} + +a { + color: @tuiColors[blue]; + cursor: var(--tui-cur-pointer); + text-decoration: none; + + &:hover { + text-decoration: underline; + } +} + +a.underline { + text-decoration: underline; +} + +img { + display: block; +} + +input, select, textarea { + resize: none; + outline: none; + display: block; + background: transparent; +} + +label, +select, +input[type="radio"], +input[type="file"], +input[type="checkbox"] { + cursor: var(--tui-cur-default); +} + +textarea, +input[type="text"], +input[type="date"], +input[type="email"], +input[type="password"] { + cursor: var(--tui-cur-text); + -webkit-appearance: none; + + &:-webkit-autofill, + &:-webkit-autofill:hover, + &:-webkit-autofill:focus, + &:-webkit-autofill:active { + -webkit-background-clip: text; + } +} + +textarea { + tab-size: 4; + font-family: var(--tui-font); +} + +.gray-filter { + filter: grayscale(1); + -webkit-filter: grayscale(1); +} + +.bold { + font-weight: bold !important; +} + +.italic { + font-style: italic !important; +} + +.delete { + text-decoration: line-through !important; +} + +.underline { + text-decoration: underline !important; +} + +.not-underline { + text-decoration: none !important; +} + +.not-underline:hover { + text-decoration: none !important; +} + +/* 文本适当对齐 */ +.justify-text { + text-align: justify; +} + +/* 模糊玻璃效果:白色 */ +.glass-white { + color: var(--eui-black, #000); + background: rgba(255, 255, 255, .8); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); +} + +/* 模糊玻璃效果:黑色 */ +.glass-black { + color: var(--eui-white, #FFF); + background: rgba(0, 0, 0, .8); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); +} + +.word-space { + display: inline-block; + margin: 0 .5rem; +} + +/* 强制换行 */ +.break-all, +.break-all textarea { + word-wrap: break-word; + word-break: break-all; + white-space: normal; +} + +/* 文本溢出截断 */ +.clip-text { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +/* 禁止选择 */ +.diselect { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.selectable { + -webkit-touch-callout: default; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.ir-default, +.ir-pixelated { + image-rendering: pixelated; +} + +.ir-auto { + image-rendering: auto; +} + +.ir-smooth { + image-rendering: smooth; +} + +.cur-default { + cursor: var(--tui-cur-default); +} + +.cur-pointer { + cursor: var(--tui-cur-pointer); +} + +.cur-text { + cursor: var(--tui-cur-text); +} diff --git a/src/assets/style/variable.less b/src/assets/style/variable.less new file mode 100644 index 0000000..102e99b --- /dev/null +++ b/src/assets/style/variable.less @@ -0,0 +1,58 @@ +@tuiColors: { + red: #F33; + pink: #FF7A9B; + black: #111; + blue: #006EFF; + light-blue: #00A6FF; + green: GREEN; + orange: #E7913B; + gray: #666; + light-gray: #AAA; + dark-white: #E7EAEF; + yellow: #FF0; + purple: PURPLE; +} + +:root { + --tui-font: SimSun, PingFang SC, Microsoft YaHei, Arial Regular; + --tui-cur-default: url("../img/default.png"), default; + --tui-cur-pointer: url("../img/link.png"), pointer; + --tui-cur-text: url("../img/input.png"), text; + + --tui-shadow: 3px 3px 0 var(--tui-shadow-color); + --tui-bezier: cubic-bezier(.19, .1, .22, 1); + --tui-shadow-color: rgba(0, 0, 0, .2); + + each(@tuiColors, { + --tui-@{key}: @value; + }); + --tui-border: 1px solid var(--tui-light-gray); + + /* 等级对应颜色 */ + --tui-level-0: #BFBFBF; + --tui-level-1: #BFBFBF; + --tui-level-2: #95DDB2; + --tui-level-3: #92D1E5; + --tui-level-4: #FFB37C; + --tui-level-5: #FF6C00; + --tui-level-6: #F00; + --tui-level-7: #E52FEC; + --tui-level-8: #841CF9; + --tui-level-9: #151515; + + --tui-page-padding: .5rem 1rem; +} + +// 字体颜色 +each(@tuiColors, { + .@{key} { + color: @value; + } +}); + +// 背景颜色 +each(@tuiColors, { + .bg-@{key} { + background: @value; + } +}); diff --git a/src/components/background-effect/flower-fall/assets/petal.png b/src/components/background-effect/flower-fall/assets/petal.png new file mode 100644 index 0000000000000000000000000000000000000000..17ae29474db6dc973cf2baf120b7a75a7ee026a6 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^3P4=U!3HFMCNQjJU|_WLba4#HXncFiFz=9qK^*%|CduAUY_iJPqy-hWxamjisN6W>GDs# z-_>y=H2=mf28IpHw2@%tL z<-Zl(1TsOO%prQ;v+3vAk6m8A=ioe`z|+T-Vc&mlx)qpgWV>0NfuX@>-fH!#*PB30 z*$Y>iW@V*by}aui3(zDlHlR?zJbo7!n|0ei$v8~4Wn^G@GVP7$%5x93r5G4aP2ILo z>fuWL%wv2FAgNim;#~Knhot)hjrtP1KrJ=8tQ{o&reWRWi~lUv#=W0u3UZ=Dnd7%Z zfw2>6yD!-Bt-k)2lY!wv)wb|g73+2>JDr~n;wP~GVTx`D-+pA{t)n1sc)I$ztaD0e F0s!o_mx%xX literal 0 HcmV?d00001 diff --git a/src/components/background-effect/flower-fall/index.ts b/src/components/background-effect/flower-fall/index.ts new file mode 100644 index 0000000..387550e --- /dev/null +++ b/src/components/background-effect/flower-fall/index.ts @@ -0,0 +1,5 @@ +import view from "./index.vue"; +import Toolkit from "~/utils/Toolkit"; + +export const BEFlowerFall = Toolkit.withInstall(view); +export default BEFlowerFall; diff --git a/src/components/background-effect/flower-fall/index.vue b/src/components/background-effect/flower-fall/index.vue new file mode 100644 index 0000000..f18f6e6 --- /dev/null +++ b/src/components/background-effect/flower-fall/index.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/components/background-effect/style.less b/src/components/background-effect/style.less new file mode 100644 index 0000000..61e4cdc --- /dev/null +++ b/src/components/background-effect/style.less @@ -0,0 +1,8 @@ +.tui-background { + width: 100vw; + height: 100vh; + z-index: -1; + position: fixed; + overflow: hidden; + background-size: cover; +} diff --git a/src/components/captcha/index.ts b/src/components/captcha/index.ts new file mode 100644 index 0000000..ec4160b --- /dev/null +++ b/src/components/captcha/index.ts @@ -0,0 +1,5 @@ +import view from "./index.vue"; +import Toolkit from "~/utils/Toolkit"; + +export const Captcha = Toolkit.withInstall(view); +export default Captcha; diff --git a/src/components/captcha/index.vue b/src/components/captcha/index.vue new file mode 100644 index 0000000..028d2ef --- /dev/null +++ b/src/components/captcha/index.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/components/copyright/assets/bottom.png b/src/components/copyright/assets/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..041c518c8dcf470d43d3099232d5942e1f0457d5 GIT binary patch literal 786 zcmeAS@N?(olHy`uVBq!ia0y~yV15B)D{!y@$;J;s3m6!fZhE>nhE&XXdw1_D5km>K z2R$53t!EuKY`VBRV1q@+4X(I`*0l+5T{*Ui-8-1M_RSui+%+s4Hwvt|mL&T@XV%@D zDP{Y7<}H{0_Wa47cr|aKP1ZSPvyaprHsGm`-@j*C{lC}oKcDyZ_nUDsGB8}&`taiF zcD1(pJwHo+U;5g;J6EoZj-=_q5<;%|({W~}8Zq+BfrBg0l?@o8$ zTla42;#ps>Pk(kbIDXaA?`Q59Z+yMq+Kli!l(sO|)kMmgp&1@0) z#q(>&p>410wey0*{~QyYmK-0xs-(4OOWV{%J70RYzg($*Qs=yF@r+wvfsP+4;b^6wp7gW)B-U}zw23PYqwcTSw1_t zd|lY*oUL~+x|}zx`W>Zse9yGc8zEZGY-*1C^|m^@{MCKgIaSY=hn)TO+Pm`Cr4pmp zw{N|U_p&Qp3v{;cy{K2~&sAox{2cSdc&=;-&@zq%r`|7k-?i(|wbxt^b|jUo+ALxE zxi?C?cIDoETSR8&?o7XB%Wbay^GfQTn@0DptgXKybM@wqpZeJ+ApT~#aAf-qV4xnj zb<>fZfuVt+&#JlZ@#FJv9^1c*w_jzr^xM|eSAzbBn-pKG|GxL@($a3LX)a=>#@~Hp zk3YNNZTI`itM*TKjP8ALoO}K3bFZ1IcHwUp0L^n?IDDD?`y5C6jVrZ-iq|V#(yPt1 zn)%iD@8>7M(`|k)`&S$A+~%iGI=d{;6HFT*p>PA@1fL7QWTL + + + + + + diff --git a/src/components/empty-tips/index.ts b/src/components/empty-tips/index.ts new file mode 100644 index 0000000..898c7cc --- /dev/null +++ b/src/components/empty-tips/index.ts @@ -0,0 +1,5 @@ +import view from "./index.vue"; +import Toolkit from "~/utils/Toolkit"; + +export const EmptyTips = Toolkit.withInstall(view); +export default EmptyTips; diff --git a/src/components/empty-tips/index.vue b/src/components/empty-tips/index.vue new file mode 100644 index 0000000..20eb799 --- /dev/null +++ b/src/components/empty-tips/index.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/icon/index.ts b/src/components/icon/index.ts new file mode 100644 index 0000000..e401859 --- /dev/null +++ b/src/components/icon/index.ts @@ -0,0 +1,5 @@ +import view from "./index.vue"; +import Toolkit from "~/utils/Toolkit"; + +export const Icon = Toolkit.withInstall(view); +export default Icon; diff --git a/src/components/icon/index.vue b/src/components/icon/index.vue new file mode 100644 index 0000000..e6de183 --- /dev/null +++ b/src/components/icon/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/components/index.ts b/src/components/index.ts new file mode 100644 index 0000000..5ece431 --- /dev/null +++ b/src/components/index.ts @@ -0,0 +1,37 @@ +/** 导出所有组件 */ +import Icon from "./icon"; +import Popup from "./popup"; +import Captcha from "./captcha"; +import Loading from "./loading"; +import UserLevel from "./user-level"; +import Copyright from "./copyright"; +import EmptyTips from "./empty-tips"; +import MarkdownView from "./markdown-view"; +import BEFlowerFall from "./background-effect/flower-fall"; +import MarkdownEditor from "./markdown-editor"; + +export default [ + Icon, + Popup, + Captcha, + Loading, + UserLevel, + Copyright, + EmptyTips, + MarkdownView, + BEFlowerFall, + MarkdownEditor +]; + +export { + Icon, + Popup, + Captcha, + Loading, + UserLevel, + Copyright, + EmptyTips, + MarkdownView, + BEFlowerFall, + MarkdownEditor +}; diff --git a/src/components/loading/index.ts b/src/components/loading/index.ts new file mode 100644 index 0000000..de7aaad --- /dev/null +++ b/src/components/loading/index.ts @@ -0,0 +1,5 @@ +import view from "./index.vue"; +import Toolkit from "~/utils/Toolkit"; + +export const Loading = Toolkit.withInstall(view); +export default Loading; diff --git a/src/components/loading/index.vue b/src/components/loading/index.vue new file mode 100644 index 0000000..56a8bb6 --- /dev/null +++ b/src/components/loading/index.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/components/markdown-editor/CalcTextareaHeight.ts b/src/components/markdown-editor/CalcTextareaHeight.ts new file mode 100644 index 0000000..c0d3982 --- /dev/null +++ b/src/components/markdown-editor/CalcTextareaHeight.ts @@ -0,0 +1,112 @@ +// from element ui +// https://github.com/ElemeFE/element/blob/dev/packages/input/src/calcTextareaHeight.js + +let tempTextArea: HTMLTextAreaElement | null; + +const HIDDEN_STYLE = ` + height:0 !important; + visibility:hidden !important; + overflow:hidden !important; + position:absolute !important; + z-index:-1000 !important; + top:0 !important; + right:0 !important +`; + +const CONTEXT_STYLE = [ + "letter-spacing", + "line-height", + "padding-top", + "padding-bottom", + "font-family", + "font-weight", + "font-size", + "text-rendering", + "text-transform", + "width", + "text-indent", + "padding-left", + "padding-right", + "border-width", + "box-sizing" +]; + +type NodeStyling = { + contextStyle: string; + paddingSize: number; + borderSize: number; + boxSizing: string; +} + +export type Result = { + height: number; + minHeight: number; +} + +function calculateNodeStyling(targetElement: HTMLTextAreaElement): NodeStyling { + const style = window.getComputedStyle(targetElement); + + const boxSizing = style.getPropertyValue("box-sizing"); + + const paddingSize = ( + parseFloat(style.getPropertyValue("padding-bottom")) + + parseFloat(style.getPropertyValue("padding-top")) + ); + + const borderSize = ( + parseFloat(style.getPropertyValue("border-bottom-width")) + + parseFloat(style.getPropertyValue("border-top-width")) + ); + + const contextStyle = CONTEXT_STYLE + .map(name => `${name}:${style.getPropertyValue(name)}`) + .join(";"); + + return {contextStyle, paddingSize, borderSize, boxSizing}; +} + +export default function calc(el: HTMLTextAreaElement, minRows = 1, maxRows?: number) { + if (!tempTextArea) { + tempTextArea = document.createElement("textarea") as HTMLTextAreaElement; + document.body.appendChild(tempTextArea); + } + const {paddingSize, borderSize, boxSizing, contextStyle} = calculateNodeStyling(el); + + tempTextArea.setAttribute("style", `${contextStyle};${HIDDEN_STYLE}`); + tempTextArea.value = el.value || el.placeholder || ""; + + let height = tempTextArea.scrollHeight; + const result: Result = { + height: 0, + minHeight: 0 + }; + + if (boxSizing === "border-box") { + height = height + borderSize; + } else if (boxSizing === "content-box") { + height = height - paddingSize; + } + + tempTextArea.value = ""; + const singleRowHeight = tempTextArea.scrollHeight - paddingSize; + + if (minRows) { + let minHeight = singleRowHeight * minRows; + if (boxSizing === "border-box") { + minHeight = minHeight + paddingSize + borderSize; + } + height = Math.max(minHeight, height); + result.minHeight = minHeight; + } + if (maxRows) { + let maxHeight = singleRowHeight * maxRows; + if (boxSizing === "border-box") { + maxHeight = maxHeight + paddingSize + borderSize; + } + height = Math.min(maxHeight, height); + } + result.height = height; + tempTextArea.parentNode && tempTextArea.parentNode.removeChild(tempTextArea); + tempTextArea = null; + return result; +} diff --git a/src/components/markdown-editor/index.ts b/src/components/markdown-editor/index.ts new file mode 100644 index 0000000..3b79683 --- /dev/null +++ b/src/components/markdown-editor/index.ts @@ -0,0 +1,5 @@ +import view from "./index.vue"; +import Toolkit from "~/utils/Toolkit"; + +export const MarkdownEditor = Toolkit.withInstall(view); +export default MarkdownEditor; diff --git a/src/components/markdown-editor/index.vue b/src/components/markdown-editor/index.vue new file mode 100644 index 0000000..dd7d0e5 --- /dev/null +++ b/src/components/markdown-editor/index.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/src/components/markdown-view/index.ts b/src/components/markdown-view/index.ts new file mode 100644 index 0000000..38a19fb --- /dev/null +++ b/src/components/markdown-view/index.ts @@ -0,0 +1,6 @@ +import view from "./index.vue"; +import Toolkit from "~/utils/Toolkit"; +import "./style.less"; + +export const MarkdownView = Toolkit.withInstall(view); +export default MarkdownView; diff --git a/src/components/markdown-view/index.vue b/src/components/markdown-view/index.vue new file mode 100644 index 0000000..c784740 --- /dev/null +++ b/src/components/markdown-view/index.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/components/markdown-view/style.less b/src/components/markdown-view/style.less new file mode 100644 index 0000000..b618c76 --- /dev/null +++ b/src/components/markdown-view/style.less @@ -0,0 +1,341 @@ +@import url(~/assets/style/variable); + +.tui-markdown-view { + font-size: 14px; + line-height: 1.5; + + h1, + h2, + h3, + h4, + h5, + h6 { + margin: 2rem 0 .5rem 0; + padding: .25rem 1rem; + position: relative; + border-left: .4rem solid var(--tui-light-blue); + font-weight: bold; + } + + p:first-child, + h1:first-child, + h2:first-child, + h3:first-child, + h4:first-child, + h5:first-child, + h6:first-child { + margin: 0; + } + + h1:hover a.anchor, + h2:hover a.anchor, + h3:hover a.anchor, + h4:hover a.anchor, + h5:hover a.anchor, + h6:hover a.anchor { + text-decoration: none; + } + + h2 a, + h3 a { + color: #34495E; + } + + h1 { + font-size: 1rem; + line-height: 1.2; + } + + h2 { + font-size: 1rem; + line-height: 1.2; + } + + h3 { + font-size: 1rem; + line-height: 1.2; + } + + h4 { + font-size: 1rem; + } + + h5 { + font-size: .8rem; + } + + h6 { + color: #777; + font-size: 1rem; + } + + p, + ul, + ol, + dl, + table, + blockquote { + margin: .5rem 0; + min-height: 2em; + } + + p { + text-indent: 2em; + } + + blockquote p { + text-indent: 0; + } + + code { + padding: .2em .5em; + background: #EEE; + box-sizing: border-box; + border-radius: 2px; + } + + li > ol, + li > ul { + margin: 0 0; + } + + li > p { + text-indent: 0; + } + + hr { + height: 2px; + margin: 16px 0; + border: 0 none; + padding: 0; + overflow: hidden; + background: #E7E7E7; + box-sizing: content-box; + } + + h1 p, + h2 p, + h3 p, + h4 p, + h5 p, + h6 p { + margin-top: 0; + } + + li p.first { + display: inline-block; + } + + ul, + ol { + padding-left: 30px; + } + + ul:first-child, + ol:first-child { + margin-top: 0; + } + + ul:last-child, + ol:last-child { + margin-bottom: 0; + } + + ul { + list-style-type: disc; + } + + video { + width: 100%; + background: #000; + } + + iframe { + width: 100%; + height: 520px; + } + + blockquote { + padding: 2px 10px; + background: rgba(153, 153, 153, .1); + border-left: 4px solid #EDEDED; + } + + table { + padding: 0; + margin: 0 auto; + min-width: 240px; + max-width: 100%; + word-break: initial; + border-spacing: 0; + border-collapse: collapse; + } + + table thead { + background: #F2F2F2; + } + + table tr { + margin: 0; + padding: 0; + border-top: 1px solid #DFE2E5; + } + + table tr:nth-child(2n) { + background-color: #FAFAFA; + } + + table tr th { + border: 1px solid #DFE2E5; + margin: 0; + padding: 2px 13px; + text-align: left; + font-weight: bold; + border-bottom: 0; + } + + table tr td { + border: 1px solid #DFE2E5; + margin: 0; + padding: 0 13px; + word-wrap: break-word; + word-break: break-all; + text-align: left; + white-space: normal; + } + + table tr th:first-child, + table tr td:first-child { + margin-top: 0; + } + + table tr th:last-child, + table tr td:last-child { + margin-bottom: 0; + } + + tt { + color: #e96900; + padding: 2px 4px; + font-size: 0.92rem; + background: #F8F8F8; + border-radius: 2px; + } + + tt { + margin: 0 2px; + } + + .block { + display: block; + } + + .center { + text-align: center; + justify-content: center; + } + + .border { + border: 1px solid #525870; + } + + .media { + margin: .5rem auto; + display: block; + max-width: 100%; + + + .media-tips { + color: #777; + display: block; + text-align: center; + margin-bottom: 2rem; + } + } + + // 代码 + pre[class*="language-"] { + border: 1px solid #B8BBC9; + padding: 0 !important; + position: relative; + overflow: auto; + font-size: 14px; + background: transparent; + max-height: var(data-max-height); + transition: max-height .5s var(--tui-bezier); + font-family: var(--td-font-family); + line-height: 1; + border-radius: 0; + + code { + color: #333; + background: transparent; + text-shadow: none !important; + font-family: var(--td-font-family); + + .line-numbers-rows { + left: 0; + float: left; + z-index: 1; + position: sticky; + background: rgba(242, 242, 242, .9); + letter-spacing: 1px; + + >span::before { + padding-right: .2rem; + } + } + + .codes { + position: absolute; + min-width: calc(100% - 4.6em); + padding-right: .5em; + + .token.namespace { + opacity: 1; + } + + .token.punctuation { + color: #333; + } + + .token.constant { + color: #FF7A9B; + } + + .token.annotation { + color: purple; + } + + .token.function { + color: #777; + } + + .token.class-name { + color: #FF461F; + } + + .token.generics .class-name { + color: #895532; + font-weight: bold; + } + + .token.comment { + color: #999; + } + + .token.string { + color: #55AA55; + } + + .token.number { + color: #EB9354; + } + + .token.keyword, + .token.boolean { + color: #177CB0; + } + } + } + } +} diff --git a/src/components/popup/index.ts b/src/components/popup/index.ts new file mode 100644 index 0000000..144dc2d --- /dev/null +++ b/src/components/popup/index.ts @@ -0,0 +1,5 @@ +import view from "./index.vue"; +import Toolkit from "~/utils/Toolkit"; + +export const Popup = Toolkit.withInstall(view); +export default Popup; diff --git a/src/components/popup/index.vue b/src/components/popup/index.vue new file mode 100644 index 0000000..2c0bda6 --- /dev/null +++ b/src/components/popup/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/user-level/icon.png b/src/components/user-level/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3f683c6b53aa4ba5b458140b4e181409953ee361 GIT binary patch literal 745 zcmVs13EZ7~0XObJ?C#|&sC#!6Wh3_h>4sf6lqWQ4 zb0z}>1^NL2o*D8Dhw~u_Mu=3~wq!06QPg9>+P0-~yWQG5IV)_M1_1zya1ct)X)#ho zN>y(QYulFiXid}L*;{;8$v?uLa3TXWkk&)jj$R>A9P6Bw3PgmMht)I<%A>yOn6jV$ zO&f1o43k0-|Mr-c*WcE(-+yhgZ4Rs5T7|84YeH)=MxWk)#MN$11rM}=WiV3?%ss)4j)X1mR?vRKo8`}vs9w9BqnVau*3v=(D@S5I-- z^#{}5)zg!P$~i4YD#>RSI0+_O!*J8I%dRI5;+|aEWUMSKof8>oRU(z;Hb+>jY2nA0 zyq^bnyLkCo@H{SQGtYL+Lfh%w?&p;Ja@62SFxeUgo2I4BoHz(?7wGBjSXo#$Co<4` zN$x-&EY`H2G2fe(W}w1o22@&$DbRyy@8Q(6Vor;ZN;j>5(+nuhwBm>iwoN+&;vl>S z^z`;<+MsMsWS~`vlxs(?;!TS=O$&x;0jRVVQ=kXaf?`@Rr^QI6n^wRH5>3m=5^S3m zfH(*N(9_$aX@jykk%1aW?Q`mFYKk`Pk*OxxFc71q~#LTfQb)9xDkdVlz)op#qJ z&6IOmjMP8)??GShiI2uTxdaUEDmWu*J<2mDXYm zbpCL4d^8b8ax?h9@7fup!vfUdU`un7M9J44Ael{FZwdWRlOc zRaL35s;a287Gt2pFdT1_2chJg79*AHGYy^uldXAiOe=wdhG9TYZ^z2QvN@4~RwYud b9liPs<5=33K;O^l00000NkvXXu0mjf4?|zj literal 0 HcmV?d00001 diff --git a/src/components/user-level/index.ts b/src/components/user-level/index.ts new file mode 100644 index 0000000..3b4fece --- /dev/null +++ b/src/components/user-level/index.ts @@ -0,0 +1,5 @@ +import view from "./index.vue"; +import Toolkit from "~/utils/Toolkit"; + +export const UserLevel = Toolkit.withInstall(view); +export default UserLevel; diff --git a/src/components/user-level/index.vue b/src/components/user-level/index.vue new file mode 100644 index 0000000..b33b7d5 --- /dev/null +++ b/src/components/user-level/index.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..264cd2b --- /dev/null +++ b/src/index.ts @@ -0,0 +1,90 @@ +import type { App } from "vue"; + +import components from "./components"; + +import Network from "./utils/Network"; +import UserAPI from "./api/UserAPI"; +import CommonAPI from "./api/CommonAPI"; +import CommentAPI from "./api/CommentAPI"; +import DeveloperAPI from "./api/DeveloperAPI"; + +import Time from "./utils/Time"; +import IOSize from "./utils/IOSize"; +import Events from "./utils/Events"; +import Cooker from "./utils/Cooker"; +import Toolkit from "./utils/Toolkit"; +import Resizer from "./utils/Resizer"; +import Storage from "./utils/Storage"; +import Prismjs from "./utils/Prismjs"; +import Markdown from "./utils/Markdown"; +import Scroller from "./utils/Scroller"; +import IconMapper from "./utils/IconMapper"; +import SettingMapper from "./utils/SettingMapper"; + +import VPopup from "./utils/directives/Popup"; +import VDraggable from "./utils/directives/Draggable"; + +import { userStore } from "./store/user"; +import { deviceStore } from "./store/device"; + + +import "./assets/style/variable.less"; +import "./assets/style/timi-web.less"; + +export * from "./components"; + +export * from "./types/Model"; +export * from "./types/User"; +export * from "./types/Comment"; +export * from "./types/Setting"; +export * from "./types/Template"; +export * from "./types/Developer"; +export * from "./types/Attachment"; + +export * from "./utils/Prismjs"; + +export * from "./utils/directives/Popup"; + +export type { ScrollListener } from "./utils/Scroller"; +export type { DraggableConfig } from "./utils/directives/Draggable"; +export type { PopupConfig } from "./utils/directives/Popup"; + +const install = function (app: App) { + components.forEach(component => { + app.use(component as unknown as { install: () => any }); + }); +}; +const axios = Network.axios; + +export default { + install +}; + +export { + axios, + Network, + + UserAPI, + CommonAPI, + CommentAPI, + DeveloperAPI, + + userStore, + deviceStore, + + Time, + Events, + IOSize, + Cooker, + Toolkit, + Resizer, + Storage, + Prismjs, + Markdown, + Scroller, + IconMapper, + SettingMapper, + + VPopup, + VDraggable +}; diff --git a/src/store/device.ts b/src/store/device.ts new file mode 100644 index 0000000..c4f7e80 --- /dev/null +++ b/src/store/device.ts @@ -0,0 +1,110 @@ +import { Resizer } from "~/index"; + +// true 为手机 +const isPhone = ref(false); +// true 为平板 +const isTablet = ref(false); +// true 为桌面 +const isDesktop = ref(false); +// true 为大屏幕 +const isLargeScreen = ref(false); + +// true 为竖屏 +const isVertical = ref(false); +// true 为横屏 +const isHorizontal = ref(false); +// 宽高比 +const aspectRatio = ref(0); +// true 为超宽屏 +const isUltrawide = ref(false); +// true 为近似方屏 +const isSquare = ref(false); + +// 当前断点 +const currentBreakpoint = ref<"xs" | "sm" | "md" | "lg" | "xl">("lg"); +// 当前屏幕宽度 +const screenWidth = ref(0); +// 当前屏幕高度 +const screenHeight = ref(0); +// 短屏幕(高度小于 500) +const isShortScreen = ref(false); +// true 为启用移动端布局 +const isMobileLayout = ref(false); + +/** 断点配置,单位:px */ +enum Breakpoints { + + /** 超小设备 */ + XS = 480, + + /** 手机 */ + SM = 650, + + /** 平板 */ + MD = 768, + + /** 笔记本 */ + LG = 1024, + + /** 大屏幕 */ + XL = 1440 +} + +Resizer.addListener("DEVICE_SIZE", (width, height) => { + screenWidth.value = width; + screenHeight.value = height; + + // 设备类型 + isPhone.value = width < Breakpoints.SM; + isTablet.value = width >= Breakpoints.SM && width < Breakpoints.LG; + isDesktop.value = width >= Breakpoints.LG; + isLargeScreen.value = width >= Breakpoints.XL; + + // 屏幕方向 + isVertical.value = width < height; + isHorizontal.value = !isVertical.value; + + // 宽高比特征 + aspectRatio.value = width / height; + isUltrawide.value = 2 <= aspectRatio.value; // 21:9 ≈ 2.33 + isSquare.value = 0.9 < aspectRatio.value && aspectRatio.value < 1.1; + + // 布局相关 + isShortScreen.value = height < 500; + isMobileLayout.value = width < Breakpoints.MD; + + if (Breakpoints.XL <= width) { + currentBreakpoint.value = "xl"; + } else if (Breakpoints.LG <= width) { + currentBreakpoint.value = "lg"; + } else if (Breakpoints.MD <= width) { + currentBreakpoint.value = "md"; + } else if (Breakpoints.SM <= width) { + currentBreakpoint.value = "sm"; + } else { + currentBreakpoint.value = "xs"; + } +}); + +const deviceStore = { + isPhone, + isTablet, + isDesktop, + isLargeScreen, + + isVertical, + isHorizontal, + aspectRatio, + isUltrawide, + isSquare, + + currentBreakpoint, + screenWidth, + screenHeight, + isShortScreen, + isMobileLayout +}; + +export { + deviceStore +}; diff --git a/src/store/user.ts b/src/store/user.ts new file mode 100644 index 0000000..9be2aab --- /dev/null +++ b/src/store/user.ts @@ -0,0 +1,77 @@ +import { LoginResponse, LoginToken, LoginUser, Storage, UserAPI, UserToken } from "timi-web"; + +const loginUser = reactive({ + token: undefined, + user: undefined +}); + +function isLogged(): boolean { + return !!loginUser.user; +} + +async function login4Token(token: LoginToken): Promise { + loginUser.token = token; + // 未过期 + try { + const resp = await UserAPI.login4Token(); + await updateToken(resp); + return resp; + } catch (e) { + await logout(); + } + return null; +} + +async function login4Storage(): Promise { + if (!loginUser.user && (loginUser.token || Storage.has("token"))) { + // 未登录,储存有令牌 + const token = Storage.getJSON("token") as UserToken; + if (new Date().getTime() < token.expireAt) { + return await login4Token(token); + } + } + return null; +} + +async function updateToken(loginResponse: LoginResponse): Promise { + loginUser.token = { + id: loginResponse.id, + value: loginResponse.token, + expireAt: loginResponse.expireAt + }; + loginUser.user = await UserAPI.view(loginResponse.id); + + Storage.setJSON("token", { + value: loginUser.token.value, + expireAt: loginUser.token.expireAt + } as UserToken); +} + +async function logout(): Promise { + await UserAPI.logout(); + + loginUser.token = undefined; + loginUser.user = undefined; + + Storage.remove("token"); +} + +async function reloadProfile() { + if (loginUser.token && loginUser.token.id) { + loginUser.user = await UserAPI.view(loginUser.token.id); + } +} + +const userStore = { + loginUser, + isLogged, + login4Token, + login4Storage, + updateToken, + logout, + reloadProfile +}; + +export { + userStore +}; diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..e071ac8 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,43 @@ +import type { Plugin } from "vue"; + +/** + * 安装方法 + */ +export type InstallRecord = T & Plugin; + +/** + * 默认插槽参数 + */ +export type DefaultSlotProp = (props: {}) => unknown + +/** + * 默认插槽类型 + */ +export interface DefaultSlots { + default: DefaultSlotProp; + icon?: DefaultSlotProp; +} + +/** + * 合并类型为交叉类型 + */ +export type Merge = { + [K in keyof T]: T[K] +} & { + [K in keyof R]: R[K] +} + +/** + * 合并交叉类型 + */ +type MergeIntersection = Pick + +/** + * 提取必传属性 + */ +export type PickRequiredUnion = MergeIntersection>, Omit>> + +/** + * 除了提取的属性,其他都是必传属性 + */ +export type PickNotRequiredUnion = MergeIntersection, Required>>> diff --git a/src/types/Attachment.ts b/src/types/Attachment.ts new file mode 100644 index 0000000..575a718 --- /dev/null +++ b/src/types/Attachment.ts @@ -0,0 +1,24 @@ +import { Model } from "./Model"; + +export type Attachment = { + bizType: AttachmentBizType; + bizId: number; + attachType?: string; + mongoId: string; + lidTitle?: number; + name?: string; + size: number; +} & Model + +export type AttachmentView = { + title?: string; +} & Attachment + +export enum AttachmentBizType { + + GIT_ISSUE, + + GIT_MERGE, + + GIT_RELEASE +} diff --git a/src/types/Comment.ts b/src/types/Comment.ts new file mode 100644 index 0000000..e7d3734 --- /dev/null +++ b/src/types/Comment.ts @@ -0,0 +1,78 @@ +import { Model, Page } from "./Model"; +import { UserView } from "./User"; + +/** 评论 */ +export type Comment = { + bizType: CommentBizType; + bizId: number; + userId?: number; + nick?: string; + content: string; +} & Model + +/** 评论视图 */ +export type CommentView = { + /** 所属用户 */ + user?: UserView; + + /** 回复列表 */ + replies: CommentReplyView[]; + + /** 回复分页 */ + repliesPage: CommentReplyPage; + + /** 用于绑定组件当前页下标 */ + repliesCurrent: number; + + /** 回复数量 */ + repliesLength: number; + + /** 关联文章 */ + article?: object; + + /** 关联 Git 仓库 */ + repository?: object; +} & Comment; + +export type CommentReply = { + replyId?: number; + commentId: number; + senderId?: number; + senderNick?: string; + receiverId?: number; + receiverNick?: string; + content: string; +} & Model; + +export type CommentReplyView = { + comment: CommentView; + sender?: UserView; + receiver?: UserView; +} & CommentReply; + +export type CommentPage = { + bizType?: CommentBizType; + bizId?: number; +} & Page; + +export enum CommentReplyBizType { + + COMMENT = "COMMENT", + + SENDER = "SENDER", + + RECEIVER = "RECEIVER" +} + +export type CommentReplyPage = { + bizType: CommentReplyBizType + bizId?: number +} & Page; + +export enum CommentBizType { + ARTICLE = "ARTICLE", + + GIT_ISSUE = "GIT_ISSUE", + + GIT_MERGE = "GIT_MERGE", +} diff --git a/src/types/Developer.ts b/src/types/Developer.ts new file mode 100644 index 0000000..859c0c3 --- /dev/null +++ b/src/types/Developer.ts @@ -0,0 +1,6 @@ +/** 开发者配置 */ +export type Developer = { + developerId?: number; + name?: string; + rsa?: string; +} diff --git a/src/types/Model.ts b/src/types/Model.ts new file mode 100644 index 0000000..d062fa9 --- /dev/null +++ b/src/types/Model.ts @@ -0,0 +1,79 @@ +export enum RunEnv { + DEV = "DEV", + DEV_SSL = "DEV_SSL", + PROD = "PROD" +} + +// 基本实体模型 +export type Model = { + id?: number; + + createdAt?: number; + updatedAt?: number; + deletedAt?: number; +} + +export type Response = { + code: number; + msg?: string; + data: object; +} + +export type Page = { + index: number; + size: number; + keyword?: string; + orderMap?: { [key: string]: OrderType }; +} + +export enum OrderType { + ASC = "ASC", + DESC = "DESC" +} + +export type PageResult = { + total: number; + list: T[]; +} + +// 携带验证码的请求体 +export type CaptchaData = { + from: string; + captcha: string; + data: T; +} + +export enum CaptchaFrom { + + LOGIN = "LOGIN", + + REGISTER = "REGISTER", + + /** 评论 */ + COMMENT = "COMMENT", + + /** 评论回复 */ + COMMENT_REPLY = "COMMENT_REPLY", + + /** Git 反馈 */ + GIT_ISSUE = "GIT_ISSUE", + + /** Git 合并请求 */ + GIT_MERGE = "GIT_MERGE", +} + +export enum ImageType { + AUTO = "ir-auto", + SMOOTH = "ir-smooth", + PIXELATED = "ir-pixelated" +} + +export type KeyValue = { + key: string; + value: T; +} + +export type LabelValue = { + label: string; + value: T; +} diff --git a/src/types/Setting.ts b/src/types/Setting.ts new file mode 100644 index 0000000..c25568f --- /dev/null +++ b/src/types/Setting.ts @@ -0,0 +1,28 @@ +export enum SettingKey { + RUN_ENV = "RUN_ENV", + PUBLIC_RESOURCES = "PUBLIC_RESOURCES", + + DOMAIN_ROOT = "DOMAIN_ROOT", + DOMAIN_API = "DOMAIN_API", + DOMAIN_GIT = "DOMAIN_GIT", + DOMAIN_BLOG = "DOMAIN_BLOG", + DOMAIN_SPACE = "DOMAIN_SPACE", + DOMAIN_DOWNLOAD = "DOMAIN_DOWNLOAD", + DOMAIN_RESOURCE = "DOMAIN_RESOURCE", + + ENABLE_COMMENT = "ENABLE_COMMENT", + ENABLE_DEBUG = "ENABLE_DEBUG", + ENABLE_LOGIN = "ENABLE_LOGIN", + ENABLE_REGISTER = "ENABLE_REGISTER", + ENABLE_USER_UPDATE = "ENABLE_USER_UPDATE", +} + +export type PublicResources = { + wechatReceiveQRCode: string; + user: PublicResourcesUser; +} + +export type PublicResourcesUser = { + avatar: string; + wrapper: string; +} diff --git a/src/types/Template.ts b/src/types/Template.ts new file mode 100644 index 0000000..0c29d35 --- /dev/null +++ b/src/types/Template.ts @@ -0,0 +1,6 @@ +export enum TemplateBizType { + + GIT = "GIT", + + FOREVER_MC = "FOREVER_MC" +} diff --git a/src/types/User.ts b/src/types/User.ts new file mode 100644 index 0000000..4b57d45 --- /dev/null +++ b/src/types/User.ts @@ -0,0 +1,89 @@ +import { ImageType, Model } from "./Model"; +import { AttachmentView } from "./Attachment"; + +export type User = { + name: string; + email?: string; + emailVerifyAt: number; + unmuteAt?: number; + unbanAt?: number; +} & Model; + +export type UserView = { + profile: UserProfileView +} & User; + +export enum UserAttachType { + + AVATAR, + + WRAPPER, + + DEFAULT_AVATAR, + + DEFAULT_WRAPPER, +} + +export type UserProfile = { + userId: number; + avatarType: ImageType; + wrapperType: ImageType; + + exp: number; + sex?: number; + birthdate?: number; + qq?: string; + description: string; + lastLoginIP?: string; + lastLoginAt?: number; + updatedAt?: number; +} + +export type UserProfileView = { + attachmentList?: AttachmentView[] +} & UserProfile + +export type UserToken = { + value: string; + expireAt: number; +} + +export type RegisterRequest = { + name: string; + password: string; + email?: string; +} + +export type LoginRequest = { + user: string; + password: string; +} + +// 登录返回 +export type LoginResponse = { + id: number; + token: string; + expireAt: number; +} + +export type LoginUser = { + token?: LoginToken; + user?: UserView +} + +export type LoginToken = { + id?: number; +} & UserToken; + +export enum LoginType { + ALERT, + IFRAME, + REDIRECT +} + +export type UserLevelType = { + exp: number; // 经验数值,和 UserData.exp 一样 + value: number; // 经验对应等级,[0, 8] + percent: number; // 该经验在该等级的百分比 [0, 1] + nextLevelUp: number; // 下一级经验值 +} diff --git a/src/utils/Cooker.ts b/src/utils/Cooker.ts new file mode 100644 index 0000000..c50911a --- /dev/null +++ b/src/utils/Cooker.ts @@ -0,0 +1,31 @@ +export default class Cooker { + + static set(name: string, value: string, ttlMS: number) { + let expires = ""; + if (ttlMS) { + let date = new Date(); + date.setTime(date.getTime() + ttlMS); + expires = "; expires=" + date.toUTCString(); + } + document.cookie = name + "=" + (value || "") + expires + "; path=/"; + } + + static get(name: string) { + let nameSplit = name + "="; + let ca = document.cookie.split(";"); + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) == " ") { + c = c.substring(1, c.length); + } + if (c.indexOf(nameSplit) == 0) { + return c.substring(nameSplit.length, c.length); + } + } + return undefined; + } + + static remove(name: string) { + document.cookie = name + "=; Max-Age=-99999999;"; + } +} diff --git a/src/utils/Events.ts b/src/utils/Events.ts new file mode 100644 index 0000000..a7cb754 --- /dev/null +++ b/src/utils/Events.ts @@ -0,0 +1,106 @@ +/** + * ### 全局事件管理 + * + * ```js + * // 注册 + * Events.register("eventName", () => { + * // 触发执行 + * }); + * + * // 触发 + * Events.emit("eventName", '支持参数'); + * + * // 移除 + * Events.remove("eventName"); + * ``` + */ +export default class Events { + + // 监听数组 + private static listeners = new Map[]>(); + + /** + * 注册事件(会叠加) + * + * @param key 事件名称 + * @param callback 回调函数 + */ + public static register(key: T, callback: Function) { + const observers: Observer[] | undefined = Events.listeners.get(key); + if (!observers) { + Events.listeners.set(key, []); + } + Events.listeners.get(key)?.push(new Observer(key, callback)); + } + + /** + * 重置并注册(不会叠加) + * + * @param key 事件名称 + * @param callback 回调函数 + */ + public static reset(key: T, callback: Function) { + Events.listeners.set(key, []); + this.register(key, callback); + } + + /** + * 移除事件 + * + * @param key 事件名称 + */ + public static remove(key: T) { + const observers: Observer[] | undefined = Events.listeners.get(key); + if (observers) { + for (let i = 0, l = observers.length; i < l; i++) { + if (observers[i].equals(key)) { + observers.splice(i, 1); + break; + } + } + } + Events.listeners.delete(key); + } + + /** + * 触发事件 + * + * @param key 事件名称 + * @param args 参数 + */ + public static emit(key: T, ...args: any[]) { + const observers: Observer[] | undefined = Events.listeners.get(key); + if (observers) { + for (const observer of observers) { + // 通知 + observer.notify(...args); + } + } + } +} + +/** 观察者 */ +class Observer { + + private callback: Function = () => {}; // 回调函数 + + private readonly key: T; + + constructor(key: T, callback: Function) { + this.key = key; + this.callback = callback; + } + + /** + * 发送通知 + * + * @param args 不定参数 + */ + notify(...args: any[]): void { + this.callback.call(this.key, ...args); + } + + equals(name: any): boolean { + return name === this.key; + } +} diff --git a/src/utils/IOSize.ts b/src/utils/IOSize.ts new file mode 100644 index 0000000..83169af --- /dev/null +++ b/src/utils/IOSize.ts @@ -0,0 +1,80 @@ +export enum Unit { + + /** B */ + B = "B", + + /** KB */ + KB = "KB", + + /** MB */ + MB = "MB", + + /** GB */ + GB = "GB", + + /** TB */ + TB = "TB", + + /** PB */ + PB = "PB", + + /** EB */ + EB = "EB" +} + +/** 储存单位 */ +export default class IOSize { + + /** 1 字节 */ + public static BYTE = 1; + + /** 1 KB */ + public static KB = IOSize.BYTE << 10; + + /** 1 MB */ + public static MB = IOSize.KB << 10; + + /** 1 GB */ + public static GB = IOSize.MB << 10; + + /** 1 TB */ + public static TB = IOSize.GB << 10; + + /** 1 PB */ + public static PB = IOSize.TB << 10; + + /** 1 EB */ + public static EB = IOSize.PB << 10; + + public static Unit = Unit; + + /** + *

格式化一个储存容量,保留两位小数 + *

+	 *     // 返回 100.01 KB
+	 *     format(102411, 2);
+	 * 
+ * + * @param size 字节大小 + * @param fixed 保留小数 + * @param stopUnit 停止单位 + * @return + */ + public static format(size: number, fixed = 2, stopUnit?: Unit): string { + const units = Object.keys(Unit); + if (0 < size) { + for (let i = 0; i < units.length; i++, size /= 1024) { + const unit = units[i]; + if (size <= 1000 || i === units.length - 1 || unit === stopUnit) { + if (i === 0) { + // 最小单位不需要小数 + return size + " B"; + } else { + return `${size.toFixed(fixed)} ${unit}`; + } + } + } + } + return "0 B"; + } +} diff --git a/src/utils/IconMapper.ts b/src/utils/IconMapper.ts new file mode 100644 index 0000000..9ffd495 --- /dev/null +++ b/src/utils/IconMapper.ts @@ -0,0 +1,26 @@ +import iconJson from "../assets/icon.json"; + +export default class IconMapper { + + private static instance: IconMapper; + + icons = new Map(); + + private constructor() { + Object.entries(iconJson).forEach(([key, value]) => this.icons.set(key, value)); + } + + public getSVG(name: string, scale = 1) { + const svg = IconMapper.getInstance().icons.get(name.toLowerCase()); + return svg?.replace(/\d+(\.\d+)?/gm, n => { + return String((Number(n) * scale)); + }); + } + + public static getInstance(): IconMapper { + if (!IconMapper.instance) { + IconMapper.instance = new IconMapper(); + } + return IconMapper.instance; + } +} diff --git a/src/utils/Markdown.ts b/src/utils/Markdown.ts new file mode 100644 index 0000000..762fc5a --- /dev/null +++ b/src/utils/Markdown.ts @@ -0,0 +1,209 @@ +import { marked } from "marked"; +import { gfmHeadingId } from "marked-gfm-heading-id"; +import { markedHighlight } from "marked-highlight"; +import { mangle } from "marked-mangle"; +import Prism from "prismjs"; +import "prismjs/themes/prism.css"; +import { Toolkit } from "~/index"; + +export default class Markdown { + + private static instance: Markdown; + + renderer = new marked.Renderer(); + + private constructor() { + marked.use(mangle()); + marked.use(gfmHeadingId()); + marked.use(markedHighlight({ + highlight(code: string, lang: string) { + if (Prism.languages[lang]) { + return Prism.highlight(code, Prism.languages[lang], lang); + } else { + return code; + } + } + })); + // Markdown 解析器配置 + marked.setOptions({ + renderer: this.renderer, + pedantic: false, + gfm: true, + breaks: true + }); + + Prism.hooks.add("complete", (env: any) => { + if (!env.code) return; + + // 行号渲染调整 + const el = env.element; + + const lineNumber = el.querySelector(".line-numbers-rows") as HTMLDivElement; + if (lineNumber) { + const clone = lineNumber.cloneNode(true); + el.removeChild(lineNumber); + // 加容器做滚动 + el.innerHTML = `${el.innerHTML}`; + el.insertBefore(clone, el.firstChild); + + if (el.parentNode) { + const markdownRoot = el.parentNode.parentNode; + if (markdownRoot) { + const maxHeight = markdownRoot.dataset.maxHeight; + if (maxHeight === "auto") { + return; + } + // 注册双击事件 + const lines = lineNumber.children.length; + if (lines < 18) { + return; + } + const parent = el.parentNode; + parent.addEventListener("dblclick", (): void => { + const isExpand = parent.classList.contains("expand"); + if (isExpand) { + parent.style.maxHeight = maxHeight; + parent.classList.remove("expand"); + } else { + parent.style.maxHeight = lines * 22 + "px"; + parent.classList.add("expand"); + } + const selection = window.getSelection(); + if (selection) { + selection.removeAllRanges(); + } + }); + } + } + } + }); + + /** + * ### 超链渲染方式 + * + * 1. 链接前加 ~ 符号会被渲染为新标签打开。例:`[文本](~链接)` + * 3. 没有标题的链接将使用文本作为标题 + * 4. 没有链接的会被渲染为 span 标签 + */ + this.renderer.link = function ({ href, title, text }) { + title = title ?? text; + + if (!href) { + return `${text}`; + } + // 新标签打开 + let target = "_self"; + if (href.startsWith("~")) { + target = "_blank"; + href = href.substring(1); + } + // 内部资源链接 + if (href.indexOf("@") !== -1) { + href = Toolkit.toResURL(href); + } + { + // 处理嵌套 markdown,这可能不是最优解 + const tokens = (marked.lexer(text, { inline: true } as any) as any)[0].tokens; + text = this.parser.parseInline(tokens); + } + return `
${text}`; + }; + + /** + * ### 重点内容扩展 + * + * ```md + * 默认 `文本` 表现为红色 + * 使用 `[red bold]文本` 可以自定义类 + * ``` + */ + this.renderer.codespan = ({ text }) => { + const clazz = text.match(/\[(.+?)]/); + if (clazz) { + return `${text.substring(text.indexOf("]") + 1)}`; + } else { + return `${text}`; + } + }; + + /** + * ### 组件渲染方式(原为图像渲染方式) + * + * ```md + * [] 内文本以 # 开始时,该组件带边框 + * ``` + * + * 1. 渲染为网页:`![]($/html/index.html)` + * 2. 渲染为视频:`![](#/media/video.mp4)` + * 3. 渲染为音频:`![](~/media/music.mp3)` + * 4. 渲染为图片:`![](/image/photo.png)` + * 6. 带边框图片:`![#图片Alt](/image/photo.png)` + */ + this.renderer.image = ({ href, title, text }) => { + const clazz = ["media"]; + + const hasBorder = text[0] === "#"; + if (hasBorder) { + clazz.push("border"); + } + title = title ?? text; + + const extendTags = ["~", "#", "$"]; + let extendTag; + if (extendTags.indexOf(href.charAt(0)) !== -1) { + extendTag = href.charAt(0); + } + + // 内部资源链接 + if (href.indexOf("@") !== -1) { + if (extendTag) { + href = href.substring(1); + } + href = Toolkit.toResURL(href); + } + + const clazzStr = clazz.join(" "); + let elStr; + switch (extendTag) { + case "~": + elStr = ``; + break; + case "#": + elStr = ``; + break; + case "$": + elStr = ``; + break; + default: + elStr = `${title}`; + break; + } + return elStr + `${title}`; + }; + } + + /** + * ### 解析 Markdown 文本为 HTML 节点 + * + * ```js + * const html = toHTML('# Markdown Content'); + * ``` + * + * @param mkData Markdown 文本 + * @returns HTML 节点 + */ + public toHTML(mkData: string | undefined): string | Promise { + if (mkData) { + return marked(mkData); + } else { + return ""; + } + } + + public static getInstance(): Markdown { + if (!Markdown.instance) { + Markdown.instance = new Markdown(); + } + return Markdown.instance; + } +} diff --git a/src/utils/MethodLocker.ts b/src/utils/MethodLocker.ts new file mode 100644 index 0000000..244c9fd --- /dev/null +++ b/src/utils/MethodLocker.ts @@ -0,0 +1,48 @@ +export class MethodLocker { + private isLocked: boolean = false; + private queue: Array<() => Promise> = []; + + /** + * 执行被锁定的方法 + * @param task 需要执行的任务,返回一个 Promise + */ + async execute(task: () => Promise): Promise { + // 如果当前没有被锁定,直接执行任务 + if (!this.isLocked) { + this.isLocked = true; + try { + return await task(); + } finally { + this.isLocked = false; + await this.dequeue(); + } + } else { + // 如果被锁定,将任务加入队列并等待 + return new Promise((resolve, reject) => { + this.queue.push(async () => { + try { + const result = await task(); + resolve(result); + } catch (error) { + reject(error); + } finally { + this.dequeue(); + } + }); + }); + } + } + + /** + * 处理队列中的下一个任务 + */ + private dequeue(): Promise | undefined { + if (this.queue.length > 0) { + const nextTask = this.queue.shift(); + if (nextTask) { + return this.execute(nextTask); + } + } + return undefined; + } +} diff --git a/src/utils/Network.ts b/src/utils/Network.ts new file mode 100644 index 0000000..4efa410 --- /dev/null +++ b/src/utils/Network.ts @@ -0,0 +1,61 @@ +import axios, { InternalAxiosRequestConfig } from "axios"; +import { Response } from "~/types/Model"; +import { Cooker, Time, userStore } from "~/index"; + +const userTokenInterceptors = async (config: InternalAxiosRequestConfig) => { + let token = userStore.loginUser.token?.value; + const cookieToken = Cooker.get("Token"); + if (token && token === cookieToken) { + config.headers.set({"Token": token}); + } else { + if (cookieToken) { + token = cookieToken; + userStore.loginUser.token = { + value: token, + expireAt: Time.now() + Time.D + }; + } + if (token) { + await userStore.login4Token({ + value: token, + expireAt: Time.now() + Time.D + }); + } + } + return config; +}; +axios.defaults.withCredentials = true; +axios.interceptors.response.use((response: any) => { + if (!response.config.responseType) { + // 服务端返回 + const data = response.data as Response; + if (data.code < 40000) { + // 200 或 300 HTTP 状态段视为成功 + return data.data; + } else { + // 由调用方处理 + return Promise.reject(data.msg); + } + } + return response.data; +}, (error: any) => { + // 请求错误 + if (error) { + if (error.response && error.response.status) { + throw error; + } + if (error.request) { + if (error.message.startsWith("timeout")) { + throw new Error("time out"); + } else { + throw new Error(error.message); + } + } + } + throw error; +}); + +export default { + axios, + userTokenInterceptors +}; diff --git a/src/utils/Prismjs.ts b/src/utils/Prismjs.ts new file mode 100644 index 0000000..411b927 --- /dev/null +++ b/src/utils/Prismjs.ts @@ -0,0 +1,96 @@ +export enum PrismjsType { + PlainText = "PlainText", + Markdown = "Markdown", + JavaScript = "JavaScript", + TypeScript = "TypeScript", + Initialization = "Initialization", + PHP = "PHP", + SQL = "SQL", + XML = "XML", + CSS = "CSS", + VUE = "VUE", + LESS = "LESS", + Markup = "Markup", + YAML = "YAML", + Json = "Json", + Java = "Java", + Properties = "Properties", + NginxConf = "NginxConf", + ApacheConf = "ApacheConf" +} + +export type PrismjsProperties = { + + extensions: string[] + prismjs: string; + viewer: PrismjsViewer; +} + +export enum PrismjsViewer { + + MARKDOWN = "MARKDOWN", + + CODE = "CODE", + + TEXT = "TEXT", +} + +export default class Prismjs { + + private static instance: Prismjs; + + map = new Map(); + + private constructor() { + this.map.set(PrismjsType.PlainText, {extensions: ["txt"], prismjs: "", viewer: PrismjsViewer.TEXT}); + this.map.set(PrismjsType.Markdown, {extensions: ["md"], prismjs: "md", viewer: PrismjsViewer.MARKDOWN}); + this.map.set(PrismjsType.JavaScript, {extensions: ["js"], prismjs: "js", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.VUE, {extensions: ["vue"], prismjs: "html", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.TypeScript, {extensions: ["ts"], prismjs: "ts", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.Initialization, {extensions: ["ini"], prismjs: "ini", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.PHP, {extensions: ["php"], prismjs: "php", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.SQL, {extensions: ["sql"], prismjs: "sql", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.XML, {extensions: ["xml", "fxml"], prismjs: "xml", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.CSS, {extensions: ["css"], prismjs: "css", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.LESS, {extensions: ["less"], prismjs: "less", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.Markup, {extensions: ["htm", "html"], prismjs: "markup", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.YAML, {extensions: ["yml", "yaml"], prismjs: "yaml", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.Json, {extensions: ["json"], prismjs: "json", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.Java, {extensions: ["java"], prismjs: "java", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.Properties, {extensions: ["properties"], prismjs: "properties", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.NginxConf, {extensions: [], prismjs: "nginx", viewer: PrismjsViewer.CODE}); + this.map.set(PrismjsType.ApacheConf, {extensions: [], prismjs: "apacheconf", viewer: PrismjsViewer.CODE}); + } + + private static getInstance(): Prismjs { + if (!Prismjs.instance) { + Prismjs.instance = new Prismjs(); + } + return Prismjs.instance; + } + + public static typeFromFileName(fileName: string): PrismjsType | undefined { + const ext = fileName.substring(fileName.lastIndexOf(".") + 1); + if (!ext) { + return undefined; + } + const map = Prismjs.getInstance().map; + for (const key of map.keys()) { + const value = map.get(key); + if (value) { + const extensions = value.extensions; + for (let i = 0; i < extensions.length; i++) { + const extension = extensions[i]; + if (extension === ext) { + return key; + } + } + } + } + return undefined; + } + + public static getFileProperties(type: PrismjsType): PrismjsProperties | undefined { + return Prismjs.getInstance().map.get(type); + } +} diff --git a/src/utils/Resizer.ts b/src/utils/Resizer.ts new file mode 100644 index 0000000..2b9d288 --- /dev/null +++ b/src/utils/Resizer.ts @@ -0,0 +1,83 @@ +/** + * ### 浏览器缩放 + * + * 此类对象由 Resizer 注册、触发和销毁 + * + * ```js + * new ResizeListener("注册名", () => console.log("回调函数")); + * ``` + */ +class ResizeListener { + + /** 事件名 */ + name: string; + + /** 回调函数 */ + listener: (width: number, height: number) => void; + + constructor(name: string, listener: (width: number, height: number) => void) { + this.name = name; + this.listener = listener; + } +} + +/** + * ### 浏览器窗体缩放监听触发器 + * + * ```js + * Resizer.addListener("Comment", (width: number, height: number) => console.log("缩放中")); + * Resizer.removeListener("Comment"); + * ``` + */ +export default class Resizer { + + private static instance: Resizer; + + listeners: ResizeListener[]; + + private constructor() { + this.listeners = []; + + window.addEventListener("resize", resizeEvent => { + const width = (resizeEvent.currentTarget as any).innerWidth; + const height = (resizeEvent.currentTarget as any).innerHeight; + for (const e of this.listeners) { + e.listener(width, height); + } + }, true); + } + + private static getInstance(): Resizer { + if (!Resizer.instance) { + Resizer.instance = new Resizer(); + } + return Resizer.instance; + } + + // 添加事件 + public static addListener(name: string, listener: (width: number, height: number) => void) { + const instance = Resizer.getInstance(); + let e = instance.listeners.find((se) => se.name === name); + if (e) { + e.listener = listener; + } else { + instance.listeners.push(e = new ResizeListener(name, listener)); + } + // 默认触发一次 + e.listener(window.innerWidth, window.innerHeight); + } + + // 移除事件 + public static removeListener(name: string) { + const instance = Resizer.getInstance(); + instance.listeners.splice(instance.listeners.findIndex(e => e.name === name), 1); + } + + public static getWidth(): number { + return document.documentElement.clientWidth; + } + + public static getHeight(): number { + return document.documentElement.clientHeight; + } +} diff --git a/src/utils/Scroller.ts b/src/utils/Scroller.ts new file mode 100644 index 0000000..5df2c38 --- /dev/null +++ b/src/utils/Scroller.ts @@ -0,0 +1,74 @@ +export type ScrollListener = { + + source: Event; + viewWidth: number; + viewHeight: number; + top: number; + bottom: number; +} + +export default class Scroller { + + private static instance: Scroller; + + listeners = new Map(); + + private constructor() { + + window.addEventListener("scroll", source => { + // 滚动距离 + const top = document.body.scrollTop || document.documentElement.scrollTop; + // 可视高度 + const viewWidth = document.documentElement.clientWidth || document.body.clientWidth; + // 可视高度 + const viewHeight = document.documentElement.clientHeight || document.body.clientHeight; + // 滚动高度 + const sH = document.documentElement.scrollHeight || document.body.scrollHeight; + // 触发事件 + const bottom = sH - top - viewHeight; + this.listeners.forEach(listener => listener({ + source, + viewWidth, + viewHeight, + top, + bottom + } as ScrollListener)); + }, true); + } + + private static getInstance(): Scroller { + if (!Scroller.instance) { + Scroller.instance = new Scroller(); + } + return Scroller.instance; + } + + /** + * 添加监听 + * + * @param name 事件名 + * @param listener 监听事件 + */ + public static addListener(name: string, listener: (event: ScrollListener) => void) { + Scroller.getInstance().listeners.set(name, listener); + } + + /** + * 移除监听 + * + * @param name 事件名 + */ + public static removeListener(name: string) { + Scroller.getInstance().listeners.delete(name); + } + + /** 滚动至顶(平滑地) */ + public static toTop() { + document.body.scrollIntoView({behavior: "smooth"}); + } + + /** 滚动至指定节点(平滑地) */ + public static toElement(el: HTMLElement) { + el.scrollIntoView({behavior: "smooth"}); + } +} diff --git a/src/utils/SettingMapper.ts b/src/utils/SettingMapper.ts new file mode 100644 index 0000000..4ac3663 --- /dev/null +++ b/src/utils/SettingMapper.ts @@ -0,0 +1,94 @@ +import { SettingKey } from "~/types/Setting"; +import { readonly, Ref, ref } from "vue"; +import CommonAPI from "~/api/CommonAPI"; +import { RunEnv, Toolkit } from "timi-web"; + +export default class SettingMapper { + + private static instance: SettingMapper; + + private map = new Map>(); + + public static async loadSetting(...settings: { key: string, args?: { [key: string]: any }}[]): Promise { + const map = new Map(); + { + // 默认配置 + map.set(SettingKey.RUN_ENV, undefined); + map.set(SettingKey.PUBLIC_RESOURCES, { + as: "json" + }); + map.set(SettingKey.DOMAIN_ROOT, undefined); + map.set(SettingKey.DOMAIN_API, undefined); + map.set(SettingKey.DOMAIN_GIT, undefined); + map.set(SettingKey.DOMAIN_BLOG, undefined); + map.set(SettingKey.DOMAIN_SPACE, undefined); + map.set(SettingKey.DOMAIN_RESOURCE, undefined); + map.set(SettingKey.DOMAIN_DOWNLOAD, undefined); + + map.set(SettingKey.ENABLE_COMMENT, undefined); + map.set(SettingKey.ENABLE_DEBUG, undefined); + map.set(SettingKey.ENABLE_LOGIN, undefined); + map.set(SettingKey.ENABLE_REGISTER, undefined); + map.set(SettingKey.ENABLE_USER_UPDATE, undefined); + } + { + // 附加配置 + for (let i = 0; i < settings.length; i++) { + map.set(settings[i].key, settings[i].args); + } + } + const instance = this.getInstance(); + const result = await CommonAPI.listSetting(map); + for (const [key, value] of result) { + instance.map.set(key, ref(value)); + } + } + + public static is(key: SettingKey | string, args?: { [key: string]: any }): boolean { + const value = this.getValueRef(key, args).value; + return !value && value === 'true'; + } + + public static getValue(key: SettingKey | string, args?: { [key: string]: any }): string | undefined { + return this.getValueRef(key, args).value; + } + + public static getValueRef(key: SettingKey| string, args?: { [key: string]: any }): Ref { + const instance = this.getInstance(); + let result = instance.map.get(key); + if (result) { + return result; + } + instance.map.set(key, result = ref()); + Toolkit.async(async () => { + const value = instance.map.get(key); + if (value) { + return value.value; + } + result.value = await CommonAPI.getSetting(key, args); + }); + return readonly(result); + } + + public static getDomainLink(domainKey: SettingKey): string | undefined { + const runEnv = (this.getValue(SettingKey.RUN_ENV)); + let protocol = "https"; + switch (runEnv) { + case RunEnv.DEV: + protocol = "http"; + break; + case RunEnv.DEV_SSL: + case RunEnv.PROD: + protocol = "https"; + break; + } + return `${protocol}://${this.getValue(domainKey)}`; + } + + public static getInstance(): SettingMapper { + if (SettingMapper.instance) { + return SettingMapper.instance; + } + return SettingMapper.instance = new SettingMapper(); + } +} diff --git a/src/utils/Storage.ts b/src/utils/Storage.ts new file mode 100644 index 0000000..90882ea --- /dev/null +++ b/src/utils/Storage.ts @@ -0,0 +1,129 @@ +export default class Storage { + + /** + * 获取为布尔值 + * + * @param key 键 + * @returns 布尔值 + */ + public static is(key: string): boolean { + return this.getString(key) === "true"; + } + + /** + * 获取为布尔值并取反 + * + * @param key 键 + * @returns 布尔值 + */ + public static not(key: string): boolean { + return !this.is(key); + } + + /** + * 读取为指定对象 + * + * @template T 对象类型 + * @param key 键 + * @returns {T | undefined} 返回对象 + */ + public static getObject(key: string): T { + if (this.has(key)) { + return this.getJSON(key) as T; + } + throw Error(`not found ${key}`); + } + + /** + * 获取值,如果没有则储存并使用默认值 + * + * @template T 默认值类型 + * @param key 键 + * @param def 默认值 + * @return {T} 对象 + */ + public static getDefault(key: string, def: T): T { + if (this.has(key)) { + return this.getJSON(key) as T; + } + this.setObject(key, def); + return def; + } + + /** + * 获取为 JSON + * + * @param key 键 + * @returns JSON 对象 + */ + public static getJSON(key: string) { + return JSON.parse(this.getString(key)); + } + + /** + * 获取为字符串(其他获取方式一般经过这个方法,找不到配置或配置值无效时会抛错) + * + * @param key 键 + * @returns 字符串 + */ + public static getString(key: string): string { + const value = localStorage.getItem(key); + if (value) { + return value; + } + throw new Error(`not found: ${key}, ${value}`); + } + + /** + * 是否存在某配置 + * + * @param key 键 + * @returns true 为存在 + */ + public static has(key: string): boolean { + return localStorage.getItem(key) !== undefined && localStorage.getItem(key) !== null; + } + + /** + * 设置值 + * + * @param key 键 + * @param value 值 + */ + public static setObject(key: string, value: any) { + if (value instanceof Object || value instanceof Array) { + this.setJSON(key, value); + } else { + this.setString(key, value); + } + } + + /** + * 设置 JSON 值 + * + * @param key 键 + * @param json JSON 字符串 + */ + public static setJSON(key: string, json: any) { + localStorage.setItem(key, JSON.stringify(json)); + } + + /** + * 设置值 + * + * @param key 键 + * @param value 值 + */ + public static setString(key: string, value: any) { + localStorage.setItem(key, value); + } + + /** + * 移除属性 + * + * @param key 键 + */ + public static remove(key: string) { + localStorage.removeItem(key); + } +} diff --git a/src/utils/Time.ts b/src/utils/Time.ts new file mode 100644 index 0000000..b07dd53 --- /dev/null +++ b/src/utils/Time.ts @@ -0,0 +1,97 @@ +export default class Time { + + /** 1 秒时间戳 */ + public static S = 1E3; + /** 1 分钟时间戳 */ + public static M = Time.S * 60; + /** 1 小时时间戳 */ + public static H = Time.M * 60; + /** 1 天时间戳 */ + public static D = Time.H * 24; + + public static now(): number { + return new Date().getTime(); + } + + /** + * Unix 时间戳转日期 + * + * @param unix 时间戳 + */ + public static toDate(unix?: number): string { + if (!unix) return ""; + const d = new Date(unix); + return `${d.getFullYear()}-${(d.getMonth() + 1).toString().padStart(2, "0")}-${d.getDate().toString().padStart(2, "0")}`; + } + + /** + * Unix 时间戳转时间 + * + * @param unix 时间戳 + */ + public static toTime(unix?: number): string { + if (!unix) return ""; + const d = new Date(unix); + return `${d.getHours().toString().padStart(2, "0")}:${d.getMinutes().toString().padStart(2, "0")}`; + } + + /** + * Unix 时间戳转日期和时间 + * + * @param unix 时间戳 + */ + public static toDateTime(unix?: number): string { + if (!unix) return ""; + return `${this.toDate(unix)} ${this.toTime(unix)}`; + } + + public static toPassedDate(unix?: number): string { + return this.toPassedDateTime(unix, false); + } + + public static toPassedDateTime(unix?: number, withDetailTime = true): string { + if (!unix) { + return ""; + } + const now = new Date().getTime(); + const between = now - unix; + + if (Time.D * 4 <= between) { + return withDetailTime ? this.toDateTime(unix) : this.toDate(unix); + } else if (Time.D < between) { + return `${Math.floor(between / Time.D)} 天前`; + } else if (Time.H < between) { + return `${Math.floor(between / Time.H)} 小时前`; + } else if (Time.M < between) { + return `${Math.floor(between / Time.M)} 分钟前`; + } else { + return "刚刚"; + } + } + + public static between(begin: Date, end?: Date) : any { + if (!end) { + end = new Date(); + } + const cs = 1000, cm = 6E4, ch = 36E5, cd = 864E5, cy = 31536E6; + const l = end.getTime() - begin.getTime(); + const y = Math.floor(l / cy), + d = Math.floor((l / cd) - y * 365), + h = Math.floor((l - (y * 365 + d) * cd) / ch), + m = Math.floor((l - (y * 365 + d) * cd - h * ch) / cm), + s = Math.floor((l - (y * 365 + d) * cd - h * ch - m * cm) / cs), + ms = Math.floor(((l - (y * 365 + d) * cd - h * ch - m * cm) / cs - s) * cs); + return { l, y, d, h, m, s, ms }; + } + + public static toMediaTime(seconds: number): string { + seconds = Math.floor(seconds); + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + const second = seconds % 60; + if (0 < hours) { + return `${hours}:${minutes.toString().padStart(2, "0")}:${second.toString().padStart(2, "0")}`; + } + return `${minutes.toString().padStart(2, "0")}:${second.toString().padStart(2, "0")}`; + } +} diff --git a/src/utils/Toolkit.ts b/src/utils/Toolkit.ts new file mode 100644 index 0000000..235d6c5 --- /dev/null +++ b/src/utils/Toolkit.ts @@ -0,0 +1,354 @@ +import type { App } from "vue"; +import type { InstallRecord } from "~/types"; +import { UserLevelType } from "~/types/User"; +import { CommonAPI, SettingKey, SettingMapper } from "~/index"; + +export default class Toolkit { + + public static isFunction = (val: any) => typeof val === "function"; + public static isArray = Array.isArray; + public static isString = (val: any) => typeof val === "string"; + public static isSymbol = (val: any) => typeof val === "symbol"; + public static isObject = (val: any) => val !== null && typeof val === "object"; + public static isFile = (val: any) => val instanceof File; + + /** + * 添加安装方法 + * @example + * ```JS + * import { MeDemo } from './index.vue' + * + * addInstall(MeDemo) + * ``` + */ + public static withInstall = (comp: T): InstallRecord => { + const _comp = comp as InstallRecord; + _comp.install = (app: App) => { + app.component((comp as any).name, _comp); + }; + return _comp; + }; + + public static guid() { + const s4 = () => Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); + return `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4() + s4() + s4()}`; + } + + public static className(...args: any[]) { + const classes = []; + for (let i = 0; i < args.length; i++) { + const value = args[i]; + if (!value) continue; + if (this.isString(value)) { + classes.push(value); + } else if (this.isArray(value)) { + for (let i = 0; i < value.length; i++) { + const inner: any = this.className(value[i]); + if (inner) { + classes.push(inner); + } + } + } else if (this.isObject(value)) { + for (const name in value) { + if (value[name]) { + classes.push(name); + } + } + } + } + return classes.join(" "); + } + + public static isEmpty(obj: any): boolean { + if (this.isString(obj)) { + return (obj as string).trim().length === 0; + } + if (this.isArray(obj)) { + return (obj as []).length === 0; + } + if (this.isFunction(obj)) { + return this.isEmpty(obj()); + } + if (this.isObject(obj)) { + return obj === undefined || obj === null; + } + return obj === undefined || obj === null; + } + + public static isNotEmpty(obj: any): boolean { + return !this.isEmpty(obj); + } + + /** + * ### 延时执行 + * + * ```js + * await sleep(1E3) + * ``` + * + * @param ms 延时毫秒 + */ + public static async sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); + } + + /** + * 获取节点属性 + * + * @param el 节点 + * @param name 属性名 + * @returns 属性 + */ + public static getAttribute(el: Element, name: string): string | null { + return el.hasAttribute(name) ? el.getAttribute(name) : null; + } + + /** + * 转为数字 + * + * @param string 字符串 + * @param fallback 如果失败,返回该值 + * @returns 转换后或转换失败数据 + */ + public static toNumber(string: string, fallback?: number): number { + if (!string) return fallback as number; + const number = Number(string); + return isFinite(number) ? number : fallback as number; + } + + /** + * ### 解析字符串为 DOM 节点。此 DOM 字符串必须有且仅有一个根节点 + * + * ```js + * toDOM(` + *
+ *

imyeyu.net

+ *
+ * `) + * ``` + * + * @param string 字符串 + * @returns DOM 节点 + */ + public static toDOM(string: string): Document { + return new DOMParser().parseFromString(string, "text/xml"); + } + + /** + * 异步执行 + * + * @param event 函数 + */ + public static async(event: Function) { + setTimeout(event, 0); + } + + /** + * 生成随机数 + * + * @param min 最小值 + * @param max 最大值 + */ + public static random(min = 0, max = 100): number { + return Math.floor(Math.random() * (max + 1 - min)) + min; + } + + /** + * Base64 数据转文件 + * + * __需要头部元数据__ + * + * __示例:__ + * data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA + * + * @param data Base64 数据 + * @param fileName 文件名 + * @returns 文件对象 + */ + public static base64ToFile(data: string, fileName: string): File { + const splitData = data.split(","); + const base64 = atob(splitData[1]); + let n = base64.length as number; + const u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = base64.charCodeAt(n); + } + return new File([u8arr], fileName, {type: splitData[0].split(":")[1]}); + } + + /** + * 深克隆对象 + * + * @param origin 源对象 + * @param target 递归对象 + * @returns 克隆对象 + */ + public static deepClone(origin: any, target = {} as any) { + const toString = Object.prototype.toString; + const arrType = "[object Array]"; + for (const key in origin) { + if (Object.prototype.hasOwnProperty.call(origin, key)) { + if (typeof origin[key] === "object" && origin[key] !== null) { + target[key] = toString.call(origin[key]) === arrType ? [] : {}; + this.deepClone(origin[key], target[key]); + } else { + target[key] = origin[key]; + } + } + } + return target; + } + + public static keyValueString(obj: object, assign: string, split: string): string { + let result = ""; + Object.entries(obj).forEach(([k, v]) => result += k + assign + v + split); + return result.substring(0, result.length - split.length); + } + + public static toURLArgs(obj?: { [key: string]: any }): string { + if (!obj) { + return ""; + } + const args: string[] = []; + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + const value = obj[key]; + if (Array.isArray(value)) { + value.forEach((item) => { + args.push(`${encodeURIComponent(key)}=${encodeURIComponent(item)}`); + }); + } else { + args.push(`${encodeURIComponent(key)}=${encodeURIComponent(value.toString())}`); + } + } + } + return args.join("&"); + } + + public static toObject(map: Map): object { + return Array.from(map.entries()).reduce((acc, [key, value]) => { + acc[key] = value ?? null; + return acc; + }, {} as { [key: string]: string | undefined }); + } + + public static uuid(): string { + const char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + const length = [8, 4, 4, 4, 12]; + let result = ""; + for (let i = 0; i < length.length; i++) { + for (let j = 0; j < length[i]; j++) { + result += char[this.random(0, char.length - 1)]; + } + result += "-"; + } + return result.substring(0, result.length - 1); + } + + public static keyFromValue(e: any, value: any): string { + return Object.keys(e)[Object.values(e).indexOf(value)]; + } + + // 防抖 + // eslint-disable-next-line + public static debounce any>(callback: T, defaultImmediate = true, delay = 600): T & { + cancel(): void + } { + let timerId: ReturnType | null = null; // 存储定时器 + let immediate = defaultImmediate; + // 定义一个 cancel 办法,用于勾销防抖 + const cancel = (): void => { + if (timerId) { + clearTimeout(timerId); + timerId = null; + } + }; + + const debounced = function (this: ThisParameterType, ...args: Parameters): void { + const context = this; + if (timerId) { + cancel(); + } + if (immediate) { + callback.apply(context, args); + immediate = false; + timerId = setTimeout(() => { + immediate = defaultImmediate; + }, delay); + } else { + // 设置定时器,在延迟时间后执行指标函数 + timerId = setTimeout(() => { + callback.apply(context, args); + immediate = defaultImmediate; + }, delay); + } + }; + // 将 cancel 方法附加到 debounced 函数上 + (debounced as any).cancel = cancel; + return debounced as T & { cancel(): void }; + } + + public static toUserLevel(exp?: number): UserLevelType { + exp = exp ?? 0; + const levels = [0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096]; + for (let i = 1; i < levels.length; i++) { + if (exp < levels[i]) { + return { + exp, + value: i - 1, + percent: (exp - levels[i - 1]) / (levels[i] - levels[i - 1]), + nextLevelUp: i === levels.length - 1 ? 4096 : levels[i] + }; + } + } + return { exp, value: 8, percent: 1, nextLevelUp: 4096 }; + } + + public static toFormData(root?: object): FormData { + const form = new FormData(); + if (!root) { + return form; + } + const run = (parent: string | null, obj: object) => { + for (const [key, value] of Object.entries(obj)) { + if (this.isObject(value) && !this.isFile(value)) { + if (parent) { + run(`${parent}.${key}`, value); + } else { + run(key, value); + } + } else { + if (parent) { + form.append(`${parent}.${key}`, value); + } else { + form.append(key, value); + } + } + } + }; + run(null, root); + return form; + } + + public static toResURL(val: string): string { + const at = val.indexOf("@"); + const start = val.substring(0, at); + const path = val.substring(at + 1); + switch (start) { + case "res": return SettingMapper.getDomainLink(SettingKey.DOMAIN_RESOURCE) + path; + case "dl": return SettingMapper.getDomainLink(SettingKey.DOMAIN_DOWNLOAD) + path; + case "attach": return CommonAPI.getAttachmentReadAPI(path); + } + return val; + } + + public static format(template: string, variables: { [key: string]: any }): string { + return template.replace(/\$\{(\w+)}/g, (_, key) => variables[key]); + } + + public static leftClickCallback(event: MouseEvent, callback: Function): void { + if (event.button === 0 && !event.ctrlKey && !event.metaKey && !event.shiftKey) { + callback(); + } + } +} diff --git a/src/utils/directives/Draggable.ts b/src/utils/directives/Draggable.ts new file mode 100644 index 0000000..6ac9294 --- /dev/null +++ b/src/utils/directives/Draggable.ts @@ -0,0 +1,130 @@ +import type { Directive, DirectiveBinding } from "vue"; + +export type DraggableConfig = { + + /** 点下 */ + onMouseDown?: (e: MouseEvent | TouchEvent) => void; + + /** 中断条件(返回 true 时不触发 onDragging 及往后事件) */ + interruptWhen?: (e: MouseEvent | TouchEvent) => boolean; + + /** 拖动 */ + onDragging: (e: MouseEvent | TouchEvent, relX: number, relY: number, offsetX: number, offsetY: number) => void; + + /** 释放 */ + onDragged?: (e: MouseEvent | TouchEvent, x: number, y: number) => void; +} + +const getEventPosition = (e: MouseEvent | TouchEvent): { clientX: number, clientY: number, pageX: number, pageY: number } => { + if ("touches" in e && e.touches.length > 0) { + const touch = e.touches[0]; + return { + clientX: touch.clientX, + clientY: touch.clientY, + pageX: touch.pageX, + pageY: touch.pageY + }; + } else if (e instanceof MouseEvent) { + return { + clientX: e.clientX, + clientY: e.clientY, + pageX: e.pageX, + pageY: e.pageY + }; + } + return { clientX: 0, clientY: 0, pageX: 0, pageY: 0 }; +}; + +const VDraggable: Directive = { + // 挂载 + mounted(el: HTMLElement, binding: DirectiveBinding) { + const config = binding.value as DraggableConfig; + let isClicked = false, ox = 0, oy = 0, ol = 0, ot = 0, opx = 0, opy = 0; + + // 按下 + const handleStart = (e: MouseEvent | TouchEvent) => { + e.preventDefault(); + + const pos = getEventPosition(e); + ox = pos.clientX; + oy = pos.clientY; + ol = el.offsetLeft; + ot = el.offsetTop; + opx = pos.pageX; + opy = pos.pageY; + + config.onMouseDown?.(e); + if (config.interruptWhen?.(e)) return; + + isClicked = true; + }; + // 移动 + const handleMove = (e: MouseEvent | TouchEvent) => { + if (!isClicked) { + return; + } + e.preventDefault(); + + const pos = getEventPosition(e); + const relX = pos.clientX - (ox - ol); + const relY = pos.clientY - (oy - ot); + const offsetX = pos.pageX - opx; + const offsetY = pos.pageY - opy; + + config.onDragging(e, relX, relY, offsetX, offsetY); + }; + // 释放 + const handleEnd = (e: MouseEvent | TouchEvent) => { + if (!isClicked) { + return; + } + const pos = getEventPosition(e); + config.onDragged?.(e, pos.clientX - ox, pos.clientY - oy); + isClicked = false; + }; + + (el.style as any)["user-drag"] = "none"; + (el.style as any)["touch-action"] = "none"; + + // 鼠标 + el.addEventListener("mousedown", handleStart as EventListener); + document.addEventListener("mousemove", handleMove as EventListener); + document.addEventListener("mouseup", handleEnd as EventListener); + + // 触控 + el.addEventListener("touchstart", handleStart as EventListener, { passive: false }); + document.addEventListener("touchmove", handleMove as EventListener, { passive: false }); + document.addEventListener("touchend", handleEnd as EventListener, { passive: false }); + + // 保存事件处理器以便卸载时使用 + (el as any)._vDraggableHandlers = { + handleStart, + handleMove, + handleEnd + }; + }, + // 卸载 + unmounted(el: HTMLElement) { + const handlers = (el as any)._vDraggableHandlers as { + handleStart: EventListener, + handleMove: EventListener, + handleEnd: EventListener + }; + if (handlers) { + // 鼠标 + el.removeEventListener("mousedown", handlers.handleStart); + document.removeEventListener("mousemove", handlers.handleMove); + document.removeEventListener("mouseup", handlers.handleEnd); + + // 触控 + el.removeEventListener("touchstart", handlers.handleStart); + document.removeEventListener("touchmove", handlers.handleMove); + document.removeEventListener("touchend", handlers.handleEnd); + + // 引用 + delete (el as any)._vDraggableHandlers; + } + } +}; + +export default VDraggable; diff --git a/src/utils/directives/Popup.ts b/src/utils/directives/Popup.ts new file mode 100644 index 0000000..2b0ba51 --- /dev/null +++ b/src/utils/directives/Popup.ts @@ -0,0 +1,120 @@ +import type { Directive, DirectiveBinding } from "vue"; +import Toolkit from "../Toolkit"; + +export enum PopupType { + TEXT, + IMG, + HTML, + EL +} + +/** */ +export type PopupConfig = { + + type: PopupType, + value?: string | HTMLElement; + canShow?: () => boolean; + beforeShow?: (type: PopupType, value: string | HTMLElement) => Promise; + afterHidden?: (type: PopupType, value: string | HTMLElement) => Promise; +} + +// Popup 弹出提示 DOM 节点,全局唯一 +let popup: HTMLElement | null; + +const VPopup: Directive = { + + mounted(el: HTMLElement, binding: DirectiveBinding) { + // 转配置 + let config: PopupConfig; + if (binding.arg && binding.arg === "config") { + config = binding.value as PopupConfig; + } else { + config = { + type: PopupType.TEXT, + value: binding.value as any as string, + canShow: () => true + }; + } + // Popup 节点 + if (!popup) { + popup = document.getElementById("tui-popup"); + } + let isShowing = false; + // 显示 + el.addEventListener("mouseenter", async e => { + if (!config.value) { + console.warn("not found popup value", config); + return; + } + if (config.beforeShow) { + await config.beforeShow(config.type, config.value); + } + if (config.canShow && config.canShow() && popup) { + let el: HTMLElement | null = null; + if (!config) { + el = document.createElement("div"); + el.className = "text"; + el.textContent = config as string; + popup.appendChild(el); + } + switch (config.type) { + case PopupType.TEXT: + // 文本 + el = document.createElement("div"); + el.className = "text"; + el.textContent = config.value as string; + popup.appendChild(el); + break; + case PopupType.IMG: + // 图片 + el = document.createElement("img"); + (el as HTMLImageElement).src = config.value as string; + popup.appendChild(el); + break; + case PopupType.HTML: + // HTML 字符串 + popup.appendChild(Toolkit.toDOM(config.value as string)); + break; + case PopupType.EL: + // DOM 节点 + if (config.value instanceof HTMLElement) { + const valueEl = config.value as HTMLElement; + valueEl.style.display = "block"; + popup.appendChild(valueEl); + break; + } else { + console.error(config); + throw new Error("Vue 指令错误:v-popup:el 的值不是 HTML 元素"); + } + } + popup.style.left = (e.x + 20) + "px"; + popup.style.top = (e.y + 14) + "px"; + popup.style.visibility = "visible"; + isShowing = true; + } + }, false); + // 移动 + el.addEventListener("mousemove", async (e) => { + if (config.canShow && config.canShow() && isShowing && popup) { + popup.style.left = (e.x + 20) + "px"; + popup.style.top = (e.y + 14) + "px"; + } + }, false); + // 隐藏 + el.addEventListener("mouseleave", async () => { + if (popup) { + popup.style.visibility = "hidden"; + popup.innerText = ""; + popup.style.left = "0px"; + popup.style.top = "0px"; + + // 隐藏后事件 + if (config.afterHidden && config.value) { + await config.afterHidden(config.type, config.value); + } + } + }, false); + } +}; + +export default VPopup; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f7e5df6 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,44 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Node", + "useDefineForClassFields": true, + "jsx": "preserve", + "strict": true, + "sourceMap": true, + "skipLibCheck": true, + "isolatedModules": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "lib": [ + "ESNext", + "DOM", + "DOM.Iterable" + ], + "paths": { + "~/*": [ + "./src/*" + ], + "@/*": [ + "./examples/*" + ], + "timi-web": [ + "./src/index.ts" + ] + } + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.vue", + "examples/**/*.ts", + "examples/**/*.d.ts", + "examples/**/*.vue" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..c0d4a4a --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node" + }, + "include": [ + "vite.config.ts" + ] +} diff --git a/tsconfig.types.json b/tsconfig.types.json new file mode 100644 index 0000000..be8c701 --- /dev/null +++ b/tsconfig.types.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true + }, + "include": [ + "src" + ] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..a3f70c2 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,110 @@ +import { resolve } from "path"; +import { Alias, defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import VueSetupExtend from "vite-plugin-vue-setup-extend"; +import { prismjsPlugin } from "vite-plugin-prismjs"; +import AutoImport from "unplugin-auto-import/vite"; +import Components from "unplugin-vue-components/vite"; +import dts from "vite-plugin-dts"; + +const alias: Alias[] = [ + { + find: "@", + replacement: resolve(__dirname, "./examples") + }, + { + find: "~", + replacement: resolve(__dirname, "./src") + }, + { + find: "*", + replacement: resolve("") + }, + { + find: /^timi-web(\/(es|lib))?$/, + replacement: resolve(__dirname, "./src/index.ts") + } +]; + +export default defineConfig({ + server: { + port: 3003, + host: true + }, + resolve: { + alias + }, + build: { + outDir: "dist", + lib: { + entry: resolve(__dirname, "./src/index.ts"), + name: "TimiWeb", + fileName: "timi-web" + }, + rollupOptions: { + external: [ + "vue" + ], + output: { + globals: { + vue: "Vue" + } + } + }, + minify: "terser", + terserOptions: { + compress: { + // eslint-disable-next-line camelcase + drop_console: false, + // eslint-disable-next-line camelcase + drop_debugger: false + } + } + }, + plugins: [ + vue({ + include: [/\.vue$/, /\.md$/] + }), + VueSetupExtend(), + dts(), + prismjsPlugin({ + languages: [ + "ini", + "php", + "sql", + "xml", + "css", + "less", + "html", + "json", + "yaml", + "java", + "nginx", + "javascript", + "typescript", + "apacheconf", + "properties" + ], + plugins: [ + "line-numbers" + ], + theme: "default", + css: true + }), + AutoImport({ + imports: [ + "vue" + ], + dts: "examples/auto-imports.d.ts", + eslintrc: { + enabled: true, + globalsPropValue: true + } + }), + Components({ + dirs: [ + "src/components" + ] + }) + ] +});