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 3f12d2f..71ad8bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +/examples/auto-imports.d.ts +/components.d.ts +/.eslintrc-auto-import.json + # ---> Vue # gitignore template for Vue.js projects # diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/common4web.iml b/.idea/common4web.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/common4web.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/jsLinters/eslint.xml b/.idea/jsLinters/eslint.xml new file mode 100644 index 0000000..66d92e1 --- /dev/null +++ b/.idea/jsLinters/eslint.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b22f4a3 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file 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/LICENSE b/LICENSE index 54d1271..9639e2b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 yeyu +Copyright (c) 2025 timi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including diff --git a/README.md b/README.md index 8d92929..ef72fd5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,18 @@ -# common4web +# Vue 3 + TypeScript + Vite -前端通用库 \ 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..5b8b439 --- /dev/null +++ b/examples/main.ts @@ -0,0 +1,10 @@ +import { createApp } from "vue"; +import Root from "./Root.vue"; +import common4Web, { axios, VPopup } from "common4web"; // 本地开发 + +axios.defaults.baseURL = "http://localhost:8091"; + +const app = createApp(Root); +app.use(common4Web); +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..39dd15f --- /dev/null +++ b/package.json @@ -0,0 +1,66 @@ +{ + "name": "common4web", + "main": "./dist/common4web.umd.js", + "types": "./dist/src/index.d.ts", + "module": "./dist/common4web.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/common4web.mjs", + "require": "./dist/common4web.umd.js" + }, + "./style.css": "./dist/common4web.css" + }, + "engines": { + "node": ">=16.0.0" + }, + "dependencies": { + "axios": "1.12.0", + "less": "4.4.2", + "marked": "^16.4.1", + "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": "^20.2.0", + "unplugin-vue-components": "^30.0.0", + "vite": "7.1.11", + "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": "^3.1.2" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..c2a79d8 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3464 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + axios: + specifier: 1.12.0 + version: 1.12.0 + less: + specifier: 4.4.2 + version: 4.4.2 + marked: + specifier: ^16.4.1 + version: 16.4.1 + marked-gfm-heading-id: + specifier: ^4.1.1 + version: 4.1.2(marked@16.4.1) + marked-highlight: + specifier: ^2.2.1 + version: 2.2.2(marked@16.4.1) + marked-mangle: + specifier: ^1.1.10 + version: 1.1.11(marked@16.4.1) + prismjs: + specifier: 1.30.0 + version: 1.30.0 + terser: + specifier: ^5.39.0 + version: 5.44.0 + devDependencies: + '@types/marked': + specifier: ^6.0.0 + version: 6.0.0 + '@types/node': + specifier: ^22.15.2 + version: 22.18.13 + '@types/prismjs': + specifier: 1.26.5 + version: 1.26.5 + '@typescript-eslint/eslint-plugin': + specifier: ^8.31.0 + version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.31.0 + version: 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@vitejs/plugin-vue': + specifier: ^5.2.3 + version: 5.2.4(vite@7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.0))(vue@3.5.22(typescript@5.9.3)) + eslint: + specifier: ^9.25.1 + version: 9.38.0 + eslint-config-prettier: + specifier: ^10.1.2 + version: 10.1.8(eslint@9.38.0) + eslint-define-config: + specifier: ^2.1.0 + version: 2.1.0 + eslint-plugin-prettier: + specifier: ^5.2.6 + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(prettier@3.6.2) + eslint-plugin-vue: + specifier: ^10.0.0 + version: 10.5.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(vue-eslint-parser@10.2.0(eslint@9.38.0)) + prettier: + specifier: ^3.5.3 + version: 3.6.2 + typescript: + specifier: ^5.8.3 + version: 5.9.3 + unplugin-auto-import: + specifier: ^20.2.0 + version: 20.2.0 + unplugin-vue-components: + specifier: ^30.0.0 + version: 30.0.0(@babel/parser@7.28.5)(vue@3.5.22(typescript@5.9.3)) + vite: + specifier: 7.1.11 + version: 7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.0) + vite-plugin-dts: + specifier: ^4.5.3 + version: 4.5.4(@types/node@22.18.13)(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.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@7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.0)) + vue: + specifier: ^3.5.13 + version: 3.5.22(typescript@5.9.3) + vue-tsc: + specifier: ^3.1.2 + version: 3.1.2(typescript@5.9.3) + +packages: + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + 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.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + 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.38.0': + resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + 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.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@microsoft/api-extractor-model@7.31.3': + resolution: {integrity: sha512-dv4quQI46p0U03TCEpasUf6JrJL3qjMN7JUAobsPElxBv4xayYYvWW9aPpfYV+Jx6hqUcVaLVOeV7+5hxsyoFQ==} + + '@microsoft/api-extractor@7.53.3': + resolution: {integrity: sha512-p2HmQaMSVqMBj3bH3643f8xApKAqrF1jNpPsMCTQOYCYgfwLnvzsve8c+bgBWzCOBBgLK54PB6ZLIWMGLg8CZA==} + 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.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + 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.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@5.18.0': + resolution: {integrity: sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/problem-matcher@0.1.1': + resolution: {integrity: sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.6.0': + resolution: {integrity: sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==} + + '@rushstack/terminal@0.19.3': + resolution: {integrity: sha512-0P8G18gK9STyO+CNBvkKPnWGMxESxecTYqOcikHOVIHXa9uAuTK+Fw8TJq2Gng1w7W6wTC9uPX6hGNvrMll2wA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@5.1.3': + resolution: {integrity: sha512-Kdv0k/BnnxIYFlMVC1IxrIS0oGQd4T4b7vKfx52Y2+wk2WZSDFIvedr7JrhenzSlm3ou5KwtoTGTGd5nbODRug==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@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.18.13': + resolution: {integrity: sha512-Bo45YKIjnmFtv6I1TuC8AaHBbqXtIo+Om5fE4QiU1Tj8QR/qt+8O3BAtOimG5IFmwaWiPmB3Mv3jtYzBA4Us2A==} + + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + + '@typescript-eslint/eslint-plugin@8.46.2': + resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.46.2 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.46.2': + resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.46.2': + resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.46.2': + resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.46.2': + resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.46.2': + resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.46.2': + resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.46.2': + resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.46.2': + resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.46.2': + resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + 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.23': + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} + + '@volar/source-map@2.4.23': + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} + + '@volar/typescript@2.4.23': + resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} + + '@vue/compiler-core@3.5.22': + resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} + + '@vue/compiler-dom@3.5.22': + resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} + + '@vue/compiler-sfc@3.5.22': + resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} + + '@vue/compiler-ssr@3.5.22': + resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} + + '@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@3.1.2': + resolution: {integrity: sha512-PyFDCqpdfYUT+oMLqcc61oHfJlC6yjhybaefwQjRdkchIihToOEpJ2Wu/Ebq2yrnJdd1EsaAvZaXVAqcxtnDxQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.22': + resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==} + + '@vue/runtime-core@3.5.22': + resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==} + + '@vue/runtime-dom@3.5.22': + resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==} + + '@vue/server-renderer@3.5.22': + resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==} + peerDependencies: + vue: 3.5.22 + + '@vue/shared@3.5.22': + resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + 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@3.0.3: + resolution: {integrity: sha512-2JXjom6R7ZwrISpUphLhf4htUq1aKRCennTJ6u9kFfr3sLmC9+I4CxxVi+McoFnIg+p1HnVrfLT/iCt4Dlz//Q==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + 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.12.0: + resolution: {integrity: sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==} + + 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==} + + baseline-browser-mapping@2.8.21: + resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==} + hasBin: true + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + 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==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001752: + resolution: {integrity: sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + 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.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + 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'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.244: + resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==} + + 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 + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + 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.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + 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'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + 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.5.1: + resolution: {integrity: sha512-SbR9ZBUFKgvWAbq3RrdCtWaW0IKm6wwUiApxf3BVTNfqUIo4IQQmreMg2iHFJJ6C/0wss3LXURBJ1OwS/MhFcQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + vue-eslint-parser: ^10.0.0 + peerDependenciesMeta: + '@stylistic/eslint-plugin': + optional: true + '@typescript-eslint/parser': + optional: true + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + 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.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.38.0: + resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + 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.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + 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.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + 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.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + 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.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + 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.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + 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'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + 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@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + 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@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + 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.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + 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.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + 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-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + 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@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + 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.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + 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.4.2: + resolution: {integrity: sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==} + 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.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + 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.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + marked-gfm-heading-id@4.1.2: + resolution: {integrity: sha512-EQ1WiEGHJh0C8viU+hbXbhHyWTDgEia2i96fiSemm2wdYER6YBw/9QI5TB6YFTqFfmMOxBFXPcPJtlgD0fVV2w==} + peerDependencies: + marked: '>=13 <17' + + marked-highlight@2.2.2: + resolution: {integrity: sha512-KlHOP31DatbtPPXPaI8nx1KTrG3EW0Z5zewCwpUj65swbtKOTStteK3sNAjBqV75Pgo3fNEVNHeptg18mDuWgw==} + peerDependencies: + marked: '>=4 <17' + + marked-mangle@1.1.11: + resolution: {integrity: sha512-BUZiRqPooKZZhC7e8aDlzqkZt4MKkbJ/VY22b8iqrI3fJdnWmSyc7/uujDkrMszZrKURrXsYVUfgdWG6gEspcA==} + peerDependencies: + marked: '>=4 <17' + + marked@16.4.1: + resolution: {integrity: sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + 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@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + 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 + + 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.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + 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.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.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + 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.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + 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.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + 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.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.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.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + 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.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + 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.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + 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.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.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + 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.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + + terser@5.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} + engines: {node: '>=10'} + hasBin: true + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + 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.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unimport@5.5.0: + resolution: {integrity: sha512-/JpWMG9s1nBSlXJAQ8EREFTFy3oy6USFd8T6AoBaw1q2GGcF4R9yp3ofg32UODZlYEO5VD0EWE1RpI9XDWyPYg==} + engines: {node: '>=18.12.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin-auto-import@20.2.0: + resolution: {integrity: sha512-vfBI/SvD9hJqYNinipVOAj5n8dS8DJXFlCKFR5iLDp2SaQwsfdnfLXgZ+34Kd3YY3YEY9omk8XQg0bwos3Q8ug==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^4.0.0 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + + unplugin-utils@0.3.1: + resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + engines: {node: '>=20.19.0'} + + unplugin-vue-components@30.0.0: + resolution: {integrity: sha512-4qVE/lwCgmdPTp6h0qsRN2u642tt4boBQtcpn4wQcWZAsr8TQwq+SPT3NDu/6kBFxzo/sSEK4ioXhOOBrXc3iw==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 || ^4.0.0 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin@2.3.10: + resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} + engines: {node: '>=18.12.0'} + + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + 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.4: + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} + 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@7.1.11: + resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + 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.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-eslint-parser@10.2.0: + resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + vue-tsc@3.1.2: + resolution: {integrity: sha512-3fd4DY0rFczs5f+VB3OhcLU83V6+3Puj2yLBe0Ak65k7ERk+STVNKaOAi0EBo6Lc15UiJB6LzU6Mxy4+h/pKew==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.22: + resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} + 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 + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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: + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.27.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@esbuild/aix-ppc64@0.25.11': + optional: true + + '@esbuild/android-arm64@0.25.11': + optional: true + + '@esbuild/android-arm@0.25.11': + optional: true + + '@esbuild/android-x64@0.25.11': + optional: true + + '@esbuild/darwin-arm64@0.25.11': + optional: true + + '@esbuild/darwin-x64@0.25.11': + optional: true + + '@esbuild/freebsd-arm64@0.25.11': + optional: true + + '@esbuild/freebsd-x64@0.25.11': + optional: true + + '@esbuild/linux-arm64@0.25.11': + optional: true + + '@esbuild/linux-arm@0.25.11': + optional: true + + '@esbuild/linux-ia32@0.25.11': + optional: true + + '@esbuild/linux-loong64@0.25.11': + optional: true + + '@esbuild/linux-mips64el@0.25.11': + optional: true + + '@esbuild/linux-ppc64@0.25.11': + optional: true + + '@esbuild/linux-riscv64@0.25.11': + optional: true + + '@esbuild/linux-s390x@0.25.11': + optional: true + + '@esbuild/linux-x64@0.25.11': + optional: true + + '@esbuild/netbsd-arm64@0.25.11': + optional: true + + '@esbuild/netbsd-x64@0.25.11': + optional: true + + '@esbuild/openbsd-arm64@0.25.11': + optional: true + + '@esbuild/openbsd-x64@0.25.11': + optional: true + + '@esbuild/openharmony-arm64@0.25.11': + optional: true + + '@esbuild/sunos-x64@0.25.11': + optional: true + + '@esbuild/win32-arm64@0.25.11': + optional: true + + '@esbuild/win32-ia32@0.25.11': + optional: true + + '@esbuild/win32-x64@0.25.11': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0)': + dependencies: + eslint: 9.38.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.16.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.38.0': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@microsoft/api-extractor-model@7.31.3(@types/node@22.18.13)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.18.0(@types/node@22.18.13) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.53.3(@types/node@22.18.13)': + dependencies: + '@microsoft/api-extractor-model': 7.31.3(@types/node@22.18.13) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.18.0(@types/node@22.18.13) + '@rushstack/rig-package': 0.6.0 + '@rushstack/terminal': 0.19.3(@types/node@22.18.13) + '@rushstack/ts-command-line': 5.1.3(@types/node@22.18.13) + lodash: 4.17.21 + minimatch: 10.0.3 + resolve: 1.22.11 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + 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.11 + + '@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.19.1 + + '@pkgr/core@0.2.9': {} + + '@rollup/pluginutils@5.3.0(rollup@4.52.5)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.52.5 + + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + + '@rollup/rollup-android-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true + + '@rushstack/node-core-library@5.18.0(@types/node@22.18.13)': + 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.2 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.11 + semver: 7.5.4 + optionalDependencies: + '@types/node': 22.18.13 + + '@rushstack/problem-matcher@0.1.1(@types/node@22.18.13)': + optionalDependencies: + '@types/node': 22.18.13 + + '@rushstack/rig-package@0.6.0': + dependencies: + resolve: 1.22.11 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.19.3(@types/node@22.18.13)': + dependencies: + '@rushstack/node-core-library': 5.18.0(@types/node@22.18.13) + '@rushstack/problem-matcher': 0.1.1(@types/node@22.18.13) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 22.18.13 + + '@rushstack/ts-command-line@5.1.3(@types/node@22.18.13)': + dependencies: + '@rushstack/terminal': 0.19.3(@types/node@22.18.13) + '@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.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/marked@6.0.0': + dependencies: + marked: 16.4.1 + + '@types/node@22.18.13': + dependencies: + undici-types: 6.21.0 + + '@types/prismjs@1.26.5': {} + + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + eslint: 9.38.0 + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3 + eslint: 9.38.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.46.2': + dependencies: + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.38.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.46.2': {} + + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + eslint: 9.38.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.46.2': + dependencies: + '@typescript-eslint/types': 8.46.2 + eslint-visitor-keys: 4.2.1 + + '@vitejs/plugin-vue@5.2.4(vite@7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.0))(vue@3.5.22(typescript@5.9.3))': + dependencies: + vite: 7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.0) + vue: 3.5.22(typescript@5.9.3) + + '@volar/language-core@2.4.23': + dependencies: + '@volar/source-map': 2.4.23 + + '@volar/source-map@2.4.23': {} + + '@volar/typescript@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.22': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.22 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.22': + dependencies: + '@vue/compiler-core': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/compiler-sfc@3.5.22': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.22 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.22': + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.0(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.22 + alien-signals: 0.4.14 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.9.3 + + '@vue/language-core@3.1.2(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.22 + '@vue/shared': 3.5.22 + alien-signals: 3.0.3 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.3 + optionalDependencies: + typescript: 5.9.3 + + '@vue/reactivity@3.5.22': + dependencies: + '@vue/shared': 3.5.22 + + '@vue/runtime-core@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/runtime-dom@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/runtime-core': 3.5.22 + '@vue/shared': 3.5.22 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + vue: 3.5.22(typescript@5.9.3) + + '@vue/shared@3.5.22': {} + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + 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@3.0.3: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + asynckit@0.4.0: {} + + axios@1.12.0: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + 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: {} + + baseline-browser-mapping@2.8.21: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.27.0: + dependencies: + baseline-browser-mapping: 2.8.21 + caniuse-lite: 1.0.30001752 + electron-to-chromium: 1.5.244 + node-releases: 2.0.27 + update-browserslist-db: 1.1.4(browserslist@4.27.0) + + buffer-from@1.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001752: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + 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.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.244: {} + + entities@4.5.0: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@10.1.8(eslint@9.38.0): + dependencies: + eslint: 9.38.0 + + eslint-define-config@2.1.0: {} + + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(prettier@3.6.2): + dependencies: + eslint: 9.38.0 + prettier: 3.6.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.11 + optionalDependencies: + eslint-config-prettier: 10.1.8(eslint@9.38.0) + + eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(vue-eslint-parser@10.2.0(eslint@9.38.0)): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + eslint: 9.38.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.3 + vue-eslint-parser: 10.2.0(eslint@9.38.0) + xml-name-validator: 4.0.0 + optionalDependencies: + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.38.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.16.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.38.0 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.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.2 + 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.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.6.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.8 + + esutils@2.0.3: {} + + exsolve@1.0.7: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + 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.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.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.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + follow-redirects@1.15.11: {} + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs-extra@11.3.2: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + 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@14.0.0: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.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.2: {} + + ignore@7.0.5: {} + + image-size@0.5.5: + optional: true + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + imurmurhash@0.1.4: {} + + is-core-module@2.16.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@3.1.0: {} + + 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.2.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.4.2: + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.8.1 + 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.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + 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.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + optional: true + + marked-gfm-heading-id@4.1.2(marked@16.4.1): + dependencies: + github-slugger: 2.0.0 + marked: 16.4.1 + + marked-highlight@2.2.2(marked@16.4.1): + dependencies: + marked: 16.4.1 + + marked-mangle@1.1.11(marked@16.4.1): + dependencies: + marked: 16.4.1 + + marked@16.4.1: {} + + math-intrinsics@1.1.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + 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@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.4.1 + optional: true + + node-releases@2.0.27: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + 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.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@4.0.1: + optional: true + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.6: + 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.6.2: {} + + prismjs@1.30.0: {} + + proxy-from-env@1.1.0: {} + + prr@1.0.1: + optional: true + + punycode@2.3.1: {} + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + readdirp@4.1.2: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: + optional: true + + sax@1.4.1: + 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.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.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.1.0: + dependencies: + js-tokens: 9.0.1 + + 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.11: + dependencies: + '@pkgr/core': 0.2.9 + + terser@5.44.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript@5.8.2: {} + + typescript@5.9.3: {} + + ufo@1.6.1: {} + + undici-types@6.21.0: {} + + unimport@5.5.0: + dependencies: + acorn: 8.15.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.0 + pathe: 2.0.3 + picomatch: 4.0.3 + pkg-types: 2.3.0 + scule: 1.3.0 + strip-literal: 3.1.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.3.1 + + universalify@2.0.1: {} + + unplugin-auto-import@20.2.0: + dependencies: + local-pkg: 1.1.2 + magic-string: 0.30.21 + picomatch: 4.0.3 + unimport: 5.5.0 + unplugin: 2.3.10 + unplugin-utils: 0.3.1 + + unplugin-utils@0.3.1: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + unplugin-vue-components@30.0.0(@babel/parser@7.28.5)(vue@3.5.22(typescript@5.9.3)): + dependencies: + chokidar: 4.0.3 + debug: 4.4.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.3.1 + vue: 3.5.22(typescript@5.9.3) + optionalDependencies: + '@babel/parser': 7.28.5 + transitivePeerDependencies: + - supports-color + + unplugin@2.3.10: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.1.4(browserslist@4.27.0): + dependencies: + browserslist: 4.27.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + vite-plugin-dts@4.5.4(@types/node@22.18.13)(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.0)): + dependencies: + '@microsoft/api-extractor': 7.53.3(@types/node@22.18.13) + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + '@volar/typescript': 2.4.23 + '@vue/language-core': 2.2.0(typescript@5.9.3) + compare-versions: 6.1.1 + debug: 4.4.3 + kolorist: 1.8.0 + local-pkg: 1.1.2 + magic-string: 0.30.21 + typescript: 5.9.3 + optionalDependencies: + vite: 7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.0) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite-plugin-prismjs@0.0.11(prismjs@1.30.0): + dependencies: + '@babel/core': 7.28.5 + babel-plugin-prismjs: 2.1.0(prismjs@1.30.0) + transitivePeerDependencies: + - prismjs + - supports-color + + vite-plugin-vue-setup-extend@0.4.0(vite@7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.0)): + dependencies: + '@vue/compiler-sfc': 3.5.22 + magic-string: 0.25.9 + vite: 7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.0) + + vite@7.1.11(@types/node@22.18.13)(less@4.4.2)(terser@5.44.0): + dependencies: + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.5 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.18.13 + fsevents: 2.3.3 + less: 4.4.2 + terser: 5.44.0 + + vscode-uri@3.1.0: {} + + vue-eslint-parser@10.2.0(eslint@9.38.0): + dependencies: + debug: 4.4.3 + eslint: 9.38.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + vue-tsc@3.1.2(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.23 + '@vue/language-core': 3.1.2(typescript@5.9.3) + typescript: 5.9.3 + + vue@3.5.22(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-sfc': 3.5.22 + '@vue/runtime-dom': 3.5.22 + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.3)) + '@vue/shared': 3.5.22 + optionalDependencies: + typescript: 5.9.3 + + webpack-virtual-modules@0.6.2: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + xml-name-validator@4.0.0: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yocto-queue@0.1.0: {} diff --git a/src/assets/style/common4web.less b/src/assets/style/common4web.less new file mode 100644 index 0000000..3a35d27 --- /dev/null +++ b/src/assets/style/common4web.less @@ -0,0 +1,201 @@ +@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; +} diff --git a/src/assets/style/variable.less b/src/assets/style/variable.less new file mode 100644 index 0000000..12f7127 --- /dev/null +++ b/src/assets/style/variable.less @@ -0,0 +1,44 @@ +@tuiColors: { + red: #F33; + pink: #FF7A9B; + black: #111; + blue: #006EFF; + light-blue: #00A6FF; + green: GREEN; + orange: #E7913B; + gray: #666; + light-gray: #AAA; + white: #FFF; + dark-white: #E7EAEF; + yellow: #FF0; + purple: PURPLE; + transparent: transparent; +} + +:root { + --tui-font: PingFang SC, Microsoft YaHei, Arial Regular; + + --tui-shadow: 3px 3px 12px 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-page-padding: .5rem 1rem; +} + +// 字体颜色 +each(@tuiColors, { + .@{key} { + color: @value; + } +}); + +// 背景颜色 +each(@tuiColors, { + .bg-@{key} { + background: @value; + } +}); 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/index.ts b/src/components/index.ts new file mode 100644 index 0000000..99849f1 --- /dev/null +++ b/src/components/index.ts @@ -0,0 +1,19 @@ +/** 导出所有组件 */ +import Popup from "./popup"; +import Captcha from "./captcha"; +import MarkdownView from "./markdown-view"; +import MarkdownEditor from "./markdown-editor"; + +export default [ + Popup, + Captcha, + MarkdownView, + MarkdownEditor +]; + +export { + Popup, + Captcha, + MarkdownView, + MarkdownEditor +}; 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..8899976 --- /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/index.ts b/src/index.ts new file mode 100644 index 0000000..aae2fc8 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,70 @@ +import type { App } from "vue"; + +import components from "./components"; + +import Network from "./utils/Network"; + +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 VPopup from "./utils/directives/Popup"; +import VDraggable from "./utils/directives/Draggable"; + +import { deviceStore } from "./store/device"; +import { windowStore } from "./store/window"; + +import "./assets/style/variable.less"; +import "./assets/style/common4web.less"; + +export * from "./components"; + +export * from "./types/Model"; + +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, + + deviceStore, + windowStore, + + Time, + Events, + IOSize, + Cooker, + Toolkit, + Resizer, + Storage, + Prismjs, + Markdown, + Scroller, + + 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/window.ts b/src/store/window.ts new file mode 100644 index 0000000..58e1e60 --- /dev/null +++ b/src/store/window.ts @@ -0,0 +1,11 @@ +function setTitle(title?: string) { + window.document.title = title + ""; +} + +const windowStore = { + setTitle +}; + +export { + windowStore +}; 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/Model.ts b/src/types/Model.ts new file mode 100644 index 0000000..c9a3a0f --- /dev/null +++ b/src/types/Model.ts @@ -0,0 +1,60 @@ +export enum RunEnv { + DEV = "DEV", + DEV_SSL = "DEV_SSL", + PROD = "PROD" +} + +// 基本实体模型 +export type Model = { + id?: string; + + 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 = { + captchaId?: string; + captcha?: string; + data?: T; +} + +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/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/Markdown.ts b/src/utils/Markdown.ts new file mode 100644 index 0000000..8b7989f --- /dev/null +++ b/src/utils/Markdown.ts @@ -0,0 +1,196 @@ +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"; + +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. 链接前加 ~ 符号会被渲染为新标签打开。例:`[文本](~链接)` + * 2. 没有标题的链接将使用文本作为标题 + * 3. 没有链接的会被渲染为 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); + } + { + // 处理嵌套 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); + } + + 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..537385a --- /dev/null +++ b/src/utils/Network.ts @@ -0,0 +1,37 @@ +import axios from "axios"; +import { Response } from "~/types/Model"; + +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, +}; 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/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..ebe75fb --- /dev/null +++ b/src/utils/Toolkit.ts @@ -0,0 +1,324 @@ +import type { App } from "vue"; +import type { InstallRecord } from "~/types"; + +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 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 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..3ffcac8 --- /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/*" + ], + "common4web": [ + "./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..86e0d5b --- /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: /^common4web(\/(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: "Common4web", + fileName: "common4web" + }, + 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" + ] + }) + ] +});